混合式密碼系統(hybrid cryptosystem) 集兩者之長:用非對稱密碼交換一把隨機生成的金鑰,再用這把金鑰以對稱密碼加密其餘通訊。
兩全其美,但金鑰交換是弱點#
這提供對稱密碼的速度與效率,同時解決安全金鑰交換的兩難。SSL、SSH、PGP 等大多數現代密碼應用都用混合式密碼。
既然多數應用用抗密碼分析的密碼,攻擊密碼本身通常行不通。但若攻擊者能攔截雙方通訊並偽裝成其中一方,就能攻擊金鑰交換演算法。
中間人攻擊(MitM)#
中間人攻擊(man-in-the-middle) 是繞過加密的巧妙方法:攻擊者坐在兩個通訊方之間,雙方都以為在和對方通訊,其實都在和攻擊者通訊。
A 以為在與 B 通訊、B 以為在與 A 通訊,但兩者都在與攻擊者通訊。A 與 B 協商加密連線時,其實各自與攻擊者開了加密連線,攻擊者因此學到祕密金鑰。攻擊者維持兩條各自獨立、各用不同金鑰的加密通道:解密來自 A 的封包再用第二把金鑰重新加密轉給 B——能嗅探甚至修改 A、B 間的流量,而雙方毫不知情。

圖 0x700-1:中間人攻擊——攻擊者維持兩條各用不同金鑰的加密通道
實際操作:arpspoof + mitm-ssh#
用 ARP 快取毒化把流量重導後,可用 SSH 中間人工具(多為修改 openssh 而來,如 Claes Nyberg 的 mitm-ssh):
# 把連入埠 22 的 TCP 重導到 localhost:2222(mitm-ssh 監聽處)
sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-ports 2222
mitm-ssh 192.168.42.72 -v -n -p 2222
# 另一終端用 arpspoof 毒化 ARP 快取
sudo arpspoof -i eth0 192.168.42.72
受害者連線看似正常,但攻擊者機器上帳密與整段 session 都被記錄:
SSH2_MSG_USERAUTH_REQUEST: jose ssh-connection password 0 sP#byp%srt
SSL/SSH 的防護:身分驗證#
攻擊之所以可能,在於攻擊者能偽裝成任一方。SSL 與 SSH 設計時考慮了這點:SSL 用憑證、SSH 用主機指紋(host fingerprint)驗證身分。若攻擊者沒有 B 的正確憑證或指紋,簽章不符,A 就會收到警告。
前例中 tetsuo 從未與 loki 做過 SSH,沒有主機指紋,所以接受了 mitm-ssh 生成的假指紋。若它已有 loki 的指紋,整個攻擊會被偵測、跳出醒目警告:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@openssh 用戶端會阻止連線直到舊指紋被移除。但許多 Windows SSH 用戶端沒這麼嚴格,只跳「確定要繼續嗎?」對話框,無知的使用者可能直接點過去。
指紋的弱點#
協定差異:用 SSH1 vs SSH2 繞過指紋比對
SSH 有 SSH1 與 SSH2 兩種協定,各有不同的主機指紋。SSH 伺服器橫幅 SSH-1.99 依慣例表示同時支援兩協定。
用戶端通常只用 SSH2 連過,因此只存有協定 2 的指紋。若中間人的 SSH daemon 強迫用戶端改用另一協定(SSH1),就找不到對應指紋——舊實作只會要求「新增這個指紋」,而非跳出冗長警告(因為技術上此協定確實沒有指紋)。在
mitm-ssh_config加Protocol 1即可讓假伺服器宣稱只講 SSH1。
新版 OpenSSH 已補上稍微冗長的警告,但仍不如同協定指紋不符時強烈,且並非所有用戶端都更新,此技巧對 MitM 仍有用。
模糊指紋(Fuzzy Fingerprints):騙過人眼
Konrad Rieck 的點子:使用者常從不同用戶端連同一伺服器、多次看到並記住指紋的大致結構。沒人背整串指紋,但重大改變一眼就能察覺。
然而人眼與大腦可被欺騙:數字 1 和 7 依字型看起來很像;指紋開頭與結尾的十六進位數字記得最清楚,中段則模糊。模糊指紋技術的目標是生成一把主機金鑰,其指紋看起來與原指紋夠像,足以騙過人眼。
用 ssh-keyscan 取得目標主機金鑰指紋格式後,Rieck 的 ffp 工具就能生成相似的模糊指紋——它是暴力搜尋,隨時間找到「模糊品質」越來越高的指紋(如從 25% 提升到 70%)。