注:查看全文請關注作者,或點擊前往:Shellshock Lab
Shellshock
1 Overview-概述
- 2014 年 9 月 24 日,發現了 bash 中的一個嚴重漏洞, 該漏洞綽號為 Shellshock,可以利用許多系統并從遠程或從本地計算機啟動, 在本實驗中,學生需要研究此攻擊,以便了解 Shellshock 漏洞, 本實驗的學習目標是讓學生親身體驗這次有趣的攻擊,了解它是如何作業的,并思考我們可以從這次攻擊中吸取的教訓, 本實驗涵蓋以下主題:
- Shellshock
- 環境變數
- bash 中的函式定義
- Apache 和 CGI 程式
Lab environment-實驗環境
- 該實驗已在我們預先構建的 Ubuntu 20.04 VM 上進行了測驗,該 VM 可從 SEED 網站下載, 由于我們使用容器來設定實驗室環境,因此本實驗不太依賴 SEED VM, 可以使用其他 VM、物理機或云上的 VM 來完成此實驗,
2 Environment Setup-環境設定
2.1 DNS Setting-DNS設定
? 在我們的設定中,Web 服務器容器的 IP 地址是 10.9.0.80, 服務器的主機名稱為 www.seedlab-shellshock.com, 我們需要將此名稱映射到 IP 地址, 請將以下內容添加到 /etc/hosts 中, 你需要使用root權限來修改這個檔案:
10.9.0.80 www.seedlab-shellshock.com

2.2 Container Setup and Commands-容器設定和命令
? 請從實驗室網站下載 Labsetup.zip 檔案到您的虛擬機,解壓,進入 Labsetup 檔案夾,使用 docker-compose.yml 檔案設定實驗室環境, 該檔案內容的詳細說明以及所有涉及的Dockerfile可以從用戶手冊中找到,該手冊鏈接到本實驗室的網站, 如果這是您第一次使用容器設定 SEED 實驗室環境,閱讀用戶手冊非常重要,
? 下面我們列出一些與 Docker 和 Compose 相關的常用命令, 由于我們將非常頻繁地使用這些命令,因此我們在 .bashrc 檔案(在我們提供的 SEEDUbuntu 20.04 VM 中)為它們創建了別名,
$ docker-compose build # Build the container image
$ docker-compose up # Start the container
$ docker-compose down # Shut down the container
// Aliases for the Compose commands above
$ dcbuild # Alias for: docker-compose build
$ dcup # Alias for: docker-compose up
$ dcdown # Alias for: docker-compose down
? 所有容器都將在后臺運行, 要在容器上運行命令,我們通常需要在該容器上獲得一個 shell, 我們首先需要使用“docker ps”命令找出容器的ID,然后使用“docker exec”在該容器上啟動一個shell, 我們在 .bashrc 檔案中為它們創建了別名,
$ dockps // Alias for: docker ps --format "{{.ID}} {{.Names}}"
$ docksh <id> // Alias for: docker exec -it <id> /bin/bash
// The following example shows how to get a shell inside hostC
$ dockps
b1004832e275 hostA-10.9.0.5
0af4ea7a3e2e hostB-10.9.0.6
9652715c8e0a hostC-10.9.0.7
$ docksh 96
root@9652715c8e0a:/#
// Note: If a docker command requires a container ID, you do not need to
// type the entire ID string. Typing the first few characters will
// be sufficient, as long as they are unique among all the containers.
實驗記錄:

2.3 Web Server and CGI-Web 服務器和 CGI
? 在本實驗中,我們將對 Web 服務器容器發起 Shellshock 攻擊, 許多 Web 服務器啟用 CGI,這是一種用于在網頁和 Web 應用程式上生成動態內容的標準方法, 很多CGI程式都是shell腳本,所以在實際的CGI程式運行之前,會先呼叫一個shell程式,這樣的呼叫是由遠程計算機的用戶觸發的, 如果shell程式是一個易受攻擊的bash程式,我們可以利用易受攻擊的Shellshock獲取服務器權限,
? 在我們的 Web 服務器容器中,我們已經設定了一個非常簡單的 CGI 程式(稱為 vul.cgi), 它使用 shell 腳本簡單地列印出“Hello World”, CGI 程式放在 Apache 的默認 CGI 檔案夾 /usr/lib/cgi-bin 中,它必須是可執行的,
-
Listing 1: vul.cgi
#!/bin/bash shellshock echo "Content-type: text/plain" echo echo echo "Hello World"CGI 程式使用 /bin/bash shellshock(第一行),而不是使用 /bin/bash, 此行指定應呼叫哪個 shell 程式來運行腳本, 我們確實需要在本實驗中使用易受攻擊的 bash,
要從 Web 訪問 CGI 程式,我們可以使用瀏覽器輸入以下 URL:http://www.seedlab-shellshock.com/cgi-bin/vul.cgi,或者使用以下命令列程式 curl 做同樣的事, 請確保 Web 服務器容器正在運行,
$ curl http://www.seedlab-shellshock.com/cgi-bin/vul.cgi
3 Lab Tasks-實驗任務
3.1 Task 1: Experimenting with Bash Function-試驗Bash函式
? Ubuntu 20.04 中的 bash 程式已經打過補丁,所以它不再容易受到 Shellshock 攻擊, 出于本實驗的目的,我們在容器內(/bin 內)安裝了一個易受攻擊的 bash 版本, 該程式也可以在 Labsetup 檔案夾中找到(內部影像 www), 它的名字是 bash_shellshock, 我們需要在我們的任務中使用這個 bash, 您可以在容器中或直接在您的計算機上運行此 shell 程式,
? 請設計一個實驗來驗證這個 bash 是否容易受到 Shellshock 攻擊,對補丁版本 /bin/bash 進行相同的實驗并報告您的觀察結果,
實驗記錄

