Reverse Engineering Linux Shell Script: A Guide to Decoding Shell Scripts (Newbie) - Part 1

Reverse Engineering Linux Shell Script: A Guide to Decoding Shell Scripts (Newbie) - Part 1
Photo by Arget / Unsplash

ผมไม่ได้เขียน blog ของตัวเองมานานมากน่าจะเกือบปีหลังจากช่วงนี้ยุ่งๆหลายๆอย่าง

เนื่องจากผมเองก็ปรับปรุง Server ที่รัน Service และพวก Docker ต่างๆบ่อยทำให้ตัว Blog เก่าผมเองก็ไม่ได้ Backup ไปด้วย (ลืมนั่นแหละครับ ฮ่าๆ)

บล็อกนี้เองผมเลยจะมา Reverse Engineering ของ Linux Shell Script ที่ผมสนใจว่ามันทำงานยังไง

โดยที่ผมจะเอามาเป็นตัวอย่างคือ Shell Script ที่เอาไว้ Crack Software License ของ Hosting Management ต่างๆว่ามันทำงานยังไงกัน มีการป้องกันยังไงกัน แล้วเราจะดูการทำงานของมันยังไง ถ้า Shell Script ถูก Compile เป็น Binary ไปแล้ว

** คำเตือน การใช้ Cracking Software มีความเสี่ยงต่อความปลอดภัยและอาจถูก Remote Access เข้ามาในคอมพิวเตอร์หรือเซิร์ฟเวอร์เราได้ ผมเลยอยากเอามางัดแงะให้ดูว่ามันทำอะไรกับระบบเราบ้าง **

Step 1:  ไฟล์แรกที่เราได้รับจากเขาจะชื่อ pre.sh ไฟล์นี้จะถูก Encrypt ด้วย Blind Bash ซึ่งเหมือนใส่กุญแจมา แต่ลืมล็อคกุญแจ เพราะอะไรหน่ะหรอ ...

จะเห็นว่ามัน Encrypt ตัว Shell Script ไว้แล้วก็ใช้ eval รันอีกที แต่เอ๊ะ ถ้าเราเปลี่ยนจาก eval เป็น cat ล่ะ?

ผ่ามมม อยู่ๆก็ได้ Original Shell Script มาเลย แต่มันไม่จบน่ะสิ..

จะสังเกตว่า Script นี้จะไปดาวน์โหลดไฟล์ที่ชื่อ RCUpdate มาอีกทีแต่ความยากเริ่มขึ้นแล้วสินะ

จะเห็นได้ว่าไฟล์ Shell script มันถูก compile ไปแล้ว แต่ยังพอเห็นร่องรอยของ string ที่หลงเหลืออยู่บ้าง ผมเลยจะใช้คำสั่ง

strings RCUpdate

เพื่อดูว่ามันมี String อะไรพอให้เราตามได้บ้าง

พอลองๆดู String เราจะเห็นตัวเลขชุดนึง ทีคล้ายๆกับ IPv4

อ๋าา ใช่จริงๆด้วย ทีนี้เราพอสันนิษฐานได้ว่าไอพีนี้กับร่องรอย String ที่เราเจอเนี่ย มันยากที่เราจะตามได้ว่ามันทำอะไรต่อ

เราจึงต้องเอาสคริปนี้ไปรันจริงๆ แต่ผมจะรันใน test environment เพื่อความปลอดภัย

โดยผมจะสร้าง VPS มาเครื่องนึงบน DigitalOcean เพื่อใช้แกะรอย Script นี้กัน

โดยปกติแล้วเวลาผมจะ Reverse Engineering อะไรบางอย่างผมจะใช้ IDA Pro เป็นหลัก

แต่มาคราวนี้มันเป็น Shell Script แล้วอยากรู้ว่ามันทำงานยังไงบ้าง IDA Pro คงไม่ตอบโจทย์เท่าไหร่ เราจึงต้องใช้วิธีการ Debugging มันซะเลย

โดย Tools ที่ผมจะใช้คือ strace นั่นเอง โดย strace นั่นจะเอาไว้ Debug Linux Sofrware / Shell script นั่นเอง ตามอ้างอิงของ Wikipedia

"strace is a diagnostic, debugging and instructional userspace utility for Linux. It is used to monitor and tamper with interactions between processes and the Linux kernel, which include system calls, signal deliveries, and changes of process state."

เอาละ มาสร้าง Server สักตัวมารันสคริปนี้กัน

จากนั้นก็โหลดไฟล์มารันแล้วรันด้วยคำสั่ง
strace -f -e trace=all -s 65535  filename

ดูกัน

เอ๊ะ ........ 🤭🤭🤭🤭

จาก trace execve เราจะเห็นว่า Shell Script ออกมาแบบเหมือน Original เลยทั้งๆที่ Compile มาแล้วนั่นเอง

ทีนี้ผมอยากดูแค่ Shell Script นั้นทำไงดี ก็เลยรันคำสั่ง

strace -f -e trace=execve -s 65535 filename

โอเค ทีนี้ผมอยากให้มันเอาออกมาเป็นไฟล์ได้ไหมนะ

สรุปว่าได้ !!!

สังเกตุว่าไอพีที่เราเห็นใน String ชุดก่อน ก็อยู่ใน Script นี้จริงๆ

แต่เกมยังไม่จบบบบ ยังมีที่ผมสนใจอีก

นั่นคือตัว Plesk นั่นเอง

แต่เกมเริ่มไม่ง่ายแล้วสิ

เพราะสคริปตัวต่อไปเราแทบหา String ที่พออ่านได้ไม่ได้เลย

ผมเริ่มลังเลว่า เราจะตามรอยมันได้ไหมนะ

จากที่สังเกตแล้ว สคริปนี้จะไปดาวน์โหลดไฟล์มา แล้ว save ลงใน /usr/local/RCBIN/bin/

ผมเลยลองเอาไฟล์นี้มาเปิดดูซิ จะได้ไหมนะ

แต่เอ๊ะ Salted_xxxxx งั้นริ แสดงว่า Encrypt มาน่ะสิ แต่ถ้าแบบนี้แล้ว แสดงว่าเราก็ต้องตามรอยการ Decryption มันได้น่ะสิ

ฮั่นแน่ ทีนี้ก็ไม่ยากแล้วล่ะสิ...

เราก็จะก็จะใช้คำสั่งนั้นในการถอดรหัสไฟล์ที่สคริปนั้นใช้คือ

openssl aes-256-cbc -md md5 -in filename \

-out output_filename -d -pass xxxxxx

โอเคเรียบร้อย ได้ออกมาเป็น output.php ทีนี้ผมจะลองมาดูว่ามันทำงานยังไงต่อ

แต่เหมือนว่าจะไม่ง่ายแล้วสิ PHP ไฟล์นี้ถูก Encrypt ด้วย SourceGuardian

แต่เราจะไม่จบแค่นี้ ตามต่อ Part 2 เร็วๆนี้ค้าบบบ