疑犯追蹤劇照,主角 Finch 與 Reese 於城市街頭

疑犯追蹤劇照,圖片來源:primevideo.com

嗨,大家好,我是 ISDA 的 Walter,趁著最近有空把很久之前發現的美劇資安部分寫一下,因新冠肺炎 (COVID-19) 的疫情關係上半年協會活動較少,但之後應該會漸漸開設課程,再請大家多多關注,本人才疏學淺文章中如有錯誤之處還請不吝指教

疑犯追蹤這部影集

疑犯追蹤 (Person of Interest) 是一部 2011 開始播放的美劇,由非常有名的諾蘭兄弟中的弟弟 Jonathan Nolan 的創作之一,故事是從電腦天才 Harold Finch 與身手不凡的前 CIA 探員 John Reese 開始,Harold 創造出超強的人工智慧 The Machine 與運用國家級的資源監看所有人預測兇案聯手好身手的 John 加以預防,故事到了後半段更有其他有趣的角色加入,也加入了許多資訊工作者會懂的有趣彩蛋,是值得細細品味的一部好劇,我自己大概也從頭到尾看了三次了 XD

以下有雷請注意

======= 防雷分隔線 =======

提醒讀者後面有劇情雷的防雷插圖

要進入請小心的防雷圖。圖片來源:MMMMM_禾野男孩

======= 防雷分隔線 =======

劇中出現的 Shellshock 指令

而我們這次所要講的是在第 4 季第 11 集中的部分,他們遇到前所未有的強敵 — 另外一個人工智慧 Samaritan,Samaritan 想運用他的資源與技術造成美國股市的崩盤,Harold 他們為了不讓世界造成恐慌即全力阻止 Samaritan,但為了阻止 Samaritan 必須進交易所安裝反制的程式駭入系統,殊不知此為 Samaritan 的陷阱,就在他們被困住的時候 The Machine 運用他強力的模擬功能預測最可行的逃脫方案,其中一個模擬方案便是請懂電腦的 Finch 小組去解鎖電梯,較為不懂電腦技術的 Reese 小組去安裝程式,結果在 Reese 輸入駭客程式的畫面竟然出現了資安人應該都很熟悉的指令

1
env x='(){ :;}; echo vulnerable' bash-c

劇中 Reese 在終端機輸入 Shellshock PoC 指令的畫面

攻擊畫面與指令圖片來源:Person of Interest 劇中畫面

這段 PoC 有什麼問題

這個不就是 2014 年 9 月紅極一時 CVSSSv2 滿分 10 分的大漏洞 shellshock(CVE-2014–6271) 嗎?但是仔細一看,發現以下幾個問題:

雖然畫面上還沒輸入完,但怎麼在被好幾支槍指著的危急時刻還在輸入僅僅只是驗證是否存在漏洞實際上並無攻擊能力的 PoC(Proof of concept) 呢,此 PoC 在已經拿到可以下 bash 的情況下是沒有辦法有更深度的利用,頂多知道 bash 存在 shellshock 漏洞,Finch 是不是嫉妒 Reese 太帥想搞死他呀 (((゚Д゚;)))
看更仔細發現 bash-c 中間少個空白耶!這樣的 PoC 可能沒辦法正常運行,我們等一下做個測試看看

唐伯虎點秋香劇照,吐槽這道指令根本沒有攻擊力

來源:唐伯虎點秋香劇照

調侃指令少打一個空白就無法執行的網路梗圖

打錯會哭哭喔。圖片來源:imgflip.com

順便吐槽台劇的駭客畫面

個人猜測可能是劇組人員想加入真實的攻擊手法但尚未了解其原理,但跟台灣鄉土劇的駭客嘴上說防火牆很難入侵但實際上亂打指令與使用 PPT 還沒全螢幕播放已經好上幾百倍了 (拜託台灣連續劇快來找專業的資安人員當顧問呀~~),而且當疑犯追蹤第四季播出首集也才 2014 的 9 月,所以幾乎是公布弱點 PoC 沒多久就將其編入劇中,已經算是相當用心了

台灣連續劇裡演員在 Windows 命令提示字元亂打指令的畫面

windows cmd 亂輸入。圖片來源:台灣連續劇 - 天下女人心劇照

漏洞模擬與測試

接下來讓我們來實際測試 shellshock 弱點看看吧!在研究漏洞的時候光是建立存在漏洞環境就需要許多時間,幸好有 Vulhub 已經建立了一堆的 docker 漏洞環境與簡單的 Exploit 或 PoC,我們只需要安裝 docker 並且下載 vulhub 的檔案就可以很輕鬆隨意的建立與移除漏洞環境

Vulhub 網站頁面,收錄各種 docker 漏洞測試環境

超級方便的漏洞環境建立網站。圖片來源:Vulhub

漏洞模擬

我們首先使用 VMWare 先安裝一個 Ubuntu 之後依照他的文件或影片複製貼上語法就可以了

如果你的 Ubuntu 預設沒有 curl 與 git 等必要軟體就自己裝一個

1
2
3
4
# Install package curl, git
sudo apt install curl, git, net-tools -y
# Download vulhub docker
cd ~/Donwloads && sudo git clone https://github.com/vulhub/vulhub.git

接下來是官方的建議,我小量修改

1
2
3
4
5
6
7
8
9
10
# If you don't have a docker installed, you'll need to install docker  
curl -s https://get.docker.com/ | sh
# install docker-compose
sudo apt install docker-compose
# Entry vulnerability directory
cd ~/Downloads/vulhub/bash/shellshock
# Compile (optional)
docker-compose build
# Run
sudo docker-compose up -d

查看一下是否正常運作,並且查看開啟的 port,預設應該為 8080

1
2
3
ewater@ubuntu:~/Downloads/vulhub/bash/shellshock$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b17e8c30a67b vulhub/bash:4.3.0-with-httpd "apache2ctl -DFOREGR…" 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp shellshock_web_1

我們查看一下 vulhub.org 對於 shellshock 的漏洞說明,文件上說了會有兩個 cgi 程式,分別是 safe.cgi 與 victim.cgi,safe.cgi 是用安全版本的 bash,victim.cgi 是使用存在 shellshock 漏洞的 bash4.3

我們嘗試存取對應的 ip:port/path (請依照自己的環境修改),發現都是顯示 Hello world

瀏覽器開啟 victim.cgi 與 safe.cgi 皆回應 Hello world

存取對應路徑顯示 Hello world 代表環境已經正常執行

漏洞測試

再來我們就使用駭客神器 Burp Suite 攔截封包,有興趣的小夥伴可以下載免費的 Community 版本安裝,並且將 proxy 設定為 8080,攔截成功之後我們將封包傳送到 Burp Suite 的 repeater,將 User-Agent 的部分依照 vulhub 所描述的送到 victim.cgi

1
User-Agent: () { foo; }; echo Content-Type: text/plain; echo; /usr/bin/id

果然攻擊成功並且返回我們原本想要執行的 /usr/bin/id,顯示了 uid, gid 等資料

1
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Burp Suite 改寫 User-Agent 攻擊 victim.cgi,成功取得 id 輸出

利用 Burp Suite 攔截封包並修改後攻擊 shellshock 漏洞成功

再來嘗試相同的攻擊語法,僅將路徑改為 safe.cgi,果然攻擊失敗了

相同語法送往安全版 bash 的 safe.cgi,未執行注入指令

利用 Burp Suite 攔截封包並修改後攻擊 shellshock 漏洞失敗

回頭驗證劇中那道少一個空白的 PoC

接著我們來嘗試進入 docker 裡面跑影片中的 PoC,發現的確影片中的指令少個空格,系統告訴我們找不到 bash-c 這個檔案或資料夾,在 bash 與 -c 中加入空格之後就成功顯示 vulnerable 與 whoami 的結果了

容器內執行劇中 PoC,補上空白後印出 vulnerable 與 whoami

進入 docker 內測試 PoC 結果

我們嘗試以 Ubuntu 較新的 4.4.20 版本 bash 嘗試看看,發現尚未將 bash 與 -c 分開之前仍然是失敗,修改後也只能顯示 whoami 的結果,並未顯示 vulnerable,代表此弱點已經修補

已修補的 bash 4.4.20 執行同一 PoC 只回傳 whoami 結果

於無 shellshock 漏洞之環境測試 PoC 結果
假如已經測試完畢記得將 docker 先停止

1
2
# Stop shellshock docker 
sudo docker stop shellshock_web_1

終端機執行 docker stop 關閉 shellshock 測試容器

停止 shellshock 之 docker 環境

如果不想再測試 shellshock 也可以使用 rmrmi 指令將它移除

漏洞原理與修補建議

測試完畢後我們來理解一下原理,在 linux 的環境下可以用設定環境變數甚至 function,如下圖於 shell 中的 PoC,綠色部分就是正常使用環境變數,而 shellshock 就是針對 bash 對環境變數的解析上的污染,紅色部分就是攻擊者在環境變數中塞入惡意指令,而藍色部分是當使用 bash 的時候,此時就會將當初我們設定環境變數裡面的紅色部分惡意指令也執行

以綠紅藍三色標示環境變數遭污染並執行惡意指令的流程圖

shellshock 原理。圖片來源:OWASP

而從外面的攻擊就是因為伺服器會將 HTTP Header 中 (剛才例子中使用 User-Agent) 之內容透過 module 放入環境變數中,若伺服器程式呼叫到 bash,就會受到惡意語法的影響

此弱點為 2014 年 9 月的弱點,如果你有好好的在更新上 Patch 應該是不太需要擔心此問題,若是擔心可以參考 DEVCORE 的文章進行評估與修補

文章就先寫到這邊,如果小夥伴們對資安有興趣或者想分享電影或劇集也可以在 ISDA 的 LineTelegram 找到我,與我的小夥伴們一起學資安!

參考: