Detector de Protocolo

Detector de Protocolo

ProtocolDetector es una biblioteca de Python de código abierto que desarrollé para Dinoflux. Esta biblioteca tiene como objetivo proporcionar un mecanismo fácil de usar para integrar capacidades de detección de protocolos en tus aplicaciones de Python.

  • Utiliza yara como motor para analizar paquetes
  • Soporta captura de red en vivo
  • Soporta lectura de pcap
  • Soporta proxy socks para filtrar direcciones locales
  • Viene con CLI para funcionar directamente
  • Salida JSON para fácil análisis

Instalación

sudo pip install git+git://github.com/jpalanco/ProtocolDetector.git

Línea de Comando

Analizar un archivo pcap:

ProtocolDetector -p example.pcap

Analizar iface (en tiempo real):

ProtocolDetector -i eth0

Ejemplo de salida:

{'dport': 1604, 'src': '192.168.1.10', 'dst': '94.73.33.36', 'sport': 49181, 'protocols': [darkcomet]}

API

from ProtocolDetector.Engine import get\_rules, perform\_check
import dpkt

pcap_path='dump.pcap'
pcap_file = open(pcap_path)
pcap=dpkt.pcap.Reader(pcap_file)

options = { 'mode': 'default',
            'socks_proxy': False,
            'remove_local' : False,
            'pcap_path': pcap_path,
            'iface': None,
            'rules' : get_rules() }

for ts, buf in pcap:
        results = perform_check(buf, options )
        print results

 

Añadiendo Protocolos

Añadir protocolos es bastante fácil, solo necesitamos crear una regla yara y colocarla en el directorio ProtocolDetector/rules/ y añadirla al archivo index.yar. Veamos algunos ejemplos de reglas de protocolo:

rule ssl : protocols
{
  meta:
    author = "Jose Ramon Palanco <jpalanco@gmail.com>"
    description = "SSL"
  strings:
    $content_type = /(\x13|\x14|\x15|\x16|\x17)/
    $version_tsl_1_2 = { 03 03 }
    $version_tsl_1_0 = { 03 01 }
    $version_tsl_3_0 = { 03 00 }

  condition:
    $content_type at 0 and ($version_tsl_1_2 at 1 or $version_tsl_1_0 at 1 or $version_tsl_3_0 at 1)
}

En este ejemplo, podemos ver que en la posición 0 (el primer byte del payload) necesitaremos encontrar el tipo de contenido, y debería ser 13h, 14h, 15h, 16h o 17h. Si lo encontramos, requeriremos encontrar una versión válida. En este ejemplo, cubro TSL 1.0, TSL 1.2 y TSL 3.0.

rule njrat : protocols
{
  meta:
    author = "Jose Ramon Palanco <jpalanco@gmail.com>"
    description = "Protocolo njRAT"
  strings:
    $header = /\d{1,6}\x00/
    $sep = { 7C 27 7C 27 7C }
  condition:
    $header at 0 and $sep
}

Este ejemplo detecta njRAT, una herramienta común de administración remota. En este caso, necesitamos encontrar en la posición 0, de 1 a 6 enteros seguidos de un byte nulo y el separador que es 0x7C277C277C.

 

Puedes encontrar más protocolos implementados en mi repositorio de github https://github.com/jpalanco/ProtocolDetector

¡Feliz hacking!