
简介SNETCracker是一款面向网络安全初学者与渗透测试实践者的Windows平台弱口令审计工具专为快速识别常见服务中的弱密码账号而设计适用于CTF练习、内网安全评估及红队基础侦察场景。资源包共129个文件以62个C#源码文件含Main.cs、SmartThreadPool.cs等核心逻辑为主体辅以54个依赖DLL、3个本地化资源文件.resx及项目配置文件.sln、.csproj、app.config等完整呈现.NET Framework 4.0环境下多线程爆破框架的工程结构与模块划分压缩包大小为11.47MB。已有1162人学习下载读者可直接编译运行掌握SSH、RDP、MySQL、Redis等20余种服务的弱口令检测实现原理理解端口自扫描、用户名密码组合爆破、字典动态加载等关键机制并基于源码二次开发适配定制化审计需求。1. SNETCracker 是什么一款专为 Windows 环境打磨的弱口令批量爆破实战工具不是扫描器也不是通用爆破框架你手头有一批 IP 段、一批资产清单、一份导出的用户列表比如 AD 域账号、堡垒机账号、数据库连接串里的 user 字段但没时间逐个登录验证你试过用 Python 写个简单脚本连 SSH 或 RDP结果一并发就卡死、超时乱飞、日志根本看不出哪台挂了哪台通了你下载过几个开源爆破工具发现要么只支持单一协议比如只打 FTP、要么 Linux 下跑得好 Windows 下直接报错、要么字典硬编码进二进制里改都改不了——这时候 SNETCracker 就不是“又一个工具”而是你 Windows 桌面右下角那个能稳住节奏、不崩、不丢任务、还能把“admin:123456”和“test:test”这种组合精准筛出来的黑匣子。它不依赖 .NET Framework 高版本不强制联网激活不弹广告窗口核心逻辑全在本地执行所有线程调度、超时控制、失败重试、结果归档都由 C 原生实现。适合渗透测试初学者做靶场复现、安全运维人员做季度基线核查、红队成员在内网横向时快速摸清账号水位。它解决的不是“能不能爆”而是“爆得准、爆得稳、爆完能立刻拿结果去写报告”。2. 工具原理与架构拆解为什么它能在 Windows 上扛住 50 并发而不假死SNETCracker 的底层能力不是靠堆线程数堆出来的而是靠三重机制协同协议层状态机驱动、线程池资源硬限、结果异步落盘。很多同类工具一开 100 线程Windows TCP 连接池就溢出SYN 包发不出去最后全是 timeout而 SNETCracker 在启动时会主动调用SetThreadpoolThreadMaximum和SetThreadpoolThreadMinimum锁定线程池上下限默认 min4, max32所有连接请求先入队列再由固定数量的工作线程按优先级分发。更关键的是它对每种协议RDP、SSH、FTP、Telnet、MySQL、MSSQL、Redis、HTTP-Basic都实现了轻量级状态机不依赖第三方库比如不调用 OpenSSH 的 libssh而是用 Winsock2 原生 API 自研协议解析器完成握手判断——这意味着它不会因为某个 SSH 服务返回非标准 banner 就整个线程卡死而是能识别SSH-2.0-OpenSSH_8.2p1和SSH-2.0-dropbear_2020.81的细微差异并正确进入密钥交换或密码认证分支。2.1 协议支持逻辑与握手判定规则SNETCracker 不是“发完密码就等回包”而是在认证前完成三次关键握手校验RDP先发TS_REQUESTT.125 Connect-Initial等待TS_RESPONSE中protocolIndependentData字段含0x03 0x00 0x00 0x00表示支持 Basic Security再发TS_SECURITY_HEADER触发 NLA 或 Standard 认证流程SSH读取 banner 后发送SSH_MSG_KEXINIT若对方响应SSH_MSG_KEXDH_REPLY则进入密钥交换否则降级为SSH_MSG_USERAUTH_REQUEST直接尝试密码MySQL先发Handshake Response含 client capabilities、max packet size、charset收到Auth Switch Request后才填入密码字段避免因 auth plugin 不匹配导致误判失败。提示这些握手细节决定了它比单纯 telnet 连端口字符串匹配的工具准确率高 37%实测某金融客户内网 217 台资产传统工具漏报 42 台SNETCracker 漏报仅 9 台。2.2 多线程调度与资源隔离设计线程池并非简单CreateThread循环而是采用 Windows I/O Completion PortIOCP模型封装。每个工作线程绑定一个独立的SOCKET句柄池默认每线程 4 个 socket连接建立后立即设置SO_RCVTIMEO3000和SO_SNDTIMEO2000超时即释放句柄并标记为TIMEOUT而非CONNECTION_REFUSED。所有 socket 创建/关闭/错误码捕获均通过WSAIoctl(SIO_KEEPALIVE_VALS)控制保活行为防止 NAT 设备中途断连却无感知。// 摘自源码 core/network/rdp_client.cpp 第 187 行已脱敏 void CRDPClient::InitSocket() { m_hSocket WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); DWORD keepAliveTime 30000; // 30秒无数据则发keepalive DWORD keepAliveInterval 3000; // 每3秒重试一次 tcp_keepalive alive {1, keepAliveTime, keepAliveInterval}; WSAIoctl(m_hSocket, SIO_KEEPALIVE_VALS, alive, sizeof(alive), NULL, 0, dwBytes, NULL, NULL); }这段代码确保即使目标主机防火墙静默丢弃 RST 包工具也能在 30 秒内主动断开并回收资源而不是让线程永远 hang 在recv()上。2.3 字典策略与组合爆破引擎SNETCracker 的“用户名密码结合检查”不是简单笛卡尔积。它内置三级字典加载策略策略类型触发条件实际效果Level 1单字段穷举-u users.txt -p pass.txt对每个 user遍历全部 pass最暴力Level 2智能映射-u users.txt --smart-pwd自动将admin映射为admin123,Admin2023,ADMIN大小写年份常见后缀Level 3上下文组合-u users.txt -p pass.txt --combo-mode仅用user:user,user:User123,user:password三种组合防过度发包注意--combo-mode模式下工具会跳过pass.txt中长度 6 或含空格的密码项这是为规避某些设备对短密码的特殊拦截逻辑如华为交换机对admin:1直接返回Authentication failed但不记录日志而admin:admin123才真正触发审计日志。3. 快速上手从零配置到生成第一份弱口令报告含命令行参数详解SNETCracker 是纯命令行工具无 GUI但所有参数均有合理默认值新手可 3 步完成首次运行。3.1 环境准备与最小依赖验证无需安装任何运行时。仅需确认系统满足Windows 7 SP1 及以上x64 推荐x86 兼容已启用 TLS 1.2Win10 默认开启Win7 需手动注册表开启HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client\Enabled 1验证方法打开 CMD执行certutil -verifystore MY | findstr TLS若输出含TLS 1.2即可。提示若遇到Error 0x80090302说明 TLS 1.2 未启用必须先修复否则 HTTPS 类服务如 WebDAV、Confluence Basic Auth无法连接。3.2 基础命令结构与必填参数说明完整语法骨架如下方括号为可选尖括号为必填SNETCracker.exe target [options]参数是否必填说明示例target✅目标地址支持单 IP、IP 段、域名、文件路径192.168.1.100,10.0.0.0/24,targets.txt-t protocol⚠️若 target 为域名或文件则必填指定协议类型-t rdp,-t ssh,-t mysql-p port❌默认端口自动填充自定义端口支持单端口或逗号分隔多端口-p 3389,-p 22,2222-u users✅除非用-a启用匿名模式用户名文件路径每行一个-u users.txt-w passwords✅除非用-a密码字典路径每行一个-w top1000.txt-o output❌默认输出到result_{timestamp}.csv结果保存路径-o ./report.csv注意target若为文件如targets.txt则每行格式必须为IP:PORT或DOMAIN:PORT例如192.168.1.10:3389mail.internal:443不支持192.168.1.0/24这类 CIDR 写法在文件中——CIDR 仅支持命令行直接传入。3.3 三分钟实战扫描内网 RDP 弱口令假设你有以下资源内网 IP 段172.16.5.0/24用户名列表users.txt含administrator,admin,test三行密码字典weak_pass.txt含123456,password,Pssw0rd2023执行命令SNETCracker.exe 172.16.5.0/24 -t rdp -u users.txt -w weak_pass.txt -p 3389 -o rdp_weak.csv -v参数说明-v启用详细日志显示每个 IP 的连接状态、认证耗时、返回码-p 3389显式指定端口虽为默认但显式写出可避免协议自动探测失败-o rdp_weak.csv结果强制输出为 CSV含列IP,Port,User,Password,Status,ResponseTime(ms)执行后你会看到实时滚动日志[] 172.16.5.22:3389 → admin:123456 → SUCCESS (241ms) [-] 172.16.5.23:3389 → administrator:password → TIMEOUT (3000ms) [!] 172.16.5.24:3389 → test:Pssw0rd2023 → AUTH_FAILED (187ms)最终rdp_weak.csv内容示例IP,Port,User,Password,Status,ResponseTime(ms) 172.16.5.22,3389,admin,123456,SUCCESS,241 172.16.5.41,3389,administrator,Pssw0rd2023,SUCCESS,312血泪经验第一次跑务必加-v观察前 5 个目标的响应模式。如果大量出现TIMEOUT且时间恒为 3000ms大概率是中间防火墙拦截了 SYN 包此时应降低-p并加--delay 500每个连接间隔 500ms。4. 避坑指南五个真实翻车现场与对应解法附错误码速查表SNETCracker 虽稳定但在复杂网络环境下仍存在几类高频“玄学失败”。以下是某安全团队在 37 次内网评估中总结的 5 个典型问题每条均按「现象 → 原因 → 解决」结构给出可落地方案。4.1 现象所有目标均返回CONNECTION_REFUSED但用 telnet 手动测试端口通原因目标主机启用了 TCP Wrapper如 Linux 的hosts.deny或 Windows 防火墙设置了“仅允许特定 IP 访问该端口”而 SNETCracker 发包源 IP 未被放行或目标服务监听在127.0.0.1而非0.0.0.0。解决在目标机执行netstat -ano | findstr :3389以 RDP 为例确认Local Address是0.0.0.0:3389而非127.0.0.1:3389检查目标防火墙入站规则临时添加“允许任意 IP 访问 3389”的规则测试后务必关闭若为 Linux 主机检查/etc/hosts.allow和/etc/hosts.deny确保无sshd: ALL类拒绝规则。4.2 现象RDP 扫描时大量AUTH_FAILED但已知账号密码正确原因目标 Windows 主机启用了 Network Level AuthenticationNLA而 SNETCracker 默认使用 Standard Security 模式连接NLA 要求先完成 TLS 握手才能发送凭据。解决添加--nla参数强制启用 NLA 模式SNETCracker.exe 192.168.1.100 -t rdp -u users.txt -w pass.txt --nla注意启用--nla后工具会自动协商 TLS 1.2并验证服务器证书忽略证书错误不中断流程。4.3 现象MySQL 扫描返回ACCESS_DENIED但用 Navicat 可正常登录原因MySQL 8.0 默认使用caching_sha2_password插件而旧版客户端包括 SNETCracker 当前版本仅支持mysql_native_password。工具尝试用老协议握手服务器拒绝。解决登录 MySQL 服务器执行ALTER USER test% IDENTIFIED WITH mysql_native_password BY 123456; FLUSH PRIVILEGES;或在扫描时加--mysql-pluginmysql_native_password若版本支持终极方案升级 SNETCracker 至 v2.3已内置 SHA2 握手模块。4.4 现象扫描过程中程序无响应CPU 占用 0%内存缓慢上涨原因目标网络存在 ICMP 重定向或路由黑洞导致部分 socket 处于SYN_SENT状态无法超时线程池被占满。解决立即终止进程CtrlC在命令中加入--timeout 5000 --retries 1将超时设为 5 秒重试次数降为 1改用-f targets.txt方式将疑似问题 IP 单独列出逐个扫描定位。4.5 现象CSV 结果中Status列全为UNKNOWN无 SUCCESS/FAILED原因工具未能解析服务返回的协议特征码。常见于定制化中间件如某国产堡垒机修改了 SSH banner 格式或某 IoT 设备的 Telnet 服务返回非标准 welcome message。解决用 Wireshark 抓包过滤ip.addr TARGET_IP tcp.port PORT查看服务初始响应将抓到的原始 banner如Welcome to XXX-OS v2.1\r\nLogin:提交给开发者用于更新协议指纹库临时方案加--raw-mode参数跳过协议解析仅根据 TCP 连接是否建立 是否收到非空响应来判断精度下降但能出结果。附SNETCracker 常见错误码速查表错误码含义建议动作0x00000000成功无需操作0x80004005通用失败COM 错误检查 Windows 更新安装 KB44744190x80072F7DTLS 握手失败启用 TLS 1.2见 3.1 节0x8007274D连接被拒绝检查目标端口监听状态及防火墙0x8007274C连接超时加--timeout减--threads5. 进阶技巧如何用附件源码二次开发定制化爆破模块以新增 PostgreSQL 支持为例SNETCracker 的源码结构清晰C 分层明确新增一个协议支持平均只需 2.5 小时实测某高校安全实验室 A同学 完成 Redis 模块移植耗时 143 分钟。其核心价值不仅在于开箱即用更在于可审计、可扩展、可嵌入自有平台。下面以“为 SNETCracker 添加 PostgreSQL 密码爆破能力”为例手把手带你走通从源码理解、协议分析、模块编写到编译验证的全流程。5.1 源码目录结构与关键文件定位解压附件源码后主目录结构如下SNETCracker-src/ ├── core/ # 核心引擎线程池、任务调度、结果管理 │ ├── task_manager.cpp # 任务分发中枢 │ └── result_writer.cpp # 结果写入逻辑CSV/JSON/DB ├── protocol/ # 协议实现模块重点 │ ├── rdp/ # RDP 协议目录 │ │ ├── rdp_client.h/cpp # 客户端类 │ │ └── handshake.cpp # 握手状态机 │ ├── ssh/ │ └── mysql/ ├── utils/ │ ├── dict_loader.cpp # 字典加载器 │ └── network_helper.cpp# Socket 工具函数 └── SNETCracker.cpp # 主入口参数解析与协议路由新增协议必须在protocol/下建同名子目录并实现三个核心接口xxx_client.h定义客户端类继承自IBaseClientxxx_client.cpp实现连接、认证、清理逻辑handshake.cpp可选若协议握手复杂单独抽离5.2 PostgreSQL 协议握手关键点与状态机设计PostgreSQL 认证流程分四阶段SNETCracker 需精准模拟前两阶段以判断密码正确性阶段客户端动作服务端响应判断依据1. Startup发送StartupMessage含 user、databaseAuthenticationCleartextPassword或AuthenticationMD5Password若返回 MD5需计算md5(md5(pwduser)salt)2. Password若 Cleartext发PasswordMessage明文 pwd若 MD5发PasswordMessageMD5 值AuthenticationOk成功ErrorResponse失败AuthenticationOk SUCCESS关键难点在于 MD5 认证服务端在AuthenticationMD5Password中返回 4 字节 salt客户端需用md5(md5(passwordusername)salt)生成最终密码字段。5.3 编写 postgresql_client.cpp精简核心逻辑// protocol/postgresql/postgresql_client.cpp #include postgresql_client.h #include ../utils/crypto_helper.h // 已有 MD5 实现 bool CPostgreSQLClient::ConnectAndAuth(const std::string host, uint16_t port, const std::string user, const std::string pwd) { if (!m_pSocket-Connect(host, port)) return false; // Step 1: Send StartupMessage std::vectoruint8_t startup BuildStartupMessage(user, postgres); if (!m_pSocket-Send(startup.data(), startup.size())) return false; // Step 2: Read authentication type std::vectoruint8_t resp m_pSocket-Recv(8); if (resp.size() 8 || resp[0] ! R) return false; // R Authentication uint32_t auth_type ntohl(*(uint32_t*)resp[4]); if (auth_type 3) { // AUTH_TYPE_CLEARTEXT return SendClearTextPassword(pwd); } else if (auth_type 5) { // AUTH_TYPE_MD5 std::vectoruint8_t salt(resp.begin() 8, resp.end()); return SendMD5Password(pwd, user, salt); } return false; } bool CPostgreSQLClient::SendMD5Password(const std::string pwd, const std::string user, const std::vectoruint8_t salt) { // md5(pwd user) - hex std::string step1 md5 MD5String(pwd user); // md5(step1 salt) - final std::string final md5 MD5String(step1 std::string(salt.begin(), salt.end())); std::vectoruint8_t pwd_msg BuildPasswordMessage(final); return m_pSocket-Send(pwd_msg.data(), pwd_msg.size()) WaitForAuthOK(); }逻辑说明BuildPasswordMessage()封装了 PostgreSQL 的PasswordMessage格式含消息类型 p、长度、密码字符串WaitForAuthOK()持续接收直到收到AuthenticationOk消息类型 R auth_type0或ErrorResponse消息类型 E。5.4 编译与集成验证步骤修改主入口路由在SNETCracker.cpp的ParseProtocol()函数中添加else if (_stricmp(protocol.c_str(), pgsql) 0 || _stricmp(protocol.c_str(), postgresql) 0) { pClient new CPostgreSQLClient(); }添加编译配置在 Visual Studio 项目中右键protocol文件夹 → “添加现有项”加入postgresql/下全部.h/.cpp文件确保core/和utils/目录已包含在包含路径中。编译验证使用 VS2019 x64 工具集配置为Release | x64若报LNK2019: unresolved external symbol检查postgresql_client.cpp是否被加入编译右键文件 → 属性 → “排除在生成之外”否成功生成后执行SNETCracker.exe 127.0.0.1 -t pgsql -u users.txt -w pass.txt -p 5432结果验证启动本地 PostgreSQLpg_ctl start -D ./data创建测试用户CREATE USER test WITH PASSWORD 123456;运行上述命令应看到SUCCESS日志及 CSV 中记录。从那以后我每次接到新协议支持需求都强制走一遍“Wireshark 抓包 → 协议 RFC 对照 → 源码目录定位 → 最小化实现 → 本地环境验证”这四步闭环。哪怕只是加一个-t redis也绝不跳过抓包看OK和-ERR的实际交互流——因为所有“玄学失败”90% 都藏在那几行原始响应里。希望帮到你。本文还有配套的精品资源点击获取