本文作者:i春秋签约作家——凉风
首先感谢@我是salf 给我的灵感
我之前发了一个帖子:过了D盾扫描的一句话木马。
里面分析了一句话木马的原理,以及过狗、D盾的木马的编写。
传送门:
https://bbs.ichunqiu.com/thread-25644-1-1.html
tips:下文需要知道一句话木马的原理,可看上面说的帖子
tips2:还是在这里简单的说一下吧,例如木马 assert($_POST[XYZ]),会把用户post的 XYZ=asdfasdf中的asdfasdf作为php代码执行,这是assert这个函数的特性,eval同理。
也许有人用了我的马儿还是被狗拦了,是因为你们的刀子不是过狗刀。
菜刀的官网在去年更新了最新的刀子,可以过狗的刀子。(附件)
为什么能过狗?原理是什么?
之前我们分析了一句话木马的原理,今天我们就来分析一下菜刀的工作原理以及过狗原理吧。
新版菜刀多了一个叫做caidao.conf的配置文件,自带过狗配置,看图
红框中的配置就是这次文章的重点,也是过狗的重点所在(只讨论php)
单单看配置可能看不明白,我们用fidder抓包看看,拿过狗菜刀和旧版菜刀做一个对比
看看究竟有什么区别,为何能过狗。
旧版菜刀:
旧版post了两个参数,但是被安全狗拦截。
新版菜刀:
post了一个参数,绕过了安全狗,并且返回了正常的数据
我们来对比一下post的数据
好长,可以看到有大部分都是base64编码,我们通过仔细观察,或者是拿去解密,就能知道这是菜刀需要执行的命令。
为了方便看,我做个简单的处理,去掉命令,把里面的url编码还原成字符
可以看出
旧版几乎没有经过处理,语句的作用是:执行经过base64解密后的命令(这里看不懂的一定要看的之前发的帖子,或者文章开头的tips)
新版和旧版语句的最终的作用是一样的,也是执行经过base64解密后的命令,但是新版做了过狗处理,安全狗已经不认识这段代码了(不懂叫什么就叫代码吧。。)
(新版的语句一堆反斜杠,是转义,因为代码用了双引号嵌套,双引号里的双引号需要进行转义不然语法错误,大家自行忽略转义符就能看明白了)
我们看看能不能自己写一个过狗的配置,学以致用嘛。
大家如果是像我一样的菜比的话,就先备份好配置文件,以防不备
打开配置文件,看看配置文件正确改法的格式要求、注意事项什么的。
看图:
现在我们能看明白:红框中的是我们post的数据中,“密码”= xxxxx中 的 xxxxx
而xxxxx就是服务器一句话木马执行的代码
可以看到,菜刀执行命令(圆圈中的%s)用到的函数是菜刀自己构造的assert与eval变形木马,(即红框中代码)为方便理解,这个菜刀自己构造的木马可以称之为“木马函数”,我们传到服务器的一句话木马在这里只是用来执行菜刀传递的这一个“木马函数”,而菜刀传递的其他关键的命令(圆圈中的%s),都由这个“木马函数”来执行。就像是:老板命令经理,经理命令员工
—> 老板通过经理来命令员工。
这么设计是有道理的:
1.
没有人知道一句话木马的形式是怎么样的,变形的一句话木马有好多种,除了assert和eval以外仍有其他函数可以成为一句话木马,有些不能支持多语句执行,使用“木马函数”这个方法大大增加了兼容性,因为服务器的一句话木马只需要执行这个“木马函数”就可以了。
2. 这样子,可以在用户操作菜刀时,所有命令集合在一起给“木马函数”一起执行,不用频繁的向服务器进行多次请求,一个命令一个命令的执行会很慢滴。(请求过于频繁会不会被封ip?)
(好了红字终于结束了,感觉红色好难看,但是表重点还好吧。)
图中红框就是我们需要修改,替换的地方,我们换成自己的配置。经过分析fidder拦截的数据包,我们要执行的命令是base64编码的命令,这个加密的命令就是作为“木马函数”的参数,在配置文件里用%s表示,我们试着改改,先试着修改成较为简单的,易于理解的又能过狗的配置。
看图:
很短的一句话,直接 (看图,这里被和谐) 就可以过狗,%s就是菜刀传进去的base64加密命令。
至于菜刀的命令为什么是base64加密,更高级的玩法,本文暂时不讨论,大家可以看自带的readme.txt
本文就这么结束么?这怎么对得起我的标题!我可不是标题党!(才怪)(其实对标题起名不是很满意)
注意,其实以下才是本文的重点,本菜比摸爬滚打走了许多弯路才研究出来的,连菜刀原作者都不曾想到的问题(我脸皮厚hhh)
看了过狗菜刀原本的配置,当我看到了一堆反斜杠,我就想到了gpc魔术引号,如果开启了,那么这个菜刀岂不是废了???
经过测试,新版菜刀废了。。。好吧,果然跟我想的一样。
在这里感谢秦国的 青鸟 @我是salf 他给我灵感,我才想到要弄一个过gpc的配置,不然这篇文章就结束了(本菜比也不会走那么多弯路,不会废了一整天头痛这个。。这篇文章至少提前2天出来)(我终究还是太菜了)
想绕过gpc,那就不能有引号了,旧版菜刀没有用引号(估计是想到有gpc)。
我们不仅要考虑到引号的问题,还要考虑安全狗,这对本菜比来说难度还是好大的。
既然我菜,为什么我要做这个??
因为我查过 ,过狗菜刀绕gpc配置,也许是打开的方式不对,没有查到资料,网上没有哇
既然这样我就能拿来装逼了hhh(。。。)
(不要告诉我网上有,我会很失望的,)
不知不觉又尬聊了,
本php菜比的弯路总结:
1.eval函数可以执行 echo 、if 等,分号结尾必不可少。
2.assert函数内不能有echo,不能有if,
3.安全狗拦截机制:eval后不能跟$_POST,也不能加base64_decode,assert相比eval拦截的要松,
4.assert(0|| xxx) 这个代码||后面的会被执行,换成&&后,符号两边都会执行,就是逻辑运算符,不多介绍。
5.assert可以接着base64解密,然后执行解密后的命令
6.base64_decode()括号里如果是字符串常量必须带引号,括号内可以放不带引号的变量
配置文件开头提到了分隔符,我们看看分隔符
右边的图是菜刀接收的原本的数据,用的是配置文件中设置的分隔符来隔开,如果有很多命令的话会更直观。菜刀处理了这个不友好的回显数据,将数据转换成我们看到的友好界面。
base64解密我们菜刀的加密部分的命令(%s的地方),可以看到 分隔符是用 echo(”")这样的形式输出的,所以不能用assert了,我们选用eval执行菜刀的命令,可是eval会被拦截。。
思路:前面总结5说了assert可以执行base64解密的内容,我们就把eval命令加密,用decode解密后再给assert执行。base64_decode通过$_post[]赋值,加密后的eval也通过post变量赋值
如图:
这样我们需要改的配置就写好了,赶快试试看。。
成功了成功了,感觉这样表达有点蠢,但是意思就是成功了,累坏我了,好激动
我这个php菜比走了那么多弯路终于弄出了有用的东西。
为了过gpc想了很多条思路,但是那些路都因为各种各样的报错断了,本菜比不知道什么原因,就不贴出来误导大家了。
ps:刚刚发帖被拦截了,好在我备份了,不过要重新放图。。
ps:我得意的太早了,拦截x3
ps:听丞相的话,换成全角就ok了,谢谢丞相大人
大家多交流吧~不懂可以问我哦
附上原版过狗刀,刚出的时候拿到的。后缀是7z,因为不给上传我就改成rar
密码是我拿到的时候就自带的 密码:www.maicaidao.com