Say0l的安全开发-弱口令扫描工具-My-crack【红队工具】

news2025/1/22 15:42:05

写在前面

终于终于,安全开发也练习一年半了,有时间完善一下项目,写写中间踩过的坑。

安全开发的系列全部都会上传至github,欢迎使用和star

工具链接地址

https://github.com/SAY0l/my-crack

预览

在这里插入图片描述

My-Crack 工具介绍

更适合中国宝宝的弱口令扫描器

Help

NAME:
   My-Crack - Weak password crack

USAGE:
   main.exe [global options] command [command options] [arguments...]

VERSION:
   1.1

AUTHOR:
   sayol <github@sayol.com>

COMMANDS:
   scan     let's crack weak password
   help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --debug, -d                    debug mode
   --timeout value, -t value      timeout (default: 3)
   --scan_num value, -n value     thread num (default: 5000)
   --ip_list value, -i value      ip_list (default: "./input/ip_list.txt")
   --user_dict value, -u value    user_dict (default: "./input/user.dic")
   --pass_dict value, -p value    pass_dict (default: "./input/pass.dic")
   --output_file value, -o value  scan result file (default: "./output/my_crack.txt")
   --help, -h                     show help
   --version, -v                  print the version

Use

当前核心支持ftp/mongodb/mysql/mssql/postgre/redis/ssh的弱口令扫描

提供了编译后的版本。

后续版本开放代码

Other

思路借鉴于赵海峰老师的《白帽子安全开发实战》

顺带回答赵海峰老师的小问题:

1. 扫到一个弱口令后,如何取消相同IP\port和用户名请求,避免扫描效率低下
2. 对于FTP匿名访问,如何只记录一个密码,而不是把所有用户名都记录下来
3. 对于Redis这种没有用户名的服务,如何只记录一次密码,而不是记录所有的所有用户及正常的密码的组合
4. 对于不支持设置超时的扫描插件,如何统一设置超时时间
  1. 利用hash来完成的。在redis,ftp这种可以仅记录密码的就以(ip-port-protocol)进行hash,其他带用户名的以(ip-port-username)进行hash,查hash来作为规避条件,一旦结果集的hash已经存在和当前扫描产生的hash值相同,就continue。

  2. 基于上述原理,就可以实现redis、ftp 只记录一个密码,不会把所有用户名都记录下来,因为是用ip-port-protocol 进行hash。

  3. 设计了一个WaitTimeout函数。

c:= make(chan struct{})
	go func(){
		defer close(c)
		wg.Wait()
	}()
	select{
	case <-c:
		return false //c仅仅作为一个flag,没有实际作用
	case <-time.After(timeout):
		return true
	}

使用一个管道作为flagtime.After(timeout)也返回一个管道。一旦c关闭,就会触发select第一个case,返回false,表示正常关闭,wg.Wait正常完成。一旦超时时间到达,会触发select第二个case,就会返回true,表示已经超时。

Ver 1.1 优化点

  1. 连接核心中,更替了一些不能用的版本、第三方库,使用了维护性高,连接稳定的版本库。

例如mongodb的连接核心:

“go.mongodb.org/mongo-driver/mongo”

“go.mongodb.org/mongo-driver/mongo/options”

抛弃了之前的个人维护库。

  1. 修复了一些问题
ipListFile, err := os.Open(fileName)
	if err != nil {
		logger.Log.Fatalf("Open ip list file err, %v", err)
	}

	defer ipListFile.Close()

减少大量代码冗余。上述代码为例,发生错误会直接终止,defer不会入栈,无需再做defer前的判断。
  1. 错误处理修复

之前版本大量复用err,会出现err覆盖问题,有必要的err取消覆盖写法。

Ver 1.2 待优化点

代码上线

并发算法需要优化

更多服务的支持 smb,elastic …

踩坑

初始化结构体什么时候用指针,什么时候传呢?

在Go语言中,当我们初始化一个结构体时,通常会使用取地址运算符&来创建一个指向该结构体的指针,然后将该指针赋值给一个变量。

这样做的主要原因有以下几点:

1.结构体是值类型:在Go语言中,结构体是值类型,也就是说当我们将一个结构体赋值给另一个结构体时,会进行值的拷贝。如果结构体较大,这将导致内存开销较大。而使用指针可以避免这种情况,因为指针只是保存了结构体的内存地址,赋值时只是复制了一个指针,而不是整个结构体。

2.修改结构体的字段:如果我们希望在函数中修改结构体的字段值,直接传递结构体的值是不会改变原结构体的。但如果传递结构体的指针,就可以通过指针来修改结构体的字段。

