A replacement for fail2ban that doesn't fuck around.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
dentata/cmd/landmine/main.go

89 lines
1.4 KiB

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()
}