原文链接:phpStudy后门代码执行漏洞分析
0x1 漏洞简介2019.9.20日有团队爆出非官网的一些下载站中的phpstudy版本存在后门文件,疑似遭遇供应链攻击,程序包自带PHP的php_xmlrpc.dll模块隐藏有后门。经过分析除了有反向连接木马之外,还可以正向执行任意php代码。
0x2 影响版本
Phpstudy 2016
php\php-5.2.17\ext\php_xmlrpc.dll php\php-5.4.45\ext\php_xmlrpc.dll Phpstudy 2018 的php-5.2.17、php-5.4.45PHPTutorial\php\php-5.2.17\ext\php_xmlrpc.dll PHPTutorial\php\php-5.4.45\ext\php_xmlrpc.dll 0x3 漏洞分析使用notepad++打开对应的dll文件,搜索@eval,可查看到相关字符串。
使用IDA找到可以字符串,双击再按x找到交叉引用的位置。
F5生成伪代码如下图所示
F5查看伪代码,分析整个函数流程可知:
判断条件是有全局变量且有HTTP_ACCEPT_ENCODING的时候进入内部语句。接下来有两个主要判断来做正向连接和反向连接的操作。主要有两个部分。
第一部分,正向连接:判断ACCEPT_ENCODING如果等于gzip,deflate,读取ACCEPT_CHARSE的内容做base64解密,交给zend_eval_strings()函数可以执行任意恶意代码。
构造HTTP头,把Accept-Encoding改成Accept-Encoding: gzip,deflate可以触发第一个部分。
第二部分,反向连接:判断ACCEPT_ENCODING如果等于compress,gzip,通过关键部分@eval(gzuncompress('%s'));可以看到拼接了一段恶意代码,然后调用gzuncompress方法执行解密。
构造HTTP头,把Accept-Encoding改成Accept-Encoding: compress,gzip可以触发第二部分。 第一部分代码流程
第二部分代码流程
经过分析可知代码中spprintf函数是php官方自己封装的函数,spprintf(&v42, 0, aSEvalSS, v36,aGzuncompress, v42);//v42为缓冲区等于@eval(gzuncompress(‘,27h,’v42′,27h,’)); 实际是实现字符串拼接功能
通过找eval关键词可发现多处存在,第一处spprintf(&v42, 0, aSEvalSS, v36,aGzuncompress, v42);第二处spprintf(&v41, 0, aEvalSS, aGzuncompress,v41);
恶意代码存在变量v41、v42里,在此处往上回溯该变量,发现对该变量进行了处理。
1.从1000D028 到1000D66C的代码解密:
解密后的脚本 2.1000D66C到1000E5C4的代码解密
解密后的脚本
鉴于C2服务器已经失活,看不懂效果,但有一个远程代码执行的功能可以演示,来源于zend_eval_string(v40, 0, &byte_10012884, a3);// 后门代码执行。
0x4 漏洞演示运行带有漏洞的版本的phpstudy
构造如下exp
system(“net user”);经base64编码后为c3lzdGVtKCJuZXQgdXNlciIpOw==,直接构造该请求,需要两个换行,不然会一直处于等待的状态,没有响应。依据逻辑还需要注意的是Accept-Encoding字段值必须为gzip,deflate,才能去判断是否存在Accept-Charset字段,接着取该字段的值,base64解码后执行,造成了远程代码执行,执行了system(“net user”); 执行后成功显示了net user命令的结果。
0x5 参考资料https://www.freebuf.com/articles/others-articles/215406.html https://www.cnblogs.com/17bdw/p/11580409.html
|