Tcpreplay es una suite de herramientas para el análisis y
manipulación de paquetes de datos, muy utilizada principalmente por
administradores de sistemas y redes. Las herramientas incluidas en
Tcpreplay funcionan principalmente sobre ficheros PCAP que han sido
generados previamente por herramientas como tcpdump, wireshark,
ethereal, etc. Permiten modificar las cabeceras de los paquetes en
varias de sus capas para posteriormente reinyectarlos en la red o
también para clasificar y tipificar los paquetes de datos incluidos en
los ficheros PCAP. Dicho esto, el principal objetivo de TCPReplay es
permitir la modificación de paquetes de datos para probar el
funcionamiento de routers, firewalls, IDS/IPS y similares, no obstante
es importante tener en cuenta que no funciona adecuadamente contra
servidores concretos de cualquier tipo, ya que es un “stateless
dispacher”, lo que quiere decir que se encarga de gestionar la posible
comunicación que puede existir entre un cliente y un servidor. TCPReplay
no soporta flujos de comunicación o el modelo clásico de múltiples
peticiones y respuestas, solamente se encarga de replicar los paquetes
de datos contenidos en un PCAP. En este articulo os hablaré de esta
herramienta, pero seguramente para muchos de vosotros sea más
interesante una herramienta que permita hacer labores de fuzzing contra
servicios concretos simplemente alterando y reinyectado los paquetes
contenidos en un PCAP, para esto también hay varias utilidades y
librerías de las que hablaré en el próximo post.
Para empezar, hay que tener en cuenta que hay una versión bastante
antigua de la herramienta y que fue inicialmente desarrollada por Aaron
Turner (http://tcpreplay.synfin.net/)
pero desde hace un tiempo, el equipo de Appneta a tomado el control y
ahora todas las mejoras se suben directamente a su repositorio Git. La
herramienta se puede instalar directamente desde el código, el cual se
encuentra ubicado en el siguiente repositorio: https://github.com/appneta/tcpreplay o en sistemas basados en Debian con APT-GET (instala una versión antigua).
>./configure –prefix=/opt/tcpreplay
>make>sudo make install
>cd bin
>ls -l
total 2916
-rwxr-xr-x 1 adastra adastra 516147 jun 11 00:33 tcpbridge
-rwxr-xr-x 1 adastra adastra 120661 jun 11 00:33 tcpcapinfo
-rwxr-xr-x 1 adastra adastra 404802 jun 11 00:33 tcpliveplay
-rwxr-xr-x 1 adastra adastra 433456 jun 11 00:33 tcpprep
-rwxr-xr-x 1 adastra adastra 444838 jun 11 00:33 tcpreplay
-rwxr-xr-x 1 adastra adastra 553339 jun 11 00:33 tcpreplay-edit
-rwxr-xr-x 1 adastra adastra 496851 jun 11 00:33 tcprewrite |
Una vez instalado, se puede ver la versión del programa y las características soportadas.
Ahora es el momento de utilizar la herramienta y jugar un poco con
los interruptores que soporta. Antes de continuar, es necesario contar
con un fichero PCAP que será utilizado por la herramienta para replicar
los paquetes de datos que se encuentran almacenados en dicho fichero.
Para realizar pruebas simples, se pueden capturar paquetes con TCPDump,
Wireshark o Scapy y guardarlos en un PCAP o también es posible descargar
alguno de los ficheros de ejemplo que se encuentran subidos en el
proyecto. http://tcpreplay.appneta.com/wiki/captures.html
Para efectos prácticos, se utilizarán los ficheros PCAP del proyecto,
los cuales se pueden abrir con una herramienta como wireshark

PCAP de “BigFlows”
Partiendo de este fichero, se puede utilizar la herramienta e indicar
la interfaz de red que será utilizada para el envío de los paquetes.
>sudo ./tcpreplay -i eth0 -t /home/adastra/Escritorio/smallFlows.pcap
File Cache is enabled
Actual: 14261 packets (9216531 bytes) sent in 0.087737 seconds.
Rated: 105047254.8 Bps, 840.37 Mbps, 162542.59 pps
Flows: 1209 flows, 13779.81 fps, 14243 flow packets, 18 non-flow
Statistics for network device: eth0
Attempted packets: 14261
Successful packets: 14261
Failed packets: 0
Truncated packets: 0
Retried packets (ENOBUFS): 0
Retried packets (EAGAIN): 0 |
El ejemplo anterior utiliza el interruptor “-i” para especificar el
dispositivo primario de salida, por medio del cual se enviarán los
paquetes del fichero PCAP y con “-t” se especifica que los paquetes
deben enviarse tan pronto como sea posible.
Existen otras opciones que permiten limitar la velocidad, el número de
paquetes máximo a enviar o incluso, especificar otro dispositivo de
salida por el que también se replicará el trafico.
>sudo ./tcpreplay -i eth0 -p 100 -L 100 /home/adastra/Escritorio/smallFlows.pcap
Actual: 101 packets (61705 bytes) sent in 1.00 seconds.
Rated: 61653.7 Bps, 0.493 Mbps, 100.91 pps
Flows: 11 flows, 10.99 fps, 101 flow packets, 0 non-flow
Statistics for network device: eth0
Attempted packets: 101
Successful packets: 101
Failed packets: 0
Truncated packets: 0
Retried packets (ENOBUFS): 0
Retried packets (EAGAIN): 0 |
El interruptor “-p” permite indicar el número de paquetes que se
enviarán por segundo y “-L” indica el número total de paquetes que se
deben leer y enviar desde el PCAP. Como se puede apreciar, en este caso
concreto ambos interruptores tienen el valor “100” por este motivo los
paquetes se han enviado en exactamente 1 segundo.
Por otro lado, anteriormente se ha utilizado el interruptor “-t” que
indica que los paquetes deben enviarse a su destino lo más rápido
posible, sin embargo existe otra opción que permite controlar la
velocidad de trasferencia de los paquetes, dicho interruptor es –mbps.
>sudo ./tcpreplay -i eth0 -L 100 –mbps 9500 /home/adastra/Escritorio/smallFlows.pcap
Actual: 101 packets (61705 bytes) sent in 0.000525 seconds.
Rated: 117533333.3 Bps, 9490.26 Mbps, 192380.95 pps
Flows: 11 flows, 20952.38 fps, 101 flow packets, 0 non-flow
Statistics for network device: eth0
Attempted packets: 101
Successful packets: 101
Failed packets: 0
Truncated packets: 0
Retried packets (ENOBUFS): 0
Retried packets (EAGAIN): 0 |
En este caso, se envían los paquetes a un máximo de 9500 MB por
segundo y tal como se puede ver en las estadísticas que arroja
“tcprelay”, el promedio ha sido de 9490 MBPS. Evidentemente, entre más
bajo sea este valor, más tiempo tardará la herramienta en replicar los
paquetes de datos.
Otra característica interesante de TCPReplay es la posibilidad de
controlar los flujos de trafico, los cuales son simplemente una
secuencia de paquetes que se intercambian entre un emisor y un receptor.
Por ejemplo, el clásico TCP Hanshake, es un “traffic flow” que se
compone por una serie de paquetes que de forma independiente puede que
no tengan mayor sentido, pero cuando se relacionan con otros paquetes
tienen significado bien definido. TCPReplay cuenta con varios
interruptores para controlar los flujos contenidos en un fichero PCAP.
Uno de ellos es “–unique-ip”, el cual se encarga de modificar la
dirección IP de destino tras cada repetición de un bucle (con el
interruptor –loop). Con “–flow-expiry”, se le indica a la herramienta
que debe ignorar aquellos flujos que se consideran “expirados”, es
decir, aquellos que tardan más tiempo del especificado en completarse.
El valor de este interruptor debe indicarse en segundos y evidentemente,
entre más pequeño sea, mayor será el número de paquetes descargados ya
que se consideran que hacen parte de un flujo expirado.
>sudo ./tcpreplay -i eth0 -t –flow-expiry 30 /home/adastra/Escritorio/bigFlows.pcap
Actual: 791615 packets (355417784 bytes) sent in 8.01 seconds.
Rated: 43556960.3 Bps, 348.45 Mbps, 97013.55 pps
Flows: 58505 flows, 40686 unique, 17819 expired, 7169.87 fps, 791179 flow packets, 436 non-flow
Statistics for network device: eth0
Attempted packets: 791615
Successful packets: 791615
Failed packets: 0
Truncated packets: 0
Retried packets (ENOBUFS): 0
Retried packets (EAGAIN): 0 |
El fichero “bigFlows.pcap” contiene una buena muestra de datos con
paquetes de todo tipo, con lo cual es una buena forma de ver el
funcionamiento de estos interruptores. En este caso concreto se puede
ver que el número de flujos que tardan 30 o más segundos en completarse
son marcados como expirados.
>sudo ./tcpreplay -i eth0 -t –flow-expiry 90 /home/adastra/Escritorio/bigFlows.pcap
Actual: 791615 packets (355417784 bytes) sent in 7.08 seconds.
Rated: 45216137.2 Bps, 361.72 Mbps, 100709.00 pps
Flows: 41818 flows, 40686 unique, 1132 expired, 5320.07 fps, 791179 flow packets, 436 non-flow
Statistics for network device: eth0
Attempted packets: 791615
Successful packets: 791615
Failed packets: 0
Truncated packets: 0
Retried packets (ENOBUFS): 0
Retried packets (EAGAIN): 0 |
Como se puede ver en las estadísticas generadas por la herramienta,
el número de flujos expirados es muchísimo menor, ya que el limite que
se ha especificado es de 1 minuto y medio, un valor lo suficientemente
alto como para considerar que se trata de una conexión extremadamente
lenta o simplemente que el destinatario no era capaz de procesar los
paquetes enviados por el emisor debido a que se encontraba ocupado o no
disponible.
Existen algunas otras características interesantes en TCPReplay,
tales como la posibilidad de integrar Netmap para mejorar las
operaciones I/O por medio de buffers RX/TX preasignados y buffers en
memoria con accesos asíncronos.
Un saludo y Happy Hack!
Adastra.