今天我們要來測試不同網路協定的封包會有哪些內容?首先,我們要先安裝一個好用的 GUI 工具「Windows Packet Sender」。
Windows Packet Sender 是一款由 Dan Nagle 開發的專案,並且在 11 年前就把這個專案開源放到 Github!作者本意是希望讓對於網路知識薄弱的朋友們有一個好的工具可以快速操作封包流量傳輸。
它能夠跨平台溝通,包括:Windows、MacOS、Linux。只要輸入簡單的設定就可以發送 TCP、UDP、HTTP 等不同網路協定的封包給目標裝置。
常見的用途包括:測試網路連線、API、防火牆設定、惡意軟體分析、自動化...等。功能非常多!可以商業使用或是個人測試使用,端看你怎麼使用工具。
直到上個月,兩個禮拜前,還持續有在更新和維護。目前這個專案有 12 個工程師在協助開發和優化,真的非常感謝 Github 社群上的大老們互相幫忙,我們才有好工具可以使用啊!
看看這個 Commits 數量就可以知道他們很用心在維護了。
你可以到他們的官方網站:https://packetsender.com/download 安裝這套工具。或者是使用 Winget
指令來安裝。(目前 Winget
支援 Windows 10 / 11 以上版本使用)
這邊我們就直接示範用安裝包來安裝這個工具吧!
在紅色框線中是預設的封包,你可以直接按左邊的 Send
按鈕來嘗試看看,不過因為我們現在要測試的環境是 WSL 的 Kali Linux 與自己本機的 Windows 溝通,所以我們先把這些預設封包刪除。
先全選畫面中所有預設的封包,然後點右上角「Delete Saved Packet」就會出現一個非常乾淨的 Packet Sender 囉!
那我們要怎麼使用這個工具呢?首先:
Address
:設定目標 IPv4 位址,你可以在 Kali Linux Terminal 輸入 ifconfig
觀察自己的 IPv4,然後把網路位址複製到這個欄位。Port
:設定連接阜,還記得我們說過電腦有 65535 個連接阜嗎?所以只要隨便設定一個,比如:12345
就可以了。Method
:你可以選擇 TCP、UDP、SSL、DTLS、HTTP/GET、POST、HTTPS/GET、POST,總共 8 種不同協定的封包。至於 Packet Name 和 ASCII 就可以隨便自己設定了,這邊我示範幾個使用方法:
從 Kali Linux 打開 Wireshark 開始監聽 eth0
封包流量,然後打開一個 Terminal 輸入
# 監聽 UDP port 12345
sudo nc -u -lvp 12345
# 確認 port 12345 有在監聽
ss -l | grep 12345
接著到 Packet Sender 設定,你可以把它儲存下來,之後就可以直接使用:
PacketName:UDP Test Packet
ASCII:hello from windows udp
HEX:從 ASCII 自動帶入
Address:<your_linux_IPv4>
Port:12345
Method:UDP
你可以看到畫面中 WireShark Info 的位置顯示 59423 → 12345
這就是我們 Windows Port 連接到 Kali Linux Port 的資訊。也可以看一下右下角 Hex 面板對照我們傳送的 ASCII Hex 編碼 hello from windows udp
。
從 Kali Linux 打開 Wireshark 開始監聽 eth0
封包流量,然後打開一個 Terminal 輸入
# 監聽 TCP port 1111
sudo nc -lvp 1111
# 確認 port 1111 有在監聽
ss -lntp | grep 1111
接著到 Packet Sender 設定,你可以把它儲存下來,之後就可以直接使用:
PacketName:TCP Test Packet
ASCII:hello from windows tcp
HEX:從 ASCII 自動帶入
Address:<your_linux_IPv4>
Port:1111
Method:TCP
同樣的,我們會看到從 Windows Port 連接到 Kali Linux Port 52709 → 1111
以及下方 Hex 面板中的資訊跟我們輸入的 hello from windows tcp
一模一樣!
這邊剛好可以提到 TCP 的三次握手機制,你會看到在 PSH 前面有三次 SYN、ACK 的封包,這正是 Windows 正在和 Kali Linux 做連線的證明,當握手三次成功之後就會發送訊息。而後面 FIN、ACK 的封包則是關閉伺服器的封包,數量取決於是誰先關閉連線。
從 Kali Linux 打開 Wireshark 開始監聽 eth0
封包流量,然後打開一個 Terminal 輸入
# 開啟一個 HTTP port 8080 服務
python3 -m http.server 8080
接著到 Packet Sender 設定,你可以把它儲存下來,之後就可以直接使用:
PacketName:HTTP Test Packet
ASCII:GET / HTTP/1.1\r\nHost: <your_linux_IPv4>\r\nConnection: close\r\n\r\n
HEX:從 ASCII 自動帶入
Address:<your_linux_IPv4>
Port:8080
Method:TCP
這邊我們仍然使用 TCP 網路協定,因為 HTTP 是應用層協定,跑在傳輸層之上,因為 Packet Sender 的 Method 選項指的是 傳輸層(TCP/UDP/SSL…等),所以我們 method 當然是選擇 TCP。
也就是說你是用 TCP 來承載 HTTP 文本,HTTP(應用層)靠 TCP(傳輸層)來送資料。那前面就會有三次握手建立連線的 ACK 封包,以及後面看誰先關閉連線的 FIN 封包。
而且因為我們是開啟 Kali Linux HTTP 服務,所以回應的時候也會出現網頁熟悉的 200 response。也就是說,是 HTTP 服務回應給你的,理所當然在 Packet Sender 裡面看到的 To Address 會是自己啦!
不知道大家有沒有體驗到網路協定以及加密的世界原來長這個樣子!生活中透過網路建立的服務那麼多,而它的底層原理和邏輯居然這麼複雜。小弟我也是透過這次鐵人賽一邊學一邊寫文章才學習到,真的很神奇呢!
下一章我們來測試看看加密文檔 HTTPS,裡面會用到的加密方式和網路協議分別是 SSL/TLS,如果對這塊領域已經有了解的朋友不妨自己試試看,說不定會有意外發現哦!
自己和 AI 學來的
Cloudflare TLS 介紹
Cloudflare SSL 介紹