基本信息
文件传输协议 (FTP) 是在计算机网络中服务器与客户端之间传输文件的标准协议。
它是一个 明文 协议,使用 换行符 0x0d 0x0a
,因此有时需要 使用 telnet
或 nc -C
进行连接。
默认端口: 21
Copy PORT STATE SERVICE
21/tcp open ftp
连接主动与被动
在主动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
可以用来查看 通信是如何发生的**。
枚举
横幅抓取
Copy nc -vn < I P > 21
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
使用 starttls 连接到 FTP
Copy 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
Copy sudo nmap -sV -p21 -sC -A 10.10.10.10
您可以使用命令 HELP
和 FEAT
来获取 FTP 服务器的一些信息:
Copy 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 : anonymous
&#xNAN;anonymous :
&#xNAN;ftp : ftp
Copy ftp < I P >
> 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
在这里你可以找到一个包含默认ftp凭据的好列表: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt
自动化
匿名登录和跳转FTP检查是通过nmap的**-sC**选项默认执行的:
Copy nmap --script ftp-* -p 21 < i p >
浏览器连接
您可以使用浏览器(如 Firefox)通过以下 URL 连接到 FTP 服务器:
Copy ftp://anonymous:anonymous@10.10.10.98
注意,如果一个 web 应用程序 正在将用户控制的数据 直接发送到 FTP 服务器 ,您可以发送双重 URL 编码 %0d%0a
(在双重 URL 编码中为 %250d%250a
)字节,并使 FTP 服务器执行任意操作 。其中一个可能的任意操作是从用户控制的服务器下载内容,执行端口扫描或尝试与其他基于明文的服务(如 http)进行通信。
从 FTP 下载所有文件
Copy wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all
wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all
如果您的用户名/密码包含特殊字符,可以使用以下命令 :
Copy wget -r --user= "USERNAME" --password= "PASSWORD" ftp://server.com/
一些 FTP 命令
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 。
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 字节开始。
PASV
这将打开一个被动连接,并指示用户可以连接的位置
PUT /tmp/file.txt
将指定文件上传到 FTP
FTP 反弹攻击
一些 FTP 服务器允许使用命令 PORT。此命令可用于指示服务器你想要连接到其他 FTP 服务器的某个端口。然后,你可以利用此功能扫描主机的哪些端口是开放的。
在这里了解如何滥用 FTP 服务器扫描端口。
你还可以利用这种行为使 FTP 服务器与其他协议交互。你可以 上传一个包含 HTTP 请求的文件 ,并使易受攻击的 FTP 服务器 将其发送到任意 HTTP 服务器 (也许是为了添加一个新的管理员用户? )或甚至上传一个 FTP 请求,使易受攻击的 FTP 服务器为另一个 FTP 服务器下载文件。
理论很简单:
将请求(放在文本文件中)上传到易受攻击的服务器。 记住,如果你想与另一个 HTTP 或 FTP 服务器通信,你需要用 0x0d 0x0a
更改行
使用 REST X
避免发送你不想发送的字符 (也许为了在文件中上传请求,你需要在开头放一些图像头)
很可能这 会抛出一个错误,如 Socket not writable 因为连接持续时间不足以使用 RETR
发送数据 。避免这种情况的建议包括:
如果你正在发送 HTTP 请求,将相同的请求一个接一个地放置 ,直到 ~0.5MB 至少。像这样:
尝试 用与协议相关的 "垃圾" 数据填充请求 (与 FTP 交谈时,可能只是垃圾命令或重复 RETR
指令以获取文件)
只需 用大量空字符或其他字符填充请求 (分行或不分行)
无论如何,这里有一个 关于如何滥用此功能使 FTP 服务器从不同 FTP 服务器下载文件的旧示例。
Filezilla 服务器漏洞
FileZilla 通常 绑定 到 本地 的 管理服务 用于 FileZilla-Server (端口 14147)。如果你可以从 你的机器 创建一个 隧道 以访问此端口,你可以 使用空密码连接 到 它 并 为 FTP 服务创建 一个 新用户 。
配置文件
Copy ftpusers
ftp.conf
proftpd.conf
vsftpd.conf
Post-Exploitation
vsFTPd 的默认配置可以在 /etc/vsftpd.conf
中找到。在这里,您可以找到一些危险的设置:
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
Shodan
HackTricks Automatic Commands
Copy 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.xyz/pentesting/pentesting-ftp
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'