Hacker La Red OscuraHacker La Red Oscura

Uso de la API de Windows para captura de pantalla

Esta técnica se basa en el uso de llamadas a la API de Windows para acceder al escritorio del sistema y capturar su contenido gráfico. Mediante funciones de bajo nivel relacionadas con la gestión de ventanas y contextos de dispositivo, es posible obtener una representación exacta de lo que se muestra en pantalla en un momento determinado.

Este tipo de funcionalidad puede emplearse con fines de monitorización, auditoría o recolección de información visual, permitiendo observar la actividad del usuario sin necesidad de interactuar directamente con aplicaciones de alto nivel.

El acceso a estas funciones suele pasar desapercibido si no se monitorizan las llamadas a la API gráfica del sistema.

Add-Type -TypeDefinition @" using System; using System.Drawing; using System.Runtime.InteropServices;
public class ScreenCapture { [DllImport("user32.dll")] public static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")] public static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("gdi32.dll")] public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest, int
nWidth, int nHeight, IntPtr hObjectSource, int nXSrc, int nYSrc, int dwRop); } "@ $desktop =
[ScreenCapture]::GetDesktopWindow() $dc = [ScreenCapture]::GetWindowDC($desktop) # Further code to
perform screen capture goes here

Manipulación de servicios de Windows mediante la API

Esta técnica utiliza funciones de la API de Windows para interactuar directamente con el gestor de servicios del sistema operativo. A través de estas llamadas, es posible crear nuevos servicios, modificar servicios existentes o iniciar servicios de forma programática.

El control de servicios es especialmente relevante porque estos pueden configurarse para ejecutarse con privilegios elevados y arrancar automáticamente junto con el sistema, lo que los convierte en un mecanismo habitual de persistencia.

El uso indebido de estas funciones puede facilitar escenarios de escalada de privilegios o mantenimiento de acceso prolongado en el sistema.

Add-Type -TypeDefinition @" using System; using System.Runtime.InteropServices; public class
ServiceManager { [DllImport("advapi32.dll", SetLastError = true)] public static extern IntPtr
OpenSCManager(string lpMachineName, string lpSCDB, int scParameter); [DllImport("advapi32.dll",
SetLastError = true)] public static extern IntPtr CreateService(IntPtr SC_HANDLE, string lpSvcName,
string lpDisplayName, int dwDesiredAccess, int dwServiceType, int dwStartType, int dwErrorControl,
string lpBinaryPathName, string lpLoadOrderGroup, IntPtr lpdwTagId, string lpDependencies, string lp,
string lpPassword); [DllImport("advapi32.dll", SetLastError = true)] public static extern bool
StartService(IntPtr SVHANDLE, int dwNumServiceArgs, string lpServiceArgVectors); } "@ $scManagerHandle
= [ServiceManager]::OpenSCManager(null, null, 0xF003F) # Further code to create, modify, or start
services goes here

Acceso al portapapeles de Windows mediante la API

El portapapeles de Windows es un recurso compartido que almacena temporalmente información copiada por el usuario. Mediante llamadas directas a la API de Windows, es posible abrir el portapapeles, leer su contenido y, en determinados casos, modificarlo.

Esta técnica permite recopilar información sensible, como texto copiado desde aplicaciones, credenciales o fragmentos de datos temporales. También puede utilizarse para manipular el contenido del portapapeles con fines de alteración de datos.

Debido a que el portapapeles es utilizado constantemente por el usuario, su acceso puede pasar inadvertido si no se dispone de controles de seguridad adecuados.

Add-Type -TypeDefinition @" using System; using System.Runtime.InteropServices; using System.Text;
public class ClipboardAPI { [DllImport("user32.dll")] public static extern bool OpenClipboard(IntPtr
hWndNewOwner); [DllImport("user32.dll")] public static extern bool CloseClipboard();
[DllImport("user32.dll")] public static extern IntPtr GetClipboardData(uint uFormat);
[DllImport("kernel32.dll")] public static extern IntPtr GlobalLock(IntPtr hMem);
[DllImport("kernel32.dll")] public static extern bool GlobalUnlock(IntPtr hMem);
[DllImport("kernel32.dll")] public static extern int GlobalSize(IntPtr hMem); } "@
[ClipboardAPI]::OpenClipboard([IntPtr]::Zero) $clipboardData = [ClipboardAPI]::GetClipboardData(13) #
CF_TEXT format $gLock = [ClipboardAPI]::GlobalLock($clipboardData) $size =
[ClipboardAPI]::GlobalSize($clipboardData) $buffer = New-Object byte[] $size
[System.Runtime.InteropServices.Marshal]::Copy($gLock, $buffer, 0, $size)
[ClipboardAPI]::GlobalUnlock($gLock) [ClipboardAPI]::CloseClipboard()
[System.Text.Encoding]::Default.GetString($buffer)

Identificación de regiones de memoria escribibles y ejecutables

Esta técnica se centra en el análisis de la memoria virtual de un proceso en ejecución para identificar regiones que sean simultáneamente escribibles y ejecutables. Este tipo de permisos combinados no es habitual en aplicaciones bien diseñadas y puede ser un indicador de comportamiento anómalo.

Las regiones de memoria con estos atributos suelen asociarse a técnicas como inyección de código, ejecución dinámica de shellcode o modificaciones en tiempo de ejecución.

El análisis de estas zonas resulta útil tanto en investigaciones de seguridad como en la detección de actividad potencialmente maliciosa dentro de procesos activos.

$proc = Get-NtProcess -ProcessId $pid -Access QueryLimitedInformation Get-NtVirtualMemory -Process
$proc | Where-Object { $_.Protect -band "ExecuteReadWrite" }

Identificación de secciones de memoria compartidas entre procesos

Esta técnica permite localizar objetos de tipo Section que son compartidos entre dos procesos distintos y que disponen de permisos de escritura. El análisis se centra en identificar secciones compartidas entre un proceso con privilegios elevados y otro con privilegios reducidos.

Las secciones de memoria compartidas con capacidad de escritura pueden representar un riesgo, ya que permiten que un proceso menos privilegiado influya en el comportamiento de otro con mayores permisos.

Este enfoque es especialmente útil para detectar vectores de escalada de privilegios, donde la manipulación de recursos compartidos puede derivar en la ejecución de código en un contexto más privilegiado.

$ss = Get-NtHandle -ObjectType Section -GroupByAddress | Where-Object ShareCount -eq 2 $mask = Get-
NtAccessMask -SectionAccess MapWrite $ss = $ss | Where-Object { Test-NtAccessMask $_.AccessIntersection
$mask } foreach($s in $ss) { $count = ($s.ProcessIds | Where-Object { Test-NtProcess -ProcessId $_ -
Access DupHandle }).Count if ($count -eq 1) { $s.Handles | Select ProcessId, ProcessName, Handle } }