设为首页收藏本站
查看: 13107|回复: 4

phpstudy后门利用及分析

[复制链接]
  • TA的每日心情
    开心
    2020-3-28 19:45
  • 签到天数: 210 天

    [LV.7]常住居民III

    发表于 2019-10-5 01:00:49 | 显示全部楼层 |阅读模式
    本帖最后由 飞畅 于 2019-10-5 13:22 编辑

    最近网上爆出了phpstudy有后门,然后就发现了自己的phpstudy里有后门
    弄了三天,写了一篇博客,骗个点击😀
    博客(https://blog.csdn.net/feichang2/article/details/102094374)(防挂)
    或者看这个pdf
    pdf(https://pan.baidu.com/s/1dmBx_GBSp1zM3qXcaxDQdw)(防挂)


    ok,我在这儿发一下,虽然不好看了( ̄▽ ̄)"(发不上链接了..(;′д`)ゞ,发一次挂一次>﹏<)

    几天前火绒说我的PHPstudy有马,我以为是误报没有在意,但接着我就在知乎上看到了PHPstudy真可能有后门,于是赶紧看了一下,还真有,是我之前下的2016版的,而我在官网下的2019的phpstudy_pro没有问题(文末给出了有后门的phpstudy安装包(是我之前在官网下的))

    可以看到php-5.2.17/ext/php_xmlrpc.dll和php-5.4.45/ext/php_xmlrpc.dll里有可疑的@eval字符,看来是有一句话了
    根据网上的poc利用一下(要在phpstudy里手动使用php5.2.17或是5.4.45版本,而且要使用php_xmlrpc扩展)
    使用burpsuite进行改包发送,这里我用的是pentestbox里的FirefoxPortable和pentestbox里的burpsuite社区版,比专业版少了一个探测网站漏洞的功能
    用foxyproxy设置一下代理(就是侧边栏上的狐狸头,或者Tools->FoxyProxy Standard)


    这里使用本地的8080端口是因为burpsuite默认使用这个端口

    刷新一下localhost的网页得到一个拦截(最好直接访问localhost,这应该会显示php探针),右键发送到repeater里去(或者快捷键<ctrl>+R)

    在repeater里改一下包

    注意:这里要该改为使用/访问网站根目录如果之前访问的是其他网页的话
    accept-encoding后的字段里的逗号后面有空格要删掉
    加入一个accept-charset字段,内容为你想在@eval()里执行的命令的base64编码
    这里是system("net user");,编码后是c3lzdGVtKCJuZXQgdXNlciIpOw==
    点一下Go按钮返回了执行net user后的结果
    包的最后要留两个空行(两个\n\r,十六进制为两个0d0a)

    接着试试tamper data 注:firefoxportable里的tamper data插件因为版本问题被禁了,需要修改一下,可以看我的另一篇博客:pentestbox的firefox踩坑
    关掉foxyproxy后,在firefox里的Tools->Tamper Data点一下,点start Tamper,刷新一下后点Tamper改包,去掉accept-encoding里逗号后的空格,在空白处右键add element输入Accept-Charset=c3lzdGVtKCJuZXQgdXNlciIpOw==,再点OK
    结果如图

    可以看见返回了结果


    关于该后门的分析
    md5校验可以看见和(现在)官网的不一样


    用010editor可以看见校验值为0

    用ida打开xml_rpc.dll
    搜索字符串,发现可疑的@eval


    去看看它们的引用,都在一个函数里

    aEvalSS的值为串@eval(%s('%s'));,aGzuncompress的值为串gzuncompress,spprintf是一个字符拼接函数
    长度限制,被删掉...
    结果是v43指向@eval(gzuncompress(v43)),gzuncompress是一个php提供的解压函数,所以恶意代码内容在v43里,往上看看

    可以看到这是将asc_1000c028到unk_1000C66C-4进行了处理后写到了v43里,然后我没看到这一段地址间有0x27,所以好像直接解压就可以了&#128516;
    而看另一个字符可以看到100c66c到1000d5c4-4之间是另一段恶意代码
    解压这两段(python实现)(我没跑):用pefile获取gzuncompress的位置,往后0x10就是第一段开头,再后0x644是第二段开头,然后用zlib.decompress(python3)
    source:
    phpStudy遭黑客**植入后门事件披露 | 微步在线报告恶意php代码(https://mp.weixin.qq.com/s?__biz=MzI5NjA0NjI5MQ==&mid=2650165920&idx=1&sn=ac45922b6cf1db0f3d3cf0a10872be06&chksm=f448a91cc33f200a32cdbd01535e227a4a81cd3ce843992e410d0e4d5b772914d1ac3d6324fe&mpshare=1&scene=1&srcid=&sharer_sharetime=1569082336079&sharer_shareid=050fef71c2c8c2cd7ebc8d5cccf6b556#rd)(防挂)
    php2python
    出来时是base64编码在用base64.b64decode()就可以出来,到这儿这两个执行差不多,可是它们的执行条件不同
    长度限制:被删掉...
    这上面的一段像本地发送了一个请求,有Accept-Encoding头且值为compress,gzip其实是给第二段创造执行条件,我们后面可以看到
    长度限制:被删掉...
    这一段是向域名为.360se.net的好几个子域名的几个端口传东西
    再在IDA里向上看,第二段要求**v36指向的内容等于aCompressGzip(compress,gzip),再向上,要求**v36指向的串不等于aGzipDeflate(gzip,deflate),而这个值就是Accept-Encoding字段的值,所以如果没有aServer(_SERVER)或是Accept-Encoding字段也不行,而如果Accept_Encoding字段是aGzipDeflate(gzip,deflate)的话,在找一下有没有Accept-Charset字段,如果有的话就base64解密后进行执行(就是上面我们用的),详情见下图注释

    而第二段的触发条件则是几个地址数据的比较,我们可以查看引用发现这几个地址都被sub_10001010引用并进行了改写
    我们查看该函数的引用

    根据参考资料我们可以知道这是一个_zend_module_entry结构体

    sub_10001010只在开始加载时执行一次,而sub_10003490在每一次接收到http请求时执行一次,而这个函数正是我们之前分析的含有恶意代码的,而sub_10001010也关系到了第一段代码的执行条件

    start_time为上次进入该条件的时间,current_time为这次的,sub_10001010做了初始化,要求他们的差值在60-100分钟之间才能进入条件进行执行代码段一

    我们测试一下
    在C:\Windows\System32\drivers\etc\hosts写入

    192.168.226.129 www.360se.net
    192.168.226.129 bbs.360se.net
    192.168.226.129 cms.360se.net
    192.168.226.129 down.360se.net
    192.168.226.129 up.360se.net
    192.168.226.129 file.360se.net
    192.168.226.129 ftp.360se.net
    192.168.226.129是我Kali虚拟机的ip地址
    我们只用试试40125端口就行了
    server.py(kali上跑的脚本:监听tcp:40125端口并回显一下内容)

    import socket
    import datetime
    bind_ip = "192.168.226.129"
    bind_port = 40125
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.bind((bind_ip,bind_port))
    server.listen(5)
    while True:
        client,addr = server.accept()
        print("now:{}".format(datetime.datetime.now()))
        print("address:{}".format(addr))
        data=client.recv(2048)
        print("data:{}".format(data))
        print()
        client.close()
    client.py(就在物理机上跑了,每秒向phpstudy发送http请求)

    import requests
    import time
    req_num=0
    target='http://192.168.226.1'
    for i in range(6000):
        requests.get(target)
        req_num+=1
        print('[+]{}'.format(req_num))
        time.sleep(1)
    用keypatch修改一下等待时间

    再用010editor修改一下interval的基础值(从083eh(十进制1000)到00h)
    这样interval就是一个[76,133]的值了,这是我们可以收到回应的间隔时间

    结果如图,被遮住的地方经过base64解码后可以看到我的磁盘序列号和网卡的mac地址

    这里给出有后门(!!!)的phpstudy zip安装包zip(https://pan.baidu.com/s/191o_auL04m63MKT07zvKjA)(防挂)
    参考:
    phpStudy后门简要分析
    PHPStudyGhost后门隐蔽触发功能详细分析
  • TA的每日心情
    慵懒
    昨天 07:54
  • 签到天数: 221 天

    [LV.7]常住居民III

    发表于 2019-10-5 09:58:57 | 显示全部楼层
    建议把文章发过来哦,虽然引流 但是也要有学习的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 00:04
  • 签到天数: 732 天

    [LV.9]以坛为家II

    发表于 2019-10-5 11:08:47 | 显示全部楼层
    此处应有掌声!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2020-6-23 10:47
  • 签到天数: 204 天

    [LV.7]常住居民III

    发表于 2019-10-6 00:14:23 | 显示全部楼层
    先评论后看文章哈哈哈
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    前天 00:11
  • 签到天数: 93 天

    [LV.6]常住居民II

    发表于 2019-10-6 09:01:17 | 显示全部楼层
    可以可以,学习了
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    站长推荐 上一条 /3 下一条

    红盟社区--中国红客联盟 

    Processed in 0.098963 second(s), 18 queries.

    站点统计| 举报| Archiver| 手机版| 黑屋 |   

    Powered by HUC © 2001-2017 Comsenz Inc.

    手机扫我进入移动触屏客户端

    关注我们可获取更多热点资讯

    Honor accompaniments. theme macfee

    快速回复 返回顶部 返回列表