0x01 Webshell背后的故事

Webshell通常被攻击者用于远程控制和管理受害网站的服务器。这类文件通常是嵌入在目标服务器的脚本文件中,通过远程请求执行一些命令。这种攻击技术的原理是利用目标Web服务器的漏洞或者配置不当,使攻击者能够在服务器上上传一个Webshell,从而获取到远程控制权限。

一个常见的Webshell编写方式就是利用服务器支持的编程语言(如PHP、ASP、JSP等),编写一段可以执行系统命令或者操作文件的脚本。那么,为什么Webshell能够如此有效地绕过检测呢?

Webshell的成功在于:

  • 伪装性强:攻击者可以通过修改特定关键字、混淆代码等方式,使Webshell看起来像正常的代码片段。
  • 隐蔽性高:一些Webshell可以直接附着到常见的网页文件中,不易被发现。
  • 可扩展功能强:攻击者可以通过植入特定代码,使Webshell具备与C2服务器通信等功能。

黑客示意图

构建你的实验室

要深入研究Webshell免杀技术,首先需要搭建一个实验环境,既要能支持我们实验的各种技术,又要能确保操作安全。

软件和设备准备

  • 操作系统:推荐使用虚拟机中的Linux,如Ubuntu或CentOS。这样可以在不影响主机环境的情况下自由配置。
  • Web服务器:在沙盒环境中安装Apache或Nginx服务器。
  • 编程语言:装好Python、PHP和C语言编译器。

为了更深入地理解Webshell技术,我们可以在虚拟机里运行一个有已知漏洞的Web应用,比如早期版本的WordPress或Joomla。这些平台由于历史遗留问题,可能存在某些代码注入或文件上传的漏洞,能为Webshell测试提供契机。

环境搭建步骤

  1. 安装虚拟机:使用VMware或VirtualBox安装Linux系统。
  2. 配置Web服务器:在Linux系统中安装Apache或Nginx,并确保PHP模块正常工作。
  3. 设置可访问的目录:设置一个Web目录供实验使用,并确保其权限设置为所有用户可写(仅用于测试)。

搭建好实验环境后,我们将着手于代码编写与免杀技术探讨。

编写POC - 从简单到复杂的Webshell

为了理解Webshell是如何工作的,我们从一个简单的POC开始。这个概念验证代码可以在上传后运行服务器命令。

一个基础的PHP Webshell

<pre><code class="language-php">&lt;?php // 简单的Webshell,获取并执行客户端指定的命令 if(isset($_GET[&#039;cmd&#039;])){ echo &#039;&lt;pre&gt;&#039;; $cmd = ($_GET[&#039;cmd&#039;]); system($cmd); echo &#039;&lt;/pre&gt;&#039;; } ?&gt;</code></pre>

这个代码允许攻击者通过HTTP请求传入命令并在目标服务器上执行。尽管它的功能看似简单,但正是这种简单的shell容易被免杀技术隐藏。

Python与C 的合璧

下一步,我们可以结合Python和C语言制造一个更复杂的Webshell。C语言可以帮助我们更好地控制进程,而Python则可以执行系统命令并反馈结果。

<pre><code class="language-c">#include &lt;stdio.h&gt;

include &lt;stdlib.h&gt;

include &lt;string.h&gt;

// C代码,用来与Python Webshell进行交互 int main(){ char buf[256]; printf(&quot;Enter command: &quot;); scanf(&quot;%255s&quot;, buf); printf(&quot;Executing command: %s\n&quot;, buf); system(buf); return 0; }</code></pre>

黑客示意图

<pre><code class="language-python">import os

Python代码,执行系统命令

command = input(&quot;Enter your command: &quot;) os.system(command)</code></pre>

这段C和Python融合的代码,在功能上与前面的PHP Webshell类似,能够执行输入的任意命令。

对抗的艺术:绕过与免杀策略

在现实世界中,为了绕过常见的杀毒软件和IDS/IPS设备,攻击者通常使用以下免杀技术:

黑客示意图

代码混淆与加密

攻击者可以使用混淆技术改变代码中的关键字,使Webshell看起来像随机的字符序列,增加分析困难。

内存加载与伪装

通过将Webshell的代码在服务器内存中动态加载,而非直接写入磁盘,攻击者可以减少被文件扫描工具检测的风险。

自动化免杀工具

一些攻击者使用自动化工具来生成变形的Webshell,这些工具通常会随机修改代码结构以产生不同的shell变体。

探测与防御:如何识别Webshell

要有效识别Webshell,安全研究人员可以从以下几个方面入手:

文件分析与模式识别

定期扫描文件目录中的脚本文件,尝试识别清理过的或异常复杂的PHP代码。

黑客示意图

动态监控可疑请求

通过设置Web服务器或WAF,在实时监控请求中的异常参数和行为模式。如发现持续的异常命令请求,则可能存在Webshell。

环境隔离与限制

实现隔离的PHP环境,限制执行外部命令的权限,并记录异常命令执行日志。

红队策略分享

经验1:在使用webshell时尽量避免使用常见的shell代码片段,设计shell时使用不规则的代码结构增加伪装性。

经验2:使用内存加载技术将恶意代码直接在进程空间运行,减少文件监控带来的麻烦。

经验3:在内网渗透测试中,结合本地提权工具与Webshell,同时保持攻击链的完整性。

通过理解Webshell的工作原理和免杀技术,安全研究人员可以更好地防御这类攻击,同时攻击者也能不断提升自己的技术水平,保持在对抗中的优势地位。这是一个不断进化的战争,攻防双方的技术都在不断提高。