弱口令扫描器

0x00 弱口令扫描器插件的实现

弱口令扫描器的代码结构
● cmd包为命令行入口的实现。
● logger包为log模块的实现。
● models包为扫描器数据结构的实现。
● plugins包为扫描插件包。
● util包为工具函数的实现,如读取文件、扫描任务调度等。
● vars包定义了项目中用到的全局变量。

0x01 简单的实现

弱口令扫描器的原理是使用服务的客户端与服务器建立连接后, 用常见的弱口令字典中的用户名和密码不断地尝试登录,如果能登录 成功,说明存在弱口令

package main

import (
	"golang.org/x/crypto/ssh"

	"fmt"
	"net"
	"time"
)

func ScanSsh(ip string, port int, timeout time.Duration, service, username, password string) (result bool, err error) {
	config := &ssh.ClientConfig{
		User: username,
		Auth: []ssh.AuthMethod{
			ssh.Password(password),
		},
		Timeout: timeout,
		HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
			return nil
		},
	}

	client, err := ssh.Dial("tcp", fmt.Sprintf("%v:%v", ip, port), config)
	if err == nil {
		defer client.Close()
		session, err := client.NewSession()
		errRet := session.Run("echo xsec")
		if err == nil && errRet == nil {
			defer session.Close()
			result = true
		}
	}

	return result, err
}

func main() {
	ip := "127.0.0.1"
	port := 22
	timeout := 3 * time.Second
	service := "ssh"
	username := "root"
	password := "123456"
	result, err := ScanSsh(ip, port, timeout, service, username, password)
	fmt.Printf("check %v service, %v:%v, result: %v, err: %v\n", service, ip, port, result, err)
}

type ClientConfig

type ClientConfig struct {
	//配置包含客户端和服务器之间共享的配置。
	Config

	//User包含要进行身份验证的用户名。
	User string

	// Auth包含与服务器一起使用的可能的身份验证方法。在身份验证过程中只使用特定RFC 
    //4252方法的第一个实例。
	Auth []AuthMethod

	// 在加密握手期间调用HostKeyCallback,以验证服务器的主机密钥。客户端配置必须提 
    //供此回调,以便连接成功。函数InsecureIgnoreHostKey或FixedHostKey可用于简单的 
    //主机密钥检查
	HostKeyCallback HostKeyCallback

	// 在SSH跳转期间调用BannerCallback以显示自定义服务器的消息。客户端配置可以提供 
    //这个回调来按需要处理它。函数BannerDisplayStderr可用于Stde上的简单显示
	BannerCallback BannerCallback

	// ClientVersion包含将用于连接的版本标识字符串。如果为空,则使用合理的默认值。
	ClientVersion string

	// HostKeyAlgorithms列出了客户端将从服务器接受的用于主机密钥身份验证的公钥算 
    //法,按优先级排序。如果为空,则使用合理的默认值。从PublicKey返回的任何字符 
    //串。可以使用类型方法,也可以使用任何CertAlgo和KeyAlgo常量。
	HostKeyAlgorithms []string

	// Timeout是TCP连接建立的最大时间。
    // Timeout为零表示没有超时。
	Timeout time.Duration
}

运行结果:

go run main.go
check ssh service, 127.0.0.1:22, result: false, err: dial tcp 127.0.0.1:22: connectex: No connection could be made because the target machine actively refused it
posted @ 2023-04-13 11:17  MeetA  阅读(212)  评论(0)    收藏  举报