其他分享
首页 > 其他分享> > 数据包处理利器——Scapy高级使用(一)

数据包处理利器——Scapy高级使用(一)

作者:互联网

欢迎关注个人公众号:运维开发故事

主机探测

TCP SYN Ping

>>>  ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="172.17.51.0/24"),timeout=2)
Begin emission:
Finished sending 256 packets.
*******************************************************************************.***********************************************************************************...........................
Received 190 packets, got 162 answers, remaining 94 packets
>>> ans.summary(lambda r: r[0].sprintf("%Ether.src% %ARP.pdst%") )
00:16:3e:0c:d1:ad 172.17.51.0
00:16:3e:0c:d1:ad 172.17.51.1
00:16:3e:0c:d1:ad 172.17.51.2
00:16:3e:0c:d1:ad 172.17.51.3
00:16:3e:0c:d1:ad 172.17.51.4
00:16:3e:0c:d1:ad 172.17.51.5
00:16:3e:0c:d1:ad 172.17.51.6
00:16:3e:0c:d1:ad 172.17.51.7

ICMP Ping

这里展示一下tcpdump抓到的握手包

192.168.2.1.35555 > 192.168.2.12.4444: Flags [S] seq=12345   
192.168.2.12.4444 > 192.168.2.1.35555: Flags [S.],  seq=9998 ack=12346
192.168.2.1.35555 > 192.168.2.12.4444: Flags [.] seq=12346 ack=9999  

IP与端口号之间以'.'分隔,ACK用'.'表示,SYN用'S'表示,而[S.]则表示SYN+ACK

在Scapy中制作三次握手包

第1步-将客户端的SYN发送到侦听服务器

完整代码如下

#!/usr/bin/python

from scapy.all import *
# 构建payload
get='GET / HTTP/1.0\n\n'
#设置目的地址和源地址
ip=IP(src="192.168.2.53",dst="60.205.177.168")
# 定义一个随机源端口
port=RandNum(1024,65535)
# 构建SYN的包
SYN=ip/TCP(sport=port, dport=80, flags="S", seq=42)
# 发送SYN并接收服务器响应(SYN,ACK)
SYNACK=sr1(SYN)
#构建确认包
ACK=ip/TCP(sport=SYNACK.dport,dport=80,flags="A",seq=SYNACK.ack,ack=SYNACK.seq+1)/get
#发送ack确认包
reply,error=sr(ACK)
# 打印响应结果
print(reply.show())

SYN扫描

SYN扫描也称为半开放扫描。可以使用这种策略来确定通信端口的状态而无需建立完整的连接。客户端首先向被测主机发送一个syn数据包,如果端口开放,那么服务端会响应一个syn+ack的数据包,之后客户端会发送rst数据包进行重置。否则服务端会直接响应一个rst包,表示端口没有开放。如果我们发了大量的syn包而不去确认,服务端会继续发送syn+ack的包,会不断的消耗服务器的CPU和内存,这也就是我们常说的syn泛洪***了。

数据包处理利器——Scapy高级使用(一)数据包处理利器——Scapy高级使用(一)

接下来我们使用scapy来模拟syn扫描

在单个主机,单个端口上进行SYN扫描

60.205.177.169的20和22端口没有响应数据包,猜测中间可能有设备(防火墙)给拦下了。

>>> ans,unans = sr(IP(dst=["60.205.177.168-170"])/TCP(dport=[20,22,80],flags="S"))
Begin emission:
Finished sending 9 packets.
..*..**..*.................................................................................................................................................................................................................................................^C
Received 251 packets, got 4 answers, remaining 5 packets
>>> ans.make_table(lambda s: (s[0].dst, s[0].dport,s[1].sprintf("%TCP.flags%")))
   60.205.177.168 60.205.177.169 
20 RA             -              
22 SA             -              
80 SA             SA 

Fin 扫描

客户端会发送带有fin标志(关闭连接)的数据包到服务端,当服务端没有响应时,表示端口是开放状态,否则会收到rst的包。
数据包处理利器——Scapy高级使用(一)

端口开放

>>> fin_packet = IP(dst='60.205.177.168')/TCP(dport=4444,flags='F')
>>> resp = sr1(fin_packet)
Begin emission:
Finished to send 1 packets.
^C
Received 0 packets, got 0 answers, remaining 1 packets

