端口扫描
端口扫描是必须要在已知目标IP存活的情况下进行的。
UDP端口扫描
- 原理就是没有返回的数据包,如果返回的是ICMP的端口不可达,说明没有这个端口,和我们进行主机发现截然相反。
- scapy就能,原理就是上面写的。
- nmap扫描方法:
namp -sU 192.168.209.1
- 如果跟上-p 端口号,就是指定检测的端口,如果p参数跟上-,代表全端口
- 如果想查看当前执行状态,按下回车键,nmap就能够告诉我当前状态。
TCP端口扫描
- 就是根据三次握手进行端口的扫描,当然也可以通过不完整的握手进行扫描(相对于比较隐蔽),只发送SYN包不回复ACK包
- 僵尸扫描:
- 需要可以进行IP地址伪造
- 需要一台僵尸机器,这台机器是闲置的
- 需要IPID(IP头的Identification字段)是递增的,就是发送的数据包这个字段是依次增加的。
- 首先我们给僵尸机器发送一个SYN/ACK,僵尸机会返回一个RST的数据包(因为没经过握手)
- 包中会得到一个IPID
- 这个时候我们再发送一个SYN包给被扫描的主机,这里伪造为僵尸机的IP
- 被扫描主机会返回给僵尸机一个SYN/ACK包,僵尸机会给被扫描机器返回一个RST包,这里面的IPID是给我们的IPID增加了一的(所以这个僵尸机器是必须要很闲的)
- 我们再给僵尸机器发送一个SYN/ACK包,僵尸机器再次给我们发送一个RST
- 这个RST中的IPID是关键,如果IPID=我们之前得到的IPID+2,那么说明目标主机开放,如果IPID=之前的IPID+1说明没有开放。
SYN包扫描
scapy扫描
- 使用命令
sr1(IP(dst="192.168.209.1")/TCP(flags="S",dport=80),timeout=1).display()
- 可以看到响应的是SA=SYN+ACK
- 但其实抓包发现,我们还发了一个RST包,这个数据包不是scapy发送的是系统发送的,因为我们“莫名其妙”收到了一个SA包。
- 如果不存在的话呢,会报错,其实是因为我们的返回值是none,但我们还是display造成的。
- 如果返回的数据包中的flags是RA的话呢也说明不存在。
- flags是18的话呢是SA
- 使用命令
nmap
- 不加参数:
nmap 192.168.209.1 -p 1-100
- nmap先进行DNS反向解析再进行端口扫描
- 有的时候如果有防护墙,nmap还会将防火墙后面的端口(nmap显示close的)也显示出来,我们可以使用–open参数
nmap -sS 192.168.209.1 -p 1-100
也是一样的,但是指定是使用SYN的这种扫描方法。- -iL是对一个文件列表扫描
- 不加参数:
hping3
hping3 192.168.209.1 --scan 1-100 -S
- 这个最终就会打印存在的端口
hping3 -c 100 -S --spoof 192.168.209.111 -p ++1 192.168.209.1
- 这个的意思是我们发送是个数据包(-c),使用SYN(-S)发送,–spoof使用地址欺骗(地址是192.168.209.111),-p ++1 代表每次端口递增1,最后就是我们的target。
- 可以看到鲨鱼给我们显示的是源地址是我们所要伪造的111
- 但是我们要看结果的话呢,我们需要在111机器上抓包得到响应包判断端口是否开放。
全连接端口扫描
结果最准确,但是非常不隐蔽。
就是正常三次握手进行扫描。
首先我们先发送一个SYN包给目标,然后他返回给我们一个数据包,我们再发送一个ACK给他,这个ACK中的TCP部分的ack字段的值要等于得到数据包中的seq字段加一。
但是我们单纯这样子做的话呢不能正常的进行握手,因为我们的机器内核会发送RST给目标,目标接收到之后会导致会话终止。
避免这种情况的方法:禁用iptables,因为iptables是在内核之前接收到数据包的,不管是发送和接受都要经过他。
命令:iptables -A OUTPUT -p tcp --tcp- flags RST RST -d 192.168.209.1 -j DROP
这句话的意思是,我们增加一个发送数据(OUTPUT)的规则(-A),对于tcp(-p),我们对发送给192.168.209.1
(-d)的数据包如果是RST(-flags)的话呢我们就执行动作DROP(-j)。
iptables -L 的话呢可以查看当前的规则。
scapy
- 其实就是上面的那种方式,但是不要忘记增加防火墙的规则
nmap
- -sT参数的话呢是使用全连接的扫描方式
nmap -sT 192.168.209.1 -p 1-100
- 速度会慢一点
dmitry
dmitry -p 192.168.209.1
- 上面就是全连接的扫描
nc
- 使用nc进行端口的检测
nc -nv -w 1 -z 192.168.209.1 1-100
- n不做域名解析,v显示详细信息,w超时时间,z是扫描
僵尸扫描
scapy
- I=IP()
- T=TCP()
- RZ=(I/T)
- RT=(I/T)
- RZ[IP].dst=”192.168.209.134”
- RZ[TCP].dport=445
- RZ[TCP].flags=”SA”
- 上面这一些是用来配置僵尸机的
- RT[IP].src=”192.168.209.138”
- RT[IP].dst=”192.168.209.1”
- RT[TCP].dport=25
- RT[TCP].flags=”S”
- 上面是配置扫描主机的
- az1=sr1(RZ)
- at=sr1(RT,timeout=1)
- 上面这个是给扫描机器发的,因为肯定收不到回包,所以要定义超时,或者使用send函数(不接收返回数据)
- az2=sr1(RZ)
- 如果最终的az1的IP部分中的ID字段+2=az2中的IP部分中的ID字段
- 如果是+1,那说明不存在
nmap
- 发现僵尸机:
nmap -p 445 192.168.209.134 --script=ipidseq.nse
- 使用上面的就可以进行僵尸机判断,如果记过现实Incremental的话呢说明可以
nmap 192.168.209.1 -sI 192.168.209.134 -Pn -p 0-100
- -sI指定僵尸机器,-Pn跳过主机发现
- 发现僵尸机: