よく使うtsharkワンライナーのメモ。コピペ用。
初めに
対象のPCAPファイルを変数に定義しておく。
PCAP='sample.pcap'
基本フォーマット
tshark -r $PCAP -Y "< Wireshark Filter >" -T fields -e < Wireshark Field > -e < Wireshark Field >
上記のワンライナーに、状況に応じて、ip.src
とip.dst
、tcp.srcport
(udp.srcport
)とtcp.dstport
(udp.dstport
)を組み合わせる。
重複データを無視したい場合はsort -u
にパイプするなど、用途に応じて、どんどんコマンドをパイプさせていく。
TCP編
TCPストリームをHEX形式で抽出してストリームごとにファイルに保存する
total_streams=$(tshark -r $PCAP -Y "tcp" -T fields -e tcp.stream | sort -u | wc -l); total_streams=$(($total_streams - 1)); for i in $(seq 0 $total_streams); do tshark -r $PCAP -Y "tcp.stream eq $i" -T fields -e tcp.payload > stream$i-hex.out; done
TCPストリームをRAW形式で抽出してストリームごとにファイルに保存する
total_streams=$(tshark -r $PCAP -Y "tcp" -T fields -e tcp.stream | sort -u | wc -l); total_streams=$(($total_streams - 1)); for i in $(seq 0 $total_streams); do tshark -r $PCAP -Y "tcp.stream eq $i" -T fields -e tcp.payload | xxd -r > stream$i-raw.out; done
TCPストリームを抽出してテキストに変換可能なデータは変換してストリームごとにファイルに保存する
total_streams=$(tshark -r $PCAP -Y "tcp" -T fields -e tcp.stream | sort -u | wc -l); total_streams=$(($total_streams - 1)); for i in $(seq 0 $total_streams); do tshark -r $PCAP -Y "tcp.stream eq $i" -T fields -e tcp.payload | xxd -r -p > stream$i-decoded.out; done
PCAPからTCPストリームを抽出して個別にPCAPとして保存する (完了まで数十秒ほどかかるかも)
for i in $(tshark -r $PCAP -T fields -e tcp.stream |sort -n |uniq|less); do tshark -r $PCAP -Y "tcp.stream==$i" -w $i.pcap; done
HTTP/HTTPS編
SSL/TLSの証明書を抽出
tshark -r $PCAP -Y "ssl.handshake.certificates" -T fields -e ssl.handshake.certificate | xxd -r -p | openssl x509 -inform DER -text
tshark -r $PCAP -Y "tls.handshake.certificates" -T fields -e tls.handshake.certificate | xxd -r -p | openssl x509 -inform DER -text
リクエストされたURLを取得する
tshark -r $PCAP -Y "http.request" -T fields -e http.request.full_uri
HTTP レスポンスの応答コードを確認
tshark -r $PCAP -Y "http.response.code" -T fields -e http.response.code
HTTP レスポンス・ボディを確認
tshark -r $PCAP -Y "http.response" -T fields -e http.file_data
特定のHTTP応答コードのレスポンス・ボディを確認 (応答コードが200 OKの場合)
tshark -r $PCAP -Y "http.response.code == 200" -T fields -e http.file_data
HTTP POSTリクエストのパラメータ名のみを表示
tshark -r $PCAP -Y "http.request.method == POST" -T fields -e urlencoded-form.key
HTTP POSTリクエストの値のみを表示
tshark -r $PCAP -Y "http.request.method == POST" -T fields -e urlencoded-form.value
HTTP POSTリクエストのパラメータ名と値の両方を表示
tshark -r $PCAP -Y "http.request.method == POST" -T fields -e http.file_data
使用しているtshark/wiresharkのバージョンがhttp.file_data
フィルタをサポートしていない場合は以下のようにするのもアリ
tshark -r $PCAP -Y "http.request.method == POST" -T json | grep 'urlencoded-form.key\|urlencoded-form.value' | awk '{print $2}' | perl -pe 's/,\n/=/g'
(上記のように場合によっては -T json
でjson形式で出力したほうがデータ整形しやすいかも。。。)
POSTされたデータ(パラメータ名と値)をそれぞれファイルとして保存
out_file='post.bin'; count=1; for i in $(tshark -r $PCAP -Y "http.request.method == POST" -T fields -e http.file_data); do echo -n $i > $count$out_file; ((count++)); done
POSTされたバイナリデータを16進数で表示
tshark -r $PCAP -Y "http.request.method == POST" -T fields -e data
-e data
を -e data.data
にすると16進数がコロン(:
)で区切られる。(aa:3f:56
)
POSTされたバイナリデータを平文で表示
tshark -r $PCAP -Y "http.request.method == POST" -T fields -e data | xxd -r -p
POSTリクエストが複数あった場合、それぞれのバイナリデータを平文で1行ずつ表示
for i in $(tshark -r $PCAP -Y "http.request.method == POST" -T fields -e data); do echo $i | xxd -r -p; echo; done
POSTされたバイナリデータをそれぞれファイルとして保存
out_file='post.bin'; count=1; for i in $(tshark -r $PCAP -Y "http.request.method == POST" -T fields -e data); do echo -n $i | xxd -r -p > $count$out_file; ((count++)); done
SMB/NTLM/DCE/RPC編
参考
https://wiki.wireshark.org/SMB
https://wiki.wireshark.org/SMB2
https://docs.microsoft.com/en-us/windows/win32/secauthn/microsoft-ntlm
※SMB2の場合はsmbをsmb2に置き換える
※SMB通信の Session Setup Request および Session Setup Responseに含まれているSecurity Blobフィールドに認証情報が記述されている。
※NTLMハッシュをクラックする
SMBコマンドを発行したプロセスIDを確認する
tshark -r $PCAP -Y "smb" -T fields -e smb.pid
NTLM認証要求を送ったクライアント情報を取得する(ドメイン名、ユーザー名、ホスト名)
tshark -r $PCAP -Y "smb || smb2 || ntlmssp" -T fields -e ntlmssp.auth.domain -e ntlmssp.auth.username -e ntlmssp.auth.hostname
tshark -r $PCAP -Y "smb || smb2 || ntlmssp" -T fields -e ntlmssp.auth.username
NTLM認証先サーバーのDNSコンピュータ名を確認する
tshark -r $PCAP -Y "ntlmssp || smb || smb2" -T fields -e ntlmssp.challenge.target_info.dns_computer_name
NTLM認証先サーバーのNetBIOSコンピュータ名を確認する
tshark -r $PCAP -Y "ntlmssp || smb || smb2" -T fields -e ntlmssp.challenge.target_info.nb_computer_name
DCE/RPC経由で発行されたコマンドを抽出してファイルに書き込む (dcerpc.encrypted_stub_dataやdcerpc.decrypted_stub_dataも使えそう?)
for i in $(tshark -r $PCAP -Y "dcerpc" -T fields -e dcerpc.stub_data); do echo $i | xxd -r -p; echo; done >> command.bin
(書き込まれたファイルはバイナリファイルとして認識されるので、strings
などで中身を確認する)
SMB/NTLM/DCE/RPC通信からNTLMターゲット名を抽出する
tshark -r $PCAP -Y "ntlmssp || smb || smb2 || dcerpc" -T fields -e ntlmssp.challenge.target_name
SAMRのOpenAliasリクエストのパケットからRIDを抽出する
tshark -r $PCAP -Y "samr.opnum == 27" -T fields -e samr.rid
RIDに対応するグループ名はこちらで確認できる
SMBの共有リソースのパスを表示する
tshark -r $PCAP -Y "smb2" -T fields -e smb2.tree
NetBIOS(NBNS)編
NetBIOS名を取得する
tshark -r $PCAP -Y "nbns" -T fields -e nbns.netbios_name
Kerberos編
Kerberos認証通信からユーザー名またはホスト名を取得する
tshark -r $PCAP -Y "kerberos.CNameString" -T fields -e kerberos.CNameString
DNS編
DNS WKSレコードのクエリに対してレスポンスのあったドメイン名を抽出する
tshark -r $PCAP -Y "dns.qry.type == 11 && dns.flags.response == 1" -T fields -e dns.qry.name
dns.qry.type
の値を変えることで、ほかのレコードのクエリに対しても使える
DNS TXT レコードに埋め込まれている値を抽出する
tshark -r $PCAP -Y "dns.qry.type == 16 && dns.flags.response == 1 && dns.txt" -T fields -e dns.txt
FTP編
FTPデータ・レスポンスを抽出
tshark -r $PCAP -Y "ftp-data" -T fields -e ftp-data.command -e ftp-data.current-working-directory
FTPコマンドおよびレスポンスを抽出
tshark -r $PCAP -Y "ftp" -T fields -e ip.src -e ftp.request.command -e ftp.request.arg -e ftp.current-working-directory -e ftp.response.code -e ftp.response.arg
WiresharkでFTPでやりとりされたファイルを抽出するには
その他
時刻 (UTC)も一緒に表示
tshark -r $PCAP -o gui.column.format:"utctime","%Yut" -Y "http.request.method == POST" -T fields -e _ws.col.utctime -e http.file_data
直前のパケットとの時間差を確認したいとき (1つ目のパケットが送信されてから2つ目のパケットが送信されるまでの経過時間が知りたいとき)
tshark -r $PCAP -T fields -e frame.time_delta_displayed
大量のパケットから任意のパケットのみを抽出して別のPCAPに保存する
以下のコマンドはPCAPファイルからHTTP通信のみを抽出して新たにhttp.pcap
として保存する。
tshark -r $PCAP -Y "http" -w http.pcap
参考
paloalto UNIT42チームによるWireshark チュートリアル
https://unit42.paloaltonetworks.com/unit42-customizing-wireshark-changing-column-display/
https://unit42.paloaltonetworks.com/using-wireshark-display-filter-expressions/
https://unit42.paloaltonetworks.com/using-wireshark-identifying-hosts-and-users/
https://unit42.paloaltonetworks.com/using-wireshark-exporting-objects-from-a-pcap/