链接地址: 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)
  • p0f

    • 如果系统上安装了p0f, 就可以使用它从Scapy猜测操作系统的名称和版本(只使用SYN数据库). 首先, 确保p0f数据库存在于指定的路径
      • >>> conf.p0f_base
    • 例如, 从一个捕获的包猜测操作系统
      • >>> sniff(prn=prnp0f)