Ломаем стены или обход контент фильтров

1 июля 2010 г.

«Знание является наградой за действие»
z0mbie

Приветствую тебя мой дорогой читатель! Сегодня мы рассмотрим одну из тем, которая мучает наверное почти всех пользователей:
обход систем фильтрации. Буквально на пальцах будет объяснен метод обхода популярного фильтра «Персональный клиент фильтрации (ПКФ).»

Who is who?

Система фильтрации может быть реализована в виде прокси сервера, перехватов send/recv из ws2_32.dll и т.д Фильтр обычно ставится как и несговорчивым админом, так и родителям, дабы их чадо не лезло в темные углы необъятной Сети.Представим себе вполне обыденную картину: пользователь серфит по Сети в поисках нужной ему информации, и отыскав нужный ему ресурс
переходит на него, и БАЦ! Вместо драгоценной информации на экран выводится сообщение «Соединение заблокировано фильтром». Именно такая ситуация постигла и меня, когда в образовательных учреждения массово начали устанавливать фильтры, а точнее «Персональный клиент фильтрации (ПКФ)».Недолго думая, был проведен анализ этой программы и выявлены слабые места.

Практическая магия

И так, берем дистрибутив программы, вогружаем его в виртуальную машину, попутно запустив Filemon, устанавливаем фильтр. Сразу же выясняется, что политика защиты банальна и наличие лицензии проверяется на стадии установки программы. ОК, даем команду dir и смотрим на содержимое того, с чем нам сейчас предстоит воевать:

Внимание привлекает два файла: FilterLSP.dll и LCFServicePS.dll. Судя по названию, разработчики решили создать LSP модуль. Что такое LSP модуль? LSP он же Layered Service Provider фича появившаяся в Windows Sockets 2.0, позволяющая программисту собственные callback’и
для обработки функций WinSock. Основная фишка вот в чем: например вызывается эдакая функиця из ws2_32.dll (send), но так установлен наш LSP, запрос пойдет через нас и мы с легкостью читать/писать данные из пакета. Ну, хватит лирики, приступим к практическй части. Грузим файл LCFServicePS.dllв IDA и ждем пока дизассемблер выплюнет нам листинг. Для экономии времени я не буду здесь вдаваться в подробности работы FilterLSP.dll, но скажу одно — она действительно фильтриурет траффик. Ок, когда IDA полностью заглотила файл, жмем Shift+F3 или View->open subviews->Functions.

При беглом осмотре в глаза бросается любопытная функция DllRegisterServer. Двойным кликом переходим на нее:

.text:100020E0 public DllRegisterServer
.text:100020E0 DllRegisterServer proc near
.text:100020E0 mov eax, pProxyFileList
.text:100020E5 mov eax, [eax+4]
.text:100020E8 cmp dword ptr [eax], 0
.text:100020EB jz short loc_10002105
.text:100020ED mov ecx, [eax]
.text:100020EF mov eax, [ecx]
.text:100020F1 mov edx, hDll
.text:100020F7 push eax ; pclsid
.text:100020F8 push offset pProxyFileList ; структура pProxyFileList
.text:100020FD push edx ; hDll
.text:100020FE call ds:NdrDllRegisterProxy
.text:10002104 retn

Ок, смотрим внимательно, что тут у нас есть: вызывается функция NdrDllRegisterProxy, ка и положено с кучей параметров:

RPCRTAPI HRESULT RPC_ENTRY NdrDllRegisterProxy(
__in HMODULE hDll,
__in const ProxyFileInfo **pProxyFileList,
__in const CLSID *pclsid
);

Первым делм заносится структура pProxyFileList имеющая вид:
pProxyFileList_0 dd offset aIdbinit

dd offset aIlogs ; "ILogs"
dd offset aIcategory ; "ICategory"
dd offset aIpolicy ; "IPolicy"
dd offset aIworktimes ; "IWorkTimes"
dd offset aItray ; "ITray"
dd offset aIgroup ; "IGroup"
dd offset aIenumgroups ; "IEnumGroups"
dd offset aIenumusers ; "IEnumUsers"
dd offset aIupdatedata ; "IUpdateData"
dd offset aIenumcategorie ; "IEnumCategories"
dd offset aImanager ; "IManager"
dd offset aIenumpolicy ; "IEnumPolicy"
dd offset aIuser ; "IUser"
dd offset aIfilter ; "IFilter"
dd offset aIauthorize ; "IAuthorize"

как видно, в ней перечислены все параметры активной сессии.

Обход

Как мы уже поняли программа регистрирует LSP модуль и пропускает через себя весь трафик. Соответственно, чтобы обойти фильтр нам надо удалить
этот модуль. Удалить не в смысле стереть файл, а стереть информацию о модуле в реестре. Удалить запись можно двумя путями:
1. Использование встроенной команды netsh. Параметр запуска будет таков: netsh winsock reset
2. использование программы AVZ. Запускаем AVZ, переходим в Менеджер Winsock SPI (LSP, NSP, TSP), далее вкладка
Поставщики тарнспортных протоколов (TSP, LSP), записи установленной фильтром три:

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

Вуаля! Фильтр повержен

Выводы

Компаниям выпускающие подобные фильтры стоило бы проверять наличие записей в реестре, иначе все может повториться как здесь написано.
Конечно, методы фильтрации не заканчиваются, существуют более сложные фильтры основанные на перехвате NDIS, но это уже совсем другая история.

Теги: рубрика Программирование
  • Похожие статьи
  • Предыдущие из рубрики