3.减少内存拷贝:在函数调用时,如果传递结构体的指针,避免了对整个结构体进行内存拷贝,提高了性能。特别是当结构体较大时,这种优化效果更为明显。

函数出口编写

无论是AI,还是我自己编写的,都是多出口写法,也就是函数弹出err时,检测err是否为nil,一旦出现错误,就弹出函数

从程序设计的角度来说,多出口是很繁琐,也很不严谨的,但是如果设置flag变量来检测,不仅占用内存也很麻烦

学习大佬编写时,提供了一个非常棒的思路,当你的true条件比较重要时,同时需要处理的err不算多,不需要保证每一次的错误精准处理时

使用单个err变量,判断err==nil时的下一步动作,一旦出现错误,直接走整个函数的总出口返回。如果没有错误,继续执行语句,新的err会覆盖旧的err,一旦出错仍然走总出口返回

这样,整个函数就只有一个总出口,重点就会放在err==nil的正确情况下,不需要去繁琐的处理err

但是这样也会产生一个问题,由于err是覆盖机制,一旦有两个语句同时发生错误,你并不能判断第一个语句是否真的发生了错误,它可能是被覆盖了,也可能是没有错误。所以上述写法在需要处理的err较少的情况下比较好用。

defer与return

在常规情况下,defer应该是写在return的前面,保证函数在进行返回之前做出defer中的操作。
但是这并不能保证defer一定能够达到你的逻辑,因为写的不好的函数中,函数会有多个出口,例如

if err!=nil{
    return false
}
defer fmt.Println("i am defer")

这样的错误处理是很常规的,此时如果err没有问题,defer仍然能够正常入栈,可以达到正常的逻辑,但是一旦err发现错误,defer 就不能正常入栈了。

所以defer一定要写在所有可能return的前面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/990967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 毕业设计-基于SpringBoot的在线文档管理系统

基于SpringBoot的在线文档管理系统 博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 技术栈简介 文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;sp…

2020年09月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:铺砖 对于一个2行N列的走道。现在用12,22的砖去铺满。问有多少种不同的方式。 时间限制:3000 内存限制:131072 输入 整个测试有多组数据,请做到文件底结束。每行给出一个数字N,0 <= n <= 250 输出 如题 样例输入 2 8 12 1…

声网agora创建账号

1. 注册声网账号 https://sso2.agora.io/cn/v4/signup/with-sms 2. 创建项目 项目管理 - 创建项目 3. 项目配置 appid: xxxx token: xxxx 4. 开发文档 https://docportal.shengwang.cn/cn/All/code-samples?platformiOS

免费绕过苹果MDM配置锁/密码界面工具-Hackt1vator Unlock

Hackt1vator Unlock Hackt1vator Unlock是一款免费免费绕过苹果MDM配置锁/密码界面工具&#xff0c;帮助那些忘记iCloud账号密码而无法使用的iPhone、iPad的用户绕过 icloud 激活、mdm 和密码锁定&#xff0c;目前工具支持跳过MDM配置锁&#xff0c;支持绕过物主与锁定界面&am…

如何按文件名称自动归类,助您轻松管理文件

在日常工作和生活中&#xff0c;我们经常会遇到大量的文件需要管理。如果这些文件没有得到良好的归类和整理&#xff0c;不仅会浪费我们的时间和精力&#xff0c;还会给我们带来困扰和混乱。今天我们一起来看看怎么按文件名称来自动归类&#xff0c;批量整理文件&#xff0c;让…

postgresql|数据库|数据迁移神器ora2pg的安装部署和初步使用

前言&#xff1a; 有的时候有需求需要迁移Oracle数据库的数据到postgresql&#xff0c;那么&#xff0c;其实可供选择的工具是比较多的&#xff0c;但从迁移效率&#xff0c;准确度这些角度来选择的话&#xff0c;无疑还是GitHub上的开源免费工具ora2pg比较合适的。 ora2pg的…

windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)

我们在刚开始项目开发时&#xff0c;经常会因为各种粗心造成各种各样的容易使项目运行时崩溃的代码&#xff0c;比如&#xff0c;给空指针的指向赋值。然而&#xff0c;当项目的文件数非常多时&#xff0c;想找到出错的代码的位置是费事而让人心烦的。crashpad就可以在项目运行…

【Linux】使用 Alist 实现阿里云盘4K播放

一、安装 Alist 官方文档 默认安装在 /opt/alist 中 curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s install自定义安装路径&#xff0c;将安装路径作为第二个参数添加&#xff0c;必须是绝对路径&#xff0c;如果路径以 alist 结尾&#xff0c;则直接安装到给定…

vite+vue 项目使用 electron

