在Python中正确创建TCP数据包

时间:2018-09-02 11:47:37

标签: python apache scapy snort web-application-firewall

我需要使用Snort和其他IDS / WAF(Suricata,mod_security和Shadow Daemon)分析Apache日志。为此,我正在考虑使用Python中的Scapy使用存储在Apache日志中的GET和POST请求创建TCP数据包。像这样:

packet= IP(dst=dst_ip)/TCP(dport=9999)/Raw(load=payload) #payload contains the http request

我将此TCP数据包存储到一个PCAP文件中,以供日后使用Snort或我所说的其他IDS / WAF对其进行分析。

这种构建数据包方法的问题在于通信中没有状态,Snort会通过以下警报检测到它:

[**] [129:2:1] Data on SYN packet [**]
[Classification: Generic Protocol Command Decode] [Priority: 3] 
09/01-20:29:50.816860 127.0.0.1:20 -> 127.0.0.1:9999
TCP TTL:64 TOS:0x0 ID:1 IpLen:20 DgmLen:102
******S* Seq: 0x0  Ack: 0x0  Win: 0x2000  TcpLen: 20
[Xref => http://www.securityfocus.com/bid/34429][Xref => http://cve.mitre.org/cgi-bin/cvename.cgi?name=2009-1157]

然后,我修改了代码以添加序列号和确认号:

ip = IP(src=src_ip, dst=dst_ip)
packet = (ip / TCP(sport=src_port, dport=dest_port, flags='PA',
      seq=seq_n, ack=ack_n) / Raw(load=fullrequest[0])

seq_n = seq_n + len(payload.encode('UTF8'))

以这种方式,有一个序列,但是 SYN数据包上的数据警报又发生了变化(尽管并没有留下与相同数量的程序包一样多的警报,只有22%的数据包会抛出警报):

[**] [129:12:1] Consecutive TCP small segments exceeding threshold [**]
[Classification: Potentially Bad Traffic] [Priority: 2] 
09/01-20:49:15.037299 127.0.0.1:60664 -> 127.0.0.1:80
TCP TTL:64 TOS:0x0 ID:1 IpLen:20 DgmLen:94
***AP*** Seq: 0x156E7  Ack: 0xB  Win: 0x2000  TcpLen: 20

最后,我选择使用套接字创建客户端-服务器结构(将有效负载从一个虚拟机发送到另一个虚拟机),使用WireShark分析流量,然后将程序包另存为PCAP。这里的问题是Snort无法检测到单个攻击。此外,我无法自动执行此分析操作。

攻击示例:

"GET /shoutbox.php?conf=../../../../../../../../etc/passwd HTTP/1.1"
"GET /cgi-bin/apexec.pl?etype=odp&template=../../../../../../../../../../etc/hosts%00.html&passurl=/category/ HTTP/1.1"

我做错了什么?有提示吗?

1 个答案:

答案 0 :(得分:0)

在这里回答

https://security.stackexchange.com/questions/193036/analyzing-apache-log-with-snort

基本上,与其制作我自己的数据包,不如使用a-1库并直接发送请求。