這一題是接在 IdIoT: Action 後面的題目。很遺憾的,我當時卡在上一題,所以就沒辦法前進了。
這是三條系列題中的第二題,主要是 Binary 跟需要一點對 FTP 協定的瞭解。
題目的註解中會提到,有一臺 IP cam 會把影像傳到目標 FTP 機器上,每秒三張照片。也提示了 Flag 會存在照片中。
(另外出題者也請大家不要打 IP Cam。這可以預期到....)
我們在一開始會拿到一個 IP:Port 和一個 FTP binary。如果拆了 Binary,可以發現:
PASV
IP
。這可以控制 PASV
時返回的 IP。這指令只有在你是 127.0.0.1
時可下。IP
指令和參數之間可以不用空白,且它在解析 IP 位置時,會忽略 IP 後面的垃圾 (1.1.1.1xxxx
-> 1.1.1.1
)GET
HEAD
POST
PUT
(基本上每個 HTTP Method 都不行) 時,會把連線關掉\r\n
來作斷行,用 null byte 也行FTP 其實有分成 Active Mode 和 Passive Mode。在預設的 Active Mode 之下,客戶端會用隨機 Port 接上伺服器 Port 21,伺服器會用 Port 20 接上客戶端的另一隨機 Port。(FTP 協定需要兩個 Port,分別是用作下命令和傳輸資料)
但假設客戶端有防火牆,因為通常這隨機 Port 都不是剛好防火牆有開放的,就有可能會連不上了。故 FTP 有一 Passive Mode,可以讓客戶端在兩個連線都作為主動發起的一端,這樣就可以輕易穿過客戶端的防火牆。
在連線建立時,客戶端立刻下 PASV
的話,伺服器會回覆:
227 Entering passive mode (ip,ip,ip,ip,port1,port2)
此時客戶端就可以知道傳輸時要連上伺服器的哪一個 Port 了。
這裏有兩種可能的方式。
因為 IP
只有在解析成 127.0.0.1
時可用,且我們不可用一般的 HTTP 請求來觸裏(因為偵查的第四點)。但我們可以用 HTTPS 。
HTTPS 的第一個封包是 Client Hello。我們可以用 SNI
,把一些 FTP 指令偷渡到 HTTPS 請求中。這部分可以參考 Orange Tsai 的 Blackhat 2017 講稿。
由於 SNI 欄位之前會是一個 00
,故在 SNI 開始前,伺服器會覺得這是一行新指令。故後面塞了 IP192.168.1.1
時,會被解析成政長指令。此時 IP cam 即會試著對你指定的 IP 建 FTP 的第二條連線。
因為該 Binary 一行指令中最多只能下 8095 字,超過會被斷行 (視為第二條指令),故可以在 ftp://
連線時,下超級長帳號,後面接 IP(你的ip)
。
PlaidCTF 2018: I Heard You Like IoT — Down to the Wire
ctf_writeup/20180505-plaidctf at master · balsn/ctf_writeup · GitHub
Payload 資訊
A New Era of SSRF - Exploiting URL Parser in Trending Programming Languages!