// Send 200 Connection Established clientConn.Write([]byte("HTTP/1.1 200 Connection Established\r\n\r\n"))
func handleInjectorTunnel(w http.ResponseWriter, r *http.Request) { dest, err := extractDestination(r) if err != nil { http.Error(w, "Missing destination", http.StatusBadRequest) return }
func main() { server := &http.Server{ Addr: ":8080", Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method == http.MethodConnect { handleTunnel(w, r) return } http.Error(w, "Only CONNECT method allowed", http.StatusMethodNotAllowed) }), } log.Fatal(server.ListenAndServe()) }
// Ensure port is present if !strings.Contains(dest, ":") { dest = dest + ":80" // default to HTTP }
clientConn.Write([]byte("HTTP/1.1 200 OK\r\n\r\n"))
func main() { flag.Parse() http.HandleFunc("/", handle) log.Printf("Remote proxy listening on %s", *listenAddr) log.Fatal(http.ListenAndServe(*listenAddr, nil)) } Build:
go func() { io.Copy(destConn, clientConn) }() io.Copy(clientConn, destConn) }
type connPool struct { sync.Mutex conns map[string][]net.Conn } func (p *connPool) Get(addr string) net.Conn { p.Lock() defer p.Unlock() if pool, ok := p.conns[addr]; ok && len(pool) > 0 { conn := pool[len(pool)-1] p.conns[addr] = pool[:len(pool)-1] return conn } return nil }
Example payload from Injector:
// Connect to destination dialer := net.Dialer{Timeout: 10 * time.Second} destConn, err := dialer.Dial("tcp", dest) if err != nil { http.Error(w, err.Error(), 502) return } defer destConn.Close()
// Bidirectional copy go func() { io.Copy(destConn, clientConn) }() io.Copy(clientConn, destConn) }
clientConn.Write([]byte("HTTP/1.1 200 Connection Established\r\n\r\n"))
hijacker, ok := w.(http.Hijacker) if !ok { http.Error(w, "Hijacking not supported", http.StatusInternalServerError) return } clientConn, _, err := hijacker.Hijack() if err != nil { log.Printf("Hijack error: %v", err) return } defer clientConn.Close()
var ( listenAddr = flag.String("listen", ":8080", "HTTP proxy listen address") )
Remote Proxy For Http Injector -
// Send 200 Connection Established clientConn.Write([]byte("HTTP/1.1 200 Connection Established\r\n\r\n"))
func handleInjectorTunnel(w http.ResponseWriter, r *http.Request) { dest, err := extractDestination(r) if err != nil { http.Error(w, "Missing destination", http.StatusBadRequest) return }
func main() { server := &http.Server{ Addr: ":8080", Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method == http.MethodConnect { handleTunnel(w, r) return } http.Error(w, "Only CONNECT method allowed", http.StatusMethodNotAllowed) }), } log.Fatal(server.ListenAndServe()) }
// Ensure port is present if !strings.Contains(dest, ":") { dest = dest + ":80" // default to HTTP } remote proxy for http injector
clientConn.Write([]byte("HTTP/1.1 200 OK\r\n\r\n"))
func main() { flag.Parse() http.HandleFunc("/", handle) log.Printf("Remote proxy listening on %s", *listenAddr) log.Fatal(http.ListenAndServe(*listenAddr, nil)) } Build:
go func() { io.Copy(destConn, clientConn) }() io.Copy(clientConn, destConn) } // Send 200 Connection Established clientConn
type connPool struct { sync.Mutex conns map[string][]net.Conn } func (p *connPool) Get(addr string) net.Conn { p.Lock() defer p.Unlock() if pool, ok := p.conns[addr]; ok && len(pool) > 0 { conn := pool[len(pool)-1] p.conns[addr] = pool[:len(pool)-1] return conn } return nil }
Example payload from Injector:
// Connect to destination dialer := net.Dialer{Timeout: 10 * time.Second} destConn, err := dialer.Dial("tcp", dest) if err != nil { http.Error(w, err.Error(), 502) return } defer destConn.Close() r *http.Request) { dest
// Bidirectional copy go func() { io.Copy(destConn, clientConn) }() io.Copy(clientConn, destConn) }
clientConn.Write([]byte("HTTP/1.1 200 Connection Established\r\n\r\n"))
hijacker, ok := w.(http.Hijacker) if !ok { http.Error(w, "Hijacking not supported", http.StatusInternalServerError) return } clientConn, _, err := hijacker.Hijack() if err != nil { log.Printf("Hijack error: %v", err) return } defer clientConn.Close()
var ( listenAddr = flag.String("listen", ":8080", "HTTP proxy listen address") )