ChargePoint/wireshark-v2g
GitHub: ChargePoint/wireshark-v2g
一个 Wireshark 插件,用于解析和调试电动汽车 V2G(Vehicle-to-Grid)充电通信协议。
Stars: 62 | Forks: 21
# wireshark-v2g - 用于 V2G 通信的协议解析器
[](https://github.com/ChargePoint/wireshark-v2g/actions/workflows/ubuntu.yml)
[](https://github.com/ChargePoint/wireshark-v2g/actions/workflows/macos.yml)
[](https://github.com/ChargePoint/wireshark-v2g/actions/workflows/windows.yml)
## 概述
Vehicle to Grid 协议用于充电应用,本项目
提供了协议解码和分析的参考。
* Wireshark 的 LUA 文档:https://wiki.wireshark.org/Lua
* Wireshark 的开发文档:https://wiki.wireshark.org/Development
* OpenV2G 文档:http://openv2g.sourceforge.net
## 快速开始
根据所使用的主机选择合适的归档文件
* linux-x86_64
* macos-x86_64
* win64
请按照说明,根据不同平台将预构建的发布镜像
安装到 Wireshark 中。
文件复制完成后,重启 Wireshark,这些 v2g 插件
现在应该会列在 __关于 Wireshark__ 界面的插件
选项卡中。对于 tshark,使用命令行选项 `tshark -G plugins`
将列出已加载的内容。
### Linux 和 MacOS
个人插件文件夹是 `~/.local/lib/wireshark/plugins`,因此
需要将资产中的 v2g.lua 和 v2gexi.so 文件解压并
放置在此目录中。
对于 Linux
- 将 v2g.lua 复制到 `~/.local/lib/wireshark/plugins`
- 将 v2gexi.so 复制到 `~/.local/lib/wireshark/plugins/4.2/epan`
对于 Mac
- 将 v2g.lua 复制到 `~/.local/lib/wireshark/plugins`
- 将 v2gexi.so 复制到 `~/.local/lib/wireshark/plugins/4-2/epan`
### Windows
Windows 的个人插件文件夹是 `%APPDATA%/Wireshark/plugins`
为了确保 dll 能在 Windows 上加载,它的布局可能有些不同。
- 将 v2g.lua 复制到 `%APPDATA%/Wireshark/plugins`
- 将 v2gexi.dll 复制到 `%APPDATA%/Wireshark/plugins/4.2/epan`
__注意__:也可以使用 `Program Files` 下 `Wireshark` 目录中的全局
插件文件夹(即 Wireshark.exe 所在的位置)。那里的插件文件夹可以作为
复制 v2g 文件的目标位置。
## 构建
此插件不作为 Wireshark 源码的一部分分发,在
被合并之前——它可以作为独立插件构建,也可以
作为完整 Wireshark 构建的一部分。
### Linux
#### 独立插件
在 Debian/Ubuntu 上构建并安装此插件:
```
sudo add-apt-repository ppa:wireshark-dev/stable -y
sudo apt -get install tshark wireshark wireshark-dev
git clone https://github.com/ChargePoint/wireshark-v2g.git
mkdir wireshark-v2g/build && cd wireshark-v2g/build
cmake ..
make
sudo make install
```
#### 源码插件
将插件作为 Wireshark 的一部分进行构建和安装(即永久安装)
1. 获取 Wireshark 仓库并更改目录以便进行后续步骤
git clone https://gitlab.com/wireshark/wireshark
cd wireshark
git checkout release-4.2
2. 将 V2G 插件复制到新的 `plugins/epan/v2g` 目录
git clone https://github.com/ChargePoint/wireshark-v2g.git plugins/epan/v2g
3. 修补 Wireshark 中的 cmake 以包含 v2g 插件
git apply plugins/epan/v2g/extern/wireshark-release-4.2.patch
4. 使用 v2g 插件执行新的 Wireshark 构建
mkdir -p build && cd build
cmake ..
make
sudo make install
### Mac OS X
构建过程类似于 Linux 构建,但基于
homebrew。这意味着大多数设置都需要一个完整的构建,
其中包括获取 brew 配方。
有关 macOS 的软件包安装和构建步骤,
请参见 GitHub 的 workflows。
1. 获取 Wireshark 仓库并更改目录以便进行后续步骤
git clone https://gitlab.com/wireshark/wireshark
cd wireshark
git checkout release-4.2
2. 将 V2G 插件复制到新的 `plugins/epan/v2g` 目录
git clone https://github.com/ChargePoint/wireshark-v2g.git plugins/epan/v2g
3. 修补 Wireshark 中的 cmake 以包含 v2g 插件
git apply plugins/epan/v2g/extern/wireshark-release-4.2.patch
4. 使用 Wireshark tools 脚本配置 brew 进行构建
sh tools/macos-setup-brew.sh
5. 使用 v2g 插件执行新的 Wireshark 构建
mkdir -p build && cd build
cmake -DFETCH_lua=ON -GNinja ..
ninja
ninja plugins
# 推荐的安装目录
cp -a run/Wireshark.app /Applications/
### Windows
在此特定平台上,插件需要作为源码树的一部分进行构建。
因此,需要进行以下步骤来完成完整的构建设置。
1. 请遵循 Wireshark Windows 的[分步指南](https://www.wireshark.org/docs/wsdg_html_chunked/ChSetupWin32.html)
2. 将 V2G 插件复制到 `plugins/epan/v2g` 目录
3. 修补 Wireshark 构建系统以包含此插件
git apply plugins/epan/v2g/extern/wireshark-release-4.2.patch
4. 执行包含插件的完整构建
## 用法
假设已经执行了插件的构建和安装,
通过 tshark 进行集成和显示的基本测试可以
快速检查插件的解析和显示。
```
tshark -V -r ../wireshark-v2g/pcaps/test.pcap 2>&1
```
*注意:* 对于开发者,可以使用输出到 stderr 的 fprintf 来
追踪并确定解析错误的可能来源。
## 解密 TLS 负载
### 自动方法
在 tools 文件夹下有一个简单的 Python 脚本,它可以获取
V2G 调试数据包捕获文件,提取密钥,使用 Wireshark 的 `editcap`
实用程序提取 TLS 会话密钥并将其应用到整个抓包记录中。
#### 前置条件安装
如果您已安装 python3,则可以安装 `scapy`,或者使用
包含在 `tools/` 目录中的 `pipenv`。
不使用 pipenv 安装 scapy:`python3 -m pip install scapy==2.4.5`
使用 pipenv:`pipenv shell`
#### 运行 `extract_secrets.py`
```
$ ./extract_secrets.py -f ../../pcaps/plc_20210810T190140.pcap
WARNING: No IPv4 address found on en3 !
WARNING: No IPv4 address found on en4 !
WARNING: more No IPv4 address found on en1 !
TLS was requested by fe80::218:23ff:fe0f:fbfe:49156
found potential session key on raw UDP packet with dest port 49156
writing ../pcaps/plc_20210810T190140_secret.txt
editcap --inject-secrets tls,../pcaps/plc_20210810T190140_secret.txt ../pcaps/plc_20210810T190140.pcap ../pcaps/plc_20210810T190140_decrypted.pcap
```
### 手动方法
大多数调试记录会通过从随机端口发送到车辆端口的
单个 UDP 数据包来记录 TLS 会话密钥。在其中您会找到
类似以下内容的密钥:
```
CLIENT_RANDOM 6112d032475e758bbf8eaf2b0a540f3f2c7a6f6d1a9b48935d16c468086822f5 8471a233b4f1926084b68977a28ef8b65f59fea4b4942800539ba1d991a98c3f81e29a109d394606bd91286981dbd122
```
## 解码整个 EXI 流
### 辅助程序
* `yq`(`jq` 的同类工具)附带了 `xq`,用于 XML -> JSON 转换
* 还推荐使用 `tidy`(OSX 自带)来美化 XML 数据
在对抓包记录进行解码后,您可以使用以下命令导出数据进行解码:
### 构建并运行 docker 容器
```
cd tools/docker/decoder
docker build -t decoder:test .
docker run --name=decoder --rm -p 9000:9000/tcp -d decoder:test
```
### 导出抓包流中的所有特定 EXI 负载
以下命令将导出所有的抓包 EXI 数据并
将其直接解码输出到 stdout
```
tshark -X lua_script:v2g.lua -r ~/Downloads/Analyzer_M043_decrypted.pcap -Y "exi" -T json | jq '.[]._source.layers.v2gtp.exi.data."data.data"' | sed s/\://g | sed s/\"//g | while read line; do curl -s -X POST -H "Expect:" -H "Format: EXI" -d ${line} http://localhost:9000 |tidy -xml -iq;done
```
### 完成后,终止容器:
```
docker kill decoder
```
标签:Bash脚本, rizin, V2G协议, Wireshark插件, 客户端加密, 流量解析, 物联网, 电动汽车, 网络协议分析, 请求拦截, 逆向工具