• XSS.stack #1 – первый литературный журнал от юзеров форума

Что думаете о косвенных сисколлах?

coree

(L2) cache
Пользователь
Регистрация
27.12.2021
Сообщения
303
Решения
1
Реакции
116
Гарант сделки
1
Депозит
0.0006
Сейчас большинство разработчиков перешло от использования прямых сисколлов к использованию косвенных вызовов. Как я понимаю на текущий момент нету способов сделать косвенный вызов без палева в коллстеке. Либо надо спуфить коллстек (что понесет за собой ошибки при раскручивании стека EDR), либо будет виден прыжок по адресу возврата обратно по пользовательскую RX память (рис.1). Я подумал, в kernel32/ntdll должны быть коллбэк-апи, через которые теоретически возможно вызвать сисколлы без палева в коллстеке, потому что вызов вернется не в приложение, а в эту n-ную функцию из kernel32/ntdll, что в теории должно добавить легитимности. Как по мне, возврат из сисколла в основной код это 100% детект. Что думаете? Может я чего-то не понимаю? А есть ли смысл ахнукать сисколлы в ntdll?
1731281117633.png

(рис.1)
 
но некоторые основные моменты необходимо исправить и уточнить. Прежде всего, концепция косвенных системных вызовов — это распространенный способ избежать обнаружения такими инструментами безопасности, как EDR и AV. Основная идея. заключается в уменьшении очевидных шаблонов, появляющихся в стеке вызовов, которые могут выявить наличие подозрительной активности. Но момент, который требует пояснения, заключается в том, что использование API в kernel32 или ntdll в качестве «обратного вызова» — это не то, что на самом деле происходит при вызове косвенных системных вызовов. В большинстве случаев злоумышленники используют такие методы, как встроенная сборка или перезапись части ntdll.dll в памяти. Чтобы избежать сигнатуры API, отслеживаемой инструментами EDR, рассматривается идея использования системных вызовов через ntdll.dll. промежуточный уровень между User-Mode и Kernel-Mode, и это не интерфейсы обратного вызова, а скорее функции, которые преобразуют обычные программные запросы в реальные системные вызовы. Что касается стека вызовов, о котором вы говорите, существуют такие методы. как спуфинг стека, который помогает переупорядочить стек вызовов таким образом, чтобы EDR не заметил каких-либо искажений или серьезных изменений в нем. Что касается вашего утверждения о том, что возврат от системного вызова к основному коду является 100% обнаружением, это не так. Точный, потому что существуют расширенные методы уклонения от обнаружения, такие как вызовы с помощью сложных инструкций в памяти с использованием таких методов, как Heaven's Gate и Direct Syscalls, которые позволяют обходить обычные сигнатуры и делать возврат в память менее уязвимым для обнаружения. Иногда другие методы являются точными. используются, например, батутные функции или возвратно-ориентированное программирование (ROP). Чтобы разорвать цепочку вызовов таким образом, чтобы возврат к пользовательскому коду выглядел нормальным. Наконец, я должен уточнить, что использование системных вызовов из ntdll добавляет. своего рода легитимность, поскольку инструменты безопасности готовы нормально обрабатывать вызовы, которые проходят через библиотеки пользовательского режима, даже если библиотека подделана или используются прямые системные вызовы напрямую, без использования ntdll, это может сделать подозрительные действия более ясными и быстрыми. в обнаружении
 
Имхо лучше использовать KernelCallback от win32k.sys.
Таблица мапится в юзерспейс, где можно подменить указатели на любую из функций User32.
Адрес таблицы можно узнать через GetProcAddress(user32!apfnDispatch), или просто прочитать из РЕВ.
Одно требование - работает только для потоков гуй:

Код:
0:000> bp @$exentry; g; p; dt _peb @$peb KernelCallbackTable
Breakpoint 0 hit
ntdll!_PEB
   +0x058 KernelCallbackTable : 0x00000000`775f9500  Void

0:000> ln 0x00000000`775f9500
(00000000`775f9500)  user32!apfnDispatch  | (00000000`775fa730) user32!szIndicDLL

0:000> !address 0x00000000`775f9500
Usage:              Image
Allocation Base:    00000000`77570000
Base Address:       00000000`775f2000
End Address:        00000000`77602000
Region Size:        00000000`00010000
Type:               01000000  MEM_IMAGE
State:              00001000  MEM_COMMIT
Protect:            00000002  PAGE_READONLY
More info:          lmv m user32
More info:          !lmi user32
More info:          ln 0x775f9500

0:000> dqs 0x00000000`775f9500 L100

