Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

articles:firewall_thr [2017/09/05 02:55] (текущий)
Строка 1: Строка 1:
 +====== firewall_thr ======
 +<​sub>​{{firewall_thr.odt|Original file}}</​sub>​
 +
 +====== методы обхода брандмауэров ======
 +
 +крис касперски,​ ака мыщъх, no-email
 +
 +**брандмауэры (они же ****firewall****'​ы) сейчас используются повсеместно. их встраивают в ****DSL****-модемы,​ ****WiFi****-точки доступа,​ маршрутизаторы,​ операционные системы,​ антивирусы и другие программные пакеты типа ****SyGate****Personal****Firewall**** или ****Outpost****. но так ли они надежды,​ как утверждает реклама?​**
 +
 +**{{firewall_thr_Image_0.jpg?​493}}**
 +
 +Рисунок 1 посреди огненных рек
 +
 +===== введение =====
 +
 +Прежде чем начать,​ необходимо выяснить,​ что такое персональные брандмауэры и чем они отличаются от не-персональных (за отсутствием подходящей терминологии назовем их "​внешними"​). Внешний брандмауэр представляет собой штуку, включенную в разрыв между сетевым кабелем (Ethernet/​WiFi/​Dialup) и сетевой картой охраняемого узла (не важно — сервером или клиентской машиной). Конструктивно внешний брандмауэр может быть реализован и как микросхема,​ встроенная в DSL-модем/​материнскую плату, и как самостоятельный узел — маршрутизатор/​мост,​ построенный на базе IBM PC и управляемый любой подходящей операционной системой (например,​ LINUX, хотя и Windows на худой конец сгодится тоже).
 +
 +Возможности воздействия на внешний брандмауэр минимальны. Если он сконфигурирован правильно и не имеет дыр, то проникнуть на атакуемую машину извне сети очень трудно. А вот вырваться из-за внешнего брандмауэра на свободу ничего не стоит, поскольку он ничего не знает ни о процессах,​ ни о потоках. Ему неведомо понятие "​зловредной программы"​. Все, что он имеет в своем распоряжении — это список открытых портов,​ среди которых в обязательном порядке присутствует 80-порт,​ связанный с WEB. Следовательно,​ любое приложение может беспрепятственно устанавливать соединения с любыми IP-адресами по 80-порту,​ скрытно пересылая конфиденциальную информацию или устанавливая back-door, и брандмауэр _ничего_ не сможет с этим сделать (особенно,​ если зловредная программа "​обернет"​ пересылаемые данные в HTTP-запросы),​ поскольку он не в состоянии отличить _кто_ посылает TCP/IP пакеты:​ FireFox.exe или evil-virus.exe!
 +
 +Персональные брандмауэры устанавливаются непосредственно на защищаемый ими компьютер,​ поэтому,​ не только поддерживают списки "​доверенных приложений",​ но так же пытаются отслеживать факт внедрения в них постороженного кода, чтобы малварь не смогла передать информацию "​руками"​ FireFox'​а или IE. Все это, конечно,​ очень замечательно,​ но!!! Тот факт, что персональный брандмауэр находится на _той_ _же_ самой машине,​ что и малварь,​ делает его чрезвычайно уязвимым против атак на сам брандмауэр. Малварь,​ заполучившая администраторские права, может делать _абсолютно_ все, что угодно,​ в том числе и обмениваться пакетами в обход брандмауэра!
 +
 +Поэтому,​ на вопрос:​ какой тип брандмауэров лучше? существует только один ответ: для надежной защиты необходимо ставить оба, но и в этом случае нет никаких гарантий,​ что нас не атакуют!
 +
 +{{firewall_thr_Image_1.jpg?​553}}
 +
 +Рисунок 2 брандмауэр,​ сражающийся с x-gragon'​ом
 +
 +===== из внешней сети во внутреннюю через брандмауэр =====
 +
 +Вот компьютер,​ который мы хотим атаковать,​ но снаружи его находится неприступная стена брандмауэра. В ней есть порт, но он наглухо закрыт. Какие будут идеи по поводу того, как его пробить?​ Тут уместно сделать маленькое лирическое отступление,​ поскольку подавляющее большинство пользователей _ни_ _хрена_ не понимает,​ что такое брандмауэр и зачем он вообще нужен!
 +
 +Вообразим себе домашнюю (или корпоративную) сеть с приватными ресурсами (ведь это очень утомительно каждый раз вводить пароль при доступе к файловому хранилищу,​ реализованному через MicrosoftShared или ftp) или такой прозаичной вещью как HTTP-Proxy сервер. Чтобы не покупать для каждой машины свой IP (с IP-адресами сейчас проблема),​ администратор назначает всем машинам внутрисетевые IP. Реальный IP получает только одна машина,​ на ней же устанавливается Proxy-сервер,​ через который ходят все остальные. "​Все"​ в данном случае следует понимать буквально. Любой хакер, обнаруживший путем сканирования работающий Proxy может использовать его в своих целях. А за трафик будет платить владелец атакованной машины. Оно ему надо? Вот тут-то брандмауэр и выручает,​ закрывающий Proxy-порт для всех нелокальных узлов (ну, при желании,​ можно добавить несколько адресов удаленных партнерских фирм). Тоже самое и с ftp. Внутри сети с ним можно общаться беспрепятственно,​ но вот все внешние подключения будут безжалостно отсечены брандмауэром!
 +
 +Отсюда — если у вас нет ни Proxy, ни ftp, и вы не используете разделяемые ресурсы не защищенные паролем — на хрена вам вообще нужен брандмауэр?​! Разве, чтобы почувствовать себя крутым и продвинутым парнем. А то уже некоторые без брандмауэра в сеть вообще выходить бояться. Другой вопрос,​ что коварная Windows (в отличии от демократично настроенной LINUX) открывает для своих нужд кучу на фиг никому не нужных портов,​ которые не так-то просто отключить и которые содержат уязвимости. Достаточно вспоминать червя MSBlast, распространяющегося через дыру в сервисе DCOM, висящем на 135 порту и реально полезным только в корпоративных сетях, разделенных на домены.
 +
 +Вот, к примеру,​ список портов,​ открытых на моем компьютере (см. рис. 3). Для того, чтобы узнать,​ какие порты открыты,​ достаточно вызвать штатную утилиту netstat.exe передав ей в командной строке ключ "​-a"​.
 +
 +{{firewall_thr_Image_2.png?​553}}
 +
 +Рисунок 3 список портов,​ открытых на мыщъх'​ином компьютере
 +
 +Бесплатная утилита TCPView от Марка Руссиновича (http://​www.sysinternals.com/​Utilities/​TcpView.html),​ кстати говоря,​ распространяемая в исходных текстах (!),​ покажет намного больше информации (в частности,​ сообщит какой процесс пользует тот или иной порт) и поможет закрыть любое соединение,​ кроме, к сожалению,​ системных (см. рис. 4) и такие порты приходится закрывать уже на брандмауэре или… постоянно устанавливать свежие заплатки,​ латая систему путем затыкания дыр (но это не лучшее решение,​ поскольку о многих дырах Microsoft узнает в последнюю очередь).
 +
 +{{firewall_thr_Image_3.png?​553}}
 +
 +Рисунок 4 TCPView не может закрыть системное соединение
 +
 +Для более детального анализа трафика можно использовать sniffer (который встроен практически в каждый профессиональный брандмауэр) или утилиту TDIMon все от того же Марка Руссиновичка (http://​www.sysinternals.com/​Utilities/​TdiMon.html),​ которая покажет трафик,​ проходящий через TDI-драйвер — один из наиболее низкоуровневых сетевых драйверов (см. рис. 5).
 +
 +{{firewall_thr_Image_4.png?​553}}
 +
 +Рисунок 5 внешний вид утилиты TDIMon
 +
 +Но все-таки! Как на счет ответа на поставленный ранее вопрос?​! Можно ли проникнуть сквозь закрытый порт или нет? Ну… что тут сказать. Брандмауэры первых поколений обходились только так. Достаточно было послать сильно фрагментированный TCP-пакет,​ настолько фрагментированный,​ что целевой порт не попадал в первый IP-пакет,​ а, поскольку,​ функцией сборки IP-пакетов брандмауэр по ряду причин не оснащен,​ он свободно пропускал эту "​бомбу"​. Но это, в основном относится к внешним брандмауэрам. А персональные работают сразу на многих уровнях,​ в том числе контролируя пакеты,​ уже собранные драйвером TCPIP.SYS и с ними этот фокус уже не проходит. Хуже того! Они могут забить тревогу,​ поскольку в реальной жизни такие фрагментированные пакеты практически никогда не встречаются!!!
 +
 +Но даже если брандмауэр пропустит такой пакет, то это не сильно поможет атакующему,​ поскольку все современные сервера (ftp, Proxy) давным-давно научились различать интерфейсы сетевых соединений,​ автоматически отсекая нежелательные подключения. Взять хотя бы установленный у меня EtlinHTTPProxyServer,​ связывающий машины моей локальной сети с внешним миром. Чтобы не закрывать порт на брандмауэре и не назначать на доступ к Proxy пароль (которые поддерживают не все программы),​ мыщъх поступил проще, разрешив Proxy принимать подключения только с одного интерфейса — интерфейса локальной сети (см. рис. 6). Тоже самое относится к внутреннему ftp серверу.
 +
 +{{firewall_thr_Image_5.png?​326}}
 +
 +Рисунок 6 HTTPProxyServer принимает подключения только с одного интерфейса — интерфейса локальной сети
 +
 +Выходит,​ что даже если атакуемый порт открыт на брандмауэре (или брандмауэр удалось пробить каким-нибудь стенобитным орудием),​ вовсе не факт, что атака возымеет успех!
 +
 +Нет, ну это не серьезно и не интересно! А как же атаковать тогда?​! Вот несколько секретов,​ которые могут помочь начинающим. Во-первых,​ можно попробовать атаковать один из доверенных узлов, путем посылки вируса во вложении или использования подходящей уязвимости. Крупные корпорации обычно так и атакуются. Они имеют множество подразделений во всех странах мира, но далеко не в каждом из них работают грамотные и ответственные администраторы.
 +
 +Во-вторых,​ можно атаковать один из узлов локальной сети. А как это можно сделать?​ Самое простое (но уже далеко не самое актуальное) послать в письме специальную программу. Если только эта программа не стащена с какого-то хакерского сайта, а написана самостоятельно,​ индивидуально для данной конкретной атаки, то антивирусы с высокой степенью вероятностью пропустят ее, но… пользователь за последнее время резко поумнел и что попало уже не запускает,​ поскольку выволочка,​ устроенная администратором,​ за последний запуск "​соблазнительного"​ вложения еще свежа в его памяти. К тому же, сейчас появилась "​модная"​ тенденция настраивать корпоративные серверы так, чтобы все исполняемые файлы автоматически вырезались,​ даже если они находятся в архивах! Впрочем,​ к домашним локальным сетям это не относится и женщины по-прежнему запускают все, что угодно.
 +
 +В-третьих,​ можно заманить жертву на специальным образом сконструированную WEB-страничку,​ эксплуатирующую ту или иную уязвимость в IE. Или не обязательно уязвимость! Редкий пользователь знает про уровни безопасности. На странички,​ открываемые из сети, действуют весьма драконические ограничения и Java-скрипты отдыхают. Но вот при последующем открытии той же самой странички,​ сохраненной на диск, ситуация меняется до чрезвычайности! Так что проникнуть в локальную сеть для опытного хакера не составит никакого труда!
 +
 +Наконец,​ всеми "​горячо любимая"​ операционная система Windows содержит _столько_ дыр, что может быть легко атакована с приобретением привилегий SYSTEM с которыми отключить брандмауэр не составит никакого труда!!!
 +
 +Вот не полный перечь способов обхода брандмауэров извне. И он действительно работает,​ особенно в свете того, что приобретать легальные продукты наши соотечественники (да и зарубежные товарищи) не очень-то любят, а демонстрационный срок не бесконечен и… рано или поздно человек залезает в Осла (или другое животное) и начинает тянуть его за хвост в поисков кряков,​ многие из которых содержат в себе самый настоящий back-door, прочно вгрызающийся в компьютер и дезактивирующий брандмауэр. О том, как это сделать,​ мы сейчас и поговорим.
 +
 +{{firewall_thr_Image_6.jpg?​553}}
 +
 +Рисунок 7 брандмауэр после боя с x-gragon'​ом
 +
 +===== из внутренней сети во внешнюю через брандмауэр =====
 +
 +Что касается проникновения во внешнюю сеть, огражденную недемократически настроенным _внешним_ брандмауэром,​ то мыщъх уже писал об этом в статье "​побег через брандмаузер плюс терминализация всей NT", электронную копию которой можно свободно утянуть с ftp://​nezumi.org.ru/​pub/​zq-worm-firewall.zip,​ так чего же здесь повторяться?​! Напомню только,​ что мыщъх'​ый сервер работает не все время, а только тогда, когда мыщъх активно вращает хвостом,​ то есть не спит (сейчас это где-то между 21:00 и 12:00 по Москве со сдвигами в ту или иную сторону).
 +
 +Что же касается персональных брандмауэров,​ то вырваться из-под их гнета значительно сложнее. Большинство публикаций на эту тему предполагает,​ что атакующая программа имеет администраторские привилегии с помощью которых она может спуститься на нулевое кольцо термоядерного уровня и дезактивировать все датчики брандмауэра с той же осторожностью,​ с какой сапер разминирует бомбу. Очень хорошая статья "​Обход OutpostFirewall 3.x и 4.0 в Kernelmode"​ лежит на http://​www.wasm.ru/​article.php?​article=outpostk. Она подробно описывает методику перехвата и фильтрации пакетов,​ используемую персональными брандмауэрами,​ а поэтому справедлива не только для одного лишь Outpost'​а,​ но так же и для других продуктов.
 +
 +Главный минус — это права администратора. Статья ничего не говорит о том, как их заполучить. И хотя под администратором сидит свыше половины домашних пользователей XP, да и в самой операционной системе имеется множество дыр, позволяющих хакеру несанкционированно повышать уровень своих привилегий вплоть до SYSTEM, представляет интерес обойти брандмауэр,​ располагая всего лишь правами простого пользователя.
 +
 +Начнем с того, что большинство брандмауэров не отслеживают локальные подключения по петле 127.x.x.x, поскольку такие пакеты идут совсем по другому маршруту. Поэтому,​ если на компьютере установлен какой-нибудь сервер,​ хакер может напрямую подключаться к нему. Брандмауэр и знать ничего не будет. Если, конечно,​ сам сервер включает 127.x.x.x в список доступных интерфейсов. А если не включает?​! Хорошо,​ тогда передаем атакующую программу на соседнюю локальную машину (локальный трафик,​ как правило,​ не запрещается брандмауэром,​ во всяком случае пересылка файлов в большинстве случаев все-таки возможна) Ну а дальше атакующей программе остается всего лишь связаться с сервером по разрешенному интерфейсу локальной сети, если, конечно,​ локальная сеть вообще есть.
 +
 +Очень многие ставят персональный брандмауэр на одиночный компьютер только затем, чтобы следить за активностью приложений,​ ломящихся в сеть. И если вдруг наша хакерская программа (не являющая ни IE, ни FireFox'​ом) вдруг постучаться в 80 порт, брандмауэр тут же поднимет тревогу. Как мол, это так!!! Многие хакеры пытаются внедриться в адресное пространство доверенных приложений (того же FireFox, например) посредством API-функций CreateRemoreThread()/​WriteProcessMemory(),​ но брандмауэры за этим зорко следят и начинают жутко верещать "​держите вора!"​. Модификация файла на диске так же не дает ожидаемых результатов,​ поскольку брандмауэр проверяет (может проверять) контрольную сумму при его запуске. Правда,​ тут есть одна небольшая лазейка. Известная ветка реестра AppInit_DLLs:​ все DLL, перечисленные в ней, проецируются на адресные пространства каждого запускаемого процесса со всеми вытекающими отсюда последствиями. Однако все больше и больше брандмауэров начинает контролировать AppInit_DLLs,​ сообщая о появлении в ней новых элементов,​ а то и вовсе автоматически удаляет их, так что этот прием уже уходит в небытие.
 +
 +А вот что по-прежнему остается актуальным ‑ так это изменение настроек браузера. Которые хранятся в совершенно бесхозном и никем неохраняемом виде. Взять хотя бы FireFox. Адрес Proxy-сервера хранится в файле \DocumentsandSettings\kriskaspersky\Application\ Data\Mozilla\Firefox\Profiles\4uszwife.default\prefs.js в строке "​user_pref("​network.proxy.http",​ "​80.75.2.146"​);",​ которую _никакой_ брандмауэр не проверяет. Если подставить сюда адрес нашего узла (естественно,​ для этого необходимо иметь статический IP, или динамический IP, повешенный на динамический же DNS), мы сможем грабить весь трафик или даже подсовывать жертве левый контент (см. рис. 8),​ а брандмауэр даже и не пикнет! ы!
 +
 +{{firewall_thr_Image_7.png?​413}}
 +
 +Рисунок 8 изменение настроек FireFox в обход брандмауэра
 +
 +Кстати говоря,​ тот же FireFox большей частью написан на Java, целостность которой брандмауэры контролировать еще не научились,​ ограничиваясь проверкой кодовой секции,​ а это значит,​ что мы можем модифицировать FireFox по своему усмотрению,​ не рискуя,​ что брандмауэр застанет нас врасплох. Ну, а если все-таки застанет и выкинет вот такое противное окно, как показано на рис. 9? Что мы будем делать тогда?​!
 +
 +{{firewall_thr_Image_8.png?​553}}
 +
 +Рисунок 9 типичная реакция персонального брандмауэра на неудачную атаку
 +
 +А вот тогда мы используем старый как дуб, но все еще работающий трюк с эмуляцией клавиатурного/​мышиного ввода. Попросту говоря,​ отследим появление окна брандмауэра с надписью "​SyGatePersonalFirewall"​ (что можно сделать с помощью API-функции FindWindow),​ перечисляем дочерние элементы управления через EnumWindows и… жмем на кнопку "​yes",​ прежде чем юзер успеет сообразить:​ что там промелькнуло на экране.
 +
 +Естественно,​ каждый брандмауэр требует своего подхода,​ но поскольку их существует не так уж и много, нам будет легко написать программу,​ поддерживающую их все. Ключевой фрагмент,​ ответственный за нажатие выглядит так:
 +
 +// ПЕРЕЧИСЛЕНИЕ ДОЧЕРНИХ ОКОН БРАНДМАУЭРА
 +
 +// =======================================
 +
 +// получаем хэндлы всех интересующих нас окон
 +
 +// (порядок окон определяем либо экспериментально,​
 +
 +// либо прогоном с отладочным выводом информации по каждому окону)
 +
 +HWDN CALLBACK EnumChildWindowsProc(HWND hwnd,LPARAM lParam)
 +
 +{
 +
 +static N=0;
 +
 +
 +
 +switch(++N)
 +
 +{
 +
 +case 3:// галочка "​remember"​
 +
 +remember = hwnd;
 +
 +break;
 +
 +
 +
 +case 4:// кнопка "​no"​
 +
 +no = hwnd;
 +
 +break;
 +
 +
 +
 +case 5:// кнопика "​detail"​
 +
 +detail = hwnd;
 +
 +break;
 +
 +
 +
 +case 6:// кнопика "​yes"​
 +
 +yes = hwnd;
 +
 +return yes;
 +
 +
 +
 +}return 0;
 +
 +}
 +
 +// имитация нажатия на кнопку ​ yes
 +
 +// ===============================
 +
 +foo(HWND hWnd)
 +
 +{
 +
 +SendMessage(hWnd,​WM_SETFOCUS,​1,​0);​
 +
 +SendMessage(hWnd,​BM_SETSTATE,​1,​0);​
 +
 +PostMessage(hWnd,​WM_KILLFOCUS,​0,​0);​
 +
 +}
 +
 +Листинг 1 ключевой фрагмент,​ имитирующий нажатие на кнопку "​yes"​
 +
 +Некоторые пояснения к листингу. Первое и главное. Менее привилегированное приложение _может_ посылать сообщения окну более привилегированного приложения,​ причем последнему будет очень сложно определить кто именно нажал на кнопку:​ пользователь или программа. Однако,​ программно нажать на кнопку не так-то легко! Но ведь нам же хочется,​ чтобы атака осталась незамеченной и брандмауэр молчал как партизан после расстрела (именно после, а не перед, поскольку,​ после нажатия на "​yes"​ брандмауэру будет совершенно не о чем волноваться).
 +
 +Большая ошибка начинающих хакеров состоит в том, что они ограничиваются всего лишь одной посылкой сообщения BM_SETSTATE,​ а, как показывает практика,​ для элемента управления типа "​кнопка"​ этого явно не достаточно и такое сообщение еще не приводит к ее нажатию. Почему?​ Ошибка кроется в том, что для корректной эмуляции ввода мы во-первых,​ должны установить фокус (сообщение WM_SETFOCUS),​ а после перевода кнопки в состояние "​нажато"​ (сообщение BM_SETSTATE) этот фокус убить (сообщение WM_KILLFOCUS),​ ведь, как известно даже желторотым пользователям,​ кнопки срабатывают не в момент их нажатия,​ а в момент //​отпускания//​. Не верите?​ Поэкспериментируйте с любым приложениям и убедитесь в справедливости сказанного.
 +
 +Кстати,​ забавный трюк: если под NT/W2K в сообщение WM_KILLFOCUS передать недействительный дескриптор окна, получающего на себя бразды правления,​ то операционная система по понятным соображениям не передаст фокус несуществующему окну, но у активного окна фокус все-таки отберет. Windows 9x,​ напротив,​ оставляет фокус активного окна неизменным! Вот такая разница между двумя операционными системами. Еще одна делать на последок. Если в роли убийцы фокуса выступает функция API-SendMessage,​ то поток, эмулирующий ввод, блокируется вплоть до того момента,​ пока обработчик нажатия кнопки не возвратит циклу выборки сообщений своего управления. Чтобы этого не произошло,​ – используйте API-функцию PostMessage,​ которая посылает убийцу фокуса и, не дожидаясь от него ответа,​ как ни в чем не бывало продолжает выполнение.
 +
 +Однако,​ разработчики брандмауэров тоже не байтом деланы и всячески сопротивляются эмуляции ввода. Они могут вообще не обрабатывать указанных сообщений,​ реагируя например,​ на WM_KEYDOWN или что-то еще. Коварство Windows заключается в том, что она позволяет нажать кнопку _очень_ многими путями. Но ведь не ковыряться же с каждым отдельно взятым брандмауэром?​!
 +
 +Существует весьма простой и элегантный путь выхода из этой, казалось бы, безнадежной ситуации. Перемещаем мышиный курсор к нужной кнопке API-функцией MouseMove (координаты кнопки определяются как и прежде через перечисление элементов управления),​ после чего вызываем API-функцию SendInput, имитирующую клавиатурный ввод на очень низком уровне. И все!!! Брандмауэр отдыхает!!!
 +
 +{{firewall_thr_Image_9.png?​329}}
 +
 +Рисунок 10 брандмауэр в неравноправной борьбе с хакерами
 +
 +===== заключение =====
 +
 +Разумеется,​ мы рассмотрели далеко не все возможные способы борьбы с персональными и внешними брандмауэрами,​ и неизвестно сколько времени они (способы,​ не брандмауэры!) еще продержатся на плаву. Но хакерская мысль не стоит на месте! Новые идеи рождаются буквально каждый день. Главное — крутить хвостом!
 +
 +{{firewall_thr_Image_10.jpg?​553}}
 +
 +Рисунок 11 брандмауэр — это такая штука, которая контролирует трафик,​ а трафика через него проходит много
 +
 +