Un agente o cliente P2P no controlado implica una serie de riesgos:
- Puede ser utilizado por un usuario para compartir intencionadamente o accidentalmente documentos sensibles.
- Puede ser una vía de entrada a la red si el software utilizado presenta vulnerabilidades.
- Algunas variantes de malware permiten utilizar redes P2P como canal de control.
Sin olvidar que una vía habitual de infección por malware es la descarga de versiones pirata infectadas de software popular compartidas maliciosamente en redes P2P. Este era por ejemplo uno de los medios de infección de la Botnet Mariposa
Uno de los clientes P2P más popular en España en los últimos años ha sido Emule, derivado del original Edonkey. Emule permite utilizar 2 protocolos: ED2K (Edonkey 2000) y KAD.
ED2K: es el protocolo original de Edonkey. Utiliza una red semicentralizada basada en servidores que realizan labores de interconexión y búsqueda de archivos. Este protocolo trabaja normalmente sobre TCP.
Un cliente de Edonkey puede realizar 2 tipos de conexiones:
- Al servidor para realizar búsquedas.
- Directamente a otro cliente principalmente para transferir archivos.
KAD: es un protocolo de búsqueda descentralizado basado en Kademlia (un tipo de red DHT). KAD trabaja normalmente sobre UDP.
Para detectar clientes Emule o derivados de Edonkey podemos utilizar dos mecanismos:
Análisis del tráfico de red: La forma más sencilla de detectar clientes P2P consiste en realizar capturas del tráfico saliente hacia Internet y buscar señales que indiquen el uso de protocolos de este tipo a menos que el usuario haya tomado medidas para evitar su detección.
El protocolo original de Edonkey no incluía la opción de ofuscar el tráfico. Emule a partir de la versión 0.47b si incluye la opción de realizar ofuscación de protocolo, aunque esta opción no está activada por defecto. Otros clientes P2P basados en Edonkey no soportan esta funcionalidad.
El usuario también podría encapsular su tráfico sobre una red TOR o sobre una VPN para dificultar su detección.
En caso contrario podemos buscar los 2 protocolos que utiliza de la siguiente forma:
- Búsqueda basada en dirección IP de destino: ED2K se basa en una red de servidores fijos. Podemos obtener un listado de las direcciones IP de estos servidores y si algún equipo de nuestra red hace una conexión a alguno de ellos, sabremos que tiene un cliente P2P instalado.
Una lista medianamente actualizada y bastante extensa puede encontrarse en: http://ed2k.2x4u.de/gl8wmw7k/max/server.met
Por otra parte KAD utiliza una red descentralizada de forma que no podemos realizar la detección basándonos en una lista prefijada de direcciones IP.
- Búsqueda basada en puerto de origen o destino: Versiones antiguas de Emule utilizaban puertos de escucha fijos; el 4662/TCP para ED2K y el 4672/UDP para KAD. Pero las nuevas versiones asignan estos puertos aleatoriamente de forma que no es un método fiable para detectar trafico P2P.
- Búsqueda basada en la firma del protocolo: Wireshark incorpora un disector del protocolo Edonkey aunque no es muy completo.
Para detectar tráfico ED2K podemos analizar el principio del payload de un stream TCP. El primer byte debe ser 0xE3 (OP_EDONKEYPROT).
Para detectar tráfico KAD el primer byte de un payload UDP debe ser 0xE4 (OP_KADEMLIAPROT) o 0xE5 (OP_KADEMLIAPACKEDPROT) si el paquete va comprimido.
Barrido de puertos: Otra forma de detectar agentes P2P en una red consiste en realizar un barrido de puertos de los equipos que sospechemos que tienen este tipo de software instalado.
Este enfoque es más limitado ya que necesitamos realizar un barrido completo de todos los puertos TCP y UDP posibles, tarea normalmente lenta. Además el equipo puede tener filtrados los puertos correspondientes al software de P2P de forma que no seremos capaces de detectarlos correctamente.
Si optamos por esta opción, deberemos primeramente utilizar un scanner de puertos para hacer el barrido de los 65535 puertos TCP y UDP. Y proceder a identificar todos los servicios abiertos.
Algunas herramientas permiten realizar el fingerprint de un servicio durante el escaneo, como por ejemplo Nmap. Otras como Amap nos permiten hacer el fingerprint posteriormente. Pero por desgracia a día de hoy ninguna de ellas soporta detección de ED2K o de KAD, de forma que tendremos que hacer el fingerprint a mano para comprobar que realmente el puerto detectado corresponde a un agente P2P.
Para detectar un servicio de ED2K lo más sencillo es hacer un pequeño programa que construya y lance un paquete de saludo (OP_HELLO) y ver si se obtiene respuesta. A continuación tenéis un pequeño ejemplo en C de cómo se construiría el paquete:

Detectar mediante un barrido de puertos un servicio de KAD es más complejo ya que se basa en UDP. Aun así podemos programar nuestro propio scanner para que lance una petición de saludo (KADEMLIA_HELLO_REQ) a modo de barrido. Para terminar un pequeño ejemplo en C de cómo se construiría y enviaría cada paquete:
