Skip to content

Commit df5efe9

Browse files
authored
New networking core based on Freki (#37)
* using freki as networking core * flag for debug logging * peek and handle HTTP * tcp handler test * smtp test added * rfb (vnc) test added * proxy server added * simple FTP handler added * simple RDP PDU parser
1 parent a5c59f1 commit df5efe9

33 files changed

+650
-1169
lines changed

.gitignore

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
_obj
88
_test
99
build
10+
vendor
11+
bin
1012

1113
# Architecture specific extensions/prefixes
1214
*.[568vq]
@@ -23,6 +25,3 @@ _testmain.go
2325
*.exe
2426
*.test
2527
*.prof
26-
27-
logs.txt
28-
sensor

.travis.yml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ language: go
22

33
before_install:
44
- sudo apt-get -qq update
5-
- sudo apt-get install -y libpcap-dev
5+
- sudo apt-get install -y libpcap-dev libnetfilter-queue-dev iptables-dev
66

7-
install: go get -t ./...
7+
install:
8+
- go get -v github.com/Masterminds/glide
9+
- glide install
10+
- go get -t ./...
811

9-
script: go test -v ./...
12+
script: go test

Dockerfile

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
1-
FROM alpine:3.4
1+
FROM golang:1.7.4-alpine3.5
22
RUN apk update
3-
RUN apk add conntrack-tools iptables
4-
RUN mkdir -p /opt/glutton
5-
WORKDIR /opt/glutton
6-
ADD sensor .
7-
ADD config/ports.yml .
8-
CMD ["./sensor", "-conf", "ports.yml", "-set-tables"]
3+
RUN apk add libnetfilter_queue-dev iptables-dev libpcap-dev
4+
5+
RUN mkdir -p $GOPATH/src/github.com/mushorg/glutton
6+
WORKDIR $GOPATH/src/github.com/mushorg/glutton
7+
ADD . .
8+
RUN apk add g++
9+
10+
RUN mkdir -p bin/
11+
RUN go build -o bin/sensor app/server.go
12+
13+
# RUN mkdir -p /opt/glutton
14+
# WORKDIR /opt/glutton
15+
# ADD bin/sensor .
16+
# ADD rules/rules.yaml .
17+
CMD ["bin/sensor", "-interface", "eth0", "-rules", "rules/rules.yaml"]

Makefile

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
11
.PHONY: all test clean build
22

3+
default: build
4+
35
build:
4-
GOOS=linux go build -o sensor server/glutton_server.go
6+
@mkdir -p bin/
7+
go build -o bin/sensor app/server.go
8+
upx -1 bin/sensor
9+
10+
static:
11+
@mkdir -p bin/
12+
go build --ldflags '-extldflags "-static"' -o bin/sensor app/server.go
13+
upx -1 bin/sensor
14+
15+
clean:
16+
rm -rf bin/
517

618
run: build
7-
sudo ./sensor -conf config/ports.yml
19+
sudo ./bin/sensor -rules rules/rules.yaml
820

9-
docker: build
21+
docker:
1022
docker build -t glutton .
1123
docker run --cap-add=NET_ADMIN -it glutton

app/server.go

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"io"
7+
"net"
8+
"os"
9+
"os/signal"
10+
"strings"
11+
"sync"
12+
13+
log "github.com/Sirupsen/logrus"
14+
"github.com/kung-foo/freki"
15+
"github.com/mushorg/glutton"
16+
)
17+
18+
func onErrorExit(err error) {
19+
if err != nil {
20+
log.Fatal(err)
21+
}
22+
}
23+
24+
func onErrorClose(err error, conn net.Conn) {
25+
if err != nil {
26+
log.Error(err)
27+
err = conn.Close()
28+
if err != nil {
29+
log.Error(err)
30+
}
31+
}
32+
}
33+
34+
func onInterruptSignal(fn func()) {
35+
sig := make(chan os.Signal, 1)
36+
signal.Notify(sig, os.Interrupt)
37+
38+
go func() {
39+
<-sig
40+
fn()
41+
}()
42+
}
43+
44+
func main() {
45+
fmt.Println(`
46+
_____ _ _ _
47+
/ ____| | | | | |
48+
| | __| |_ _| |_| |_ ___ _ __
49+
| | |_ | | | | | __| __/ _ \| '_ \
50+
| |__| | | |_| | |_| || (_) | | | |
51+
\_____|_|\__,_|\__|\__\___/|_| |_|
52+
53+
`)
54+
logPath := flag.String("log", "/dev/null", "Log path")
55+
iface := flag.String("interface", "eth0", "Interface to work with")
56+
rulesPath := flag.String("rules", "/etc/glutton/rules.yaml", "Rules path")
57+
enableDebug := flag.Bool("debug", false, "Set to enable debug log")
58+
flag.Parse()
59+
60+
log.Infof("[glutton ] Loading rules from: %s", *rulesPath)
61+
rulesFile, err := os.Open(*rulesPath)
62+
onErrorExit(err)
63+
rules, err := freki.ReadRulesFromFile(rulesFile)
64+
onErrorExit(err)
65+
log.Infof("[glutton ] Rules: %+v", rules)
66+
67+
// Write log to file and stdout
68+
f, err := os.OpenFile(*logPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
69+
onErrorExit(err)
70+
log.SetOutput(io.MultiWriter(f, os.Stdout))
71+
72+
logger := log.New()
73+
if *enableDebug == true {
74+
logger.Level = log.DebugLevel
75+
}
76+
77+
// Initiate the freki processor
78+
processor, err := freki.New(*iface, rules, logger)
79+
onErrorExit(err)
80+
// Adding a proxy server
81+
processor.AddServer(freki.NewTCPProxy(6000))
82+
83+
err = processor.Init()
84+
onErrorExit(err)
85+
86+
exitMtx := sync.RWMutex{}
87+
exit := func() {
88+
exitMtx.Lock()
89+
println() // make it look nice after the ^C
90+
logger.Debugf("[glutton ] shutting down...")
91+
onErrorExit(processor.Shutdown())
92+
}
93+
94+
defer exit()
95+
onInterruptSignal(func() {
96+
exit()
97+
os.Exit(0)
98+
})
99+
100+
go func() {
101+
ln, err := net.Listen("tcp", ":5000")
102+
onErrorExit(err)
103+
104+
for {
105+
conn, err := ln.Accept()
106+
onErrorExit(err)
107+
108+
go func(conn net.Conn) {
109+
// TODO: Figure out how this works.
110+
//conn.SetReadDeadline(time.Now().Add(time.Second * 5))
111+
host, port, _ := net.SplitHostPort(conn.RemoteAddr().String())
112+
ck := freki.NewConnKeyByString(host, port)
113+
md := processor.Connections.GetByFlow(ck)
114+
115+
logger.Debugf("[glutton ] new connection: %s:%s -> %d", host, port, md.TargetPort)
116+
117+
if md.Rule.Name == "telnet" {
118+
go glutton.HandleTelnet(conn)
119+
} else if md.TargetPort == 25 {
120+
go glutton.HandleSMTP(conn)
121+
} else if md.TargetPort == 3389 {
122+
go glutton.HandleRDP(conn)
123+
} else if md.TargetPort == 21 {
124+
go glutton.HandleFTP(conn)
125+
} else if md.TargetPort == 5060 {
126+
go glutton.HandleSIP(conn)
127+
} else if md.TargetPort == 5900 {
128+
go glutton.HandleRFB(conn)
129+
} else {
130+
snip, bufConn, err := glutton.Peek(conn, 4)
131+
onErrorClose(err, conn)
132+
httpMap := map[string]bool{"GET ": true, "POST": true, "HEAD": true, "OPTI": true}
133+
if _, ok := httpMap[strings.ToUpper(string(snip))]; ok == true {
134+
go glutton.HandleHTTP(bufConn)
135+
} else {
136+
go glutton.HandleTCP(bufConn)
137+
}
138+
}
139+
}(conn)
140+
}
141+
}()
142+
143+
onErrorExit(processor.Start())
144+
}

config/glutton.conf

Lines changed: 0 additions & 12 deletions
This file was deleted.

config/ports.yml

Lines changed: 0 additions & 18 deletions
This file was deleted.

connections.go

Lines changed: 0 additions & 85 deletions
This file was deleted.

0 commit comments

Comments
 (0)