0x01 从攻防角度看免杀

有一次,我在防御一场APT攻击时,发现即使在启用了EDR和高级防护的环境下,攻击者的恶意载荷依然能够悄无声息地执行。这让我意识到,以攻击者的视角来分析这个现象,能更好地理解他们是如何绕过这些安全产品的。在这篇技术分享中,我将深入讲解如何在实战中构造免杀恶意载荷,确保你的攻击技术能在面对高级防护措施时依然有效。

黑客示意图

0x02 实战环境部署

在开始任何免杀技术之前,搭建一个模拟环境非常重要,这可以帮助我们了解真实的防御措施如何运行,并调整我们的攻击方法。我通常会在虚拟机中配置一个Windows环境,并安装主流的EDR和杀毒软件。

环境要求:

黑客示意图

  • Windows 10/11:确保有最新的安全更新
  • EDR/AV软件:安装CrowdStrike、Carbon Black、Microsoft Defender等
  • 开发工具:安装Go编译器和Shell脚本环境

在这个环境下,我们将测试不同的免杀技术,以确保在各种防护措施下载荷依然能够执行。

0x03 Payload构造的艺术

构造免杀载荷的核心在于对抗检测机制。在过去的攻击中,我发现一些技术特别有效,比如混淆、动态加载以及内存隐蔽执行。下面是我常用的几种方法:

混淆与加壳

通过代码混淆和使用加壳技术,可以有效规避静态分析。这种方法通过改变代码结构,使得恶意代码难以被识别。例如,在Go语言中,我们可以使用包名和函数名混淆。

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

import ( &quot;fmt&quot; &quot;encoding/base64&quot; )

func main() { str := &quot;SGVsbG8sIFdvcmxkIQ==&quot; // &quot;Hello, World!&quot; in base64 data, _ := base64.StdEncoding.DecodeString(str) fmt.Println(string(data)) }</code></pre>

这段代码通过Base64编码隐藏了真实的字符串内容,在实际攻击中,可以对整个恶意逻辑进行类似处理。

内存加载技术

内存加载技术允许载荷在内存中直接执行,绕过文件系统的检测。例如,我们可以利用Shell脚本来实现:

<pre><code class="language-shell">#!/bin/bash echo &quot;Executing payload in memory...&quot; payload=$(echo &quot;SGVsbG8sIFdvcmxkIQ==&quot; | base64 -d) eval $payload</code></pre>

这种方法在许多EDR环境中都表现出色,因为它不会在磁盘上留下可检测的痕迹。

0x04 实战演练:免杀技巧

有一次在实际测试中,我尝试通过网络传输载荷以避免本地检测。通过将载荷分片传输,并在目标系统使用Go语言重组和执行,可以有效地绕过网络监控。

黑客示意图

网络传输与载荷重组

我们可以使用Go编写一个简单的服务器,分步发送载荷:

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

import ( &quot;bufio&quot; &quot;fmt&quot; &quot;net&quot; &quot;strings&quot; )

func main() { listener, err := net.Listen(&quot;tcp&quot;, &quot;:8080&quot;) if err != nil { fmt.Println(&quot;Error setting up server:&quot;, err) return } fmt.Println(&quot;Server is listening on port 8080&quot;)

for { conn, err := listener.Accept() if err != nil { fmt.Println(&quot;Error accepting connection:&quot;, err) continue }

go handleConnection(conn) } }

func handleConnection(conn net.Conn) { defer conn.Close() reader := bufio.NewReader(conn)

黑客示意图

for { payload, err := reader.ReadString(&#039;\n&#039;) if err != nil { fmt.Println(&quot;Error reading payload:&quot;, err) break }

fmt.Println(&quot;Received payload:&quot;, strings.TrimSpace(payload)) // Add payload reassembly and execution logic here } }</code></pre>

这种分片传输的技术确保载荷在网络流量中被分散,降低被检测的概率。

0x05 绕过检测的诡计

安全产品的检测机制通常依赖于签名和行为分析,通过改变载荷的行为,可以有效地规避这些检测。

动态行为改变

在攻击过程中,我会故意改变载荷的执行路径,例如插入无意义的延迟或变化的系统调用,以扰乱检测。通过Go语言的延迟函数,可以实现这一目标:

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

import ( &quot;fmt&quot; &quot;time&quot; )

func main() { fmt.Println(&quot;Payload executing...&quot;) time.Sleep(5 * time.Second) // Introduce delay // Continue with malicious actions }</code></pre>

这种技术使得攻击行为看起来更加随机,降低了被行为分析引擎检测的风险。

0x06 检测与防御反思

在防御中反推攻击,是我一直强调的做法。理解攻击者使用的免杀技术能帮助我们设计更有效的检测机制。例如,行为分析和动态行为监测可以检测载荷的异常行为。

实时行为监控

通过启用实时行为监控,EDR能够捕获载荷的异常行为,例如本章节介绍的动态行为改变。更新这些防护措施以应对最新的免杀技术,是确保安全环境的关键。

0x07 个人经验总结

在多年的攻击和防御实践中,我学到了一个重要的原则:“攻防一体,知己知彼。”。只有了解攻击者的视角,才能更好地设计防御策略。同时,免杀技术的本质是不断变化的,因此持续学习和更新技术是每个研究员的必备技能。

希望这次分享能够帮助你构建更有效的免杀技术,并提升你的攻击技巧。在攻击与反检测的博弈中,始终保持创新才能取得优势。