hacktricks/network-services-pentesting/pentesting-ftp
2023-07-07 23:42:27 +00:00
..
ftp-bounce-attack.md Translated to Japanese 2023-07-07 23:42:27 +00:00
ftp-bounce-download-2oftp-file.md Translated to Japanese 2023-07-07 23:42:27 +00:00
README.md Translated to Japanese 2023-07-07 23:42:27 +00:00

21 - FTPのペンテスト

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

基本情報

ファイル転送プロトコル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, follow these steps:

  1. Open a terminal or command prompt.
  2. Use the ftp command followed by the IP address or domain name of the FTP server you want to connect to. For example:
    ftp 192.168.0.1
    
  3. Enter your FTP username and password when prompted.
  4. Once connected, use the quote command to send the AUTH TLS command to the server. This will initiate the Starttls negotiation. For example:
    quote AUTH TLS
    
  5. If the server supports Starttls, it will respond with a message indicating that the TLS negotiation was successful.
  6. After the TLS negotiation, you can use the usual FTP commands to interact with the server.

Note: Some FTP clients may have a specific command or option to enable Starttls. Refer to the documentation of your FTP client for more information.

Starttlsを使用してFTPに接続する方法

Starttlsを使用してFTPサーバーに接続するには、以下の手順に従ってください。

  1. ターミナルまたはコマンドプロンプトを開きます。
  2. ftpコマンドの後に接続したいFTPサーバーのIPアドレスまたはドメイン名を入力します。例
    ftp 192.168.0.1
    
  3. プロンプトが表示されたら、FTPのユーザー名とパスワードを入力します。
  4. 接続が確立したら、quoteコマンドを使用してAUTH TLSコマンドをサーバーに送信します。これにより、Starttlsの交渉が開始されます。例
    quote AUTH TLS
    
  5. サーバーがStarttlsをサポートしている場合、TLSの交渉が成功したことを示すメッセージが返されます。
  6. TLSの交渉後、通常のFTPコマンドを使用してサーバーとやり取りすることができます。

注意一部のFTPクライアントには、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 <user|URL> [<pass>]
lftp 10.10.10.208:~> login username Password

非認証列挙

nmapを使用してください。

sudo nmap -sV -p21 -sC -A 10.10.10.10

FTPサーバーの情報を取得するために、HELPFEATコマンドを使用することができます。

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

いくつかの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

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 🎥