Justniffer. Un sniffer que reensambla, reordena y muestras los flujos TCP.

Sobre sniffers, aquí hemos visto muchas y diferentes herramientas. La mayoría de ellas cuyo uso se basa en línea de comandos, con sus ventajas, diferencias y uso específico: tshark, tcpdump/windump, argus, bro-ids, scapy, snort en modo sniffer, etc.
En esta ocasión vamso a ver un sniffer que reensambla, reordena y mustra flujos TCP de forma muy personalizable, con una salida «humanizada» en diferentes tipos de formatos. Realiza también defragmentación e imita en su salida el formato de logs Apache… y muchas cosas más. Se trata de Justniffer. Es ideal para tratar tráfico en servidores web, correo, etc. Lo vamos viendo, de momento, para un uso básico.
(actualizado 18/11/2012)
Al lío..

Istalación de Justniffer.

La instalación de esta herramienta no tiene ninguna complicación. En mi caso, como tengo instalado snort, suricata, etc, las mayoría de librerías ya las tengo instaladas. Solo me faltaba Boost C++ Libraries (libboost1.42-all.dev). Para ello lo más sencillo es instalar desde apt-get install o un gestor de paquetes gráfico.

Problemas con las librerías boostlib.

En versiones más actualizadas de Ubuntu, es posible que tengamos problemas / errores al instalar justniffer con ./configure. Nos puede devolver un error como este:

checking for boostlib >= 1.20.0... configure: error: We could not detect the 
boost libraries (version 1.20 or higher). If you have a staged boost 
library (still not installed) please specify $BOOST_ROOT 
in your environment and do not give a PATH to --with-boost option.  
If you are sure you have boost installed, 
then check your version number looking in <boost/version.hpp>. 
See http://randspringer.de/boost for more documentation.

O que no encontremos libboost1.42-all.dev.

Lo podemos solucionar instalando libboost-all-dev con apt-get install.

Una vez tengamos Boost C++ Libraries, el procedimiento es:

wget http://ignum.dl.sourceforge.net/project/justniffer/justniffer/justniffer%200.5.11/justniffer_0.5.11.tar.gz
tar zxf justniffer_0.5.11.tar.gz
cd justniffer-0.5.11
./configure
make
sudo make install

Uso básico de Justniffer.

Un uso muy básico seria el siguiente:

sudo justniffer -i eth0

Solo con esto veremos que la salida no es la misma que, por ejemplo, tshark, tcpdump, etc:

Si hacemos un ping, para generar algo de tráfico, esperamos que parezca el tráfico SSH (estoy conectado al host donde se ejecuta justniffer mediante SSH), vemos que no aparece nada. Ahora voy a realizar un scan nmap…  pues tampoco veo salida alguna. Probamos navegar por alguna web…:


Aquí ya vemos alguna diferencia con otros sniffers. El formato de salida por defecto se asemeja a un logs Apache, con toda la información que este formato nos aporta:

192.168.1.96 – – [08/Nov/2011:12:45:55 +0100] «GET /scripts/snort HTTP/1.1» 304 0 «http://www.snort.org/» «Mozilla/5.0 (X11; U; Linux i686; es-CL; rv:1.9.2.23) Gecko/20110921 Ubuntu/10.10 (maverick) Firefox/3.6.23»

Esta es la información y salida standart para tráfico HTTP, aunque soporta también JDBC, RTSP, SIP, SMTP, IMAP, POP, LDAP.

Ahora vamos a incluir -r . Parte del resultado es:
GET / HTTP/1.1
Host: http://www.snort.org
User-Agent: Mozilla/5.0 (X11; U; Linux i686; es-CL; rv:1.9.2.23) Gecko/20110921 Ubuntu/10.10 (maverick) Firefox/3.6.23
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-cl,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: __utma=3232757.6; __utmz=32316004.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmb=3231602.1320752757
If-None-Match: «14ff819fbc0760d24ee1002634466eb7»

HTTP/1.1 304 Not Modified
Date: Tue, 08 Nov 2011 11:54:01 GMT
Server: Apache
Keep-Alive: timeout=3, max=97
ETag: «14ff819fbc0760d24ee1002634466eb7»
Cache-Control: max-age=300, public
Set-Cookie: _radiant_session=BAh7BzOGNmm9ydC5vcmcv–aa7585f9fe4781d9d4387bb0c2af0; path=/; HttpOnly
Connection: close

