Многие люди желают посмотреть, что находятся у других за компом. После выхода эксплойта для сервиса RPC это стало возможным. Более того, WinXP у рядовых пользователей самая любимая ося, поэтому поиметь шелл на ней не составляет большого труда.

А теперь поглядим на проблему с другой стороны. Например, ты захотел стырить несколько хороших эксплойтов или кредиток и даже знаешь у кого они могут находиться - у трейдеров. А где найти их? Конечно в IRC - на трейдерских каналах ефнета и далнета ;). Это навело меня на мысль - а что если просто собрать информацию на юзеров определенного канала, а затем посканить их на предмет открытого 135 порта (сервис RPC)? Идея простая и реализовал я ее за очень короткое время.

Вначале я хотел просто делать /WHOIS на каждого пользователя, а затем парсить IP-адрес из ответа ircd. Но потом понял, что идею можно реализовать гораздо проще - команда /WHO #channel показывает инфу обо всех юзерах канала, включая айпишник. Задача моего скрипта - составления файла с ip-адресами.

Вот код, который я нарисовал за несколько минут:

#!/usr/bin/perl

## Mass whoiser by Forb (forb@real.xakep.ru).
##
Simply use it: ./whois.pl -s server -p port -c channel (without '#') -o output_file

$SIG{INT}=\&diesock; ## Делаем обработку сигнала на
SIGHUP.

use IO::Socket;
use Getopt::Std; ##
Используем модули сокета и
getopt.

getopt("spco"); ## Изучаем командную строку на предмет заданных параметров

$server=$opt_s || "mesra.kl.my.dal.net";
$port=$opt_p || 6667;
$channel=$opt_c || "kamensk";
$outlog=$opt_o || "ipz.lst"; ##
Определяем внешние параметры, либо устанавливаем их по дефолту
$rand=int(rand(65550)); ##
Генерируем случайное число для ника.
print "Making connection to $server:$port... "; ##
Коннектимся к серверу
$irc=IO::Socket::INET->new("$server:$port") || die print "failed!\n"; ##
Создаем сокет с сервером, либо пишем об ошибке.
$irc->autoflush(1);
$|++; ##
Выключаем буферизацию.
$mynick="SweetBoy".$rand; ##
Составляем ник вида SweetBoy+случайное число.
print "done\nRegistering on server... "; ##
Регистрируемся на сервере.
$irc->send("USER $mynick $mynick $mynick :$mynick\nNICK $mynick\n"); ##
Передаем ему информацию.
print "done\nJoining to #$channel... ";
$irc->send("JOIN #$channel\n"); ##
И заходим на канал
while(!$hang) { ##
Пока не будет определена переменная $hang
$sock=<$irc>; ##
Читаем данные из сокета
(undef,$handler)=split(' ',$sock); ##
И сплитуем их по пробелу, задавая второй параметр в качестве номера сообщения (читай rfc1459 для подробностей).
if ($handler eq 333) { $hang = 1 } ##
Если мы успешно зашли на канал - прерываем чтение
}
undef $hang; ##
Делаем переменную неопределенной.
print "done\nGrabbing info... ";
$irc->send("WHO #$channel\n"); ##
Посылаем команду /WHO
while (!$hang) {
$sock=<$irc>;
(undef,$handler)=split(' ',$sock);
push(@names,$sock)
if ($handler == 352); ##
Если получаем ответ - заносим в массив.
$hang = 1
if ($handler == 315); ##
Если приходит End of /WHO list - завершаем чтение.
}
print "done\nGrabbed ".scalar(@names) ." nicks. Dumping in $outlog... ";
open(IPZ,">$outlog") || die print "failed\n";
foreach $str (@names) {
(undef,$handler,undef,undef,undef,$host,undef,$nick)=split(' ',$str); ##
Выделяем из ответа хост и ник.
print IPZ "$host \# $nick (#$channel)\n" ##
Пишем в лог, если ник не равен нику бота.
unless($nick eq $mynick);
}
print "done\nExiting...\n";
$irc->send("QUIT :bb2all\n");
close($irc); ##
Выходим и закрываем сокет.

sub diesock {
$irc->send("QUIT :HUP!\n"); ##
Если было нажато ctrl+c - корректно выходим из
IRC.

close($irc);
exit;
}

В итоге получаем файл со списком ников. Вот как это работает:

[root@ruhost4 info]$ perl whois.pl -c shells
Making connection to mesra.kl.my.dal.net:6667... done
Registering on server... done
Joining to #shells... done
Grabbing info... done
Grabbed 67 nicks. Dumping in ipz.lst... done
Exiting...
[root@ruhost4 info]$ head -4 ipz.lst
shell3.thebiz.net # _pink`` (#shells)
remain.close.yet.distant.net # yahoo (#shells)
c64077a.aeng.bostream.se # helq (#shells)
194.153.243.86 # gsgsd (#shells)
[root@ruhost4 info]$

Все бы ничего. Но nmap не захотел обрабатывать этот лог из-за комментариев. Поэтому пришлось писать еще один скрипт nmap.pl, который обрабатывал лог и вызывал сканер с различными параметрами. Он гораздо меньше хуизера, но польза от него довольно большая.

#!/usr/bin/perl

$nmap='nmap';
$ports='135';
$file='ipz.lst';
$in='nmap.in';
$out='nmap.out';
$timeout=202; ##
Определяем параметры программы нмапа, портов, входного файла, выходного файла и таймаута.
open(IPZ,"$file");
open(PREP,">$in");
while(<IPZ>) {
($host,$comment)=split('#',$_); ##
Открываем файл, разделяем ip-адрес и комментарии
$host=~s/\s+//g; ##
Убираем пробелы из адреса
print PREP "$host\n"; ##
Пишем в выходной файл айпишник или хост.
}
close(PREP);
close(IPZ); ##
Закроем файлы.

system("$nmap --host-timeout $timeout -p $ports -o $out -iL $in"); ##
Вызываем nmap с поддержкой файла и с записью в лог.

Теперь, просканив IRC, просто запускай nmap.pl и жди. После сканирования всех адресов читай лог сканера и пробуй законнектить эксплойт на сервис. В удачном случае машина тебе
подчинится и ты сможешь скачать базу кредиток или свежих эксплойтов, лишь бы удача сопутствовала ;).

Check Also

В королевстве PWN. Препарируем классику переполнения буфера в современных условиях

Сколько раз и в каких только контекстах не писали об уязвимости переполнения буфера! Однак…

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