SCCM Exploitation: Part 3 - Reconnaissance and Enumeration

Sep 30, 2025
SCCM Exploitation: Part 3 -  Reconnaissance and Enumeration

Introduction



In the first two parts, we explored how SCCM is built, how it handles collections, task sequences, client push, PXE boot and the variety of accounts and policies that make it function in an enterprise environment.

Now comes the fun part: reconnaissance.

The goal is simple: identify if SCCM is present, work out which servers hold which roles, and begin mapping the attack surface. Recon can start from two positions: unauthenticated or authenticated. SCCM has to advertise itself on the network and expose services to function, which gives us opportunities to pick up on it without credentials. But once you have even a single domain account, the picture changes drastically and you can start harvesting real detail.

Unauthenticated Reconnaissance



On a pentest, the first inkling that there may be a SCCM/MECM environment running would be from Nmap scans.

Running a version scan (-sV) against suspected SCCM infrastructure can reveal various things: IIS running on odd ports, SQL services open, and occasionally custom RPC interfaces. Some of the more interesting ports to look out and scan for include 80, 443, 445, 1433, 10123, and 8530–8531 which can return some information about the SCCM infrastructure.

1nmap -p 80,443,445,1433,10123,8530,8531 -sV 192.168.32.11-12


Nmap TCP scan results

Nmap TCP scan results



Each of these ports corresponds to a role: IIS on 80/443 underpins Management and Distribution Points, 445 may expose SMB shares such as SMSPKG$ if ACLs and shares are misconfigured, 1433 links to the SQL site database, 10123 is tied to the remote control service, and 8530/8531 typically point to WSUS when integrated as a Software Update Point.

You also want to sweep the UDP side because PXE and DHCP live there. A quick targeted scan is enough to tell you which PXE model you’re dealing with:

1nmap -sU -p 67,68,69,4011,547 192.168.32.11


Nmap UDP scan results

Nmap UDP scan results



If 4011/udp is responsive, you’re almost certainly looking at legacy WDS/ProxyDHCP. If 4011 is closed but PXE still works in the environment, that usually indicates the modern PXE Responder (no WDS). Port 69/udp is TFTP; seeing it open on a DP lines up with WDS-based PXE where the NBP (wdsnbp.com,wdsmgfw.efi) is pulled via TFTP. In PXE Responder setups you may not see 69/udp at all even though OSD works, because the responder pushes boot details via DHCP vendor extensions and the client transitions quickly to HTTP(S) for policy/content.

67/udp and 68/udp are the DHCP server/client ports. Don’t be surprised if Nmap reports them as open|filtered; DHCP is broadcast-oriented and many servers ignore unicast probes. Their ambiguous state doesn’t mean DHCP isn’t there - it just means your unicast scan isn’t a perfect oracle. 547/udp is DHCPv6; useful to note if the environment runs v6, but not SCCM-specific.

For a definitive read on PXE behavior, pair the scan with a live PXE attempt and watch the wire if possible during your test. A WDS environment will answer on 4011/udp with ProxyDHCP and hand out a Bootfile Name, while PXE Responder mode will skip 4011 and tuck the bootfile into PXE vendor-specific options in the normal DHCP exchange - covered in part 2.

NetExec



With SMB exposed on 445, the natural step is to throw a quick NetExec scan at it. Even without valid credentials, sometimes the NetBIOS name and domain information can give hints about the system's purpose.

1nxc smb 192.168.32.10-13


NetExec SMB scan results

NetExec SMB scan results



In my lab this revealed four systems:

- MECM – the site server itself
- DC – domain controller for sccm.lab
- CLIENT – a domain-joined workstation
- MSSQL – separate SQL server hosting the site database

With the hostnames, it reveals that SCCM is likely in use and that the MECM machine is the site server but also that the site database is not co-hosted, but on a separate MSSQL machine. As a side note, the /etc/hosts file can be generated by NetExec to make it easy to add these entries:

1nxc smb 192.168.32.10-13 --generate-hosts-file /tmp/hostfile


Hosts file

Hosts file



