Las credenciales pueden abrirnos muchas puertas durante nuestras evaluaciones. Podemos encontrar credenciales durante nuestra enumeración de escalada de privilegios que pueden conducirnos directamente al acceso de administrador local, otorgarnos un punto de apoyo en el entorno de dominio de Active Directory o incluso usarse para escalar privilegios dentro del dominio. Hay muchos lugares en los que podemos encontrar credenciales en un sistema, algunas más obvias que otras.
En contra de las mejores prácticas, las aplicaciones suelen almacenar contraseñas en archivos de configuración de texto sin formato. Supongamos que obtenemos la ejecución de un comando en el contexto de una cuenta de usuario sin privilegios. En ese caso, es posible que podamos encontrar las credenciales para su cuenta de administrador u otra cuenta local o de dominio con privilegios. Podemos usar la utilidad findstr para buscar esta información confidencial.
La información confidencial de IIS, como las credenciales, se puede almacenar en un archivo web.config. En el caso del sitio web predeterminado de IIS, este archivo podría estar ubicado en C:\inetpub\wwwroot\web.config, pero puede haber varias versiones de este archivo en diferentes ubicaciones, que podemos buscar de forma recursiva.
Archivos de diccionario
Archivos del diccionario de Chrome
Otro caso interesante son los archivos de diccionario. Por ejemplo, se puede introducir información confidencial, como contraseñas, en un cliente de correo electrónico o en una aplicación basada en navegador, que subraya las palabras que no reconoce. El usuario puede añadir estas palabras a su diccionario para evitar el subrayado rojo que distrae.
Los archivos de instalación desatendida pueden definir configuraciones de inicio de sesión automático o cuentas adicionales que se crearán como parte de la instalación. Las contraseñas en unattend.xml se almacenan en texto simple o codificadas en base64.
Aunque estos archivos deberían eliminarse automáticamente como parte de la instalación, es posible que los administradores de sistemas hayan creado copias del archivo en otras carpetas durante el desarrollo de la imagen y el archivo de respuesta.
Archivo de historial de PowerShell
A partir de PowerShell 5.0 en Windows 10, PowerShell almacena el historial de comandos en el archivo:
Confirmación de la ruta de guardado del historial de PowerShell
Como se ve en el PDF de comandos de Windows (útil), publicado por Microsoft aquí , hay muchos comandos que pueden pasar credenciales en la línea de comandos. Podemos ver en el ejemplo a continuación que las credenciales administrativas locales especificadas por el usuario para consultar el registro de eventos de la aplicación utilizando wevutil .
Una vez que conocemos la ubicación del archivo (la ruta predeterminada está arriba), podemos intentar leer su contenido usando gc.
PS C:\htb> gc (Get-PSReadLineOption).HistorySavePath
dir
cd Temp
md backups
cp c:\inetpub\wwwroot\* .\backups\
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://www.powershellgallery.com/packages/MrAToolbox/1.0.1/Content/Get-IISSite.ps1'))
. .\Get-IISsite.ps1
Get-IISsite -Server WEB02 -web "Default Web Site"
wevtutil qe Application "/q:*[Application [(EventID=3005)]]" /f:text /rd:true /u:WEB02\administrator /p:5erv3rAdmin! /r:WEB02
También podemos usar esta línea para recuperar el contenido de todos los archivos del historial de PowerShell a los que podemos acceder como nuestro usuario actual. Esto también puede ser extremadamente útil como paso posterior a la explotación. Siempre debemos volver a verificar estos archivos una vez que tengamos un administrador local si nuestro acceso anterior no nos permitió leer los archivos de algunos usuarios. Este comando supone que se está utilizando la ruta de guardado predeterminada.
PS C:\htb> foreach($user in ((ls C:\users).fullname)){cat "$user\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt" -ErrorAction SilentlyContinue}
dir
cd Temp
md backups
cp c:\inetpub\wwwroot\* .\backups\
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://www.powershellgallery.com/packages/MrAToolbox/1.0.1/Content/Get-IISSite.ps1'))
. .\Get-IISsite.ps1
Get-IISsite -Server WEB02 -web "Default Web Site"
wevtutil qe Application "/q:*[Application [(EventID=3005)]]" /f:text /rd:true /u:WEB02\administrator /p:5erv3rAdmin! /r:WEB02
Relacionado
Podemos ver más técnicas de Credential Hunting en Windows en las siguientes secciones:
Credenciales de PowerShell
Las credenciales de PowerShell suelen utilizarse para tareas de automatización y creación de scripts como una forma de almacenar credenciales cifradas de forma cómoda. Las credenciales están protegidas mediante DPAPI , lo que normalmente significa que solo el mismo usuario puede descifrarlas en la misma computadora en la que se crearon.
Tomemos, por ejemplo, el siguiente script Connect-VC.ps1, que un administrador de sistemas ha creado para conectarse a un servidor vCenter fácilmente.
Si hemos obtenido la ejecución de comandos en el contexto de este usuario o podemos abusar de DPAPI, entonces podemos recuperar las credenciales de texto sin formato de encrypted.xml. El siguiente ejemplo supone lo primero.
Encontramos varios archivos que contienen contraseñas. El de stuff.txt no es la respuesta así que vamos a buscar más.. Buscando en el historial de la terminal nos encontramos unas credenciales de un administrador (pero tampoco es la respuesta a la pregunta):
PS C:\Users\htb-student> type AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
dir
cd Temp
md backups
cp c:\inetpub\wwwroot\* .\backups\
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://www.powershellgallery.com/packages/MrAToolbox/1.0.1/Content/Get-IISSite.ps1'))
. .\Get-IISsite.ps1
Get-IISsite -Server WEB02 -web "Default Web Site"
wevtutil qe Application "/q:*[Application [(EventID=3005)]]" /f:text /rd:true /u:WEB02\administrator /p:5erv3rAdmin! /r:
Afinando nuestra búsqueda en C:/Users encontramos la contraseña que necesitamos:
PS C:\Users\htb-student> Get-ChildItem -Path C:\Users -Recurse -Include *.ini,*.txt,*.xml,*.config,*.json,*.yml -ErrorAction SilentlyContinue | Select-String -Pattern "password|pass|credential|key"
Documents\stuff.txt:1:password: l#-x9r11_2_GL!
C:\Users\Public\Documents\settings.xml:105: <password>Pr0xyadm1nPassw0rd!</password>
C:\Users\Public\Documents\settings.xml:111: | This is a list of authentication profiles, keyed by the server-id used
C:\Users\Public\Documents\settings.xml:121: | NOTE: You should either specify username/password OR
C:\Users\Public\Documents\settings.xml:122: | privateKey/passphrase, since these pairings are used together.
C:\Users\Public\Documents\settings.xml:127: <password>repopwd</password>
C:\Users\Public\Documents\settings.xml:131: <!-- Another sample, using keys to authenticate.
C:\Users\Public\Documents\settings.xml:134: <privateKey>/path/to/private/key</privateKey>
C:\Users\Public\Documents\settings.xml:135: <passphrase>optional; leave empty if not used.</passphrase>
Pregunta 2
Conéctate como usuario bob y decodifica las credenciales en el archivo pass.xml. Envíe el contenido del archivo flag.txt al escritorio una vez que haya terminado.
RDP con el usuario "bob" y contraseña "Str0ng3ncryptedP@ss!"
El archivo pass.xml contiene credenciales almacenadas como un objeto PSCredential de PowerShell, y la contraseña está protegida con DPAPI (Data Protection API). Para descifrarla, necesitas ejecutarlo en la misma máquina donde se generó.