文件传输协议(FTP)是一种标准的网络协议,用于在计算机网络上的客户端和服务器之间传输计算机文件。
它是一个纯文本协议,使用**新行字符 ** 0x0d0x0a
所以我们有时候需要使用 ** 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。
在Passive FTP中,客户端发起从它的N 端口到FTP Server 的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 #获取证书(如有)
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
使用 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 [email protected]
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
#FTP服务器的信息(版本,配置,状态…)
anonymous : anonymous**anonymous : ftp : ftp
ftp <IP>
>anonymous
>anonymous
>ls -a # 列出所有文件(甚至隐藏)(是的,它们可能被隐藏)
>binary #将传输方式设置为二进制而不是Ascii
>ascii #将传输设置为Ascii而不是二进制
>bye #退出
nmap默认使用 -sC选项执行匿名登录和反弹FTP检查。
nmap --script ftp-* -p 21 <ip>
您可以使用浏览器(如Firefox)通过如下URL连接到FTP服务器:
ftp://anonymous:[email protected].10.10.98
请注意,如果web应用程序直接向FTP服务器发送用户控制的数据 **,您可以发送双URL编码' %0d%0a
'(在双URL编码中,这是' %250d%250a
')字节,并使**FTP服务器执行任意操作。其中一种可能的任意操作是从用户控制的服务器下载内容,执行端口扫描或尝试与其他基于纯文本的服务(如http)通信。
wget -m ftp://anonymous:[email protected].10.10.98 #下载全部
wget -m --no-passive ftp://anonymous:[email protected].10.10.98 #下载全部
USER username
PASS password
HELP
服务器显示支持哪些命令
** PORT127,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 服务器将通过该连接发送指示的文件
REST6
这将指示服务器下次使用它发送 RETR
内容时应该从第 6 个字节开始。
TYPE i
设置传输为二进制
PASV
这将打开一个被动连接,并指示用户可以连接
PUT/tmp/file.txt
将指定的文件上传到 FTP
[
]
有些FTP服务器允许使用PORT命令。此命令可用于向服务器指示您希望通过某些端口连接到其他FTP服务器。然后,您可以使用该命令通过FTP服务器扫描主机的哪些端口是开放的。
您还可以滥用此行为使 FTP 服务器与其他协议交互。您可以上传一个包含 HTTP 请求的文件,*并让易受攻击的 FTP 服务器将其发送到任意 HTTP 服务器(也许是为了添加一个新的管理员用户?*),或者甚至上传一个 FTP 请求,并让易受攻击的 FTP 服务器下载一个不同的文件FTP服务器。 理论很简单:
将请求(在文本文件中)上传到易受攻击的服务器。 请记住,如果您想与另一个 HTTP 或 FTP 服务器通信,您需要更改行 0x0d0x0a
用于避免发送您不想发送的字符(也许将请求上传到您需要在开头放置一些图像标题的文件中) REST X
用于连接到任意服务器和服务** PORT
**
用于将保存的请求发送到服务器。 RETR
这很可能会引发类似Socket not writable*的错误,因为连接持续时间不足以发送数据 。尽量避免的建议是: RETR
如果您要发送 HTTP 请求,**请一个接一个地发送相同的请求,直到至少\~0.5MB
尝试用相对于协议的“垃圾”数据填充请求(与FTP通信可能只是垃圾命令或重复' RETR
'指令来获取文件)
用大量空字符或其他字符填充请求
FileZilla通常绑定到FileZilla-Server (端口 14147)的本地管理服务。如果您可以从您的机器创建一个隧道来访问此端口,您可以使用空白密码*连接到它并为 FTP 服务创建一个新用户。
ftpusers
ftp.conf
proftpd.conf
vsftpd.conf
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
ftp
port:21
Protocol_Name: FTP #协议缩写(如果有的话)。
Port_Number: 21 #如果有多个,则用逗号分隔。
Protocol_Description: File Transfer Protocol #协议缩写
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"[email protected]'
^^to download all dirs and files
wget --no-passive-ftp --mirror 'ftp://anonymous:[email protected]'
if PASV transfer is disabled
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:[email protected]{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'