Beyond hostnames and domains, NetExec also reports details like SMB signing (useful for attacks later on).

If the system is hardened you'll get "access denied"; in misconfigured setups you may be able to enumerate SCCM’s content shares like SMSPKGC$ or SCCMContentLib anonymously. That’s rare - most modern deployments SHOULD block null sessions — but it’s worth testing.

1nxc smb 192.168.32.10-13 -u '' -p '' --shares


NetExec anonymous share access

NetExec anonymous share access



OpenSSL



A quick trick is to grab SSL certificates from the IIS endpoints that SCCM exposes. Certificates can often leak clues about the internal setup. Running the following command against port 10123 (the SCCM remote control service) returns the certificate details:

1openssl s_client -connect 192.168.32.11:10123 -showcerts


OpenSSL certificate

OpenSSL certificate



The output here is especially telling:

1Certificate chain
2 0 s:CN = MECM, CN = SMS
3   i:CN = MECM, CN = SMS


The certificate subject lists both the machine name (MECM) and SMS. The SMS string is a giveaway as it refers to Systems Management Server - the old name for SCCM. Even in current versions, you’ll still see “SMS” scattered in around.

The certificate also isn’t issued by an internal PKI or external CA but is generated by SCCM itself in this case which matches Microsoft’s defaults for internal site roles. Seeing self-signed, long-lived certs (10-year validity is common) is consistent with a vanilla SCCM deployment, which can provide a hint about the potential security awareness of the organization (i.e. a preference to run default settings across the environment).

RPC Enumeration



The site server and distribution points expose a number of RPC interfaces that can be queried remotely without authentication. Using rpcdump.py, you can enumerate registered RPC interfaces and their associated protocols:

1rpcdump.py 192.168.32.11 | grep Protocol | grep -v 'N/A'


Rpcdump.py output

Rpcdump.py output



This lists every RPC protocol UUID the host advertises. Many are the usual suspects you’ll see on any Windows server but the key one for SCCM reconnaissance is Protocol: [MS-WDSC]: Windows Deployment Services Control Protocol.

It shows that Windows Deployment Services (WDS) is running on this host. Since earlier Nmap scans showed UDP/4011 in play, it tells us that SCCM is using WDS as its PXE provider in legacy mode.

cURL Requests



Another low-effort step is to probe the IIS virtual directories that SCCM publishes on it's Management and Distribution Points. These endpoints are how clients fetch policies and content and while most require authentication, their presence alone is often enough to confirm the role a server is playing.

In older SCCM builds, Distribution Points exposed directories like SMS_DP_SMSPKG$ and SMS_DP_SMSSIG$. These were directly backed by file system folders such as C:\SMS_DP_SMSPKG\ and could sometimes be browsed unauthenticated if IIS was misconfigured, meaning an attacker could walk through package content directly over HTTP.

In modern MECM environments, Microsoft shifted to the Content Library model (C:\SCCMContentLib\). The old DP virtual directories typically return 404, so they’re no longer reliable for recon. Instead, Distribution Points are best fingerprinted by checking for SMB shares such as SMSPKG$ and SMSSIG$ or by watching client traffic to the DP with Wireshark/tcpdump if you are on the same network.

Since these endpoints are IIS virtual directories, we can probe them directly with curl the same way a client would, and use the HTTP status codes to tell us what role the server is playing.

For example, one of the most common MP endpoints is /ccm_system/request. You won’t get policy data back without creds, but an unauthenticated request usually returns 403 Forbidden, which still proves that the MP channel is alive and IIS is routing the traffic correctly:

1curl http://192.168.32.11/ccm_system/request


CCM System request - 403 forbidden

CCM System request - 403 forbidden



More interesting are the site discovery endpoints. These are designed to be hit by clients before they are even domain-joined, so they respond unauthenticated by design:

1curl -s http://192.168.32.11/SMS_MP/.sms_aut?mplist | xq
2curl -s http://192.168.32.11/SMS_MP/.sms_aut?mpcert | xq


MPList output

MPList output


MPCert output

MPCert output



