FTP流量分析
概念
FTP(文件传输协议,File Transfer Protocol)流量是指在网络中,客户端与服务器之间为了传输文件和管理目录而产生的网络数据包集合。
它是TCP/IP模型中的应用层(Application Layer)*协议,底层依赖于传输层的*TCP协议来提供可靠的数据传输服务。
FTP的核心功能
FTP主要用于在不同主机之间共享和管理文件,屏蔽了不同操作系统之间的底层文件组织差异。它的核心功能包括:
- 文件传输: 支持将文件从远程服务器下载到本地(Download),或将本地文件上传到服务器(Upload)。
- 目录管理: 允许客户端在远程服务器上浏览目录列表,以及创建、删除、重命名文件和文件夹。
- 身份认证与控制: 支持基于用户名和密码的访问控制(传统FTP为明文验证)。同时支持配置“匿名(Anonymous)”访问模式供公共文件下载。
- 断点续传: 在网络波动导致传输中断时,支持从上次中断的位置继续传输文件,无需从头开始。
连接类型 默认端口 作用 控制连接 (Control Connection) TCP 21用于传输FTP命令和服务器响应(如登录请求、切换目录命令)。这条连接在整个FTP会话期间始终保持开启。 数据连接 (Data Connection) TCP 20 (主动模式) 或 随机高位端口 (被动模式) 专门用于实际传输文件数据或目录列表内容。每当需要传输文件时临时建立,传输完毕后立即断开。
工作模式:主动与被动
FTP 的数据通道建立方式有两种,这往往也是网络配置中最容易踩坑的地方(尤其是在有防火墙和 NAT 的环境中):
- 主动模式 (Active Mode,PORT): 客户端开放一个随机高位端口,并通过控制通道告诉服务器:“我的数据端口是 X,你来连我”。服务器端的主动发起会使用其 20 端口去连接客户端的 X 端口。
- 被动模式 (Passive Mode,PASV): 客户端发送 PASV 命令,服务器开放一个随机高位端口并回复:“我的数据端口是 Y,你来连我”。客户端主动去连接服务器的 Y 端口进行数据传输。现代网络环境下,为了穿透客户端侧的 NAT 防火墙,通常默认使用被动模式。
Q1:攻击者的IP是什么?
flag{192.168.39.88}
从协议中我们观察发现是TCP协议流量居多,然后发现FTP协议,FTP协议是用来传输协议使用的,如果攻击者进行扩大危害的话需要进行文件传输。
同时FTP的固定端口是22,我们可以去TCP端口查看哪个IP对22端口链接比较

发现192.168.39.88的不同端口向固定192.168.39.90:21发送数据

那我们就先去观察192.168.39.88这个IP和192.168.39.90互换了什么信息吧
ip.addr == 192.168.39.88 && tcp.port == 21

先了解一下FTP的响应码吧
FTP响应码
| 位数 | 含义 |
|---|---|
| 第 1 位 | 状态:成功/失败/进行中 |
| 第 2 位 | 功能分类:authentication / 文件操作 / 连接管理等 |
| 第 3 位 | 更细的描述 |
提示: 所以你看到 230 的第一眼就应该反应:2xx = 成功,3xx = 进行中。
1xx:积极初步应答(还在处理中)
| 码 | 含义 |
|---|---|
| 110 | 新标记应答 |
| 120 | 服务在 nnn 分钟后准备好 |
| 125 | 数据连接已打开,开始传输 |
| 150 | 文件状态正常,即将打开数据连接 ✅ 本包出现 |
2xx:成功(命令已执行)
| 码 | 含义 |
|---|---|
| 200 | 命令成功 |
| 202 | 命令未实现,本站点不需要此命令 |
| 211 | 系统状态或帮助应答 |
| 212 | 目录状态 |
| 213 | 文件状态 |
| 214 | 帮助信息 ✅ 本包出现(HELP 命令回复) |
| 215 | UNIX 系统类型 ✅ 本包出现(SYST 回复) |
| 220 | 服务就绪,欢迎信息 ✅ 本包出现 |
| 221 | 服务关闭控制连接 |
| 225 | 数据连接打开,无传输 |
| 226 | 关闭数据连接,传输完成 ✅ 本包出现(LIST/RETR 完成) |
| 227 | 进入被动模式(IP/Port 给出) |
| 229 | 进入扩展被动模式 ✅ 本包出现(EPSV) |
| 230 | 用户登录成功 ✅ 关键信号! |
| 231 | 用户注销 |
| 232 | 登录需要安全机制 |
| 234 | 安全认证完成 |
| 250 | 目录操作成功 ✅ 本包出现(CWD 成功) |
| 257 | 路径名建立 |
3xx:积极中间应答(还需进一步输入)
| 码 | 含义 |
|---|---|
| 331 | 用户名正确,需要密码 ✅ 本包大量出现 |
| 332 | 需要登录账户 |
| 334 | 需要安全机制 |
| 335 | 代理认证需要用户名 |
| 336 | 用户名需要代理认证 |
| 350 | 需要更多信息 |
4xx:临时负应答(可重试)
| 码 | 含义 |
|---|---|
| 421 | 服务不可用/超时断开 ✅ 本包出现(长时间无操作) |
| 425 | 无法打开数据连接 |
| 426 | 连接关闭,传输中止 |
| 430 | 无效的用户名或密码 |
| 431 | 需要足够空间 |
| 434 | 请求的主机不可用 |
| 450 | 请求的文件操作未执行 |
| 451 | 处理请求时出现本地错误 |
| 452 | 写入文件时空间不足 |
5xx:永久负应答(不可重试)
| 码 | 含义 |
|---|---|
| 500 | 语法错误,命令不可识别 |
| 501 | 参数语法错误 |
| 502 | 命令未实现 |
| 503 | 命令顺序错误 |
| 530 | 登录失败/未登录 ✅ 本包大量出现(暴力破解失败的标志) |
| 532 | 存储文件需要账户 |
| 550 | 请求操作未执行,文件不可用 |
| 551 | 请求操作中止,页类型未知 |
| 552 | 超出存储分配 |
| 553 | 文件名不允许 |
核心关键记忆点
在这个包里,你只需要重点记住以下 5 个状态码:
- 220 = 服务器上线了
- 331 = 用户名对了,给密码
- 230 = 登录成功 ✅(关键)
- 530 = 登录失败 ❌(关键)
- 226 = 下载完成
那我们就去看看FTP响应码230:用户登录成功 吧
ftp.response.code == 230

