1. 程式人生 > 其它 >SEED Labs – Shellshock Attack Lab

SEED Labs – Shellshock Attack Lab

技術標籤:軟體安全SEED Labs安全linux

Task 1: Experimenting with Bash Function

Ubuntu 16.04中的Bash程式已被修補,因此它不再容易受到Shellshock的攻擊。為了本實驗的目的,我們在/bin資料夾中安裝了易受攻擊的Bash版本。它的名字叫bash_shellshock。 我們需要在任務中使用此Bash。 請執行此易受攻擊的版本的Bash,如下所示,然後設計一個實驗來驗證該Bash是否易受攻擊Shellshock攻擊與否。

$ /bin/bash_shellshock

在補丁版本的bash(/bin/bash)上嘗試相同的實驗,並報告您的觀察結果。

實驗步驟如下:
1,設計一個實驗。定義一個包含特殊內容的shell變數foo。用一個看上去是函式定義的字串作為變數foo的值,並且在結尾的大括號後面新增一個額外的命令(echo)(左大括號前後都需要有一個空格)。在補丁版本的bash(/bin/bash)上嘗試,對於當前程序來說,這些圓括號、大括號沒有任何特別的含義,它們僅僅是一個變數的內容,就如同內容中的其他字元一樣。 這也是用declare命令列出所有函式定義時顯示為空的原因。因為foo只是一個變數,不是函式。

2,用export 命令標記該shell變數,這樣它會作為環境變數傳給子程序。此時執行有漏洞版本的bash,當一個子Bash程序被建立時,子shell將會解析該環境變數,把它轉化為子函式定義。在解析的過程中,由於Shellshock漏洞,Bash將執行大括號後面的額外命令。因此,當有漏洞版本的Bash在子程序中執行後,一個“ extra”字串被打印出來。

3,在補丁版本的bash(/bin/bash)上執行結果如下:

額外的命令不會被打印出來。
總結:父程序可以通過環境變數向子shell程序傳遞函式定義。當子程序中的Bash將環境變數轉換成函式時,Bash應當將變數中的指令解析出來,而不是執行它們。但是由於解析邏輯中的漏洞,Bash可能會執行變數中包含的一些指令。
實驗說明有漏洞版本的Bash易受攻擊Shellshock攻擊。

Task 2: Setting up CGI programs

在本實驗中,我們將在遠端Web伺服器上發起Shellshock攻擊。 許多網路伺服器啟用CGI,這是用於在網頁和Web應用程式上生成動態內容的標準方法。許多CGI程式是使用Shell指令碼編寫的。因此,在執行CGI程式之前,需要一個Shell程式將首先呼叫,然後由使用者從遠端計算機觸發這樣的呼叫。 如果外殼該程式是一個易受攻擊的Bash程式,我們可以利用Shellshock易受攻擊的程式來獲取特權伺服器。

在此任務中,我們將建立一個非常簡單的CGI程式(稱為myprog.cgi),如下所示。 它只需使用shell指令碼打印出“ Hello World”。

請確保在第➀行中使用/bin/bash shellshock,而不要使用/bin/bash。的行指定應呼叫哪個外殼程式來執行指令碼。我們確實需要利用弱勢群體在本實驗中重擊。請將上面的CGI程式放在/usr/lib/cgi-bin目錄中並設定其755的許可權(因此它是可執行的)。 您需要使用root特權來執行這些操作,因為該資料夾僅root可寫。該資料夾是Apache Web伺服器的預設CGI目錄。要從Web訪問此CGI程式,可以使用瀏覽器通過鍵入以下URL:http://localhost/cgi-bin/myprog.cgi,或使用以下命令列程式curl做同樣的事情:

$ curl http://localhost/cgi-bin/myprog.cgi

在我們的設定中,我們從同一臺計算機上執行Web伺服器和攻擊,這就是為什麼我們使用本地主機在實際攻擊中,伺服器執行在遠端計算機上,而不是使用localhost,我們使用伺服器的主機名或IP地址。
實驗步驟如下:
1,建立一個CGI程式,命名為myprog.cgi內容如下:把這個程式建立在/usr/lib/cgi-bin這個路徑下,並且設定許可權為755,這樣它就是可執行的。這些操作需要使用root許可權(用sudo)來完成,因為只有root使用者可以修改目錄中的檔案。


