Nebula เลเวล 00: หาโปรแกรม SUID ทดสอบยกระดับสิทธิ์แบบง่าย ๆ

Pichaya Morimoto
2 min readMay 27, 2016

--

จากบทความที่แล้วเราพูดถึงเรื่องสิทธิ์ของไฟล์และ SUID bit กันไปแล้วว่าคืออะไร อาจมีช่องโหว่ได้ยังไง มาลองเริ่มต้นง่าย ๆ กับ Nebula เลเวล 00 กันครับ

เมื่อดาวโหลด exploit-exercises-nebula-5.iso มาจากหน้าเว็บแล้ว ติดตั้งลงบน hypervisor สักตัว เช่น VMWare หรือ VirtualBox ส่วนตัวผมใช้อันหลังนะครับ แล้วตั้ง network interface เป็น host-only แล้ว ssh เข้าไปครับ (sshd เปิดไว้โดยอัตโนมัติใน Nebula) คราวนี้มาดูด่านแรกเลเวล 00 กันว่าเค้าให้เราทำอะไร?

ในเลเวลนี้สิ่งที่เราจะต้องทำอย่างแรกคือ ล็อคอินด้วยชื่อผู้ใช้ level00 รหัสผ่าน level00 บนเครื่อง nebula ครับ ของที่ผมลงไว้ตั้ง network interface เป็น host-only ชื่อว่า vboxnet0 ซึ่ง ifconfig ในเครื่อง VM host ดูได้ไอพีตัวเองเป็น 192.168.99.1 และ DHCP ของ VirtualBox เริ่มแจกไอพีที่ .100 ดังนั้นผมจึง ssh เข้าไปที่ไอพี 192.168.99.100 ของเครื่อง VM guest ที่เป็นตัว Nebula ครับ

$ ssh level00@192.168.99.100

ต่อมาก็หาว่ามีโปรแกรมใดบ้างในเครื่องที่มีการตั้งค่า SUID bit ของ user flag00 ไว้

ใน ลินุกซ์จะมีโปรแกรม find เอาไว้ค้นหาไฟล์ และมี ออฟชั่น -perm ให้เรากำหนดสิทธิ์ของไฟล์ที่จะหาได้ และออฟชั่น -user ระบุเจ้าของไฟล์ครับ ดังนั้นผมเลยรันคำสั่ง

$ find / -perm -u+s -user flag00 2>/dev/null

มาดูกันทีละส่วนครับ

  • find คือโปรแกรมในลินุกซ์เอาไว้ค้นหาไฟล์
  • / คือตำแหน่งจุดที่จะเริ่มทำการค้นหา คือนอกสุดของ file system
  • -perm คือออฟชั่น กำหนดสิทธิ์ของไฟล์ที่จะหา
  • -u+s คือเป็นสิทธิ์ SUID bit ของ เจ้าของไฟล์ (u:user)
  • -user flag00 คือ หาไฟล์ที่มีเจ้าของเป็น user ชื่อ flag00
  • 2>/dev/null คือ ถ้ามันมี ข้อความ error ว่าไม่มีสิทธิ์อ่านไฟล์หรือเข้าไป directory ไหนก็ไม่ต้องแสดงออกมาบนหน้าจอนะ (2 คือ stderror ให้ส่งไป /dev/null คือ ไฟล์ black hole ของลินุกซ์ส่งอะไรไปก็หายหมด)

ผลที่ได้คือ

level00@nebula:~$ find / -perm -u+s -user flag00 2>/dev/null
/bin/.../flag00
/rofs/bin/.../flag00

จะเห็นว่า เจอไฟล์ชื่อน่าจะเป็นคำตอบของข้อนี้คือข้อ level00 สิ่งที่เราต้องหาก็คือ flag00 ใช่ไหมครับ? ลองเช็คสิทธิ์ของไฟล์นี้ดู

$ ls -lha /bin/…/flag00
-rwsr-x — — 1 flag00 level00 7.2K Nov 20 2011 /bin/…/flag00

จะพบว่าไฟล์ flag00 เป็น SUID bit (rws) ที่เป็นเจ้าของโดย flag00 ทำให้เราซึ่งเป็น user level00 ที่อยู่ในกลุ่มของไฟล์ มีสิทธิ์รันไฟล์ (r-x) สามารถ รันไฟล์ (x:execute) ด้วยสิทธิ์ของเจ้าของ (flag00) ได้ครับ

level00@nebula:~$ /bin/…/flag00
Congrats, now run getflag to get your flag!
flag00@nebula:~$

เมื่อรันไฟล์ปุ๊บ จะเห็นว่ามีการ spawn shell ของ user flag00 ออกมา! จากตอนแรกเราเป็น level00 เราได้ยกระดับสิทธิ์เป็น flag00 แล้วครับ จากนั้นเค้าบอกว่าให้ลองรัน คำสั่ง getflag ดู

flag00@nebula:~$ getflag
You have successfully executed getflag on a target account
flag00@nebula:~$

สำเร็จ เสร็จสิ้นภารกิจแรกง่าย ๆ ครับ สรุปในภารกิจนี้สิ่งที่เราได้ทดลองคือ การใช้งานโปรแกรมที่มีการตั้งสิทธิ์แบบ SUID ที่เรียกโดย user level00 แต่ทำให้เรากลายเป็น user flag00 ได้เพราะตัว โปรแกรม นี้มันเปิด /bin/sh ตรง ๆ เลย แล้วพอเปิดด้วย SUID bit ทำให้เกิดด้วยสิทธิ์ของ flag00 ทำให้เราได้ shell ของ flag00 ครับ อีกอย่างคือให้ลองใช้คำสั่ง find ในการหาโปรแกรมที่ถูกตั้งค่า SUID bit ในระบบลินุกซ์ได้ ซึ่งในสถานการณ์จริง ๆ โปรแกรมที่ตั้ง SUID bit มันคงไม่ได้ spawn shell ให้เราง่าย ๆ แบบนี้อาจจะเป็นท่าอื่น แต่อย่างน้อยเราก็รู้วิธีหาให้เจอก่อนที่จะหาทาง spawn shell แล้วนะครับ ;]

เพิ่มเติมคือ ถ้าเราไม่รู้ละว่า find ใช้ยังไง จะหาได้ยังไง วิธีคือลอง รันคำสั่ง

$ man find

ดูแล้วพิมพ์ /suid เป็นการค้นหาคำว่า “suid” ในคู่มือ (man = manual) ของคำสั่ง find ครับก็จะเจอคำอธิบายอย่างละเอียด พร้อมตัวอย่าง

man find

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

--

--