| name | wireshark-avance |
| description | Wireshark avancé — filtres d'affichage complexes, statistiques réseau, analyse de protocoles (SMB, Kerberos, TLS), déchiffrement, extraction d'objets, analyse de malware, scripts Lua, tshark automatisé, et scénarios forensiques. |
Wireshark Avancé — Analyse Réseau Approfondie
Complément au skill wireshark de base
Ce skill couvre les techniques avancées au-delà de l'utilisation courante : forensique réseau, analyse de malware, scripts Lua, déchiffrement TLS, et statistiques approfondies.
Filtres d'affichage avancés
Filtres booléens complexes
ip.src==192.168.1.1 and tcp.port==80
http and (ip.src==10.0.0.1 or ip.dst==10.0.0.1)
!(arp or dns or icmp)
tcp and not (ip.addr==192.168.1.0/24)
Expressions régulières dans les filtres
http.host matches "admin"
dns.qry.name matches "[a-z0-9]{50,}\.(com|org|xyz)"
http.request.uri matches "(admin|config|backup|\.env)"
tcp.payload matches "(wget|curl|bash|cmd|powershell)"
http.user_agent matches "(curl|python-requests|Go-http)"
Filtres par champ présent/absent
http.request
tcp.flags.syn
!_ws.expert
Filtres temporels
frame.time >= "Jan 1, 2024 00:00:00" and frame.time <= "Jan 2, 2024 23:59:59"
frame.time_delta > 1
frame.time_delta_displayed > 5
Filtres par taille
frame.len > 1500
frame.len < 64
tcp.len > 0
http.content_length > 10000
Filtres d'exclusion
!(arp or dns or icmpv6 or dhcp or dhcpv6 or mdns or llmnr or nbns or ssdp)
not eth.dst == ff:ff:ff:ff:ff:ff
not (ip.src==192.168.1.0/24 and ip.dst==192.168.1.0/24)
Analyse SMB/CIFS
smb
smb2
nbns
smb2.cmd == 0x00
smb2.cmd == 0x01
smb2.cmd == 0x02
smb2.cmd == 0x03
smb2.cmd == 0x04
smb2.cmd == 0x05
smb2.cmd == 0x06
smb2.cmd == 0x07
smb2.cmd == 0x08
smb2.cmd == 0x09
smb2.cmd == 0x0E
smb2.cmd == 0x10
smb2.filename contains ".docx"
smb2.filename contains "password"
smb2.filename contains "confidential"
nbns.name_type == 0x20
nbdgm
smb.nt_status == 0xC0000022
smb.nt_status == 0x00000000
smb2 and ntlmssp
Analyse Kerberos
kerberos
krb5
kerberos.msg_type == 10
kerberos.msg_type == 11
kerberos.msg_type == 12
kerberos.msg_type == 13
kerberos.msg_type == 14
kerberos.msg_type == 15
kerberos.msg_type == 13 and kerberos.cname contains "service" or kerberos.cname contains "svc_"
kerberos.msg_type == 11 and kerberos.error_code == 0
kerberos.pac
kerberos.pac_type == 2
kerberos.etype == 23
kerberos.etype == 17
kerberos.etype == 18
kerberos.etype == 23 and kerberos.msg_type == 13
kerberos.CNameString contains "192.168"
kerberos.SNameString contains "krbtgt" and kerberos.msg_type == 13
Analyse TLS/SSL
Filtres TLS
tls
tls.handshake.type == 1
tls.handshake.type == 2
tls.handshake.type == 11
tls.handshake.type == 16
tls.handshake.ciphersuite == 0x1301
tls.handshake.ciphersuite == 0x1303
tls.handshake.ciphersuite == 0x009F
tls.handshake.extensions_alpn_str contains "h2"
tls.handshake.extensions_alpn_str contains "http/1.1"
tls.handshake.extensions_server_name contains "admin"
tls.handshake.extensions_server_name contains "internal"
tls.handshake.certificate
tls.handshake.certificate_issuer
tls.handshake.certificate_subject
tls.handshake.certificate_valid_from
tls.handshake.certificate_valid_to
tls.handshake.version == 0x0300
tls.handshake.version == 0x0301
tls.handshake.version == 0x0302
tls.handshake.version == 0x0303
tls.handshake.version == 0x0304
tls.alert_message
tls.handshake.failure
Déchiffrement TLS avec SSLKEYLOGFILE
export SSLKEYLOGFILE=/tmp/sslkeys.log
tshark -r capture.pcap -o tls.keylog_file:/tmp/sslkeys.log -Y "http2"
Déchiffrement avec clé privée RSA
tshark -r capture.pcap \
-o "tls.keys_list:10.0.0.5,443,http,/path/server.key" \
-Y "http"
Analyse de malware et C2
Détection de beaconing
frame.time_delta_displayed > 10 and frame.time_delta_displayed < 60
dns.qry.name matches "[a-z0-9]{20,}\.com"
dns.qry.name matches "\.xyz|\.top|\.club|\.gdn"
http.user_agent matches "^(curl|wget|python|Go|Mozilla/4\.0)"
tcp.port==80 and not http
!(dns or http) and tcp.dstport==443 and !tls.handshake
Détection d'exfiltration
dns.qry.name matches "[a-z0-9]{30,}\.(com|net|org)"
http.request and http.content_length > 10000
http.request.uri matches "/(upload|submit|data)"
icmp and frame.len > 100
dns and frame.len > 300
ip.dst != 192.168.0.0/16 and ip.dst != 10.0.0.0/8 and ip.dst != 172.16.0.0/12
Recherche d'IOCs
ip.addr == 185.130.5.10 or ip.addr == 5.188.62.10
http contains "e1105070ba828007508566e28a2b8d4c"
tcp.payload contains "Invoke-Mimikatz"
tcp.payload contains "cmd.exe /c"
tcp.payload contains "powershell -enc"
tcp.payload contains "wget"
tcp.payload contains "curl -o"
tcp.payload contains "CreateObject("
tcp.payload contains "WScript.Shell"
tcp.payload contains "ActiveXObject"
tcp.payload contains "ShellExecute"
tcp.payload contains "Meterpreter"
tcp.payload contains "ReflectiveLoader"
tcp.payload contains "beacon"
Extraction d'objets
CLI avec tshark
tshark -r capture.pcap --export-objects http,/tmp/extracted/
tshark -r capture.pcap --export-objects smb,/tmp/extracted/
tshark -r capture.pcap --export-objects smtp,/tmp/extracted/
tshark -r capture.pcap -Y "tls.handshake.certificate" -T fields \
-e tls.handshake.certificate > certs.raw
Fichiers extraits — analyse
file /tmp/extracted/* | grep -v "ASCII text"
scp -r /tmp/extracted/ /analyse/
for f in /tmp/extracted/*; do
echo "$(md5sum $f) $f"
done
Statistiques avancées
Conversations
tshark -r capture.pcap -z conv,tcp
tshark -r capture.pcap -z conv,tcp -o "gui.column.format:\"Src\",\"%us\",\"Dst\",\"%ud\""
tshark -r capture.pcap -z conv,udp
tshark -r capture.pcap -z endpoints,ip
IO Graphs
tshark -r capture.pcap -z io,stat,1,\
"COUNT(tcp.port==80) http",\
"COUNT(tcp.port==443) https",\
"COUNT(dns) dns",\
"BYTES() total"
Protocol Hierarchy
tshark -r capture.pcap -z io,phs
Flow Graph (visualisation de flux)
Tshark — Automatisation avancée
Champs personnalisés
tshark -r capture.pcap -T fields \
-e frame.number \
-e frame.time \
-e ip.src \
-e ip.dst \
-e tcp.srcport \
-e tcp.dstport \
-e tcp.len \
-e http.request.uri \
-e http.response.code \
-e dns.qry.name \
-E header=y -E separator=, > output.csv
Templates de rapport
tshark -r capture.pcap -z io,stat,1 -z conv,tcp -z endpoints,ip
tshark -r capture.pcap -T json > output.json
tshark -r capture.pcap -T pdml > output.pdml
tshark -r capture.pcap -T ek > output.ek
Script d'analyse automatisé
#!/bin/bash
PCAP=$1
BASENAME=$(basename $PCAP .pcap)
echo "=== Analyse de $PCAP ==="
echo "--- Résumé ---"
capinfos $PCAP
echo "--- Top IP conversations ---"
tshark -r $PCAP -z conv,ip | head -20
echo "--- Requêtes HTTP ---"
tshark -r $PCAP -Y "http.request" -T fields -e http.host -e http.request.uri | sort -u | head -50
echo "--- DNS Queries ---"
tshark -r $PCAP -Y "dns.qry.name" -T fields -e dns.qry.name | sort -u | head -50
echo "--- Hosts suspects (DNS lookup) ---"
tshark -r $PCAP -Y "dns.qry.name matches \"[a-z0-9]{30,}\.com\"" -T fields -e dns.qry.name
mkdir -p /tmp/extracted_$BASENAME
tshark -r $PCAP --export-objects http,/tmp/extracted_$BASENAME/
echo "--- Fichiers extraits ---"
ls -la /tmp/extracted_$BASENAME/
echo
tshark -r -Y -T fields -e http.file_data | grep -i
Scripts Lua Wireshark
Dissector personnalisé
local myproto = Proto("myproto", "Mon Protocole Personnalisé")
local f_version = ProtoField.uint8("myproto.version", "Version", base.DEC)
local f_type = ProtoField.uint8("myproto.type", "Type", base.HEX)
local f_payload = ProtoField.bytes("myproto.payload", "Payload")
myproto.fields = {f_version, f_type, f_payload}
function myproto.dissector(buffer, pinfo, tree)
if buffer:len() < 2 then return false end
pinfo.cols.protocol = "MYPROTO"
local subtree = tree:add(myproto, buffer(), "Protocole Custom")
subtree:add(f_version, buffer(0,1))
subtree:add(f_type, buffer(1,1))
if buffer:len() > 2 then
subtree:add(f_payload, buffer(2))
end
if f_type.value == 0x01 then
pinfo.cols.info = "Request"
elseif f_type.value == 0x02 then
pinfo.cols.info = "Response"
DissectorTable.get():add(, myproto)
Script de détection de malwares
local malware = Proto("malware", "Détection de Malware")
function malware.dissector(buffer, pinfo, tree)
local has_malware = false
local info = ""
if buffer:find("Invoke-Mimikatz") then
has_malware = true
info = info .. " [MIMIKATZ]"
end
if buffer:find("powershell -enc") then
has_malware = true
info = info .. " [POWERSHELL_ENC]"
end
if buffer:find("cmd.exe /c") then
has_malware = true
info = info .. " [CMD_EXEC]"
end
if has_malware then
pinfo.cols.info = pinfo.cols.info .. info
pinfo.cols.protocol = "MALWARE"
end
end
DissectorTable.get("tcp"):add(0, malware)
Script de suivi de flux personnalisé
local follow = Proto("follow", "Suivi de Flux")
function follow.init()
follow.streams = {}
end
function follow.dissector(buffer, pinfo, tree)
local stream_id = tostring(pinfo.src) .. "→" .. tostring(pinfo.dst)
if not follow.streams[stream_id] then
follow.streams[stream_id] = {
start_time = pinfo.abs_ts,
packets = 0,
bytes = buffer:len()
}
end
follow.streams[stream_id].packets = follow.streams[stream_id].packets + 1
follow.streams[stream_id].bytes = follow.streams[stream_id].bytes + buffer:len()
local subtree = tree:add(follow, buffer(),
"Flux " .. stream_id .. " [" ..
follow.streams[stream_id].packets .. " paquets, " ..
follow.streams[stream_id].bytes .. " octets]")
end
Analyse forensique
Timeline d'événements
tshark -r capture.pcap -T fields \
-e frame.time \
-e ip.src \
-e ip.dst \
-e _ws.col.Protocol \
-e _ws.col.Info \
-E separator='|' > timeline.csv
Reconstruction de session
tshark -r capture.pcap -z follow,tcp,ascii,0
tshark -r capture.pcap -z follow,http,ascii,0
tshark -r capture.pcap -z follow,tls,ascii,0
Recherche de mots de passe en clair
tshark -r capture.pcap -Y "ftp.request.command==USER or ftp.request.command==PASS"
tshark -r capture.pcap -Y "http.request.method==POST" \
-T fields -e http.file_data | grep -i "password\|user\|login\|email"
tshark -r capture.pcap -Y "telnet" \
-T fields -e telnet.data
tshark -r capture.pcap -Y "smtp.req.command==AUTH" \
-T fields -e smtp.req.parameter
Antisèche rapide
ip.addr==X and tcp.port==80
http.request.uri matches "admin"
dns.qry.name matches "\\.(xyz|top)$"
tcp.payload contains "cmd"
tls.handshake.extensions_server_name contains "internal"
tshark -r capture.pcap -z conv,tcp
tshark -r capture.pcap -z io,phs
tshark -r capture.pcap -z io,stat,1
tshark -r capture.pcap --export-objects http,/tmp/extract/
tcp.payload contains "Invoke-" or tcp.payload contains "powershell -enc"
dns.qry.name matches "[a-z0-9]{40,}\\.(com|net)"
tshark -r capture.pcap -o tls.keylog_file:/tmp/keys.log -Y "http2"
tshark -r capture.pcap -T fields -e ip.src -e ip.dst -e tcp.port -E separator=,