21 - Pentesting FTP

Support HackTricks

基本情報

ファイル転送プロトコル (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の1つを送信します。そして、クライアント自分のポート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

FTPサーバーの情報を取得するには、HELP および FEAT コマンドを使用できます:

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

注意すべきは、ウェブアプリケーションがユーザーによって制御されるデータを直接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番目を10進数でポートとして指定するか、5番目と6番目を使ってポートを16進数で表現する必要があります)。

  • **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サーバーを介してホストのどのポートが開いているかをスキャンできます。

ここでFTPサーバーを悪用してポートをスキャンする方法を学びましょう。

この動作を悪用して、FTPサーバーを他のプロトコルと相互作用させることもできます。HTTPリクエストを含むファイルをアップロードし、脆弱なFTPサーバーに任意のHTTPサーバーに送信させることができます(新しい管理者ユーザーを追加するため?)または、FTPリクエストをアップロードして脆弱なFTPサーバーに別のFTPサーバーからファイルをダウンロードさせることもできます。 理論は簡単です:

  1. 脆弱なサーバーにリクエスト(テキストファイル内)をアップロードします。 他のHTTPまたはFTPサーバーと通信したい場合は、0x0d 0x0aで行を変更する必要があることを忘れないでください。

  2. REST Xを使用して送信したくない文字を送信しないようにしますリクエストをファイル内にアップロードするために、最初にいくつかの画像ヘッダーを入れる必要があるかもしれません

  3. PORTを使用して任意のサーバーとサービスに接続します

  4. RETRを使用して保存されたリクエストをサーバーに送信します。

これはソケットが書き込み可能ではないというエラーを引き起こす可能性が非常に高いです。接続がRETRでデータを送信するのに十分長くないためです。これを回避するための提案は:

  • HTTPリクエストを送信している場合、同じリクエストを次々と送信します、少なくとも**~0.5MB**まで。次のように:

  • プロトコルに関連する「ジャンク」データでリクエストを埋めることを試みます(FTPと話す場合は、ジャンクコマンドやRETR命令を繰り返してファイルを取得すること)

  • リクエストを多くのヌル文字や他の文字で埋める(行で分けるかどうかは問わず)

いずれにせよ、ここに異なる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