mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
259 lines
12 KiB
Markdown
259 lines
12 KiB
Markdown
# 21 - Pentesting FTP
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## Temel Bilgiler
|
||
|
||
**File Transfer Protocol (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 M port numarasını 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/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
|
||
|
||
### Bağlantı hata ayıklama
|
||
|
||
**FTP** komutları **`debug`** ve **`trace`** iletişimin **nasıl gerçekleştiğini** görmek için kullanılabilir.
|
||
|
||
## Sayım
|
||
|
||
### Banner Alma
|
||
```bash
|
||
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
|
||
|
||
With **nmap**
|
||
```bash
|
||
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 : anonymous_\
|
||
\_anonymous :_\
|
||
\_ftp : ftp_
|
||
```bash
|
||
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
|
||
```
|
||
### [Brute force](../../generic-hacking/brute-force.md#ftp)
|
||
|
||
Burada varsayılan ftp kimlik bilgileriyle güzel bir liste bulabilirsiniz: [https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt)
|
||
|
||
### Automated
|
||
|
||
Anon giriş ve bounce FTP kontrolleri varsayılan olarak nmap ile **-sC** seçeneğiyle gerçekleştirilir:
|
||
```bash
|
||
nmap --script ftp-* -p 21 <ip>
|
||
```
|
||
## Tarayıcı bağlantısı
|
||
|
||
Bir FTP sunucusuna bir tarayıcı (Firefox gibi) kullanarak şu URL ile bağlanabilirsiniz:
|
||
```bash
|
||
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
|
||
```bash
|
||
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](https://stackoverflow.com/a/113900/13647948) kullanılabilir:
|
||
```bash
|
||
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
|
||
```
|
||
## Bazı FTP komutları
|
||
|
||
- **`USER username`**
|
||
- **`PASS password`**
|
||
- **`HELP`** Sunucu hangi komutların desteklendiğini belirtir
|
||
- **`PORT 127,0,0,1,0,80`** Bu, FTP sunucusuna IP 127.0.0.1 ile port 80'de 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 IP 127.0.0.1 ile port 80'de 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 liste (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ı o 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
|
||
|
||
.png>)
|
||
|
||
## 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.**](ftp-bounce-attack.md)
|
||
|
||
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 admin kullanıcı 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 sunucuya ve hizmete bağlanmak için `PORT` kullanın**
|
||
4. **Kaydedilen isteği sunucuya göndermek için `RETR` kullanın.**
|
||
|
||
Bu **bir hata verecektir** _**Socket not writable**_ **çü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öyle:
|
||
|
||
{{#file}}
|
||
posts.txt
|
||
{{#endfile}}
|
||
|
||
- **İ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 durumda, burada [bu davranışı kullanarak bir FTP sunucusunun farklı bir FTP sunucusundan bir dosya indirmesiyle ilgili eski bir örnek var.](ftp-bounce-download-2oftp-file.md)
|
||
|
||
## Filezilla Sunucu Açığı
|
||
|
||
**FileZilla** genellikle **yerel** bir **Yönetim hizmeti** için **FileZilla-Server**'a (port 14147) **bağlanır**. Eğer **makinenizden** bu porta erişmek için bir **tünel** oluşturabiliyorsanız, **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.wiki/en/network-services-pentesting/pentesting-ftp/index.html
|
||
|
||
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'
|
||
```
|
||
{{#include ../../banners/hacktricks-training.md}}
|