The mplist endpoint responds with XML that provides some information about the SCCM configuration including the Management Point’s logical name, its FQDN, the build version, and whether it’s operating over HTTP or HTTPS. The mpcert endpoint returns the Management Point’s certificate as a hex-encoded DER blob. It can be decoded with PowerShell:

1$xml = Invoke-WebRequest http://192.168.32.11/SMS_MP/.sms_aut?mpcert
2$hex = ([regex]'<Certificate>([0-9A-F]+)</Certificate>').Match($xml.Content).Groups[1].Value
3[IO.File]::WriteAllText('mpcert.hex',$hex)
4certutil -decodehex mpcert.hex mpcert.cer
5certutil -dump mpcert.cer


Decoded, you’ll see certificate fields like the subject CN, issuer CN, validity period, and public key size. In this environment, it showed:

1Subject: CN=SMS, CN=MECM
2Issuer: CN=SMS, CN=MECM
3NotBefore: 13/08/2025
4NotAfter : 09/02/2026
5Public Key: RSA 2048 bits


Certificate decoded by powershell

Certificate decoded by powershell



In lab or hardened environments this can seem useless, but in real-world setups these certs often embed site codes, internal FQDNs, or naming schemes that help attackers map the SCCM attack surface:

- Where the Management Point is (hostname/FQDN)
- What version it’s running
- How it identifies itself cryptographically

The table below is a quick reference for probing SCCM endpoints with curl. Each path corresponds to the same URLs that ConfigMgr clients use when bootstrapping or requesting policy. From an unauthenticated perspective, the status codes and responses are often enough to fingerprint SCCM, confirm whether a host is a Management Point or Distribution Point, and in some cases leak XML or certificates.

Table

SCCM HTTP Endpoints



IIS Manager View



For me, it's important to understand where all of these endpoints come from. All of these curlable endpoints exist because when you install SCCM roles, setup extends IIS with virtual directories and handler mappings. That’s what makes requests like /SMS_MP/.sms_aut?mplist work, even if there’s no .sms_aut file anywhere on the filesystem.

If you open IIS Manager on a site server and expand the Default Web Site, you’ll see SCCM-specific applications like SMS_MP, ccm_system, and SMS_DP_SMSPKG$. These are created automatically when you add roles like the Management Point or Distribution Point.

IIS Manager - Site Folders

IIS Manager - Site Folders



Clicking into the SMS_MP application shows that it maps into the ConfigMgr binaries under C:\Program Files\SMS_CCM\SMS_MP. This is where the Management Point DLLs live, and why IIS can dynamically respond to requests like .sms_aut.

IIS Manager - Physical path

IIS Manager - Physical path



If you dig into Handler Mappings on the SMS_MP application, you’ll find entries for .sms_aut and .sms_pol. These don’t map to static files but IIS routes them through the IsapiModule, which loads mp.dll and generates responses on the fly.

IIS Manager - Handler mappings

IIS Manager - Handler mappings



This explains why curl probes work:

- /SMS_MP/.sms_aut?mplist: routed to mp.dll, generates an XML with MP details.
- /SMS_MP/.sms_aut?mpcert: same handler, returns the MP’s self-signed certificate.
- /SMS_MP/.sms_pol: same DLL, but challenges with 401 before serving client policy.

On the Distribution Point side, the SMS_DP_SMSPKG$ virtual directory historically pointed to C:\SMS_DP_SMSPKG\. In modern MECM builds, it instead maps into the Content Library (C:\SCCMContentLib). That’s why in Current Branch environments, curl against /SMS_DP_SMSPKG$ usually just gives you a 404.

IIS Manager - DP directory

IIS Manager - DP directory



From a recon standpoint, this makes the whole picture clearer. You’re calling into IIS virtual directories that SCCM configures by design, and the ISAPI handlers translate your request into SCCM-specific responses.

Windows-Specific Checks



From a Windows host on the same network, there are a couple of built-in utilities that can give away SCCM infrastructure. One of the simplest is nbtstat, which queries the NetBIOS name table of a remote machine. Pointing it at a suspected SCCM server can reveal the hostname, domain and potentially SCCM-specific service identifiers.

