<style>
* {
font-family: "Consolas", "Monaco", "Andale Mono";
}
</style>
# 2025 NTU CSIE NASA HW 0 Writeup
## NA
### 1. Short Answer (10pt)
1\.
| 名稱 | 功能 | 實際應用服務 |
| -------- | -------- | -------- |
| Application Layer | 讓使用者可以使用網路執行應用程式協定、實現應用程式間資料的交互 | HTTP、SSH |
| Transport Layer | 確保端對端通訊及資料完整性 | TCP、UDP |
| Network Layer | 把封包從來源主機路由、跨越不同網路傳輸到目標主機 | IP、ICMP |
| Link Layer | 在節點之間傳輸 frame、錯誤檢查 | 乙太網、Wi-Fi |
| Physical Layer | 資料的實體傳輸媒介 | 光纖 |
參考資料:
https://hackmd.io/@Pang-Chang/BkQK8_tjF#OSI%E4%B8%83%E5%B1%A4%E6%9E%B6%E6%A7%8B-%E5%92%8C-TCPIP%E9%80%9A%E8%A8%8A%E5%8D%94%E5%AE%9A-%E6%AF%94%E8%BC%83
https://ithelp.ithome.com.tw/articles/10208750
https://www.edgenext.com/what-are-the-5-layer-protocols-in-tcp-ip-a-comprehensive-guide/
\
2.
(a) 虛擬區域網路,可以將單一區域網路 (LAN) 分成多個相互隔離的邏輯網段/群組
參考資料: https://ithelp.ithome.com.tw/articles/10335164
(b)
| 項目 | Switch | Router |
| -------- | -------- | -------- |
| 功能 | 連接不同裝置形成內網 | 提供多個不同 IP 給不同裝置、封包路由傳輸、連接到外網 |
| 用途 | 建立區域網路,使不同設備之間能夠傳遞資料 | 網路與網路之間的連接 |
| TCP/IP 五層中扮演的角色 | Link Layer。根據 MAC 地址傳輸 | Network Layer。根據 IP 地址路由 |
| 主要差異 | 用於內網的裝置連接,無法跨網段傳輸 | 連接不同網段,可以跨網段傳輸 |
參考資料:
https://www.cisco.com/c/en/us/solutions/small-business/resource-center/networking/network-switch-vs-router.html
https://top1.kingnet.net.tw/news/what-is-switch
https://www.geeksforgeeks.org/difference-between-router-and-switch/
\(c)
Broadcast Storm: 大量的廣播封包 (傳送給廣播範圍內所有網路設備的封包) 占用網路流量
Switching Loop: 網路拓樸中存在 loop (ex. 兩台 Switch 對接),如果一端發出廣播封包,接收端又會再把廣播封包發送回去,形成迴圈導致 Switch 不能正常運作
不同之處: 前者是封包傳輸層面的結果,後者是網路拓樸架構上的問題
相似之處: 皆導致網路效能低落或癱瘓、Switching Loop 是導致 Broadcast Storm 的原因之一
如何防範 Broadcast Storm: 確保網路中不存在迴圈、限制每秒能通過端口的廣/多播封包數量
如何防範 Switching Loop: 用生成樹協定 (STP) 偵測網路實體連接拓樸,找出一個不會形成 loop 的邏輯網路拓樸
參考資料:
https://community.zyxel.com/tw/discussion/18167/%E5%A6%82%E4%BD%95%E9%80%8F%E9%81%8E%E4%BA%A4%E6%8F%9B%E5%99%A8%E6%8E%92%E9%99%A4%E7%BE%A4%E6%92%AD%E5%92%8C%E5%BB%A3%E6%92%AD%E9%A2%A8%E6%9A%B4
https://ithelp.ithome.com.tw/articles/10265870
https://ithelp.ithome.com.tw/articles/10247179
\
3.
為何要換成 IPv6: IPv4 使用 32 位元定址,隨著網際網路發展、上網人數增加,IP 位址不敷使用,於是制定新一代的 IPv6,使用 128 位元定址。
以後有可能從 IPv6 換成其他的嗎: 有可能。IPv6 能提供 2^128 個位址,幾乎不可能用盡,所以不會因為不敷使用而改變,但不排除因為新的需求或網路架構而需要換成新的協定。
兩版本差異:
| 項目 | IPv4 | IPv6 |
| -------- | -------- | -------- |
| 位元 | 32 | 128 |
| 位址數量 | 2^32 | 2^128 |
| 位址表示法 | 用`.`區隔 4 個部分,每個部分 8 位元,以 2 進位或 10 進位表示。ex. 127.0.0.1 | 用`:`區隔 8 個部分,每個部分為 4 個字元的 16 進位表示。ex. 2001\:0db8:\:1428:57ab (以`::`省略多組0000、每部分前面的 0 可省略) |
| 功能 | 較少 | 較多,如安全性(預設有 IPSec)、針對影音傳輸的新欄位 |
| 路由效率 | 較長但固定的表頭,較快 | 可變表頭,較慢 |
有 IPv6 為何還要用 IPv4: 許多設備仍只支援 IPv4,汰換舊有設備需要時間與金錢成本
參考資料:
https://www.ithome.com.tw/tech/92046
https://nordvpn.com/zh-tw/blog/ipv4-ipv6-qubie/
\
4.
UDP: 以串流方式傳送資料,只管傳送不管接收的順序與完整性
TCP: 三次握手建立連線 -> 傳輸包含識別碼跟序號的封包 -> 接收端回傳 ACK -> 四次揮手斷線
相同處: 都屬於傳輸層協定、皆基於 IP 協定
相異處:
| 項目 | UDP | TCP |
| -------- | -------- | -------- |
| 連接類型 | 無連接式通訊 | 連接導向式通訊 |
| 速度 | 快 | 慢 |
| 可靠性 | 不可靠 | 可靠 |
什麼時候會傾向用其中一種: 需要即時/快速傳輸且能允許封包遺失的服務 (ex. 影音直播) 傾向使用 UDP;要求完整性與正確性的服務 (ex. 檔案傳輸) 傾向使用 TCP
參考資料:
https://nordvpn.com/zh-tw/blog/tcp-udp-bijiao/
https://ithelp.ithome.com.tw/articles/10205476
\
5.
什麼是 EFK: Elasticsearch (儲存、搜尋、分析日誌)、Fluentd (收集日誌)、 Kibana (資料視覺化) 三個開源軟體的簡稱
有什麼優點適合系上使用: 高度可擴展性、學習資源完整
有什麼缺點、可能導致什麼問題: 部署配置複雜,有一定的學習門檻,可能不好上手;Elasticsearch 資源消耗量大,可能導致系統卡頓
參考資料:
https://www.webcomm.com.tw/blog/efk/?srsltid=AfmBOopv2vUvlb7gxaEvDhVi1AuTqpq7dV31Olxt_9r9JCiab4fOPqAP
https://www.cnblogs.com/love-DanDan/p/18403078
\
6.
什麼是 Multiplexing: 在單一頻道上傳輸多個子頻道訊號或資料的技術
Multiplexing 種類:
(1) 分時多工 TDM: 切割固定長度的時間段讓子頻道能依照固定順序輪流傳輸
(2) 分頻多工 FDM: 把訊號分在不同的頻段,疊加形成一個複合訊號同時傳輸
(3) 空間多工 SDM: 用多個天線或光纖獨立傳輸訊號,再用多個天線或光纖接收並恢復資訊
系上 Wi-Fi 用哪幾種: MIMO-OFDM(Wi-Fi 4)/OFDMA(Wi-Fi 6)、SDM
為什麼這麼想:
系上 Wi-Fi 分為 2.4 GHz 跟 5 GHz 頻段,Wi-Fi 4 和 Wi-Fi 6 皆有支援這兩個頻段。(暫不考慮最新的 Wi-Fi 7,設備應該沒更新那麼快)
Wi-Fi 4 增加了 MIMO 系統,與 OFDM 結合成複合技術 MIMO-OFDM;Wi-Fi 6 引入了 OFDMA、MU-MIMO。因 MIMO 技術包含 SDM 所以皆有用到 SDM
參考資料:
https://medium.com/twelvefish/1-4-%E7%B6%B2%E8%B7%AF%E5%BB%B6%E4%BC%B8%E8%A7%80%E5%BF%B5-2679b78c7292
https://zh.wikipedia.org/zh-tw/%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8
https://en.wikipedia.org/wiki/IEEE_802.11n-2009
https://en.wikipedia.org/wiki/Wi-Fi_6
https://zh.wikipedia.org/zh-tw/MIMO
### 2. Command Line Utilities (14pt)
1\.
(a)