把這個程式設定許可權為755:

2,從Web訪問此CGI程式,可以使用瀏覽器通過鍵入以下URL:http://localhost/cgi-bin/myprog.cgi,或使用以下命令列程式curl做同樣的事情:

$ curl http://localhost/cgi-bin/myprog.cgi

我們從同一臺計算機上執行Web伺服器和攻擊。

我們使用curl程式來從攻擊者的機器上訪問該cgi程式,curl程式用來發送http請求到伺服器端的cgi程式。如結果所示,我們利用shellshock漏洞成功從攻擊者的機器上訪問了伺服器中的cgi程式。

Task 3: Passing Data to Bash via Environment Variable

要在基於Bash的CGI程式中利用Shellshock漏洞,攻擊者需要將其資料傳遞給易受攻擊的Bash程式,並且資料需要通過環境變數進行傳遞。 在這項任務中,我們需要看看我們如何實現這個目標。 您可以使用以下CGI程式來證明您可以傳送任意字串到CGI程式,該字串將顯示在環境變數。

在上面的程式碼中,第①行打印出當前程序中所有環境變數的內容。如果實驗成功,您應該可以在從中返回的頁面中看到資料字串伺服器。 在您的報告中,請說明遠端使用者的資料如何進入這些環境變數。
實驗步驟如下:

1,利用root許可權修改檔案myprog.cgi(只有root許可權下才能修改這個資料夾的內容)。將下面的內容放在程式中,最後一行的指令
“string/proc/$$/environ”能打印出一個程序的所有環境變數。



2,現在通過curl來訪問該CGI程式,使用“-v”選項,curl會打印出HTTP請求和來自伺服器的響應:

上面標記的HTTP請求頭中的User -Agent欄位中,該欄位的目的是向伺服器提供一些客戶端瀏覽器的資訊、它可以幫助伺服器根據不同瀏覽器型別對網頁內容的顯示方式進行優化。從上面的例子中可以看出,該欄位表明客戶端是curl。如果通過Firefox瀏覽器訪問同樣的URL,該欄位會包含一個不同的值,說明客戶端是Firefox.顯然,該欄位是由客戶端設定的。
在Web伺服器的響應中,CGI 程式將打印出CGI程序的所有環境變數。其中一個環境變數是HTTP_USER_AGENT,它的值和User-Agent欄位一模一樣。可知伺服器從HTTP請求頭中獲得User-Agent資訊,並將它賦值給一個名為HTTP_USER_AGENT的環境變數。
因此可以知道遠端使用者的資料如何進入這些環境變數:當伺服器建立一個子程序執行Bash(使用exec()函式)時,它會為Bash程序提供環境變數。父程序(網路服務程序)將USER_AGENT環境變數傳遞給子程序(bash程序)。shellshock將該環境變數轉化為自己的shell變數,而如果發現一個以一對圓括號開始的環境變數時,將其轉化為shell函式。伺服器建立一個子程序執行CGI程式時,它會傳遞該變數以及其他一些環境變數給CGI程式。

Task 4: Launching the Shellshock Attack

設定完上述CGI程式之後,我們現在可以啟動Shellshock攻擊。 攻擊不取決於CGI程式中的內容,因為它針對的是Bash程式,該程式在CGI之前先被呼叫指令碼已執行。 您的目標是通過URL http://localhost/cgi-bin/發起攻擊myprog.cgi,這樣您就可以實現遠端使用者無法完成的任務。 在此任務中,您應證明以下內容:
① 使用Shellshock攻擊從伺服器竊取機密檔案的內容。
1,例如可以從下面這個檔案獲得密碼:/var/www/CSRF/Elgg/elgg- config/settings.php。一旦獲得了密碼,就可以直接登入資料庫,盜取或者改動資訊。使用命令列工具curl,該命令的“-A”的選項可以用來設定請求的User-Agent欄位。下面的命令演示瞭如何通過Shllshock攻擊讀取伺服器的機密檔案。


