【安全开发】内网扫描器

文章目录

  • 前言
    • `现实现的功能较少后序开发会逐步加入简单漏洞探探测和代理功能。`
  • 一、开发过程
    • 1.项目结构
    • 2.main.go
    • 3.core模块
      • 3.1 scanner.go
      • 3.2 service.go
    • 4.bruteforc
      • 4.1 bruteforce.go
  • 二、使用步骤


前言

为什么要写这个?

  1. fscna被杀的概率太高(哪天二开一下免杀)。
  2. go还在学习的阶段正是写项目的时候,边写边学习go项目。
  3. 自己写的项目改起来更加方便。
  4. 实现功能暂时定为网段扫描和暴力破解和输出文档。

现实现的功能较少后序开发会逐步加入简单漏洞探探测和代理功能。

一、开发过程

项目已经打包上传至github:https://github.com/19xinan/Scanl

1.项目结构

项目结构非常简单,现在开发的基本功能包括主机存活探测、端口扫描、暴力破解功能其他功能后序开发。

scanl/
|-- main.go //程序入口,主函数包括命令格式和网段格式限制
|-- core/
|   |-- scanner.go// 扫描器,包括线程控制
|   |-- services.go//服务识别
|-- bruteforce/
|   |-- bruteforce.go//暴力破解模版
|-- pass.txt//暴力破解使用的密码文件

2.main.go

1.实现网段限制
2.实现网段存活探测
3.实现命令行参数限制
4.实现输出扫描结果文档

package mainimport ("flag""fmt""net""os""sync""time""scanl/bruteforce""scanl/core"
)func main() {fmt.Println(`██████  ▄████▄   ▄▄▄       ███▄    █  ██▓    
▒██    ▒ ▒██▀ ▀█  ▒████▄     ██ ▀█   █ ▓██▒    
░ ▓██▄   ▒▓█    ▄ ▒██  ▀█▄  ▓██  ▀█ ██▒▒██░    ▒   ██▒▒▓▓▄ ▄██▒░██▄▄▄▄██ ▓██▒  ▐▌██▒▒██░    
▒██████▒▒▒ ▓███▀ ░ ▓█   ▓██▒▒██░   ▓██░░██████▒
▒ ▒▓▒ ▒ ░░ ░▒ ▒  ░ ▒▒   ▓▒█░░ ▒░   ▒ ▒ ░ ▒░▓  ░
░ ░▒  ░ ░  ░  ▒     ▒   ▒▒ ░░ ░░   ░ ▒░░ ░ ▒  ░
░  ░  ░  ░          ░   ▒      ░   ░ ░   ░ ░   ░  ░ ░            ░  ░         ░     ░  ░░`)// 解析命令行参数:-h网段、-all全端口、-t线程数、-pwd指定密码文件、-output指定输出文件名(不指定默认输出)subnet := flag.String("h", "", "Target subnet for scanning (e.g., 192.168.10.0/24)")allPorts := flag.Bool("all", false, "Scan all ports (0-65535)")threads := flag.Int("t", 100, "Number of concurrent threads")passwordFile := flag.String("pwd", "pass.txt", "Password file for bruteforce")outputFile := flag.String("output", "scan_results.txt", "Output file for scan results")flag.Parse()//检查网段if *subnet == "" {fmt.Println("Usage: ScanL.exe -h <target_subnet> [-all] [-t N] [-pwd pass.txt] [-output scan_results.txt]")os.Exit(1)}// 打开输出文件outputFileHandle, err := os.OpenFile(*outputFile, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)if err != nil {fmt.Printf("Error opening output file: %v\n", err)os.Exit(1)}defer outputFileHandle.Close()// 解析网段ips, err := expandCIDR(*subnet)if err != nil {fmt.Fprintf(outputFileHandle, "Error parsing subnet: %v\n", err)os.Exit(1)}var wg sync.WaitGroupvar mutex sync.Mutexvar aliveHosts []string// 检测存活主机并输出到终端和文件for _, ip := range ips {wg.Add(1)go func(ip string) {defer wg.Done()if isHostAlive(ip) {mutex.Lock()aliveHosts = append(aliveHosts, ip)mutex.Unlock()fmt.Printf("Host %s is alive\n", ip)fmt.Fprintf(outputFileHandle, "Host %s is alive\n", ip)} else {fmt.Printf("Host %s is not alive\n", ip)fmt.Fprintf(outputFileHandle, "Host %s is not alive\n", ip)}}(ip)}wg.Wait()// 输出存活主机到文件fmt.Fprintln(outputFileHandle, "Alive hosts in subnet:")for _, ip := range aliveHosts {fmt.Fprintln(outputFileHandle, ip)}var ports []intif *allPorts {ports = make([]int, 65536)for i := 0; i <= 65535; i++ {ports[i] = i}} else {ports = []int{21, 22, 23, 25, 53, 80, 110, 119, 123, 143, 161, 194, 443, 445, 465, 587, 993, 995, 1433, 1521, 1723, 3306, 3389, 5900, 8080, 8443, 8888, 9090, 7001, 9999, 6379, 9200, 9300, 27017} // 精简端口列表}// 扫描主机并输出结果到终端和文件for _, ip := range aliveHosts {fmt.Fprintf(outputFileHandle, "Scanning host: %s\n", ip)fmt.Printf("Scanning host: %s\n", ip)results := core.ScanPorts(ip, ports, *threads)fmt.Fprintf(outputFileHandle, "Open ports on host %s:\n", ip)fmt.Printf("Open ports on host %s:\n", ip)for port, service := range results {if service != "Closed" {fmt.Fprintf(outputFileHandle, "Port %d: %s\n", port, service)fmt.Printf("Port %d: %s\n", port, service)}}// 默认启用暴力破解模块,针对开启了SSH或RDP的端口if service, found := results[22]; found && service == "SSH" {fmt.Fprintln(outputFileHandle, "Starting bruteforce attack on SSH...")fmt.Println("Starting bruteforce attack on SSH...")bruteforce.Bruteforce(ip, 22, *passwordFile)}//RDP实现有问题暂存//if service, found := results[3389]; found && service == "RDP" {//	fmt.Fprintln(outputFileHandle, "Starting bruteforce attack on RDP...")//	fmt.Println("Starting bruteforce attack on RDP...")//	bruteforce.Bruteforce(ip, 3389, *passwordFile)//}fmt.Fprintln(outputFileHandle, "---------------------------------------------")fmt.Println("---------------------------------------------")}fmt.Printf("Scan results saved to %s\n", *outputFile)
}// expandCIDR 解析网段,生成所有 IP 地址
func expandCIDR(cidr string) ([]string, error) {ip, ipNet, err := net.ParseCIDR(cidr)if err != nil {return nil, err}var ips []stringfor ip := ip.Mask(ipNet.Mask); ipNet.Contains(ip); inc(ip) {ips = append(ips, ip.String())}// 排除网络地址和广播地址lenIPs := len(ips)switch {case lenIPs < 2:breakcase lenIPs > 2:ips = ips[1 : len(ips)-1]}return ips, nil
}// IP地址递增
func inc(ip net.IP) {for j := len(ip) - 1; j >= 0; j-- {ip[j]++if ip[j] > 0 {break}}
}// isHostAlive 检测主机是否存活
func isHostAlive(ip string) bool {timeout := 2 * time.Secondconn, err := net.DialTimeout("ip4:icmp", ip, timeout)if err != nil {return false}defer conn.Close()return true
}

3.core模块

3.1 scanner.go

