2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Wiresharkによるパケット取得/加工

Last updated at Posted at 2021-10-20

はじめに...

調査した内容を時系列にまとめた資料なので、その点ご了承ください。

目次

  1. 実行環境
  2. 実現したいこと
  3. 概要
  4. ログ取得〜pcapからjsonへの変換
  5. スクリプトの実行
  6. まとめ
  7. 参考資料

1. 実行環境

項目 情報
OS macOS 11.6
HW MacBook Air (11-inch, Mid 2013)
powershell PowerShell 7.1.3
Wireshark 3.4.9

2. 実現したいこと

  • wiresharkで取得したパケットを加工し、csvで出力したい

3. 概要

  • wiresharkでパケットキャプチャを行う
  • wiresharkで取得したパケットをtsharkでjson形式に変換する
  • json形式のファイルをpowershellで加工/csv出力する

4. ログ取得〜pcapからjsonへの変換

  • wiresharkを起動/パケットキャプチャを開始、端末を操作して、パケットを取得する
    packet-002.png

  • 保存したパケットをtsharkでjson形式に変換する

pcap --> json変換コマンド
/Applications/Utilities/Wireshark.app/Contents/MacOS/tshark -T json -r ./packet.pcapng  > ./packet.json

5. スクリプトの実行

  • (4)にてjson形式に変換したパケットをpwshにて加工する
  • 今回は、特定の通信先に関わるTCPパケットのみを対象とする
  • IPアドレスの情報は、逆引きを行い、可能であればホスト名に変換する
スクリプト本体
$InputPath = "./packet.json"
$OutputPath = "./result.csv"

$Target_Ip     = "xxx.xxx.xxx.xxx"
$CONST_TCP  = 6

$Property = @{ `
	FrameTime=-1;DiffTime=-1; `
	SrcIP="";SrcPort=-1; `
	DstIP="";DstPort=-1; `
	ProtoIP=-1;FlagIP=-1; `
	SeqLen=-1; SeqNum=-1; SeqAck=-1}

$Packet_Json = $((Get-Content $InputPath) -join '') | ConvertFrom-Json
$Packet_Csv = @()


$Target_Packet = $Packet_Json | Where-Object{$_._source.layers.ip.'ip.proto' -eq 6 -and ` 
	($_._source.layers.ip.'ip.src' -eq $Target_Ip -or `
	 $_._source.layers.ip.'ip.dst' -eq $Target_Ip)}


for($i=0;$i -lt $Target_Packet.Count; $i++){
  $temp = New-Object PSObject -Property $Property
  
  $temp.FrameTime = $Target_Packet[$i]._source.layers.frame.'frame.time'

  if($i -eq 0){
    $temp.DiffTime = 0

  }else{
    $provider = [CultureInfo]::InvariantCulture

    $Temp_1 = [DateTime]::ParseExact( `
		$($Target_Packet[$i-1]._source.layers.frame.'frame.time').Substring(0,29), `
		"MMM dd, yyyy HH:mm:ss.fffffff", `
		$provider)

    $Temp_2 = [DateTime]::ParseExact( `
		$($temp.FrameTime.Substring(0,29)), `
		"MMM dd, yyyy HH:mm:ss.fffffff", `
		$provider)
  
    $temp.DiffTime = $($Temp_2 - $Temp_1).TotalSeconds

  }

  try{
    $temp_srcip = $Target_Packet[$i]._source.layers.ip.'ip.src'
    $temp.SrcIP = $([System.Net.Dns]::GetHostEntry($temp_srcip)).HostName

  }catch{
    $temp.SrcIP = $temp_srcip
  }

  try{
    $temp_dstip = $Target_Packet[$i]._source.layers.ip.'ip.dst'
    $temp.DstIP = $([System.Net.Dns]::GetHostEntry($temp_dstip)).HostName

  }catch{
    $temp.DstIP = $temp_dstip
  }


  $temp.ProtoIP = $Target_Packet[$i]._source.layers.ip.'ip.proto'
  $temp.FlagIP  = $Target_Packet[$i]._source.layers.ip.'ip.flags'

  if($temp.ProtoIP -eq $CONST_TCP){
    $temp.SrcPort = $Target_Packet[$i]._source.layers.tcp.'tcp.srcport'
    $temp.DstPort = $Target_Packet[$i]._source.layers.tcp.'tcp.dstport'
    $temp.SeqLen = $Target_Packet[$i]._source.layers.tcp.'tcp.len'
    $temp.SeqNum = $Target_Packet[$i]._source.layers.tcp.'tcp.seq'
    $temp.SeqAck = $Target_Packet[$i]._source.layers.tcp.'tcp.ack'

  }

  $Packet_Csv += $temp
}

$Packet_Csv | Export-CSv $OutputPath -Force

6. 結果

  • 以下の通りパケット必要な項目のみCSVの項目として出力することができた

packet-003.png

6. まとめ

  • pacapからjson -> csvに加工しつつ変換するスクリプトを準備することができた
  • jsonファイルの階層が多いのほか深かったので、調べるのに苦労した
  • 現状は、TCPパケットのみの対応のため、今後必要に応じて、拡充したい

7. 参考文献

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?