| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
article->GetIntro();
Сразу оговорюсь, я не хакер, а всего лишь программист и немного математик. Поэтому все свои замечания относительно бага можно слать исключительно в /dev/null.
Помнится, когда я еще постигал азы скипткиддича (link to Harry Potter %)), натолкнулся на элементарнейший баг в скрипте includer.cgi. С его помощью можно было просматривать файлы на сервере и пользоваться командной строкой. Но немного позже я заметил, что многие перешли на версию 1.1 этого замечательного скрипта. Там был введен "очень крутой" алгоритм зашифровки имени файла, дабы хакерам неповадно было пользоваться оставленными дырами. Функция зашифровки была скрыта где-то в недрах того портала, откуда каждый желающий может скачать этот скрипт. На самом деле, ее легко написать на основе функции зашифровки, но об этом позже. С самого начала меня немного напугал текст функции Decrypt. Там использовались какие-то открытые и закрытые ключи, манипуляции над строками, символами, их кодами. Представлялось, что предстоит кропотливая работа по выявлению закрытого ключа. Но, скорее всего, программист, написавший эту вавилонскую башню, больше надеялся на пугающий код функций, чем на стойкость криптоалгоритма.
article->GetPart("Криптография? Ничего подобного!");
Как выяснилось, это даже не криптоалгоритм в привычном понимании. Речь идет только о представлении данных в немного ином виде. Настоящий криптоалгоритм старается не выдать точного размера зашифрованных данных, его нельзя взломать на основе анализа результатов подбора пароля. Тут же мы имеем очень простую структуру кодирования:
1. закодированная строка ровно в 2 раза длиннее исходной строки
2. закодированная строка хранится в обратном порядке
Последнее очевидно следует из вида функции rot13, которая применяется к результатам декодирования.
sub rot13{
my $source = shift (@_);
$source =~ tr /[a-m][n-z]/[n-z][a-m]/;
$source =~ tr /[A-M][N-Z]/[N-Z][A-M]/;
$source = reverse($source); # <- тут мы инвертируем строку!!!
return $source;
}
Еще немного информации об этом алгоритме могут дать результаты кодирования разных строк по одному ключу:
Your Password: encryptkey
Your File Name: index.html
Your Encrypted File Name: soshahaczcspaxsmahak
Your Password: encryptkey
Your File Name: ../index.html
Your Encrypted File Name: soshahaczcspaxsmahakhmhahi
Your Password: encryptkey
Your File Name: ../../index.html
Your Encrypted File Name: soshahaczcspaxsmahakhmhahizizczy
Your Password: encryptkey
Your File Name: ../../../index.html
Your Encrypted File Name: soshahaczcspaxsmahakhmhahizizczyzphzhp
Отсюда можно видеть, что каждый символ исходной строки кодируется каким-то символом из пароля, а не всем паролем. К тому же, результат кодирования какого-либо символа не влияет на результат кодирования следующего символа, что не может не радовать. Основные приготовления к декодированию сделаны. Приступаем к следующей фазе нашей работы.
article->GetPart("Математика алгоритма декодирования.");
Функция Decrypt состоит из 3х частей:
1. преобразование текстовой строки в массив char (также строку)
2. декодирование с помощью закрытого ключа (XOR)
3. простейшие финальные манипуляции над строкой (rot13)
Открытый ключ есть строка "asdfhzxcvnmpoiyk". С помощью нее получается строка с шестнадцатиричным кодом:
a -> 0
s -> 1
...
y -> e
k -> f
Каждая пара, обозначающая шестнадцатиричный код символа, заменяется непосредственно на сам символ.
для выполнения 2й части необходимо дописать закрытый ключ сам к себе столько раз, чтобы длина получившейся строки была не меньше длины строки с закодированными данными. Далее для каждых i-х символов (точнее, для их кодов) закрытого ключа (длинного) и строки, полученной в предыдущей части алгоритма, выполняем исключающее "ИЛИ" (XOR). Полученный код символа заменяем непосредственно на сам символ.
3я часть состоит из замены в строке символов в соответствии с таблицей:
a -> n A -> N
b -> o B -> O
c -> p C -> P
... ...
k -> x K -> X
l -> y L -> Y
m -> z M -> Z
n -> a N -> A
o -> b O -> B
p -> c P -> C
... ...
x -> k X -> K
y -> l Y -> L
z -> m Z -> M
А затем полученная строка записывается в обратном порядке. Voila.
article->GetPart("Математика алгоритма кодирования.");
Для кодирования все делаем в обратном порядке.
Т.к. rot13(rot13($str))==$str, то можно использовать уже готовую функцию rot13.
Как и при декодировании подготавливаем длинный закрытый ключ.
Далее для каждых i-х символов закрытого ключа (длинного) и промежуточной строки (результат rot13) выполняем исключающее "ИЛИ" (XOR). Результат этой операции обозначим как $c_code. Далее вычисляем $c_code/16 и $c_code%16. Полученные значения - номера символов из открытого ключа, которые (символы) нужно записать в том же порядке.
article->GetPart("Как подобрать секретный ключ?");
Все очень просто. Необходимо просто сгенерировать строку необходимой длины из валидных символов и "подсунуть" ее скрипту. Естественно, вероятность того, что такого имени файла не существует, очень высока. Тогда мы получим сообщение типа "Includer Error: The file arlrxgclepar was not found". Остается только получить имя файла, применить к нему функцию rot13 и посимвольно поXORить с результатом 1й части функции Decrypt. Пароль получен!
Кстати, есть гораздо более простой путь. Если подсунуть скрипту строку из символов "a" длиной 2*l, то применяя функцию rot13 к имени файла, получаем пароль длины l. 8))
article->GetPart("Код");
Код, реализующий получение пароля, написан EVulture[B.o.I], размещен на сайте команды Brotherhood of illusions (www.boiteam.net) и в разделе files этого номера журнала.
article->GetPart("Greetz");
Greetz 2:
[x] B.o.I
[x] rst
[x] GHC
[x] all our friends & people who know us
article->GetOutro();
Что же можно сказать в заключение? Польза от полученного пароля несомненно есть: можно зашифровать любую строку и, тем самым, использовать баг, присущий всем includer'ам. А еще этот пароль может подойти к FTP, почте админа или еще куда. В любом случае, удачи!
|
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |