# 21 - Pentesting FTP {{#include ../../banners/hacktricks-training.md}} ## 基本情報 **ファイル転送プロトコル (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/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/) ### 接続デバッグ **FTP**コマンド**`debug`**と**`trace`**を使用して、**通信がどのように行われているか**を確認できます。 ## 列挙 ### バナーグラビング ```bash nc -vn 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 [] lftp 10.10.10.208:~> login username Password ``` ### Unauth enum **nmap**を使用して ```bash 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_ ```bash ftp >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 ``` ### [ブルートフォース](../../generic-hacking/brute-force.md#ftp) ここでは、デフォルトのFTP認証情報の素晴らしいリストを見つけることができます: [https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt) ### 自動化 匿名ログインとバウンスFTPチェックは、nmapの**-sC**オプションを使用してデフォルトで実行されます。 ```bash nmap --script ftp-* -p 21 ``` ## ブラウザ接続 You can connect to a FTP server using a browser (like Firefox) using a URL like: ```bash ftp://anonymous:anonymous@10.10.10.98 ``` 注意すべきは、**ウェブアプリケーション**がユーザーによって制御されるデータを**直接FTPサーバー**に送信している場合、ダブルURLエンコードされた`%0d%0a`(ダブルURLエンコードでは`%250d%250a`)バイトを送信することで、**FTPサーバーが任意のアクションを実行**する可能性があることです。この任意のアクションの一つは、ユーザーが制御するサーバーからコンテンツをダウンロードしたり、ポートスキャンを実行したり、他のプレーンテキストベースのサービス(例えばhttp)と通信を試みたりすることです。 ## FTPからすべてのファイルをダウンロードする ```bash wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all ``` ユーザー名/パスワードに特殊文字が含まれている場合、[以下のコマンド](https://stackoverflow.com/a/113900/13647948)を使用できます: ```bash 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にアップロードします ![](<../../images/image (386).png>) ## FTPバウンス攻撃 一部のFTPサーバーはPORTコマンドを許可します。このコマンドは、サーバーに他のFTPサーバーの特定のポートに接続したいことを示すために使用できます。これを使用して、FTPサーバーを介してホストのどのポートが開いているかをスキャンできます。 [**ここでFTPサーバーを悪用してポートをスキャンする方法を学びましょう。**](ftp-bounce-attack.md) この動作を悪用して、FTPサーバーを他のプロトコルと対話させることもできます。**HTTPリクエストを含むファイルをアップロード**し、脆弱なFTPサーバーに**任意のHTTPサーバーに送信させる**ことができます(_新しい管理ユーザーを追加するため?_)または、FTPリクエストをアップロードして脆弱なFTPサーバーに別のFTPサーバーからファイルをダウンロードさせることもできます。\ 理論は簡単です: 1. **リクエスト(テキストファイル内)を脆弱なサーバーにアップロードします。** 他のHTTPまたはFTPサーバーと通信する場合は、`0x0d 0x0a`で行を変更する必要があることを忘れないでください。 2. **`REST X`を使用して送信したくない文字を送信しないようにします**(おそらくリクエストをファイル内にアップロードするために、最初にいくつかの画像ヘッダーを入れる必要がありました)。 3. **`PORT`を使用して任意のサーバーとサービスに接続します** 4. **`RETR`を使用して保存されたリクエストをサーバーに送信します。** これは**_**ソケットが書き込み可能ではない**_**というエラーを引き起こす可能性が非常に高いです。**接続が`RETR`でデータを送信するのに十分な時間がないためです**。これを回避するための提案は次のとおりです: - HTTPリクエストを送信している場合、**同じリクエストを次々と送信します**、少なくとも**\~0.5MB**まで。次のように: {{#file}} posts.txt {{#endfile}} - **プロトコルに関連する「ジャンク」データでリクエストを埋める**(FTPに話しかける場合は、ジャンクコマンドや`RETR`命令を繰り返してファイルを取得すること) - **リクエストを多くのヌル文字やその他のもので埋める**(行で分けるかどうかは問わず) いずれにせよ、ここに[異なるFTPサーバーからファイルをダウンロードするためにこれを悪用する古い例があります。](ftp-bounce-download-2oftp-file.md) ## 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` ## 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.wiki/en/network-services-pentesting/pentesting-ftp/index.html 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' ``` {{#include ../../banners/hacktricks-training.md}}