端口扫描
• 端口对应网络服务及应用端程序
• 服务端程序的漏洞通过端口攻入
•发现开放的端口
• 更具体的攻击面
UDP 端口扫描
• 假设 ICMP port-unreachable 响应,代表端口关闭
• 目标系统不响应 ICMP port-unreachable 时,可能产生误判
• 完整的 UDP 应用层请求
• 准确性高
• 耗时巨大
Scapy UDP Scan
• 端口关闭:ICMP port-unreachable
• 端口开放:没有回包
• 了解每一种基于 UDP 的应用层包结构很有帮助
• 与三层相同的技术
• 误判
• Scapy
• sr1(IP(dst="1.1.1.1")/UDP(dport=53),timeout=1,verbose=1)
./udp_scan.py 1.1.1.1 1 100
#!/usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import*
import time
import sys
if len(sys.argv) != 4:
print"Usage - ./udp_scan.py [Target-IP] [FIRSR PORT] [LAST PORT]"
print"Example - ./udp_scan.py 192.168.1.1 1 254"
print"Example will UDP port scan ports 1 through 254 on 192.168.1.1"
ip=sys.argv[1]
start=int(sys.argv[2])
end=int(sys.argv[3])
for port in range(start,end):
a=sr1(IP(dst=ip)/UDP(dport=port),timeout=5,verbose=0)
time.sleep(1)
if a ==None:
print port
else:
pass
Nmap
• nmap -sU 1.1.1.1 默认扫描常用的 1000 个端口 (s:scanner U:UDP)
• 默认的 1000 个参数
• ICMP host-unreachable
• nmap 1.1.1.1 -sU -p 53 (p:port)
• nmap -iL iplist.txt -sU -p 1-200
TCP 端口扫描
• 基于连接的协议
• 三次握手
• 隐蔽扫描(只发 syn 包,目标端口开放回 ack,否则回 rst )
• 僵尸扫描
• 全连接扫描(建立完整的三次握手)
• 所有的 TCP 扫描方式都是基于三次握手的变化,来判断目标端口状态
①• --->(syn)•
②•<---(syn,ack)•
③• --->(ack)•
端口扫描
• 隐蔽扫描——syn
• 不建立完整链接
• 应用层日志不记录扫描行为——隐蔽
• 僵尸扫描
• 极其隐蔽
• 实施条件苛刻(发起者可以伪造 IP 地址的网络环境)
• 可伪造源地址
• 可选择僵尸机
• 闲置系统(基本不与服务器通信)
• 系统使用递增的 IPID (ip 包头中的 id 字段:Identification,不同操作系统 id 产生不同,若为递增,每发一个 ip 包,id 加一)
• 0(×)
• 随机(×)
①scanner 向 zombie 发送一个 ack/syn,zombie 回复 RST,ip 包中 id 字段=x;
②scanner 伪造源 ip 为 zombie 的 ip,向 target 发送 syn 包,target 向 zombie 回复 syn/ack,zombie 回复 target RST,ip 包中 id 字段=x+1;(端口没开放则 target 回复 zombie RST,zombie 不做回复)
③scanner 向 zombie 发送 syn/ack,zombie 回复 RST,若 ip 包中 id 字段=x+2;说明 target 的目标端口开(id=x+1 则说明端口关闭)
隐蔽端口扫描
• syn——syn/ack——rst (给目标机器发送 syn,目标返回 syn/ack,再给目标机器返回 rst,断开三次握手)
• scapy
• sr1(IP(dst="192.168.1.1")/TCP(dport=80),timeout=1,verbose=1)
• ./syn_scan.py
• nmap -sS 192.168.1.1 -p 80,21,25,110,443 (s:scanner S:SYN;默认syn扫描)
• nmap -sS 192.168.1.1 -p 1-65536 --open (只显示open)
• nmap -sS 192.168.1.1 -p- --open (-p-等于-p 65535)
• nmap -sS -iL iplist.txt -p 80,21,22,23
隐蔽端口扫描
• hping3
• hping3 192.168.1.1 --scan 80 -S (S:SYN)
• hping3 192.168.1.1 --scan 80,21,25,443 -S
• hping3 192.168.1.1 --scan 0-65535 -S
• hping3 -c 10 -S --spoof 192.168.1.138 -p ++1 192.168.1.1 (spoof:欺骗,即伪造源ip;++1:从端口1开始,每次加1)
全连接端口扫描
• Scapy
• SYN 不需要 raw packets
• ٖ 内核认为 syn/ack 是非法包,直接返回 rst 终端连接
• 全连接扫描对 scapy 比较困难
• sr1(IP(dst="192.168.20.2")/TCP(dport=22,flags='S'))
• ./tcp_scan1.py
• ./tcp_scan2.py
• iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 192.168.1.1 -j DROP (A:添加规则,p:协议,d:目标地址,j:动作)
tcp_scan1.py
#!/usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import*
response=sr1(IP(dst="192.168.1.1")/TCP(dport=80,flags='S'))
reply=sr1(IP(dst="102.158.1.1")/TCP(dport=80,flags='A',ack=(response[TCP].seq+1)))
tcp_scan2.py
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import*
SYN=IP(dst="192.168.1.1")/TCP(dport=1234,flags='S')
print "--SENT--"
SYN.display()
print "\n\n-- RECEIVED --"
response=sr1(SYN,timeout=1,verbose=0)
response.display()
## 收到SYN-ACK后,此时操作系统内核会自动回复RST,中断连接
if int(response[TCP].flags)==18:
print "\n\n -- SENT --"
A=IP(dst="192.168.1.1")/TCP(dport=1234,flags='A',ack=(response[TCP].seq+1))
A.display()
print "\n\n-- RECEIVED --"
response2=sr1(A.,timeout=1,verbose=0)
response2.display()
else:
print "SYN-ACK not returned"
全连接端口扫描
• nmap -sT 1.1.1.1 -p 80 (sT:TCP全连接端口扫描)
• nmap -sT 1.1.1.1 -p 80,21,25
• nmap -sT 1.1.1.1 -p 80-2000
• nmap -sT -iL iplist.txt -p 80
• 默认1000个常用端口
全连接端口扫描
• dmitry
• 功能简单,但使用简便
• 默认 150 个常用端口
• dmitry -p 172.16.36.135
• dmitry -p 172.16.36.135 -o output (o:save output to file)
全连接端口扫描
• nc -nv -w 1 -z 192.168.60.4 1-100 (w:超时时间,v:verbose详细信息,n:不做域名解析)
• for x in $(seq 20 30); do nc -nv -w 1 -z 1.1.1.1 $x; done | grep open
• for x in $(seq 1 254); do nc -nv -w 1 -z 1.1.1.$x 80; done
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于