链接地址: https://github.com/dhgdhg/Scapy-Note
十七.路由跟踪
17.1.TCP_SYN路由跟踪
>>> ans, unans = sr(IP(dst="4.2.2.1",ttl=(1,10))/TCP(dport=53,flags="S")) >>> ans.summary( lambda(s,r) : r.sprintf("%IP.src%\t{ICMP:%ICMP.type%}\t{TCP:%TCP.flags%}")) 192.168.1.1 time-exceeded 68.86.90.162 time-exceeded 4.79.43.134 time-exceeded 4.79.43.133 time-exceeded 4.68.18.126 time-exceeded 4.68.123.38 time-exceeded 4.2.2.1 SA
17.2.UDP路由跟踪
因为UDP没有三次握手, 所以我们需要给一个应用负载(DNS, ISAKMP, NTP等)获得的响应
ans, unans = sr(IP(dst='dns server', ttl=(1,20)) /UDP()/DNS(qd=DNSQR(qname="google.cn")))
ans.make_table(lambda x: (x[0].dst, x[0].ttl, x[1].src))
17.3.DNS路由跟踪
ans, unans = traceroute("4.2.2.1",l4=UDP(sport=RandShort())/DNS(qd=DNSQR(qname="thesprawl.org")))
十八.技巧
18.1.简单的ARP监控
这个程序使用了回调函数(参数prn). store参数被设置为0, 这样一来, sniff()函数就不会存储任何东西, 因此可以永远运行. 过滤器参数用于在高负载下获得更好的性能:过滤器应用于内核内部, Scapy只会看到ARP流量.
from scapy.all import * def arp_monitor_callback(pkt): if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%") sniff(prn=arp_monitor_callback, filter="arp", store=0)
18.2.识别局域网中的恶意DHCP服务器
问题
- 您怀疑有人在您的LAN上安装了一个额外的、未经授权的DHCP服务器——可能是无意的, 也可能是恶意的. 因此, 您需要检查任何活动的DHCP服务器, 并确定它们的IP和MAC地址
办法
使用Scapy发送一个DHCP发现请求并分析回复:
>>> conf.checkIPaddr = False >>> fam,hw = get_if_raw_hwaddr(conf.iface) >>> dhcp_discover = Ether(dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0",dst="255.255.255.255")/UDP(sport=68,dport=67)/BOOTP(chaddr=hw)/DHCP(options=[("message-type","discover"),"end"]) >>> ans, unans = srp(dhcp_discover, multi=True)
在本例中, 我们得到了两个应答, 因此测试网络上有两个活动的DHCP服务器
>>> ans.summary() Ether / IP / UDP 0.0.0.0:bootpc > 255.255.255.255:bootps / BOOTP / DHCP ==>Ether / IP / UDP 192.168.1.1:bootps > 255.255.255.255:bootpc / BOOTP / DHCP Ether / IP / UDP 0.0.0.0:bootpc > 255.255.255.255:bootps / BOOTP / DHCP ==>Ether / IP / UDP 192.168.1.11:bootps > 255.255.255.255:bootpc / BOOTP / DHCP >>> for p in ans: print p[1][Ether].src, p[1][IP].src
18.3.Firewalking
过滤操作后的TTL递减, 只有未过滤的包生成超过ICMP TTL
>>> ans, unans = sr(IP(dst="172.16.4.27", ttl=16)/TCP(dport=(1,1024))) >>> for s,r in ans: if r.haslayer(ICMP) and r.payload.type == 11: print (s.dport)
发现子网在一个多网卡防火墙中, 用这个TTl, 只有防火墙的网卡的IP是可达的
>>> ans, unans = sr(IP(dst="172.16.5/24", ttl=15)/TCP()) >>> for i in unans: print i.dst
18.4.TCP时间戳过滤
- 问题
- 许多防火墙包含一个规则来删除没有设置TCP时间戳选项的TCP包, 这在流行的端口扫描器中很常见.
- 办法
- 为了让Scapy到达目标目的地, 必须使用其他选项
sr1(IP(dst="72.14.207.99")/TCP(dport=80,flags="S",options=[('Timestamp',(0,0))]))
18.5.使用Wireshark查看包
- 问题
- 您已经用Scapy生成或嗅探了一些包. 现在你想用Wireshark来查看它们, 因为它有先进的分组分析能力
- 办法
packets = IP(src="192.0.2.9", dst=Net("192.0.2.10/30"))/ICMP()
wireshark(packets)
18.6.操作系统识别
ISN
Scapy可用于分析ISN(初始序列号)增量, 从而可能发现易受攻击的系统. 首先, 我们通过循环发送SYN探针,收集目标的响应
ans, unans = srloop(IP(dst="192.168.1.1")/TCP(dport=80,flags="S"))
一旦我们获得了合理数量的响应, 我们就可以开始用类似这样的方法分析收集到的数据
>>> temp = 0 >>> for s, r in ans: ... temp = r[TCP].seq - temp ... print("%d\t+%d" % (r[TCP].seq, temp))
nmap_fp
- Scapy支持Nmap指纹识别(Nmap在4.20之前完成的旧的“第一代”指纹识别). 在Scapy v2中, 你必须先加载一个扩展模块:
>>> load_module("nmap")
- 如果你已经安装了Nmap, 你可以使用它的活动操作系统指纹数据库与Scapy. 确保签名数据库的版本1位于以下指定的路径:
>>> conf.nmap_base
- 然后你可以使用nmap_fp()函数实现与Nmap的OS检测引擎相同的探测:
>>> nmap_fp("192.168.1.1",oport=443,cport=1)
- Scapy支持Nmap指纹识别(Nmap在4.20之前完成的旧的“第一代”指纹识别). 在Scapy v2中, 你必须先加载一个扩展模块:
p0f
- 如果系统上安装了p0f, 就可以使用它从Scapy猜测操作系统的名称和版本(只使用SYN数据库). 首先, 确保p0f数据库存在于指定的路径
>>> conf.p0f_base
- 例如, 从一个捕获的包猜测操作系统
>>> sniff(prn=prnp0f)
- 如果系统上安装了p0f, 就可以使用它从Scapy猜测操作系统的名称和版本(只使用SYN数据库). 首先, 确保p0f数据库存在于指定的路径