(b)
ping

nslookup

\(c)
IPv4 private IP 區段為:
10.0.0.0 - 10.255.255.255 (10/8 prefix)
172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
故 private network:
`10.200.200.200`
public network:
`ip4-126.vpn.ntu.edu.tw [140.112.4.126]`
`140.112.5.178`
參考資料: https://datatracker.ietf.org/doc/html/rfc1918#section-3
(d)
每列三個時間代表的意思: 傳送了三個 ICMP 封包到指定 IP,收到個別回傳封包後所計算出來的延遲時間
越下面的結果一定比上面大嗎: 否
原因: 封包的 hop 速度取決於各節點路由器當下的負載與連接狀況
參考資料: https://wayne-blog.com/2023-02-08/what-is-ping/
(e)

\
2.
(a)
(1) 請求: echo-request 回應: echo-reply
參考資料: https://ithelp.ithome.com.tw/articles/10301220
(2)

(b)

與 (a) 的結果不同,加上 `--packet-trace` 參數查看傳送、接收了哪些封包

由上圖可知發送了 ICMP 及 TCP(SYN、ACK) 封包請求,而有得到回應的是 TCP
(c\)
(1) nginx 1.26.2。開源的 HTTP 網頁伺服器,也可作為反向代理、負載平衡器等用途。
參考資料: https://nginx.org/
(2) `nmap -sV 140.112.91.2`。參數 `-sV` 用來掃主機端口上的服務版本
(d)

