0x01 攻击板块

在我参与的一次渗透测试项目中,目标是深入了解内网中的横向移动技术。横向移动是指在获得一个系统的初始访问权后,攻击者如何在内网中扩展其控制权限,从而访问更多系统和资源。这个过程通常涉及凭证窃取、利用信任关系以及利用各种漏洞进行权限提升。在这篇文章中,我会分享一些我实战中使用的技术,帮助你更好地理解内网渗透的艺术。

横向移动的核心在于如何获取有效的凭证,以及如何利用网络的信任关系。这通常涉及到一些关键技术,比如凭证哈希传递、票据传递,以及利用服务账户的权限。有一次,我在一个企业环境中,通过钓鱼攻击获得了一台员工电脑的访问权限,接下来的目标就是尽快实现横向移动,进入更多关键系统。

0x02 实战环境搭建

为了模拟企业内网环境,我利用虚拟化技术搭建了一个包含多个服务器和工作站的局域网。这个环境中有域控制器、文件服务器、数据库服务器以及多台客户端工作站。

黑客示意图

具体配置如下:

  • 域控制器:Windows Server 2019,负责域管理和用户认证。
  • 文件服务器:提供网络共享文件存储,运行Windows Server 2016。
  • 数据库服务器:运行SQL Server 2017,存储企业数据。
  • 客户端工作站:几台Windows 10工作站,模拟员工日常使用环境。

为了更贴近真实环境,我还模拟了常见的安全配置,比如启用Windows防火墙、安装EDR软件,以及使用复杂密码策略。

0x03 Payload构造的艺术

在实战中,我常常需要设计特定的Payloads来执行横向移动。在这个过程中,Go语言成了我得力的助手。它不仅能编写高效的网络工具,还能轻松跨平台执行。下面是一个利用Go语言编写的工具例子,它可以帮助我们进行凭证窃取和权限提升。

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

import ( &quot;fmt&quot; &quot;os&quot; &quot;os/exec&quot; &quot;strings&quot; )

// 这个工具主要用来执行命令和窃取凭证 func executeCommand(command string) string { parts := strings.Fields(command) head := parts[0] parts = parts[1:len(parts)]

cmd := exec.Command(head, parts...) cmd.Stderr = os.Stderr out, err := cmd.Output() if err != nil { fmt.Println(&quot;命令执行失败:&quot;, err) return &quot;&quot; } return string(out) }

func main() { fmt.Println(&quot;准备执行命令...&quot;) output := executeCommand(&quot;whoami&quot;) fmt.Println(&quot;当前用户:&quot;, output)

// 试着窃取凭证 creds := executeCommand(&quot;mimikatz.exe privilege::debug sekurlsa::logonpasswords&quot;) fmt.Println(&quot;窃取到的凭证:&quot;, creds) }</code></pre>

黑客示意图

在这个例子中,我们利用Go语言调用系统命令,同时尝试使用Mimikatz工具进行凭证窃取。通过这些凭证,我们可以进一步实现横向移动,访问更多的系统。

0x04 绕过与免杀小技巧

面对现代企业的安全防护,绕过EDR和防病毒软件是横向移动的一部分。为了更好地实现这一目标,我通常会通过以下技术来增加Payload的隐蔽性。

加壳与混淆

通过对Payload进行加壳和代码混淆,可以有效降低被安全软件检测到的风险。常用的工具有UPX、Obfuscator-LLVM等。加壳处理后的文件会被重新编码,使其不易被病毒库匹配。

内存加载

在一次渗透中,我成功绕过了某知名企业的EDR系统,方法是将Payload直接加载到内存中执行,而非磁盘。这减少了被文件监控机制捕获的概率。可以使用Go语言的内存加载技术,将可执行代码直接在内存中运行:

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

import ( &quot;fmt&quot; &quot;io/ioutil&quot; &quot;log&quot; )

func loadFromMemory(filePath string) { data, err := ioutil.ReadFile(filePath) if err != nil { log.Fatalf(&quot;无法读取文件: %s\n&quot;, err) } // 这里执行从内存中加载的代码 // 当然,实际操作中需要使用汇编或者其他技术来执行 fmt.Println(&quot;成功加载文件到内存:&quot;, filePath, len(data), &quot;字节&quot;) }

func main() { loadFromMemory(&quot;/path/to/payload.dat&quot;) }</code></pre>

这种技巧对于绕过文件监控非常有效,但需要结合其他技术来实现代码的真正执行。

0x05 检测与反制

在进行内网渗透过程中,了解检测和反制措施同样重要。虽然我们往往站在攻击者的角度思考问题,但了解防御措施可以帮助我们设计更有效的攻击。

网络流量监控

很多企业通过网络流量监控工具来检测异常的活动,这些工具会记录流量模式、端口使用情况等。为了规避这些监控,我常常使用流量伪装技术,将恶意流量伪装为正常的网络活动。

系统登录审计

系统登录审计是另一种常见的检测手段。攻击者需要避免触发异常登录警报,因此在横向移动中,我们尽量使用合法的用户凭证进行访问,通过凭证窃取实现这一点。

EDR与防病毒绕过

在绕过EDR和防病毒软件时,使用免杀工具、代码混淆以及内存执行技术非常有效。当然,保持代码的更新迭代也是极其重要的,因为安全软件也在不断更新其检测技术。

0x06 个人经验分享

在多次内网渗透实践中,我总结了以下经验,希望能对你有所帮助:

充分的信息收集

在任何一次横向移动之前,信息收集都是至关重要的。了解网络拓扑、系统配置、用户权限等信息,才能设计出策略性攻击。

快速适应变化

黑客示意图

每个目标环境都有其独特性,因此攻击者必须快速适应变化,不断调整自己的策略。这也是我喜欢Go语言的原因之一,它灵活而高效。

保持隐蔽

隐蔽是所有攻击的基础。通过使用内存加载、流量伪装、代码混淆等技术,可以有效降低被检测到的风险。

学习与分享

黑客示意图

请记住,合法授权的安全测试至关重要。分享经验不仅帮助他人,更能让自己不断成长。在这个领域,合作与交流总能激发出更好的技术。

希望这次分享能让你对内网渗透横向移动有更深入的理解。继续学习,探索更多的技术细节,才能在不断变化的网络安全世界中保持领先。