
RevSuit es una plataforma de conexión inversa flexible y potente diseñada para recibir conexiones desde el host objetivo en penetración.
English |简体中文
RevSuit es una plataforma de conexión inversa flexible y poderosa diseñada para recibir conexiones desde el host objetivo en pruebas de penetración. Actualmente es compatible con los protocolos HTTP, DNS, RMI, LDAP, MySQL y FTP.
Flexible:
Poderoso:
Descargue la última versión directamente o construya siguiendo estos pasos:
git clone https://github.com/Li4n0/revsuit.git
cd revsuit/frontend && yarn install && yarn build
cd ../ && go build ./cmd/revsuit/revsuit.go
RevSuit generará un archivo de configuración predeterminado en la primera ejecución. Modifique el archivo de configuración según sus necesidades y luego vuelva a ejecutar. Una descripción detallada del archivo de configuración se encuentra en: Notas de configuración
Para confirmar la ubicación IP, es necesario usar la base de datos de ubicación IP. QQwry se utiliza como fuente de datos por defecto, también puede modificar la configuración para usar GeoIP. Si la base de datos seleccionada no está disponible en el directorio actual o si la base de datos se actualiza durante más de una semana, RevSuit descargará automáticamente la base de datos más reciente. Si la descarga falla, el campo IpArea siempre será nulo.
$ ./revsuit
2021/05/16 22:55:10 [ INFO] Descargando qqwry.dat...
____ _____ _ __
/ __ \___ _ __/ ___/__ __(_) /_
/ /_/ / _ \ | / /\__ \/ / / / / __/
/ _, _/ __/ |/ /___/ / /_/ / / /_
/_/ |_|\___/|___//____/\__,_/_/\__/
vBeta0.1
https://revsuit.pro
2021/05/16 22:55:22 [ INFO] Iniciando servidor HTTP en :80, token:your_token
2021/05/16 22:55:22 [ INFO] Iniciando escucha en puerto FTP PASV en :2020, PasvIP es 10.9.8.7
2021/05/16 22:55:22 [ INFO] Iniciando servidor FTP en :21
2021/05/16 22:55:22 [ INFO] Iniciando servidor MySQL en :3306
2021/05/16 22:55:22 [ INFO] Iniciando servidor RMI en :1099
2021/05/16 22:55:22 [ INFO] Iniciando servidor DNS en :53
Después de ejecutar, puede visitar la ruta /revsuit/admin/ del servidor HTTP e ingresar el token para acceder al panel de control.
Tomemos como ejemplo la creación de reglas HTTP:
Algunas notas son las siguientes:
name y el flagFormat de la regla son únicos.FlagFormat usa sintaxis de expresión regular, y para diferentes protocolos, los campos que coinciden con flagFormat son diferentes; puede consultar las pistas correspondientes para obtener detalles al crear reglas.flagFormat, y el resultado de la agrupación coincidente también se utilizará como variable de plantilla.Como se muestra a continuación, creamos una regla que utiliza variables de plantilla integradas y variables de plantilla personalizadas del protocolo http, y la nombramos test_create_rule:

Luego realice una solicitud que cumpla con la regla y vea la respuesta.

La solicitud se registrará en la plataforma al mismo tiempo.

Si desea recibir notificaciones de nuevas conexiones en su software de oficina, puede configurar la dirección del webhook del software correspondiente en el archivo de configuración y activar el interruptor Notice para la regla correspondiente. Actualmente solo se admite cuatro tipos de software: dingtalk, wechat, lark, slack. (El soporte para Discord y Telegram está en planes.)
Si está migrando plataformas o depurando datos, puede ser una molestia recrear reglas. Por eso la plataforma soporta la importación y exportación de reglas.
El punto de entrada para esta función se encuentra en Configuración>REGLAS.
Las reglas se almacenan en formato yaml para importación y exportación, como el siguiente:
http:
- name: test_create_rule
flag_format: (?P<what>\w+)\?
rank: 0
push_to_client: false
notice: false
response_status_code: "302"
response_headers:
Location: ${query.url}
response_body: ${header.say} ${what}
- name: other_rule
flag_format: other
rank: 1
push_to_client: false
notice: true
response_status_code: "200"
response_headers: { }
response_body: ¡Hola Revsuit!
dns:
... ...
RevSuit fue separado de mi proyecto de escáner, por lo que su soporte nativo funciona con escáneres.
Desde la perspectiva de RevSuit, llamamos cliente al escáner.
RevSuit utiliza Eventos enviados por el servidor HTTP (SSE) para establecer un canal de comunicación unidireccional con el cliente.
La API para el canal es: /revsuit/api/events?message. El cliente primero debe agregar el encabezado Token: your token al encabezado, y luego acceder a la API para establecer el canal. Cuando la plataforma recibe una nueva conexión, el flag capturado por la regla se pasará al cliente a través de este canal.