package coreimport ("fmt""net""sync""time"
)// ScanPorts 扫描指定主机的指定端口,使用指定数量的并发线程
func ScanPorts(host string, ports []int, threads int) map[int]string {results := make(map[int]string)var mu sync.Mutexvar wg sync.WaitGroupportChan := make(chan int, len(ports))// 启动指定数量的goroutinesfor i := 0; i < threads; i++ {wg.Add(1)go func() {defer wg.Done()for port := range portChan {service := scanPort(host, port)mu.Lock()results[port] = servicemu.Unlock()}}()}// 将所有端口放入通道for _, port := range ports {portChan <- port}close(portChan)wg.Wait()return results
}// scanPort 扫描单个端口
func scanPort(host string, port int) string {address := fmt.Sprintf("%s:%d", host, port)conn, err := net.DialTimeout("tcp", address, 1*time.Second)if err != nil {return "Closed"}defer func(conn net.Conn) {err := conn.Close()if err != nil {}}(conn)return identifyService(port)
}

3.2 service.go

package core// identifyService 根据端口号识别服务
func identifyService(port int) string {services := map[int]string{21:    "FTP",22:    "SSH",23:    "Telnet",25:    "SMTP",53:    "DNS",80:    "HTTP",110:   "POP3",119:   "NNTP",123:   "NTP",143:   "IMAP",161:   "SNMP",194:   "IRC",443:   "HTTPS",445:   "SMB",465:   "SMTPS",587:   "Submission",993:   "IMAPS",995:   "POP3S",1433:  "MSSQL",1521:  "Oracle DB",1723:  "PPTP",3306:  "MySQL",3389:  "RDP",5900:  "VNC",8080:  "HTTP-Proxy",8443:  "HTTPS-Alt",8888:  "HTTP-Alt",9090:  "Weblogic",7001:  "Weblogic-Alt",9999:  "HTTP-Alt2",6379:  "Redis",9200:  "Elasticsearch",9300:  "Elasticsearch-Transport",27017: "MongoDB",}if service, found := services[port]; found {return service}return "Unknown"
}

4.bruteforc

这里少了rdp的爆破

4.1 bruteforce.go

package bruteforceimport ("bufio""fmt""os""sync""time""golang.org/x/crypto/ssh"
)// 默认账号列表
var defaultAccounts = []string{"root", "admin", "administrator"}// Bruteforce 执行暴力破解攻击
func Bruteforce(host string, port int, passwordFile string) {passwords, err := readPasswords(passwordFile)if err != nil {fmt.Printf("Error reading password file: %v\n", err)return}var wg sync.WaitGroupwg.Add(len(defaultAccounts) * len(passwords))// 并发尝试不同的账号和密码组合for _, account := range defaultAccounts {for _, password := range passwords {go func(host string, port int, account string, password string) {defer wg.Done()fmt.Printf("Trying account: %s, password: %s\n", account, password)if sshLogin(host, port, account, password) {fmt.Printf("SSH login successful: %s:%s@%s\n", account, password, host)}}(host, port, account, password)}}wg.Wait()
}// readPasswords 读取密码文件
func readPasswords(filePath string) ([]string, error) {file, err := os.Open(filePath)if err != nil {return nil, err}defer func(file *os.File) {err := file.Close()if err != nil {}}(file)var passwords []stringscanner := bufio.NewScanner(file)for scanner.Scan() {passwords = append(passwords, scanner.Text())}if err := scanner.Err(); err != nil {return nil, err}return passwords, nil
}// sshLogin 尝试使用SSH登录
func sshLogin(host string, port int, username, password string) bool {config := &ssh.ClientConfig{User: username,Auth: []ssh.AuthMethod{ssh.Password(password),},HostKeyCallback: ssh.InsecureIgnoreHostKey(),Timeout:         5 * time.Second,}conn, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", host, port), config)if err != nil {return false}defer func(conn *ssh.Client) {err := conn.Close()if err != nil {}}(conn)return true
}

二、使用步骤

ScanL.exe -h 192.168.10.1/24
其他参数
ScanL.exe -h <target_subnet> [-all] [-t N] [-pwd pass.txt] [-output scan_results.txt]

