上一次的文章中是分析了 Windows
系统上 中国菜刀
的工作原理,于是突发奇想,便想着用Python3也写一个和菜刀功能一样的程序出来,其实可变的地方还是挺少的,考虑的点只有4个而已,内容中,尤其是正则匹配部分尤其辣眼睛,所以有意见可以提出来,然后我忽略掉就好了
为了方便测试,所以我是在本地的虚拟机搭建一个 apache+php
的环境然后在其根目录下放置一个 php一句话木马
首先我们要确定我们连接上木马文件,所需要什么东西
没有这两个就无法建立连接,所以开头的时候先把他安排上
url=str(input("木马url: "))
parameter=str(input("木马参数: "))
接着,开始写执行命令,和之前菜刀的原理一致,通过base64解码传入php语句,然后在其中传入执行语句
为了模拟终端的样子,所以先把获取路径的功能给写了
在php中, dirname()
可以用来获取该文件的目录
举个例子,如果文件路径为 /var/www/html/elapse.php
那么, dirname()
后得到的路径就是 /var/www/html/
,是该文件的当前目录
而 _SERVER['SCRIPT_FILENAME']全局预定义变量可以用来获取当前执行的php的完整路径,于是 dirname()配合 _SERVER['SCRIPT_FILENAME']就可以得到当前文件所在的目录,一开始连接时就cd过去
具体代码如下,因为这里用的也是base64解码的关系,所以会在代码中注释部分base64内容
def path(url,parameter,header):
# 下面的base64内容$dir=dirname($_SERVER['SCRIPT_FILENAME']); print $dir;
post_data="eval(base64_decode(\"JGRpcj1kaXJuYW1lKCRfU0VSVkVSWydTQ1JJUFRfRklMRU5BTUUnXSk7IHByaW50ICRkaXI7\"));" r=requests.post(url,data={parameter:post_data},headers=header)
return r.text
在上面的代码中,我只需要给它 url
(木马的url地址)parameter(木马参数)和无关紧要的header(http头部)
运行一下,成功得到路径,接下来开始写正文部分
根据菜刀中的
php->z0->z1 #z0为执行代码部分 z1为shell,也就是/bin/sh
->z2 #z2的内容为执行所需要的命令
首先先先构造一个新的php一句话木马
接着传入本体代码以及shell和执行所需的命令 (因太长,不贴出来,可移步)
但是这里要注意的一点是,command这个命令在传过去的时候,那边需要经过base64解码后才会生效,所以这里我们得将语句拼接完后,将他base64编码
我们拿浏览器测试一下这样是否会生效
为了方便测试,我这里执行的命令只有 id
而已
那么,执行成功后,结果有了,需要对数据内容进行筛选,因为为了做到目录切换,命令执行后的数据还包含了当前路径
我这里是写了一个正则,将内容都区分开来
因为最后三个是路径还有两个为空的值,所以最后三个不作为结果输出出来
...
for i in range(len(result)-3):
print (result[i]+" ",end="")
命令执行的部分就到这里了,那么现在解决目录切换的问题
在上面的执行结果中,包含了我这条命令执行后所在的位置
所以我将结果return出来,调换掉前面的 file_path
作为我开始时cd进去的路径就好了
同时,因为一开始是在该文件的当前目录下,所以一开始的路径不能变,而且用户如果敲回车的话,也会将命令发送过去执行,在那边会报错,所以做一个判断
如果是回车的话,就直接把当前路径返回回去,不放到那边执行了
这个是测试结果
整合后的代码公众号后台留言 Python菜刀
即可