Skip to content

21 Pentesting FTP

Basic Information


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

Default Port: 21

Connections Active & Passive(被动)

在主动 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 的数据连接。

Source: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/

Connection debugging

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

Enumeration


nc -vn <IP> 21

openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any

Connect to FTP using starttls

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

With 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 login

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

Brute force

字典 https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt

Automated(自动化)

Anon(匿名) login and bounce(弹跳) FTP checks are perform by default by nmap with -sC option or:

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

Browser connection


ftp://anonymous:anonymous@10.10.10.98

请注意,如果 Web 应用程序将用户控制的数据直接发送到 FTP 服务器,您可以发送双重 URL 编码 %0d%0a(在双重 URL 编码中为 %250d%250a)字节并使 FTP 服务器执行任意操作。其中一种可能的任意操作是从用户控制的服务器下载内容、执行端口扫描或尝试与其他基于纯文本的服务(如 http)通信。

Download all files from 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

Some FTP commands

FTP Bounce(反弹) attack


某些 FTP 服务器允许命令 PORT。此命令可用于向服务器指示您要在某个端口连接到其他 FTP 服务器。然后,您可以使用它通过 FTP 服务器扫描主机的哪些端口是打开的

Learn here how to abuse(滥用) a FTP server to scan ports.

您还可以滥用此行为使 FTP 服务器与其他协议交互。您可以上传一个包含 HTTP 请求的文件,并让易受攻击的 FTP 服务器将其发送到任意 HTTP 服务器(也许是为了添加一个新的管理员用户?) FTP服务器。 理论很简单: 1. 将请求(在文本文件中)上传到易受攻击的服务器。请记住,如果您想与另一个 HTTP 或 FTP 服务器通信,您需要将行更改为 0x0d 0x0a 2. 使用 REST X 避免发送您不想发送的字符(也许将请求上传到您需要在开头放置一些图像标题的文件中) 3. 使用PORT连接任意服务器和服务 4. 使用 RETR 将保存的请求发送到服务器。

这很可能会引发类似 Socket not writable 的错误,因为连接持续时间不足以使用 RETR 发送数据。尽量避免的建议是: - 如果您要发送 HTTP 请求,请一个接一个地发送相同的请求,直到至少 ~0.5MB。像这样:

port.txt [[网络安全/Users/dark/Downloads/posts.txt]]

  • 尝试用与协议相关的“垃圾”数据填充请求(与 FTP 通信可能只是垃圾命令或重复 RETRinstruction 以获取文件)
  • 只需在请求中填充大量空字符或其他字符(分行或不分行)

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

Filezilla Server Vulnerability

FileZilla 通常绑定到 FileZilla-Server(端口 14147)的本地管理服务。如果您可以从您的机器创建一个隧道来访问此端口,您可以使用空白密码连接到它并为 FTP 服务创建一个新用户。

Config files

ftpusers

ftp.conf

proftpd.conf

vsftpd.conf

Post-Exploitation(开发后)

vsFTPd 的默认配置可以在 /etc/vsftpd.conf 中找到。在这里,您可以找到一些危险的设置: ![[Pasted image 20221120111537.png]]

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'