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

15 KiB
Raw Blame History

21 - FTP Pentesting

Sıfırdan kahraman olacak şekilde AWS hacklemeyi öğrenin htARTE (HackTricks AWS Red Team Expert) ile!

Try Hard Security Group

{% embed url="https://discord.gg/tryhardsecurity" %}


Temel Bilgiler

Dosya Transfer Protokolü (FTP), bir sunucu ve bir istemci arasında bir bilgisayar ağı üzerinde dosya transferi için standart bir protokol olarak hizmet verir.
Düz metin protokolüdür ve bazen telnet veya nc -C kullanarak bağlantı kurmanız gerekebilir.

Varsayılan Port: 21

PORT   STATE SERVICE
21/tcp open  ftp

Bağlantılar Aktif ve Pasif

Aktif FTP'de FTP istemcisi önce kontrol bağlantısını port N'sinden FTP Sunucusunun komut portuna - port 21'e başlatır. İstemci daha sonra port N+1'i dinler ve port N+1'i FTP Sunucusuna gönderir. FTP Sunucusu daha sonra veri bağlantısını, kendi M portundan istemcinin 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ı kurulumu varsa, aktif FTP bir sorun olabilir. Ve, bunun için uygun bir çözüm Pasif FTP'dir.

Pasif FTP'de, istemci kontrol bağlantısını port N'sinden FTP Sunucusunun 21 numaralı portuna başlatır. Bundan sonra, istemci bir passv komutu verir. Sunucu daha sonra istemciye kendi bir port numarası M'sini gönderir. Ve istemci, veri bağlantısını kendi 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 kullanılarak iletişimin nasıl gerçekleştiğini görmek için kullanılabilir.

Numaralandırma

Banner Yakalama

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

FTP'ye starttls kullanarak bağlanma

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

Yetkisiz enum

nmap ile

sudo nmap -sV -p21 -sC -A 10.10.10.10

FTP sunucusu hakkında bazı bilgileri elde etmek 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...)

Anonim Giriş

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

Kaba kuvvet saldırısı

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

Otomatik

Anonim giriş ve bounce FTP kontrolleri varsayılan olarak nmap tarafından -sC seçeneği ile veya:

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

Tarayıcı bağlantısı

Bir FTP sunucusuna bir tarayıcı (örneğin Firefox) kullanarak şu URL'yi kullanarak bağlanabilirsiniz:

ftp://anonymous:anonymous@10.10.10.98

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

FTP'den tüm dosyaları indir

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ı/şifreniz özel karakterler içeriyorsa, 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 desteklediği komutları gösterir
  • **PORT 127,0,0,1,0,80**Bu, FTP sunucusuna 127.0.0.1 IP'si ve 80 numaralı bağlantıyı kurması için işaret eder (5. karakteri "0" ve 6. karakteri portu ondalık olarak belirtmelisiniz veya 5. ve 6. karakterleri kullanarak portu onaltılık olarak ifade edebilirsiniz).
  • **EPRT |2|127.0.0.1|80|**Bu, FTP sunucusuna 127.0.0.1 IP'si ve 80 numaralı bağlantıyı kurması için işaret eder. Bu komut IPv6 destekler.
  • LIST Bu, mevcut klasördeki dosyaların listesini gönderir
  • LIST -R Yinelemeli olarak listeler (sunucu izin veriyorsa)
  • APPE /yol/birşey.txt Bu, FTP'yi bir dosyaya pasif bir bağlantıdan veya PORT/EPRT bağlantısından gelen verileri depolamak için işaret eder. Dosya adı varsa, verileri ekler.
  • STOR /yol/birşey.txt APPE gibi ancak dosyaları üzerine yazar
  • STOU /yol/birşey.txt APPE gibi, ancak varsa hiçbir şey yapmaz.
  • RETR /dosya/yol Bir pasif veya port bağlantısı kurulmalıdır. Daha sonra, FTP sunucusu belirtilen dosyayı o bağlantı üzerinden gönderecektir
  • REST 6 Bu, sunucuya bir sonraki sefer RETR kullanarak bir şey gönderdiğinde 6. bayttan başlaması gerektiğini belirtir.
  • TYPE i Transferi ikili olarak ayarlar
  • PASV Bu, pasif bir bağlantı açacak ve kullanıcıya nereye bağlanabileceğini gösterecektir
  • PUT /tmp/dosya.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 bağlantı noktasından bağlanmak istediğinizi belirtmek için kullanılabilir. Ardından, bu, bir FTP sunucusu aracılığıyla bir ana bilgisayarın hangi bağlantı noktalarının açık olduğunu taramak için kullanılabilir.