端口关闭

>>> fin_packet = IP(dst='60.205.177.168')/TCP(dport=4399,flags='F')
>>> resp = sr1(fin_packet)
>>> resp.sprintf('%TCP.flags%')
'RA'

NULL 扫描

null扫描会发送一个没有设置任何flag的TCP数据包,当收到rst的响应包则表示端口关闭,否则表示端口开放,如果收到类型为3且代码为1、2、3、9、10或13的ICMP错误表示该端口已被过滤,获取不到端口状态。
数据包处理利器——Scapy高级使用(一)
数据包处理利器——Scapy高级使用(一)

端口关闭

>>> null_scan_resp = sr1(IP(dst="60.205.177.168")/TCP(dport=4399,flags=""),timeout=1)
>>> null_scan_resp.sprintf('%TCP.flags%')
'RA'

Xmas 扫描

XMAS扫描会发送带有URG,PUSH,FIN标志的TCP数据包,如果未接收到任何数据包,则认为该端口处于打开状态;如果接收到RST数据包,则将该端口视为已关闭。如果收到类型为3且代码为1、2、3、9、10或13的ICMP错误表示该端口已被过滤,获取不到端口状态。
数据包处理利器——Scapy高级使用(一)
数据包处理利器——Scapy高级使用(一)

端口关闭

>>> xmas_scan_resp=sr1(IP(dst="60.205.177.168")/TCP(dport=4399,flags=”FPU”),timeout=1)
Begin emission:
.Finished sending 1 packets.
*
Received 2 packets, got 1 answers, remaining 0 packets
>>> xmas_scan_resp.sprintf('%TCP.flags%')
'RA'

UDP扫描

UDP扫描最常见于检测DNS,SNMP和DHCP服务。客户端会发送带有要连接的端口号的UDP数据包。如果服务器使用UDP数据包响应客户端,那么该端口在服务器上是开放的。如果返回ICMP端口不可达的类型为3和code为3错误数据包,表示该端口在服务器是关闭状态。
数据包处理利器——Scapy高级使用(一)

>>> udp_scan=sr1(IP(dst="60.205.177.168")/UDP(dport=53),timeout=1))

跟踪路由

>>> traceroute("baidu.com")
Begin emission:
Finished sending 30 packets.
************************
Received 24 packets, got 24 answers, remaining 6 packets
   220.181.38.148:tcp80 
2  10.36.76.13     11   
3  10.102.252.34   11   
4  117.49.35.138   11   
5  116.251.112.185 11   
6  36.110.217.9    11   
7  36.110.246.201  11   
8  220.181.17.150  11   
14 220.181.38.148  SA   
15 220.181.38.148  SA   
16 220.181.38.148  SA   
17 220.181.38.148  SA   
18 220.181.38.148  SA   
19 220.181.38.148  SA   
20 220.181.38.148  SA   
21 220.181.38.148  SA   
22 220.181.38.148  SA   
23 220.181.38.148  SA   
24 220.181.38.148  SA   
25 220.181.38.148  SA   
26 220.181.38.148  SA   
27 220.181.38.148  SA   
28 220.181.38.148  SA   
29 220.181.38.148  SA   
30 220.181.38.148  SA   
(<Traceroute: TCP:17 UDP:0 ICMP:7 Other:0>,
 <Unanswered: TCP:6 UDP:0 ICMP:0 Other:0>

使用DNS跟踪路由

我们可以通过在traceroute()函数的l4参数中指定完整的数据包来执行DNS跟踪路由

>>> ans,unans=traceroute("60.205.177.168",l4=UDP(sport=RandShort())/DNS(qd=DNSQR(qname="thesprawl.org")))
Begin emission:
****Finished sending 30 packets.
.................
Received 21 packets, got 4 answers, remaining 26 packets
  60.205.177.168:udp53 
1 10.2.0.1        11   
2 114.242.29.1    11   
4 125.33.185.114  11   
5 61.49.143.2     11 

数据包处理利器——Scapy高级使用(一)

标签:60.205,Scapy,packets,TCP,利器,端口,IP,数据包
来源: https://blog.51cto.com/u_12970189/2817565