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

よく使うtsharkワンライナーのメモ。コピペ用。

初めに

対象のPCAPファイルを変数に定義しておく。

PCAP='sample.pcap'

基本フォーマット

tshark -r $PCAP -Y "< Wireshark Filter >" -T fields -e < Wireshark Field > -e < Wireshark Field >

上記のワンライナーに、状況に応じて、ip.srcip.dsttcp.srcport (udp.srcport)とtcp.dstport (udp.dstport)を組み合わせる。
重複データを無視したい場合はsort -uにパイプするなど、用途に応じて、どんどんコマンドをパイプさせていく。

  • TCP編
  • HTTP/HTTPS編
  • SMB/NTLM/DCE/RPC編
  • NetBIOS(NBNS)編
  • Kerberos編
  • DNS編
  • FTP編
  • その他
  • 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に対応するグループ名はこちらで確認できる

    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/

    Leave a Reply

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