`curl --request POST` 指定發送 HTTP POST 請求
`nmap -p 48000-49000` 指定掃描的 port 範圍
\
3.
(a) 140.112.30.131
(b) Starry.csie.ntu.edu.tw
(c\) "Your guitar is in the box"
(d) Gu1tArHer0.csie.ntu.edu.tw
參考資料: https://kb.synology.com/zh-tw/DSM/tutorial/dns_nslookup
### 3. Basic Wireshark (11pt)
1\.
(a) 3000
(b) No.1~3 為 TCP 三次握手的過程,伺服器端會回傳 SYN+ACK 的封包
(c\)

(d) 1.268 MB/1 sec = 1268 KB/1 sec = 1268000 bytes/1 sec。t = 2s
(e) 29 個。
法一: Statistics -> HTTP -> Packet Counter
法二: filter 欄位填入 http.request.method == "GET" 後看右下角 Displayed
(f) 3958dc9e-712f-4377-85e9-fec4b6a6442a
2.
(a) Edit -> Preferences -> Protocols -> TLS -> RSA keys list Edit -> Key File 欄位填入 p2_private.key 檔案所在路徑 -> 套用/確認
參考資料: https://medium.com/lunar-mythos/wireshark-decrypt-%E8%A7%A3%E5%AF%86-ssl-message-caaf2fb8e61
(b) 32 
### 4. Cryptography (5pt)
Flag: `NASA_HW0{1_10V3_r54}`
解題過程:
`nc 140.112.91.1 48763` 後發現要我們產生 RSA 金鑰並輸入公鑰 (n, e),而且指定 e = 65537、e\*d=1 (mod (p-1)\*(q-1))、n 是由兩個 2048-bit 質數 p, q 相乘得來。
> Hi, I'm Misumi Uika, and I have a SECRET mission for you.
To prevent any eavesdropping on this message about the SECRET mission, I'll ensure its confidentiality using RSA encryption.
First and foremost, please generate an RSA key pair consisting of a public key (n, e) and a private key (n, d) such that e=65537, n has 4096 bits, and e*d=1 (mod (p-1)*(q-1)), where n is the product of two 2048-bit prime numbers p and q. Once generated, provide me with your public key (n, e).
Note: d is the private exponent, e is the public exponent, and n is the modulus.
n:
產生金鑰並輸入公鑰之後初華會以公鑰加密他要傳給我們的訊息,我們要用私鑰
以下為解題腳本與註解
```python=
from pwn import *
from Crypto.Util.number import *
# 建立連線
uika = remote('140.112.91.1', 48763) # 等同 nc 140.112.91.1 48763
uika.recvlines(4) # 接收四行文字
# 依照要求產生 n 、加解密指數(e, d)
e = 65537
l = 2048
p = getPrime(l)
q = getPrime(l)
n = p * q
phi = (p-1) * (q-1)
d = inverse(e, phi)
# 把 n, e 轉 str 再轉 bytes 後傳送,因 pwntools 接收與傳送資料皆限定為 bytes 型態
N = bytes(str(n), 'utf-8')
E = bytes(str(e), 'utf-8')
uika.sendline(N)
uika.sendline(E)
# 接收加密訊息
uika.recvline()
uika.recvuntil("Here is the encrypted message: ")
c = int(uika.recvline())
# 解密訊息並印出
msg = pow(c, d, n)
print(long_to_bytes(msg))
```
腳本運行結果:
> [+] Opening connection to 140.112.91.1 on port 48763: Done
b"Someone purposely gave Anon wrong information about RSA, making her use a bad RSA public key to encrypt her private data! The clues about the identity of the perp are hidden in Anon's secret diary. To curb the spread of this misinformation ASAP, please decrypt Anon's diary and send it to me. I'll figure out who the perp is. Oh, by the way, here is the flag for you: NASA_HW0{1_10V3_r54}"
[*] Closed connection to 140.112.91.1 port 48763
參考資料: https://hackmd.io/@Koios/RSA
### 5. 為什麼簽不了憑證??? (10pt)
1\. 由網路切分出來較小的網段,能夠讓資料傳輸更有效率
參考資料: https://www.cloudflare.com/zh-tw/learning/network-layer/what-is-a-subnet/
\
2. 連接不同協定的裝置
參考資料: https://www.advantech.com/zh-tw/resources/industry-focus/%E9%96%98%E9%81%93%E5%99%A8gateway%E6%98%AF%E4%BB%80%E9%BA%BC%EF%BC%9F%E8%B3%BC%E8%B2%B7%E9%96%98%E9%81%93%E5%99%A8%E4%B8%8D%E5%8F%AF%E5%BF%BD%E7%95%A5%E7%9A%844%E5%A4%A7%E9%BB%9E
\
3. X -> WAN -> A1
4. A2 -> LAN -> B2 -> B1 -> WAN -> X
原因: A 的 default gateway IP 為 172.16.0.1,A2 172.16.59.254/16 與其屬於同個子網路
5.
stateful 和 stateless 的防火牆差在哪:
| 項目 | stateful | stateless |
| -------- | -------- | -------- |
| 運作原理 | 記錄及追蹤連線狀態 | 只檢查來源及目的地等封包標頭資訊是否符合給定的規則 |
| 安全性 | 較高 | 較低 |
| 資源消耗 | 較多 | 較少 |
| 速度 | 較慢 | 較快 |
哪種比較可能擋住 TCP ACK without SYN: stateful,因為會追蹤 TCP 連線過程與狀態
參考資料: https://www.geeksforgeeks.org/stateless-vs-stateful-packet-filtering-firewalls/
6. 根據 3. ~ 5. 的答案,只有 A 傳給 X 的封包 會經過 B。三次握手建立 TCP 連線的時候,B 並不知道 A 跟 X 已建立連線,導致在 A 收到 HTTP Request 後要發給 X 的 HTTP Response 被 B 判定為異常而攔截下來
7. 1.5hr
撰寫、發布公告、緩衝時間 10min
停止服務並確認 5~10min
備份、確認備份 10~15min
更換憑證 10~15min
上線前測試與確認 10~15min
預留突發狀況緩衝時間 20min
參考資料: ChatGPT
8. 關閉或藉由靜態路由/路由政策不使用 A1,讓接收與傳送一率走 default gateway、經過 B (防火牆)
9. 我準備好了但我的成績沒準備好
## SA
### 6. btw I use arch (15pt)
6-0.
- Verify signature
certutil 確認 .iso 檔 sha256 值一致
- Boot the live environment
打開 VMWare -> Create a New Virtual Machine -> Typical -> 選擇指定 .iso 檔 -> OS: Linux;Version: Other Linux 6.x kernal 64-bit -> Maximum disk size: 32 GB -> Memory: 2 GB -> 開機
- Set the console keyboard layout and font
皆使用預設 (指令: `loadkeys us`)
- Verify the boot mode
`cat /sys/firmware/efi/fw_platform_size` 得到 No such file or directory -> BIOS
- Connect to the internet
`ip link` 確認網路介面卡已啟用,接上網路並嘗試 `ping archlinux.org` 成功
- Update the system clock
`timedatectl set-timezone Asia/Taipei` 把時區設定成台北
- Partition the disks
`fdisk -l`
`fdisk /dev/sda` 依照題目需求分割
- Format the partitions
`mkfs.ext4 /dev/sda<1/2/3>`
`mkswap /dev/sda4`
`swapon /dev/sdX4`
- Mount the file systems
```
mount /dev/sda2 /mnt
mkdir /mnt/home
mount /dev/sda3 /mnt/home
mkdir /mnt/boot
mount /dev/sda1 /mnt/
```
- Install essential packages
`pacstrap -K /mnt base linux linux-firmware`
- Configure the system
- Fstab
`genfstab -U /mnt >> /mnt/etc/fstab`
- Chroot
`arch-chroot /mnt`
- Time
`ln -sf /usr/share/zoneinfo/Asia/Taipei /etc/localtime`
`hwclock --systohc`
- Localization
`locale-gen`
- Network configuration
`echo b13902081 > /etc/hostname`新增 hostname file(應 6-1. 題目要求改成學號)
- Initramfs
`mkinitcpio -P`
- Root password
`passwd`
應題目要求新增使用者,帳密皆為nasa
`useradd -m nasa`
`passwd nasa` 然後輸入兩次 nasa
- Boot loader
題目要求 grub
`pacman -S grub`
`grub-install /dev/sda`
`grub-mkconfig -o /boot/grub/grub.cfg`
- Reboot
`reboot`
參考資料:
安裝教學 https://wiki.archlinux.org/title/Installation_guide
https://wiki.archlinux.org/title/Users_and_groups#Example_adding_a_user
ChatGPT
https://medium.com/@sydasif78/arch-linux-installation-virtual-machine-a188d028359
\
6-1.

