Сидя в интернете, ненавязчиво (или уже навязчиво, как у меня)
охота что-нибудь зарутить, то есть взять удаленно рут-доступ на какой-нибудь Linux-системе. Но, как говорится - любишь кататься - люби и саночки возить, то есть нужен упорный поиск уязвимой системы. Сегодня я остановлюсь на дырке в Wu-Ftpd. Эксплойт под это дело публичный - нужен лишь как минимум анонимный доступ... Фишка в том, что этот самый доступ, с выходом эксплойта на публичный уровень, загадочно изчес (не перевелись/перепились на земле нашей хорошие админы) 🙂
Для сканирования нужного фтп-сервера, я использовал различного рода сканеры уязвимостей, но в них меня не устраивало лишь одно... - скорость сканирования, поэтому для
конкретной задачи я решил написать сканер сам. Вначале, конечно же, на Perl =) потом на mIRC скриптах. И был поражен результатом. Сканировалось около 5 подсетей класса "C" за 20 секунд (а вам слабо?:)) и это на диалапе 🙂

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

Для скриптинга перейдем во вкладку Remote твоего любимого IRC-клиента (Alt+R), создадим новый скрипт-файл (File->new) и начинаем кодить 🙂

Вначале создадим обработчик события on text (с проверкой доступа на сканирование и команды).

on 1:text:*:#scan:{
if ($ulist($address($nick,3)) != $null) {
if ($1 == !ftp) {
if (!$2) halt
set %sbport 21
$scan($2-)
}
if ($1 == !killsock) sockclose *
if ($1 == !scan.stat) {
msg #testf Found Vun: %vuns $+ , open ports [ $+ %sbport $+ ]: %oports // open sockets: $sock(*,0)
}
}
}

Самое первое условие - авторизация. Если адрес ника (3 маска - *!*user@host.domain) имеет место быть во вкладке Users (пример: *!*vasya@ppp123.dialup.ru) - даем доступ к командам, иначе - тактично отмалчиваемся 😉
Если строка - !scan.stat - выдаем статистику о найденных демонах и открытых сокетах. Если строка - !killsock - прибиваем все открытые сокеты.
Если строка начинается с !ftp и вторым параметром задан диапазон ай-пи - переходим к процедуре scan (смотри ниже ее содержимое). Диапазон имеет такой вид: 195.1.1.1-195.1.5.254.

Самое главное не переборщить. Для 5 подсетей откроются около 1500 сокетов одновременно. Поэтому большее количество не желательно (будет большой лаг, либо клиент будет сбоить).

Фуф.. Вроде предупредил.. Теперь, продолжаем кодить 🙂

alias scan {
set %oports 0
set %vuns 0
set %filewip $mircdir $+ cip.txt
write -c %filewip
set %fip $gettok($1,1,45)
set %lip $gettok($1,2,45)
$cyclescan($gettok(%fip,3,46),$gettok(%lip,3,46),3)
msg #scan Generated $lines(%filewip) ip addresses
set %string 1
while (%string <= $lines(%filewip)) {
set %ip $read -l $+ %string %filewip
set %sname service $+ $gettok(%ip,4,46) $+ $gettok(%ip,3,46) $+ $r(1,10000) $+ %sbport 
sockopen %sname %ip %sbport
inc %string
}
}

Вот такая процедура. Начнем по порядку. Обнуляем переменную открытых портов и
замеченных демонов (для статистики), устанавливаем файл с генерированными адресами и забираем начальный и конечный ip-адрес.

Немного о $gettok (эта функция вызывает у многих затруднение в понимании) - она имеет 3 параметра - строку, выводимую строку и разделитель. Например, у нас есть переменная (некий аналог массива) %string, имеющая значение field1.field2.field3. Попробуем забрать из этой переменной "field2". Запросто! $gettok поможет нам. Код разделителя указывается в ascii. Точка имеет код - 46. Поэтому "field2" вернет нам: $gettok(%string,2,46) (2 - второй ряд символов после первой и до второй точки). Затем идем на процедуру записи ip в файл с ip-ами и открываем цикл по строкам из этого файла (построчное чтение), генерация уникального имени сокета и открытие сокета на ip и порт (для нас 21).

alias cyclescan {
set %my3num $1
while (%my3num <= $2) {
set %fip $puttok(%fip,%my3num,3,46)
$cyclescansm($gettok(%fip,4,46),$gettok(%lip,4,46),4)
inc %my3num
}
}

Хитрая процедура перебора подсетей класса "C". Если последний параметр меньше первого - заменяем увеличенным на единицу числом предпоследнюю октату ip-адреса и генерируем ip подсети "C".

alias cyclescansm {
set %my4num $1
while (%my4num <= $2) {
write -a %filewip $gettok(%fip,1-3,46) $+ $chr(46) $+ %my4num
inc %my4num
}
}

Тут все просто - записываем 254 ip-адреса в лог-файл с ip-адресами.

Далее отдаем права сокетам. После открытия сокета, контроль за происходящим получает обработчик on sockopen. Рассмотрим его:

on 1:sockopen:*:{
if ($sockerr > 0) {
.sockclose $sockname 
return
}
sockread
}

Если хост недоступен (машина отклонила соединение) - закрываем сокет, и возвращаемся с вызывающую процедуру, иначе переходим к блоку on sockread.

on *:sockread:*:{
inc %oports
sockread %banner
if ($gettok(%banner,1,32) == 331) {
sockwrite -n $sockname PASS ftp
}
if ($gettok(%banner,1,32) == 230) {
set %anc Yes
inc %vuns
write $mircdir $+ ftp.log $sock($sockname).ip $+ :22 %fb
sockwrite -n $sockname QUIT
}
if ($gettok(%banner,1,32) == 530) {
set %anc No
sockwrite -n $sockname QUIT
}
if ($gettok(%banner,1,32) == 221) {
msg #scan Woot on $sock($sockname).ip $+ : $+ %sbport Anonymous: %anc
sockclose $sockname 
}
if ($gettok(%banner,1,32) == 220) {
if (wu- isin %banner) {
set %fb %banner
sockwrite -n $sockname USER ftp
}
else {
sockclose $sockname | return

}
}

Диалог с сокетом. Читаем данные из сокета в переменную %banner. Если результат начинается с 220 и содержит "wu-" - значит это то, что нам нужно. Запоминаем баннер и посылаем "USER ftp". Обработчик выполнится еще раз. Если идет возврат 331 - посылаем "PASS ftp". Ждем возврата. Если 530 - доступ закрыт 🙁 если 230 - анонимус есть. В обоих случаях корректно выходим и дожидаемся строки "221 Goodbye". Пишем в канал результат успешного сканирования 😉 и в файл ftp.log тоже. После этого закрываем сокет и завершаем обработчик.

Как видишь - все просто. Главное знать азы программирования, а применить их можно практически на любом языке. Я еще не раз буду писАть о возможностях mIRC - поверь мне, они безграничны =)

Вопросы? Mail me: forb@k-uralsk.ru.

Check Also

Twitch Extensions. Пишем свое расширение для взаимодействия со зрителями

Два года назад разработчики стриминговой платформы Twitch представили новый способ взаимод…

Оставить мнение