请添加图片描述

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

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

相关文章

十步学习法,赋能程序员

大家好&#xff0c;我是码农先森。 引言 最近看了《软技能&#xff1a;代码之外的生存指南》这本书&#xff0c;对其中的 “十步学习法”。 有一些感触&#xff0c;所以将其中的内容记录并总结了下来&#xff0c;分享给大家。 程序员在学习成长的过程中&#xff0c;除了关注…

【深度学习】单机多卡 | DataParallel将计算任务在多个 GPU 上并行执行,可以在多个 GPU 上分摊工作负载,从而加快训练速度

【深度学习】单机多卡 | DataParallel将计算任务在多个 GPU 上并行执行&#xff0c;可以在多个 GPU 上分摊工作负载&#xff0c;从而加快训练速度 写在最前面DataParallel (DP) 简介使用 DataParallel 的场景使用 DataParallel 的基本步骤 代码部分train.py简单的代码示例代码解…

可用的微信小程序抓包方式(Charles + bp)

扫码领资料 获网安教程 前言 接到对公司小程序进行渗透的任务&#xff0c;尝试了网上几种对小程序抓包的方式&#xff08;BurpProxifier、Burp安卓模拟器等&#xff09;都无法完成抓包&#xff0c;可能已经失效&#xff0c;结合不同的文章尝试了bpCharles&#xff0c;成功抓包…

diffusion model(十八):diffusion model中negative prompt的工作机制

info个人博客主页http://myhz0606.com/article/ncsn 前置阅读&#xff1a; DDPM&#xff1a; http://myhz0606.com/article/ddpm classifier-guided&#xff1a;http://myhz0606.com/article/guided classifier-free guided&#xff1a;http://myhz0606.com/article/classi…

如何评估CRM客户系统的功能是否满足助贷机构的需求?

评估 CRM 客户系统的功能是否满足助贷机构的需求&#xff0c;可以从以下几个方面入手&#xff1a; 1. 客户信息管理 - 检查系统能否全面、准确地记录客户的基本信息&#xff0c;如个人身份、财务状况、贷款需求等。 - 确认是否支持多维度的客户分类和标签功能&#xff0c;以…

Python:探索高效、智能的指纹识别技术(简单易懂)

目录 概括 导入库 函数一 参数&#xff1a; 函数二 函数三 主函数 运行结果 src&#xff1a; model_base 7.bmp ​编辑 总结 概括 指纹识别是一种基于人体生物特征的身份验证技术。它通过捕捉和分析手指上的独特纹路和细节特征&#xff0c;实现高准确度的身份识别。…

【工具测评】ONLYOFFICE8.1版本桌面编辑器测评:好用!

随着远程工作的普及和数字化办公的发展&#xff0c;越来越多的人开始寻找功能强大、易于使用的办公软件。在这个背景下&#xff0c;ONLYOFFICE 8.1应运而生&#xff0c;成为许多用户的新选择。ONLYOFFICE 8.1是一款办公套件软件&#xff0c;提供文档处理、电子表格和幻灯片制作…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-41目标检测数据集

41目标检测数据集 import os import pandas as pd import torch import torchvision import matplotlib.pylab as plt from d2l import torch as d2l# 数据集下载链接 # http://d2l-data.s3-accelerate.amazonaws.com/banana-detection.zip# 读取数据集 #save def read_data_b…

右键新建没有TXT文本文档的解决办法

电脑右键新建&#xff0c;发现没有txt了&#xff0c;我查网上办法都有点复杂&#xff0c;诸如注册表的&#xff0c;但是其实很简单&#xff0c;重启windows资源管理器就可以了。 点击重新启动&#xff0c;之后新建就有txt文档了。

C++20中的Feature Test Mocros