我们追踪一下流数据吧,看看发生了什么事件

第一个流:追踪流数据
表明
USER ftpuser
密码是ftp@2026
同时也可以知道了攻击者是192.168.39.88
Q2:攻击者对哪个网段进行了存活探测?发现了多少台存活主机?
格式:IP/网段,存活主机数
flag{192.168.39.0/24,7}
这个和SSH流量分析的Q3一样,了解ARP就可以知道使用这个指令
tshark -r "./hbcb01_FTP.pcapng" -Y "arp.opcode == 1 and arp.src.proto_ipv4 == 192.168.39.88" -T fields -e arp.dst.proto_ipv4 | sort -V -u

观察可以发现是从0扫到了255,所以网段是192.168.39.0/24

存活主机数

这个题了好靶场-SSH的流量分析不同在于
攻击者存活主机探测使用了什么协议共发现多少台存活主机(SSH) 攻击者对哪个网段进行了存活探测?发现了多少台存活主机?(本题)
第一个问使用这个协议发现了多少个主机,包含攻击者自己(因为自己也是在那个网段)
第二个是问除去自己还有多少个主机,一个字只差就是共
tshark -r "./hbcb01_FTP.pcapng" -Y "arp.opcode == 2 and arp.dst.proto_ipv4 == 192.168.39.88" -T fields -e arp.src.proto_ipv4 | sort -u

发现主机数量为7
Q3:受害者服务器开放了哪些常见的端口?
flag{21,135,139,445,5985}
ip.addr == 192.168.39.90 → 只看涉及 192.168.39.90 的包(不管源还是目的) && → 而且(同时满足) tcp.flags.syn == 1 → TCP 的 SYN 标志位为 1 && → 而且 tcp.flags.ack == 0 → TCP 的 ACK 标志位为 0 组合起来是什么? SYN=1, ACK=0 是 TCP 三次握手的第一个包(客户端发起的连接请求)。 所以这条过滤找的是:别人向 192.168.39.90 发起的所有 TCP 连接请求。 看这些连接请求发到了哪个目标端口,就能知道受害者开放了哪些端口。
tcp标志位
TCP 三次握手
当客户端要连接服务器的某个端口时,发生以下三步:
客户端 服务器 | | |-------- SYN (seq=x) --------> | 第1步:客户端发请求(SYN=1) | | |<---- SYN+ACK (seq=y, ack=x+1)-----| 第2步:服务器同意连接(SYN=1, ACK=1) | | |-------- ACK (ack=y+1) ------> | 第3步:客户端确认(ACK=1) | | 连接建立成功 ✅
当客户端要连接服务器的某个端口时,发生以下三步:
客户端 服务器 | | |-------- SYN (seq=x) --------> | 第1步:客户端发请求(SYN=1) | | |<---- SYN+ACK (seq=y, ack=x+1)-----| 第2步:服务器同意连接(SYN=1, ACK=1) | | |-------- ACK (ack=y+1) ------> | 第3步:客户端确认(ACK=1) | | 连接建立成功 ✅
每个包里的 TCP 标志位(Flags) 告诉对方"这个包是干什么的":
| 标志 | 含义 | 出现时机 |
|---|---|---|
| SYN | 同步序列号,请求建立连接 | 第1步、第2步 |
| ACK | 确认收到对方数据 | 第2步、第3步 |
| RST | 强制断开/拒绝连接 | 端口关闭时 |
| FIN | 正常结束连接 | 关闭连接时 |
SYN=1 + ACK=0 → 只能是三次握手的第1步 → 别人在尝试连接受害者。
这些连接请求发到了哪个端口,就说明攻击者在探测哪个端口。
那判断"哪些端口开放了"用哪个过滤?
看第2步——服务器回复了 SYN+ACK 的包:
tcp.flags.syn == 1 && tcp.flags.ack == 1 && ip.src == 192.168.39.90
| 条件 | 含义 |
|---|---|
ip.src == 192.168.39.90 | 受害者发出的包 |
tcp.flags.syn == 1 && tcp.flags.ack == 1 | 它在回应别人的连接请求(同意连接) |
tshark -r "./hbcb01_FTP.pcapng" -Y "tcp.flags.syn == 1 && tcp.flags.ack == 1 && ip.src == 192.168.39.90" -T fields -e tcp.srcport | sort -n -u

