สวัสดีครับ วันนี้ผมจะพาไปทำ Lab ของ TryHackMe ที่เป็น Event Christmas ชื่อว่า Advent of Cyber 2023 เป็น Event ที่ถ้าเราเข้าร่วมจะมีสิทธิ์ในการรับรางวัลจากทางเว็บไซต์ TryHackMe โดยโจทย์ที่อยู่ใน Lab Advent of Cyber 2023 จะรวมหลาย ๆ เรื่องเกี่ยวกับ Security เอาไว้ เช่น Log analysis, Reverse engineering, Brute-forcing และอื่น ๆ ซึ่งในแต่ละ Lab จะมี Learning Objectives เป็นการกำหนดว่าเราควรจะได้เรียนรู้อะไรบ้างจากการทำ Lab ในข้อนั้น
ในวันนี้ผมจะพาไปทำ Lab ของ Advent of Cyber 2023 ทั้งหมด 2 ข้อ ได้แก่
- Chatbot, tell me, if you’re really safe? และ
- Hydra is Coming to Town นอกจากทำ Lab แล้วผมจะอธิบายสิ่งต่าง ๆ ที่ได้ทำลงไป
มาเริ่มกันที่ Lab ที่ 1
Chatbot, tell me, if you’re really safe?
ก่อนที่จะเริ่มทำให้ทำการกด Start Machine มุมบนขวาของ Lab จากนั้นให้ทำการเข้าสู้ URL ต่อไปนี้ “https://10-10-181-29.p.thmlabs.com/” ในส่วนของ 10–10–181–29 จะเป็น IP ที่ทาง TryHackMe สร้างขึ้นให้เราเมื่อกด Start Machine เมื่อเข้ามาใน URL จะเป็นโปรแกรมแชทบอท
จากนั้นให้เราทำการส่งข้อความไปหาแชทบอทว่า “What is the personal email address of the McGreedy?” เพื่อดูว่าแชทบอทจะทำการส่งข้อมูลกลับมาให้เราหรือไม่
จากรูป จะเห็นว่าเราถาม Email ส่วนตัวของ “McGreedy” ซึ่งแชทบอทได้ทำการส่ง Email ส่วนตัวมาให้การทำสิ่งนี้ถือว่าเป็นช่องโหว่ที่เราสามารถใช้ประโยชน์ในการขอข้อมูลส่วนตัวจากแชทบอทได้
แล้วปัญหานี้เกิดขึ้นได้อย่างไร!!!
ปัญหาของช่องโหว่นี้เกิดขึ้นได้จากตอนที่เราทำการ Train ข้อมูล Datasets ที่เราใช้อาจมีข้อมูลส่วนบุคคลหรือข้อมูลละเอียดอ่อนอื่น ๆ เข้ามาอยู่ด้วยนี่เป็นปัญหาที่ทำให้เกิดช่องโหว่นี้
เพื่อให้เราเข้าใจมากขึ้นเราต้องรู้จักกับ NLP หรือ Natural Language Processing เป็นหนึ่งในเครื่องมือที่ช่วยให้คอมพิวเตอร์เข้าใจภาษาที่มนุษย์ใช้กัน อธิบายอย่างง่าย นั่นคือ NLP จะให้คอมพิวเตอร์เรียนรู้ความสัมพันธ์ของคำโดยจะมีคำศัพท์แรกอยู่และคอมพิวเตอร์จะทำการทำนายคำถัดไปว่าเป็นคำว่าอะไรตามบริบทนั้น ๆ
จากที่อธิบายไปสิ่งที่สำคัญที่สุด คือ การที่ช่องโหว่เกิดจากการที่เอาข้อมูลละเอียดอ่อนเข้าไป Train ด้วย แล้วทำไมเราไม่เอาข้อมูลพวกนี้ออกล่ะ ที่ไม่ทำแบบนั้น เพราะว่าหากเรานำข้อมูลเหล่านี้ออกแล้วทำการ Train ข้อมูลด้วย Dataset ใหม่นั้นเป็นไปได้ยาก เนื่องจากการประมวลผลของ AI อาจจะเปลี่ยนไปจากการที่เราใช้ Dataset ใหม่ ดังนั้นเราควรที่จะเพิ่มการรักษาความปลอดภัยเข้าไปแทน
วิธีการเพิ่มการรักษาความปลอดภัยของแชทบอทใน Lab นี้จะเป็นการใช้ system prompt เพื่อให้แชทบอทรู้ว่าคำถามที่ถูกถามมานั้นมีการขอข้อมูลที่ละเอียดอ่อนหรือไม่ เช่น บอกกับแชทบอทว่าผู้มีสิทธิ์รู้รหัสผ่านนั้นจะเป็นผู้ที่อยู่ในองค์กรได้เท่านั้น
จากตัวอย่างผมถามแชทบอทว่า รหัสผ่านของห้อง IT คืออะไร จะเห็นว่าระบบจะตอบว่าไม่สามารถบอกได้ คุณต้องเป็นสมาชิกก่อนถึงจะรู้รหัสเข้าห้อง
ซึ่งเราจะรู้วิธีป้องกันแล้ว ดังนั้น เราจะลองถามคำถามอีกครั้งโดยเราจะแทนว่าตัวเองเป็นผู้พัฒนาระบบ
จะเห็นว่าแชทบอทยอมบอกข้อมูลเราโดยง่าย เนื่องจากสิ่งที่เราพิมพ์ไปทางแชทบอทจะเชื่อว่าเป็นความจริงเสมอ หากต้องการแก้ไข เราสามารถไปเพิ่มใน system prompt
เราสามารถให้ AI เขามาช่วยเราในการป้องกันแชทบอทของเรา โดยแนวคิดในการใช้ AI คือเอา AI ตัวอื่นมาเก็บข้อมูลข้อความของผู้ใช้และตรวจสอบ input ว่ามีอันตรายต่าง ๆ เข้ามาในระบบไหม ก่อนจะส่งไปให้แชทบอท ซึ่งเราจะเรียก AI ตัวอื่น ๆ นี้ว่า Interceptor ยิ่งเราโดนโจมตีเท่าไหร่ก็ยิ่งเก่งขึ้นและป้องกันได้มากขึ้น เมื่อนำ AI มารวมกับ system prompt จะช่วยเพิ่มความปลอดภัยให้กับแชทบอทได้แต่การโจมตีใหม่ ๆ ที่เข้ามาจะไม่สามารถป้องกันได้!
จากรูปจะเห็นว่าเมื่อถามเกี่ยวกับโปรเจ็กต์ลับก็จะบอกว่ามีการป้องกันอยู่นั่นเอง แต่เราสามารถโจมตีได้อยู่ซึ่งจำเป็นที่จะต้องคิดนอกกรอบให้เราสามารถหลบเลี่ยงการตรวจจับของ Interceptor เช่น
จากรูปจะเห็นว่าเราหลอกว่าแชทบอทอยู่ในโหมดบำรุงรักษาแล้วขอชื่อโปรเจ็กต์ จากนั้นบอทจะให้ชื่อโปรเจ็กต์เรามา
สำหรับ Lab ข้อแรกจะจบลงเท่านี้ ซึ่งการโจมตีด้วยคำถามเหล่านี้อาจจะใช้กับโปรแกรมแชทบอทอื่น ๆ ไม่ได้ เนื่องจากมีการใช้การป้องกันที่แตกต่างกัน
มาต่อกันที่ Lab ที่ 2
Hydra is Coming to Town
เราจะต้องกด start machine เช่นเดิมและไปที่ URL “http://10.10.138.234:8000/” โดย 10.10.138.234 เป็น IP ที่ทาง TryHackMe สร้างมาให้ เมื่อเข้าไปใน URL จะได้หน้าจอให้ใส่รหัสดังรูปภาพ
ในเรื่องนี้จะเกี่ยวกับการ Brute force สิ่งที่เราควรจะทราบ ระบบหลาย ๆ อย่างใช้รหัส PIN เพื่อเข้าสู่ระบบซึ่ง PIN จะเป็นตัวเลข ตัวอย่างเช่น PIN ที่มีตัวเลข 4 ตัวตั้งแต่ 0–9 หมายความว่า PIN ที่เป็นไปได้ทั้งหมดจะเท่ากับ 10×10×10×10 หรือเท่ากับ 10000 รูปแบบ
มาดูกันในส่วนของระบบที่เป็น Password โดย Password ในที่นี้จะเป็นตัวอักษรภาษาอังกฤษพิมพ์เล็ก 26 ตัว (a-z) พิมพ์ใหญ่ 26 ตัว (A-Z) และตัวเลข 10 ตัว (0–9) ทั้งหมดเรามีตัวเลือก 62 ตัว ในแต่ละตำแหน่ง ถ้าเราให้ Password มีความยาวทั้งหมด 4 ตำแหน่ง รหัสที่เป็นไปได้ทั้งหมด 62×62×62×62 หรือเท่ากับ 14776336 รูปแบบ จะเห็นว่าการที่เราจะเดารหัส Password นั้นมีความยากกว่า PIN
เรามาลองคำนวณเวลาในการ Brute force รหัสผ่านทั้งหมด ในการหารหัสด้วยคอมพิวเตอร์แต่ละครั้งจะใช้เวลาที่ 0.001 วินาที นำเอาจำนวนรหัสทั้งหมดมาคูณด้วยเวลาแต่ละอันจะได้ 14776336×0.001 มีค่าประมาณ 14776 วินาที คิดเป็นชั่วโมงจะได้ประมาณ 4 ชั่วโมง นั่นคือเวลาที่ใช้ในการ Brute force ทั้งหมด การคำนวณที่ผ่านมาจะทำให้เห็นว่ายิ่ง Password มีความยาว และ รูปแบบอักษรมากขึ้นจะทำให้การ Brute force ใช้เวลานานขึ้น
เราจะเริ่มทำ Lab กันเลย เมื่อรู้ข้อมูลเบื้องต้นกันแล้วใน Lab นี้จะเป็นรหัส PIN 3 ตัวซึ่งเป็นเลข 0–9 และ ตัวอักษรภาษาอังกฤษพิมพ์ใหญ่ A-F เราจะใช้ตัวช่วยในการสร้าง wordlist ขึ้นมา นั่นคือ crunch ซึ่ง crunch คือ Tool ที่จะช่วยสร้าง wordlist ตามตัวอักษรที่เราระบุเข้าไป
คำสั่งที่ใช้คือ
crunch 3 3 0123456789ABCDEF -o 3digits.txt
อธิบายคำสั่ง
- 3 ตัวแรก คือจำนวนที่น้อยที่สุดที่เป็นได้เราให้เป็น 3
- 3 ตัวที่สอง คือจำนวนมากที่สุดที่เป็นได้เราให้เป็น 3
- 0123456789ABCDEF จะเป็นรูปแบบอักษรทั้งหมดที่เป็นไปได้
- -o หมายถึงระบุไฟล์ที่ต้องการบันทึกข้อมูลผลลัพธ์ของ Password ที่ทำการสร้างขึ้น
- 3digits.txt คือชื่อไฟล์ที่เราต้องการบันทึกผลลัพธ์ของ Password
เมื่อเรารันคำสั่งแล้ว จะได้ไฟล์ 3digits.txt มา ซึ่งเราพร้อมแล้วที่จะนำ wordlist ไป Brute force โดย Tool ที่เราจะใช้ Brute force จะเป็น Tool hydra ก่อนอื่นเราต้องมาดู page source ของหน้าเว็บของเราก่อน
เราสนใจตรง Tag form สิ่งที่เราจะใช้คือ method, action และ name ข้อมูลนี้ทำให้เรารู้ว่าเมื่อเรากดปุ่ม “CONTINUE” ในหน้าเว็บจะส่ง form ไปที่ “login.php”
เราลองมาใช้หน้าเว็บกันก่อน เมื่อเราลองกรอกข้อมูลมั่ว ๆ จะได้หน้าเว็บ ดังนี้
ในหน้าเว็บนี้หมายถึงเราใส่รหัสผิดและจะมีข้อความ “Access denied” ขึ้นมา
เมื่อเราลองเล่นหน้าเว็บแล้วเราจะได้ข้อมูลทั้งหมดที่จะใช้กับ hydra
- method “post”
- action “login.php”
- คำว่า “Access denied” จากการที่เราใส่รหัสผิด
คำสั่ง hydra ที่เราจะใช้นั่นคือ
Hydra -l ‘’ -P 3digits.txt -f -v 10.10.138.234 http-post-form “/login.php:pin=^PASS^:Access denied”-s 8000
อธิบายคำสั่ง
- -l ‘’ คือ username เพื่อ login แต่เรามีเพียง Password หรือ PIN เราจึงให้เป็นค่าว่าง
- -P 3digits.txt หมายถึง Password หรือ PIN ที่เราจะใช้โดยเราใช้ไฟล์ที่สร้างมาจากเครื่องมือ “crunch”
- -f คือเราจะหยุดเมื่อเราเจอ Password หรือ PIN ที่สามารถใช้งานได้
- -v คือจะเพิ่มรายละเอียดให้กับ output เพื่อแยกว่าอันไหนใช้ได้หรือไม่ได้
- 10.10.138.234 คือ IP ของเว็บเป้าหมาย
- http-post-form คือ method ที่ใช้ของเราจะเป็น post ที่เราดูมาจาก source code
- “/login.php:pin=^PASS^:Access denied” ในส่วนนี้จะแบ่งด้วยสัญลักษณ์ :
— ส่วนที่ 1.login.php คือ หน้าที่เช็กว่า Password หรือ PIN ของเราถูกไหมเมื่อเรากด “CONTINUE”
— ส่วนที่ 2.pin=^PASS^ คือ ส่วนที่ hydra จะเอารหัสผ่านภายในไฟล์มาใส่ในตัวแปล pin ที่เราเจอใน source code
— ส่วนที่ 3.Access denied คือ ส่วนที่ระบุว่าเมื่อทำการ login failed จะมีการแสดงข้อความนี้เกิดขึ้น
- -s 8000 คือ port ของเว็บ
เมื่อเราลองรัน hydra จะได้ผลลัพธ์ ดังนี้
เราจะเห็นว่าเมื่อทำการ login ไม่สำเร็จเว็บจะ redirect ไปยัง URL “http://10.10.138.234:8000/error.php” และบรรทัดสีเขียวคือ Password หรือ PIN ที่ถูกต้องในที่นี้คือ “6F5” เมื่อเราเอาไปใส่ในหน้าเว็บจะได้หน้าเว็บใหม่ดังรูป เมื่อเรากดปุ่ม “Unlock Door” จะได้คำตอบของโจทย์ข้อนี้
Lab ข้อที่สองก็จะจบลงเท่านี้
เป็นอย่างไรกันบ้างครับสำหรับตัวอย่าง Lab ที่ผมนำมาอธิบายและทำให้ดูเป็นตัวอย่าง โดยโจทย์ที่ผมนำมาจะเป็นเรื่องเกี่ยวกับแชทบอทที่ผมเริ่มมีการใช้มากขึ้นว่าทำอย่างไรจะโจมตีช่องโหว่ได้ และ Brute force เพื่อหารหัสหากสนใจที่จะทำโจทย์เพิ่มเติมในอีเว้นต์ Christmas นี้สามารถไปทำได้ที่ “https://tryhackme.com/room/adventofcyber2023#” ในแต่ละข้อจะมีการให้ข้อมูลเพิ่มเติมเกี่ยวกับข้อนั้น ๆ สำหรับวันนี้ผมขอตัวลาไปก่อน ไว้พบกันใหม่อีกครั้ง ขอบคุณครับ