[ภาคต่อ] แฮคจาก android app จนสามารถควบคุม server หรือได้ root ของ app นั้นๆ

สำหรับบทความนี้เป็นภาคต่อของบทความ คิดจะ Hack คิดถึง Vulnhub พร้อมตัวอย่างการแฮคจาก Android App จนสามารถควบคุม Server ของ App นั้นๆ

สาเหตุที่เขียนต่อเพราะบทความที่แล้วที่ได้ robin shell นั้นจริงๆพึ่งมาถึงแค่ครึ่งทางเท่านั้นเอง!!! และยังมีเทคนิคที่น่าสนใจอีกหลายอย่างในการแฮคจนได้ root เช่น Linux binary(ELF) runtime patching, Linux x86_64 buffer overflow, และการโจมตี  *(wildcards) เนื่องจากเนื้อหาค่อนข้างยากและซับซ้อนเลยเขียนแยกมาเป็นอีกบทความครับ สำหรับสาย hardcore technical ห้ามพลาดครับ  !!

มาเริ่มกันเลยครับ !!แนะนำให้อ่านบทความเก่าก่อนเพราะเรื่องต่อกันครับ https://www.techtalkthai.com/hacking-practice-using-vulnhub-by-mayaseven/

สรุปความเดิมตอนที่แล้วคือ server เป้าหมายของเรามี users ที่เราสนใจอยู่ 3 คนคือ robin, bryan, sean ตามรูป

/etc/passwordและตอนนี้เราได้ robin shell และ password ของ robin คือ 40373df4b7a1f413af61cf7fd06d03a565a51898

หลังจากเราได้ robin shell ก็ทำการหาข้อมูลว่า robin ทำอะไรได้บ้างและมีไฟล์อะไรน่าสนใจ

Screen Shot 2559-06-29 at 15.04.21
ใน folder ของ robin มีไฟล์ debug.gpg และมีข้อมูลการ debug โปรแกรม dice

sudoers
robin สามารถใช้ sudo เพื่อ run โปรแกรม dice ด้วยสิทธิ์ของ bryan ได้

จากข้อมูลสองสิ่งนี้โจทย์ต้องการให้เราทำอะไรกับเจ้า dice เพื่อให้ได้สิทธิ์ bryan แน่นอน

diceหลังจากลอง run dice ดูพบว่ามันก็แค่แสดง output ตัวเลขออกมา rand()?

จากข้อมูล debug.gpg ที่มีการเรียก function getenv(“LD_PRELOAD”) ตรงนี้โจทย์ได้ทำการใบ้แล้ว 😀

เจ้า LD_PRELOAD environment variable มันสามารถ set ให้ load dynamic library มาก่อนเพื่อแทนที่ของจริงได้ ผลคือสามรถที่จะ override function ได้ ปกติวิธีนี้ใช้เพื่อ bypass anti-debugger รายละเอียดเพิ่มเติม https://dustri.org/b/fun-with-ld_preload.html

ทำการเขียน lib ปลอมเพื่อ override function rand() ให้ไป run /bin/bash code ตามรูป

LD_PRELOAD override functionหลังจากลองผิดลองถูกก็ได้ bryan shell ตามรูป 555+

หลังจากได้ bryan shell ก็ทำการหาข้อมูลอีกรอบ

bryan shellหลังจากหาข้อมูลก็เจอไฟล์ที่น่าสนใจนั้นคือ backup เพราะไฟล์นี้ bryan สามารถ run ได้ sean เป็น owner และมี SUID

ผมทำการโหลดไฟล์ backup มา disassemble&decompile ด้วย IDA

backupที่  system(“PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin; cd /usr/share/nginx/serverchecker/storage; /bin/tar -zvcf /home/sean/backup_$(/bin/date +\”%Y%m%d\”).tar.gz *;”);

ให้เราสังเกต ” /bin/tar -zvcf /home/sean/backup_$(/bin/date +\”%Y%m%d\”).tar.gz * ”

มองผ่านๆ จะเห็นว่าให้ทำการ compress ทุกไฟล์ใน current directory ไว้ที่ /home/sean/backup_$(/bin/date +\”%Y%m%d\”).tar.gz เพื่อ backup ปกติไม่น่ามีอะไร แต่ตรงนี้ที่มีช่องก็ตรง * นั้นละครับ !!

ยังไง ?

