parent
35a1a954b0
commit
9181ce19c9
@ -1,15 +1,15 @@ |
|||||||
build: |
build: |
||||||
go build ./cmd/dentata
|
go build ./cmd/dentata
|
||||||
go build ./cmd/landmine
|
go build ./cmd/dblocker
|
||||||
|
|
||||||
clean: |
clean: |
||||||
rm dentata landmine
|
rm -f dentata dblocker
|
||||||
|
|
||||||
run_server: build |
run_dentata: build |
||||||
./dentata
|
./dentata
|
||||||
|
|
||||||
run_mine: build |
run_blocker: build |
||||||
./landmine
|
./dblocker
|
||||||
|
|
||||||
docs: |
docs: |
||||||
pkgsite -open
|
pkgsite -open
|
||||||
|
|||||||
@ -0,0 +1,77 @@ |
|||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"net" |
||||||
|
"log" |
||||||
|
"bufio" |
||||||
|
"flag" |
||||||
|
"os/exec" |
||||||
|
) |
||||||
|
|
||||||
|
type Options struct { |
||||||
|
Addr string |
||||||
|
} |
||||||
|
|
||||||
|
func ParseOptions() Options { |
||||||
|
var opts Options |
||||||
|
|
||||||
|
flag.StringVar(&opts.Addr, "addr", "127.0.0.1:9001", "address to bind to recv blocks") |
||||||
|
flag.Parse() |
||||||
|
|
||||||
|
return opts |
||||||
|
} |
||||||
|
|
||||||
|
func handleConnection(conn net.Conn) { |
||||||
|
defer conn.Close() |
||||||
|
|
||||||
|
scan := bufio.NewScanner(conn) |
||||||
|
|
||||||
|
for scan.Scan() { |
||||||
|
addr, _, err := net.SplitHostPort(scan.Text()) |
||||||
|
if err != nil { |
||||||
|
fmt.Println("Invalid host:port") |
||||||
|
continue |
||||||
|
} |
||||||
|
|
||||||
|
if addr == "127.0.0.1" { |
||||||
|
fmt.Println("IGNORE", addr) |
||||||
|
continue |
||||||
|
} |
||||||
|
|
||||||
|
fmt.Println("BLOCK: ", addr) |
||||||
|
|
||||||
|
cmd := exec.Command("nft", |
||||||
|
"add", "rule", "inet", |
||||||
|
"dentata", "input", |
||||||
|
"ip", "saddr", |
||||||
|
addr, "drop") |
||||||
|
|
||||||
|
err = cmd.Run() |
||||||
|
if err != nil { |
||||||
|
panic(err) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
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 main() { |
||||||
|
opts := ParseOptions() |
||||||
|
|
||||||
|
listener(opts.Addr) |
||||||
|
} |
||||||
@ -1,89 +0,0 @@ |
|||||||
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() |
|
||||||
} |
|
||||||
Loading…
Reference in new issue