hacktricks/network-services-pentesting/pentesting-ftp
2024-08-04 15:18:45 +00:00
..
ftp-bounce-attack.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 11:35:15 +00:00
ftp-bounce-download-2oftp-file.md Translated ['network-services-pentesting/512-pentesting-rexec.md', 'netw 2024-08-04 15:18:45 +00:00
README.md Translated ['binary-exploitation/basic-stack-binary-exploitation-methodo 2024-07-18 22:23:19 +00:00

21 - Pentesting FTP

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Try Hard Security Group

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


기본 정보

**파일 전송 프로토콜 (FTP)**는 서버와 클라이언트 간의 컴퓨터 네트워크에서 파일 전송을 위한 표준 프로토콜로 사용됩니다.
이는 일반 텍스트 프로토콜로, **새 줄 문자 0x0d 0x0a**를 사용하므로 때때로 telnet 또는 **nc -C**를 사용하여 연결해야 할 수 있습니다.

기본 포트: 21

PORT   STATE SERVICE
21/tcp open  ftp

Connections Active & Passive

액티브 FTP에서 FTP 클라이언트는 먼저 자신의 포트 N에서 FTP 서버의 명령 포트인 포트 21로 제어 연결시작합니다. 그런 다음 클라이언트는 포트 N+1청취하고 포트 N+1을 FTP 서버에 보냅니다. FTP 서버는 그 후 데이터 연결시작하며, 자신의 포트 M에서 FTP 클라이언트의 포트 N+1로 연결합니다.

하지만, FTP 클라이언트가 외부에서 들어오는 데이터 연결을 제어하는 방화벽을 설정한 경우, 액티브 FTP는 문제가 될 수 있습니다. 이에 대한 실행 가능한 해결책은 패시브 FTP입니다.

패시브 FTP에서 클라이언트는 자신의 포트 N에서 FTP 서버의 포트 21로 제어 연결을 시작합니다. 이후 클라이언트는 passv 명령을 발행합니다. 서버는 그 후 클라이언트에게 자신의 포트 번호 M 중 하나를 보냅니다. 그리고 클라이언트자신의 포트 P에서 FTP 서버의 포트 M으로 데이터 연결시작합니다.

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

Connection debugging

FTP 명령 **debug**와 **trace**는 통신이 어떻게 이루어지는지 확인하는 데 사용할 수 있습니다.

Enumeration

Banner Grabbing

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

STARTTLS를 사용하여 FTP에 연결하기

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와 함께

sudo nmap -sV -p21 -sC -A 10.10.10.10

You can us the commands HELP and FEAT to obtain some information of the FTP server:
HELPFEAT 명령어를 사용하여 FTP 서버에 대한 정보를 얻을 수 있습니다:

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

Brute force

여기 기본 ftp 자격 증명의 멋진 목록을 찾을 수 있습니다: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt

Automated

익명 로그인 및 바운스 FTP 검사는 기본적으로 nmap의 -sC 옵션으로 수행됩니다:

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

Browser connection

브라우저(예: Firefox)를 사용하여 다음과 같은 URL로 FTP 서버에 연결할 수 있습니다:

ftp://anonymous:anonymous@10.10.10.98

사용자에 의해 제어되는 데이터를 FTP 서버직접 전송하는 웹 애플리케이션이 있는 경우, 이중 URL 인코딩된 %0d%0a (이중 URL 인코딩에서는 %250d%250a) 바이트를 전송하여 FTP 서버가 임의의 작업을 수행하게 할 수 있습니다. 이러한 가능한 임의 작업 중 하나는 사용자가 제어하는 서버에서 콘텐츠를 다운로드하거나 포트 스캐닝을 수행하거나 다른 평문 기반 서비스(예: http)와 통신을 시도하는 것입니다.

FTP에서 모든 파일 다운로드

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

사용자 이름/비밀번호에 특수 문자가 포함된 경우, 다음 명령어를 사용할 수 있습니다:

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

Some FTP commands

  • USER username
  • PASS password
  • HELP 서버가 지원하는 명령어를 표시합니다.
  • **PORT 127,0,0,1,0,80** 이는 FTP 서버에 IP 127.0.0.1의 포트 80과 연결을 설정하도록 지시합니다 (5번째 문자는 "0"으로, 6번째는 10진수로 포트를 입력해야 하거나 5번째와 6번째를 사용하여 포트를 16진수로 표현해야 합니다).
  • **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에 업로드합니다.

FTPBounce attack

일부 FTP 서버는 PORT 명령을 허용합니다. 이 명령은 서버에 다른 FTP 서버의 특정 포트에 연결하고 싶음을 나타내는 데 사용할 수 있습니다. 그런 다음 이를 사용하여 FTP 서버를 통해 호스트의 어떤 포트가 열려 있는지 스캔할 수 있습니다.

여기에서 FTP 서버를 악용하여 포트를 스캔하는 방법을 배우세요.

이 동작을 악용하여 FTP 서버가 다른 프로토콜과 상호작용하도록 만들 수도 있습니다. HTTP 요청을 포함하는 파일을 업로드하고 취약한 FTP 서버가 임의의 HTTP 서버로 전송하도록 하거나, 심지어 FTP 요청을 업로드하고 취약한 FTP 서버가 다른 FTP 서버에서 파일을 다운로드하도록 만들 수 있습니다.
이론은 간단합니다:

  1. 취약한 서버에 요청(텍스트 파일 내)을 업로드합니다. 다른 HTTP 또는 FTP 서버와 통신하려면 0x0d 0x0a로 줄을 변경해야 합니다.
  2. 원하지 않는 문자를 전송하지 않도록 REST X를 사용합니다 (아마도 요청을 파일 내에 업로드하기 위해 파일의 시작 부분에 이미지 헤더를 넣어야 했을 것입니다).
  3. 임의의 서버 및 서비스에 연결하기 위해 PORT를 사용합니다.
  4. 저장된 요청을 서버에 전송하기 위해 RETR를 사용합니다.

이것이 _소켓이 쓰기 불가능하다는 오류_와 같은 오류를 발생시킬 가능성이 높습니다 왜냐하면 연결이 RETR로 데이터를 전송하기에 충분히 오래 지속되지 않기 때문입니다. 이를 피하기 위한 제안은 다음과 같습니다:

  • HTTP 요청을 전송하는 경우, 같은 요청을 연속으로 넣습니다 ~0.5MB 이상까지. 이렇게:

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

  • 요청을 프로토콜과 관련된 "잡동사니" 데이터로 채우려고 시도합니다 (FTP와 대화할 때 아마도 잡동사니 명령어를 사용하거나 파일을 가져오기 위해 RETR 명령을 반복합니다).
  • 요청을 많은 널 문자 또는 기타로 채웁니다 (줄로 나누거나 나누지 않고).

어쨌든, 여기 다른 FTP 서버에서 파일을 다운로드하도록 FTP 서버를 악용하는 방법에 대한 오래된 예제가 있습니다.

Filezilla Server Vulnerability

FileZilla는 일반적으로 로컬FileZilla-Server(포트 14147)를 위한 관리 서비스바인딩합니다. 이 포트에 접근하기 위해 당신의 머신에서 터널을 생성할 수 있다면, 빈 비밀번호를 사용하여 연결하고 FTP 서비스에 대한 새 사용자생성할 수 있습니다.

Config files

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

Try Hard Security Group

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


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'

{% hint style="success" %} AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks 지원하기
{% endhint %}