- 這里我在容器中運行有漏洞bash版本:bash_shellshock,可以發現
extra被輸出,即額外的命令被執行了,echo用于顯示變數,declare -f用于顯示函式,可見bash_shellshock將分號前的部分決議為函式定義,執行了分號后的shell命令,

- 運行補丁版本的bash,不會輸出
extra,
3.2 Task 2: Passing Data to Bash via Environment Variable-通過環境變數將資料傳遞給 Bash
? 為了利用基于 bash 的 CGI 程式中的 Shellshock 漏洞,攻擊者需要將他們的資料傳遞給易受攻擊的 bash 程式,并且需要通過環境變數傳遞資料, 在這項任務中,我們需要了解如何實作這一目標, 我們在服務器上提供了另一個 CGI 程式 (getenv.cgi) 來幫助您識別哪些用戶資料可以進入 CGI 程式的環境變數, 這個 CGI 程式列印出它所有的環境變數,
-
Listing 2: getenv.cgi
#!/bin/bash_shellshock echo "Content-type: text/plain" echo echo "****** Environment Variables ******" strings /proc/$$/environ ①
Task 2.A: Using brower-使用瀏覽器
? 在上面的代碼中,行 ①列印出當前行程中所有環境變數的內容, 通常,如果您使用瀏覽器訪問 CGI 程式,您會看到類似以下內容, 請確定瀏覽器設定了哪些環境變數的值, 您可以在瀏覽器上打開 HTTP Header Live 擴展來捕獲 HTTP 請求,并將請求與服務器列印的環境變數進行比較, 請在實驗報告中包括您的調查結果,
****** Environment Variables ******
HTTP_HOST=www.seedlab-shellshock.com
HTTP_USER_AGENT=Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:83.0) ...
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9, ...
HTTP_ACCEPT_LANGUAGE=en-US,en;q=0.5
HTTP_ACCEPT_ENCODING=gzip, deflate
...
實驗記錄


- 結論:HTTP 請求的Host、User-Agent等資訊會變為環境變數,
Task 2.A: Using curl-使用curl
- 注:本任務可以在本機終端運行,而下列操作是在容器中自娛自樂,
? 如果我們想將環境變數資料設定為任意值,我們將不得不修改瀏覽器的行為,那太復雜了, 幸運的是,有一個名為 curl 的命令列工具,它允許用戶控制 HTTP 請求中的大部分欄位, 以下是一些有用的選項: (1) -v 欄位可以列印出 HTTP 請求的標頭; (2) -A, -e, -H 選項可以設定header請求中的一些欄位,你需要弄清楚它們分別設定了哪些欄位, 請在實驗室報告中包括您的發現, 以下是有關如何使用這些欄位的示例:
$ curl -v www.seedlab-shellshock.com/cgi-bin/getenv.cgi
$ curl -A "my data" -v www.seedlab-shellshock.com/cgi-bin/getenv.cgi
$ curl -e "my data" -v www.seedlab-shellshock.com/cgi-bin/getenv.cgi
$ curl -H "AAAAAA: BBBBBB" -v www.seedlab-shellshock.com/cgi-bin/getenv.cgi
根據這個實驗,請描述一下curl的哪些選項可以用來將資料注入到目標CGI程式的環境變數中,
實驗記錄




