死ぬ前にどうしても素のWindows10でパケットキャプチャーがしたい

# 死んだほうがマシ
皆さんはパケットキャプチャが必要な業務で[Wireshark](https://www.wireshark.org/download.html)をダウンロードしようとしたら「通信内容見れるからダメ」って言われたことがありますか？私はありません。そんな記憶もそんなこと言ってきたセキュリティ部門も消し去ったからです。しかしまあTODOリストから作業が消えるわけではないので

- 標準外のソフトウェア(Winshark)は使えない
- バイナリエディタもない
- 正確な通信内容が分からなくてもいい
- 通信が小規模
- HTTPヘッダとかがなんとなく分かればいい

そんな状況と動機でキャプチャーを試みます。

# netshで通信内容を.etlファイルとして出力

1. 仕事をサボりながら見てた爆サイを閉じる(余計な通信を切る)。
2. ソースすらないような社内ソフトウェアを立ち上げ、内容を見たい通信の前で止まる。
3. PowerShellで`netsh trace start capture=yes`を実行する。
4. 通信を伴う動作を行う。
5. PowerShellで`netsh trace stop`を実行する。

デフォルトでは**C:\Users\[ユーザ名]\AppData\Local\Temp\NetTraces\NetTrace.etl**に出力されます。なお、手順3で引数を追記すると出力先やファイル名を指定することができます。それを手順3やった後にググると通信内容が増えて大変になります(1敗)。

# .etlをバイナリ、さらにはASCIIに変換する
作業フォルダを変更しておけばよかったと反省しています。デフォルトの出力先は隠しフォルダになってたりパス長かったり**定期的に消えたり(1敗)**面倒なんですが、乗りかかった船で乗り過ごします。出力ファイルは下記の通り。

- (作業フォルダ) **C:\Users\[ユーザ名]\AppData\Local\Temp\NetTraces**
- HEX+ASCII変換(バイナリエディタで開いた風) **nt-bin5.txt**
- ASCII変換(上記の右側部分) **nt-ascii.txt**

下記ソースはコピペしてPowerShellに貼り付けて実行してください。.ps1ファイルはデフォルトでは権限の関係で実行できなかったりします。PowerなさすぎShell。

```powershell:etl2ascii.ps1
# 流れ: 
# ・etl(この形式はよく分からない)
# ↓ certutil -encodehex 形式は"5"
# ・HexadecimalとASCIIの「文字列」(bin5と仮称)
#   11 11 ff ff 22 22 ff ff  33 33 ff ff 44 44 ff ff   foobar foobarfoo
# ↓ 左側を取り除く(51列目から行末までを撮ってくる)
# ・ASCII文字列
#   foobar foobarfoo

# NetTrace.etlのあるフォルダに移動する。
cd C:\Users\[ユーザ名]\AppData\Local\Temp\NetTraces
# .etlをバイナリっぽい形式に変換。
# (例)11 11 ff ff 22 22 ff ff  33 33 ff ff 44 44 ff ff   foobar foobarfoo
$hexAsciiFname = "nt-bin5.txt"
certutil -encodehex .\NetTrace.etl $hexAsciiFname 5

# ASCII用のファイルストリー厶の作成
$enco = [Text.Encoding]::GetEncoding("ASCII")
$inFile  = New-Object System.IO.StreamReader( ((Convert-Path .)+"\"+$hexAsciiFname), $enco )
$outFile = New-Object System.IO.StreamReader( ((Convert-Path .)+"\nt-ascii.txt"), $enco )

# ASCIIに変換
# 11 11 ff ff 22 22 ff ff  33 33 ff ff 44 44 ff ff   foobar foobarfoo
#                                                   ^51列目          ^67列目
$asciiOrigin = 51 # ASCII文字列の始まる場所(怪しい。環境によって変わることがあるかも？)
$asciiLength = 67 - $asciiOrigin # ASCII部分の長さ(怪しい。)
while(($line = $inFile.ReadLine()) -ne $null){
  $outFile.WriteLine($line.Substring($asciiOrigin, $asciiLength))
}

$inFile.Close()
$outFile.Close()
```

やたらコメントが多いですが、やってることはシンプルです。

```powershell:短くしたもの
cd C:\Users\[ユーザ名]\AppData\Local\Temp\NetTraces

$hexAsciiFname = "nt-bin5.txt"
certutil -encodehex .\NetTrace.etl $hexAsciiFname 5

$enco = [Text.Encoding]::GetEncoding("ASCII")
$inFile  = New-Object System.IO.StreamReader( ((Convert-Path .)+"\"+$hexAsciiFname), $enco )
$outFile = New-Object System.IO.StreamReader( ((Convert-Path .)+"\nt-ascii.txt"), $enco )
while(($line = $inFile.ReadLine()) -ne $null){
  $outFile.WriteLine($line.Substring(51, 16))
}
$inFile.Close()
$outFile.Close()
```

# ASCIIを見やすくする(怪しい)
実際のASCII文字列なんですが「v.e.r.y...i.m.p.o.r.t.a.n.t.......」みたいにやたら[.]が多いんです。ffだか00で埋められている関係なのか何なのか詳しく分からないんですが、読みにくいので消します。あと[.]含めて16文字ごとに改行されているので1行144文字にまとめます。ただ、ここらへんは独自研究なので怪しいです。もう少しまともな方法があるかもしれません。あってほしいです。

```powershell:.etl由来のテキストを見やすくする
# NetTrace.etlのあるフォルダに移動する。
cd C:\Users\[ユーザ名]\AppData\Local\Temp\NetTraces

$enco = [Text.Encoding]::GetEncoding("ASCII")
$inFile  = New-Object System.IO.StreamReader( ((Convert-Path .)+"\nt-ascii.txt"), $enco )
$outFile = New-Object System.IO.StreamReader( ((Convert-Path .)+"\nt-ascii_formed.txt"), $enco )

$waste_line = "................" # 16個[.]があるだけの無駄な行を表す(怪しい)
$line_size = 8  # 8行ごとにまとめる
$lineCount = 0
$buf = ""
while(($line = $inFile.ReadLine()) -ne $null){
  if($line -eq $waste_line){continue} # ゴミ行をとばす
  $buf += $line
  $lineCount++
  if($lineCount -ge $line_size){ # 8行ごとにまとめる
    $outFile.WriteLine($buf)
    $lineCount = 0
    $buf = ""
  }
}
$outFile.WriteLine($buf) # 余りがあったら書き込まれる
$inFile.Close()
$outFile.Close()
```

なおも「v.e.r.y. i.m.p.o.r.t.a.n.t.」みたいになってたんでメモ帳かなんかで[.]を虚無と置換して消しました。一部ぶっ壊れてますが、HTTPっぽい文章が得られたりします。通信の行ったり来たりはHTTPヘッダを手動で検索して確認しました。絶対他にまともな方法があるんですが、それを探すコストはWiresharkのインストールを強行するコストを上回るはずなので考えるのをやめました。[^tracerpt]

あと、「.com」の[.]とかも消えてしまっているので、かなり精度の低い解析方法であることを忘れないでください。途中で生成した「HEX+ASCII文字列」のやつまでは信頼できます。テキストとして開ける上に、.etlをバイナリエディタで開いたのと同じ光景が見れるはずです。

# まとめ

- PowerShellを使う(しかないという状況)
- netshを使って.etlとかいう形式のファイルを得る
- certutilの機能でHEXに変換(本来は認証関係のコマンドらしい)
- その流れで無理やりASCIIに変換
- なんか.が多いので消すとそれっぽい文字列が見れる(qiita.comがqiitacomになってしまうというガバがある)

書いてて思い出したんですが、netshから.pcapは得られないものの、変換する[スクリプト](https://github.com/chentiangemalc/PowerShellScripts/blob/master/ConvertEtl-ToPcap.ps1)は出回っているらしいです。そして.pcapの[仕様](http://sorenuts.hatenablog.com/entry/2018/06/07/195209)からパーサを作ればWiresharkみたいに完全な文章が見れるのかもしれません。パーサ作らないまでも.pcapまで作ればオンラインのアナライザ https://pcap.honeynet.org.my/v1/ があるらしいのでそれを使えるみたいです。そっちのルートでいけば一ミリもコーディングしなくていいじゃんアホかよ。でも.pcapをアップロードするのめちゃくちゃ怖いので気づかなくてよかったのかもしれません。

ところでnetshは"network shell"の略らしいです。うるせーなWindowsでもlinuxのやつみたいなshell使わせろよ。...そういえば[使えた](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)ような...いや、それをしたら「素」ではなくなるということで。

この方法は標記のようなことを考えながら死ぬ直前の人にしか需要がないかと思われます。カタギの人はwireshark入れられないマシンでnetsh使って.etl出すだけで事足りるんですよ。でもね、日本にカタギのエンジニアなんていません。Wiresharkなんてどこにもないし.pcapすらありません。仕事に使うのは全部素のWindows10(ですらなく7とか)なんです。クソみたいなバッチ書かされて、VBAで開発して、ひたすらExcelで作った仕様書・設計書・定義書の海なんです。サメのいない海がこんなに怖いとは思いませんでした。

[^tracerpt]: 'tracerpt NetTrace.etl' とやるとある程度内容をまとめたファイルが出てきますが、バイナリ部分はやはりバイナリのままです。