Packet monster (っ‘-’)╮=͟͟͞͞◒ ヽ( '-'ヽ) TUI tool and Go library for sending packets of arbitrary input and monitoring packets on any network interfaces (default: eth0).
BSD-2-CLAUSE License
Packet monster, or Packémon
for short! (っ‘-’)╮=͟͟͞͞◒ ヽ( '-'ヽ)
https://github.com/user-attachments/assets/69b317b8-7235-40c8-8586-2aff7d34cc0d
TUI tool for generating packets of arbitrary input and monitoring packets on any network interfaces (default: eth0
). This tool is not available for Windows and macOS. I have confirmed that it works on Debian on WSL2.
I intend to develop it patiently🌴
[!WARNING] There may be many bugs. If you find a bug, I would be glad if you raise an issue or give me a pull request!
This TUI tool has two major functions: packet generation and packet monitoring.
This image shows packemon running in Generator / Monitor mode. DNS query packet generated by Generator on the left is shown in third line of the Monitor. DNS query response packet is shown as 4nd line, and a more detailed view of it is shown in the image below.
Packemon's Monitor allows user to select each packet by pressing Enter
key. Then, select any line and press Enter
key to see the details of the desired packet. Pressing Esc
key in the packet detail screen will return you to the original packet list screen.
[!WARNING] While using Generator mode, TCP RST packets automatically sent out by the kernel are dropped. When this mode is stopped, the original state is restored. Probably😅. Incidentally, dropping RST packets is done by running the eBPF program. The background note incorporating the eBPF is the POST of X around here.
Send generated packets to any network interfaces.
--interface
flag. Default is eth0
.The following types of packets are covered.
Monitor any network interfaces.
--interface
flag. Default is eth0
.The following types of packets are covered.
Packet Generator
sudo packemon --send
Packet Monitor
sudo packemon
The local node's browser can monitor packets from remote nodes or send arbitrary packets from remote nodes.
+-------------------------------------+
+----------------------+ | REMOTE NODE |
| LOCAL NODE (Browser) | | $ sudo packemon-api --interface xxx |
| Monitor <---------|-- WebSocket --|--> HTTP GET /ws <-----+ |
| Generator ---------|-- POST packet --|--> HTTP POST /packet | |
+----------------------+ | -> parse packet | | +---------------+
| -> Network Interface -----|-- Send packet -->| TARGET NODE x |
+-------------------------------------+ | |
+---------------+
Remote node
Local node
[!WARNING] Please note that the following is dangerous.
The following procedure is an example of how you can expose packemon-api to the outside world and monitor and send remote node packets on your browser.
packemon-api
and run.
$ go install github.com/ddddddO/packemon/cmd/packemon-api@latest
$ sudo packemon-api --interface wlan0
ngrok
and note the URL to be paid out.
$ ngrok http 8082
「Golangで作るソフトウェアルータ」
動作確認用コマンドの参考
WSL2のDebianで動作した。
任意の Ethernet ヘッダ / IPv4 ヘッダ / ARP / ICMP を楽に作れてフレームを送信できる
以下はtmuxで3分割した画面に各種ヘッダのフォーム画面を表示している。そして ICMP echo request を送信し、 echo reply が返ってきていることを Wireshark で確認した様子
フレームを受信して詳細表示(ARPとIPv4)
TUIライブラリとして https://github.com/rivo/tview を使わせてもらってる🙇
pi@raspberrypi:~ $ sudo go run main.go
$ sudo tcpdump -U -i eth0 -w - | /mnt/c/Program\ Files/Wireshark/Wireshark.exe -k -i -
受信画面
$ sudo go run cmd/packemon/main.go
送信画面
$ sudo go run cmd/packemon/main.go --send
単発フレーム送信コマンド(e.g. ARP request)
$ sudo go run cmd/packemon/main.go --debug --send --proto arp
$ arping -c 1 1.2.3.4
ARPING 1.2.3.4 from 172.23.242.78 eth0
Sent 1 probes (1 broadcast(s))
Received 0 response(s)
$ nslookup -vc github.com
どうするか
$ ip -6 route
$ ping -c 1 fe80::1
$ sudo go run cmd/packemon/main.go --send --debug --proto tcp-3way-http
Ethernetフレームのみ作って送信(77c9149
でコミットしたファイルにて)
ARPリクエストを作って送信(390f266
でコミットしたファイルにて。中身はめちゃくちゃと思うけど)
ARPリクエストを受信してパース(b6a025a
でコミット)