在 Python 中正确创建 TCP 数据包
Creating TCP packets properly in Python
我需要使用 Snort 和其他 IDS/WAFs(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/WAFs 分析它。
这种构建数据包的方法的问题是通信中没有状态,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"
我做错了什么?有什么提示吗?
在这里回答:
https://security.stackexchange.com/questions/193036/analyzing-apache-log-with-snort
基本上,与其自己制作数据包,不如使用 requests
库并直接发送请求。
我需要使用 Snort 和其他 IDS/WAFs(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/WAFs 分析它。
这种构建数据包的方法的问题是通信中没有状态,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"
我做错了什么?有什么提示吗?
在这里回答:
https://security.stackexchange.com/questions/193036/analyzing-apache-log-with-snort
基本上,与其自己制作数据包,不如使用 requests
库并直接发送请求。