13 KiB
21 - Pentesting FTP
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Try Hard Security Group
{% embed url="https://discord.gg/tryhardsecurity" %}
基本信息
文件传输协议 (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/
连接调试
FTP 命令 debug
和 trace
可用于查看 通信是如何发生的。
枚举
横幅抓取
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 服务器的一些信息:
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 服务器与 IP 127.0.0.1 在端口 80 建立 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 服务器与其他协议交互。你可以 上传一个包含 HTTP 请求的文件,并使易受攻击的 FTP 服务器 将其发送到任意 HTTP 服务器(也许是为了添加一个新的管理员用户?)或甚至上传一个 FTP 请求,使易受攻击的 FTP 服务器为另一个 FTP 服务器下载文件。
理论很简单:
- 将请求(放在文本文件中)上传到易受攻击的服务器。 记住,如果你想与另一个 HTTP 或 FTP 服务器通信,你需要用
0x0d 0x0a
更改行 - 使用
REST X
避免发送你不想发送的字符(也许为了在文件中上传请求,你需要在开头放一些图像头) - 使用
PORT
连接到任意服务器和服务 - 使用
RETR
将保存的请求发送到服务器。
很可能这 会抛出一个错误,如 Socket not writable 因为连接持续时间不足以使用 RETR
发送数据。避免这种情况的建议包括:
- 如果你正在发送 HTTP 请求,将相同的请求一个接一个地放置,直到 ~0.5MB 至少。像这样:
{% file src="../../.gitbook/assets/posts.txt" %} posts.txt {% endfile %}
- 尝试 用与协议相关的 "垃圾" 数据填充请求(与 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
Try Hard Security Group
{% embed url="https://discord.gg/tryhardsecurity" %}
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'
{% hint style="success" %}
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 关注 我们的 Twitter 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。