หลังจากห่างหายไปนานวันนี้ผมก็ได้มีโอกาสกลับมาเขียนบทความอีกครั้งในหัวข้อ Android Hacking ช่วงที่หายไปนั้นผมก็ได้ทำกิจกรรมฝึกปรือในหลายๆเรื่อง กิจกรรมที่เกี่ยวข้องกับบทความนี้ก็คงจะเป็นเข้าร่วมอบรม Java/Android Secure Coding ของ ThaiCERT ต้องขอขอบคุณไว้ ณ ที่นี้ด้วยสำหรับกิจกรรมดีๆและให้โอกาสผมได้เข้าร่วมอบรม 🙂
เรามาเริ่มจากทำความเข้าใจสภาปัตยกรรมของ Android กันก่อน
เอาแบบง่ายๆ Android ก็คือ Linux ในส่วนของ Libraries พวก Daemons และ Services ถูกพัฒนาขึ้นมาด้วยภาษา C /C++ เพื่อให้มีประสิทธิภาพในการทำงานที่ดีแต่ในส่วนของ Applications พัฒนาด้วย JAVA โดยทั่วไป Android ถูกใช้สำหรับ Client-Side ฉะนั้นการโจมตีในส่วน Client-Side บน Personal Computer สามารถนำมาประยุกติ์โจมตีบน Android ได้เริ่มตั้งแต่ Fake Access Point, Browser Exploitation, Social Engineering, Man in the middle, และอื่นๆรวมทั้งฟิวเจอร์ที่มีเฉพาะโทรศัพท์เช่น โจมตีช่องโหว่ SMS Services หรือใช้เครือข่าย SMS เป็นช่องทางในการควบคุม Malware
นอกจากนั้นยังมีการโจมตีที่มีรายละเอียดทางเทคนิคซับซ้อน เช่น โดยทั่วไปเมื่อเราทำการติดตั้ง Application ลงบน Android จะมีการสร้าง User และ Group ใหม่ขึ้นมาให้สำหรับ Application นั้นเพื่อควบคุมสิทธิการทำงานของ Application นั้นๆ ให้คิดภาพเหมือน Android คือ Linux เพื่อควบคุมไม่ให้ Malware Application สามารถเข้าถึงข้อมูล Application อื่นๆเช่น Email , Gmail, Facebook เพื่อทำการขโมยข้อมูลได้ ซึ่ง Application เหล่านั้นได้เก็บ Password ของผู้ใช้ไว้ด้วยในรูปแบบ Plaintext *0* ตามรูป
แต่เมื่อผู้ใช้ทำการ Root เครื่องตัวเอง นั้นก็หมายความว่า Application ที่ทำงานสามารถขอใช้สิทธิ Root ได้ โดยทั่วไปเมื่อเรา Root เครื่องจะได้ Application ชื่อ Superuser มาไว้จัดการว่าเราจะให้ App ไหนใช้สิทธิ Root บ้างแต่ในจุดนี้สามารถถูก bypass ได้ไม่ยากด้วยหลายเทคนิคที่ Malware ใช้เพราะฉะนั้นเมื่อ Root แล้วก็คือ Root และเมื่อ Malware ได้สิทธิ Root ก็ Game Over เพราะ Hacker สามารถเข้าถึงข้อมูลทั้งหมดของผู้ใช้และส่งข้อมูลกลับไปหา Hacker ข้อมูลนั้นก็ได้แก่พวก Password ต่างๆนั้นเอง
ทั้งนี้เรื่องความปลอดภัยของ Android นั้นนอกจาก Malware App แล้วจุดอ่อนยังสามารถเกิดจาก Application ที่เขียนมาไม่ดีพอเช่น E-Banking App ที่ไม่มีการโชว์ URL หรือใช้ SSL ที่ถูกต้องก็เป็นจุดอ่อนในการถูกโจมตีรวมทั้งเทคนิคการนำ Application มาแก้ไขแล้ว recompile กลับไปเป็น APK เพื่อหลอกผู้ใช้ให้คิดว่าเป็น App จริงแต่ที่จริงแล้วใน App นั้นแฝงด้วย Malicious Code จริงๆแล้วเราอาจเคยใช้ App พวกนี้โดยไม่รู้ตัวเช่น App เกมส์หรือโปรแกรมที่ Crack ให้เราใช้ฟรี แต่จริงๆแล้วไม่มีใครรู้ว่ามีการฝัง Malicious Code หรือไม่จนกว่าจะมีการ Analysis
หลังจากเกลิ่นมานานเรามาเข้าเรื่องกันเถอะ > <” ในส่วนของบทความนี้เราจะเน้นไปในส่วนของการ Crack Application นั้นเองตามที่ได้กล่าว Application ที่ทำงานบน Android จะทำงานบน Dalvik virtual machine ซึ่งก็เป็นที่ๆ Dalvik Bytecode ทำงานนั้นเองและถ้าถามว่า Dalvik Bytecode ได้มาจากไหนก็ได้มาจากการ Compile ไฟล์ .java นั้นเอง เพื่อให้เห็นภาพเราจะมาดูตัวอย่างกัน
ในมุมมองของ Application Developer :
ถ้าเราจะเขียน Android App ขึ้นมาซัก App ก็เริ่มจากเขียน Code
โดยใน App นี้ผมจะเขียนให้มันรับค่า Username กับ Password ถ้าตรงกับที่ผมกำหนดไว้ก็ให้เปิด SecretActivity ขึ้นมาถ้าไม่ตรงก็ให้แสดงข้อความว่า Login Failed หลังจากนั้นเราก็ Build ไฟล์ APK เพื่อนำไปติดตั้งบน Android แล้วใช้งานต่อไป ได้ผลการทำงานตามรูป
ในมุมมองของ Cracker :
ในมุมมองของ Cracker นั้นสิ่งที่ได้มาก็คือตัว App ที่ Build เป็น APK มาพร้อมใช้งานแล้วซึ่งจริงๆแล้วไฟล์ .apk ก็เป็น archive ไฟล์แบบหนึ่งนั้นเอง สามารถใช้ Winrar, Winzip, … ในการเปิดดูหรือ Extract ข้อมูลภายในออกมาดูได้ ตามรูป
แต่เราจะเห็นว่าพวกไฟล์ XML ยังไม่ได้อยู่ในรูปแบบที่อ่านได้อย่างถูกต้อง สำหรับส่วนของ res หรือ Resource นั้นสามารถใช้ได้แต่ไฟล์ที่เราสนใจก็คือ classes.dex ซึ่งเก็บ dalvik bytecode ไว้นั้นเองผมลองทดสอบเปิดดูด้วย hexedit
ซึ่งในส่วนของ ASCII นั้นมี String ที่ผมใช้เป็น username และ password ปรากฏอยู่ด้วย 😛 ในกรณีที่ App มีความซับซ้อนนั้นเราก็สามารถ Disassemble Dalvik Bytecode ให้อยู่ในรูปที่เราสามารถอ่านได้ง่ายขึ้นโดยผมใช้ apktool ในการทำส่วนนี้
หลังจากที่เรา Disassembly เราก็จะเห็นว่าไฟล์ XML อยู่ในรูปแบบที่ถูกต้องรวมทั้งได้ไฟล์ .smali ที่ภายในมี Dalvik Opcodes เราสามารถศึกษา Opcode ของ Dalvik ได้จากเว็บ http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
สิ่งที่เราสนใจในการ Crack ครั้งนี้ก็คือการค้นหา String Username และ Password ซึ่ง Opcode ที่เราสนใจก็คือ const-string vx,string_id ซึ่งก็คือคำสั่งการเอา String ไปเก็บไว้(Reference)ที่ Register vx นั้นเองเพื่อให้เห็นภาพเรามาลองกันเลย
ในรูปข้างบนนี้คือ String ทั้งหมดที่อยู่ใน HackmeActivity ซึ่งผมลองเช็คกับ Code ต้นฉบับที่ผมเขียนก็ปรากฏว่าตรงกันครบทุกอัน *0* จากในรูปนี้เราก็คงเดาได้ว่า Username คือ admin และ Password คือ p@ssw0rd หลังจากนั้นลองนำมา Login ได้ผลตามรูป
แล้วจะป้องกัน Application ที่ตัวเองพัฒนาอย่างไร ? นี่คงเป็นคำถามต่อมาหลังจากได้อ่านบทความนี้ 🙂
สำหรับวิธีป้องกันนั้นก็เหมือนกับการพัฒนา JAVA App บน PC นั้นแล พวก Obfuscation, Symmetric Cryptography เหมือนจะไม่ใช่ทางออกที่ดี ทางออกที่ถูกต้องก็คือเมื่อต้องการทำบางอย่างที่สำคัญให้ทำในฝั่ง Server-Side และใช้ Asymmetric Cryptography
สำหรับผู้ที่สนใจอยากทดลอง สามารถโหลด Android App ที่ผมเขียนและ Tools ได้ข้างล่างครับ
1.) Hackme Android Application:
http://dl.dropbox.com/u/17406552/Hackme.apk
2.) Android Apktool:
https://code.google.com/p/android-apktool/
***บทความจาก Blog เก่าเขียนเมื่อ 06/2012***
References :
1.) http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
2.) https://developer.android.com/index.html
3.) https://code.google.com/p/android-apktool/
4.) http://elinux.org/Android_Architecture