Professional Documents
Culture Documents
Andrés Tarascó
• Rootkits
– Que son y su funcionamiento
• Implementaciones de Rootkits
– Que hacen
– Como lo hacen
– Ejemplos prácticos
• Soluciones Genéricas
– Rootkits incompletas (duplicidad de información)
– Análisis de las estructuras del kernel
• Nuevos enfoques
– Deficiencias en los modelos actuales
– Atajando el problema de raiz
• ¿ Que son ?
– Backdoors de nueva generación
– Origenes
– Primeras Rootkits
– Que entendemos realmente por Rootkit
• Ocultación
• Acceso anónimo ilimitado
• ¿ Que hacen ?
– Ocultación
• Procesos
• Ficheros y espacio en disco
• Conexiones
• Claves de registro
– Garantiza su ejecución
– Ofrece acceso remoto
• ¿ Como lo hacen ?
– Hooks
• ¿ Que es un hook ?
• Tipos de hooks
– System Hooks
– IAT Patching
» Que es una API
– API Patching
– DLL Inyection
– Code Inyection
HHOOK SetWindowsHookEx( int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId );
– Formas de realizarlo
• Con la tradicional DLL
• Exportando las funciones en el ejecutable
__declspec(dllexport) DWORD WINAPI MyTTYPrint(int ttyDST,
char *buffer, int size) { .. }
pImportDesc =(PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(
hInstance,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&ulSize);
if ((hFichero= CreateFile(VProcesos->Selected->SubItems->Strings[0].c_str(), GENERIC_READ, FILE_SHARE_READ
| FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)) != INVALID_HANDLE_VALUE) {
if ((hMapping = CreateFileMapping(hFichero, 0, PAGE_READONLY | SEC_COMMIT, 0, 0, 0))) {
if ((pBase = MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0))) {
(IMAGE_DOS_HEADER*) CabeceraDos = (IMAGE_DOS_HEADER*) pBase;
if (CabeceraDos->e_magic == IMAGE_DOS_SIGNATURE) { // Encontrado el MZ
(_HEADER*) CabeceraPE = (_HEADER *)((char *)CabeceraDos + CabeceraDos->e_lfanew);
if (CabeceraPE->signature == IMAGE_NT_SIGNATURE) { // Encontrado PE00
ImageBase=CabeceraPE->opt_head.ImageBase;
return(ImageBase );
while (pImportDesc->Name) {
import_entry = (IMAGE_THUNK_DATA*) (pImportDesc->FirstThunk + (DWORD)hInstance);
- Ocultación Incorrecta:
int i=GetCurrentProcessId()+1;
if ((rkHandle =OpenProcess( PROCESS_ALL_ACCESS,
TRUE,i))==NULL){
// Rootkit...
}
– Atacando la ocultación Incompleta de la
rootkit
• Ocultación incompleta de HANDLES
SnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
ProcessList.dwSize=sizeof(PROCESSENTRY32);
while(1) { if(Process32Next(SnapShot, &ProcessList) != FALSE) { ... } }
• Atacando servicios
– Consultar HKLM\SYSTEM\CurrentControlSet
– Utilizar WMI (RKDetect)
– Conectar por registro remoto y enumerar las claves
– Módulos cargados
• Análisis de la IAT (DLL Inyection)
• Módulos de programas externos (Eternity)
• Monitorizar la propia aplicación (trusted dlls)
• Tráfico de red
– Port scanning Vs pAllocateAndGetTcpExTableFromStack()
– Respuesta ante determinados paquetes (hxdef)
unsigned char masterkey082[] = { //masterkey for hxdef 080 and 081
0x01, 0x1e, 0x3c, 0x6c, 0x6a, 0xff, 0x99, 0xa8,
0x34, 0x83, 0x38, 0x24, 0xa1, 0xa4, 0xf2, 0x11,
0x5a, 0xd3, 0x18, 0x8d, 0xbc, 0xc4, 0x3e, 0x40,
0x07, 0xa4, 0x28, 0xd4, 0x18, 0x48, 0xfe, 0x00 };
– Espacio libre en disco
• Primer Enfoque: Duplicidad de información
GetDiskFreeSpace (unidad,&a,&b,&c,&d);
GetVolumeInformation(unidad,volume,MAX_PATH - 1,&dwSerialNumber,
&dwMaxNameLength,&dwFileSystemFlags,tipo,MAX_PATH -1);
– Centrémonos en el almacenamiento
• Acceso a la información