常见的服务端口
| 端口 | 服务/协议 | 说明 |
|---|---|---|
| 21 | FTP | 文件传输 |
| 22 | SSH | 远程安全登录(Linux) |
| 23 | Telnet | 远程登录(明文,不安全) |
| 25 | SMTP | 邮件发送 |
| 53 | DNS | 域名解析 |
| 80 | HTTP | 网页服务 |
| 110 | POP3 | 邮件接收 |
| 135 | RPC(远程过程调用) | Windows 服务管理 |
| 137/138/139 | NetBIOS | Windows 网络邻居/共享(旧) |
| 443 | HTTPS | 加密网页 |
| 445 | SMB(文件共享) | Windows 文件共享/打印机共享 |
| 1433 | MSSQL | SQL Server 数据库 |
| 3306 | MySQL | MySQL 数据库 |
| 3389 | RDP | Windows 远程桌面 |
| 5985 | WinRM(HTTP) | Windows 远程管理(PowerShell 远程) |
| 5986 | WinRM(HTTPS) | WinRM 加密版本 |
回到数据
- 21 → FTP(已确认)
- 135 → RPC
- 139 → NetBIOS 会话服务
- 445 → SMB(文件共享)
- 5985 → WinRM
这几个全是 Windows 服务器的典型端口,结合之前看到的 FileZilla Server 中文版,受害者是一台 Windows 服务器。
所以第三题的答案就是:受害者(192.168.39.90)开放的常见端口有 21(FTP)、135(RPC)、139(NetBIOS)、445(SMB)、5985(WinRM),共 5 个。
Q4:受害者的FTP服务和软件版本是什么?
flag{FileZilla Server 0.9.60 beta}
这个我们在追踪FTP第一次链接的时候就可以发现220响应


Q5:攻击者在暴力破解前使用 Nmap 脚本探测了 FTP 匿名登录,尝试的用户名是什么?
flag{anonymous}
仔细看的话应该可以在FTP协议中看到这一行No.3193中的info

Nmap 的 ftp-anon.nse 脚本有几个特征,可以帮判断"这是脚本不是人在操作":
- 整个会话只有 USER + PASS 两条命令 → 登录完就走了,不 LIST 不 CWD
- 用户名 anonymous(FTP 匿名登录的标准用户名)
- 连接后得到结果就断开,不再有后续操作
- 不像是人手动操作(人不会只试一次 anonymous 就走了)
Nmap 的 ftp-anon 脚本也常用一些固定密码
- IEUser@ ← 这个很关键,看到这个基本稳了
- chrome@example.com
- mozilla@example.com
- anonymous@
Q6:攻击者使用了什么工具进行暴力破解?
flag{Hydra}
这个是CTF常用的,没有更多依据了,仅仅是并发连接特征
- 4 路并发 → Hydra 默认 -t 16,但可以用 -t 4 控制
- 固定用户名 → Hydra 的 -l 参数
- 字典逐个试 → Hydra 的 -P 参数

点击放大,点击空白处返回
格式:数量|文件名
flag{5|README.txt,华章科技-2026年6月薪资明细.pdf,华章科技-2026年Q2财务报告.pdf,华章科技-内部系统凭据清单.pdf,华章科技-山东政务项目投标方案.pdf}
FTR-RETR是文件下载含义
ftp.request.command == "RETR"

也就是追踪第三个FTP-230流也可以发现这个信息

Q11:攻击者下载 PDF 前切换了什么传输模式?
flag{BINARY}
FTP传输模式
| 命令 | 模式 | 用途 |
|---|---|---|
| TYPE A | ASCII | 文本文件(换行符转换) |
| TYPE I | Image/Binary | 二进制文件(PDF、图片、压缩包等) |
| TYPE E | EBCDIC | IBM 大型机编码 |


PDF 是二进制文件,如果用 ASCII 模式传输会被破坏(换行符被转换导致文件损坏),所以下载前必须切到 TYPE I(二进制模式)。
Q12:被窃取的财务报告中,公司 Q2 总营收是多少?
flag{8743.2}
如何提取FTP文件呢?
在wireshark中选择
文件->导出对象->FTP-data

Q13:被窃取的薪资表中,CEO 王建国的月薪总额是多少?
flag{110000}
什么时候我也月薪这样

Q14:凭据文件中生产环境数据库主库的密码是什么?
flag{PgMaster\#2026db}

Q15:投标文件中该项目的投标总价是多少?
flag{2350}

Q16:被窃取的文件中隐藏的 flag 是什么?
flag{420E8A8C540D4BE07F0221F46CCFB8EE}


评论区
评论加载中...