1nbtstat -A 192.168.32.11


Nbtstat command output

Nbtstat command output



In the output you’ll typically see:

- The hostname of the server (e.g. MECM).
- The Active Directory domain it belongs to (e.g. SCCMLAB).
- A <20> entry, showing that SMB file sharing is enabled (important for Distribution Points).
- Most importantly, an entry like MP_P01 <1A>.

The <1A> suffix is key. In NetBIOS, each two-digit hex value is a “service code” that represents a registered service. <00> usually marks a workstation name, <20> marks the file server service, <03> is the old messenger service and <1A> is normally reserved for Remote Administration. SCCM hijacks it for something very specific: when a Management Point is installed, it registers itself in NetBIOS as MP_ with a <1A> suffix.

NSLookup



SCCM also publishes service location (SRV) records into Active Directory–integrated DNS. These let clients discover their Management Points and, in some cases, site servers. The records live under _mssms_mp_ and _mssms_site_ with the three-character site code embedded in the name.

From a Windows machine that can resolve the domain’s DNS, you can query them directly:

1nslookup -type=SRV _mssms_mp_p01._tcp.sccm.lab
2nslookup -type=SRV _mssms_site_p01._tcp.sccm.lab


NSLookup command output

NSLookup command output



The MP query usually resolves and returns the FQDN of the Management Point. The site record may or may not exist depending on the environment. In my lab, only the MP record was published as can be seen from the DNS records on the DC:

DNS manager records

DNS manager records



Without the site code, you won’t get a result unless you guess or brute force common ones like PRI, P01, P02, CAS, DEV, HQ. Remember that site codes can not be longer than three characters.

Authenticated Reconnaissance



Before diving into the tools, it’s worth pointing out that a lot of useful techniques are already documented in the Misconfiguration Manager repo which is a great catalogue of SCCM techniques from recon to priv esc. I highly recommend giving it a read.

ADSISearcher



From a foothold on a domain workstation you can ask AD and the local SCCM provider exactly where the client thinks the site lives. The ADSI lookup below shows the SCPs ConfigMgr publishes and the binding information clients consume:

1([ADSISearcher]("objectClass=mSSMSManagementPoint")).FindAll() | % { $_.Properties }


ADSISearcher command

ADSISearcher command



What that returns are the raw SCP objects: the cn for the SCP itself, the serviceBindingInformation lines which contain the Management Point logical names and sometimes the HTTP paths the clients will call, and the DN under System Management which tells you where SCCM published that entry in AD.

From the same host you can query the local SCCM client provider via WMI to get the runtime, agent-centric view. These two equivalent commands will give you the SMS authority record the client has:

1Get-WmiObject -Namespace 'root\ccm' -Query 'SELECT * FROM SMS_Authority' | Format-List *
2Get-CimInstance -Namespace 'root\ccm' -Query 'SELECT * FROM SMS_Authority' | Format-List *


Get-WmiObject command output

Get-WmiObject command output



The CurrentManagementPoint entry tells you the MP host the agent is configured to use, the authority Name is the local site identifier, and other properties (policy target endpoints, capability blobs or certificate hints) give you clues about whether the MP is speaking HTTPS, whether tokenised DP delivery is in play, and which log lines to parse next.

Pyldapsearch



From a domain account you can ask AD two useful things with pyldapsearch: where the Management Points are published, and which computer objects have “sccm” in their name or DNS hostname. Both questions are simple LDAP filters and return potentially useful output.

To show the Management Point SCP entries (ask AD for the mSSMSManagementPoint objects and pull back the MP hostname and the site code):

1pyldapsearch sccm.lab/carol:"SCCMftw" "(objectclass=mssmsmanagementpoint)" -attributes dnshostname,msSMSSiteCode


In the lab this returned:

1dNSHostName: MECM.sccm.lab
2msSMSSiteCode: P01


Pyldapsearch management point search

Pyldapsearch management point search