00000000`771a9500  00000000`77126f74  user32!_fnCOPYDATA
00000000`771a9508  00000000`7716f760  user32!_fnCOPYGLOBALDATA
00000000`771a9510  00000000`771367fc  user32!_fnDWORD
00000000`771a9518  00000000`7712cb7c  user32!_fnNCDESTROY
00000000`771a9520  00000000`7713f470  user32!_fnDWORDOPTINLPMSG
00000000`771a9528  00000000`7716f878  user32!_fnINOUTDRAG
00000000`771a9530  00000000`771485a0  user32!_fnGETTEXTLENGTHS
00000000`771a9538  00000000`7716fb9c  user32!_fnINCNTOUTSTRING
00000000`771a9540  00000000`7712b790  user32!_fnPOUTLPINT
00000000`771a9548  00000000`7716fa60  user32!_fnINLPCOMPAREITEMSTRUCT
00000000`771a9550  00000000`77130710  user32!_fnINLPCREATESTRUCT
00000000`771a9558  00000000`7713cd30  user32!_fnINLPDELETEITEMSTRUCT
00000000`771a9560  00000000`771480d4  user32!_fnINLPDRAWITEMSTRUCT
00000000`771a9568  00000000`7716fab0  user32!_fnINLPHLPSTRUCT
00000000`771a9570  00000000`7716fab0  user32!_fnINLPHLPSTRUCT
00000000`771a9578  00000000`7716f8cc  user32!_fnINLPMDICREATESTRUCT
00000000`771a9580  00000000`7713edb4  user32!_fnINOUTLPMEASUREITEMSTRUCT
00000000`771a9588  00000000`77132624  user32!_fnINLPWINDOWPOS
00000000`771a9590  00000000`77130a3c  user32!_fnINOUTLPWINDOWPOS
00000000`771a9598  00000000`771455fc  user32!_fnINOUTLPSCROLLINFO
00000000`771a95a0  00000000`7712bbf0  user32!_fnINOUTLPRECT
00000000`771a95a8  00000000`771306ac  user32!_fnINOUTNCCALCSIZE
00000000`771a95b0  00000000`77130a3c  user32!_fnINOUTLPWINDOWPOS
00000000`771a95b8  00000000`7716f930  user32!_fnINPAINTCLIPBRD
00000000`771a95c0  00000000`7716f9c4  user32!_fnINSIZECLIPBRD
00000000`771a95c8  00000000`7713e910  user32!_fnINDESTROYCLIPBRD
00000000`771a95d0  00000000`77129de0  user32!_fnINSTRING
00000000`771a95d8  00000000`77129de0  user32!_fnINSTRING
00000000`771a95e0  00000000`77125a20  user32!_fnINDEVICECHANGE
00000000`771a95e8  00000000`7712ab90  user32!_fnPOWERBROADCAST
00000000`771a95f0  00000000`77145934  user32!_fnINOUTNEXTMENU
00000000`771a95f8  00000000`7713ee08  user32!_fnOPTOUTLPDWORDOPTOUTLPDWORD
00000000`771a9600  00000000`7713ee08  user32!_fnOPTOUTLPDWORDOPTOUTLPDWORD
00000000`771a9608  00000000`7716f700  user32!_fnOUTDWORDINDWORD
00000000`771a9610  00000000`7713f394  user32!_fnOUTLPRECT
00000000`771a9618  00000000`7712b790  user32!_fnPOUTLPINT
00000000`771a9620  00000000`7716fab0  user32!_fnINLPHLPSTRUCT
00000000`771a9628  00000000`7712b790  user32!_fnPOUTLPINT
00000000`771a9630  00000000`7716f7ec  user32!_fnSENTDDEMSG
00000000`771a9638  00000000`77137f50  user32!_fnINOUTSTYLECHANGE
00000000`771a9640  00000000`7712f63c  user32!_fnHkINDWORD
00000000`771a9648  00000000`771401bc  user32!_fnHkINLPCBTACTIVATESTRUCT
00000000`771a9650  00000000`7713f918  user32!_fnHkINLPCBTCREATESTRUCT
00000000`771a9658  00000000`7716fe00  user32!_fnHkINLPDEBUGHOOKSTRUCT
00000000`771a9660  00000000`771485f0  user32!_fnHkINLPMOUSEHOOKSTRUCTEX
00000000`771a9668  00000000`7716fc98  user32!_fnHkINLPKBDLLHOOKSTRUCT
00000000`771a9670  00000000`7716fcf0  user32!_fnHkINLPMSLLHOOKSTRUCT
00000000`771a9678  00000000`7713483c  user32!_fnHkINLPMSG
00000000`771a9680  00000000`7716fc4c  user32!_fnHkINLPRECT
00000000`771a9688  00000000`7716fd3c  user32!_fnHkOPTINLPEVENTMSG
00000000`771a9690  00000000`77143070  user32!_ClientCopyDDEIn1
00000000`771a9698  00000000`77142ea0  user32!_ClientCopyDDEIn2
00000000`771a96a0  00000000`77142f00  user32!_ClientCopyDDEOut1
00000000`771a96a8  00000000`7716ffdc  user32!_ClientCopyDDEOut2
00000000`771a96b0  00000000`77131ee4  user32!_ClientCopyImage
00000000`771a96b8  00000000`7713d4ac  user32!_ClientEventCallback
00000000`771a96c0  00000000`77170244  user32!_ClientFindMnemChar
00000000`771a96c8  00000000`7716fe58  user32!_ClientFreeDDEHandle
00000000`771a96d0  00000000`77148644  user32!_ClientFreeLibrary
00000000`771a96d8  00000000`77121774  user32!_ClientGetCharsetInfo
00000000`771a96e0  00000000`7716ff68  user32!_ClientGetDDEFlags
00000000`771a96e8  00000000`771700c8  user32!_ClientGetDDEHookData
00000000`771a96f0  00000000`7713ea0c  user32!_ClientGetListboxString
00000000`771a96f8  00000000`77139144  user32!_ClientGetMessageMPH
00000000`771a9700  00000000`77125fc0  user32!_ClientLoadImage
00000000`771a9708  00000000`77130bec  user32!_ClientLoadLibrary
00000000`771a9710  00000000`771318c0  user32!_ClientLoadMenu
00000000`771a9718  00000000`77123e50  user32!_ClientLoadLocalT1Fonts
00000000`771a9720  00000000`771702a0  user32!_ClientPSMTextOut
00000000`771a9728  00000000`77170308  user32!_ClientLpkDrawTextEx
00000000`771a9730  00000000`771484f0  user32!_ClientExtTextOutW
00000000`771a9738  00000000`7712b728  user32!_ClientGetTextExtentPointW
00000000`771a9740  00000000`771701c4  user32!_ClientCharToWchar
00000000`771a9748  00000000`77123f14  user32!_ClientAddFontResourceW
00000000`771a9750  00000000`7713a824  user32!_ClientThreadSetup
00000000`771a9758  00000000`77170424  user32!_ClientDeliverUserApc
00000000`771a9760  00000000`7717039c  user32!_ClientNoMemoryPopup
00000000`771a9768  00000000`77135be0  user32!_ClientMonitorEnumProc
00000000`771a9770  00000000`7712ddd4  user32!_ClientCallWinEventProc
00000000`771a9778  00000000`77139344  user32!_ClientWaitMessageExMPH
00000000`771a9780  00000000`7712ba08  user32!_ClientWOWGetProcModule
00000000`771a9788  00000000`77170568  user32!_ClientWOWTask16SchedNotify
00000000`771a9790  00000000`771217c0  user32!_ClientImmLoadLayout
00000000`771a9798  00000000`771489a8  user32!_ClientImmProcessKey
00000000`771a97a0  00000000`77170438  user32!_fnIMECONTROL
00000000`771a97a8  00000000`7713f608  user32!_fnINWPARAMDBCSCHAR
00000000`771a97b0  00000000`771485a0  user32!_fnGETTEXTLENGTHS
00000000`771a97b8  00000000`7716fb14  user32!_fnINLPKDRAWSWITCHWND
00000000`771a97c0  00000000`771229ec  user32!_ClientLoadStringW
00000000`771a97c8  00000000`77190b94  user32!_ClientLoadOLE
00000000`771a97d0  00000000`771909f8  user32!_ClientRegisterDragDrop
00000000`771a97d8  00000000`77190a54  user32!_ClientRevokeDragDrop
00000000`771a97e0  00000000`77170510  user32!_fnINOUTMENUGETOBJECT
00000000`771a97e8  00000000`7713f404  user32!_ClientPrinterThunk
00000000`771a97f0  00000000`77144924  user32!_fnOUTLPCOMBOBOXINFO
00000000`771a97f8  00000000`77145660  user32!_fnOUTLPSCROLLBARINFO
00000000`771a9800  00000000`77145934  user32!_fnINOUTNEXTMENU
00000000`771a9808  00000000`771459e0  user32!_fnINLPUAHDRAWMENUITEM
00000000`771a9810  00000000`77145934  user32!_fnINOUTNEXTMENU
00000000`771a9818  00000000`77145988  user32!_fnINOUTLPUAHMEASUREMENUITEM
00000000`771a9820  00000000`77145934  user32!_fnINOUTNEXTMENU
00000000`771a9828  00000000`77145730  user32!_fnOUTLPTITLEBARINFOEX
00000000`771a9830  00000000`771705b8  user32!_fnTOUCH
00000000`771a9838  00000000`77170624  user32!_fnGESTURE
00000000`771a9840  00000000`7716fab0  user32!_fnINLPHLPSTRUCT
00000000`771a9848  00000000`00000000
00000000`771a9850  00000000`771429f8  user32!ButtonWndProcWorker
00000000`771a9858  00000000`77163c6c  user32!ComboBoxWndProcWorker
00000000`771a9860  00000000`771865b0  user32!ListBoxWndProcWorker
00000000`771a9868  00000000`771476d8  user32!DefDlgProcWorker
00000000`771a9870  00000000`77178ba4  user32!EditWndProcWorker
00000000`771a9878  00000000`771865b0  user32!ListBoxWndProcWorker
00000000`771a9880  00000000`771412a0  user32!MDIClientWndProcWorker
00000000`771a9888  00000000`771974cc  user32!StaticWndProcWorker
00000000`771a9890  00000000`77130ed0  user32!ImeWndProcWorker
00000000`771a9898  00000000`77148ce4  user32!DefWindowProcWorker
00000000`771a98a0  00000000`7712f610  user32!CtfHookProcWorker
00000000`771a98a8  00000000`00000000
00000000`771a98c0  00000000`77162884  user32!ScrollBarWndProcW
00000000`771a98c8  00000000`771374d4  user32!DefWindowProcW
00000000`771a98d0  00000000`771626d8  user32!MenuWndProcW
00000000`771a98d8  00000000`771625ac  user32!DesktopWndProcW
00000000`771a98e0  00000000`771374d4  user32!DefWindowProcW
00000000`771a98e8  00000000`771374d4  user32!DefWindowProcW
00000000`771a98f0  00000000`771374d4  user32!DefWindowProcW
00000000`771a98f8  00000000`77142940  user32!ButtonWndProcW
00000000`771a9900  00000000`77165e80  user32!ComboBoxWndProcW
00000000`771a9908  00000000`77187804  user32!ComboListBoxWndProcW
00000000`771a9910  00000000`7714768c  user32!DefDlgProcW
00000000`771a9918  00000000`77178af8  user32!EditWndProcW
00000000`771a9920  00000000`77187804  user32!ComboListBoxWndProcW
00000000`771a9928  00000000`77141250  user32!MDIClientWndProcW
00000000`771a9930  00000000`77197ca8  user32!StaticWndProcW
00000000`771a9938  00000000`77131160  user32!ImeWndProcW
00000000`771a9940  00000000`771374d4  user32!DefWindowProcW
00000000`771a9948  00000000`77125388  user32!fnHkINLPCWPSTRUCTW
00000000`771a9950  00000000`771621b0  user32!fnHkINLPCWPRETSTRUCTW
00000000`771a9958  00000000`77127950  user32!DispatchHookW
00000000`771a9960  00000000`7712ccac  user32!DispatchDefWindowProcW
00000000`771a9968  00000000`7713726c  user32!DispatchClientMessage
00000000`771a9970  00000000`7718ed04  user32!MDIActivateDlgProcW
00000000`771a9978  00000000`00000000
00000000`771a9980  00000000`77162868  user32!ScrollBarWndProcA
00000000`771a9988  00000000`7712b830  user32!DefWindowProcA
00000000`771a9990  00000000`771626bc  user32!MenuWndProcA
00000000`771a9998  00000000`77162590  user32!DesktopWndProcA
00000000`771a99a0  00000000`7712b830  user32!DefWindowProcA
00000000`771a99a8  00000000`7712b830  user32!DefWindowProcA
00000000`771a99b0  00000000`7712b830  user32!DefWindowProcA
00000000`771a99b8  00000000`7715f1f8  user32!ButtonWndProcA
00000000`771a99c0  00000000`77165db4  user32!ComboBoxWndProcA
00000000`771a99c8  00000000`77187758  user32!ComboListBoxWndProcA
00000000`771a99d0  00000000`77173218  user32!DefDlgProcA
00000000`771a99d8  00000000`77178a4c  user32!EditWndProcA
00000000`771a99e0  00000000`77187758  user32!ComboListBoxWndProcA
00000000`771a99e8  00000000`77190480  user32!MDIClientWndProcA
00000000`771a99f0  00000000`77197c58  user32!StaticWndProcA
00000000`771a99f8  00000000`7719e520  user32!ImeWndProcA
00000000`771a9a00  00000000`7712b830  user32!DefWindowProcA
00000000`771a9a08  00000000`771486f8  user32!fnHkINLPCWPSTRUCTA
00000000`771a9a10  00000000`7719cab0  user32!fnHkINLPCWPRETSTRUCTA
00000000`771a9a18  00000000`7714878c  user32!DispatchHookA
00000000`771a9a20  00000000`7719cbec  user32!DispatchDefWindowProcA
00000000`771a9a28  00000000`7713726c  user32!DispatchClientMessage
00000000`771a9a30  00000000`7718ed04  user32!MDIActivateDlgProcW
 
Нашел PoC про вышеописанный способ через аппаратный бряк https://github.com/Dec0ne/HWSyscalls. Попробую раскопать тему с коллбэками.
 
Последнее редактирование:


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх