diff --git a/.gitignore b/.gitignore
@@ -30,3 +30,4 @@ go.work.sum
# Editor/IDE
# .idea/
# .vscode/
+mic
diff --git a/cmd/root.go b/cmd/root.go
@@ -9,6 +9,9 @@ import (
var SKID_ASCII_ART = `
+
+
+
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣤⣤⣤⣤⣤⣤⣄⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠛⠻⠿⢿⣿⣿⣿⣿⣿⣶⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⣿⣿⣿⣿⣿⣿⣶⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
diff --git a/go.mod b/go.mod
@@ -5,6 +5,12 @@ go 1.24.4
require github.com/spf13/cobra v1.9.1
require (
+ github.com/andybalholm/brotli v1.0.6 // indirect
+ github.com/cloudflare/circl v1.5.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
+ github.com/klauspost/compress v1.17.4 // indirect
+ github.com/refraction-networking/utls v1.7.3 // indirect
github.com/spf13/pflag v1.0.6 // indirect
+ golang.org/x/crypto v0.36.0 // indirect
+ golang.org/x/sys v0.31.0 // indirect
)
diff --git a/go.sum b/go.sum
@@ -1,10 +1,22 @@
+github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI=
+github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
+github.com/cloudflare/circl v1.5.0 h1:hxIWksrX6XN5a1L2TI/h53AGPhNHoUBo+TD1ms9+pys=
+github.com/cloudflare/circl v1.5.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=
+github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
+github.com/refraction-networking/utls v1.7.3 h1:L0WRhHY7Oq1T0zkdzVZMR6zWZv+sXbHB9zcuvsAEqCo=
+github.com/refraction-networking/utls v1.7.3/go.mod h1:TUhh27RHMGtQvjQq+RyO11P6ZNQNBb3N0v7wsEjKAIQ=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
+golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
+golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
+golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/mic b/mic
Binary files differ.
diff --git a/proxy/backend.go b/proxy/backend.go
@@ -0,0 +1,27 @@
+package proxy
+
+import (
+ "bufio"
+ "log"
+ "net"
+)
+
+func backendHandler(conn net.Conn, p *Proxy) {
+ defer conn.Close()
+ reader := bufio.NewReader(conn)
+
+ /* peek to determine protocol */
+ peek, err := reader.Peek(1)
+ if err != nil {
+ log.Printf("[-] peek failed: %s\n", err.Error())
+ return
+ }
+
+ if isSocks5(peek) {
+
+ }
+}
+
+func init() {
+ RegisterHandler(backendHandler)
+}
diff --git a/proxy/httpconnect.go b/proxy/httpconnect.go
@@ -0,0 +1,22 @@
+package proxy
+
+import (
+ "bufio"
+ "net"
+ "strings"
+)
+
+func httpConnectHandler(conn net.Conn, p *Proxy) {
+ reader := bufio.NewReader(conn)
+ line, err := reader.Peek(7)
+
+ if err != nil || !strings.HasPrefix(string(line), "CONNECT") {
+ return /* not HTTP, let next handler deal with it */
+ }
+
+ conn.Close()
+}
+
+func init() {
+ RegisterHandler(httpConnectHandler)
+}
diff --git a/proxy/proxy.go b/proxy/proxy.go
@@ -0,0 +1,44 @@
+package proxy
+
+import (
+ "crypto/x509"
+ "net"
+)
+
+type Proxy struct {
+ ListenAddr string
+ CAPool *x509.CertPool
+}
+
+// function is a function that processes an incoming client connection
+type Handler func(conn net.Conn, p *Proxy)
+
+// registry for all protocol handlers
+var handlers []Handler
+
+// adds a handler to the orchestrator
+func RegisterHandler(h Handler) {
+ handlers = append(handlers, h)
+}
+
+// Run starts the proxy server and orchestrates all protocol handlers
+func (p *Proxy) Run() error {
+ ln, err := net.Listen("tcp", p.ListenAddr)
+ if err != nil {
+ return err
+ }
+
+ for {
+ c, err := ln.Accept()
+ if err != nil {
+ return err
+ }
+
+ conn := c
+ go func() {
+ for _, h := range handlers {
+ h(conn, p)
+ }
+ }()
+ }
+}
diff --git a/proxy/socks5.go b/proxy/socks5.go
@@ -0,0 +1,25 @@
+package proxy
+
+import (
+ "bufio"
+ "net"
+)
+
+func isSocks5(peek []byte) bool {
+ return peek != nil || peek[0] == 0x05
+}
+
+func socks5Handler(conn net.Conn, p *Proxy) {
+ reader := bufio.NewReader(conn)
+ peek, err := reader.Peek(1)
+
+ if err != nil || peek[0] != 0x05 {
+ return /* not SOCKS5, let next handler deal with it */
+ }
+
+ conn.Close()
+}
+
+func init() {
+ RegisterHandler(socks5Handler)
+}
| | | | | | | | |