FTP – port 21

Cheat sheet and tricks for the File Transfer Protocol (FTP).

FTP is insecure as it uses clear text to send credentials. See Telnet for other examples.

Nmap scripts

ls -la /usr/share/nmap/scripts/ftp*
nmap -Pn --script "ftp* and not brute" -p 21 $IP -oA nmap-ftp
IP=x.x.x.x
WL=/usr/share/wordlists/rockyou.txt
USERS=/usr/share/seclists/Usernames/top-usernames-shortlist.txt
nmap -Pn --script ftp-brute -p 21 $IP --script-args userdb=${USERS},passdb=$WL -oA nmap-ftp-brute

Directory Traversal

See this exploit for common paths.

dir ./../../../../../../../../

FileZilla

filezilla

Download all files locally and search for interesting information.

grep -Ril "flag" .
grep -Ri "password" .
grep -Ri "key" .
grep -Ri "sessionkey" .
grep -Ri "admin" .

FTP Client

When having problems with “Entering Passive Mode”, type “pass” or “passive” quickly after entering the user’s password.

Installation

sudo apt install ftp

Connect to ftp server (port 21)

ftp $IP
ftp anonymous@${IP}
ftp anonymous@${IP} 21
# Anonymous (guest)
ftp $IP
Name: anonymous
Password: (enter password, try anonymous, or just press Enter without providing a password)

Login

user myuser1

Help / Display available commands

help

Prints the names of the files and subdirectories in the current directory on the remote computer

ls

Try to escape the chrooted environment

ls ../../../../../../..//etc

Change directory

cd directory
cd ..

File transfer – ASCII mode

This changes to ascii mode for transferring text files.

ascii

File transfer – Binary mode

This command changes to binary mode for transferring all files that are not text files

binary

File transfer – Download files

If there already is a file on the local computer with the same name, it will be overwritten.

This downloads the file passwd from the remote computer to the local computer.

get <file on FTP server> <file on client machine>
get /etc/passwd /home/kali/passwd
# Downloads all files that end with ".jpg"
mget *.jpg

File transfer – Upload files

If there already is a file on the remote computer with the same name, it will overwritten.

Uploads the file test.txt from the local computer to the remote computer.

put <file on client machine> <file on FTP server>
put /home/kali/test.txt test.txt
# Uploads all the files that end with ".jpg"
mput *.jpg

Delete files

# Deletes all files that end with ".jpg"
mdelete *.jpg

Interactive mode

Turns interactive mode on or off so that commands on multiple files are executed without user confirmation.

prompt

Exit the ftp client

quit

Non-interactive mode – Windows

TO CONFIRM

ftp.txt

open x.x.x.x 21
username
password
ftp@ftp.com
dir
bye

Run FTP commands from ftp.txt

type ftp.txt
ftp -s:ftp.txt

Non-interactive mode – Linux

The FTP command shell on Linux does not have the “-s” option. Build a shell script to execute the FTP commands.

ftp.sh

#!/bin/bash

ftp -n x.x.x.x <<END_SCRIPT
quote USER myusername
quote PASS mypassword
prompt
dir
bye
END_SCRIPT
chmod u+x ftp.sh
./ftp.sh

FTP Server

Python

pip install pyftpdlib

Using the anonymous user

python -m pyftpdlib -p 21 -w
ftp anonymous@x.x.x.x

ftp.py – authenticated

#!/usr/bin/python
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer

authorizer = DummyAuthorizer()
authorizer.add_user("ftpuser", "<PASSWORD>", "/home/ftpuser", perm="elradfmwMT")

handler = FTPHandler
handler.authorizer = authorizer

server = FTPServer(("127.0.0.1", 21), handler)
server.serve_forever()
mkdir /home/ftpuser
sudo groupadd ftpgroup
sudo useradd -g ftpgroup -d /home/ftpuser -s /etc ftpuser
chown ftpuser: ftpuser
./ftp.py
ftp ftpuser@127.0.0.1
<PASSWORD>

Pure-FTPd

Installation

sudo apt install pure-ftpd

Configuration

sudo groupadd ftpgroup
sudo useradd -g ftpgroup -d /dev/null -s /etc ftpuser
sudo pure-pw useradd pureuser -u ftpuser -d /ftphome
sudo pure-pw mkdb
cd /etc/pure-ftpd/auth/
sudo ln -s ../conf/PureDB 60pdb
sudo mkdir -p /ftphome
sudo chown -R ftpuser:ftpgroup /ftphome/
sudo systemctl restart pure-ftpd

Uncomment this line in /etc/pure-ftpd/pure-ftpd.conf

UnixAuthentication           yes