Nebula เลเวล 06: ลองแคร๊กรหัสผ่าน Unix-Crypt

Pichaya Morimoto
3 min readJun 1, 2016

--

ข้อนี้โจทย์บอกว่า user flag06 ใช้ชุดรหัสผ่าน จากระบบแบบเก่า บอกแบบนี้แสดงว่า ให้เราหาชุด รหัสผ่านนั้น พร้อมกับถอดรหัสออกมา?

ผมก็ลองล็อคอินเข้าไป user level06 รหัส level06 ครับ เข้ามาตรวจสอบที่ /home/flag06/ ก็ไม่พบอะไร น่าสนใจเลยครับ ไฟล์ทุกอย่างเป็นค่า default หมด

$ ls -lha /home/flag06/
total 5.0K
drwxr-x--- 2 flag06 level06 66 Nov 20 2011 .
drwxr-xr-x 1 root root 240 Aug 27 2012 ..
-rw-r--r-- 1 flag06 flag06 220 May 18 2011 .bash_logout
-rw-r--r-- 1 flag06 flag06 3.3K May 18 2011 .bashrc
-rw-r--r-- 1 flag06 flag06 675 May 18 2011 .profile

จากนั้นเนื่องจากข้อนี้เกี่ยวกับ รหัสผ่าน แต่เราจะเช็คที่ /etc/shadow ไม่ได้แน่ เพราะไม่มีสิทธิ์อ่าน ผมเลยไปเช็คแค่ที่ /etc/passwd ดูพบว่า

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
[...]
level06:x:1007:1007::/home/level06:/bin/sh
flag06:ueqwOCnSGdsuM:993:993::/home/flag06:/bin/sh

level07:x:1008:1008::/home/level07:/bin/sh
flag07:x:992:992::/home/flag07:/bin/sh
level08:x:1009:1009::/home/level08:/bin/sh
flag08:x:991:991::/home/flag08:/bin/sh
[...]

ที่ user flag06 มีการเก็บค่า น่าสนใจ ไว้ที่ column ที่ 2 ครับ ปกติตรงนี้จะเป็นที่เก็บ รหัสผ่านที่ hashed ไว้แล้ว ซึ่งส่วนมากค่านี้จะเป็น x ซึ่งหมายถึงให้ไปอ่านรหัสผ่านที่ hashed เก็บในไฟล์ /etc/shadow แทนจะเก็บไว้ในตรงนี้เพราะไม่งั้นใครก็อ่านได้ ปรากฏว่าของ user flag06 ดันมีค่าประหลาดนี้อยู่ ทำให้ user level06 ที่มีสิทธิ์อ่านไฟล์ /etc/passwd สามารถนำค่ารหัสผ่านที่ hashed ไว้แล้วนี้ไปทำการ crack ได้ครับ

ลองแคร๊กกกันเลยดีกว่า..

  1. ก่อนจะ crack ผมนำค่าที่ได้ไปตรวจสอบก่อนว่าเป็น hash ประเภทอะไรนะครับ โดยใช้โปรแกรมชื่อ hashid ในลินุกซ์ Kali มี
root@kali:~# hashid ueqwOCnSGdsuM
Analyzing 'ueqwOCnSGdsuM'
[+] DES(Unix)
[+] Traditional DES
[+] DEScrypt

พบว่ามีความเป็นไปได้สามอย่างนะครับ ซึ่งสามอย่างนี้มันก็ประเภทเดียวกันนะครับ ผมขอเรียกว่า Unix DES ละกัน มันถูกสร้างได้จากฟังก์ชัน crypt() เราสามารถที่จะดูรายละเอียดได้จาก

$ man crypt
[...]
crypt() is the password encryption function. It is based on the Data Encryption Standard algorithm with variations
intended (among other things) to discourage use of hardware implementations of a key search.

[...]

ถ้าตามไปดูเพิ่มอีกจาก wikipedia เกี่ยวกับ Crypt (C) จะพบว่า