\
6-2.

參考資料: https://blog.johnsonlu.org/how-to-find-uuid-of-storage-devices-in-linux/
\
6-3.

參考資料: https://blog.gtwang.org/linux/find-linux-distribution-name-version-number/
### 7. Flag Hunting (25pt)
1\.
(a) `echo $HISTFILE` 得到 `/home/nasa/kickstart.nvim/.git/logs/refs/remotes/origin/HEAD`
(b) `~/.bashrc` 中的 HISTSIZE
\(c) `~/.bashrc` 中的 HISTFILESIZE
(d)
Flag: `NASA{y0UF1nd+heCoRr3tFL4G}`
解題過程:
`cat ./bash_history` 輸出 `./gen_flag --line 104 --out new_history_file`
推測參數 `--line 104` 是指第 104 行
`cat kickstart.nvim/.git/logs/refs/remotes/origin/HEAD | head -n 104` 得到 Flag
參考資料: https://home.gamer.com.tw/creationDetail.php?sn=4385131
\
2.
Flag: `NASA{EZ_TrEa$Ur3_HunT!}`
解題過程:
執行 /home/nasa/treasure 後顯示我們要找的是最小的檔案的第 76 行
`find /home/user -type f -exec du -h {} + | sort -h | head -n 1`
`-type f` 指定類型為 file;`du` 用來取得大小 `-h` 參數以人容易閱讀的方式加上單位顯示
`sort -h` 由小到大排序
結果顯示最小的檔案為 flag-628
`cat flag-628 | head -n 76 | grep "NASA{"` 得到 Flag
參考資料: https://blog.csdn.net/xieqj_0511/article/details/132473400
\
3.
Flag: `NASA{m0dERn_Pr0B1em$_reQU1r3_m0dERn_SOluT10N5}`
解題過程:
用在後面的 5. 學到的 tmux 開兩個 terminal,一個拿來執行 boss
另一個使用 `pgrep -lf boss` 查看 subprocess ID,結果顯示 ID 範圍從 1750 ~ 1770
嘗試 `pkill -P 1750` 上面跳出 too slow
拚手速執行 `pgrep boss | head -n 1 | xargs pkill -P` 得到 Flag