C20定义了一组预处理器宏&#xff0c;用于测试各种语言和库的feature。 Feature Test Mocros(特性测试宏)是C20中引入的一种强大机制&#xff0c;用于应对兼容性问题。Feature Test Mocros作为预处理器指令(preprocessor directives)出现&#xff0c;它使你能够在编译过程中仔细…

流水线作业模拟程序

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 流水线作业模拟 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private int Count 0;private bool IsStop false;private void uiLight1_Click(object sender, EventArgs e…

[MYSQL] MYSQL库的操作

前言 本文主要介绍MYSQL里 库 的操作 请注意 : 在MYSQL中,命令行是不区分大小写的 1.创建库 create database [if not exists] database_name [charsetutf8 collateutf8_general_ci] ...] create database 是命名语法,不可省略[if not exists] 如果不存在创建,如果存在跳过…

最新Node.js安装及配置详细教程

文章目录 下载Node.js安装Node.js配置Node.js1、修改npm包的全局安装路径和缓存路径2、环境变量设置3、镜像源配置4、安装其他包管理工具 下载Node.js 下载&#xff1a;https://nodejs.org/en/download/prebuilt-installer&#xff0c;下载LTS版本的&#xff0c;LTS(Long Time…

基于多模态知识图谱的多模态推理-MR-MKG

MR-MKG论文中提出了一种新的多模态推理方法&#xff0c;即利用多模态知识图&#xff08;Multimodal Knowledge Graph, MMKG&#xff09;进行多模态推理的方法。这种方法旨在通过从MMKG中学习&#xff0c;扩展大型语言模型&#xff08;LLMs&#xff09;的多模态知识。 1 三个模…

面对.rmallox勒索病毒:如何有效防范及应对

引言&#xff1a; 在当今数字化社会&#xff0c;网络安全问题日益严重&#xff0c;勒索病毒成为企业和个人不可忽视的威胁之一。最近出现的.rmallox勒索病毒更是给全球各地的用户带来了严重的数据安全问题。本文将探讨.rmallox勒索病毒的特点、感染方式及应对策略&#xff0c;…

探索CSS布局:创建一个居中的内嵌方块示例

在网页设计中&#xff0c;布局是至关重要的部分。CSS提供了多种方式来实现元素的布局&#xff0c;包括居中对齐、外边距、内边距等。本文将通过一个简单的示例&#xff0c;介绍如何使用CSS来创建一个居中的内嵌方块&#xff0c;并探讨其背后的布局原理。 HTML 结构 首先&…

java服务MultipartFile入参测试

项目中经常会涉及到文件的上传下载以及导入相关的功能&#xff0c;今天针对MultipartFile类型文档导入写一下如何测试。 文档导入接口完成&#xff0c;使用postman测试&#xff0c;使用POST方法&#xff0c;进入Body模块&#xff0c;选择form-data选项&#xff0c;key的框体右侧…

微服务部署上线过程总结

目录 一、找到适合自己的部署方式 二、开始部署&#xff0c;先安装需要的环境 2.1 梳理一下都需要安装什么软件 2.2 配置数据库环境 2.3 配置redis 2.4 配置nacos 2.5 配置rabbitmq 2.6 配置docker环境 三、环境配置好了&#xff0c;开始部署后端 3.1 梳理后端都…

韩顺平0基础学java——第32天

p638-652 Properties类 list&#xff1a;这个设备可以是一个流对象。 修改&#xff1a;如果该文件里没有Key&#xff0c;那即是创建&#xff0c;如果是有那就是修改。 继续坦克大战 防止敌人坦克重叠 满脑子都是今汐&#xff0c;亚达哟&#x1f62d;&#x1f62d;&#x1f6…

2, 搭建springCloud 项目 测试demo

上篇文章 新建了父依赖服务&#xff0c;这篇文章就建两个demo测试服务。 因为后面需要做服务间的通讯测试&#xff0c;所以至少需要建两个服务 建个子模块 同样的方式建连个demo服务 给java 和resources目录添加属性 在resources目录下建一个applications.yml文件&#xff0c;…