# 21 - FTPのペンテスト
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* **サイバーセキュリティ会社**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **ハッキングのトリックを共有するには、[hacktricks repo](https://github.com/carlospolop/hacktricks)と[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出してください。
最も重要な脆弱性を見つけて、より速く修正できるようにしましょう。Intruderは、攻撃対象の範囲を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリ、クラウドシステムまで、技術スタック全体で問題を見つけます。[**無料でお試しください**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
***
## 基本情報
**ファイル転送プロトコル(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 **サーバー**は、FTPクライアントのポートN+1へのデータ**接続**を**初期化**します。
ただし、FTPクライアントに外部からの着信データ接続を制御するファイアウォールが設定されている場合、アクティブFTPは問題になる可能性があります。そのため、パッシブFTPは実現可能な解決策です。
**パッシブFTP**では、クライアントはポートNからFTPサーバーのポート21への制御接続を初期化します。その後、クライアントは**passvコマンド**を発行します。サーバーはクライアントに自身のポート番号Mのいずれかを送信します。そして、**クライアント**は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に接続する
To connect to an FTP server using Starttls, you can follow the steps below:
1. Open a terminal or command prompt and type the following command:
```
ftp
```
Replace `` with the hostname or IP address of the FTP server you want to connect to.
2. Once connected, you will see the FTP prompt. Type the following command to enable Starttls:
```
prot p
```
This command sets the data channel protection level to private.
3. Next, type the following command to initiate the Starttls negotiation:
```
ccc
```
This command switches the FTP control connection to plaintext.
4. Finally, type the following command to secure the control connection using Starttls:
```
auth tls
```
This command enables Starttls on the control connection.
5. You are now connected to the FTP server using Starttls. You can proceed with any FTP commands you need to execute.
Note: Make sure the FTP server supports Starttls before attempting to connect using this method.
```
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
```
### 非認証列挙
**nmap**を使用してください。
```bash
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_
```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-methodologies-and-resources/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
```
## ブラウザ接続
ブラウザ(例:Firefox)を使用して、次のようなURLを使用してFTPサーバーに接続することができます:
```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 ユーザー名`**
* **`PASS パスワード`**
* **`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**接続から受信したデータをファイルに保存するようFTPに指示します。ファイル名が存在する場合、データを追加します。
* **`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にアップロードします
![](<../../.gitbook/assets/image (227).png>)
## FTPBounce攻撃
一部のFTPサーバーでは、PORTコマンドを許可しています。このコマンドを使用して、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 src="../../.gitbook/assets/posts (1).txt" %}
posts.txt
{% endfile %}
* プロトコルに関連する「ジャンク」データでリクエストを**埋める**(FTPに話しかける場合はジャンクコマンドだけまたは`RETR`命令を繰り返すことでファイルを取得する)
* 単に**ヌル文字やその他の文字でリクエストを埋める**(行ごとに分割するかどうか)
とにかく、ここには[古い例があります。FTPサーバーが別のFTPサーバーからファイルをダウンロードするようにするためにこれを悪用する方法について](ftp-bounce-download-2oftp-file.md)説明されています。
## Filezilla Serverの脆弱性
**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`
最も重要な脆弱性を見つけて修正を迅速に行いましょう。Intruderは攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリまでクラウドシステム全体にわたる問題を見つけます。[**無料でお試しください**](https://www.intruder.io/?utm_source=referral&utm_campaign=hacktricks)。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
***
## 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'
```
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* **サイバーセキュリティ会社**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出してください。