
Microsoft 네트워크 서비스 핑거프린팅 도구
버전: 1.0
저자: Laurent Gaffie
회사: Secorizon
MSFinger는 내부 네트워크 정찰을 위해 설계된 고성능 네트워크 핑거프린팅 도구입니다. SMB, LDAP 및 LDAPS 프로토콜 전반에 걸쳐 Microsoft 서비스를 신속하게 식별하고, 보안 구성을 탐지하며, 잠재적 취약점을 강조 표시합니다.
주요 기능:
MSFinger는 순수 Python으로 작성되었습니다. Python 3.6+ 외에 추가 종속성은 필요하지 않습니다.
cd /path/to/MSFinger
chmod +x MSFinger.py
python3 MSFinger.py -i <target> [options]
* -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 방언(dialect) 버전 (2.0.2, 2.1, 3.0, 3.0.2, 3.1.1)Signing: <status> - 필수/활성화/비활성화OS: <version> - 빌드 번호가 포함된 Windows 버전Domain: <name> - NetBIOS 도메인/작업 그룹 이름Boot: <time> - 시스템 부팅 시간(또는 Disabled/Unknown)SMB1 상태:
SMB1: disabled - SMB1 미지원(안전)SMB1: supported, Signing: <status> - SMB1 활성화(잠재적 위험)서비스:
RDP - 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 - 서명을 지원하지 않음(취약)OS 버전 매핑:
서명 요구 사항을 확인하기 위해 익명 바인드를 테스트합니다:
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=2 설정채널 바인딩 없는 LDAPS:
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
이 프로그램은 자유 소프트웨어입니다: 자유 소프트웨어 재단(Free Software Foundation)이 공표한 GNU 일반 공중 사용 허가서(GNU General Public License) 버전 3 또는(선택에 따라) 이후 버전의 조건에 따라 이를 재배포하거나 수정할 수 있습니다.
이 프로그램은 유용하게 사용되기를 바라는 마음으로 배포되지만, 상품성 또는 특정 목적에의 적합성에 대한 묵시적 보증을 포함한 어떠한 보증도 없이 배포됩니다. 자세한 내용은 GNU 일반 공중 사용 허가서를 참조하십시오.
| 옵션 | 설명 | 기본값 |
|---|
-i, --ip | 대상 IP, CIDR 범위 또는 IP 범위 | 필수* |
-f, --file | 대상을 포함하는 파일(줄당 하나) | 필수* |
-t, --timeout | 연결 타임아웃(초) | 1.0 |
-w, --workers | 동시 작업자 수 | 100 |
-d, --database | 결과 저장용 SQLite 데이터베이스 파일 | MSFinger.db |
--no-color | 색상 출력 비활성화 | 비활성화 |
| 컬럼 | 타입 | 설명 |
|---|
id | INTEGER | 기본 키(자동 증가) |
ip | TEXT | IP 주소(고유) |
hostname | TEXT | 호스트 이름(향후 사용을 위해 예약됨) |
os_version | TEXT | 운영 체제 버전 |
os_build | INTEGER | OS 빌드 번호 |
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 |
| 권장 타임아웃 |
|---|
| 작업자 수 |
|---|
| 고속 내부 LAN(1Gbps+) | 0.5초 | 200-300 |
| 일반 내부 네트워크 | 1.0초(기본값) | 100-150 |
| 느린/무선 네트워크 | 2.0-3.0초 | 50-100 |
| VPN 연결 | 3.0-5.0초 | 30-50 |