前言
端口扫描
在找到活的IP后寻找开放端口
- 端口对应的网络服务及应用端程序
- 服务端程序的漏洞通过端口攻入
- 发现开放的端口
- 更具体的攻击面
可根据TCP和UDP来进行扫描
1、UDP端口扫描
UDP扫描一般假设ICMP port-unreachable 响应代表端口关闭
但目标系统不响应ICMP port-unreachable 时,可能误判
其特点是:
- 完整的UDP应用层请求
- 准确性高
- 耗时巨大
UDP端口扫描——scapy
- 端口关闭:ICMP port-unreachable
- 端口开放:没有回应
- 需要了解每一种基于UDP的应用层包结构
- 与三层发现的技术相同
脚本
udp_scan.py
#!/usr/bin/python
import logging #导入日志
import subprocess #系统指令
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
form scapy.all import *
import sys
import time
if len(sys.argv) != 4: #命令后面如果没跟参数
print("Example : ./udp_scan.py 1.1.1.1 1 100")
sys.exit
ip = sys.argv[1]
start = int(sys.argv[2])
end = int(sys.argv[3])
for port in range(start,end):
answer = sr1(IP(dst=ip)/UDP(dport=port),timeout=5,verbose=0) #verbose=0指错误不显示
time.sleep(1) #sleep了1s,避免指令太快,网络延迟,造成误判
if answer == None:
print(port)
else:
pass
UDP端口扫描——nmap
nmap的指令一向简单
nmap -sU 1.1.1.1 #默认的1000个端口
nmao 1.1.1.1 -sU -p 53
nmap -iL iplist.txt -sU -p 1-200
2、TCP端口扫描
所有的扫描方式都是基于三次握手的变化来判断端口状态
主要有全连接扫描、隐蔽扫描和僵尸扫描
(1)全连接扫描
- 三次握手成功则目标端口开放 准
- 确度会高点
- 容易引起目标机器怀疑
全连接扫描——scapy
脚本
tcp_scan1.py
#!/usr/bin/python
import logging #导入日志
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
form scapy.all import *
response = sr1(IP(dst="192.168.60.3")/TCP(dport=80,flags="S"))
reply = sr1(IP(dst="192.168.60.3")/TCP(dport=80,flags="A",ack=(response[TCP].seq+1))) #回一个ack
tcp_scan2.py
#!/usr/bin/python
import logging #导入日志
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
form scapy.all import *
SYN = IP(dst="192.168.60.3")/TCP(dport=80,flags="S")
print("/n/n-- RECEIVED--")
response = sr1(SYN,timeout = 1,verbose=0)
response.display()
if int(response[TCP].flags)==18:
print("/n/n-- SENT--")
a=IP(dst="192.168.60.3")/TCP(dport=25,flags="A",ack=(response[TCP].seq+1))
a.display()
print("/n/n-- RECEIVED--")
response2 = sr1(a,timeout=1,verbose=0)
response.display()
else:
print("SYN·ACK not returned")
需注意的是
操作系统里会有个RST包
导致三次握手失败
要取消掉
iptables -A OUTPUT -p tcp --tcp.flags RST RST -d 192.168.60.3 -j DROP
这是上面脚本工作的前提
全连接扫描——nmap
nmap -sT 1.1.1.1 #扫描默认的1000个常用端口
nmap -sT 1.1.1.1 -p 1-100
nmap -sT -iL iplist.txt -p 90
全连接扫描——dmitry
这个命令比较简单
dmitry -p 1.1.1.1 #执行TCP扫描
全连接扫描——nc
nc -nv -w 1 -z 1.1.1.1 1-100 #-w指定超时时间,-z说明要做端口扫描
(2)隐蔽扫描
- 只发syn包
- 不建立完整连接
- 应用日志不记录扫描行为
过程:发送syn,接收syn/ack说明端口开放,发送rst断开
隐蔽扫描——scapy
指令
a=sr1(IP(dst="192.168.60.3")/TCP(dport=80,flags="S"),timeout=1,verbose=0)
脚本
syn_scan.py
#!/usr/bin/python
import logging #导入日志
import subprocess #系统指令
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
form scapy.all import *
import sys
import time
if len(sys.argv) != 4: #命令后面如果没跟参数
print("Example : ./syn_scan.py 1.1.1.1 1 100")
sys.exit
ip = sys.argv[1]
start = int(sys.argv[2])
end = int(sys.argv[3])
for port in range(start,end):
answer = sr1(IP(dst=ip)/TCP(dport=port),timeout=1,verbose=0) #verbose=0指错误不显示
time.sleep(1) #sleep了1s,避免指令太快,网络延迟,造成误判
if answer == None:
pass
else:
if int(answer[TCP].flags) == 18:
print(port)
else:
pass
隐蔽扫描——nmap
namp -sS 1.1.1.1 -p 1-65535 --open #扫描所有端口,--open只显示open端口
nmap -sS 1.1.1.1 -p 80,21,25 #扫描80,21,25端口
nmap -sS -iL iplist.txt -p 90 #扫描list里所有IP的90端口
隐蔽扫描——hping3
hping3 1.1.1.1 --scan 1-100 -S #扫描1-100端口,显示是个表格
hping3 -c 10 -S -spoof 1.1.1.2 -p ++1 1.1.1.3 #--spoof地址欺骗,欺骗目标1.1.1.3我的IP是1.1.1.2,-p ++1说明端口从1递增到10
(3)僵尸扫描
- 双方网络必须可实现地址伪造
- 得有个僵尸机(闲置且IPID递增)
这个过程讲的有点绕,看图理解
实验过程
- 攻击机:kali
- 僵尸机:xp
- 目标机:metasploitable
僵尸扫描——scapy
i=IP()
t=TCP()
rz=(i/t)
rt=(i/t)
rz[IP].dst=IPz #僵尸机的地址
rz[TCP].dport=445 #win默认445端口开放
rt[IP].src=IPz #僵尸机的地址
rt[IP].dst=IPt #目标机的地址
rt[TCP].dport=25 #目标端口25
rt[TCP].flags="S" #发SYN包
az1=sr1(rz) #僵尸机的第一个包
at=sr1(rt,timeout=1) #目标机的包
az2=sr1(rz) #僵尸机的第二个包
#注意三个包发的快点,避免期间其他包影响结果
az1.display()
az2.display() #比较两个包的IPID,+2说明端口开放,+1说明端口关闭
僵尸扫描——nmap
nmap -p445 1.1.1.2 --script=ipidseq.nse #寻找zombie,ipidseq为Incremental则为可用僵尸机
nmap 1.1.1.1 -sI 1.1.1.2 -Pn -p 1-100 #用1.1.1.2的僵尸机扫描1.1.1.1的1-100端口
结语
端口扫描的结果也只是作参考
可能因多种原因出现问题
nmap和scapy两个工具要熟练
下一节是服务扫描