- -A:設定用戶代理(User-Agent);
- -e:設定 HTTP 的標頭Referer,表示請求的來源;
- -H:添加自定義的 HTTP 請求頭,
3.3 Task 3: Launching the Shellshock Attack-發起 Shellshock 攻擊
? 我們現在可以發起 Shellshock 攻擊, 攻擊不依賴于 CGI 程式中的內容,因為它針對的是 bash 程式,該程式在執行實際 CGI 腳本之前被呼叫, 你的作業是通過 URL http://www.seedlab-shellshock.com/cgi-bin/vul.cgi 發起攻擊,這樣你就可以讓服務器運行任意命令,
? 如果您的命令有純文本輸出,并且您希望輸出回傳給您,則您的輸出需要遵循一個協議:它應該以 Content type: text/plain 開頭,后跟一個空行,然后您可以放置您的 純文本輸出, 例如,如果您希望服務器回傳其檔案夾中的檔案串列,您的命令將如下所示:
echo Content_type: text/plain; echo; /bin/ls -l
Task 3.A:
-
Get the server to send back the content of the /etc/passwd file.
-
讓服務器發回 /etc/passwd 檔案的內容,
-
這里使用 -A

Task 3.B:
-
Get the server to tell you its process’ user ID. You can use the /bin/id command to print out the ID information.
-
讓服務器告訴你它的行程的用戶 ID, 您可以使用 /bin/id 命令列印出 ID 資訊,
-
這里使用 -e

Task 3.C:
-
Get the server to create a file inside the /tmp folder. You need to get into the container to see whether the file is created or not, or use another Shellshock attack to list the /tmp folder.
-
讓服務器在 /tmp 檔案夾中創建一個檔案, 需要進入容器查看檔案是否創建,或者使用另一個Shellshock攻擊列出/tmp檔案夾,
-
這里使用 -H

- 圖例中,創建的檔案為file,
Task 3.D
-
Get the server to delete the file that you just created inside the /tmp folder.
-
讓服務器洗掉您剛剛在 /tmp 檔案夾中創建的檔案,

Questions-問題
-
問題 1:你能從服務器竊取影子檔案 /etc/shadow 的內容嗎?為什么或者為什么不? 在Task 3.B 中獲得的資訊應該會給你一個線索,
- 答:不能,因為打開/etc/shadow需要root權限,從Task 3.B中我們可以知道當前用戶id為33,并非root,
-
問題 2:HTTP GET 請求通常在 URL 中附加資料,在 ? 標記后, 這可能是我們可以用來發起攻擊的另一種方法, 在下面的例子中,我們在URL中附加了一些資料,我們發現這些資料是用來設定如下環境變數的:
$ curl "http://www.seedlab-shellshock.com/cgi-bin/getenv.cgi?AAAAA" ... UERY_STRING=AAAAA ...我們可以使用這種方法來發起 Shellshock 攻擊嗎? 請進行您的實驗并根據您的實驗結果得出您的結論,
-
不能,因為空格在URL中需要被轉義,而函式定義的左大括號前后都需要有一個空格,否則整個字串無法被決議,

-
3.4 Task 4: Getting a Reverse Shell via Shellshock Attack-通過 Shellshock 攻擊獲取反向 Shell
? Shellshock 漏洞允許攻擊者在目標機器上運行任意命令, 在真正的攻擊中,攻擊者通常選擇運行一個 shell 命令,而不是對攻擊中的命令進行硬編碼,因此他們可以使用這個 shell 運行其他命令,只要 shell 程式還活著, 為了實作這一目標,攻擊者需要運行一個反向 shell,
? 反向 shell 是在機器上啟動的 shell 行程,其輸入和輸出由遠程計算機的某個人控制, 基本上,shell 在受害者的機器上運行,但它從攻擊者的機器上獲取輸入,并將其輸出列印在攻擊者的機器上, 反向 shell 為攻擊者提供了一種在受感染機器上運行命令的便捷方式, 可以在 SEED 書中找到有關如何創建反向 shell 的詳細說明, 在此任務中,您需要演示如何使用 Shellshock 攻擊從受害者那里獲取反向 shell,
實驗記錄
-
打開攻擊者的9090埠進行監聽,

-
查看攻擊者TCP服務器的ip地址:10.9.0.1,

-
實行shellshock攻擊

-
成功創建反向shell

3.5 Task 5: Using the Patched Bash-任務 5:使用修補的 Bash
? 現在,讓我們使用一個已經打過補丁的 bash 程式, 程式 /bin/bash 是一個補丁版本, 請用這個程式替換 CGI 程式的第一行, 重做任務 3 并描述您的觀察結果,
實驗記錄
- image_www下新建vul1.cgi,名稱加入Dockerfile,重新搭建容器,


-
重新執行Task3中的命令,發現輸出Hello World,

-
故無法攻擊修復后的bash
補丁版本, 請用這個程式替換 CGI 程式的第一行, 重做任務 3 并描述您的觀察結果,
實驗記錄
- image_www下新建vul1.cgi,名稱加入Dockerfile,重新搭建容器,


- 重新執行Task3中的命令,發現輸出Hello World,

- 故無法攻擊修復后的bash
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/374565.html
標籤:其他
上一篇:網路安全學習--PKI
