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 &#xNAN;anonymous : &#xNAN;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リクエストを送信している場合、同じリクエストを1つの後にもう1つ、少なくとも**~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)