If you want to hunt hosts that include “sccm” in either their cn or their DNS name (so you catch servers and machines responsible for various roles), use a filter that checks both attributes:

1pyldapsearch sccm.lab/carol:"SCCMftw" "(&(objectClass=computer)(|(cn=*sccm*)(dNSHostName=*sccm*)))" -attributes dNSHostName


Pyldapsearch sccm name search

Pyldapsearch sccm name search




The example run in the screenshots returned four rows:

1dNSHostName: CLIENT.sccm.lab
2dNSHostName: MSSQL.sccm.lab
3dNSHostName: MECM.sccm.lab
4dNSHostName: DC.sccm.lab


Ldeep



ldeep is an LDAP crawler that pulls ConfigMgr-related attributes out of Active Directory. Point it at a domain controller with a user account and it will return the SCCM schema objects and service connection points that ConfigMgr writes into AD, the three-letter site codes, and the computer objects that are advertising MP/DP roles.

Running it in sccm mode wraps several LDAP queries together and prints out the servers it identifies.

1ldeep ldap -u carol -p SCCMftw -d sccm.lab -s ldap://192.168.32.10 sccm


Ldeep sccm mode

Ldeep sccm mode



The output shows MECM.sccm.lab listed as the primary site, confirms that it is acting as the Management Point, sets the site code as P01, and flags the MECM computer object as a potential Distribution Point.

If you want to see the underlying entries that this summary is built from, you can fall back to a direct LDAP search, using a filter like (objectclass=mssmsmanagementpoint), targeting the service connection point objects that SCCM publishes whenever a Management Point role is installed.

1ldeep ldap -u carol -p SCCMftw -d sccm.lab -s ldap://192.168.32.10 search "(objectclass=mssmsmanagementpoint)" dnshostname,msSMSSiteCode


Ldeep custom search command

Ldeep custom search command



The DN reveals the MP object under the System Management container, the dnshostname attribute confirms the FQDN of the host, and the msSMSSiteCode field ties it to site P01.

SharpSCCM



SharpSCCM talks straight to the ConfigMgr WMI providers on the host and returns the live, runtime picture the client and site server use. Because it reads root\ccm and / root\SMS namespaces it gives you authoritative site properties, package IDs, site system roles and the exact WMI classes that map to packages, DPs and collections.

1.\SharpSCCM.exe local site-info


SharpSCCM site info enumeration

SharpSCCM site info enumeration



That call reads the local SMS authority and prints the site identity the agent uses. If you need to run a direct WQL query, SharpSCCM will execute it against the provider such as: .\SharpSCCM.exe local query "SELECT CurrentManagementPoint FROM SMS_Authority"

The triage command is the most immediately useful output you can get from a low-privileged context:

1.\SharpSCCM.exe local triage


The triage option attempts to read the local cache and then scans SCCM logs for UNC paths and URLs the agent actually uses. Below, it found a long list of runtime artefacts inside logs: http://MECM.sccm.lab/ccm_system/request, http://MECM.sccm.lab/SMS_MP/.sms_aut?SITESIGNCERT ,http://MECM.sccm.lab/CCM_Incoming/ and tokenized DP URIs containing CCMTOKENAUTH_SMS_DP_SMSPKG$/P0100005.

SharpSCCM triage command

SharpSCCM triage command



These are the endpoints the client has contacted. The presence of CCMTOKENAUTH entries means the site is using tokenised, authenticated DP delivery for at least some packages.

To see WMI types the provider exposes, enumerate classes:

1.\SharpSCCM.exe local classes


SharpSCCM classes enumeration

SharpSCCM classes enumeration



That prints a very long list which proves the provider is responding and that you can query specific SCCM classes.

SharpSCCM has a ton of different options. I recommend playing around on your environment and reading the wiki to learn more about its power - https://github.com/Mayyhem/SharpSCCM/wiki.

PSSRecon



A useful tool for quick info gathering ispssrecon which can enumerate a primary site server or DP over winreg to get a quick list:

1./pssrecon -host mecm.sccm.lab -d sccm.lab -u carol -p SCCMftw


