# 21 - Pentesting FTP {{#include ../../banners/hacktricks-training.md}} ## 基本信息 **文件传输协议 (FTP)** 是在计算机网络中服务器与客户端之间进行文件传输的标准协议。\ 它是一个**明文**协议,使用**换行符 `0x0d 0x0a`**,因此有时需要**使用 `telnet` 连接**或**`nc -C`**。 **默认端口:** 21 ``` 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/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/) ### 连接调试 **FTP** 命令 **`debug`** 和 **`trace`** 可用于查看 **通信是如何发生的**。 ## 枚举 ### 横幅抓取 ```bash nc -vn 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 [] lftp 10.10.10.208:~> login username Password ``` ### Unauth enum 使用 **nmap** ```bash 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 : anonymous_\ \_anonymous :_\ \_ftp : ftp_ ```bash ftp >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 ``` ### [暴力破解](../../generic-hacking/brute-force.md#ftp) 在这里你可以找到一个包含默认ftp凭据的好列表: [https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt) ### 自动化 匿名登录和跳转FTP检查是通过nmap的**-sC**选项默认执行的: ```bash nmap --script ftp-* -p 21 ``` ## 浏览器连接 您可以使用浏览器(如 Firefox)通过以下 URL 连接到 FTP 服务器: ```bash ftp://anonymous:anonymous@10.10.10.98 ``` 注意,如果一个 **web application** 正在将用户控制的数据 **直接发送到 FTP 服务器**,您可以发送双重 URL 编码 `%0d%0a`(在双重 URL 编码中为 `%250d%250a`)字节,并使 **FTP 服务器执行任意操作**。其中一个可能的任意操作是从用户控制的服务器下载内容,执行端口扫描或尝试与其他基于明文的服务(如 http)进行通信。 ## 从 FTP 下载所有文件 ```bash wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all ``` 如果您的用户名/密码包含特殊字符,可以使用以下命令: ```bash wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/ ``` ## 一些 FTP 命令 - **`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 ![](<../../images/image (386).png>) ## FTPBounce 攻击 一些 FTP 服务器允许使用命令 PORT。此命令可用于指示服务器你想要连接到其他 FTP 服务器的某个端口。然后,你可以利用此功能扫描主机的哪些端口通过 FTP 服务器是开放的。 [**在这里了解如何滥用 FTP 服务器扫描端口。**](ftp-bounce-attack.md) 你还可以滥用这种行为使 FTP 服务器与其他协议交互。你可以 **上传一个包含 HTTP 请求的文件**,并使易受攻击的 FTP 服务器 **将其发送到任意 HTTP 服务器**(_也许是为了添加一个新的管理员用户?_)或甚至上传一个 FTP 请求,使易受攻击的 FTP 服务器为另一个 FTP 服务器下载文件。\ 理论很简单: 1. **将请求(放在文本文件中)上传到易受攻击的服务器。** 记住,如果你想与另一个 HTTP 或 FTP 服务器通信,你需要用 `0x0d 0x0a` 更改行 2. **使用 `REST X` 避免发送你不想发送的字符**(也许为了在文件中上传请求,你需要在开头放一些图像头) 3. **使用 `PORT` 连接到任意服务器和服务** 4. **使用 `RETR` 将保存的请求发送到服务器。** 这很可能会抛出一个错误,如 _**Socket not writable**_ **因为连接持续时间不足以使用 `RETR` 发送数据**。避免这种情况的建议包括: - 如果你正在发送 HTTP 请求,**将相同的请求一个接一个地放置**,直到 **\~0.5MB** 至少。像这样: {{#file}} posts.txt {{#endfile}} - 尝试 **用与协议相关的 "垃圾" 数据填充请求**(与 FTP 交谈时,可能只是垃圾命令或重复 `RETR` 指令以获取文件) - 只需 **用大量空字符或其他字符填充请求**(分行或不分行) 无论如何,这里有一个 [关于如何滥用此功能使 FTP 服务器从不同 FTP 服务器下载文件的旧示例。](ftp-bounce-download-2oftp-file.md) ## Filezilla 服务器漏洞 **FileZilla** 通常 **绑定** 到 **本地** 的 **管理服务** 用于 **FileZilla-Server**(端口 14147)。如果你可以从 **你的机器** 创建一个 **隧道** 来访问此端口,你可以 **使用空密码连接** 到 **它** 并 **创建** 一个 **新的用户** 用于 FTP 服务。 ## 配置文件 ``` ftpusers ftp.conf proftpd.conf vsftpd.conf ``` ### Post-Exploitation 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 ### 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.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' ``` {{#include ../../banners/hacktricks-training.md}}