hacktricks/network-services-pentesting/pentesting-ftp
2024-05-05 22:03:00 +00:00
..
ftp-bounce-attack.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 22:03:00 +00:00
ftp-bounce-download-2oftp-file.md Translated ['network-services-pentesting/11211-memcache/README.md', 'net 2024-02-09 08:58:25 +00:00
README.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 22:03:00 +00:00

21 - 渗透测试 FTP

从零开始学习 AWS 黑客技术,成为专家 htARTEHackTricks AWS 红队专家)

Try Hard Security Group

{% embed url="https://discord.gg/tryhardsecurity" %}


基本信息

文件传输协议FTP 用作服务器和客户端之间在计算机网络上进行文件传输的标准协议。
它是一种明文协议,使用换行字符 0x0d 0x0a,因此有时您需要使用 telnetnc -C 进行连接。

默认端口: 21

PORT   STATE SERVICE
21/tcp open  ftp

连接的主动和被动方式

主动FTPFTP 客户端首先从其端口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

未授权枚举

使用 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

自动化

默认情况下nmap使用**-sC**选项执行匿名登录和反弹FTP检查

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服务器与IP 127.0.0.1的80端口建立连接需要将第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

FTPBounce攻击

一些FTP服务器允许使用PORT命令。此命令可用于指示服务器您希望连接到其他FTP服务器的某个端口。然后您可以使用此方法通过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**。就像这样:

{% 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

后渗透

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自动命令

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'
从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS Red Team Expert