PSSrecon output

PSSrecon output



NetExec SMB Shares



Once you know where the site server is, a natural next step is to enumerate it's SMB shares with valid domain credentials.

1nxc smb 192.168.32.11 -u carol -p SCCMftw -d sccm.lab --shares


NetExec smb share enumeration

NetExec smb share enumeration



MECM exposes a whole collection of SCCM-specific shares alongside the standard administrative ones.SCCMContentLib$ is the the Configuration Manager Content Library for site P01, where all distributed content ends up. SMSPKG$, SMSSIG$ and SMS_CPSC$ are legacy-style package and compressed storage shares that still exist in modern builds. There’s also SMS_DP$, which is the Distribution Point share, and SMS_SITE which maps back to site-specific binaries.

Each of these shares is automatically created when you add the Distribution Point role, and together they give you a filesystem-level view of how content is being distributed.

NetExec SCCM Recon



With valid domain credentials, NetExec can also gather more information. NetExec comes with the recently published sccm-recon6 module, which queries Active Directory and SCCM’s own published data to gather info about the environment.

Running it against the MECM site server with just a low-privileged account confirms the core of the deployment:

1nxc smb 192.168.32.10 -u 'carol' -p 'SCCMftw' -M sccm-recon6


The output shows:

- Site Code: P01, which uniquely identifies the SCCM site.
- Site Server: MECM.sccm.lab (the central orchestration point).
- Management Points: MECM.sccm.lab is hosting the MP role over HTTP.
- Distribution Point: The same server is also doubling as a DP.
- PXE: Detected as installed and maps to CRED-1 where it may be possible to retrieve secrets from PXE boot media unauthenticated.
- Site Database: Located on MSSQL.sccm.lab, meaning SQL is split onto a separate server.
- Anonymous Access: Disabled for the DP (as expected in a hardened setup).
- SMB Signing: False, which is a red flag (labeled as TAKEOVER-2 from Misconfiguration Manager since it opens the door for relay attacks).

NetExec sccm-recon6 module output

NetExec sccm-recon6 module output



SCCMHunter



SCCMHunter is a Python-based reconnaissance tool that pulls SCCM-related data from Active Directory and other sources (like SMB and registry queries). It consolidates information about site servers, databases, management points, PXE capability, and the SCCM service accounts in use.

The find module performs LDAP lookups against Active Directory and correlates SCCM objects (site servers, MPs, DPs, NAAs, SQL, etc.) into tables:

1python3 sccmhunter.py find -u carol -p SCCMftw -d sccm.lab -dc-ip 192.168.32.10 -debug


SCCMhunter find flag output

SCCMhunter find flag output



It gathers everything AD knows about SCCM including site codes, where the SQL backend is, which servers are MPs/DPs, and even the service accounts and groups tied to SCCM. The find mode is essentially scraping SCCM’s own published schema extensions.

There is also an smb module which works differently. Instead of LDAP, it authenticates over SMB and tries to pull SCCM-specific configuration from the registry, file system shares, and local policies on the target servers. For example, it can pull registry keys under HKLM\SOFTWARE\Microsoft\SMS, check which SCCM shares are present (SMSPKG$, SCCMContentLib), and enumerate which binaries are being served to clients.

1python3 sccmhunter.py smb -u carol -p 'SCCMftw' -d sccm.lab -dc-ip 192.168.32.10


It finds information such as:

- Site Server: MECM.sccm.lab confirmed again, with CAS = False (so this is a standalone primary, not a central admin site).
- MSSQL Database: MSSQL.sccm.lab registered, confirming SQL is split out.
- Management Point: Active on MECM.sccm.lab with site code P01.
- Distribution Point: Same host is also a DP, but note the detail — SCCM=True, WDS=False, meaning PXE is running in modern responder mode, not legacy WDS.
- Computers Table: Both entries map back to the same MECM host, showing it’s multitasking across roles.

SCCMhunter smb flag output

SCCMhunter smb flag output



SCCMSecrets