Aquí hay un demo simple utilizando la biblioteca sse de Golang como ejemplo.
Como se muestra arriba, RevSuit admite múltiples clientes, y cada cliente en estado conectado recibe un push de flag, por lo que se puede soportar escaneo distribuido.
Si no desea que cada cliente reciba todos los push de flag, puede usar el encabezado de solicitud Flag-Filter al crear una conexión sse para establecer el formato (expresiones regulares) del flag que desea que ese cliente reciba:

RevSuit almacenará flag temporalmente en la cola cuando no haya conexión de cliente y lo enviará cuando el cliente se conecte, por lo que no tiene que preocuparse por perder la vulnerabilidad porque el cliente se desconecta. (Esto es especialmente útil para descubrir vulnerabilidades activadas por retardo.)
En un escenario real de escaneo de vulnerabilidades, puede enviar una gran cantidad de diferentes payloads para un único punto de vulnerabilidad, y todos pueden ser válidos, lo que puede resultar en que la plataforma de enlace inverso reciba muchas solicitudes, pero todas son causadas por la misma vulnerabilidad. Si no desea que el cliente reciba tantos flags para la misma vulnerabilidad, puede aprovechar la característica flagGroup del flagFormat de la regla.
FlagGroup es el contenido coincidente por el grupo anónimo en el campo flagFormat de la regla. La plataforma verificará el contenido coincidente en la agrupación, y el flag solo se enviará al cliente cuando el contenido (flagGroup) capturado aparezca por primera vez.
Por ejemplo, escaneo SSRF.
Primero cree una regla como la siguiente:
http:
- name: ssrf
flag_format: (ssrf[a-z0-9]{6})[0-9]{1,3}
rank: 0
push_to_client: false
notice: false
response_status_code: "200"
response_headers: { }
response_body: "¡Aquí hay un SSRF!"
Supongamos que nuestro objetivo es https://www.testvuln.com?url=api.com&p=useless, y para SSRF tenemos 5 payloads. La solicitud final enviada por el escáner puede ser ['https://www.testvuln.com?url=http://revsuit.com/ssrfa98oni1&p=useless','https://www.testvuln.com?url=http://revsuit.com/ssrfa98oni2&p=useless', ... ,'https://www.testvuln.com?url=//revsuit.com/ssrfa98oni5&p=useless']. Todos pueden atacar con éxito.
Sin embargo, debido a que se usa agrupación anónima en el flagFormat de la regla, la plataforma consultará el flagGroup conectado, en este caso ssrfa98oni, y enviará flag al cliente solo en su primera aparición, por lo que el cliente solo recibirá un flag: ssrfa98oni1. Ya prueba que el parámetro url del objetivo es vulnerable.
En escenarios reales de pruebas de penetración, ciertas tareas se pueden realizar de manera fácil y rápida combinando y emparejando varios módulos de RevSuit. A continuación se muestra un ejemplo de un XXE ciego en Java Web, que muestra cómo usar los módulos HTTP y FTP de RevSuit, combinados con variables de plantilla, para completar rápidamente un escaneo de puertos.
Primero cree una regla HTTP para devolver evil.dtd, personalice la respuesta al contenido de dtd para que vaya a conectarse al servicio FTP de RevSuit, y use variables de plantilla para pasar el Host y el Puerto a escanear a FTP a través del usuario y contraseña de FTP.

Luego cree una regla FTP que reciba el Host y el puerto a escanear desde las variables de plantilla de usuario y contraseña, configurada para Pasv Address.

Luego use BurpSuit para lanzar el escaneo, configurando los parámetros de host y puerto en la URL evil.dtd para establecer el objetivo del escaneo de puertos.

El efecto en ejecución es el siguiente:

Esto se debe a que la conexión FTP se bloqueará si la Dirección Pasiva no es accesible, podemos determinar si el puerto está abierto o no basándonos en si la conexión sale normalmente. Para este ejemplo, detectamos con éxito que los puertos 8005 y 8080 están abiertos.
Se está preparando una wiki más detallada; puede explorar por su cuenta mientras tanto.
Envíe un issue o contácteme a través de Weixin: TGk0bjA2Cg==
Este proyecto se basa en el código de los siguientes proyectos destacados:
Gracias a mi amigo @E99p1ant por toda la ayuda y los consejos que recibí durante el desarrollo de este proyecto.
@Licencia Apache 2.0