Upload
snowytoxa
View
344
Download
0
Embed Size (px)
Citation preview
Еще один недостаток современных клиент-‐серверных
приложений
Антон Сапожников
• Антон Сапожников
• Занимаюсь тестированиями на проникновение больше 6 лет
• CTF player MoreSmokedLeetChicken – DEFCON, CODEGATE, HITB,…
• KPMG
О чем?
• Рассмотрю типовую задачу, возникающую на пентестах
• Обсудим возможные варианты её решения
• Поделюсь своими jps & tricks
Постановка задачи
• Корпоративная среда • Получен удаленный доступ к рабочей станции пользователя
• Пользователь работает с толстым клиентом СУБД/АБС/….
• Как получить доступ к данным в СУБД?
Простые решения
• Понаблюдать за экраном пользователя
• metasploit-‐>meterpreter-‐>screenspy|vnc
Простые решения.2
• Не увидел ничего на экране пользователя? Используй клавиатурный шпион!1
+ metasploit-‐>meterpreter-‐>keylogrecorder – глюкавый – нужно ждать…. иногда очень долго + можно «убить» приложение
• Поискать в файлах пользователя: – C:\users\user1\Desctop\pass.xls – C:\Program Files\My Program\Data\*.*
Не очень простые решения снять дамп памяти приложения • meterpreter-‐>memdump • meterpreter-‐>memory_grep Pros: В памяти можно найти:
– пароли\имена пользователей – конфигурации – куски данных
Cons: – большие объем данных для анализа – только текущие данные пользователя – непонятно что и где искать?
Не очень простые решения.2
Перехват сетевого трафика • windump\*sniff Pros: В трафике можно найти: – пароли\имена пользователей – данные запрашиваемые пользователем
Cons: – большие объем данных для анализа – только текущие данные пользователя – непонятно что и где искать? – данные могут быть зашифрованы
А что если?
• Пароли\ключи в памяти не хранятся • Паролей\ключей в конфигурационных файлах нет
• Сетевой трафик шифруется • К серверу доступ разрешен только с некоторых ip адресов, и нашего в этом списке нет
• Реализована двухфакторная аутентификация
Что делать?
• Хучить (hook) функции работы с сервером в клиентском приложении
<…> h = connect(database,username,pass,…); r = query(h, ‘select PAN, HNAME from CARDS’); <…>
Как делать?
• Перехват функций работы с сокетами + универсальный вариант – нужно реализовывать протокол – данные могут быть зашифрованы
• Перехват функций уровня прикладного протокола или API. – реализация сильно зависит от приложения + удобная работа с сервером
Как делать?.2 Pros: – Обход ограничений по ip адресам – Работает в рамках пользовательской сессии, т.е. на сервере в логах будет только одно соединение
– Обход аутентификации пользователя на сервере – Обход двухфакторной аутентификации при установке соединения с сервером
– Незаметно для пользователя атакуемого приложения
– Возможность напрямую работать с сервером приложения
Как делать?.3
Cons: – Зависимость от конкретной версии приложения
– Права администратора – SeDebugPrivilege
Например для Oracle Работа с СУБД Oracle реализованная через OCI.DLL OCIEnvCreate -‐> envhp 3xOCIHandleAlloc -‐> OCI_HTYPE_ERROR, OCI_HTYPE_SERVER,
OCI_HTYPE_SVCCTX, OCIServerA�ach -‐> srvhp OCIA�rSet -‐> OCI_HTYPE_SVCCTX OCIHandleAlloc -‐> OCI_HTYPE_SESSION 2xOCIA�rSet -‐> username\pass OCISessionBegin -‐> svchp OCIA�rSet -‐> OCI_HTYPE_SVCCTX OCIHandleAlloc -‐> OCI_HTYPE_STMT OCIStmtPrepare -‐> stmt OCIStmtExecute
Например для Oracle.2
– OCIHandleAlloc, дает доступ к envhp – OCIStmtExecute, дает доступ svchp
– Достаточно корректно перехватить всего два вызова.
Как перехватить?
– EasyHooking – DETOURS – DLL Injecjon
• h�p://syprog.blogspot.ru/2012/05/createremotethread-‐bypass-‐windows.html • Начало нужной функции патчим переходом на наш обработчик
– Your way
Как внедрить? suspend_all_threads(processId)); remoteAddress = (unsigned int)VirtualAllocEx(vicjmProcess, NULL, sizeof(shellCode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(vicjmProcess, (LPVOID)remoteAddress, (LPCVOID)shellCode, shellCodeSize, &aux));
vicjmThread = OpenThread(THREAD_ALL_ACCESS, FALSE, mainThread);
GetThreadContext(vicjmThread, &ctx);
Как внедрить?.2
WriteProcessMemory(vicjmProcess, (LPVOID)ctx.Esp, (LPCVOID)&ctx.Eip, sizeof(unsigned int), &aux);
ctx.Eip = remoteAddress + sizeof(unsigned int); SetThreadContext(vicjmThread, &ctx) resume_all_threads(processId);
Итого
– Шлем запросы прямо в СУБД – Нет необходимости аутентифицироваться – Используем уже установленное соединение … – Profit!!1!
КОНЕЦ
Антон Сапожников @snowytoxa