Tshark. Mostrando información de capturas con Json, EK Json y JQ. Parte I.

Vimos en un anterior artículo como formatear las columnas para que nos muestre Tshark solo la información deseada. Siempre en relación a la información estandard de columnas, tal como aparece en las preferencias de Wireshark. También el uso de Column Format. El parámetro %Cus y tcp.stream. Y otras muchas de formatear, mostrar la información desplegada por Tshark.

En esta ocasión trabajaremos con el forma Json / ek Json, que usado conjuntamente con Jq, resultará muy eficiente.

Al lio …

¿ Qué es Jq ?. Json.

https://stedolan.github.io/jq/

Según nuestra amiga la Wikipedia:

jq es un lenguaje funcional de muy alto nivel con soporte para backtracking y gestión de flujos de datos JSON. Está relacionado con los lenguajes de programación Icon y Haskell.

El lenguaje jq está basado en los conceptos de flujos, tuberías y filtros familiares a los del Shell de Unix. Los filtros se pueden construir a partir de expresiones de JSON utilizando una sintaxis similar a la de JSON y se conectan con el caràcter «|«. El filtro identidad es «.«, y por ejemplo la expresión 1 | {"a": .} producirá el valor de JSON : {"a": 1}.

Bueno, es mucha más que eso, bastante más. Daría para un libro y no es el objetivo de este artículo, pero ya sabemos, por encima, que es lo que hace y más que aprenderemos con su uso.

También lo tenemos para Windows, por lo que podemos usarlo también en este sistema operativo.

Bien, ya sabemos algo sobre Jq, y además sabemos también que soporta flujos de datos json. Pero ¿ qué es eso de Json ?:

«JSON, acrónimo de JavaScript Object Notation, es un formato de texto ligero para el intercambio de datos. JSON es un subconjunto de la notación literal de objetos de JavaScript aunque hoy, debido a su amplia adopción como alternativa a XML, se considera un formato de lenguaje independiente.»

¿ No queda claro ?. Bien, lo vemos con un ejemplo. Una estructura de datos json, puede tener esta forma:

{«tecnico»: {«nombre»: «Fran»,»lugar»: «Suricata»},»admin»: {«nombre»: «David»,»lugar»: «Monte»},»sysadm»: {«nombre»: «Paco»,»lugar»: «Impresoras»},»invest»: {«nombre»: «JoseL»,»lugar»: «Suricata»},»Oracle»: {«nombre»: «Carlitos»,»lugar»: «Synologic»}}

Todo en una misma línea. Una estructura similar es usada por Suricata IDS, Bro IDS, Tshark, Capptiper, ipinfo, y mil etcéteras más. Este ejemplo es un ejemplo muy sencillo con poco volumen de datos. Pero no es lo normal, un log en json de Suricata puede tener decenas de miles de «registros». Para gestionar, filtrar, parsear tanta cantidad de información tenemos jq.

Si seguimos con el ejemplo que lo tenemos en un archivo ejemplo.txt y usamos jq de la forma más básica:

Ya tiene otro aspecto. Mucho más atractivo además. Pero jq es mucho más que esto. Es casi un lenguaje de programación. Vamos, con ejemplos, viendo como podemos ir sacando información de esta estructura de datos.

Vamos a ver solo los nombres, independientemente de que sean técnicos, administrativos o lo que sea:

Ahora vemos los que tienen como Lugar a Suricata:

cat ejemplo.txt | jq ".[] | select(.lugar==\"Suricata\")"

Esto, de forma muy básica y a grandes rasgos es jq/json. Es mucho más, pero lo veremos con la herramienta con la que vamos a usarlo.. Tshark.

Tshark y los formatos de salida Json.

Tshark, ya lo hemos visto en otros artículos, tiene diferentes y variadas formas de mostrar los datos de nuestras capturas. Muchas de ellas pasan por usar la forma:

-T pdml|ps|psml|json|ek|text|fields

Hemos visto muchos ejemplos de la salida -Ttext y -Tfields (la más común). En esta ocasión vamos a ver el formato de salida Json que la indicaremos con:

  • -T ek
  • -T json

¿ Y cuál es la diferencia ?. Pues que -T ek muestra los datos json en bruto, todos los datos de cada frame en una sola línea y -T json sale con los datos ya formateados y «en bonito»… por decirlo de alguna manera. Como queremos usar  la potencia de jq para formatear los datos, usaremos -T ek.

