如何在服务器上进行端口扫描?
①Windows系统服务器,用dos扫描打开的端口
快捷键WIN+R在运行中输入“cmd”确定
netstat -na
②Linux系统服务器,终端中用nc命令扫描端口
nc -v -w 2 `10.246.46.15 -i` 3901-3905
#扫描ip地址10.246.46.15的端口开启情况
nc: connect to 10.246.46.15 port 3901 (tcp) failed: Connection refused
nc: connect to 10.246.46.15 port 3902 (tcp) failed: Connection refused #端口关闭
Connection to 10.246.46.15 3903 port [tcp/charsetmgr] succeeded! #端口开通
nc: connect to 10.246.46.15 port 3904 (tcp) failed: Connection refused
Connection to 10.246.46.15 3905 port [tcp/mupdate] succeeded! #端口开通
认识nc,tcp/udp *** 测试
什么是nc
nc是netcat的简写,有着 *** 界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的 *** 工具
nc的作用
(1)实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
(2)端口的扫描,nc可以作为client发起TCP或UDP连接
(3)机器之间传输文件
(4)机器之间 *** 测速
nc的控制参数不少,常用的几个参数如下所列:
1) -l
用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接。
2) -p port
暂未用到(老版本的nc可能需要在端口号前加-p参数,下面测试环境是centos6.6,nc版本是nc-1.84,未用到-p参数)
3) -s
指定发送数据的源IP地址,适用于多网卡机
4) -u
指定nc使用UDP协议,默认为TCP
5) -v
输出交互或出错信息,新手调试时尤为有用
6)-w
超时秒数,后面跟数字
7)-z
表示zero,表示扫描时不发送任何数据
前期准备
准备两台机器,用于测试nc命令的用法
主机A:ip地址 10.0.1.161
主机B:ip地址 10.0.1.162
两台机器先安装nc和nmap的包
yum install nc -y
yum install nmap -y
如果提示如下-bash: nc: command not found 表示没安装nc的包
nc用法1, *** 连通性测试和端口扫描
nc可以作为server端启动一个tcp的监听(注意,此处重点是起tcp,下面还会讲udp)
先关闭A的防火墙,或者放行下面端口,然后测试B机器是否可以访问A机器启动的端口
在A机器上启动一个端口监听,比如 9999端口(注意:下面的-l 是小写的L,不是数字1)
默认情况下下面监听的是一个tcp的端口
nc -l 9999
客户端测试, 测试 *** 1
在B机器上telnet A机器此端口,如下显示表示B机器可以访问A机器此端口
客户端测试,测试 *** 2
B机器上也可以使用nmap扫描A机器的此端口
nmap 10.0.1.161 -p9999
客户端测试,测试 *** 3
使用nc命令作为客户端工具进行端口探测
nc -vz -w 2 10.0.1.161 9999
(-v可视化,-z扫描时不发送数据,-w超时几秒,后面跟数字)
上面命令也可以写成
nc -vzw 2 10.0.1.161 9999
客户端测试,测试 *** 4(和 *** 3相似,但用处更大)
nc可以可以扫描连续端口,这个作用非常重要。常常可以用来扫描服务器端口,然后给服务器安全加固
在A机器上监听2个端口,一个9999,一个9998,使用符号丢入后台
在客户端B机器上扫描连续的两个端口,如下
nc作为server端启动一个udp的监听(注意,此处重点是起udp,上面主要讲了tcp)
启动一个udp的端口监听
nc -ul 9998
复制当前窗口输入 netstat -antup |grep 9998 可以看到是启动了udp的监听
客户端测试,测试 *** 1
nc -vuz 10.0.1.161 9998
由于udp的端口无法在客户端使用telnet去测试,我们可以使用nc命令去扫描(前面提到nc还可以用来扫描端口)
(telnet是运行于tcp协议的)
(u表示udp端口,v表示可视化输出,z表示扫描时不发送数据)
上面在B机器扫描此端口的时候,看到A机器下面出现一串XXXXX字符串
客户端测试,测试 *** 2
nmap -sU 10.0.1.161 -p 9998 -Pn
(它暂无法测试nc启动的udp端口,每次探测nc作为server端启动的udp端口时,会导致对方退出侦听,有这个bug,对于一些程序启动的udp端口在使用nc扫描时不会有此bug)
下面,A机器启动一个udp的端口监听,端口为9998
在复制的窗口上可以确认已经在监听了
B机器使用nmap命令去扫描此udp端口,在扫描过程中,导致A机器的nc退出监听。所以显示端口关闭了(我推测是扫描时发数据导致的)
nmap -sU 10.0.1.161 -p 9998 -Pn
-sU :表示udp端口的扫描
-Pn :如果服务器禁PING或者放在防火墙下面的,不加-Pn 参数的它就会认为这个扫描的主机不存活就不会进行扫描了,如果不加-Pn就会像下面的结果一样,它也会进行提示你添加上-Pn参数尝试的
注意:如果A机器开启了防火墙,扫描结果可能会是下面状态。(不能确定对方是否有监听9998端口)
既然上面测试无法使用nmap扫描nc作为服务端启动的端口,我们可以使用nmap扫描其余的端口
(额,有点跑题了,讲nmap的用法了,没关系,主要为了说明nmap是也可以用来扫描udp端口的,只是扫描nc启动的端口会导致对方退出端口监听)
下面,A机器上rpcbind服务,监听在udp的111端口
在B机器上使用nmap扫描此端口,是正常的检测到处于open状态
客户端测试,测试 *** 3
nc扫描大量udp端口
扫描过程比较慢,可能是1秒扫描一个端口,下面表示扫描A机器的1到1000端口(暂未发现可以在一行命令中扫描分散的几个端口的 *** )
nc -vuz 10.0.1.161 1-1000
nc用法2,使用nc传输文件和目录
*** 1,传输文件演示(先启动接收命令)
使用nc传输文件还是比较方便的,因为不用scp和rsync那种输入密码的操作了
把A机器上的一个rpm文件发送到B机器上
需注意操作次序,receiver先侦听端口,sender向receiver所在机器的该端口发送数据。
步骤1,先在B机器上启动一个接收文件的监听,格式如下
意思是把赖在9995端口接收到的数据都写到file文件里(这里文件名随意取)
nc -l port file
nc -l 9995 zabbix.rpm
步骤2,在A机器上往B机器的9995端口发送数据,把下面rpm包发送过去
nc 10.0.1.162 9995 zabbix-release-2.4-1.el6.noarch.rpm
B机器接收完毕,它会自动退出监听,文件大小和A机器一样,md5值也一样
*** 2,传输文件演示(先启动发送命令)
步骤1,先在B机器上,启动发送文件命令
下面命令表示通过本地的9992端口发送test.mv文件
nc -l 9992 test.mv
步骤2,A机器上连接B机器,取接收文件
下面命令表示通过连接B机器的9992端口接收文件,并把文件存到本目录下,文件名为test2.mv
nc 10.0.1.162 9992 test2.mv
*** 3,传输目录演示( *** 发送文件类似)
步骤1,B机器先启动监听,如下
A机器给B机器发送多个文件
传输目录需要结合其它的命令,比如tar
经过我的测试管道后面最后必须是 - ,不能是其余自定义的文件名
nc -l 9995 | tar xfvz -
步骤2,A机器打包文件并连接B机器的端口
管道前面表示把当前目录的所有文件打包为 - ,然后使用nc发送给B机器
tar cfz - * | nc 10.0.1.162 9995
B机器这边已经自动接收和解压
nc用法3,测试网速
测试网速其实利用了传输文件的原理,就是把来自一台机器的/dev/zero 发送给另一台机器的/dev/null
就是把一台机器的无限个0,传输给另一个机器的空设备上,然后新开一个窗口使用dstat命令监测网速
在这之前需要保证机器先安装dstat工具
yum install -y dstat
*** 1,测试网速演示(先启动接收命令方式)
步骤1,A机器先启动接收数据的命令,监听自己的9991端口,把来自这个端口的数据都输出给空设备(这样不写磁盘,测试网速更准确)
nc -l 9991 /dev/null
步骤2,B机器发送数据,把无限个0发送给A机器的9991端口
nc 10.0.1.161 9991 /dev/zero
在复制的窗口上使用dstat命令查看当前网速,dstat命令比较直观,它可以查看当前cpu,磁盘, *** ,内存页和系统的一些当前状态指标。
我们只需要看下面我选中的这2列即可,recv是receive的缩写,表示接收的意思,send是发送数据,另外注意数字后面的单位B,KB,MB
可以看到A机器接收数据,平均每秒400MB左右
B机器新打开的窗口上执行dstat,看到每秒发送400MB左右的数据
*** 2,测试网速演示(先启动发送命令方式)
步骤1,先启动发送的数据,谁连接这个端口时就会接收来自zero设备的数据(二进制的无限个0)
nc -l 9990 /dev/zero
步骤2,下面B机器连接A机器的9990端口,把接收的数据输出到空设备上
nc 10.0.1.161 9990 /dev/null
同样可以使用dstat观察数据发送时的网速
copy:
【Linux】 Centos7 NC探测端口命令
linux centos7 测试端口的连通性, 分别测试TCP端口与UDP端口
安装nc命令
一、nc命令检测端口的用法
1 这个需要Linux服务器里边支持nc命令,检查NC 是否安装
2 安装nc
3 探测端口
错误信息如下
百度了半天没一个结果, google了一下就有结果了, 经测试成功.
4 原因分析:
-z参数原为扫描目标port是否打开, TCP三次握手成功则ok
但CentOS7新版的nc命令已取消了-z, 需输入重定向 /dev/null 才能成功
5 探测 udp: 通过 nc -h 可以看出,只需要加个 -u 即可。
更多高级应用参考:
渗透测试之端口扫描
端口扫描:端口对应 *** 服务及应用端程序
服务端程序的漏洞通过端口攻入
发现开放的端口
更具体的攻击面
UDP端口扫描:
如果收到ICMP端口不可达,表示端口关闭
如果没有收到回包,则证明端口是开放的
和三层扫描IP刚好相反
Scapy端口开发扫描
命令:sr1(IP(dst="192.168.45.129")/UDP(dport=53),timeout=1,verbose=1)
nmap -sU 192.168.45.129
TCP扫描:基于连接的协议
三次握手:基于正常的三次握手发现目标是否在线
隐蔽扫描:发送不完整的数据包,不建立完整的连接,如ACK包,SYN包,不会在应用层访问,
僵尸扫描:不和目标系统产生交互,极为隐蔽
全连接扫描:建立完整的三次握手
所有的TCP扫描方式都是基于三次握手的变化来判断目标系统端口状态
隐蔽扫描:发送SYN数据包,如果收到对方发来的ACK数据包,证明其在线,不与其建立完整的三次握手连接,在应用层日志内不记录扫描行为,十分隐蔽, *** 层审计会被发现迹象
僵尸扫描:是一种极其隐蔽的扫描方式,实施条件苛刻,对于扫描发起方和被扫描方之间,必须是需要实现地址伪造,必须是僵尸机(指的是闲置系统,并且系统使用递增的IPID)早期的win xp,win 2000都是递增的IPID,如今的LINUX,WINDOWS都是随机产生的IPID
1,扫描者向僵尸机发送SYN+ACY,僵尸机判断未进行三次握手,所以返回RST包,在RST数据包内有一个IPID,值记为X,那么扫描者就会知道被扫描者的IPID
2,扫描者向目标服务器发送SYN数据包,并且伪装源地址为僵尸机,如果目标服务器端口开放,那么就会向僵尸机发送SYN+ACK数据包,那么僵尸机也会发送RST数据包,那么其IPID就是X+1(因为僵尸机足够空闲,这个就为其收到的第二个数据包)
3,扫描者再向僵尸机发送SYN+ACK,那么僵尸机再次发送RST数据包,IPID为X+2,如果扫描者收到僵尸机的IPID为X+2,那么就可以判断目标服务器端口开放
使用scapy发送数据包:首先开启三台虚拟机,
kali虚拟机:192.168.45.128
Linux虚拟机:192.168.45.129
windows虚拟机:192.168.45.132
发送SYN数据包:
通过抓包可以查看kali给linux发送syn数据包
linux虚拟机返回Kali虚拟机SYN+ACK数据包
kali系统并不知道使用者发送了SYN包,而其莫名其妙收到了SYN+ACK数据包,便会发RST包断开连接
也可以使用下列该命令查看收到的数据包的信息,收到对方相应的SYN+ACK数据包,scapy默认从本机的80端口往目标系统的20号端口发送,当然也可以修改
如果向目标系统发送一个 随机端口:
通过抓包的获得:1,kali向linux发送SYN数据包,目标端口23456,
2,Linux系统由自己的23456端口向kali系统的20号端口返回RST+ACK数据包,表示系统端口未开放会话结束
使用python脚本去进行scapy扫描
nmap做隐蔽端口扫描:
nmap -sS 192.168.45.129 -p 80,21,110,443 #扫描固定的端口
nmap -sS 192.168.45.129 -p 1-65535 --open #扫描该IP地址下1-65535端口扫描,并只显示开放的端口
nmap -sS 192.168.45.129 -p --open #参数--open表示只显示开放的端口
nmap -sS -iL iplist.txt -p 80
由抓包可知,nmap默认使用-sS扫描,发送SYN数据包,即nmap=nmap -sS
hping3做隐蔽端口扫描:
hping3 192.168.45.129 --scan 80 -S #参数--scan后面接单个端口或者多个端口.-S表示进行SYN扫描
hping3 192.168.45.129 --scan 80,21,25,443 -S
hping3 192.168.45.129 --scan 1-65535 -S
由抓包可得:
hping3 -c 100 -S --spoof 192.168.45.200 -p ++1 192.168.45.129
参数-c表示发送数据包的数量
参数-S表示发送SYN数据包
--spoof:伪造源地址,后面接伪造的地址,
参数-p表示扫描的端口,++1表示每次端口号加1,那么就是发送SYN从端口1到端口100
最后面跟的是目标IP
通过抓包可以得知地址已伪造,但对于linux系统(192.168.45.129)来说,它收到了192.168.45.200的SYN数据包,那么就会给192.168.45.200回复SYN+ACK数据包,但该地址却是kali伪造的地址,那么要查看目标系统哪些端口开放,必须登陆地址为kali伪造的地址即(192.168.45.200)进行抓包
hping3和nmap扫描端口的区别:1,hping3结果清晰明了
2,nmap首先对IP进行DNS反向解析,如果没成功,那么便会对其端口发送数据包,默认发送SYN数据包
hping3直接向目标系统的端口发送SYN数据包,并不进行DNS反向解析
全连接端口扫描:如果单独发送SYN数据包被被过滤,那么就使用全连接端口扫描,与目标建立三次握手连接,结果是最准确的,但容易被入侵检测系统发现
response=sr1(IP(dst="192.168.45.129")/TCP(dport=80,flags="S"))
reply=sr1(IP(dst="192.168.45.129")/TCP(dport=80,flags="A",ack=(response[TCP].seq+1)))
抓包情况:首先kali向Linux发送SYN,Linux回复SYN+ACK给kali,但kali的系统内核不清楚kali曾给linux发送给SYN数据包,那么kali内核莫名其妙收到SYN+ACK包,那么便会返回RST请求断开数据包给Linux,三次握手中断,如今kali再给Linux发ACK确认数据包,Linux莫名其妙收到了ACK数据包,当然也会返回RST请求断开数据包,具体抓包如下:
那么只要kali内核在收到SYN+ACK数据包之后,不发RST数据包,那么就可以建立完整的TCP三次握手,判断目标主机端口是否开放
因为iptables存在于Linux内核中,通过iptables禁用内核发送RST数据包,那么就可以实现
使用nmap进行全连接端口扫描:(如果不指定端口,那么nmap默认会扫描1000个常用的端口,并不是1-1000号端口)
使用dmitry进行全连接端口扫描:
dmitry:功能简单,但功能简便
默认扫描150个最常用的端口
dmitry -p 192.168.45.129 #参数-p表示执行TCP端口扫描
dmitry -p 192.168.45.129 -o output #参数-o表示把结果保存到一个文本文档中去
使用nc进行全连接端口扫描:
nc -nv -w 1 -z 192.168.45.129 1-100: 1-100表示扫描1-100号端口
参数-n表示不对Ip地址进行域名解析,只把其当IP来处理
参数-v表示显示详细信息
参数-w表示超时时间
-z表示打开用于扫描的模式
求教高手,编写一个linux下端口扫描程序
这里介绍netcat命令检查开放端口
netcat(或nc)是一种命令行工具,可以使用TCP或UDP协议跨 *** 连接读取和写入数据。使用netcat可以扫描单个端口或者端口范围。
比如,要扫描IP地址192.168.8.51在范围内远程计算机上打开的TCP端口,4000-4004可以进行以下命令:nc -z -v 192.168.8.51 4000-4004
1-z选项指示nc仅扫描打开的端口,并不发送任何数据,并且-v用于获取更多详细信息。运行结果如下:
sl@Li:~/Works/brochain/corsac$ nc -z -v 192.168.8.51 4000-4004
Connection to 192.168.8.51 4000 port [tcp/*] succeeded!
nc: connect to 192.168.8.51 port 4001 (tcp) failed: Connection refused
nc: connect to 192.168.8.51 port 4002 (tcp) failed: Connection refused
nc: connect to 192.168.8.51 port 4003 (tcp) failed: Connection refused
nc: connect to 192.168.8.51 port 4004 (tcp) failed: Connection refused
0条大神的评论