#Infeccion cuando no tenemos privilegios
#Autor: Machine_Dramon
Este articulo es aplicable a los sistemas Windows de la familia NT (NT, XP, 2K), en los Windows 9x el concepto de permisos de usuarios no impide una infeccion. Aunque aun hay muchos usuarios que manejan su Windows usando la cuenta de Administrador, que se crea por defecto al instalar el sistema, cada vez son mas los suarios, en especial empresas y organizaciones que se van dando cuenta que para muchos trabajos en Windows, una cuenta de Usuario es suficiente. Un Virus que se ejecuta sobre una cuenta de usuario no podra hacer las mismas cosas, que si se ejecutara sobre una cuenta con permisos de administrador. Aun asi, el Virus no debe fallar completamente al infectar el sistema, aunque no pueda ejercer todas sus funciones, debe tratar de ser capaz de propagarse.
Por ejemplo si el Virus se instalaba como servicio y se ejecuta en una cuenta que no lo permite, pudiera tratar de instalarse realizando una entrada en la parte run del registro en HKEY_CURRENT_USER. Si el virus necesita hacer un scaneo ICMP Ping, y se ejecuta en una cuenta en la cual no tiene acceso a los Sockets Raw, pudiera usar las funciones IcmpCreateFile, IcmpSendEcho y IcmpCloseHandle de icmp.dll Si se ejecuta sobre una cuenta casi sin permisos como la cuenta de Invitado, una opcion es hacer una propagacion basica, como una propagacion por disckets. Lo importante es probar el codigo en diferentes cuentas, con distintos privilegios, como cuentas del grupo Administradores, Usuarios Avanzados, Usuarios e Invitados, para observar como se desenvuelve el codigo en cada uno de estos escenarios.
Por ejemplo este codigo, que realiza 2 acciones comunes, crear una entrada en la parte run del registro de HKEY_LOCAL_MACHINE y copiarse al directorio %System%
#include
//-----------------------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{
bool b;
char mypath[MAX_PATH], syspath[MAX_PATH], cpypath[MAX_PATH];
HKEY hKey;
LONG x;
GetSystemDirectory(syspath, MAX_PATH);
GetModuleFileName(NULL, mypath, MAX_PATH);
lstrcat(lstrcpy(cpypath, syspath), "\\copia.exe");
x = RegCreateKey(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", &hKey);
if(x==ERROR_SUCCESS)
{
x = RegSetValueEx(hKey, "Copia", 0, REG_SZ, (LPBYTE)&cpypath, lstrlen(cpypath)+1);
if(x==ERROR_SUCCESS) MessageBox(0, "Valor de Registro Creado", "OK", 0);
RegCloseKey(hKey);
}
//==============================================================================
b = CopyFile(mypath, cpypath, true);
if(b)
{
MessageBox(0, "Archivo Copiado", "OK", 0);
}
//==============================================================================
return 0;
}
En una cuenta de administrador el codigo funciona bien, pero en una cuenta de
usuario tanto RegSetValuEx como CopyFile, fallan con un error de acceso denegado
(ERROR_ACCESS_DENIED = 5), en el caso de CopyFile hay que llamar a GetLastError
para obtener el codigo de error. En el caso del error en RegSetValueEx, se da porque una cuenta de usuario no
tiene los permisos para escribir en la rama del registro que estamos indicando,
una solucion seria cambiar HKEY_LOCAL_MACHINE por HKEY_CURRENT_USER, que no es
lo mismo porque en el primer caso el virus se ejecutaria en el inicio del
sistema sea cual fuere el usuario que inicie sesion, en el segundo caso solo se
ejecutaria cuando inicie sesion el usuario infectado, ya que HKEY_CURRENT_USER
pertenece al usuario actual.
En el caso del error en CopyFile, se da porque una cuenta de usuario no tiene los permisos para copiar archivos en el directorio %System%, una solucion seria copiarnos al directorio de "Datos de Programa" del usuario, el cual se encuentra en Documents and Settings\%Usuario% esto no presenta ninguna desventaja, porque da lo mismo desde donde nos ejecutemos, sea de %System% o de otro lugar y hasta es preferible, porque llamar a GetSystemDirectory o GetWindowsDirectory ya es conocido por los usuarios y mas aun por los Antivirus, ademas de que al pertenecer este directorio al usuario actual no habra problemas de permisos.
Podemos obtener la ruta del directorio de "Datos de Programa", mediante este
codigo:
.......
char personal_path[MAX_PATH];
SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, personal_path);
PathAppend(personal_path, "VxApplication");
if(CreateDirectory(personal_path, 0))
{
PathAppend(personal_path, "copia.exe");
CopyFile(mypath, personal_path, true);
}
.......
Luego de obtener el path de ese directorio, creamos una subcarpeta y dentro de
ella copiamos el Virus. Para la constante CSIDL_APPDATA hay que incluir shlobj.h y para la funcion
PathAppend shlwapi.h y shlwapi.lib (ó libshlwapi.a), aunque PathAppend pudiera
sustituirse por unas llamadas a lstrcat, porque solo es para construir el path
de la subcarpeta y luego el del archivo donde se copiara el Virus.
Entonces el Virus puede darse cuenta que no cuenta con los permisos necesarios
para realizar alguna accion, luego de que las funciones fallen y observando los
codigos de error resultantes, pero aunque pudiera funcionar, no es la mejor
forma. Otra opcion es que el Virus pueda identificar a que grupo pertenece la cuenta de
usuario sobre la que se esta ejecutando, y en el caso de los grupos más comunes:
Administradores, Usuarios Avanzados, Usuarios e Invitados, sobre los cuales
podemos probar el Virus, entonces ya sabremos si el grupo al que pertenece la
cuenta de usuario tiene los permisos necesarios para que el Virus ejecute
determinadas acciones (a menos que se hayan cambiado los permisos predefinidos
del grupo).
En el caso de una cuenta que no pertenesca a ningun grupo predefinido (ademas de los mencionados hay otros grupos predefinidos que se crean en la instalacion de Windows, podemos verlos en "Administracion de Equipos" escribiendo "compmgmt.msc" en Ejecutar), se podria identificar exactamente el privilegio o permiso necesario para ejecutar la accion y ver si lo tiene la cuenta de usuario o el grupo al que pertenece la cuenta sobre la que nos estamos ejecutando. Y aunque el usuario o el grupo al que pertenece el usuario tengan el privilegio es posible que el token (testigo) asociado al proceso o al hilo no tenga el privilegio habilitado, como en el caso de SeShutdownPrivilege, que no se habilita en forma predeterminada para un proceso y debe ser habilitado.
Como ejemplo en el .Zip del articulo se pueden encontrar algunos codigos que
pueden servir para verificar con que permisos se ejecuta el proceso del Virus:
·Un codigo para listar los privilegios concedidos a una cuenta de usuario o grupo
en list_privileges.cpp
·Dos codigos para obtener el nombre de cuenta y el identificador de seguridad
(SID) del usuario que ejecuta el proceso en getuser1.cpp y getuser2.cpp
·Un codigo para obtener el nombre del(de los) grupo(s) a el(los) que pertenece la
cuenta de usuario sobre la cual se ejecuta el proceso en list_process_groups.cpp
·Un codigo para listar los grupos locales en el sistema y los usuarios que
pertenecen a estos grupos en list_groups_users.cpp
·Un codigo para listar los privilegios habilitados y desabilitados en el proceso
en list_process_privileges.cpp
·Un codigo para verificar si un determinado privilegio se encuentra habilitado en
el proceso en check_privilege.cpp
·Un codigo para habilitar un privilegio en el proceso en add_privilege.cpp, si es
que la cuenta de usuario o el grupo al que pertenece la cuenta, ya tiene el
privilegio asignado, pero no esta habilitado en el proceso.
·Dos codigos para verificar si la cuenta de usuario sobre la cual se ejecuta el
proceso pertenece al grupo de Administradores en isadmin1.cpp, isadmin2.cpp y
isadmin3.cpp
Tres codigos para identificar a que grupo predefinido pertenece la cuenta de
usuario sobre la cual se ejecuta el proceso en looup_group1.cpp y
looup_group2.cpp
Los codigos fueron probados en Windows XP SP2, XP SP1 y 2003 Server.
Nota: Los permisos en lo que se refiere a directorios y archivos, solo funcionan con
NTFS, si se usa FAT32 todos los usuarios tendran acceso a las carpetas,
independientemente de su tipo de cuenta.
Agradecimiento a los amigos que me ayudaron a probar unos codigos para este
articulo en sus computadoras, porque yo tenia el sistema de archivos en FAT32 y
no me funcionaba como debieran los permisos sobre los directorios.
(C) Mitosis 4 - GEDZAC LABS