21 - Pentesting FTP
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
文件传输协议 (FTP) 是一个标准协议,用于在计算机网络中在服务器和客户端之间传输文件。
它是一个明文协议,使用换行符 0x0d 0x0a
,因此有时需要使用 telnet
或 nc -C
进行连接。
默认端口: 21
在 主动 FTP 中,FTP 客户端首先从其端口 N 向 FTP 服务器的命令端口 - 端口 21 发起控制 连接。然后,客户端监听端口 N+1 并将端口 N+1 发送给 FTP 服务器。FTP 服务器随后从 其端口 M 到 FTP 客户端的端口 N+1 发起数据 连接。
但是,如果 FTP 客户端设置了防火墙以控制来自外部的传入数据连接,则主动 FTP 可能会成为一个问题。对此的可行解决方案是被动 FTP。
在 被动 FTP 中,客户端从其端口 N 向 FTP 服务器的端口 21 发起控制连接。之后,客户端发出 passv 命令。服务器随后将其端口号 M 发送给客户端。然后,客户端从 其端口 P 到 FTP 服务器的端口 M 发起数据 连接。
来源: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/
FTP 命令 debug
和 trace
可用于查看 通信是如何发生的。
使用 nmap
您可以使用命令 HELP
和 FEAT
来获取 FTP 服务器的一些信息:
anonymous : anonymous anonymous : ftp : ftp
在这里你可以找到一个包含默认ftp凭据的好列表: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt
匿名登录和跳转FTP检查是通过nmap的**-sC**选项默认执行的:
您可以使用浏览器(如 Firefox)通过以下 URL 连接到 FTP 服务器:
注意,如果一个 web 应用程序 正在将用户控制的数据 直接发送到 FTP 服务器,您可以发送双重 URL 编码 %0d%0a
(在双重 URL 编码中为 %250d%250a
)字节,并使 FTP 服务器执行任意操作。其中一个可能的任意操作是从用户控制的服务器下载内容,执行端口扫描或尝试与其他基于明文的服务(如 http)进行通信。
如果您的用户名/密码包含特殊字符,可以使用以下命令:
USER username
PASS password
HELP
服务器指示支持哪些命令
PORT 127,0,0,1,0,80
这将指示 FTP 服务器在端口 80 与 IP 127.0.0.1 建立连接(你需要将第 5 个字符设置为 "0",第 6 个字符设置为十进制端口,或者使用第 5 和第 6 个字符以十六进制表示端口)。
EPRT |2|127.0.0.1|80|
这将指示 FTP 服务器在端口 80 与 IP 127.0.0.1 建立 TCP 连接(由 "2" 指示)。此命令 支持 IPv6。
LIST
这将发送当前文件夹中的文件列表
LIST -R
递归列出(如果服务器允许)
APPE /path/something.txt
这将指示 FTP 将从 被动 连接或 PORT/EPRT 连接接收的数据存储到文件中。如果文件名存在,将附加数据。
STOR /path/something.txt
类似于 APPE
,但将覆盖文件
STOU /path/something.txt
类似于 APPE
,但如果存在则不执行任何操作。
RETR /path/to/file
必须建立被动或端口连接。然后,FTP 服务器将通过该连接发送指定的文件
REST 6
这将指示服务器下次使用 RETR
发送内容时应从第 6 字节开始。
TYPE i
设置传输为二进制
PASV
这将打开一个被动连接,并指示用户可以连接的位置
PUT /tmp/file.txt
将指定文件上传到 FTP
一些 FTP 服务器允许使用 PORT 命令。此命令可用于指示服务器你想要连接到其他 FTP 服务器的某个端口。然后,你可以利用此功能扫描主机的哪些端口是开放的。
你还可以利用这种行为使 FTP 服务器与其他协议交互。你可以 上传一个包含 HTTP 请求的文件,并使易受攻击的 FTP 服务器 将其发送到任意 HTTP 服务器(也许是为了添加一个新的管理员用户?)或甚至上传一个 FTP 请求,使易受攻击的 FTP 服务器为另一个 FTP 服务器下载文件。 理论很简单:
将请求(放在文本文件中)上传到易受攻击的服务器。 记住,如果你想与另一个 HTTP 或 FTP 服务器通信,你需要用 0x0d 0x0a
更改行
使用 REST X
避免发送你不想发送的字符(也许为了在文件中上传请求,你需要在开头放一些图像头)
使用 PORT
连接到任意服务器和服务
使用 RETR
将保存的请求发送到服务器。
很可能这 会抛出一个错误,如 Socket not writable 因为连接持续时间不足以使用 RETR
发送数据。避免这种情况的建议包括:
如果你正在发送 HTTP 请求,将相同的请求一个接一个地放置,直到 ~0.5MB 至少。像这样:
尝试 用与协议相关的 "垃圾" 数据填充请求(与 FTP 交谈时,可能只是垃圾命令或重复 RETR
指令以获取文件)
只需 用大量空字符或其他字符填充请求(分行或不分行)
无论如何,这里有一个 关于如何滥用此功能使 FTP 服务器从不同 FTP 服务器下载文件的旧示例。
FileZilla 通常 绑定 到 本地 的 管理服务 用于 FileZilla-Server(端口 14147)。如果你可以从 你的机器 创建一个 隧道 以访问此端口,你可以 使用空密码连接 到 它 并 为 FTP 服务创建 一个 新用户。
vsFTPd 的默认配置可以在 /etc/vsftpd.conf
中找到。在这里,你可以找到一些危险的设置:
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_root=/home/username/ftp
- 匿名用户的目录。
chown_uploads=YES
- 更改匿名上传文件的所有权
chown_username=username
- 被赋予匿名上传文件所有权的用户
local_enable=YES
- 允许本地用户登录
no_anon_password=YES
- 不要求匿名用户输入密码
write_enable=YES
- 允许命令:STOR, DELE, RNFR, RNTO, MKD, RMD, APPE, 和 SITE
ftp
port:21
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)