ISP 偽造出合法的 SSL certificate,對放在德國的 xmpp.ru 進行 MITM 監聽

標題有點複雜,先講一下 http-01 認證,這是目前 Let's Encrypt 上最常被使用的認證方式,是透過 HTTP 協定完成認證,你只要能回答 http://www.example.com/.well-known/acme-challenge/XXX 的內容就能過。

一般來說,這個 HTTP 位置只有這台伺服器的 owner 才有辦法提供,也就能確保不是任何人都可以申請。

但因為這邊走的是 HTTP,對於 ISP 這種比較特別的身分來說,他可以從中架設 HTTP 的 MITM Proxy 做到這件事情。

而有了合法的 SSL certificate 之後,中間的 MITM Proxy 就不只能聽 HTTP 了,還可以聽 HTTPS 的內容 (甚至修改內容)。

這次發生的事情就是在德國的 LinodeHetzner 機房內的服務,俄羅斯最大的 XMPP 服務 xmpp.ru 被搞出這件事情 (XMPP 是一個開放協定,不熟的話可以想像成類似 Line 或是 Telegram 的服務,但 XMPP 是開放協定,可以用自己喜歡的軟體連上):「Encrypted traffic interception on Hetzner and Linode targeting the largest Russian XMPP (Jabber) messaging service」。

他們在 Hetzner 的伺服器上有發現 network offline 的訊號:

[Tue Jul 18 12:58:29 2023] igb 0000:04:00.0 enp4s0: igb: enp4s0 NIC Link is Down
[Tue Jul 18 12:58:48 2023] igb 0000:04:00.0 enp4s0: igb: enp4s0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX/TX

而在這個 network offline 的時間不久後 Let's Encrypt 發出了 xmpp.ru 與 jabber.ru 的 SSL certificate (crt.sh 上可以查到,在 99976947049997621208):

18 July 2023 issuing time is about the same when Hetzner server has lost network link for several seconds.

這些徵兆符合改接到 MITM Proxy 上的行為。

這次的事情很大條,因為這些伺服器是在德國,不是在俄羅斯... 事情才剛開始被報導出來,後續得繼續追蹤,而且應該也會促成新的機制被引入?

用 irssi + xmpp 連上 HipChat...

HipChat 算是個很有趣的服務,不過實際使用後可以發現效率沒有 command line 的 irssi 好,畢竟 irc 就是以溝通為主的工具。

但 HipChat 可以保留紀錄並且透過 iOS 及 Android device 存取的特性彌補了這個缺點,甚至掩蓋掉原來的缺點。所以接下來就是想辦法用 irssi 連上 HipChat,如果可以的話就可以兼顧了...

網路上其實有不少資料,irssi 可以透過 HipChat 的 XMPP 界面連上,也就是 irssi-xmpp 這個套件。

不過這個套件在 FreeBSD ports 裡是 0.51 版,會 core dump... 雖然送了 0.52 版的 patch 進去 (ports/177466: [patch] Update of irc/irssi-xmpp to 0.52),不過不知道什麼時候才會進去...

幾個步驟要做,首先是 .irssi/startup 內要載入 xmpp,然後設定 alternative_nick

/load xmpp
/set alternative_nick Gea-Suan Lin

然後在 .irssi/config 內設定:(本來應該就有 servers & chatnets 了,自己補上就好)

servers = (
  {
    address = "conf.hipchat.com";
    chatnet = "hipchat";
    password = "hipchat_password";
    port = "5223";
    use_ssl = "Yes";
    autoconnect = "Yes"
  }
)

chatnets = {
  hipchat = {
    type = "XMPP";
    nick = "two_hipchat_number@chat.hipchat.com";
  };
};

然後在 channels 裡就可以指定 channel 了:

channels = (
  {
    name = "two_room_identifier@conf.hipchat.com";
    chatnet = "hipchat";
    autojoin = "Yes";
  }
)

主要是參考「Config for Irssi to connect to various XMPP chat servers. Replace the passwords, usernames an ids by your own. Remember, the irssi-xmpp (http://cybione.org/~irssi-xmpp/) plugin is requried.」這份設定測出來的。