FTP — это популярный протокол для передачи файлов по сети. Многие FTP сервера имеют открытый доступ (без авторизации) для просмотра файлов. Такие открытые FTP можно найти с помощью Python. Давайте научимся это делать используя библиотеку ftplib.
Еще по теме: Отправить СМС анонимно используя Python
Что значит анонимный пользователь FTP
Пользователь «anonymous» в контексте протокола FTP используется для доступа к FTP-серверу. Он позволяет подключиться к FTP-серверу без указания конкретного имени пользователя и пароля.
Доступ по пользователю «anonymous» часто используется для открытых ресурсов, таких как общедоступные библиотеки файлов или репозитории программного обеспечения. Он позволяет пользователям анонимно получать доступ к публичным файлам на FTP-сервере без необходимости регистрации.
Статья в образовательных целях, для обучения этичных хакеров. Несанкционированный доступ к FTP является незаконным и рассматривается как уголовное преступление. Ни редакция spy-soft.net, ни автор не несут ответственности за ваши действия.
Что такое ftplib
ftplib — это модуль Python для работы с протоколом FTP. Модуль позволяет создавать соединения с FTP-серверами, загружать и скачивать файлы, управлять директориями на удаленном сервере и выполнять другие операции, связанные с передачей файлов.
Это полезный инструмент для автоматизации задач, связанных с обменом файлами между компьютерами.
Установка ftplib
Перед тем как начать, убедитесь, что у вас установлен модуль ftplib:
1 |
pip install ftplib |
Поиск открытых FTP с помощью ftplib на Python
Мы можем использовать модуль ftplib для создания скрипта, который определит, предлагает ли FTP-сервер вход без авторизации. Этот механизм заключается в предоставлении FTP-серверу слова «anonymous» в качестве имени и пароля пользователя. Таким образом, можно делать запросы к FTP-серверу, не зная данных о конкретном пользователе.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import ftplib def anonymousLogin(hostname): try: ftp = ftplib.FTP(hostname) response = ftp.login('anonymous', 'anonymous') print(response) if "230 Anonymous access granted" in response: print('\n[*] ' + str(hostname) + ' FTP Anonymous Login Succeeded.') print(ftp.getwelcome()) ftp.dir() except Exception as exception: print(str(exception)) print('\n[-] ' + str(hostname) + ' FTP Anonymous Login Failed.') hostname = 'ftp.be.debian.org' anonymousLogin(hostname) |
В предыдущем коде функция anonymousLogin() принимает имя хоста в качестве параметра и проверяет подключение к FTP-серверу с анонимным пользователем. Функция пытается создать FTP-подключение с анонимными учетными данными и показывает информацию, связанную с сервером, а также список файлов в корневом каталоге.
Таким же образом мы могли бы реализовать функцию для проверки отрытых FTP, используя только конструктор класса FTP и подход с контекстным менеджером.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import ftplib FTP_SERVER_URL = 'ftp.be.debian.org' DOWNLOAD_DIR_PATH = '/www.kernel.org/pub/linux/kernel/v6.x/' def check_anonymous_connection(host, path): with ftplib.FTP(host, user="anonymous") as connection: print("Welcome to ftp server ", connection.getwelcome()) for name, details in connection.mlsd(path): print(name, details['type'], details.get('size')) if __name__ == '__main__': check_anonymous_connection(FTP_SERVER_URL, DOWNLOAD_DIR_PATH) |
Здесь используем константы, определенные как FTP_SERVER_URL и DOWNLOAD_DIR_PATH, для тестирования анонимного подключения к этому серверу. Если подключение успешно, то мы увидим приветственное сообщение и список файлов в этом пути.
Мы можем использовать анонимный доступ для получения информации о доступных каталогах и страницах, которые можно найти на FTP-сервере. В следующем примере мы используем анонимного пользователя для доступа к FTP-серверу, получения списка каталогов и получения стандартной страницы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import ftplib def return_default(ftp): try: dir_list = ftp.nlst() print(dir_list) except Exception as e: print(f'[-] Could not list directory contents.\n' f'[-] Skipping To Next Target.\n' f'[-] Exception: {e}') return ret_list = [] for file in dir_list: fn = file.lower() if '.php' in fn or '.htm' in fn or '.asp' in fn: print(f'[+] Found default page: {file}') ret_list.append(file) return ret_list if __name__ == "__main__": tgt_host = 'ftp.be.debian.org' username = 'anonymous' password = 'anonymous' ftp_conn = ftplib.FTP(tgt_host) ftp_conn.login(username, password) |
Выполнение скрипта:
Другие функции ftplib
Модуль ftplib предоставляет другие функции, которые можно использовать для выполнения операций с FTP:
- FTP.getwelcome() — получает приветственное сообщение
- FTP.pwd() — возвращает текущий каталог
- FTP.cwd(путь) — изменяет рабочий каталог
- FTP.dir(путь) — отображает список каталогов
- FTP.nlst(путь) — отображает список с именами файлов в каталоге
- FTP.size(файл) — отображает размер файла, который передаем в качестве параметра
В целом, ftplib — удобный инструмент для работы с FTP и может быть использован в ИБ.
В следующей статье покажу, как подключаться к серверам SSH с помощью Pysftp.
ПОЛЕЗНЫЕ ССЫЛКИ:
- Установка и использование Python в Kali Linux
- Использование Paramiko для брута SSH на Python
- Взлом FTP с помощью Hydra или Metasploit на Kali Linux