Tráfico de proxy de intranet: análisis y programación del principio del protocolo Socks5

0x00 Resumen

En los simulacros de penetración diarios, el proxy es esencial. Por lo general, usamos el protocolo socks5 que viene con socks4 y las herramientas de proxy en CS. En este momento, todavía debemos considerar el problema de evitar el tráfico durante este proceso, por lo que aún necesitamos tomar un análisis detallado. mire el protocolo subyacente y luego analice y modifique las características del tráfico

0x01 Introducción y proceso

Lo siguiente está tomado de Wikipedia.

SOCKS es un protocolo de transmisión de red , que se utiliza principalmente para la transmisión intermedia de comunicación entre el cliente y el servidor de red externo. SOCKS es la abreviatura de "SOCKetS" [ Nota 1] . Cuando el cliente detrás del firewall quiere acceder al servidor externo, se conecta con el servidor proxy SOCKS . Este servidor proxy controla las calificaciones del cliente para acceder a la red externa y, si está permitido, envía la solicitud del cliente a un servidor externo. Este protocolo fue desarrollado originalmente por David Koblas y luego extendido a SOCKS4 por Ying-Da Lee de NEC. El protocolo más reciente es SOCKS5. En comparación con la versión anterior, admite UDP , autenticación e IPv6 . Según el modelo OSI , SOCKS es un protocolo en la capa de sesión , ubicado entre la capa de presentación y la capa de transporte . El protocolo SOCKS no proporciona cifrado .

Pequeño punto de conocimiento: SOCKS 5 amplía la versión 4 y agrega compatibilidad con el protocolo UDP

El protocolo SOCKS5 se divide principalmente en tres etapas:

  • (1) Versión del protocolo y método de autenticación
  • (2) Ejecutar la autenticación correspondiente según el método de autenticación
  • (3) Solicitar información

El siguiente es un análisis detallado de estos procesos, con un poco de pseudocódigo Go para mayor comodidad.

0x02 Autenticación de autorización de Socks5Auth

El cliente debe iniciar una solicitud para verificar la versión del protocolo y su método de autenticación.

Aquí está el formato de solicitud del servidor de solicitud del cliente

VER El número de versión del protocolo de esta solicitud, socks 5, toma un valor fijo de 0x05
NMETHODS El número de métodos de autenticación admitidos por el cliente, el valor posible es 1~255
MÉTODOS Lista de métodos de autenticación disponibles

Luego, el servidor tiene que elegir un método de autenticación y decirle al cliente:

VER VER especifica la versión de calcetines aquí, que es 0x05
MÉTODO El método de autenticación seleccionado; donde 0x00 significa que no se requiere autenticación, 0x02 es autenticación de nombre de usuario/contraseña, ...

En general, hay dos métodos de autenticación actualmente admitidos por METHOD:

  • 0x00 (autenticación no requerida)
  • 0x20 (nombre de usuario, autenticación de contraseña)

, por ejemplo, si somos calcetines5 aquí, debemos aceptar 0x05, y establecemos que no se requiere verificación. Entonces 0x00 no necesita verificación

//无需认证 直接返回 0x05 0x00 就好了
n, err = client.Write([]byte{
    
    0x05, 0x00})

0x03 análisis del protocolo socks5 para establecer una conexión

Después de que el cliente y el servidor de Socket5 pasan la verificación de autorización de ambas partes, comienzan a establecer una conexión. La conexión la inicia el cliente, que le dice al servidor Sokcet a qué servidor remoto necesita acceder el cliente, incluida la dirección y el puerto del servidor remoto. La dirección puede ser IP4, IP6 o un nombre de dominio.

VER VER especifica la versión de calcetines aquí, que es 0x05
REPS Código de estado, 0x00=éxito, 0x01=error desconocido,...
RSV Todavía inútil RESERVADO
TIPO Tipo de dirección
BND.DIR. La dirección utilizada por el servidor y el horario de verano para crear una conexión
BND.PORT El puerto utilizado por el servidor y DST para crear conexiones
  • VER representa la versión del protocolo Socket, el valor predeterminado de Socket5 es 0x05 y la longitud de su valor es 1 byte

  • CMD representa el tipo de solicitud del cliente, la longitud del valor también es de 1 byte, hay tres tipos

    • CONECTAR 0x01
    • ENLACE 0x02
    • ASOCIADO UDP 0x03'
  • RSV palabra reservada, la longitud del valor es de 1 byte

  • ATYP representa el tipo de dirección del servidor remoto solicitado, la longitud del valor es de 1 byte y hay tres tipos de uso común

  • 1:表示是一个IPV4地址(IP V4 address);
    3:表示是一个域名(DOMAINNAME);
    4:表示是一个IPV6地址(IP V6 address);
    
  • DST.ADDR representa la dirección del servidor remoto, que se analiza según ATYP, y la longitud del valor es variable.

  • DST.PORT representa el puerto del servidor remoto, qué puerto visitar, la longitud del valor es de 2 bytes

El servidor devolverá los siguientes datos al cliente en respuesta a la conexión exitosa del cliente.

resp := []byte{
    
    0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}

Este también es un lugar más interesante, haciendo que el tráfico evite matar.

0x03 Reenvío de datos después del establecimiento del enlace

Una vez que finalmente se completa la conexión, se requiere el reenvío de datos. Esta operación es la misma que escribir el reenvío de puertos, y el tráfico de los dos puertos se puede reenviar a través de io.Copy()

Dado que golang tiene un io.Copy, es muy fácil de usar

forward := func(src, dest net.Conn) {
    
    
    defer src.Close()
    defer dest.Close()
    io.Copy(src, dest)
  }

go forward(client, target)
go forward(target, client)

0x04 Problema de detección de flujo

Esta es solo la prueba de SkyEye. Este tipo de autenticación se puede identificar fácilmente, porque las reglas coincidentes se pueden entender inmediatamente después del análisis. Esta es la regla para que el servidor responda a la conexión exitosa del cliente, por lo que la detección de SkyEye es la regla para este ataque exitoso .

{0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}

Carga útil de detección de Skyeye:

0x05 Evasión de tráfico

Ahora que conocemos las reglas, es mucho más fácil evitar matar, porque este es el proceso de autenticación de calcetines, aunque se puede cambiar el servidor, pero nuestras herramientas son el protocolo de calcetines5 del protocolo normal, por lo que también se debe cambiar el cliente. , por lo que cambiar la autenticación en realidad no es conveniente. Entonces, la forma más fácil de implementarlo es agregar un túnel en el medio.

imagen-20211027203826936

De hecho, puede evitar la detección de tráfico, pero no presté atención cuando lo escribí. Es una conexión directa. Para el combate real, todavía está escrito como un enlace externo activo del lado del cliente, por lo que no es muy útil. , así que lo cambiaré de nuevo. . .

Supongo que te gusta

Origin blog.csdn.net/god_zzZ/article/details/121043330
Recomendado
Clasificación