hacktricks/network-services-pentesting/pentesting-ftp/README.md

19 KiB
Raw Blame History

21 - FTPのペンテスト

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

最も重要な脆弱性を見つけて、より速く修正できるようにしましょう。Intruderは、攻撃対象の範囲を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリ、クラウドシステムまで、技術スタック全体で問題を見つけます。無料でお試しください

{% 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/

接続のデバッグ

FTPコマンド**debugtrace**を使用すると、通信の方法を確認できます。

列挙

バナーグラビング

nc -vn <IP> 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 <hostname>
    

    Replace <hostname> 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 <user|URL> [<pass>]
lftp 10.10.10.208:~> login username Password

非認証列挙

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 ユーザー名
  • 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にアップロードします

FTPBounce攻撃

一部のFTPサーバーでは、PORTコマンドを許可しています。このコマンドを使用して、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まで同じリクエストを繰り返し送信します。次のように:

{% file src="../../.gitbook/assets/posts (1).txt" %} posts.txt {% endfile %}

  • プロトコルに関連する「ジャンク」データでリクエストを埋めるFTPに話しかける場合はジャンクコマンドだけまたはRETR命令を繰り返すことでファイルを取得する)
  • 単にヌル文字やその他の文字でリクエストを埋める(行ごとに分割するかどうか)

とにかく、ここには古い例があります。FTPサーバーが別のFTPサーバーからファイルをダウンロードするようにするためにこれを悪用する方法について説明されています。

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アプリまでクラウドシステム全体にわたる問題を見つけます。無料でお試しください

{% 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 🎥