使用scapy库进行对数据包的解析,以及希望通过更改负载内容从而生成新的恶意流量数据
在通过scapy提取到的流量数据中,呈现出的是:
<Ether dst=00:e0:b1:87:f5:94 src=00:0d:60:96:ae:5c type=IPv4
|<IP version=4 ihl=5 tos=0x0 len=636 id=9356 flags=DF frag=0 ttl=128 proto=tcp chksum=0x7bf3 src=192.168.4.121 dst=65.54.81.165
|<TCP sport=51779 dport=http seq=4271008838 ack=462547690 dataofs=5 reserved=0 flags=PA window=4380 chksum=0x1d81 urgptr=0
|<Raw load='GET /image.aspx?uuid=ba1caada-f9f5-4b3b-9fce-6231e98014d5&w=136&h=102 HTTP/1.1\r\nAccept: */*\r\nIf-Modified-Since: Fri, 11 Jun 2010 20:35:57 GMT\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Windows Live Messenger 14.0.8117.0416)\r\nHost: img4.catalog.video.msn.com\r\nConnection: Keep-Alive\r\nCookie: MC1=GUID=e1d357ef6bd5480a8182689e0cff3f86; MH=MSFT; ANON=A=16E2C7EA7BB067D4DEF6578EFFFFFFFF&E=9e3&W=1; NAP=V=1.9&E=989&C=pWlFIRCeoKkXxLybdasmz1ySFGTMCouJK3rZUJj-VDvudt34fDIobg&W=1\r\n\r\n' |>>>>
以上为一个HTTP数据包,其中分为Ether、IP、TCP以及Raw,每一个上层协议都被当做下层协议的负载。
因此在修改负载时,特定指的是最后Raw.load的内容,需要处理的有每个包头(下层协议)的长度以及校验和。
from scapy.all import *
def main():
pkts = rdpcap('ddossim.pcap')
pkt_http = []
payload_http = []
IP_length_http=[]
payload_length_http=[]
for pkt in pkts:
# raw = pkt.sprintf("%Raw.load%")
if raw != '??' :
try:
payload = pkt['TCP']
pkt_http.append(pkt)
payload_http.append(pkt['Raw'].load)
IP_length_http.append(len(pkt['IP']))
payload_length_http.append(len(pkt['Raw'].load))
import pdb;pdb.set_trace()
except IndexError:
continue
if __name__ == '__main__':
main()
在恶意流量种类的选择方面,经过特征选择,最终得到某种恶意流量的特征存在于负载当中,其中包含一些恶意的网站等,接收到这种恶意流量后会被感染,并变成恶意流量发送端。基于此,采用更换负载内容以达到增加恶意流量数据的目的。
经过两次断点后,payload_http 为
随后采用:
pkt_http[0]['Raw'].load=pkt_http[1]['Raw'].load
pkt_http[0]['IP'].len= pkt_http[1]['IP'].len
修改第一个HTTP协议的负载以及IP层长度,并且重新计算IP层与TCP层校验和:
pkt['IP'].chksum = None # 重新计算校验和
pkt['TCP'].chksum = None # 重新计算校验和
最后采用:
wrpcap("new.pcap",pkt_http[0])
保存修改后的网络流量。
但是保存的new.pcap包在使用Wireshark打开时,会出现以下问题:
原因在于scapy在处理数据包时,并未将数据帧作为解析对象并呈现,导致数据帧中的Frame Length与修改负载后的长度不匹配。
现在能想到的办法只有替换相同长度的负载,才能避免出现报错的情况。