21 - Pentesting FTP

Support HackTricks

Temel Bilgiler

Dosya Transfer Protokolü (FTP), bir sunucu ile bir istemci arasında bir bilgisayar ağı üzerinden dosya transferi için standart bir protokol olarak hizmet eder. Bu, düz metin protokolüdür ve yeni satır karakteri 0x0d 0x0a kullanır, bu nedenle bazen telnet veya nc -C kullanarak bağlanmanız gerekebilir.

Varsayılan Port: 21

PORT   STATE SERVICE
21/tcp open  ftp

Bağlantılar Aktif & Pasif

Aktif FTP'de FTP istemcisi önce kontrol bağlantısını kendi N portundan FTP Sunucusunun komut portuna - port 21'e başlatır. İstemci daha sonra N+1 portunu dinler ve N+1 portunu FTP Sunucusuna gönderir. FTP Sunucusu daha sonra veri bağlantısını M portundan FTP İstemcisinin N+1 portuna başlatır.

Ancak, eğer FTP İstemcisinin dışarıdan gelen veri bağlantılarını kontrol eden bir güvenlik duvarı varsa, o zaman aktif FTP bir sorun olabilir. Bunun için uygulanabilir bir çözüm Pasif FTP'dir.

Pasif FTP'de istemci kontrol bağlantısını kendi N portundan FTP Sunucusunun 21 portuna başlatır. Bunun ardından istemci bir passv komutu gönderir. Sunucu daha sonra istemciye kendi port numarasından birini M gönderir. Ve istemci veri bağlantısını P portundan FTP Sunucusunun M portuna başlatır.

Kaynak: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/

Bağlantı hata ayıklama

FTP komutları debug ve trace ile iletişimin nasıl gerçekleştiğini görebilirsiniz.

Sayım

Afiş Alma

nc -vn <IP> 21
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any

Starttls kullanarak FTP'ye bağlanın

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

Unauth enum

nmap ile

sudo nmap -sV -p21 -sC -A 10.10.10.10

FTP sunucusundan bazı bilgileri almak için HELP ve FEAT komutlarını kullanabilirsiniz:

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 login

anonymous : anonim 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

Burada varsayılan ftp kimlik bilgileriyle ilgili güzel bir liste bulabilirsiniz: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt

Automated

Anon giriş ve bounce FTP kontrolleri, nmap ile varsayılan olarak -sC seçeneğiyle gerçekleştirilir veya:

nmap --script ftp-* -p 21 <ip>

Tarayıcı bağlantısı

Bir FTP sunucusuna bir URL kullanarak (Firefox gibi) bağlanabilirsiniz:

ftp://anonymous:anonymous@10.10.10.98

Not edin ki eğer bir web uygulaması kullanıcı tarafından kontrol edilen verileri doğrudan bir FTP sunucusuna gönderiyorsa, çift URL kodlaması %0d%0a (çift URL kodlamada bu %250d%250a) baytlarını gönderebilir ve FTP sunucusunun keyfi eylemler gerçekleştirmesini sağlayabilirsiniz. Bu olası keyfi eylemlerden biri, bir kullanıcının kontrolündeki sunucudan içerik indirmek, port taraması yapmak veya diğer düz metin tabanlı hizmetlerle (örneğin http) iletişim kurmaya çalışmaktır.

FTP'den tüm dosyaları indirin

wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all
wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all

Eğer kullanıcı/adınızda özel karakterler varsa, aşağıdaki komut kullanılabilir:

wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/

Bazı FTP komutları

  • USER kullanıcı_adı

  • PASS şifre

  • HELP Sunucu hangi komutların desteklendiğini belirtir

  • **PORT 127,0,0,1,0,80** Bu, FTP sunucusuna 127.0.0.1 IP'si ile 80 numaralı portta bir bağlantı kurmasını belirtir (5. karakteri "0" ve 6. karakteri ondalık olarak port olarak koymalısınız ya da 5. ve 6. karakteri hex olarak portu ifade etmek için kullanmalısınız).

  • **EPRT |2|127.0.0.1|80|** Bu, FTP sunucusuna 127.0.0.1 IP'si ile 80 numaralı portta bir TCP bağlantısı kurmasını belirtir ("2" ile belirtilmiştir). Bu komut IPv6 destekler.

  • LIST Bu, mevcut klasördeki dosyaların listesini gönderir

  • LIST -R Rekürsif listeleme (sunucu tarafından izin verilirse)

  • APPE /path/something.txt Bu, FTP'ye pasif bir bağlantıdan veya PORT/EPRT bağlantısından alınan verileri bir dosyaya kaydetmesini belirtir. Dosya adı mevcutsa, verileri ekler.

  • STOR /path/something.txt APPE gibi ama dosyaları üzerine yazar

  • STOU /path/something.txt APPE gibi, ama mevcutsa hiçbir şey yapmaz.

  • RETR /path/to/file Pasif veya bir port bağlantısı kurulmalıdır. Ardından, FTP sunucusu belirtilen dosyayı bu bağlantı üzerinden gönderir

  • REST 6 Bu, sunucuya bir sonraki RETR kullanıldığında 6. bayttan başlaması gerektiğini belirtir.

  • TYPE i Transferi ikili olarak ayarlar

  • PASV Bu, pasif bir bağlantı açar ve kullanıcıya nereden bağlanabileceğini belirtir

  • PUT /tmp/file.txt Belirtilen dosyayı FTP'ye yükler