FTP sunucusunu bağlantı noktalarını taramak için nasıl kötüye kullanabileceğinizi buradan öğrenin.

Bu davranışı kötüye kullanarak bir FTP sunucusunu başka protokollerle etkileşime girmesi için de kullanabilirsiniz. Bir HTTP isteği içeren bir dosyayı yükleyebilir ve zayıf FTP sunucusunun bunu bir başka HTTP sunucusuna göndermesini sağlayabilirsiniz (belki yeni bir yönetici kullanıcı eklemek için?) veya bir FTP isteği yükleyebilir ve zayıf FTP sunucusunun farklı bir FTP sunucusundan bir dosya indirmesini sağlayabilirsiniz.
Teori basittir:

  1. İsteği (bir metin dosyası içinde) zayıf sunucuya yükleyin. Başka bir HTTP veya FTP sunucusuyla iletişim kurmak istiyorsanız, satırları 0x0d 0x0a ile değiştirmeniz gerekir
  2. Göndermek istemediğiniz karakterleri göndermemek için REST X kullanın (belki dosyanın içine isteği yüklemek için başlangıçta bazı görüntü başlığı eklemeniz gerekiyordur)
  3. Arbitrary sunucuya ve servise bağlanmak için PORT kullanın
  4. Kaydedilen isteği sunucuya göndermek için RETR kullanın.

Bu, muhtemelen Yazılabilir soket değil gibi bir hata verecektir çünkü bağlantı, verileri RETR ile göndermek için yeterince uzun sürmez. Bunun önüne geçmek için denemeniz gereken öneriler şunlardır:

  • Bir HTTP isteği gönderiyorsanız, en azından ~0.5MB'a kadar aynı isteği tekrarlayın. Şöyle:

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

  • İsteği, protokole göre "gereksiz" verilerle doldurmaya çalışın (FTP ile iletişim kurarken belki sadece gereksiz komutlar veya dosyayı almak için RETR komutunu tekrarlayın)
  • İsteği, satırlara veya satırlara bölünmüş bir şekilde çok sayıda null karakter veya başka karakterlerle doldurun

Neyse, burada bir FTP sunucusunun farklı bir FTP sunucusundan bir dosya indirmesini sağlamak için bunu nasıl kötüye kullanacağınıza dair eski bir örnek bulunmaktadır.

Filezilla Sunucu Güvenlik Açığı

FileZilla genellikle yerel bir Yönetimsel hizmet için FileZilla-Server'a (port 14147) bağlanır. Bu bağlantı noktasına erişmek için kendi makinenizden bir tünel oluşturabilirseniz, boş bir şifre kullanarak buna bağlanabilir ve FTP hizmeti için yeni bir kullanıcı oluşturabilirsiniz.

Yapılandırma dosyaları

ftpusers
ftp.conf
proftpd.conf
vsftpd.conf

Saldırı Sonrası

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 sahibi olan 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 - Komutlara izin ver: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE ve SITE

Shodan

  • ftp
  • port:21

Try Hard Güvenlik Grubu

{% embed url="https://discord.gg/tryhardsecurity" %}


HackTricks Otomatik Komutları

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'
AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Red Team Expert)!