
Heavily-modified fork of David Buchanan's dlinject project. Injects arbitrary assembly (or precompiled binary) payloads directly into x86-64, x86, and ARM32 Linux processes without the use of ptrace by accessing /proc/<pid>/mem. Useful for certain post-exploitation scenarios, recovering content from process memory, etc..
asminject.py est un fork fortement modifié du projet dlinject de David Buchanan. Il injecte des charges utiles en assembleur arbitraire (ou des binaires précompilés) directement dans des processus Linux x86-64, x86 et ARM32 en accédant à /proc/<pid>/mem au lieu de s'attacher via ptrace. Utile pour altérer des processus de confiance, certains scénarios de post-exploitation, récupérer du contenu depuis la mémoire de processus et contourner certains contrôles de sécurité. Peut injecter dans des processus conteneurisés depuis l'extérieur du conteneur, tant que vous disposez d'un accès root sur l'hôte.
Vous pouvez également en apprendre davantage sur asminject.py et ses origines sur sa page d'outil Bishop Fox, notamment un article détaillé sur le travail qui a inspiré l'outil.
Dans ce document :
Documentation séparée et plus détaillée :
asminject.py est comme dlinject, sauf qu'il permet d'injecter n'importe quelle charge utile au lieu de simplement charger une bibliothèque, et il fonctionne sur plusieurs architectures."asminject.py ressemble vaguement à Frida, sauf qu'il ne s'attache pas via l'interface ptrace, de sorte que les processus ne peuvent pas le bloquer en s'auto-traçant via ptrace."asminject.py a été écrit pour deux scénarios principaux de test de pénétration dans des environnements Linux :
Par exemple, considérons un test de pénétration dans lequel le testeur a obtenu un accès root à un serveur hébergeant de nombreux conteneurs. L'un des conteneurs traite des virements bancaires et dispose d'un produit de sécurité des points de terminaison très robuste installé à l'intérieur. Lorsque le testeur d'intrusion tente de modifier les données de virement depuis l'intérieur du conteneur, le logiciel de sécurité des points de terminaison détecte et bloque la tentative. asminject.py permet au testeur d'intrusion d'injecter du code arbitraire directement dans la mémoire du processus du logiciel bancaire, voire même dans le produit de sécurité des points de terminaison, depuis l'extérieur du conteneur. Comme une victime du « malin génie » de Descartes, le logiciel de sécurité dans le conteneur est impuissant, car il existe dans un environnement entièrement contrôlé par l'attaquant.
Le dlinject.py original a été conçu spécifiquement pour charger des bibliothèques partagées Linux dans un processus existant. asminject.py fait tout ce que l'original faisait et bien plus encore. Il exécute du code assembleur arbitraire et inclut des modèles pour une variété d'attaques. Il a également été repensé pour aider à éviter la détection par les mécanismes de sécurité qui se basent sur des activités potentiellement suspectes, comme les événements de chargement de bibliothèques.
Le répertoire practice de ce dépôt contient un code de boucle de base qui affiche un horodatage et le numéro d'itération de la boucle sur la console, afin que vous puissiez vous entraîner à injecter différents types de code dans un environnement contrôlé. Ces boucles d'entraînement sont utilisées dans les exemples suivants.
La syntaxe de base pour appeler asminject.py est :
# python3 ./asminject.py <target_process_id> <payload> \
--arch [x86-64|x86|arm32] --relative-offsets-from-binaries --stop-method "slow" \
--var <payload_variable_1_name> <payload_variable_1_value> \
# ... \
--var <payload_variable_n_name> <payload_variable_n_value>
Dans la plupart des cas, toutes les charges utiles utilisées dans les exemples fonctionneront sur toutes les architectures prises en charge.
La plupart des distributions Linux incluent un module de sécurité du noyau nommé Yama qui contrôle l'accès à l'utilisation de la capacité ptrace contre d'autres processus. Bien que asminject.py ne s'attache pas à l'interface du débogueur, il nécessite toujours l'autorisation d'utiliser la capacité ptrace. Si vous recevez des erreurs concernant cette capacité, vérifiez le contenu de /proc/sys/kernel/yama/ptrace_scope. S'il est défini sur 2, exécutez la commande suivante en tant que root :
echo 1 > /proc/sys/kernel/yama/ptrace_scope
Les valeurs de 3 ou plus ne peuvent pas être désactivées sans un redémarrage. Cependant, si vous êtes un administrateur autorisé d'un système Linux où quelqu'un a accidentellement défini /proc/sys/kernel/yama/ptrace_scope sur 3, ou si vous menez un test de pénétration autorisé dans un environnement où cette valeur a été définie, consultez le répertoire ptrace_scope_kernel_module pour un contournement potentiel qui ne nécessite pas de redémarrage.
gcc au niveau du système d'exploitation.eval de code de script lisible par l'humain), fournir des charges utiles pour tirer parti de cette capacité pour encore plus de discrétion.dlinject.py.asminject.py - des recherches supplémentaires sont nécessaires.asminject.py pourrait demander à l'opérateur une ligne de code à injecter, l'injecter, renvoyer la sortie obtenue, puis demander une autre ligne de code à l'opérateur.
asminject.py d'une manière qui évite la nécessité pour Frida d'invoquer temporairement l'interface du débogueur.asminject.py s'exécute. Par exemple, interagir avec un appareil distant à l'aide de matériel comme une « sangsue PCI », exploiter des cas limites extrêmes comme des appareils avec /proc/mem accessible en tant que root via un partage NFS, etc.