
Exploit para la ejecución remota de comandos en el comando go get de Golang.
Exploit para ejecución remota de comandos en el comando go get de Golang.
Cuando ejecutas go get con un paquete, Go está diseñado para compilar e instalar el paquete sin ejecutar ningún código de él. La intención es que puedas obtener, compilar e incluso instalar paquetes Go de forma segura sin confiar en ellos en absoluto. En teoría, parece que esto debería ser una tarea sencilla para el toolchain de Go, pero en realidad es un desafío real. go get hace mucho bajo el capó, incluida la invocación de herramientas de terceros como git y clang de maneras que están fuertemente influenciadas por las configuraciones de los paquetes. Garantizar que estas invocaciones sean seguras es una batalla cuesta arriba que Go aún no ha ganado del todo.
Cuando cgo está habilitado, el paso de compilación durante “go get” invoca al compilador C del host, gcc o clang, agregando los flags del compilador especificados en los archivos fuente de Go. Tanto gcc como clang admiten un mecanismo de plugins en el que un plugin de biblioteca compartida se carga en el compilador, según lo indican los flags del compilador. Esto significa que un repositorio de paquetes Go puede contener un archivo exploit.so junto con un archivo fuente de Go que diga (por ejemplo) // #cgo CFLAGS: -fplugin=exploit.so, lo que provoca que el plugin de ataque se cargue en el compilador C del host durante la compilación. Los plugins de Gcc y clang tienen acceso completamente sin restricciones al sistema del host.
Go anterior a 1.8.7, Go 1.9.x anterior a 1.9.4 y las versiones preliminares de Go 1.10 anteriores a Go 1.10rc2 permiten la ejecución remota de comandos en go get durante la compilación del código fuente, aprovechando la función de plugins de gcc o clang, porque los argumentos -fplugin= y -plugin= no estaban bloqueados. Go anterior a 1.8.7, Go 1.9.x anterior a 1.9.4 y las versiones preliminares de Go 1.10 anteriores.
Para el Exploit necesitaremos alojar nuestro paquete malicioso. Necesitamos un sitio web con TLS y una cadena de certificados válida. Una forma sencilla de hacerlo es usar github.
Luego, necesitarás un archivo plugin/.so malicioso. El código en exploit.c debería ayudarte con eso.
Nota: Cambia este código en exploit.c por tu comando
void exploit() {
system("<Your CMD>");
}
Nota: Compila este archivo de acuerdo con la arquitectura de la máquina/PC de tu víctima
Puedes construir exploit.sp con el siguiente comando:
gcc -shared -o exploit.so -fPIC exploit.c
Una vez que alojes tu payload completo en Github, deberías poder pasar el enlace del paquete a la víctima.