Repository navigation
Expand file tree
/
Copy pathmain.go
More file actions
140 lines (118 loc) · 3.7 KB
/
Copy pathmain.go
File metadata and controls
140 lines (118 loc) · 3.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package main
import (
"context"
"net/netip"
"os/signal"
"syscall"
"github.com/alecthomas/kingpin/v2"
"github.com/containers/buildah"
"go.uber.org/zap"
"pwnbot-ng/container"
"pwnbot-ng/preprocess"
"pwnbot-ng/proxy"
"pwnbot-ng/repo"
"pwnbot-ng/thrower"
"pwnbot-ng/ticker"
)
type netIpPrefix netip.Prefix
func (n *netIpPrefix) Set(s string) error {
prefix, err := netip.ParsePrefix(s)
if err != nil {
return err
}
*n = netIpPrefix(prefix)
return nil
}
func (n *netIpPrefix) String() string {
return (*netip.Prefix)(n).String()
}
func main() {
if buildah.InitReexec() {
return
}
syscall.Umask(0)
kingpin.CommandLine.Name = "pwnbot"
kingpin.CommandLine.Help = "Pwn the world"
kingpin.CommandLine.HelpFlag.Short('h')
var (
gitRepo = kingpin.Flag("repo", "Exploits git repo URL to clone from").Envar("PWNBOT_GIT_REPO").Required().String()
logPath = kingpin.Flag("log", "Path to write logs to").Envar("PWNBOT_LOG_PATH").Default("logs").String()
roundDura = kingpin.Flag("round", "Duration of a round in seconds").Envar("PWNBOT_ROUND_DURATION").Default("5m").Duration()
tickerAddr = kingpin.Flag("tick", "Address for the ticker to listen on").Envar("PWNBOT_TICKER_ADDR").Default("127.0.0.1:12450").String()
proxyNetwork = func() *netip.Prefix {
p := new(netip.Prefix)
kingpin.Flag("proxy", "Network prefix for the proxy").Envar("PWNBOT_PROXY_NETWORK").PlaceHolder("10.10.0.0/20").SetValue((*netIpPrefix)(p))
return p
}()
)
kingpin.Parse()
config := zap.NewDevelopmentConfig()
config.DisableStacktrace = true
logger, err := config.Build()
if err != nil {
panic(err)
}
rootCtx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer stop()
logger.Info("starting pwnbot")
repoLogger := logger.Named("repo")
r, err := repo.NewRepository(rootCtx, repoLogger, *gitRepo)
if err != nil {
logger.Panic("failed to initialize repository", zap.Error(err))
}
proxy.CleanupRules(logger.Named("proxy.cleanup"))
networkLogger := logger.Named("network")
netNsPath, closer, err := container.SetupNetworkNamespace(rootCtx, networkLogger)
if err != nil {
logger.Panic("failed to setup network namespace", zap.Error(err))
}
defer closer(networkLogger)
proxyLogger := logger.Named("proxy")
prox, err := proxy.CreateProxy(rootCtx, proxyLogger, *proxyNetwork, netNsPath)
if err != nil {
logger.Panic("failed to create proxy", zap.Error(err))
}
defer prox.Stop(proxyLogger)
tick, err := ticker.NewTicker(rootCtx, logger.Named("ticker"), *tickerAddr, *roundDura)
if err != nil {
logger.Panic("failed to start ticker", zap.Error(err))
}
defer tick.Stop()
containerLogger := logger.Named("container")
engine, err := container.StartEngine(rootCtx, containerLogger, *logPath+"/container", netNsPath, r.SubscribeConfig(), r.SubscribeExploits(), r.SubscribeDefaultImage())
if err != nil {
logger.Panic("failed to start container engine", zap.Error(err))
}
defer engine.Stop(containerLogger)
preprocessLogger := logger.Named("preprocess")
preprocessor := preprocess.RunPreprocess(
rootCtx,
preprocessLogger,
*logPath+"/preprocess",
r.SubscribeServices(),
r.SubscribeTeams(),
r.SubscribePreprocess(),
tick.SubscribeTicker(),
)
defer preprocessor.Close()
throwerLogger := logger.Named("thrower")
throw, err := thrower.NewThrower(
rootCtx,
throwerLogger,
*logPath+"/thrower",
prox,
r.SubscribeConfig(),
preprocessor.Subscribe(),
r.SubscribeExploits(),
engine.SubscribeExecutor(),
r.SubscribeFlagSubmitter(),
tick,
)
if err != nil {
logger.Panic("failed to start thrower", zap.Error(err))
}
defer throw.Close()
if err := r.Run(rootCtx, repoLogger); err != nil {
logger.Panic("repository run exit", zap.Error(err))
}
}