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

281 lines
14 KiB
Markdown
Raw Normal View History

2024-02-10 18:14:16 +00:00
# 21 - FTP Pentesting
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>AWS hackleme konusunda sıfırdan kahramana kadar öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile!</strong></summary>
2022-04-28 16:01:33 +00:00
* **Bir siber güvenlik şirketinde mi çalışıyorsunuz? Şirketinizin **HackTricks'te reklamını görmek ister misiniz**? Ya da **PEASS'ın en son sürümüne erişmek veya HackTricks'i PDF olarak indirmek ister misiniz**? [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* [**Resmi PEASS & HackTricks ürünlerini alın**](https://peass.creator-spring.com)
* **Katılın** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**'ı takip edin**.
* **Hacking püf noktalarınızı paylaşarak PR'ler göndererek** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **ve** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **ile katkıda bulunun**.
2022-04-28 16:01:33 +00:00
</details>
2024-02-10 18:14:16 +00:00
## 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.
2024-02-10 18:14:16 +00:00
**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'den 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 portu M'den FTP İstemcisinin portu N+1'e** başlatır.
2022-10-02 18:09:01 +00:00
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.
2022-10-02 18:09:01 +00:00
**Pasif FTP**'de, istemci kontrol bağlantısını port N'den FTP Sunucusunun port 21'ine başlatır. Bundan sonra, istemci bir **passv komutu** verir. Sunucu daha sonra istemciye kendi port numarasından M birini gönderir. Ve **istemci**, veri **bağlantısını** **kendi portu P'den FTP Sunucusunun portu M'ye** başlatır.
2022-10-02 18:09:01 +00:00
2024-02-10 18:14:16 +00:00
Kaynak: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
2022-10-02 18:09:01 +00:00
### Bağlantı Hata Ayıklama
2022-10-02 18:09:01 +00:00
**FTP** komutları **`debug`** ve **`trace`** kullanılarak **iletişimin nasıl gerçekleştiğini** görmek için kullanılabilir.
2022-10-02 18:09:01 +00:00
2024-02-10 18:14:16 +00:00
## Numaralandırma
2024-02-10 18:14:16 +00:00
### Banner Yakalama
```bash
2021-03-28 12:47:37 -04:00
nc -vn <IP> 21
2020-09-19 19:49:07 +00:00
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
```
2024-02-10 18:14:16 +00:00
### FTP'ye starttls kullanarak bağlanma
```
2021-03-25 11:29:43 +00:00
lftp
lftp :~> set ftp:ssl-force true
lftp :~> set ssl:verify-certificate no
lftp :~> connect 10.10.10.208
2024-02-10 18:14:16 +00:00
lftp 10.10.10.208:~> login
2021-03-25 11:29:43 +00:00
Usage: login <user|URL> [<pass>]
lftp 10.10.10.208:~> login username Password
```
2024-02-10 18:14:16 +00:00
### Yetkisiz enum
2021-03-25 11:29:43 +00:00
2024-02-10 18:14:16 +00:00
**nmap** ile
2022-10-02 18:09:01 +00:00
```bash
sudo nmap -sV -p21 -sC -A 10.10.10.10
```
Kullanabileceğiniz komutlar `HELP` ve `FEAT` FTP sunucusundan bazı bilgileri almak için:
```
HELP
214-The following commands are recognized (* =>'s unimplemented):
2024-02-10 18:14:16 +00:00
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
2022-10-02 18:09:01 +00:00
FEAT
211-Features:
2024-02-10 18:14:16 +00:00
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
2022-10-02 18:09:01 +00:00
STAT
#Info about the FTP server (version, configs, status...)
```
2024-02-10 18:14:16 +00:00
### Anonim giriş
_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
```
### [Kaba kuvvet saldırısı](../../generic-methodologies-and-resources/brute-force.md#ftp)
İşte 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)
2024-02-10 18:14:16 +00:00
### Otomatik
2021-07-06 18:13:26 +00:00
Anonim giriş ve bounce FTP kontrolleri varsayılan olarak nmap tarafından **-sC** seçeneği ile veya:
2021-07-06 18:13:26 +00:00
```bash
nmap --script ftp-* -p 21 <ip>
```
2024-02-10 18:14:16 +00:00
## Tarayıcı bağlantısı
Bir FTP sunucusuna tarayıcı (örneğin Firefox) kullanarak şu URL'yi kullanarak bağlanabilirsiniz:
```bash
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
```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
```
2024-02-10 18:14:16 +00:00
Eğer kullanıcı/şifreniz özel karakterler içeriyorsa, [aşağıdaki komut](https://stackoverflow.com/a/113900/13647948) kullanılabilir:
```bash
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
```
2024-02-10 18:14:16 +00:00
## 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'sine 80 numaralı porta bağlantı kurmasını söyler (_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'sine 80 numaralı porta TCP bağlantısı kurmasını söyler (_"2" ile belirtilir_). Bu komut **IPv6'ı destekler**.
2024-02-10 18:14:16 +00:00
* **`LIST`** Bu, mevcut klasördeki dosyaların listesini gönderir
* **`LIST -R`** Yinelemeli olarak listeler (sunucu izin veriyorsa)
2024-02-10 18:14:16 +00:00
* **`APPE /yol/birşey.txt`** Bu, FTP'ye **pasif** bir bağlantıdan veya bir **PORT/EPRT** bağlantısından gelen verileri bir dosyaya kaydetmesini söyler. 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önderir
* **`REST 6`** Bu, sunucuya bir sonraki sefer `RETR` kullanarak bir şey gönderdiğinde 6. bayttan başlaması gerektiğini söyler.
* **`TYPE i`** Transferi ikili olarak ayarlar
* **`PASV`** Bu, pasif bir bağlantı açacak ve kullanıcıya nereye bağlanabileceğini gösterecektir
2024-02-10 18:14:16 +00:00
* **`PUT /tmp/dosya.txt`** Belirtilen dosyayı FTP'ye yükler
![](<../../.gitbook/assets/image (227).png>)
2024-02-10 18:14:16 +00:00
## FTPBounce saldırısı
Bazı FTP sunucuları `PORT` komutuna izin verir. Bu komut, sunucuya başka bir FTP sunucusuna belirli bir porta bağlanmak istediğinizi belirtmek için kullanılabilir. Sonra, bu bilgiyi kullanarak bir FTP sunucusu aracılığıyla bir ana bilgisayarın hangi portlarının açık olduğunu taramak için kullanabilirsiniz.
[**Buradan bir FTP sunucusunu port taraması yapmak için nasıl kötüye kullanabileceğinizi öğrenin.**](ftp-bounce-attack.md)
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 dosya 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 hatta 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 isteği dosyanın içine 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**
2024-02-10 18:14:16 +00:00
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**. Bunu önlemek için deneyebileceğiniz öneriler şunlardır:
* Bir HTTP isteği gönderiyorsanız, **en azından \~0.5MB'ye 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 konuşurken belki sadece gereksiz komutlar veya dosyayı almak için `RETR` komutunu tekrarlayın)
* İsteği **çok sayıda null karakter veya başka karakterlerle doldurun** (satırlara veya satırlara bölünmüş olsun)
Neyse, burada bir [FTP sunucusunun farklı bir FTP sunucusundan bir dosya indirmesi için bunu nasıl kötüye kullanabileceğinize dair eski bir örnek](ftp-bounce-download-2oftp-file.md) bulunmaktadır.
## Filezilla Sunucu Güvenlik Açığı
**FileZilla** genellikle **yerel** bir **Yönetimsel hizmet** için **FileZilla-Sunucusuna** (port 14147) **bağlanır**. Bu porta erişmek için **kendi makinenizden bir tünel oluşturabilirseniz**, FTP hizmeti için **boş bir şifre** kullanarak **bağlanabilir** ve **FTP hizmeti için yeni bir kullanıcı oluşturabilirsiniz**.
2024-02-10 18:14:16 +00:00
## Yapılandırma dosyaları
```
ftpusers
ftp.conf
proftpd.conf
2022-10-02 21:20:06 +00:00
vsftpd.conf
```
### Saldırı Sonrası
vsFTPd'nin varsayılan yapılandırması `/etc/vsftpd.conf` dosyasında bulunabilir. Burada bazı tehlikeli ayarlar bulabilirsiniz:
2022-10-02 21:20:06 +00:00
* `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` - Komutlara izin ver: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE ve SITE
2022-10-02 21:20:06 +00:00
### Shodan
* `ftp`
* `port:21`
***
2023-09-03 01:48:41 +02:00
2024-02-10 18:14:16 +00:00
## HackTricks Otomatik Komutları
```
2021-08-12 09:00:24 -04:00
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
2021-08-15 13:23:50 -04:00
Entry_1:
2024-02-10 18:14:16 +00:00
Name: Notes
Description: Notes for FTP
Note: |
Anonymous Login
-bi <<< so that your put is done via binary
2021-08-15 13:23:50 -04:00
2024-02-10 18:14:16 +00:00
wget --mirror 'ftp://ftp_user:UTDRSCH53c"$6hys@10.10.10.59'
^^to download all dirs and files
2021-08-15 13:23:50 -04:00
2024-02-10 18:14:16 +00:00
wget --no-passive-ftp --mirror 'ftp://anonymous:anonymous@10.10.10.98'
if PASV transfer is disabled
2021-08-15 13:23:50 -04:00
2024-02-10 18:14:16 +00:00
https://book.hacktricks.xyz/pentesting/pentesting-ftp
2021-08-15 13:23:50 -04:00
Entry_2:
2024-02-10 18:14:16 +00:00
Name: Banner Grab
Description: Grab FTP Banner via telnet
Command: telnet -n {IP} 21
2021-08-15 13:23:50 -04:00
Entry_3:
2024-02-10 18:14:16 +00:00
Name: Cert Grab
Description: Grab FTP Certificate if existing
Command: openssl s_client -connect {IP}:21 -starttls ftp
2021-08-15 13:23:50 -04:00
Entry_4:
2024-02-10 18:14:16 +00:00
Name: nmap ftp
Description: Anon login and bounce FTP checks are performed
Command: nmap --script ftp-* -p 21 {IP}
2021-08-15 13:23:50 -04:00
Entry_5:
2024-02-10 18:14:16 +00:00
Name: Browser Connection
Description: Connect with Browser
Note: ftp://anonymous:anonymous@{IP}
2021-09-13 11:27:07 -04:00
Entry_6:
2024-02-10 18:14:16 +00:00
Name: Hydra Brute Force
Description: Need Username
Command: hydra -t 1 -l {Username} -P {Big_Passwordlist} -vV {IP} ftp
Entry_7:
2024-02-10 18:14:16 +00:00
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'
2021-08-12 09:00:24 -04:00
```
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>AWS hacklemeyi sıfırdan kahramana öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
* **Bir **cybersecurity şirketinde mi çalışıyorsunuz**? **Şirketinizi HackTricks'te reklamını görmek ister misiniz**? ya da **PEASS'ın en son sürümüne erişmek veya HackTricks'i PDF olarak indirmek ister misiniz**? [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* [**Resmi PEASS & HackTricks ürünlerini alın**](https://peass.creator-spring.com)
* **Katılın** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grubuna**](https://discord.gg/hRep4RUj7f) ya da [**telegram grubuna**](https://t.me/peass) veya beni **Twitter'da takip edin** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Hacking püf noktalarınızı paylaşın, PR'lar göndererek** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **ve** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **ile.**
2022-04-28 16:01:33 +00:00
</details>