Una característica común de las dos formas es que ambas presentan los datos al completo, es decir que cuando se muestren los datos de un segmento TCP, se mostrarán todos los campos display filter que correspondan a ese segmento. Lo mismo con el datagrama UDP, etc, etc.

Todo lo que vamos a hacer es válido tanto para sistemas Linux/GNU como para Windows.  Con alguna ligera variación que ya comentaremos.

Tshark, Json y Jq.

Para que observéis las diferencias entre -Tjson y -T ek:

tshark -rsmtp.pcap -Y'smtp and frame.number==7' -T json

tshark -rsmtp.pcap -Y'smtp and frame.number==7' -T ek

Yo voy a usar este de arriba con jq de la forma más básica, veremos que el aspecto cambia bastante:

tshark -rsmtp.pcap -Y'smtp and frame.number==7' -T ek | jq .

Como vemos en la captura de arriba, si no establecemos ningún criterio de filtro en tshark, saldrán todos los «layers«: eth, ip, tcp, udp, smtp, http, etc, etc, y los que correspondan al frame que vayamos a visualizar.

Vamos a establecer un criterio de filtro. Queremos ver, dentro del layer smtp los «campos» que correspondan al fitro tshark -Y»smtp.req.parameter» y lo mejor, un ejemplo. Usaremos para el filtro ag o grep. Y empezamos a complicar las cosas para ir avanzando y afinar nuestras búsquedas:

tshark -rsmtp.pcap -Y"smtp.req.parameter" -Tek | ag "\"smtp\"" |jq .layers.smtp

y la salida:

En windows podríamos usar, por ejemplo findstr «»smtp»» en vez de ag.

Otro ejemplo. Ahora vamos a sacar información de dos layers: los datos correspondientes a IP y a DNS;

tshark -rsmtp.pcap -Tek | ag "\"dns\"" | jq .layers.ip,.layers.dns

la salida:

Ahora nos interesa ver todo lo relativo a HTTP e IP. Este último para ver los campos relativos a IPs de origen/destino, Geolocalización GeoIP, etc.

tshark -r2017_cerber.pcap -Tek | jq -c . | ag "\,\"http\"" | jq .layers.ip,.layers.http

Sacamos algunos datos del payload y empezamos a profundizar con los filtros. Vamos a usar el layer http y profundizamos hasta llegar a http_file_data:

tshark -r2017_cerber.pcap -Y "http" -Tek | ag "\"http\"\:" | jq .layers.http.http_http_file_data

Si hablamos de TCP, tenemos también layers/campos muy interesantes como:

tcp_segments_tcp_reassembled_data

De la misma forma tenemos:

  • tcp_tcp_segment_data
  • media_media_type

y otros que ya iremos viendo.

Vamos a ver otro ejemplo para «ver» la información correspondiente a SMB y la asociada a WS expert info. Este último muy interesante para extraer información extra. En este caso:

_ws_malformed

la línea de comandos

tshark -reternalblue-success-unpatched-win7.pcap -Tek | jq -c . | ag "\,\"_ws_malformed\"" | jq .layers.smb,.layers._ws_malformed

y la salida:

Un último ejemplo de las formas que tenemos de configurar la línea de comandos tshark para presentar la información que queremos:

tshark -r../pcap/2017_cerber.pcap -Y'http.request' -Tek -ehttp.request.method -eip.dst -ehttp.host -ehttp.request.uri -etext | ag "http_request" | jq .

tshark -r../pcap/2017_cerber.pcap -Y'http.request' -Tek -ehttp.request.method -eip.dst -ehttp.host -ehttp.request.uri -etext

tshark -r../pcap/2017_cerber.pcap -Y'http.request' -Tjson -ehttp.request.method -eip.dst -ehttp.host -ehttp.request.uri -etext

Un último e interesante ejemplo usando el «agrupador» []:

tshark -r2017_cerber.pcap -Tek | jq '[.layers.ip.ip_ip_src,.layers.ip.ip_ip_dst,.layers.tcp]' | grep -v null

Para la la siguiente parte veremos el uso de:

  • select
  • contains
  • multiples selects
  • agrupamientos
  • etc ..

====

Y hasta aquí por hoy.

 

Gracias y hasta la próxima 😉

 

 

 

Esta entrada fue publicada en Seguridad y redes, Wireshark . Tshark. Guarda el enlace permanente.

Una respuesta a Tshark. Mostrando información de capturas con Json, EK Json y JQ. Parte I.

  1. Muy Insteresante. Gracias

Deja un comentario