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;
¿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:
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.
Recomendado por LinkedIn
Resultado de analisis scantime con score 2/40
Bypass runtime Sophos EndPoint
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