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

### はじめに...

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

## 目次

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

--------

### 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461335/4574fc32-57fd-fe88-146b-95f07f729af2.png)


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

<details><summary>pcap --> json変換コマンド</summary><div>

```console
/Applications/Utilities/Wireshark.app/Contents/MacOS/tshark -T json -r ./packet.pcapng  > ./packet.json
```
</div></details>

### 5. スクリプトの実行

* (4)にてjson形式に変換したパケットをpwshにて加工する
* 今回は、特定の通信先に関わるTCPパケットのみを対象とする
* IPアドレスの情報は、逆引きを行い、可能であればホスト名に変換する

<details><summary>スクリプト本体</summary><div>

```console
$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

```
</div></details>

### 6. 結果


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

![packet-003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461335/81d0b5ff-6f4e-970f-9f0a-166c198cd2d1.png)


### 6. まとめ

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

### 7. 参考文献

* ParseExactメソッドについて
https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime.parseexact?redirectedfrom=MSDN&view=net-5.0#System_DateTime_ParseExact_System_String_System_String_System_IFormatProvider_

* 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

* 類似情報
https://qiita.com/rhpenguin/items/6c598acc9abe96d4d40b