บทความโดย
Vanitas
Cyber Security Researcher
Box Name : Heist Difficulty : Easy Point : 20
Vulnerability :
– Cracking credential from attachment in issue.php.
– WinRM shell access.
– Forensics Investigation using Process Dump from Firefox process.
Enumeration & Exploit :
- Nmap scan แบบ all port (TCP + UDP) จะพบว่า TCP : 80,135,445 และ 5985 เปิดอยู่
- ลอง browse เข้าไปจะถูก re-direct ไป page : login.php ซึ่งถ้าไม่มี credential จะ log-in by guest ได้
- เมื่อ log-in ด้วย guest จะถูก re-direct ไปยัง page : issues.php ซึ่งจะพบบทสนทนาว่า user นามว่า Hazard มีการร้องขอไปยัง Support Admin ว่าให้สร้าง account ให้เค้าบน Windows ให้หน่อย ซึ่งมีจุดน่าสนใจคือมีการแนบ attachment file ไว้ด้วย
- คลิกไปดู จะพบ configuration ในลักษณะของ cisco router credential
- ลองเอามา crack ดูเลย โดยในกรณีที่เป็น password type 7 สามารถใช้ online cracking จาก http://www.ifm.net.nz/cookbooks/passwordcracker.html ได้ซึ่งจะได้ password ดังรูป
- สำหรับ password type 5 สามารถ crack ด้วย John-the-Ripper ได้ ซึ่งเมื่อ crack สำเร็จจะได้ password ในรูป plain-text ดังรูป.
- ซึ่งก่อนหน้านี้ตอนเราทำ Nmap scan จะพบว่า TCP port : 445 ซึ่งเป็น File Sharing ด้วย SMB นั้น open อยู่ แต่ปัญหามันคือเราจะเอา user ที่ไหนมาใช้กับ password credential ที่ crack ได้มาหล่ะ?
- นึกอะไรไม่ออก ก็ลองย้อนกลับไปดู page : issues.php อีกรอบ สังเกตดีๆว่าเค้า hint มาให้แล้ว
- ลองใช้ password ที่ crack ได้ร่วมกับ user : Hazard ไป log-in ผ่าน SMB share โดยจะพบว่า password : “stealthagent” นี่แหละ ที่ validแต่…ทุก share name นั้นก็เข้าไปทำอะไรไม่ได้เลยอยู่ดี อย่างไรต่อดี… หรือน่าจะมี credential อื่นๆอีก ที่สามารถใช้งานได้
- ทีนี้ลองหา sid อื่น ที่จะสามารถนำไป enumerate ต่อได้ โดยเราจะใช้ tools จาก Impackets มาเพื่อหา sid ว่าเครื่องเป้าหมาย มี sid อะไรอื่นๆอีกบ้าง ด้วย lookupsid.py (Ref : https://github.com/SecureAuthCorp/impacket/blob/master/examples/lookupsid.py)
- Download มา แล้วใช้ credential ของ user : Hazard เพื่อ log-in ไปหา sid ผ่าน RPC จะพบว่าเจอ user : support, Chase และ Jason เพิ่มเติม ที่ดูน่าสนใจ
- เมื่อเราได้ username มาเพิ่มแล้ว ก็ลองมา brute-force ด้วย password ที่ crack มาได้ทั้ง 3 อันก่อนหน้านี้ดู ด้วย module : auxiliary smb log-in โดยเราจะทำชุดข้อมูลใส่ text file ไว้ เพื่อให้มาอ่าน userpass file จาก file นี้
- หลังจาก brute-force เสร็จ ละเจอว่า user : Chase นั้นก็มี valid credential เช่นกัน
- อย่าได้รอช้า ลองนำ credential ของ user : Chase ไป log-in ผ่าน SMB share ดูเลย
- อาการเดียวกัน คือไม่เจอ share name แปลกๆ และทำอะไรต่อไม่ได้ แม้ credential จะ valid ก็ตาม
- แสดงว่า credential ที่ได้มา ต้องนำไปใช้อย่างอื่นแล้ว นำมาใช้กับ SMB share ไม่น่าได้
- ย้อนกลับดูตอน Nmap scan เราจะเจอว่า TCP port : 5985 ก็ open อยู่ ซึ่ง service ตัวนี้เป็น Windows Remote Management service หรือเรียกสั้นๆว่า WinRM
- ลอง request WinRM ดู จะพบว่าสามารถเรียก context :wsman ได้ผ่าน POST method ซึ่งโดยปกติแล้ว Windows ส่วนมากจะถูก hardening ไว้และไม่ค่อยเปิดให้ใช้ แสดงว่า box นี้มีโอกาสทำ remote command execution ผ่าน WinRM service ได้สำหรับผู้ที่ไม่เคยทำสามารถดูรายละเอียดได้จาก https://pentestlab.blog/2018/05/15/lateral-movement-winrm/
- นำ credential ที่ได้ไปยัดใน shell เพื่อทำ request ผ่าน WinRM
- ลองรันดู คราวนี้เราจะได้ shell ในรูปแบบของ PowerShell แล้วด้วยสิทธิ์ user : Chase ดังรูป
- เข้าไปที่ Desktop ของ user นี้ จะได้ flag : user.txt
- สังเกตว่ามีอะไรแปลกๆ คือไฟล์ todo.txt ลองเข้าไปอ่าน content ดู
- ดูไม่มีอะไร เก็บไว้ก่อน
- ลอง local enumeration ดูทั่วๆ จะพบว่าใน AppData ของ user : Chase มีการ install Firefox browser ไว้
- ลอง query process ด้วย : ps ผ่าน PowerShell จะพบว่าปัจจุบันก็ยังมี process ของ Firefox ใช้งานอยู่
- ลอง dump process ออกมาดูเลย ด้วย sysinternal tools – ProcDump (Ref : https://docs.microsoft.com/en-us/sysinternals/downloads/procdump)
- Download มาลงเครื่องเป้าหมายก่อน ผ่าน Invoke-WebRequest
- ในการทำ process dump ด้วย ProcDump จะต้อง dump ด้วย process id ที่เราระบุ โดยเราสามารถใช้ Get-Process เพื่อหา pid ของ process ที่เราต้องการได้ ดังรูป
- Dump ออกมากันได้เลย อย่าลืมใส่ /accepteula ด้วยเพราะเราทำผ่าน command prompt แล้วระบุ pid ที่เราได้มา ผ่าน option –ma จะได้ไฟล์ dump ที่เป็น .dmp ขนาดราวๆ 450 MB ออกมา
- ทำการ transfer dump file มาที่เครื่องของ attacker แล้วใช้ strings เพื่อหา keyword ว่า “password” ดู
- นั่งดูไปสักพัก จะเจอสิ่งที่น่าสนใจคือมีการเรียก request บาง page ด้วยการ post username, password ไว้ ซึ่งดูเหมือนจะเป็น hint บางอย่างว่าเป็น credential ของ user : admin
- ลอง test ดูกันเลย โดยเอา credential ที่ได้จาก dump file ไปใส่ใน WinRM shell
- รัน ruby file เพื่อไป authen ด้วย user : Administrator ดู ซึ่งเข้าได้แล้วดั่งที่ hint
- เข้าไปที่ Desktop folder ของ user : Administrator จะพบ flag : root.txt โดยสิทธิ์ local administrator ก็จะสามารถ read flag นี้ได้แล้ว