よく使うtsharkワンライナーのメモ

よく使う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

SAMROpenAliasリクエストのパケットからRIDを抽出する

tshark -r $PCAP -Y "samr.opnum == 27" -T fields -e samr.rid

RIDに対応するグループ名はこちらで確認できる

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

参考

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/

Leave a Reply

Your email address will not be published. Required fields are marked *