Privilege Escalation
Voici toutes les procédures que je suis pour identifier des vecteurs de privesc. D'une manière générale, il s'agit de deux choses :
Obtenir des identifiants valides pour un compte privilégié.
Faire en sorte d'exécuter du code par l'intermédiaire d'un compte privilégié.
Linux
Pour tout ce qui est exploitation d'SUID
ou sudo
, la liste GTFOBins est très utile.
Essayer d'accéder au contenu tel que
id_rsa
,/etc/shadow
,backup
,docker
, fichiers cachés ou bien inhabituels ou encore récemment modifiés.Tester les mots de passe vides ou bien identiques au nom d'utilisateur (
vagrant:vagrant
,root:root
).Consulter la configuration de
sudo
pour l'utilisateur pawned.Vérifier les binaires configurés en
SUID
.Lister les tâches
CRON
si possible.Lister les
capabilities
des différents binaires.Vérifier les services qui écoutent sur le système.
Vérifier les permissions des disques montés dans le cas d'un container (
Docker
par exemple)Faire des recherches de mot-clés intéressants. Vous pouvez vous référez à ma page sur le Fast Searching.
#Lister les fichiers récemment modifiés (il y a moins de deux heures)
find / -mmin -120 -ls
#Lister la configuration sudo pour l'utilisateur courant
sudo -l
#Lister les binaires configurés en SUID
find / -perm -u=s -type f 2>/dev/null
#Consulter les tâches CRON du root
crontab -u root -l
#Consulter les tâches CRON de l'utilisateur courant
crontab -l
#Consulter les tâches CRON globales
cat /etc/crontab
#Lister les capabilities configurées
getcap -r / 2>/dev/null
#Lister les disques montés et leurs permissions
mount
# Lister les services qui tournent sur le système (si iproute2 est installé)
ss -tulnp
En dernier recours, il est possible d'utiliser linPEAS, un script bash permettant d'automatiser la détection de vecteurs de privesc en réalisant de nombreux checks différents.
Cepenant si vous n'arrivez toujours pas à vos fins, certaines techniques d'exploitation peuvent s'avérer plus élaborées. Voici une liste de dossiers/fichiers intéressants :
/etc/shadow
Les mots de passe sont stockés ici, chiffrés ainsi que d'autres informations (shell/nologin)
Critique
/etc/sudoers
Fichier de configuration des privilèges des utilisateurs concernant l'utilisation de l'utilitaire sudo
Critique
/etc/passwd
Permet facilement de connaître la liste des utilisateurs existants sur le système. Si en écriture, on peut être root car changement de mdp arbitraire.
Modérée
/var/lib
C'est là que l'on va généralement stocker les données des serveurs. Les bases de données peuvent contenir des mots de passe utilisés également pour un utilisateur plus privilégié.
Modérée
/etc/environment
~/.bashrc
, etc..
Ce sont généralement dans ces fichiers qui sont stockés les variables d'environnement, notamment l'envpath
. Modifier de telles valeurs permettrait de manipuler l'execution de programmes et de tâches CRON
.
Modérée
/tmp
Il est bon de savoir que ce dossier est toujours un lieu où tous les utilisateurs peuvent lire et écrire. Particulièrement utile pour des payloads.
Occasionnelle
/proc
/proc/version
/proc/partitions
/proc/<PID>
Permet d'obtenir beaucoup d'informations sur le système, comme la liste des modules, les processus en cours d’exécutions et plusieurs informations sur eux, des informations sur les partitions, etc..
Occasionnelle
/etc/group
Les groupes existants peuvent renseigner sur les applications installées et potentiellement intéressantes.
Faible
Windows
Windows fonctionne d'une manière très différente de Linux et est beaucoup plus complexe à parcourir pour un attaquant, et malheureusement, beaucoup plus complexe à sécuriser pour une victime. Ces deux particularités viennent du fait que Windows est très compliqué, avec un système de permissions lourd et chaotique et une quantité assez impressionnantes d'objets existent. Nous sommes très loin de POSIX
et du "tout est fichier" de Linux. C'est pour cela que cette section va couvrir une liste de sujets très loin d'être exhaustive.
Voici quelques choses que nous pouvons vérifier rapidement sans avoir recours à des scripts d'automatisation :
Lister les valeurs de registre (la lecture est souvent autorisée pour tous les utilisateurs)
Vérifier si des services Windows tournent comme
SMB
. La configuration utilisateur et d'authentification peut être intéressant.Lister les programmes à
High Integrity
(l'intégrité est une graduation équivalente au système d'SUID
sous Linux).Si c'est un
CTF
, pensez à regarder les fichiers cachés avec des Alternate Data Streams.Très souvent dans les
CTF
, on obtient unprivesc
en faisant exécuter des instructions par l'Administrator
en modifiant un fichier utilisé dans une tâche duTask Scheduler
(équivalent Microsoft deCRON
). Pensez à vérifier les fichiers récemment modifiés.Plus rarement, si vous avez les droits d'écriture sur des répertoires de
DLL
(Dynamic-link library
équivalent desShared libraries
(SO
pourShared Objects
) sous Linux) alors il vous est possible de modifier unDLL
utilisé par un programme privilégié à des fins malveillantes (injectionsDLL
). On peut également modifier des chemins vers desDLL
ou bien injecter desDLL
dans un processus en cours d'exécution via faille de type buffer overflow ou en ayant simplement un privilège assez élevé pour utiliser une fonction système (équivalent dessyscalls
sous Linux) d'injection dans un processus tier, plusieurs méthodes existent et sont à explorer.
# Lister les variables d'environnement pour une première prise de vue
Get-ChildItem Env:
# Lister les fichiers avec High Integrity
icacls C:\chemin\vers\dossier /Q /C /T | findstr /C:"NO S-1-16-12288"
# Consulter le registre (https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/reg-query)
reg query
# Lister les processus en cours d'éxecution
Get-Process
# Lister les fichiers modifiés dans les deux dernières minutes (Privesc par Task Scheduler)
Get-ChildItem -Path C:\chemin\vers\dossier\ -Recurse | ? {
$_.LastWriteTime -gt (Get-Date).AddSeconds(-120)
} | Select-Object -ExpandProperty FullName
# Lister tous les fichiers cachés (sauf Alternate Data Streams)
Get-ChildItem -Path "C:\Chemin\Repertoire" -Force -Hidden *
# Lister les Alternate Data Streams potentiels dans un CSV.
Pushd C:\chemin\vers\dossier
Get-ChildItem -Recurse | ForEach-Object {
Get-Item $_.FullName -Stream *
} | Where-Object Stream -ne ':$Data' |
Select-Object FileName,Stream,
@{n='CreationTime';e={(Get-Item $_.FileName).CreationTime}},
@{n='LastWriteTime';e={(Get-Item $_.FileName).LastWriteTime}},
@{n='Content';e={gc "$($_.FileName):$($_.Stream)"}} |
Export-Csv Streams.csv -NoTypeInformation
Vous pouvez également consulter ma page sur les commandes pratiques de PowerShell. Pour ce qui est d'une analyse plus approfondie, vous pouvez consulter la page de PayloadsAllTheThings prévue à cet effet. Elle contient de nombreux scripts et de nombreuses astuces.
Windows étant un bordel monstrueux avec des fonctionnalités contradictoires, des bouts de codes legacy isolés et toujours fonctionnels, des objets construits en mille-feuille par souci de rétro-compatibilité, il existe de très nombreuses manières originales de faire de la privesc
dans le cadre d'un CTF
par exemple. En situation réelle, ça sera surtout des erreurs de configuration d'Active Directories.
Dernière mise à jour
Cet article vous a-t-il été utile ?