• Партнер

  • Сидя в интернете, ненавязчиво (или уже навязчиво, как у меня)
    охота что-нибудь зарутить, то есть взять удаленно рут-доступ на какой-нибудь 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.

    Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии