はじめに...
調査した内容を時系列にまとめた資料なので、その点ご了承ください。
目次
- 実行環境
- 実現したいこと
- 概要
- ログ取得〜pcapからjsonへの変換
- スクリプトの実行
- まとめ
- 参考資料
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への変換
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の項目として出力することができた
6. まとめ
- pacapからjson -> csvに加工しつつ変換するスクリプトを準備することができた
- jsonファイルの階層が多いのほか深かったので、調べるのに苦労した
- 現状は、TCPパケットのみの対応のため、今後必要に応じて、拡充したい
7. 参考文献
-
ParseExactにて利用するカスタム日時形式について
https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/custom-date-and-time-format-strings -
Wireshark Seq, Ackについて
https://www.engineer-memo.net/20151122-4034 -
TCPについて
https://eh-career.com/engineerhub/entry/2020/02/13/103000
https://www.infraexpert.com/study/tea11.htm -
tsharkのオプション
http://n.pentest.ninja/?p=202