當一個Web應用連線後臺資料庫(例如MySQL)時,它需要提供登入密碼,這些密碼通常是直接寫在程式中的,或者儲存在配置檔案中,遠端使用者無法讀取這些密碼,但是如果讓伺服器執行指令,就可以獲得這些密碼。Ubuntu虛擬機器中的Web伺服器運行了幾個Web應用,它們中的大多數都是使用資料庫的。
2,或者在伺服器上建立一個檔案1.txt。輸入一些資訊作為機密資訊,並檢視檔案路徑

攻擊者使用命令列工具curl,該命令的“-A”的選項可以用來設定請求的User-Agent欄位。可以看到,攻擊者的命令列顯示了伺服器檔案中的機密資訊:

② 回答以下問題:您將能夠竊取影子檔案/etc/shadow的內容嗎?為什麼或者為什麼不?

盜取影子檔案失敗,因為沒有許可權。使用ls命令檢視檔案許可權:

Shadow的所有者是root,有rw的許可權;所在組是shadow,組內使用者有r的許可權;其他組使用者無許可權讀這個檔案。
myprog.cgi的所有者是root,有rwx的許可權;所在組是root,有rx許可權。
所以通過myprog.cgi獲得bash_shellshock之後,執行指令。對於shadow來說,myprog.cgi是其他組內使用者,沒有讀的許可權,所以不可以通過myprog.cgi執行程式獲得shadow的內容。

Task 5: Getting a Reverse Shell via Shellshock Attack

Shellshock漏洞使攻擊者可以在目標計算機上執行任意命令。在實際攻擊中攻擊者經常選擇執行shell命令,而不是在攻擊中對命令進行硬編碼,因此只要shell程式仍然存在,就可以使用此shell執行其他命令。為了實現這個目標,攻擊者需要執行反向Shell。
反向shell是在機器上啟動的shell程序,其輸入和輸出由來自遠端計算機的人。基本上,shell在受害者的機器上執行,但是需要輸入從攻擊者的計算機上輸出,並將其輸出列印在攻擊者的計算機上。反殼給攻擊者在受感染機器上執行命令的便捷方法。有關如何建立的詳細說明可以在SEED書的第3章(第3.4.5節)中找到反向外殼。我們還將總結說明稍後的指南部分。
在此任務中,您需要演示如何通過Shellshock中的漏洞啟動反向Shell。一個CGI程式。請說明您的操作方式。在您的報告中,還請說明您如何設定反向shell,以及它為什麼起作用。基本上,您需要使用自己的文字來解釋反向shell如何在您的Shellshock攻擊。
實驗步驟如下:
1,先輸入ifconfig命令得到伺服器和攻擊者機器的IP地址,如下:


可知:
伺服器IP為:10.0.2.04;
攻擊者IP為:10.0.2.15

2,在攻擊者端,使用nc來監聽9090埠上的TCP連線。

nc命令會阻塞並等待連線。攻擊者先執行:“nc -lv 9090”,命令啟動TCP伺服器,然後在攻擊者另一個終端上執行下面的命令向目標伺服器的CGI程式傳送惡意請求。

得到以下結果:

從結果來看,一旦curl指令被執行,攻擊指令也會在伺服器上被執行,這將導致CGI程式觸發一個Bash shell. 該Bash shell會連線到10.0.2.15(攻擊者)的9090埠(攻擊者的機器)。攻擊者的nc程式會接受這個連線,並顯示由遠端伺服器的CGI觸發的Bash程式送來的shell 提示符,這表明反向shell成功了。可以從id命令的執行結果來確認這一點, 它打印出來的遠端CGI程序的使用者ID是www-data.

Task 6: Using the Patched Bash

現在,讓我們使用一個已修補的Bash程式。 程式/ bin / bash已修補版。 請用此程式替換CGI程式的第一行。 重做任務3和5,以及描述您的觀察結果。
先用/ bin / bash已修補版程式替換CGI程式的第一行,如下:

按照上述步驟重做task3和task5即可,在此不詳細說明。
結果:換了/bin/bash後重做任務3和5,可以列印環境變數,但不能建立反向shell