sccmsecrets looks for the things SCCM intentionally distributes - policy bundles, package manifests, installer payloads and the occasional script - and follows the references those artefacts create back to registry keys, scheduled tasks and file paths that often contain important context. Be aware that some operations (for example the policies flow) register a client on the site and are persistent until you remove them, so treat those probes like any other active test.

Starting with the policy probe against the Management Point:

1python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab -cn 'test'


SCCMsecrets policies command

SCCMsecrets policies command




This registers a fake client named test, waits for the MP to generate policies for that client, and then requests the list of policies the MP would deliver. If a successful client registration is done (it returned a GUID), it waits for 3 minutes and then requests device policies.

In this case, there were two policies and zero “secret” policies. In the GOAD lab, the MP is handing out normal configuration policy bundles rather than any special secret policies. The important thing is that the MP will happily hand out XML policy blobs to any registered client and those blobs are worth inspecting because they often include references to installation scripts, registry keys, package IDs and any special behavior the client should perform.

The files command attempts to pull content from a Distribution Point. Running it without credentials shows the common failure case:

1python3 SCCMSecrets.py files -dp http://mecm.sccm.lab


SCCMsecrets anonymous files command

SCCMsecrets anonymous files command



It reports that anonymous access is not allowed which can be seen as true in the IIS Manager:

Anonymous access disabled in IIS manager

Anonymous access disabled in IIS manager



When you run the same files command with domain credentials it proceeds to enumerate packages and download whatever target file extensions you asked for:

1python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'carol' -p 'SCCMftw'


SCCMsecrets files command output

SCCMsecrets files command output



For example, it returned eight packages, iterated them and downloaded XML payloads such as ep_defaultpolicy.xml, amd64__Config_AppsAndSettings.xml, and arch-specific config XMLs for x86/arm64/amd64. These XML files are the canonical representations of SCCM policies and package manifests.
ep_defaultpolicy.xml in particular is Endpoint Protection policy expressed as XML; it declares policy sections, registry keys to set on clients, and values like whether real-time scanning is enabled, schedule windows, AV exclusions, and similar settings. The package config XMLs contain structured metadata for how an application or update should be installed, which files to drop, what registry keys to touch and which scripts to run as part of deployment.

Typical findings inside these XML files are installer step definitions that call a script path, scheduled task names, service account names, or a reference to a connection string blob (which could be stored elsewhere). For example, an ep_defaultpolicy.xml fragment will show and a list of entries that map directly to registry changes the client will apply. A package manifest will list filenames and GUIDs and often include an InstallCommand or a Script element pointing at a \\\SMSPKG$\\InstallScript.ps1 path. Those referenced script files are where cleartext credentials or tokens sometimes appear, or where you can find the run-as account name that the automation expects.

In short, policies gives you the policy XML the MP will hand a client, and files fetches package manifests and payload files from a DP when you have privileges. Policies works without requiring anonymous DP access because it talks to the Management Point as a client, while files talks to the Distribution Point’s HTTP/file endpoints and will fail if anonymous browsing is disabled.

CMLoot



CMLoot is the “file grab” step of SCCM recon: once you’ve found which servers are acting as Distribution Points or Content Library hosts, CMLoot helps you enumerate the descriptors SCCM publishes and then pull the actual package files that those descriptors point to.

If you don’t already know the CM hosts, you can discover them from AD or locally on a workstation that has the ConfigMgr client installed. The registry on a client contains the management points the client talks to; query it like this to get the list of MPs:

1(Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\SMS\DP -Name ManagementPoints).ManagementPoints


Get-ItemProperty command output

Get-ItemProperty command output



That returns one or more hostnames. There may be multiple CM servers and multiple DPs, and each can contain different packages, so take the time to enumerate every host you find.

CMLoot works in two phases. First you build an inventory of available file descriptors by parsing the .INI/manifest files SCCM stores on the server. Run the inventory command against an SCCM host and write the results to a plain text file:

1Invoke-CMLootInventory -SCCMHost mecm.sccm.lab -Outfile sccmfiles.txt


CMLoot inventory command

CMLoot inventory command