FTPBounce saldırısı

Bazı FTP sunucuları PORT komutuna izin verir. Bu komut, sunucuya başka bir FTP sunucusuna belirli bir portta bağlanmak istediğinizi belirtmek için kullanılabilir. Ardından, bunu bir FTP sunucusu aracılığıyla bir ana bilgisayarın hangi portlarının açık olduğunu taramak için kullanabilirsiniz.

Burada bir FTP sunucusunu kullanarak portları nasıl tarayacağınızı öğrenin.

Bu davranışı, bir FTP sunucusunun diğer protokollerle etkileşimde bulunmasını sağlamak için de kötüye kullanabilirsiniz. Bir HTTP isteği içeren bir dosya yükleyebilir ve savunmasız FTP sunucusunun bunu rastgele bir HTTP sunucusuna göndermesini sağlayabilirsiniz (belki yeni bir yönetici kullanıcısı eklemek için?) veya hatta bir FTP isteği yükleyip savunmasız FTP sunucusunun farklı bir FTP sunucusundan bir dosya indirmesini sağlayabilirsiniz. Teori basit:

  1. İsteği (bir metin dosyası içinde) savunmasız sunucuya yükleyin. Başka bir HTTP veya FTP sunucusuyla konuşmak istiyorsanız, satırları 0x0d 0x0a ile değiştirmeniz gerektiğini unutmayın

  2. Göndermek istemediğiniz karakterleri göndermemek için REST X kullanın (belki isteği dosya içinde yüklemek için başta bazı resim başlıkları koymanız gerekiyordu)

  3. Rastgele sunucu ve hizmete bağlanmak için PORT kullanın

  4. Kaydedilen isteği sunucuya göndermek için RETR kullanın.

Bu hata verecektir Socket yazılabilir değil çünkü bağlantı, verileri RETR ile göndermek için yeterince uzun sürmez. Bunu önlemeye çalışmak için öneriler:

  • Eğer bir HTTP isteği gönderiyorsanız, aynı isteği birbiri ardına koyun en az ~0.5MB kadar. Böylece:

  • İsteği protokole göre "çöp" verilerle doldurmaya çalışın (FTP ile konuşurken belki sadece çöp komutlar veya dosyayı almak için RETR talimatını tekrarlamak)

  • Sadece isteği birçok null karakter veya diğerleriyle doldurun (satırlara bölünmüş veya bölünmemiş)

Her neyse, burada bu davranışı kullanarak bir FTP sunucusunun farklı bir FTP sunucusundan bir dosya indirmesi hakkında eski bir örnek var.

Filezilla Sunucu Açığı

FileZilla genellikle yerel bir Yönetim hizmetine FileZilla-Server için (port 14147) bağlanır. Eğer makinenizden bu porta erişmek için bir tünel oluşturabilirseniz, boş bir şifre kullanarak bağlanabilir ve FTP hizmeti için yeni bir kullanıcı oluşturabilirsiniz.

Konfigürasyon dosyaları

ftpusers
ftp.conf
proftpd.conf
vsftpd.conf

Post-Exploitation

vsFTPd'nin varsayılan yapılandırması /etc/vsftpd.conf dosyasında bulunabilir. Burada bazı tehlikeli ayarları bulabilirsiniz:

  • anonymous_enable=YES

  • anon_upload_enable=YES

  • anon_mkdir_write_enable=YES

  • anon_root=/home/username/ftp - Anonim için dizin.

  • chown_uploads=YES - Anonim olarak yüklenen dosyaların sahipliğini değiştir

  • chown_username=username - Anonim olarak yüklenen dosyaların sahipliğini alan kullanıcı

  • local_enable=YES - Yerel kullanıcıların giriş yapmasına izin ver

  • no_anon_password=YES - Anonimden şifre isteme

  • write_enable=YES - Aşağıdaki komutlara izin ver: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE ve SITE

Shodan

  • ftp

  • port:21

HackTricks Automatic Commands

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'i Destekleyin

Last updated