ค่าที่เราได้ ueqwOCnSGdsuM มีความยาว 13 ตัวอักษร เท่ากับความยาว ของตัวอย่างใน crypt โดยใช้ DES ที่เป็นค่า Kyq4bCxAXJkbg ความยาว 13 ตัวอักษร และมีการอ้างอิงถึงว่ามีการใช้ในระบบ Unix แต่มีความอ่อนแอสามารถโดน recovery key ได้ง่าย ดังนั้นจึงสรุปได้ว่าน่าจะเป็นอันเดียวกันนะครับ

2. ปกติจะแคร๊กรหัสผ่าน ผมก็นึกถึงอยู่สองค่ายคือ hashcat กับ john-the-ripper (john) ทีนี้ผมก็ลองหาว่าใครแคร๊ก Unix DES ได้บ้างเริ่มจาก hashcat ก่อน

root@kali:~# hashcat -h |egrep -i "des|unix"* Attack modes:500 = md5crypt, MD5(Unix), FreeBSD MD5, Cisco-IOS MD51800 = SHA-512(Unix)7400 = sha256crypt, SHA256(Unix)

ปรากฏว่าของ hashcat ไม่มีนะครับ เลยลองมาดูฝั่ง john บ้าง

root@kali:~# john — list=formats |egrep -i "des|unix"descrypt, bsdicrypt, md5crypt, bcrypt, scrypt, LM, AFS, tripcode, dummy,

ปรากฏว่า john มีการรองรับ descrypt ซึ่งถ้าเลื่อนขึ้นไปดูผลลัพธ์จาก hashid ก็จะพบว่า descrypt ก็เป็นอีกชื่อนึงของเจ้า Unix DES ที่ผมเรียกนั้นแหละ

3. ลงมือแคร๊ก!

root@kali:~# echo "ueqwOCnSGdsuM" > flag06_descrypt.txt
root@kali:~# john --format=descrypt flag06_descrypt.txt
Using default input encoding: UTF-8
Loaded 1 password hash (descrypt, traditional crypt(3) [DES 128/128 SSE2-16])
Warning: OpenMP is disabled; a non-OpenMP build may be faster
Press 'q' or Ctrl-C to abort, almost any other key for status
hello (?)
1g 0:00:00:00 DONE 2/3 (2016-06-01 11:00) 5.882g/s 24094p/s 24094c/s 24094C/s 123456..Pyramid
Use the "--show" option to display all of the cracked passwords reliably
Session completed

ผม echo ค่า Unix DES hash ไปใส่ในไฟล์ flag06_descrypt.txt แล้วบอก john ให้

  • --format=descrypt คือเลือกชนิดของ hash ที่จะแคร๊กเป็น descrypt

แล้วกำหนดไฟล์ ที่เก็บ hash ไว้คือ flag06_descrypt.txt ครับ จริง ๆ เราอาจจะใส่ -w เป็น wordlist ของเราเองถ้ามีก็ได้ ผลคือ john สามารถแคร๊กออกมาให้เราว่า ค่าของ ueqwOCnSGdsuM โดนแคร๊กออกมาได้เป็นคำว่า hello ครับ อาจจะดูยากนิดนึง จากนั้นก็แค่ลอง login flag06 ด้วยรหัสผ่านที่เราแคร๊กมาได้ครับ

level06@nebula:~$ id
uid=1007(level06) gid=1007(level06) groups=1007(level06)
level06@nebula:~$ su flag06
Password:
sh-4.2$ id
uid=993(flag06) gid=993(flag06) groups=993(flag06)
sh-4.2$ getflag
You have successfully executed getflag on a target account

จะเห็นว่าเราสามารถ เข้าถึง user flag06 จาก user level06 ได้ด้วยการแคร๊กรหัสผ่านในเลเวลนี้ครับ บทเรียนนี้สอนให้รู้ว่า อย่าเก็บค่า hash ไว้ในที่ ๆ ใคร ๆ ก็มีสิทธิ์อ่านได้อย่างไฟล์ passwd เพราะว่าอาจจะโดนนำไปแคร๊กได้ ยิ่งตั้งรหัสผ่านง่าย ๆ เช่นนี้ละสบายแฮกเกอร์เลยละ

ที่มา: https://exploit-exercises.com/nebula/level06/

--

--