ให้ลองนึกว่าถ้าที่ current directory นั้นมีไฟล์ที่ตั้งชื่อเป็นพวก options ของ tar ที่ทำให้มันเข้าใจผิดละ เช่น มีไฟล์ชื่อ –checkpoint-action=exec=sh shell.sh ละ? ผลก็คือมันจะไป run ไฟล์ shell.sh ด้วยสิทธิ์ของ sean นั้นเองเพราะมีการตั้ง SUID ด้วย

--checkpointtar มี option ที่สามารถไป execute ไฟล์อื่นได้

wildcards exploitทำการ exploit *(wildcards) ด้วยการตั้งชื่อไฟล์เป็น option เพื่อไป run shell และในที่สุดก็ได้ sean shell  (ทำไมมันหลายด่านจังฟร่ะกว่าจะได้ root)

ไฟล์ที่น่าสนใจต่อมา owner เป็น root และ sean group สามารถ run ได้และมีการ set SUID นั้นคือไฟล์ restore

ตามสูตรเดิมโหลดไฟล์ restore มา debug ด้วย IDA

gets vuln

โปรแกรม restore นี้มีช่องโหว่ buffer overflow เพราะมีการใช้ function gets() ซึ่งไม่มีการ check boundaries และจากรูป มีการจองพื้นที่ไว้ 40h bytes หรือ 64 bytes นั้นหมายความว่าถ้าผู้ใช้ใส่ input มากว่า 64bytes ก็จะเกิด overflow ขึ้นโดย 8 bytes ต่อมาจะไปทับ saved rbp และอีก 8 bytes ต่อมาจะไปทับ return rip ซึ่งเราสามารถที่จะให้มัน return ไป run code ที่ตำแหน่งใดก็ได้ที่เราต้องการ(run ได้หรือไม่ได้อีกเรื่อย ถถถถถ)

execและตำแหน่งที่เราต้องการจะให้มันไปทับ return rip ก็คือ 0x401F6A ซึ่งจะทำการ call execve(“/bin/sh”) ให้เรานั้นเอง

OK ได้เวลา exploit

restoreลอง run โปรแกรม restore จะเห็นว่ามีการรับ input สองครั้ง ครั้งแรกใช้ fgets() ครั้งที่ 2 ใช้ gets() ซึ่งการรับ input ครั้งที่ 2 คือจุดที่เราจะ exploit

exploit overflow x86_64จากรูปทำการสร้าง exploit ขึ้นมาโดยสร้าง string A 72 ตัวและตามด้วย address 0x401F6A(ในรูปเป็น little-endian เรียง byte กลับกัน) เพื่อให้โปรแกรม restore return ไป call call execve(“/bin/sh”) สุดท้ายก็ได้ root shell

flag

และในที่สุดก็ได้ flag เย้ เหนื่อยสุดๆ ><” ต้องขอบคุณทีมงานที่สร้างเจ้า Flick II CTF ดีมีคุณภาพนี้มาให้เราเล่น หวังว่าเพื่อนๆคงได้เรียนรู้อะไรเยอะทีเดียว 🙂

สำหรับท่านใดที่สนใจจะศึกษาต่อเกี่ยวกับ buffer overflow ลองค้นหาอ่านใน blog ผมเขียนไว้หลายบทความเลยครับ หรือใน Hacking & Security Workshop ของผมก็มีสอนนะครับ 😀

มีข้อสงสัยหรือแนะนำติชมสามารถ comments ในนี้ได้เลยครับหรือ Facebook page: https://www.facebook.com/MaYaSeVeN-139105159494751/

buffer overflow, flick II, IDA, Privilege escalation, reverse engineering, x86_64
Previous Post
Attack-Defence CTF , Cyber Range Review
Next Post
จากหาช่องโหว่จนถึงเขียน Metasploit exploit module

Related Posts

2 Comments. Leave new

  • สิรินุช
    July 7, 2016 08:06

    โอ้โห!!!!!ยากขนาดนี้….ซื่อบรื้อ..อย่าวเราจะเรียนได้หรือนี่….อาจารย์นพ

    Reply
    • ในคอร์สอบรมเนื้อหาง่ายกว่านี้ครับ ระดับเริ่มต้นถึงกลางๆ 🙂

      Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

Fill out this field
Fill out this field
Please enter a valid email address.
You need to agree with the terms to proceed