mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
259 lines
19 KiB
Markdown
259 lines
19 KiB
Markdown
# 21 - Pentesting FTP
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## Basic Information
|
||
|
||
**फाइल ट्रांसफर प्रोटोकॉल (FTP)** एक मानक प्रोटोकॉल है जो एक कंप्यूटर नेटवर्क में एक सर्वर और एक क्लाइंट के बीच फाइल ट्रांसफर के लिए उपयोग किया जाता है।\
|
||
यह एक **सादा-टेक्स्ट** प्रोटोकॉल है जो **नया लाइन कैरेक्टर `0x0d 0x0a`** का उपयोग करता है, इसलिए कभी-कभी आपको **`telnet`** या **`nc -C`** का उपयोग करके **कनेक्ट** करने की आवश्यकता होती है।
|
||
|
||
**डिफ़ॉल्ट पोर्ट:** 21
|
||
```
|
||
PORT STATE SERVICE
|
||
21/tcp open ftp
|
||
```
|
||
### Connections Active & Passive
|
||
|
||
In **Active FTP** the FTP **client** first **initiates** the control **connection** from its port N to FTP Servers command port – port 21. The **client** then **listens** to port **N+1** and sends the port N+1 to FTP Server. FTP **Server** then **initiates** the data **connection**, from **its port M to the port N+1** of the FTP Client.
|
||
|
||
But, if the FTP Client has a firewall setup that controls the incoming data connections from outside, then active FTP may be a problem. And, a feasible solution for that is Passive FTP.
|
||
|
||
In **Passive FTP**, the client initiates the control connection from its port N to the port 21 of FTP Server. After this, the client issues a **passv comand**. The server then sends the client one of its port number M. And the **client** **initiates** the data **connection** from **its port P to port M** of the FTP Server.
|
||
|
||
Source: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
|
||
|
||
### Connection debugging
|
||
|
||
The **FTP** commands **`debug`** and **`trace`** can be used to see **how is the communication occurring**.
|
||
|
||
## Enumeration
|
||
|
||
### Banner Grabbing
|
||
```bash
|
||
nc -vn <IP> 21
|
||
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
|
||
```
|
||
### FTP के लिए starttls का उपयोग करके कनेक्ट करें
|
||
```
|
||
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 सर्वर की कुछ जानकारी प्राप्त करने के लिए `HELP` और `FEAT` कमांड का उपयोग कर सकते हैं:
|
||
```
|
||
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
|
||
|
||
_गुमनाम : गुमनाम_\
|
||
\&#xNAN;_गुमनाम :_\
|
||
\&#xNAN;_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)
|
||
|
||
यहाँ आप डिफ़ॉल्ट ftp क्रेडेंशियल्स की एक अच्छी सूची पा सकते हैं: [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 लॉगिन और बाउंस FTP जांचें डिफ़ॉल्ट रूप से nmap द्वारा **-sC** विकल्प के साथ या:
|
||
```bash
|
||
nmap --script ftp-* -p 21 <ip>
|
||
```
|
||
## ब्राउज़र कनेक्शन
|
||
|
||
आप एक URL का उपयोग करके ब्राउज़र (जैसे Firefox) का उपयोग करके FTP सर्वर से कनेक्ट कर सकते हैं:
|
||
```bash
|
||
ftp://anonymous:anonymous@10.10.10.98
|
||
```
|
||
ध्यान दें कि यदि एक **वेब एप्लिकेशन** उपयोगकर्ता द्वारा नियंत्रित डेटा को **प्रत्यक्ष रूप से FTP सर्वर** पर भेज रहा है, तो आप डबल URL एन्कोड `%0d%0a` (डबल URL एन्कोड में यह `%250d%250a` है) बाइट्स भेज सकते हैं और **FTP सर्वर को मनमाने क्रियाएँ** करने के लिए मजबूर कर सकते हैं। इनमें से एक संभावित मनमानी क्रिया उपयोगकर्ता द्वारा नियंत्रित सर्वर से सामग्री डाउनलोड करना, पोर्ट स्कैनिंग करना या अन्य प्लेन-टेक्स्ट आधारित सेवाओं (जैसे http) से बात करने की कोशिश करना है।
|
||
|
||
## FTP से सभी फ़ाइलें डाउनलोड करें
|
||
```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
|
||
```
|
||
यदि आपके उपयोगकर्ता/पासवर्ड में विशेष वर्ण हैं, तो [निम्नलिखित कमांड](https://stackoverflow.com/a/113900/13647948) का उपयोग किया जा सकता है:
|
||
```bash
|
||
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
|
||
```
|
||
## कुछ FTP कमांड
|
||
|
||
- **`USER username`**
|
||
- **`PASS password`**
|
||
- **`HELP`** सर्वर यह संकेत करता है कि कौन से कमांड समर्थित हैं
|
||
- **`PORT 127,0,0,1,0,80`** यह FTP सर्वर को IP 127.0.0.1 पर पोर्ट 80 के साथ कनेक्शन स्थापित करने के लिए संकेत देगा (_आपको 5वां अक्षर "0" और 6वां दशमलव में पोर्ट के रूप में डालना होगा या पोर्ट को हेक्स में व्यक्त करने के लिए 5वां और 6वां उपयोग करना होगा_)।
|
||
- **`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** कनेक्शन से प्राप्त डेटा को एक फ़ाइल में संग्रहीत करने के लिए संकेत देगा। यदि फ़ाइल का नाम मौजूद है, तो यह डेटा को जोड़ देगा।
|
||
- **`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 पर अपलोड करें
|
||
|
||
.png>)
|
||
|
||
## FTPBounce हमला
|
||
|
||
कुछ FTP सर्वर PORT कमांड की अनुमति देते हैं। इस कमांड का उपयोग सर्वर को यह संकेत देने के लिए किया जा सकता है कि आप किसी अन्य FTP सर्वर से किसी पोर्ट पर कनेक्ट करना चाहते हैं। फिर, आप इसका उपयोग यह स्कैन करने के लिए कर सकते हैं कि किसी होस्ट के कौन से पोर्ट FTP सर्वर के माध्यम से खुले हैं।
|
||
|
||
[**यहाँ जानें कि FTP सर्वर का दुरुपयोग करके पोर्ट कैसे स्कैन करें।**](ftp-bounce-attack.md)
|
||
|
||
आप इस व्यवहार का दुरुपयोग करके FTP सर्वर को अन्य प्रोटोकॉल के साथ इंटरैक्ट करवा सकते हैं। आप **HTTP अनुरोध** वाला एक फ़ाइल अपलोड कर सकते हैं और कमजोर FTP सर्वर को **इसे किसी मनमाने HTTP सर्वर पर भेजने** के लिए मजबूर कर सकते हैं (_शायद एक नए व्यवस्थापक उपयोगकर्ता को जोड़ने के लिए?_) या यहां तक कि एक FTP अनुरोध अपलोड कर सकते हैं और कमजोर FTP सर्वर को किसी अन्य FTP सर्वर के लिए एक फ़ाइल डाउनलोड करने के लिए मजबूर कर सकते हैं।\
|
||
सिद्धांत आसान है:
|
||
|
||
1. **कमजोर सर्वर पर अनुरोध (एक टेक्स्ट फ़ाइल के अंदर) अपलोड करें।** याद रखें कि यदि आप किसी अन्य HTTP या FTP सर्वर से बात करना चाहते हैं तो आपको `0x0d 0x0a` के साथ पंक्तियों को बदलना होगा
|
||
2. **`REST X` का उपयोग करें ताकि आप उन अक्षरों को न भेजें जिन्हें आप नहीं भेजना चाहते** (शायद फ़ाइल के अंदर अनुरोध अपलोड करने के लिए आपको शुरुआत में कुछ इमेज हेडर डालना पड़ा)
|
||
3. **मनमाने सर्वर और सेवा से कनेक्ट करने के लिए `PORT` का उपयोग करें**
|
||
4. **सर्वर को सहेजे गए अनुरोध को भेजने के लिए `RETR` का उपयोग करें।**
|
||
|
||
यह अत्यधिक संभावना है कि यह **एक त्रुटि फेंकेगा जैसे** _**Socket not writable**_ **क्योंकि कनेक्शन डेटा को `RETR` के साथ भेजने के लिए पर्याप्त समय तक नहीं रहता**। इसे टालने के लिए सुझाव हैं:
|
||
|
||
- यदि आप एक HTTP अनुरोध भेज रहे हैं, तो **एक के बाद एक वही अनुरोध डालें** जब तक कि **\~0.5MB** कम से कम न हो। इस तरह:
|
||
|
||
{% file src="../../images/posts.txt" %}
|
||
posts.txt
|
||
{% endfile %}
|
||
|
||
- प्रयास करें कि **प्रोटोकॉल से संबंधित "जंक" डेटा के साथ अनुरोध को भरें** (FTP से बात करते समय शायद केवल जंक कमांड या फ़ाइल प्राप्त करने के लिए `RETR` निर्देश को दोहराना)
|
||
- बस **अनुरोध को बहुत सारे शून्य अक्षरों या अन्य के साथ भरें** (पंक्तियों में विभाजित या नहीं)
|
||
|
||
वैसे भी, यहाँ आपके पास एक [पुराना उदाहरण है कि कैसे इसका दुरुपयोग करके एक FTP सर्वर को किसी अन्य FTP सर्वर से फ़ाइल डाउनलोड करने के लिए मजबूर करें।](ftp-bounce-download-2oftp-file.md)
|
||
|
||
## Filezilla सर्वर भेद्यता
|
||
|
||
**FileZilla** आमतौर पर **स्थानीय** पर **FileZilla-Server** (पोर्ट 14147) के लिए एक **प्रशासनिक सेवा** को **बाइंड** करता है। यदि आप इस पोर्ट तक पहुँचने के लिए **अपने मशीन** से एक **टनल** बना सकते हैं, तो आप **खाली पासवर्ड** का उपयोग करके **इससे कनेक्ट** कर सकते हैं और FTP सेवा के लिए **एक नया उपयोगकर्ता** बना सकते हैं।
|
||
|
||
## कॉन्फ़िग फ़ाइलें
|
||
```
|
||
ftpusers
|
||
ftp.conf
|
||
proftpd.conf
|
||
vsftpd.conf
|
||
```
|
||
### Post-Exploitation
|
||
|
||
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 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'
|
||
```
|
||
{{#include ../../banners/hacktricks-training.md}}
|