
Un POC d'une nouvelle technique d'injection de processus "sans thread" qui fonctionne en utilisant le concept de rappels de notification de DLL dans les processus locaux et distants.
DllNotificationInection est une POC d'une nouvelle technique d'injection de processus « sans thread » qui fonctionne en utilisant le concept de rappels de notification DLL dans les processus locaux et distants.
Un article de blog accompagnant avec plus de détails est disponible ici :
https://shorsec.io/blog/dll-notification-injection/
DllNotificationInection fonctionne en créant une nouvelle LDR_DLL_NOTIFICATION_ENTRY dans le processus distant. Il l'insère manuellement dans la LdrpDllNotificationList distante en patchant le List.Flink de la tête de liste et le List.Blink de la première entrée (maintenant la deuxième) de la liste.
Notre nouvelle LDR_DLL_NOTIFICATION_ENTRY pointera vers un shellcode trampoline personnalisé (construit avec le projet ShellcodeTemplate de @C5pider) qui restaurera nos modifications et exécutera un shellcode malveillant dans un nouveau thread en utilisant TpWorkCallback.
Après avoir enregistré manuellement notre nouvelle entrée dans le processus distant, nous avons simplement besoin d'attendre que le processus distant déclenche notre rappel de notification DLL en chargeant ou déchargeant une DLL. Cela n'arrive évidemment pas régulièrement dans tous les processus, donc un travail préalable pour trouver des candidats appropriés pour cette technique d'injection est nécessaire. D'après mes brèves recherches, il semble que RuntimeBroker.exe et explorer.exe soient des candidats appropriés pour cela, bien que je vous encourage à en trouver d'autres également.
Ceci est une POC. Pour que cela soit sûr du point de vue OPSEC et échappe aux produits AV/EDR, quelques modifications sont nécessaires. Par exemple, j'ai utilisé RWX lors de l'allocation de mémoire pour les shellcodes - ne soyez pas paresseux (comme moi) et changez-les. On pourrait également vouloir remplacer OpenProcess, ReadProcessMemory et WriteProcessMemory par des API de plus bas niveau et utiliser des Indirect Syscalls ou (plug éhonté) HWSyscalls. Peut-être chiffrer les shellcodes ou même aller plus loin et modifier le shellcode trampoline selon vos besoins, ou au moins changer les valeurs de hachage par défaut dans le projet ShellcodeTemplate de @C5pider qui a été utilisé pour créer le shellcode trampoline.