Как массово просканировать интернет на FTP с анонимным доступом

internet_ftp_scanningНе так давно появилась новость о том, что один исследователь просканировал весь интернет на открытый 21 порт (FTP) и выявил целую кучу доступных FTP с возможностью анонимного логина.

Давайте попробуем повторить его «успех», только мы пойдем другим, более простым способом.

На эту тему хотелось бы написать куда больше и по этому мы ее разделим на две части, в этой части рассмотрим простое сканирование диапазона IP адресов и конкретно FTP сервисов с анонимным логином, а второй части уже попробуем написать более интересную и серьезную штуку.

 

Из инструментов для выполнения данной задачки нам понадобится не так уж и много:

  • zmap
  • tor + proxychains
  • python
  • php + mysql
  • Debian с 512mb и одним ядром на борту
  • Бесплатный VPS для выполнения наших тестов

Сейчас я объясню, что и для чего нам нужно.

Zmap — это реализация очень быстрого сканера который за секунды может пробегать по огромным диапазонам IP адресов, единственная его проблема — сканировать он может только по одному конкретному порту, но для нашего эксперимента нам более и не надо. Хорошо, с вопросом сканирования все понятно, но остается момент с проверкой доступа под анонимным пользователем, правильно? Для этой части работы мы будем использовать Python (версии 2.7) и библиотеку ftplib. PHP с MySQL в свою очередь будут отвечать за работу по списку нужных IP адресов и сохранение результата в базу данных для дальнейшего оперирывания результатами. Для опытов подойдет самый минимальный сервер (мы же не собираемся сканировать весь интернет?!). Кроме всего прочего, нам надо сильно не светиться и по этому мы будем использовать связку Proxychains и TOR при сканированиях (так же это иногда может помогать при блокировках простой сменой IP).

У некоторых могут возникнуть трудности с установкой некоторых компонентов, по этому я отдельно описал как установить zmap и как установить связку TOR и Proxychains чтоб можно было запускать скрипты через TOR.

 

Суть нашей затеи весьма тривиальна, сразу нам надо собрать список IP адресов который мы будем проверять утилитой zmap на наличие нужного нам открытого порта и сохранять эти результаты в базу, на следующем этапе второй скрипт будет выполнять подключение под анонимным пользователем на все хосты с открытым 21 портом из нашей базы и если подключение проходит успешно — в базе данных у нас будет сохраняться баннер ну и далее уже через тот же phpMyAdmin или в консоли с помощью sql запроса мы уже сможет работать с итоговыми результатами и подбивать статистику.

Смотрите так же   DoS против игрового хост-бота в DotA (WarCraft III).

При условии, что у нас все готово и мы со всем разобрались, я думаю, что мы можем приступать к реализации.

Первым делом проходим по ссылочек и регистрируемся, получаем в свое распоряжение 10$ и на эти деньги арендуем виртуальное железо исходя из наших нужд (как говорил ранее, подойдет VPS за 5$, более и не надо).

Устанавливаем на него Debian (версия подойдет любая), Apache, php и MySQL.

Когда закончили с установкой компонентов, переходим к установке zmap.

Далее нам надо будет создать простенькую базу в MySQL с одной таблицей и парей столбцов:

  • id
  • ip
  • data
  • date

В таком количестве столбцы нужны для более удобной сортировки наших результатов, если вдруг будет выполняться несколько сканирований. Так же, по желанию можно добавить еще столбец «port», если планируете сканировать какие-то другие сервисы.

На следующем этапе нам нужно подготовить список IP адресов (или диапазонов) для сканирования и загнать их в файл ip_list.php допустим.

Первым делом нам надо написать скрипт на php, который будет отвечать за работу со списком IP адресов: запускть zmap для сканирования по списку и сохранения результатов в базу данных.

Надеюсь списки IP адресов все могут составить самостоятельно или на крайняк погуглить в сторону того, какие диапазоны каким странам пренадлежат (помните, сканирование как таковое без согласия владельца системы запрещено законодательно).

Если у кого-то не получается создать файлик подключения к базе (коннектор), то тут я добавлю пример (только не забудьте указать свои имя пользователя и пароль):

<?php
$user = 'username';
$password = 'password';
$server = 'localhost';
$dbname = 'our_db';

$link = mysql_connect($server, $user, $password);
mysql_set_charset('utf8',$link);
$db_s = mysql_select_db($dbname, $link);
?>

Базу данных я в примерах везде обозначаю как «our_db» — тут так же нужно изменить название под вашу существующую базу.

Смотрите так же   Почему к безопасности серверов стоит относиться серьезнее

В первый файлик «ip_list.php» мы загоняем список IP адресов в следующем виде:

<?php

$ip_list = array(
 '192.168.2.3',
 '192.168.2.4',
 '192.168.2.5');

?>

IP я указал из головы, вы можете использовать свои списки. Да, чуть не забыл — указывать можно не только IP адрес, но и подсети 192.168.2.0/24 к примеру.

Следующий скрипт у нас будет отвечать за обработку списка IP адресов, проверку открыт ли 21 порт и запись в базу:

Создаем файл «scan.php»

<?php
 require_once 'db.php'; //Подключаемся к базе (файл коннектор создать надо самому и со своими кредами от БД)
 require_once 'ip_list.php'; //Подключаем наш файлик с массивом из IP адресов/диапазонов

foreach($ip_list as $ip_check) { //Сканировать будем все IP/диапазоны из нашего массива
 $port = '21'; //Ищем мы 21 порт (он же FTP), эта переменная нужна для записи в БД, но можно использовать и в параметрах zmap
 $scan = shell_exec('/usr/bin/proxychains /usr/sbin/zmap -i eth0 -p 21 '.$ip_check.' -f saddr -o -'); //Запуск zmap из php
 $res = explode("saddr\n", $scan); //Отделяем часть c IP от остального мусора в ответе zmap
 $result = explode("\n", trim($res[1])); //На выходе нам нужны чистые IP, отсекаем все, что мешает (переносы строк)

$string = '';

foreach($result as $item => $key) { //Начинаем записывать результаты в базу (результаты лежат в массиве, его и разбираем)

$string .= "$key ";

}

$stringArray = explode(" ", $string); //Начинаем разделять массив на отдельные IP

foreach($stringArray as $ip) {
 if(trim($ip) != '') {

//В этой части мы выполняем проверку на наличие IP адреса в БД, если хоста нету в базе - он записывается.
 $check_query = mysql_query("SELECT * FROM our_db WHERE ip = '$ip'");
 while($check_row = mysql_fetch_array($check_query)) {
 $check_host = $check_row['ip'];
 }

if($ip != $check_host) {

$add_ip = mysql_query("INSERT INTO our_db (ip) VALUES ('$ip')");
    }
   }
  }
 }

?>

Далее, нам надо написать простенький скрипт на Python который будет отвечать за проверку наличия возможности авторизации под анонимным пользователем:

Создаем файл «ftp.py»

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from ftplib import FTP
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("host")
args = parser.parse_args()

HOST = args.host

ftp = FTP(HOST, timeout=15)
print ftp.login()
print ftp.getwelcome()
ftp.quit()

Скрипт работает по довольно простому принципу, используя аргументы при запуске (они все задаются автоматически) он пытается подключится к FTP с заданными именем пользователя и паролем «anonymous», при подключении у нас добавлен таймаут на 15 секунд (по желанию можно уменьшить до 3-5 секунд) и при удачном подключении мы получаем баннер который далее будем записывать в БД для подтверждения результатов и определения вида и версии FTP сервера, после чего скрипт успешно завершает свою работу.

Смотрите так же   Domain zone .By exploration: pt.2 (продолжение)

На завершающем этапе нам остается обработать хосты, с открытым 21 портом из нашей базы и записать баннер в базу при успешно подключении:

Создаем файл «check.php»

<?php
require_once 'db.php'; //Подключаемся к базе данных


$ip_list = array();

$mysql = mysql_query("SELECT * FROM our_db");
while($row_mysql = mysql_fetch_array($mysql)) {
 $ip_list[] = $row_mysql['ip'];
}

foreach($ip_list as $item => $ip) { //Подключение к FTP будет выполняться для всех IP из БД


 $ftp_banner = shell_exec("/usr/bin/proxychains /usr/bin/python ftp.py ".$ip); //Запускаем наш питоновский скрипт с IP в виде аргумента
 $clean_data = explode("net)", $ftp_banner); $banner = trim($clean_data[1]); //Разбираем результаты и готовим для записи в БД


$add_data = mysql_query("UPDATE our_db SET data = '$banner' WHERE ip = '$ip'");
 $banner = ''; //Обнуляем переменные чтоб ничего случайно там не осталось
 $ftp_banner = '';
}


?>

Все скрипты на php в процессе разбора массива ответов учитывают наличие Proxychains при запуске.

В итоге чтобы просканировать диапазон IP адресов и найти открытые FTP допустим, в одной какой-то стране — увас это займет не более пары часов.

Результаты можно будет посмотреть в базе данных, в столбце «data» будут записаны баннеры с FTP где успешно была пройдена авторизация под анонимным пользователем, далее по баннеру уже можно определить тип ПО и его версию.

В процессе тестировани иногда возникали проблемы с TOR (процесс подвисал), но в остальном все работает стабильно и результаты всегда верны.

В следующем материале мы все процессы будем осуществлять на питоне и будем использовать многопоточность, результаты будем хранить опять же — в БД, а простенький интерфейс к ней будет реализован на php.

 

 

Может быть интересно:

Добавьте комментарий