21 - Pentesting FTP
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
ファイル転送プロトコル (FTP) は、サーバーとクライアント間でコンピュータネットワークを介してファイルを転送するための標準プロトコルです。
これはプレーンテキストプロトコルで、改行文字 0x0d 0x0a
を使用するため、時には**telnet
またはnc -C
を使用して接続する必要があります**。
デフォルトポート: 21
アクティブ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コマンド**debug
とtrace
を使用して通信がどのように行われているか**を確認できます。
nmapを使用して
FTPサーバーの情報を取得するには、HELP
および FEAT
コマンドを使用できます:
anonymous : anonymous anonymous : ftp : ftp
ここでは、デフォルトのFTP認証情報の素晴らしいリストを見つけることができます: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt
匿名ログインとバウンスFTPチェックは、nmapの**-sC**オプションを使用してデフォルトで実行されます:
ブラウザ(Firefoxなど)を使用して、次のようなURLでFTPサーバーに接続できます:
注意すべきは、ウェブアプリケーションがユーザーによって制御されるデータを直接FTPサーバーに送信している場合、ダブルURLエンコードされた%0d%0a
(ダブルURLエンコードでは%250d%250a
)バイトを送信することで、FTPサーバーが任意のアクションを実行することができるということです。この任意のアクションの一つは、ユーザーが制御するサーバーからコンテンツをダウンロードしたり、ポートスキャンを実行したり、他のプレーンテキストベースのサービス(例えばhttp)と通信を試みたりすることです。
もしあなたのユーザー名/パスワードに特殊文字が含まれている場合、次のコマンドを使用できます:
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サーバーはPORTコマンドを許可します。このコマンドは、サーバーに他のFTPサーバーの特定のポートに接続したいことを示すために使用できます。これを使用して、FTPサーバーを介してホストのどのポートが開いているかをスキャンできます。
ここでFTPサーバーを悪用してポートをスキャンする方法を学びましょう。
この動作を悪用して、FTPサーバーを他のプロトコルと相互作用させることもできます。HTTPリクエストを含むファイルをアップロードし、脆弱なFTPサーバーに任意のHTTPサーバーに送信させることができます(新しい管理者ユーザーを追加するため?)または、FTPリクエストをアップロードして脆弱なFTPサーバーに別のFTPサーバーからファイルをダウンロードさせることもできます。 理論は簡単です:
脆弱なサーバーにリクエスト(テキストファイル内)をアップロードします。 他のHTTPまたはFTPサーバーと通信したい場合は、0x0d 0x0a
で行を変更する必要があることを忘れないでください。
REST X
を使用して送信したくない文字を送信しないようにします(リクエストをファイル内にアップロードするために、最初にいくつかの画像ヘッダーを入れる必要があるかもしれません)
PORT
を使用して任意のサーバーとサービスに接続します
RETR
を使用して保存されたリクエストをサーバーに送信します。
これはソケットが書き込み可能ではないというエラーを引き起こす可能性が非常に高いです。接続がRETR
でデータを送信するのに十分長くないためです。これを回避するための提案は:
HTTPリクエストを送信している場合、同じリクエストを次々と送信します、少なくとも**~0.5MB**まで。次のように:
プロトコルに関連する「ジャンク」データでリクエストを埋めることを試みます(FTPと話す場合は、ジャンクコマンドやRETR
命令を繰り返してファイルを取得すること)
リクエストを多くのヌル文字や他の文字で埋める(行で分けるかどうかは問わず)
いずれにせよ、ここに異なるFTPサーバーからファイルをダウンロードするためにこれを悪用する古い例があります。
FileZillaは通常、ローカルにFileZilla-Serverのための管理サービスをバインドします(ポート14147)。このポートにアクセスするためにあなたのマシンからトンネルを作成できれば、空のパスワードを使用して接続し、FTPサービスのために新しいユーザーを作成できます。
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
ftp
port:21
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)