That sccmfiles.txt file is the canonical list you’ll use for downloads. Each line is a descriptor that maps to one or more real files on the ContentLib or SMSPKG$ tree.

Once you have the inventory, you can pick the files you want. If you enjoy a visual selection method, GridView will pop a GUI selector:

1Invoke-CMLootDownload -InventoryFile .\sccmfiles.txt -GridSelect


CMLoot download files via grid list

CMLoot download files via grid list



What you’re seeing in the grid are the raw content descriptors SCCM publishes for packages. Each P0xxxxx.y folder maps to a PackageID (the same IDs you’ll see in WMI/SMS_Package). Inside those package trees you’ll find a few recurring categories: manifests, replacement manifests, download (DL) manifests, payload binaries (MSI/EXE/CAB/DLL), and helper scripts or XML configuration files. The manifests are the index that tell the client what files make up the package, where to download them from, how to install them, and any registry changes or policy bits the client should apply. The payloads are the installers and libraries the manifest references.

The files whose names end in .man in your listing are SCCM manifests (replacement manifests, DL manifests, etc.). DLManifests are download manifests: small XML-like records that specify which files to fetch, the expected hash, the size and the content GUIDs. ReplacementManifests are used for OS/feature replacement scenarios (servicing, migration or OS upgrade packages) and describe which components are replaced or updated.

You’ll also see XML payloads that look like Config.xml, MigApp.xml, ep_defaultpolicy.xml and so on. ep_defaultpolicy.xml is an endpoint-protection policy expressed as XML: it contains registry keys and values the client must set, scheduled-task or behavior settings, and sometimes module names. Package config XMLs and PkgInfo-style files list install commands, pre/post scripts, component GUIDs and the relative paths inside the package. If a manifest references an InstallScript.ps1 or a *.bat, that script is where automations run and where you often find service account names, command-line arguments and in poor setups, hardcoded credentials or tokens.

Then there are the obvious binary artifacts: .msi, .exe, .dll, .cab. Those are just the installers and libraries. They’re not necessarily secret, but they’re useful to pull because they reveal the exact software versions deployed, and MSIs can be unpacked to inspect embedded transform files or custom actions which might call external scripts or authenticate with credentials. If a package contains a .pfx, that’s immediately interesting because those can include private keys used by the site. Likewise any .config, .json, .ini or .xml files in the inventory deserve priority because they’re human-readable and frequently contain connection strings, endpoint URLs, or references to service accounts.

A few realistic caveats: many of the .man/replacement manifests you see will be large component lists (Windows servicing parts) that are noisy and not immediately useful for credential hunting; they’re useful for inventory and mapping clients to OS components. Also, modern deployments try not to put plaintext credentials in scripts. What you’ll often find instead are account names, scheduled task names, or encrypted blobs.

By default CMLoot writes files into a CMLootOut folder under the current working directory. Files are conserved with a name scheme that encodes the source folder and a hash fragment so you don’t get collisions; expect paths of the form (folder:filext)\(first4hash)_originalfilename.

Summary



At this point we know the environment contains a Management Point published as MECM.sccm.lab and the site is identified as P01. DNS/AD SCPs and SRV records point clients to that MP and the MP advertises a self-signed “SMS / MECM” certificate. Distribution content lives in the Content Library/DPs (shares observed as SCCMContentLib$, SMSPKG$, SMS_DP$, SMS_SITE) but anonymous HTTP pulls are blocked in this case.

DP delivery is tokenised (CCMTOKENAUTH) so files require authentication or a client token. WMI/SharpSCCM output (the SMS_Authority view and triage logs) corroborates the MP/DP hostnames and shows the exact MP/DP URLs clients use (/SMS_MP/.sms_aut?mplist, /ccm_system/request, tokenised DP URIs). AD and LDAP queries list the site systems and computer objects (MECM, MSSQL, DC, CLIENT), and inventory tools (CMLoot / SCCMSecrets) returned package manifests and policy XMLs such as ep_defaultpolicy.xml plus package GUIDs (e.g. P0100005) and references to install scripts (InstallScript.ps1).