diff --git a/cmd/crack/crack.go b/cmd/crack/crack.go index 793ba87..c5a576e 100644 --- a/cmd/crack/crack.go +++ b/cmd/crack/crack.go @@ -3,7 +3,6 @@ package main import ( "github.com/niudaii/crack/internal/runner" "github.com/projectdiscovery/gologger" - "time" ) func main() { @@ -12,8 +11,5 @@ func main() { if err != nil { gologger.Fatal().Msgf("Could not create runner: %v", err) } - start := time.Now() - gologger.Info().Msgf("当前时间: %v", start.Format("2006-01-02 15:04:05")) newRunner.Run() - gologger.Info().Msgf("运行时间: %v", time.Since(start)) } diff --git a/internal/runner/runner.go b/internal/runner/runner.go index 065c7aa..f921e68 100644 --- a/internal/runner/runner.go +++ b/internal/runner/runner.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/niudaii/crack/pkg/crack" "github.com/projectdiscovery/gologger" + "time" ) type Runner struct { @@ -12,27 +13,38 @@ type Runner struct { } func NewRunner(options *Options) (*Runner, error) { - crackRunner, err := crack.NewRunner(options.Threads, options.Timeout, options.Delay, options.CrackAll, options.Silent) + crackOptions := &crack.Options{ + Threads: options.Threads, + Timeout: options.Timeout, + Delay: options.Delay, + CrackAll: options.CrackAll, + Silent: options.Silent, + } + crackRunner, err := crack.NewRunner(crackOptions) if err != nil { - return nil, fmt.Errorf("NewRunner err, %v", err) + return nil, fmt.Errorf("crack.NewRunner() err, %v", err) } - runner := &Runner{ + return &Runner{ options: options, crackRunner: crackRunner, - } - return runner, nil + }, nil } func (r *Runner) Run() { + start := time.Now() + gologger.Info().Msgf("当前时间: %v", start.Format("2006-01-02 15:04:05")) + // 解析目标 addrs := crack.ParseTargets(r.options.Targets) addrs = crack.FilterModule(addrs, r.options.Module) if len(addrs) == 0 { gologger.Info().Msgf("目标为空") return } + // 存活探测 gologger.Info().Msgf("存活探测") addrs = r.crackRunner.CheckAlive(addrs) gologger.Info().Msgf("存活数量: %v", len(addrs)) + // 服务爆破 results := r.crackRunner.Run(addrs, r.options.UserDict, r.options.PassDict) if len(results) > 0 { gologger.Info().Msgf("爆破成功: %v", len(results)) @@ -40,4 +52,6 @@ func (r *Runner) Run() { gologger.Print().Msgf("%v -> %v %v", result.Protocol, result.Addr, result.UserPass) } } + // 运行时间 + gologger.Info().Msgf("运行时间: %v", time.Since(start)) } diff --git a/pkg/crack/check.go b/pkg/crack/check.go index 9e9e17e..261b49e 100644 --- a/pkg/crack/check.go +++ b/pkg/crack/check.go @@ -9,15 +9,15 @@ import ( ) // CheckAlive 存活检测 -func (e *Runner) CheckAlive(addrs []*IpAddr) (results []*IpAddr) { +func (r *Runner) CheckAlive(addrs []*IpAddr) (results []*IpAddr) { // RunTask mutex := &sync.Mutex{} wg := &sync.WaitGroup{} - taskChan := make(chan *IpAddr, e.threads*2) - for i := 0; i < e.threads; i++ { + taskChan := make(chan *IpAddr, r.options.Threads) + for i := 0; i < r.options.Threads; i++ { go func() { for task := range taskChan { - if e.conn(task) { + if r.conn(task) { mutex.Lock() results = append(results, task) mutex.Unlock() @@ -27,11 +27,13 @@ func (e *Runner) CheckAlive(addrs []*IpAddr) (results []*IpAddr) { }() } - if e.silent { + if r.options.Silent { for _, task := range addrs { wg.Add(1) taskChan <- task } + close(taskChan) + wg.Wait() } else { bar := pb.StartNew(len(addrs)) for _, task := range addrs { @@ -40,16 +42,16 @@ func (e *Runner) CheckAlive(addrs []*IpAddr) (results []*IpAddr) { taskChan <- task } close(taskChan) + wg.Wait() + bar.Finish() } - close(taskChan) - wg.Wait() return } // conn 建立tcp连接 -func (e *Runner) conn(ipAddr *IpAddr) (alive bool) { - _, err := net.DialTimeout("tcp", fmt.Sprintf("%v:%v", ipAddr.Ip, ipAddr.Port), time.Duration(e.timeout)*time.Second) +func (r *Runner) conn(ipAddr *IpAddr) (alive bool) { + _, err := net.DialTimeout("tcp", fmt.Sprintf("%v:%v", ipAddr.Ip, ipAddr.Port), time.Duration(r.options.Timeout)*time.Second) if err == nil { alive = true } diff --git a/pkg/crack/config.go b/pkg/crack/config.go index 6951e22..3bd2735 100644 --- a/pkg/crack/config.go +++ b/pkg/crack/config.go @@ -52,7 +52,7 @@ var ( "mongodb": {"admin", "root"}, } - TemplatePass = []string{"{user}", "{user}!@#123", "{user}!@#456", "{user}#123", "{user}*PWD", "{user}1", "{user}11", "{user}12#$", "{user}123", "{user}123456", "{user}@111", "{user}@123", "{user}@123#4", "{user}@2016", "{user}@2017", "{user}@2018", "{user}@2019", "{user}@2020", "{user}@2021", "{user}_123"} + TemplatePass = []string{"{user}", "{user}!@#123", "{user}!@#456", "{user}#123", "{user}*PWD", "{user}1", "{user}11", "{user}12#$", "{user}123", "{user}123456", "{user}@111", "{user}@123", "{user}@123#4", "{user}@2016", "{user}@2017", "{user}@2018", "{user}@2019", "{user}@2020", "{user}@2021", "{user}@2022", "{user}_123"} CommonPass = []string{"", "!QAZ2wsx", "000000", "1", "111111", "123", "123123", "12313", "123321", "1234", "12345!@#$%abc", "123456", "12345678", "123456789", "1234567890", "12345678;abc", "123456Aa", "123qwe!@#", "123qweASD", "1q2w3e", "1qaz2wsx", "1QAZ2wsx", "1qaz@WSX", "1QAZ@WSX", "1qazxsw2", "654321", "666666", "8888888", "a11111", "a123123", "a12345", "a123456", "a123456", "a123456.", "Aa123123", "Aa1234", "Aa1234.", "Aa12345", "Aa12345.", "Aa123456", "Aa123456!", "Aa123456789", "abc+123", "abc123", "abc123456", "abc@123", "admin", "admin123", "Admin123", "admin123!@#", "admin888", "admin@123", "Admin@123", "Admin@1234", "admin@888", "adminadmin", "adminPwd", "Asdfg@123", "Charge123", "P@ssw0rd", "P@ssw0rd!", "P@ssword", "p@ssword", "pass123", "pass@123", "Passw0rd", "password", "qwe123", "qwe123!@#", "root", "sysadmin", "system", "test", "test123", "xcv@123", "zxc1qaz", "Zxcvb123"} ) diff --git a/pkg/crack/runner.go b/pkg/crack/runner.go index fe321cf..8268cc3 100644 --- a/pkg/crack/runner.go +++ b/pkg/crack/runner.go @@ -11,21 +11,21 @@ import ( "time" ) +type Options struct { + Threads int + Timeout int + Delay int + CrackAll bool + Silent bool +} + type Runner struct { - threads int - timeout int - delay int - crackAll bool - silent bool + options *Options } -func NewRunner(threads, timeout, delay int, crackAll, silent bool) (*Runner, error) { +func NewRunner(options *Options) (*Runner, error) { return &Runner{ - threads: threads, - timeout: timeout, - delay: delay, - crackAll: crackAll, - silent: silent, + options: options, }, nil } @@ -78,7 +78,7 @@ func (r *Runner) Crack(addr *IpAddr, userDict []string, passDict []string) (resu Protocol: addr.Protocol, User: user, Pass: pass, - Timeout: r.timeout, + Timeout: r.options.Timeout, }) } } @@ -86,8 +86,8 @@ func (r *Runner) Crack(addr *IpAddr, userDict []string, passDict []string) (resu stopHashMap := map[string]bool{} mutex := &sync.Mutex{} wg := &sync.WaitGroup{} - taskChan := make(chan plugins.Service, r.threads) - for i := 0; i < r.threads; i++ { + taskChan := make(chan plugins.Service, r.options.Threads) + for i := 0; i < r.options.Threads; i++ { go func() { for task := range taskChan { addrStr := fmt.Sprintf("%v:%v", addr.Ip, addr.Port) @@ -106,7 +106,7 @@ func (r *Runner) Crack(addr *IpAddr, userDict []string, passDict []string) (resu resp := scanFunc(&task) switch resp { case plugins.CrackSuccess: - if !r.crackAll { + if !r.options.CrackAll { mutex.Lock() stopHashMap[addrHash] = true mutex.Unlock() @@ -123,19 +123,21 @@ func (r *Runner) Crack(addr *IpAddr, userDict []string, passDict []string) (resu mutex.Unlock() case plugins.CrackFail: } - if r.delay > 0 { - time.Sleep(time.Duration(r.delay) * time.Second) + if r.options.Delay > 0 { + time.Sleep(time.Duration(r.options.Delay) * time.Second) } wg.Done() } }() } - if r.silent { + if r.options.Silent { for _, task := range tasks { wg.Add(1) taskChan <- task } + close(taskChan) + wg.Wait() } else { bar := pb.StartNew(len(tasks)) for _, task := range tasks { @@ -143,10 +145,10 @@ func (r *Runner) Crack(addr *IpAddr, userDict []string, passDict []string) (resu wg.Add(1) taskChan <- task } + close(taskChan) + wg.Wait() bar.Finish() } - close(taskChan) - wg.Wait() gologger.Info().Msgf("爆破结束") diff --git a/pkg/crack/runner_test.go b/pkg/crack/runner_test.go index 81deb9e..538c7e5 100644 --- a/pkg/crack/runner_test.go +++ b/pkg/crack/runner_test.go @@ -24,14 +24,18 @@ func TestCrackAll(t *testing.T) { */ tests := map[string]*Runner{ "false": { - threads: 2, - timeout: 10, - crackAll: false, + options: &Options{ + Threads: 1, + Timeout: 10, + CrackAll: false, + }, }, "true": { - threads: 2, - timeout: 10, - crackAll: true, + options: &Options{ + Threads: 1, + Timeout: 10, + CrackAll: true, + }, }, } addrs := []*IpAddr{