Necesito analizar un registro de Apache con Snort y otros IDS / WAFs (Suricata, mod_security y Shadow Daemon). Para hacerlo, estaba pensando en crear paquetes TCP con las solicitudes GET y POST almacenadas en el registro de Apache con Scapy en Python. Algo como esto:
packet= IP(dst=dst_ip)/TCP(dport=9999)/Raw(load=payload) #payload contains the http request
Almaceno estos paquetes TCP en un archivo PCAP para luego analizarlos con Snort u otros IDS / WAF que dije.
El problema con este método de construcción de paquetes es que no hay un estado en la comunicación y Snort lo detecta con esta alerta:
[**] [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]
Luego, adapté el código para agregar una secuencia y un número de confirmación:
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'))
De esta manera, hay una secuencia pero la alerta Datos en el paquete SYN cambia por otra (aunque en lugar de dejar tantas alertas como la misma cantidad de paquetes, solo el 22% de los paquetes se lanzan una alerta):
[**] [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
Al final, elegí crear una estructura cliente-servidor con sockets (enviando la carga útil de una máquina virtual a otra), analizar el tráfico con WireShark y luego guardar los paquetes como PCAP. El problema aquí es que Snort no detecta un solo ataque. Además, no puedo automatizar esta operación de análisis.
Ejemplo de ataques:
"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"
Estoy usando Snort con Pulledpork para descargar las reglas y lo he intentado con un PCAP que estaba usando en el postgrado (no construido manualmente) y está detectando ataques. Tal vez haya algo mal en el momento de crear paquetes.
Aquí está mi confección Snort y Pulledpork:
Snort:
Aquí están mis PCAPs:
Primera forma (datos en el paquete SYN):
Segunda vía (Segmentos pequeños TCP consecutivos que exceden el umbral): output_seq.pcap
¿Qué puedo estar haciendo mal? ¿Alguna pista? ¿Hay alguna forma más fácil de detectar ataques en un registro de Apache con IDS / WAF?