Wireshark para Análisis de Tráfico de Malware: Tutorial Práctico
Tutorial práctico de Wireshark aplicado al análisis de tráfico de malware. Filtros para C2, exfiltración y lateral movement. Extracción de archivos de PCAPs, análisis de DNS/HTTP/TLS, y detección de beaconing con tshark.
El malware habla: Wireshark escucha
Todo malware que se comunica genera tráfico de red observable. Un beacon de Cobalt Strike genera requests HTTPS periódicas. Un ransomware conecta al portal de pago en Tor. Un infostealer envía credenciales robadas via SMTP o HTTP POST. Un cryptominer conecta al mining pool via stratum protocol.
Wireshark captura todo este tráfico y te permite diseccionarlo paquete a paquete. Es la herramienta que conecta el comportamiento observado en el endpoint con la infraestructura del atacante.
Captura de tráfico durante análisis dinámico
Setup en el laboratorio
Opcion 1: Capturar en la VM de analisis
- Abrir Wireshark en FLARE VM
- Iniciar captura en la interfaz de red
- Ejecutar malware
- Detener captura, guardar PCAP
Opcion 2: Capturar en REMnux (mejor)
- REMnux corre INetSim (servicios falsos)
- tcpdump/Wireshark captura todo el trafico del lab
- El malware en FLARE VM genera trafico hacia REMnux
- Captura completa sin interferencia del malware
# En REMnux: capturar todo el trafico
sudo tcpdump -i eth0 -w /tmp/malware_traffic.pcap
# O con Wireshark (GUI)
wireshark &
# Seleccionar interfaz, iniciar captura
Con FakeNet-NG (en FLARE VM)
FakeNet-NG captura el tráfico Y simula servicios. El PCAP generado contiene las requests del malware y las respuestas falsas de FakeNet:
FakeNet-NG genera: fakenet_pcap_[timestamp].pcap
Abrir con Wireshark para analizar
Filtros esenciales para análisis de malware
DNS
# Todas las queries DNS
dns
# Solo queries (no responses)
dns.flags.response == 0
# Queries a dominios especificos
dns.qry.name contains "evil"
# Queries con respuesta NXDOMAIN (dominio no existe, posible DGA)
dns.flags.rcode == 3
# Queries DNS over TCP (inusual, posible tunneling)
dns && tcp
HTTP
# Todas las requests HTTP
http.request
# Solo POST (exfiltracion, C2 beacon response)
http.request.method == "POST"
# Request a host especifico
http.host contains "example.com"
# User-Agent especifico
http.user_agent contains "Mozilla"
# Descargas de ejecutables
http.content_type contains "application/x-msdownload"
http.content_type contains "application/octet-stream"
# HTTP con URI sospechosa
http.request.uri contains ".php"
http.request.uri contains "/gate"
http.request.uri contains "/panel"
TLS/HTTPS
# Handshakes TLS (nuevas conexiones cifradas)
tls.handshake.type == 1
# Server Name Indication (dominio al que conecta)
tls.handshake.extensions_server_name
# JA3 fingerprint (identificar cliente TLS)
tls.handshake.ja3
# Certificados auto-firmados (C2 frecuentemente usa self-signed)
tls.handshake.type == 11
TCP
# Nuevas conexiones (SYN)
tcp.flags.syn == 1 && tcp.flags.ack == 0
# Conexiones a puertos especificos
tcp.dstport == 4444 # Meterpreter default
tcp.dstport == 8080 # HTTP alternativo
tcp.dstport == 443 # HTTPS (C2 comun)
# Conexiones a IPs externas
!(ip.dst == 10.0.0.0/8) && !(ip.dst == 172.16.0.0/12) && !(ip.dst == 192.168.0.0/16)
Combinaciones útiles
# C2 beacon: HTTPS periodico a misma IP
tls.handshake.type == 1 && ip.dst == [C2_IP]
# Exfiltracion: POST grandes
http.request.method == "POST" && http.content_length > 10000
# DNS tunneling: queries con subdominios largos
dns.qry.name.len > 50
# Lateral movement: SMB
smb || smb2
# Tor: conexion a nodos conocidos
tcp.dstport == 9001 || tcp.dstport == 9030
Extracción de archivos
HTTP objects
File > Export Objects > HTTP
Wireshark lista todos los archivos transferidos via HTTP: ejecutables descargados, scripts, configuraciones. Seleccionar y guardar.
TCP stream
Para archivos transferidos por otros protocolos:
1. Click derecho en un paquete de la conexion
2. Follow > TCP Stream
3. Ver los datos transferidos
4. "Show and save data as": Raw
5. Save As
tshark extraction
# Extraer todos los objetos HTTP
tshark -r traffic.pcap --export-objects http,/tmp/extracted/
# Extraer campos especificos
tshark -r traffic.pcap -Y "http.request" -T fields \
-e frame.time -e ip.src -e ip.dst -e http.host -e http.request.uri
# Extraer DNS queries
tshark -r traffic.pcap -Y "dns.flags.response==0" -T fields \
-e dns.qry.name | sort | uniq -c | sort -rn | head -20
# Extraer User-Agents
tshark -r traffic.pcap -Y "http.user_agent" -T fields \
-e http.user_agent | sort | uniq -c | sort -rn
Patrones de tráfico por tipo de malware
C2 Beacon (Cobalt Strike)
Patron: HTTPS periodico a misma IP/dominio
- Intervalo regular (60s default, con jitter 0-20%)
- Paquetes pequenos (check-in: ~200 bytes)
- Paquetes grandes ocasionales (descarga de comandos/tasks)
- JA3 fingerprint conocido
- SNI puede ser dominio legitimo (domain fronting)
Filtros:
tls.handshake.type == 1 && ip.dst == [IP_sospechosa]
# Verificar periodicidad en Statistics > I/O Graphs
Ransomware
Patron:
1. DNS queries a dominio/IP del C2 (registro de victima)
2. Conexion HTTPS para enviar clave de cifrado
3. Posible conexion a Tor (.onion via Tor relay)
4. Tráfico de exfiltración masivo ANTES del cifrado (doble extorsión)
Filtros:
# Tor
tcp.dstport == 9001
# Exfiltracion grande
tcp.len > 1000 && !(ip.dst == 10.0.0.0/8)
Infostealer
Patron:
1. DNS query al C2
2. HTTP POST o SMTP con datos robados
3. A veces usa Telegram Bot API como C2
Filtros:
# Telegram Bot API
http.host contains "api.telegram.org"
# SMTP exfiltration
smtp
tcp.dstport == 587 || tcp.dstport == 465
# HTTP POST con contenido largo (datos robados)
http.request.method == "POST" && http.content_length > 1000
Botnet / Miner
Patron:
1. Conexion a mining pool (stratum protocol)
2. Escaneo de red masivo (muchos SYN a muchas IPs)
3. Conexion a C2 para recibir comandos
Filtros:
# Stratum protocol
frame contains "stratum"
tcp.dstport == 3333 || tcp.dstport == 4444 || tcp.dstport == 5555
# Escaneo de red
tcp.flags.syn == 1 && tcp.flags.ack == 0
# Muchos SYN a puerto 23 (Mirai telnet scan)
tcp.dstport == 23 && tcp.flags.syn == 1
Análisis de beaconing
Con Wireshark: Statistics
Statistics > Conversations > TCP
- Ordenar por Packets (descendente)
- Conexiones con muchos paquetes pequenos a misma IP = beaconing
Statistics > I/O Graphs
- Filtro: ip.dst == [IP_sospechosa]
- Granularidad: 1 segundo
- Patron periodico visible en el grafico = beaconing
Con RITA (automatizado)
# RITA (Real Intelligence Threat Analytics) detecta beaconing automaticamente
# Importar PCAP a RITA
rita import --database malware_analysis traffic.pcap
# Buscar beacons
rita show-beacons malware_analysis
# Output: source, destination, score, connections, avg_bytes
# Score alto = probable beacon
Con tshark (scripting)
# Extraer timestamps de conexiones a IP sospechosa
tshark -r traffic.pcap -Y "ip.dst == 192.168.1.100 && tcp.flags.syn==1" \
-T fields -e frame.time_epoch | \
awk 'NR>1{print $1-prev} {prev=$1}'
# Muestra intervalos entre conexiones
# Intervalos regulares (~60s) = beaconing
JA3/JA3S fingerprinting
JA3 es un hash del TLS Client Hello que identifica el software que inicia la conexión. Cobalt Strike, Metasploit, y otros C2 tienen JA3 fingerprints conocidos.
# Extraer JA3 hashes de un PCAP
tshark -r traffic.pcap -Y "tls.handshake.type==1" -T fields \
-e ip.src -e ip.dst -e tls.handshake.ja3
# Buscar JA3 conocidos de C2
# Cobalt Strike JA3 (ejemplo, varia con malleable profiles):
# 72a589da586844d7f0818ce684948eea
# Recursos:
# ja3er.com - base de datos de JA3 fingerprints
# sslbl.abuse.ch - JA3 de malware conocido
Workflow completo: PCAP de malware
# 1. Estadisticas generales
capinfos traffic.pcap
# 2. Conversaciones principales
tshark -r traffic.pcap -q -z conv,tcp | head -20
# 3. DNS queries (dominios contactados)
tshark -r traffic.pcap -Y "dns.flags.response==0" -T fields \
-e dns.qry.name | sort -u
# 4. IPs contactadas
tshark -r traffic.pcap -Y "tcp.flags.syn==1 && tcp.flags.ack==0" \
-T fields -e ip.dst | sort | uniq -c | sort -rn | head -20
# 5. HTTP requests
tshark -r traffic.pcap -Y "http.request" -T fields \
-e ip.dst -e http.host -e http.request.uri | head -20
# 6. Extraer archivos
tshark -r traffic.pcap --export-objects http,/tmp/extracted/
ls /tmp/extracted/
# 7. Buscar strings interesantes en todo el PCAP
strings traffic.pcap | grep -iE '(password|token|key|http|\.exe)' | head -30
# 8. JA3 fingerprints
tshark -r traffic.pcap -Y "tls.handshake.type==1" -T fields \
-e ip.dst -e tls.handshake.ja3 | sort | uniq -c | sort -rn
# 9. Abrir en Wireshark para analisis visual detallado
wireshark traffic.pcap
Mapeo MITRE ATT&CK
| Tipo de tráfico | Técnica ATT&CK | Filtro Wireshark |
|---|---|---|
| HTTP/HTTPS C2 | T1071.001 (Web Protocols) | http.request || tls.handshake |
| DNS C2/tunneling | T1071.004 (DNS) | dns |
| Exfiltración HTTP | T1041 (Exfiltration Over C2) | http.request.method=="POST" |
| Exfiltración SMTP | T1048.003 (Exfiltration Over Unencrypted Protocol) | smtp |
| Lateral SMB | T1021.002 (SMB/Admin Shares) | smb || smb2 |
| Tor | T1090.003 (Multi-hop Proxy) | tcp.dstport==9001 |
| DGA | T1568.002 (Dynamic Resolution) | dns.flags.rcode==3 (NXDOMAIN) |
| Beaconing | T1071 (Application Layer Protocol) | Análisis de periodicidad |
Fuentes y referencias
- Sanders, C. "Practical Packet Analysis." No Starch Press, 2017.
- Wireshark Foundation. "Wireshark User Guide." https://www.wireshark.org/docs/
- Active Countermeasures. "RITA: Real Intelligence Threat Analytics." https://github.com/activecm/rita
- Salesforce. "JA3: TLS Fingerprinting." https://github.com/salesforce/ja3
- abuse.ch. "SSL Blacklist (JA3 fingerprints)." https://sslbl.abuse.ch/ja3-fingerprints/
- SANS. "Wireshark for Malware Analysis." SANS ISC Diary.
- Malware Traffic Analysis. "Exercises and PCAPs." https://www.malware-traffic-analysis.net/
Preguntas frecuentes
Libros recomendados
Artículos relacionados
Este contenido tiene fines exclusivamente educativos y de investigación en ciberseguridad defensiva. No se proporcionan binarios maliciosos ni payloads ejecutables. El uso indebido de esta información es responsabilidad exclusiva del usuario. Leer disclaimer completo.