參考資料:
https://ithelp.ithome.com.tw/articles/10160861
https://www.runoob.com/linux/linux-comm-pkill.html
ChatGPT
https://www.runoob.com/linux/linux-comm-xargs.html
\
4.
Flag: `NASA2025{n4ndeharuh1ka93yatt4n0}`
解題過程:
strings 能夠提取檔案中的可印出字串
grep 可以搜尋包含指定字串的內容,依照題目線索指定搜尋 486 跟 re02 兩個子字串
`strings chal | grep "486" | grep "re02"` 得到 `ioewe3h486hu5tnjdsre029y814mmq`
推測這就是執行檔案時的正確通關密語
`./chal ioewe3h486hu5tnjdsre029y814mmq` 得到 Flag
\
5.
翻 tmux 文件發現可以用 `tmux split-window -v/h` 來製作 layout
> Create a new pane by splitting target-pane: -h does a horizontal split and -v a vertical split
做三次的 `tmux split-window -v` 再 `tmux split-window -h`,結果如下圖

參考資料: https://man.openbsd.org/OpenBSD-current/man1/tmux.1
### 8. NASA 國的大危機 (10pt)
8-1.
`cd mystic-cup` 然後 `cat Dockerfile`。每一段程式碼的作用寫在以下註解
```dockerfile=
FROM python:3.9-slim # 使用的 Docker Image 名稱
# RUN 後面接要使用的 Linux 指令
RUN apt-get update && apt-get install -y # 更新 apt-get 並下載下列工具或套件
build-essential \
libssl-dev \
net-tools \
iproute2 \
tcpdump \
tshark \
nano \
curl \
wget \
vim \
less \
procps \
Isof \
iputils-ping \
&& rm -rf /var/lib/apt/lists/* # 刪除 apt 暫存
RUN mkdir -p /usr/libexec/run # 建立 /usr/libexec/run 目錄
# COPY <src> <dest> 複製前者路徑檔案到後者
COPY usr/libexec/run/dist/transfer /usr/libexec/run/transfer
COPY usr/libexec/run/run.sh /usr/libexec/run/run.sh
# chmod +x 更新對檔案的權限為可執行
RUN chmod +x /usr/libexec/run/transfer
RUN chmod +x /usr/libexec/run/run.sh
# 啟動容器時執行 run.sh
CMD ["/usr/libexec/run/run.sh"]
```
參考資料: https://ithelp.ithome.com.tw/articles/10191016
\
8-2.
`docker images` 發現有個 my-magic-cup
`docker run my-magic-cup` 嘗試啟動它,收到 "System routine check: FAILED. Exiting..." 後結束
根據 dockerfile 23 及 28 行,本地上 /usr/libexec/run/run.sh 這個檔案就是被執行的 bash 腳本
`cat /usr/libexec/run/run.sh` 查看內容
```bash=
#!/bin/bash
if [ "$MAGIC_SPELL" = "hahahaiLoveNASA" ]; then
echo "System routine check: OK. Service started..."
python3 -c "print('Service running: hidden cup is awakened')"
tail -f /dev/null
else
echo "System routine check: FAILED. Exiting..."
exit 1
fi
```
從第二行可以看出如果環境變數 "$MAGIC_SPELL" = "hahahaiLoveNASA" 就能夠成功執行
使用 -e 參數傳入環境變數 $MAGIC_SPELL" = "hahahaiLoveNASA"
`docker run -e MAGIC_SPELL=hahahaiLoveNASA my-magic-cup`
成功執行

參考資料: https://ithelp.ithome.com.tw/articles/10241965
\
8-3.
Flag: `flag[I'll send our killer on 3948/02/22]`
`docker run -it -e MAGIC_SPELL=hahahaiLoveNASA my-magic-cup` 發現 transfer.py 在傳送訊息
Ctrl + C 三次跳出
`docker ps` 查剛剛 run 的 container ID
`docker exec -it <ID> /bin/bash` 進入 container 內 terminal
`tcpdump -i any -A` 用 tcpdump 抓封包。參數 -i 指定監聽的 interface、參數 `-A` 以 ASCII print 封包
參考資料:
https://www.runoob.com/docker/docker-run-command.html
https://www.runoob.com/docker/docker-exec-command.html
https://www.tcpdump.org/manpages/tcpdump.1.html