package main import ( "fmt" "net" "log" "sync" "syscall" "flag" ) type Options struct { ConfigPath string Jail bool } func ParseOptions() Options { var opts Options flag.StringVar(&opts.ConfigPath, "config", "dentata.json", "config.json to load") flag.BoolVar(&opts.Jail, "jail", false, "drop to low priv jail") flag.Parse() return opts } func handleConnection(conn net.Conn) { defer conn.Close() addr := conn.RemoteAddr() fmt.Println("Connect from", addr.Network(), addr.String()) // send explosion notice to dentata report, err := net.Dial("tcp","127.0.0.1:9001") if err != nil { panic(err) } defer report.Close() report.Write([]byte(addr.String())) } func listener(addr string) { server, err := net.Listen("tcp", addr) if err != nil { panic(err) } for { conn, err := server.Accept() if err != nil { log.Println("ACCEPT ERROR", err) } else { go handleConnection(conn) } } } func ChrootJailLOL() { err := syscall.Chdir("tmp") if err != nil { panic(err) } err = syscall.Chroot(".") if err != nil { panic(err) } err = syscall.Setuid(1000) if err != nil { panic(err) } syscall.Setgid(1000) if err != nil { panic(err) } } func main() { opts := ParseOptions() var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Go(func () { listener(fmt.Sprintf("0.0.0.0:%d", 8000 + i)) }) } if opts.Jail { ChrootJailLOL() } wg.Wait() }