创建 vitevue 项目 npm create viteElectron 官方文档 electron 安装 安装 electron npm install --save-dev electron新建 electron 的入口文件&#xff0c;我这里在根目录新建 electron 文件夹&#xff0c;然后新建main.js和preload.js文件 根据官网说明&#xff0c;将以下…

企业架构LNMP学习笔记21

URL重写&#xff1a; ngx_http_rewrite_module 模块用于使用PCRE正则表达式更改请求URI&#xff0c;返回重定向&#xff0c;以及有条件地选择配置。 return 该指令用于结束结束规则的执行并返回状态码给客户端。 403 Forbidden.服务器已经理解请求,但是拒绝执行它 404 Not…

【动手学深度学习】--序列模型

文章目录 序列模型1.序列数据2.统计工具3.自回归模型3.1马尔科夫假设3.2潜变量模型 4.训练5.预测 序列模型 学习视频&#xff1a;序列模型【动手学深度学习v2】 官方笔记&#xff1a;序列模型 1.序列数据 想象一下有人正在看网飞&#xff08;Netflix&#xff0c;一个国外的视…

基于Docker从零到一实操MySql的主从复制

文章目录 一、在Docker上安装&#xff0c;启动MySQL查看docker是否安装成功安装mysql查看mysql镜像进入mysql后台操作docker Volume&#xff08;卷&#xff09;入门 MySql的主从复制1. 创建MySQL主从复制的网络2. 创建MySQL主服务器3. 创建MySQL从服务器4. 配置主从同步5.测试主…

js函数变量提升理解

var n 10function fn() {// var n 20function f() {// 没用var声明&#xff0c;去外层寻找n,直到找到windows为止&#xff0c;找到的话用的就是哟个全局变量&#xff0c;会改变原始全局变量的值n;console.log(n)}var nn 20f()console.log(n);return f}var x fn()// 会在上一…

【C++从0到王者】第二十八站:二叉搜索树的应用

文章目录 前言一、Key模型二、Key/Value模型总结 前言 二叉搜索树的在现实世界的应用很广泛&#xff0c;比如Key模型&#xff0c;Key-Value模型就是常见的两种的模型 一、Key模型 K模型&#xff1a;K模型即只有key作为关键码&#xff0c;结构中只需要存储Key即可&#xff0c…

PaddleOCR学习笔记2-初步识别服务

今天初步实现了网页&#xff0c;上传图片&#xff0c;识别显示结果到页面的服务。后续再完善。 采用flask paddleocr bootstrap快速搭建OCR识别服务。 代码结构如下&#xff1a; 模板页面代码文件如下&#xff1a; upload.html : <!DOCTYPE html> <html> <…

Activiti7工作流引擎:在线流程编辑器Activiti Modoler5.x

一&#xff1a;简介 有的时候我们的流程图需要业务人员自己绘制&#xff0c;然后使用自己绘制的流程图&#xff0c;此时就需要一个在线流程图编辑器需要集成到我们的web系统中。Activiti Modoler是Activiti官方推出的在线流程编辑器。 二&#xff1a;pom.xml <dependency…

tomcat安装、部署JSPGOU项目、Tomcat多实例

安装 官网找包 Apache Tomcat - Welcome! tomcat 8 准备运行环境 安装tomcat catalina.sh 服务脚本管理文件 server.xml 主配置文件 修改8009&#xff08;删除注释&#xff09; 启动tomcat 访问 为了避免每次进入绝对路径启动tomcat 法二&#xff1a; 三&#xff1a;部署…

SpringMvc增删改查

SpringMvc增删改查 一、前期准备二、逆向生成增删改查2.2.aspect切面层2.3.Mybatis generator逆向生成2.4.根据生成代码编写Biz层与实现类 三、controller层代码编写四、前台代码与分页代码五、案例测试 一、前期准备 1.2.导入pom.xml依赖 <?xml version"1.0" …

搭建自己的OCR服务,第三步:PPOCRLabel标注工具安装

一、安装说明 安装好了PaddleOCR后&#xff0c;还需要安装PPOCRLabel这个标注工具&#xff0c;想要自己训练模型的话&#xff0c;有个标注工具会起很大作用。 尤其是PPOCRLabel就是跟PaddleOCR配套的标注工具&#xff0c;同样是开源的。 在下载 PaddleOCR 整个源码中&#x…

Apache DolphinScheduler - 快速扩展 TaskPlugin 从入门到放弃

目前在大数据生态中&#xff0c;调度系统是不可或缺的一个重要组件。Apache DolphinScheduler 作为一个顶级的 Apache 项目&#xff0c;其稳定性和易用性也可以说是名列前茅的。而对于一个调度系统来说&#xff0c;能够支持的可调度的任务类型同样是一个非常重要的因素&#xf…