版本: 1.0
作者: Laurent Gaffie
公司: Secorizon
MSFinger 是一款面向内网侦察的高性能网络指纹识别工具。它能够快速识别 Microsoft 服务、检测安全配置,并突出显示 SMB、LDAP 和 LDAPS 协议中的潜在漏洞。
主要功能:
MSFinger 使用纯 Python 编写。除 Python 3.6+ 外,无需其他依赖。
cd /path/to/MSFinger
chmod +x MSFinger.py
python3 MSFinger.py -i <target> [options]
| 选项 | 说明 | 默认值 |
|---|---|---|
-i, --ip | 目标 IP、CIDR 范围或 IP 范围 | 必需* |
-f, --file | 包含目标的文件(每行一个) | 必需* |
-t, --timeout | 连接超时(秒) | 1.0 |
-w, --workers | 并发工作进程数 | 100 |
-d, --database | 用于保存结果的 SQLite 数据库文件 | MSFinger.db |
--no-color | 禁用彩色输出 | 禁用 |
* 必须指定 -i 或 -f 其中之一
python3 MSFinger.py -i 192.168.1.10
python3 MSFinger.py -i 192.168.1.0/24
python3 MSFinger.py -i 192.168.1.1-50
python3 MSFinger.py -f targets.txt
示例 targets.txt:
192.168.1.0/24
10.0.0.1-100
172.16.5.50
# Comments are supported
192.168.2.0/25
# Faster scan with shorter timeout and more workers
python3 MSFinger.py -i 10.0.0.0/16 -t 0.3 -w 200
# More reliable scan with longer timeout
python3 MSFinger.py -i 192.168.1.0/24 -t 1.0 -w 50
python3 MSFinger.py -i 192.168.1.0/24 -d pentest_2026.db
python3 MSFinger.py -i 192.168.1.0/24 --no-color > scan_results.txt
结果以实时方式显示,并使用彩色安全指示标记:
[192.168.1.10] SMB: 3.1.1, Signing: required, OS: Windows Server 2022 21H2, Domain: CORP.LOCAL, Boot: 2026-01-01 10:30:15 | SMB1: disabled | Services: RDP, LDAP (signing: required), LDAPS (signing: required, channel binding: required)
SMB 信息:
SMB: X.X.X - SMB 方言版本(2.0.2、2.1、3.0、3.0.2、3.1.1)Signing: <status> - required/enabled/disabledOS: <version> - 包含内部版本号的 Windows 版本Domain: <name> - NetBIOS 域/工作组名称Boot: <time> - 系统启动时间(或 Disabled/Unknown)SMB1 状态:
SMB1: disabled - SMB1 不受支持(安全)SMB1: supported, Signing: <status> - SMB1 已启用(潜在风险)服务:
RDP - 远程桌面协议(端口 3389)开放MSSQL - Microsoft SQL Server(端口 1433)开放LDAP (signing: <status>) - 端口 389 上的 LDAPLDAPS (signing: <status>, channel binding: <status>) - 端口 636 上的 LDAPSLDAPS (port open, <error>) - LDAPS 端口响应但 SSL 握手失败MSFinger 将所有扫描结果存储在 SQLite 数据库中,以便持久化保存和分析。
hosts# View all vulnerable hosts (no SMB signing)
sqlite3 MSFinger.db "SELECT ip, os_version, smb_signing FROM hosts WHERE smb_signing != 'required'"
# Find hosts with LDAP signing disabled
sqlite3 MSFinger.db "SELECT ip, domain, ldap_signing FROM hosts WHERE ldap_signing = 'not_required'"
# List all Windows Server 2022 hosts
sqlite3 MSFinger.db "SELECT ip, os_version, domain FROM hosts WHERE os_version LIKE '%Server 2022%'"
# Export to CSV
sqlite3 -header -csv MSFinger.db "SELECT * FROM hosts" > results.csv
# Count hosts by OS
sqlite3 MSFinger.db "SELECT os_version, COUNT(*) FROM hosts GROUP BY os_version"
已测试的协议:
收集的信息:
required - 服务器要求消息签名(安全)enabled - 服务器支持但不要求签名disabled - 不支持签名(易受攻击)操作系统版本映射:
测试匿名绑定以确定签名要求:
测试带 LDAP 绑定的 SSL/TLS 连接:
可能的结果:
signing: required, channel binding: required - 最高安全性(安全)signing: not_required, channel binding: not_required - 无任何保护(易受攻击)port open, SSL handshake failed - 端口响应,但 SSL 协商失败port open, Connection error: 104 - 连接被对端重置SMB 签名已禁用:
LDAP 签名非必需:
LdapEnforceChannelBinding=2 和 LDAPServerIntegrity=2LDAPS 无通道绑定:
SMB 签名已启用(非必需):
支持 SMB1:
SMB 签名必需:
LDAP/LDAPS 签名必需:
强制通道绑定:
| 网络类型 | 建议超时 |
|---|
每个工作进程仅消耗少量内存(约 1-2MB)。请根据系统资源调整并发数:
# High-performance scan (requires good CPU/RAM)
python3 MSFinger.py -i 10.0.0.0/8 -t 0.5 -w 500
# Conservative scan (low resource usage)
python3 MSFinger.py -i 192.168.0.0/16 -t 2.0 -w 50
检查网络连通性:
ping <target_ip>
telnet <target_ip> 445
增大超时:
python3 MSFinger.py -i <target> -t 3.0
检查防火墙规则:
“SSL handshake failed”或“Connection error: 104”:
openssl s_client -connect <ip>:636 进行诊断如果从多个进程进行扫描:
# Use different database files
python3 MSFinger.py -i 192.168.1.0/24 -d scan1.db &
python3 MSFinger.py -i 192.168.2.0/24 -d scan2.db &
确保脚本具有可执行权限:
chmod +x MSFinger.py
先识别存活的 SMB 主机,再进行指纹识别:
nmap -p445 --open -oG - 192.168.1.0/24 | awk '/445\/open/{print $2}' > smb_hosts.txt
python3 MSFinger.py -f smb_hosts.txt
通过 cron 监控网络变化:
# Add to crontab (every day at 2 AM)
0 2 * * * /usr/bin/python3 /path/to/MSFinger.py -i 192.168.1.0/24 -d /var/scans/daily_scan.db
使用 PowerShell 查询并进行修复:
# Install SQLite PowerShell module
Install-Module -Name SimplySql
# Query vulnerable hosts
Open-SQLiteConnection -DataSource "MSFinger.db"
$vulnerable = Invoke-SqlQuery -Query "SELECT ip FROM hosts WHERE smb_signing != 'required'"
Close-SqlConnection
# Remediate
foreach ($host in $vulnerable) {
Set-SmbServerConfiguration -ComputerName $host.ip -RequireSecuritySignature $true -Force
}
作者: Laurent Gaffie ([email protected])
许可证: GNU General Public License v3.0
本程序是自由软件:您可以根据自由软件基金会发布的 GNU 通用公共许可证条款(许可证第 3 版或(由您选择的)任何更高版本)重新分发和/或修改本程序。
本程序的发布是希望它有用,但不提供任何担保;甚至不提供适销性或特定用途适用性的默示担保。有关更多详情,请参阅 GNU 通用公共许可证。
| 列 | 类型 | 说明 |
|---|
id | INTEGER | 主键(自增) |
ip | TEXT | IP 地址(唯一) |
hostname | TEXT | 主机名(保留供将来使用) |
os_version | TEXT | 操作系统版本 |
os_build | INTEGER | 操作系统内部版本号 |
domain | TEXT | 域/工作组名称 |
boot_time | TEXT | 系统启动时间戳 |
smb_dialect | TEXT | SMB 协议版本 |
smb_signing | TEXT | SMB 签名状态 |
smb1_supported | INTEGER | SMB1 是否启用(0=否,1=是) |
smb1_signing | TEXT | SMB1 签名状态 |
rdp_open | INTEGER | RDP 端口是否开放(0=否,1=是) |
mssql_open | INTEGER | MSSQL 端口是否开放(0=否,1=是) |
ldap_signing | TEXT | LDAP 签名状态 |
ldaps_signing | TEXT | LDAPS 签名状态 |
ldaps_channel_binding | TEXT | LDAPS 通道绑定状态 |
ldaps_error | TEXT | LDAPS 连接错误(如有) |
scan_time | TIMESTAMP | 首次扫描时间戳 |
last_seen | TIMESTAMP | 最近扫描时间戳 |
| 内部版本范围 | 操作系统 |
|---|
| 10240 | Windows 10 1507 |
| 14393 | Windows 10 1607 / Server 2016 |
| 17763 | Windows 10 1809 / Server 2019 |
| 19041-19045 | Windows 10 20H2 - 22H2 |
| 20348 | Windows Server 2022 21H2 |
| 22000+ | Windows 11 |
| 25398 | Windows Server 2025 |
| 并发数 |
|---|
| 高速内部局域网(1Gbps+) | 0.5s | 200-300 |
| 普通内部网络 | 1.0s(默认) | 100-150 |
| 慢速/无线网络 | 2.0-3.0s | 50-100 |
| VPN 连接 | 3.0-5.0s | 30-50 |