Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Еще	
  один	
  недостаток	
  
современных	
  клиент-­‐серверных	
  
приложений	
  
Антон	
  Сапожников	
  
•  Антон	
  Сапожников	
  
•  Занимаюсь	
  тестированиями	
  на	
  
проникновение	
  больше	
  6	
  лет	
  
•  CTF	
  player	
  MoreSmokedLeetChicken	
  
– DEFCON,	
  CODEGATE,	
  HITB,…	
  
•  KPMG	
  
О	
  чем?	
  
•  Рассмотрю	
  типовую	
  задачу,	
  возникающую	
  
на	
  пентестах	
  
•  Обсудим	
  возможные	
  варианты	
  её	
  решения	
  
•  Поделюсь	
  своими	
  jps	
  &	
  tricks	
  
Постановка	
  задачи	
  
•  Корпоративная	
  среда	
  
•  Получен	
  удаленный	
  доступ	
  к	
  рабочей	
  
станции	
  пользователя	
  
•  Пользователь	
  работает	
  с	
  толстым	
  клиентом	
  
СУБД/АБС/….	
  
•  Как	
  получить	
  доступ	
  к	
  данным	
  в	
  СУБД?	
  
Простые	
  решения	
  
•  Понаблюдать	
  за	
  экраном	
  пользователя	
  
•  metasploit-­‐>meterpreter-­‐>screenspy|vnc	
  
еще один недостаток современных клиент серверных приложений
Простые	
  решения.2	
  
•  Не	
  увидел	
  ничего	
  на	
  экране	
  пользователя?	
  
Используй	
  клавиатурный	
  шпион!1	
  
+	
  	
  metasploit-­‐>meterpreter-­‐>keylogrecorder	
  
–  глюкавый	
  
–  нужно	
  ждать….	
  иногда	
  очень	
  долго	
  
+	
  	
  можно	
  «убить»	
  приложение	
  
•  Поискать	
  в	
  файлах	
  пользователя:	
  
–  C:usersuser1Desctoppass.xls	
  
–  C:Program	
  FilesMy	
  ProgramData*.*	
  
Не	
  очень	
  простые	
  решения	
  
снять	
  дамп	
  памяти	
  приложения	
  
•  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	
  -­‐>	
  usernamepass	
  
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	
  

More Related Content

еще один недостаток современных клиент серверных приложений

  • 1. Еще  один  недостаток   современных  клиент-­‐серверных   приложений   Антон  Сапожников  
  • 2. •  Антон  Сапожников   •  Занимаюсь  тестированиями  на   проникновение  больше  6  лет   •  CTF  player  MoreSmokedLeetChicken   – DEFCON,  CODEGATE,  HITB,…   •  KPMG  
  • 3. О  чем?   •  Рассмотрю  типовую  задачу,  возникающую   на  пентестах   •  Обсудим  возможные  варианты  её  решения   •  Поделюсь  своими  jps  &  tricks  
  • 4. Постановка  задачи   •  Корпоративная  среда   •  Получен  удаленный  доступ  к  рабочей   станции  пользователя   •  Пользователь  работает  с  толстым  клиентом   СУБД/АБС/….   •  Как  получить  доступ  к  данным  в  СУБД?  
  • 5. Простые  решения   •  Понаблюдать  за  экраном  пользователя   •  metasploit-­‐>meterpreter-­‐>screenspy|vnc  
  • 7. Простые  решения.2   •  Не  увидел  ничего  на  экране  пользователя?   Используй  клавиатурный  шпион!1   +    metasploit-­‐>meterpreter-­‐>keylogrecorder   –  глюкавый   –  нужно  ждать….  иногда  очень  долго   +    можно  «убить»  приложение   •  Поискать  в  файлах  пользователя:   –  C:usersuser1Desctoppass.xls   –  C:Program  FilesMy  ProgramData*.*  
  • 8. Не  очень  простые  решения   снять  дамп  памяти  приложения   •  meterpreter-­‐>memdump   •  meterpreter-­‐>memory_grep   Pros:     В  памяти  можно  найти:   –  паролиимена  пользователей   –  конфигурации   –  куски  данных   Cons:   –  большие  объем  данных  для  анализа   –  только  текущие  данные  пользователя   –  непонятно  что  и  где  искать?  
  • 9. Не  очень  простые  решения.2   Перехват  сетевого  трафика   •  windump*sniff   Pros:     В  трафике  можно  найти:   –  паролиимена  пользователей   –  данные  запрашиваемые  пользователем   Cons:   –  большие  объем  данных  для  анализа   –  только  текущие  данные  пользователя   –  непонятно  что  и  где  искать?   –  данные  могут  быть  зашифрованы  
  • 10. А  что  если?   •  Паролиключи  в  памяти  не  хранятся   •  Паролейключей  в  конфигурационных   файлах  нет   •  Сетевой  трафик  шифруется   •  К  серверу  доступ  разрешен  только  с   некоторых  ip  адресов,  и  нашего  в  этом   списке  нет   •  Реализована  двухфакторная   аутентификация  
  • 11. Что  делать?   •  Хучить  (hook)  функции  работы  с  сервером  в   клиентском  приложении     <…>   h    =  connect(database,username,pass,…);   r  =  query(h,  ‘select  PAN,  HNAME  from  CARDS’);   <…>    
  • 13. Как  делать?   •  Перехват  функций  работы  с  сокетами   +    универсальный  вариант   – нужно  реализовывать  протокол   – данные  могут  быть  зашифрованы   •  Перехват  функций  уровня  прикладного   протокола  или  API.   – реализация  сильно  зависит  от  приложения   +    удобная  работа  с  сервером  
  • 14. Как  делать?.2   Pros:   –  Обход  ограничений  по  ip  адресам   –  Работает  в  рамках  пользовательской  сессии,  т.е.  на   сервере  в  логах  будет  только  одно  соединение   –  Обход  аутентификации  пользователя  на  сервере   –  Обход  двухфакторной  аутентификации  при   установке  соединения  с  сервером   –  Незаметно  для  пользователя  атакуемого   приложения   –  Возможность  напрямую  работать  с  сервером   приложения  
  • 15. Как  делать?.3   Cons:   – Зависимость  от  конкретной  версии   приложения   – Права  администратора   – SeDebugPrivilege  
  • 16. Например  для  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  -­‐>  usernamepass   OCISessionBegin  -­‐>  svchp   OCIA˜rSet    -­‐>  OCI_HTYPE_SVCCTX   OCIHandleAlloc  -­‐>  OCI_HTYPE_STMT   OCIStmtPrepare  -­‐>  stmt   OCIStmtExecute  
  • 17. Например  для  Oracle.2   – OCIHandleAlloc,  дает  доступ  к  envhp   – OCIStmtExecute,  дает  доступ  svchp   – Достаточно  корректно  перехватить  всего  два   вызова.  
  • 18. Как  перехватить?   – EasyHooking   – DETOURS   – DLL  Injecjon   •  h˜p://syprog.blogspot.ru/2012/05/ createremotethread-­‐bypass-­‐windows.html   •  Начало  нужной  функции  патчим  переходом  на  наш   обработчик   – Your  way    
  • 19. Как  внедрить?   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);    
  • 20. Как  внедрить?.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);  
  • 21. Итого   – Шлем  запросы  прямо  в  СУБД   – Нет  необходимости  аутентифицироваться   – Используем  уже  установленное  соединение   …   – Profit!!1!