GET /stylesheets/smoothness-css HTTP/1.1
Host: http://www.snort.org
User-Agent: Mozilla/5.0 (X11; U; Linux i686; es-CL; rv:1.9.2.23) Gecko/20110921 Ubuntu/10.10 (maverick) Firefox/3.6.23
Accept: text/css,*/*;q=0.1
Accept-Language: es-cl,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://www.snort.org/
Cookie: __utma=3232.1.6; __utmz=323160.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmb=323152757; _radiant_session=BAh7ByIaaHR0cDovL3d3dy5zbm9ydC5vcmcv–aa75c2af0
If-None-Match: «224d206d2007»

HTTP/1.1 304 Not Modified
Date: Tue, 08 Nov 2011 11:54:06 GMT
Server: Apache
Keep-Alive: timeout=5, max=96
ETag: «224d206314a763fb1ab1cd2007»
Cache-Control: max-age=300, public
Set-Cookie: _radiant_session=BAh7BzNjk4MDc0MWI2MDU6DnJldHVybl90byIaaHR0cDovL3d3dy5zbm9ydC5vcmcv–aa7585f9fe4780c2af0; path=/; HttpOnly
Connection: close

Obtenemos más información y de una forma distinta (formato raw stream).

Estos dos ejemplos no da la idea de que puede ser muy intersante para capturar tráfico de red y auditar, investigar este tráfico en servidores web por ejemplo.

Filtros para formato log.

Volvemos al formato log Apache. Bajo este formato podemos modelar, establecer filtros para configurar una salida personalizada.

Por ejemplo, queremos una salida que incluya los «campos»:

  • source.ip
  • dest.ip
  • request.url
  • connection.time

Pra ello:

sudo justniffer -i eth0 -l «%source.ip %dest.ip %request.url %connection.time»

el resultado:

Vemos claramente las 4 columnas con la información que hemos pedido.

Algo más de información:

sudo justniffer -i eth0 -l «%source.ip %dest.ip %request.url %connection.time %response.size %close.time %close.originator»

Que otros filtros tenemos:
 %close.originator
 %close.time
 %close.timestamp
 %close.timestamp2
 %connection
 %connection.time
 %connection.timestamp
 %connection.timestamp2
 %dest.ip
 %dest.port
 %idle.time.0
 %idle.time.1
 %newline
 %request
 %request.grep
 %request.header
 %request.header.accept
 %request.header.accept-charset
 %request.header.accept-encoding
 %request.header.accept-language
 %request.header.authorization
 %request.header.connection
 %request.header.content-encoding
 %request.header.content-language
 %request.header.content-length
 %request.header.content-md5
 %request.header.cookie
 %request.header.grep
 %request.header.host
 %request.header.keep-alive
 %request.header.range
 %request.header.referer
 %request.header.transfer-encoding
 %request.header.user-agent
 %request.header.value
 %request.header.via
 %request.line
 %request.method
 %request.protocol
 %request.size
 %request.time
 %request.timestamp
 %request.timestamp2
 %request.url
 %response
 %response.code
 %response.grep
 %response.header
 %response.header.accept-ranges
 %response.header.age
 %response.header.allow
 %response.header.cache-control
 %response.header.connection
 %response.header.content-encoding
 %response.header.content-language
 %response.header.content-length
 %response.header.content-md5
 %response.header.content-range
 %response.header.content-type
 %response.header.date
 %response.header.etag
 %response.header.expires
 %response.header.grep
 %response.header.keep-alive
 %response.header.last-modified
 %response.header.pragma
 %response.header.server
 %response.header.set-cookie
 %response.header.transfer-encoding
 %response.header.value
 %response.header.vary
 %response.header.via
 %response.header.www-authenticate
 %response.line
 %response.message
 %response.protocol
 %response.size
 %response.time
 %response.time.begin
 %response.time.end
 %response.timestamp
 %response.timestamp2
 %source.ip
 %source.port
 %tab

Captura IMAP:

Ahora vamos a realizar un análisis del trafico IMAP pero apartir de un fichero de captura de ráfico en formato .pcap. Para ello usamos -p:

justniffer -f imap_xxxxx.pcap

si añadimos -r:

justniffer -f imap_xxxxx.pcap -r

la información es mayor:

OK ZX Sptectrum Server Mail. 2.6.5 IMAP4rev1 server ready

0000 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 IDLE ACL LITERAL+ UIDPLUS QUOTA ID SORT ANNOTATE ANNOTATEMORE STATUS-COUNTERS UNSELECT LISTEXT START$
0000 OK CAPABILITY completed

0001 LOGIN «yomismo» «559874gtg»
0001 OK LOGIN completed

0002 IDLE
+ idling

DONE
0002 OK IDLE completed

0003 SELECT «INBOX»
* FLAGS (\Deleted \Seen \Answered \Draft \Flagged $MDNSent $Forwarded $AutoJunk $AutoNotJunk $Junk $NotJunk)
* 33 EXISTS
* 1 RECENT
* OK [UIDVALIDITY 1214826302] UID validity
* OK [UIDNEXT 52468] Predicted next UID
* OK [PERMANENTFLAGS (\Deleted \Seen \Answered \Draft \Flagged $MDNSent $Forwarded $AutoJunk $AutoNotJunk $Junk $NotJunk)] Perman$
0003 OK [READ-WRITE] SELECT completed

0004 IDLE
+ idling

DONE
0004 OK IDLE completed

0005 UID FETCH 52467:* (BODY.PEEK[HEADER.FIELDS (References X-Ref X-Priority X-MSMail-Priority X-MSOESRec Newsgroups)] ENVELOPE R$
* 33 FETCH (UID 52467 RFC822.SIZE 2327 INTERNALDATE «26-May-2010 09:52:17 +0200» ENVELOPE («Wed, 26 May 2010 09:52:17 +0200» {24}
78% Discount. Best sale. ((«RX-Store» NIL «yomismo» «dominio.es»)) ((«RX-Store» NIL «yomismo» «dominio.es»)) ((«RX-Store» NIL «cc$

 FLAGS (\Recent))
0005 OK UID FETCH completed

0006 UID FETCH 1:52466 (UID FLAGS)
* 1 FETCH (UID 21719 FLAGS ())
* 2 FETCH (UID 21876 FLAGS ())
* 3 FETCH (UID 22006 FLAGS ())
* 4 FETCH (UID 23451 FLAGS ())
* 5 FETCH (UID 23463 FLAGS ())
* 6 FETCH (UID 24037 FLAGS ())

…….. etc, etc, etc, …..

0007 IDLE
+ idling

DONE
0007 OK IDLE completed

0008 UID FETCH 52466 (BODY.PEEK[] UID)
* 32 FETCH (UID 52466 BODY[] {1540}
Return-Path: <origen@dominio.es>
X-Spam-Status: No, hits=0.0 required=5.0
        tests=AWL: -0.243,BAYES_00: -1.665,RATWARE_GECKO_BUILD: 1.691,
        CUSTOM_RULE_FROM: ALLOW,TOTAL_SCORE: -0.217
X-Spam-Level:
Received: from [127.0.0.1] ([192.168.xx.xxx])
        by dominio.es (ZX Sptectrum Server Mail. 2.6.5)
        (using TLSv1/SSLv3 with cipher AES256-SHA (256 bits))
        for yomismo@dominio.es;
        Wed, 26 May 2010 09:44:22 +0200
Message-ID: <4Bxxx99x704@dominio.es>
Date: Wed, 26 May 2010 09:50:15 +0200
From: «El que envia» <origen@dominio.es>
Reply-To: origen@dominio.es
Organization: LA ORGANIZACION
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.9) Gecko/20100317 Thunderbird/3.0.4
MIME-Version: 1.0
To: «Yomismo» <yomismo@dominio.es>
Subject: El asunto=
X-Enigmail-Version: 1.0.1
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
X-Antivirus: elquesea! (VPS 100525-1, 25/05/2010), Outbound message
X-Antivirus-Status: Clean

Hola,

Aquí probando un par de cositas.

Saludos,

Filtrado de paquetes.

Podemos establecer filtros con la opción -p:

sudo justniffer -i eth0 -p «port 80 and port 25»

sobre filtrado tenéis aquí información suficiente:

Wireshark / Tshark / Windump – Filtros pcap. Creación de filtros y filtros avanzados para captura de paquetes.

Extracción de binarios con Justniffer.

Para esta tarea usamos la herramienta justniffer -grab-http-traffic. Indicaremos (-d) el lugar donde almacenar estos datos y la forma de captura. Además indicamos un usuario  (-U) que no sea root:

sudo justniffer-grab-http-traffic -ieth0 -d /home/preludeids/binarios -U preludeids

el resultado:

esto se traduce en que en la carpeta /binarios/ se crearán una estructura de directorios por dominios y dentro de estos los binarios, imagenes, etc capturados:

Y hasta aquí por hoy. En el proximo artículo dedicado a Justniffer, avanzaremos más.

Esta entrada fue publicada en Herramientas, Interpretación capturas tráfico red. pcap, Interpretación capturas tráfico red. pcap, Seguridad y redes. Guarda el enlace permanente.

3 respuestas a Justniffer. Un sniffer que reensambla, reordena y muestras los flujos TCP.

  1. Pingback: Assniffer. Extracción de tipos MIME / objetos HTTP desde ficheros captura tráfico red. | Seguridad y Redes

  2. Pingback: Suricata IDS/IPS 1.2.1 Extracción de ficheros de sesiones HTTP tráfico de red. | Seguridad y Redes

  3. Pingback: Tcpick un sniffer que realiza seguimiento y reensamblado de flujos tcp. Mostrando datos payload. | Seguridad y Redes

Deja un comentario