Bahaya dari Shellshock Bash Bug
Oleh
chmood
kemarin menjadi tanggal yang akan dikenang (halah) praktisi IT Security. Karena dilaporkannya bug pada bash (pada akhirnya disebut “shellshock”) yang efeknya lebih berbahaya daripada isu Heartbleed yang lalu. Saya juga setuju dengan pendapat yang mengatakan bug ini lebih berbahaya. Bandingkan saja, kalau Heartbleed kemarin hanya rentan di versi OpenSSL tertentu dan informasi yang diexpose nya adalah “mentahan” dump memory yang notebene harus digali-gali lagi. Sedangkan bug pada bash ini, rentan untuk semua OS yang menggunakan shell Bash (Bourne Again Shell) dan (hampir semua) network services pada server memanfaatkan bash untuk mengeksekusi command backend, jadi yang bisa kita dapatkan adalah RCE/remote command execution! Ya, istilah lain buat bug ini: backdoor massal deh hahaha. Bayangkan saja lebih dari 70% host di internet menggunakan OS *nix yang shell nya menggunakan bash. Kalau di scoring 10/10 deh ini hahah.. Okedeh, pada kesempatan kali ini saya akan menulis cerita saya ketika mendapat info bug ini dan melakukan Proof of Conceptnya. Yuk mari…
Pada awalnya, dilaporkan adanya bug pada bash dimana jika kita memanggil sebuah fungsi dan menyisipi arbitrary command, maka arbitrary command-nya juga akan tereksekusi. Berikut contoh fungsi tak bernama “()”, dengan disisipi command ‘echo What is Shellshock?’
.Pada contoh di atas, command echo ‘What is Shellshock?’ di eksekusi oleh bash
Idealnya, bash tidak mengeksekusi perintah echo ‘What is Shellshock?’ tersebut. Ternyata kenyataannya, code tersebut dieksekusi. Sebagai perbandingan, berikut bash yang telah di patch seharusnya berjalan jika diberikan input yang sama seperti di atas:
Bash yang telah di patchBash yang telah di patch
Bisa dilihat pada percobaan pada bash yang telah di patch, bash secara jelas menolak eksekusi code setelah fungsi “()”.
Mengapa Berbahaya, bukankah ini Bug Lokal alias Eksis di Bash saja? Tidak seperti Bug pada Network Service semisal Apache, Bind, dll?
Pertanyaan bagus. Sebenarnya ini juga menjadi pertanyaan saya yang hanya newbie ini, sesaat setelah membaca informasi bug di milis. Tapi setelah diteliti lebih dalam, ternyata celah remote nya bersumber dari program-program yang biasanya memanfaatkan bash untuk menjalankan perintah ke sistem. Sebut saja contohnya CGI (common gateway interface). CGI, interface yang biasa digunakan untuk mengeksekusi perintah di sisi backend web server dengan menggunakan bash.
Proof of Concept
Biar semakin jelas, berikut proof of concept yang saya lakukan 24 September lalu.
Saya membuat file.cgi yang berisi file bash yang akan mengeksekusi command “/usr/bin/id” menggunakan bash.
Nah, karena file ini menggunakan bash yang vulnerable, pada saat request file.cgi ke HTTP server /web server, saya akan menyisipkan perintah command “touch /tmp/hacked”, yang artinya menyuruh bash untuk generate file “hacked” di /tmp.
Saya memanfaatkan informasi User-Agent HTTP Client (dengan curl) sebagai celah untuk menginjeksi remote command.
Hasil PoC:
PoC Bash Vulnerability Remote Command ExecutionPoC Bash Vulnerability Remote Command Execution
Inti exploitasi ada pada baris: curl -A ‘() {:; }; /bin/touch /tmp/hacked http://localhost/cgi-bin/file.cgi. curl “-A” yaitu user-agent http client yang didefine oleh client. Kita memanfaatkan field user-agent tersebut untuk memanggil fungsi tak bernama “()”. Sebenarnya, ketika di parsing di server, fungsi itu akan bernama HTTP_USER_AGENT() karena kita ‘kan mau memanfaatkan field user-agent hehe.
HTTP_USER_AGENT () {
:;
};
/bin/touch /tmp/hacked
Pada intinya sih, tujuan jahatnya tercapai: command setelah define fungsi HTTP_USER_AGENT() yang tak lain adalah /bin/touch /tmp/hacked juga dieksekusi. Hasilnya? Muncul file “hacked” di folder /tmp. Selanjutnya terserah anda: curl -A ‘() {:; }; /bin/rm -rf /var/www http://<target>/cgi-bin/blablabla.cgi kah?. Hehehe. Liatlah betapa berbahayanya bug ini… benar-benar seperti backdoor massal di Internet!
Proof of Concept Dampak Bug Bash pada DHCP
Remote-bug “shellshock” ini tidak hanya berdampak di sisi web server saja. Karena bug ini akan berdampak ke semua service/program/script/daemon yang menggunakan bash… Contoh lainnya seperti DHCP. Pada PoC yang dilakukan oleh seorang konsultan security di internet, shellshock bisa berdampak ke DHCP client. Dengan menyisipkan function yang ditambahkan embel-embel command echo ‘foo’, command tersebut juga akan dieksekusi oleh bash. Lebih parahnya shellshock di dhcp adalah hampir semua klien akan mengeksekusi DHCP script sebagai root! Berikut ini PoC shellshock di DHCP server dengan menyisipkan function () yang ditambahkan command echo ‘foo’ di field DHCP option:
PoC Bug Bash pada DHCP
Kemudian, ada seorang klien yang request IP ke DHCP server… dan berikut hasilnya (lihat bahwa command echo ‘foo’ juga dieksekusi):
Klien DHCP Mengeksekusi Command echo ‘foo’
Bisa dibayangkan kaaan… kalau pada server DHCP nya disisipkan command untuk ‘rm -rf /*’ atau lebih lengkapnya ‘() { :; }; rm -rf /*’. Seluruh klien berbasis *nix yang connect ke si server DHCP bakalan terformat! Hahahahah…
Lalu, aku kudu piye? (Lalu, saya harus bagaimana?)
Patch per-distro sudah tersedia sesaat setelah bug bash ini diumumkan ke publik kok. Silakan update package bash dari distro masing-masing.. Walaupun pada proses patch juga ada cerita lucu dimana distro-distro sempat dua kali merilis patch dalam hitungan jam saja. Karena Tavis Ormandy, sempat melaporkan patch nya masih bisa diakalin dengan metoda lainnya, sehingga RCE kemungkinan masih bisa dilakukan. Kemudian di rilis lagi patch kedua. Hehehe.
Ladies & Gentlemen, patch your system! Now! Go! Go! GO!
FYI PoC script python untuk bug bash + CGI dengan reverse shell: http://pastebin.com/dEYQndKG
Pada awalnya, dilaporkan adanya bug pada bash dimana jika kita memanggil sebuah fungsi dan menyisipi arbitrary command, maka arbitrary command-nya juga akan tereksekusi. Berikut contoh fungsi tak bernama “()”, dengan disisipi command ‘echo What is Shellshock?’
.Pada contoh di atas, command echo ‘What is Shellshock?’ di eksekusi oleh bash
Idealnya, bash tidak mengeksekusi perintah echo ‘What is Shellshock?’ tersebut. Ternyata kenyataannya, code tersebut dieksekusi. Sebagai perbandingan, berikut bash yang telah di patch seharusnya berjalan jika diberikan input yang sama seperti di atas:
Bash yang telah di patchBash yang telah di patch
Bisa dilihat pada percobaan pada bash yang telah di patch, bash secara jelas menolak eksekusi code setelah fungsi “()”.
Mengapa Berbahaya, bukankah ini Bug Lokal alias Eksis di Bash saja? Tidak seperti Bug pada Network Service semisal Apache, Bind, dll?
Pertanyaan bagus. Sebenarnya ini juga menjadi pertanyaan saya yang hanya newbie ini, sesaat setelah membaca informasi bug di milis. Tapi setelah diteliti lebih dalam, ternyata celah remote nya bersumber dari program-program yang biasanya memanfaatkan bash untuk menjalankan perintah ke sistem. Sebut saja contohnya CGI (common gateway interface). CGI, interface yang biasa digunakan untuk mengeksekusi perintah di sisi backend web server dengan menggunakan bash.
Proof of Concept
Biar semakin jelas, berikut proof of concept yang saya lakukan 24 September lalu.
Saya membuat file.cgi yang berisi file bash yang akan mengeksekusi command “/usr/bin/id” menggunakan bash.
Nah, karena file ini menggunakan bash yang vulnerable, pada saat request file.cgi ke HTTP server /web server, saya akan menyisipkan perintah command “touch /tmp/hacked”, yang artinya menyuruh bash untuk generate file “hacked” di /tmp.
Saya memanfaatkan informasi User-Agent HTTP Client (dengan curl) sebagai celah untuk menginjeksi remote command.
Hasil PoC:
PoC Bash Vulnerability Remote Command ExecutionPoC Bash Vulnerability Remote Command Execution
Inti exploitasi ada pada baris: curl -A ‘() {:; }; /bin/touch /tmp/hacked http://localhost/cgi-bin/file.cgi. curl “-A” yaitu user-agent http client yang didefine oleh client. Kita memanfaatkan field user-agent tersebut untuk memanggil fungsi tak bernama “()”. Sebenarnya, ketika di parsing di server, fungsi itu akan bernama HTTP_USER_AGENT() karena kita ‘kan mau memanfaatkan field user-agent hehe.
HTTP_USER_AGENT () {
:;
};
/bin/touch /tmp/hacked
Pada intinya sih, tujuan jahatnya tercapai: command setelah define fungsi HTTP_USER_AGENT() yang tak lain adalah /bin/touch /tmp/hacked juga dieksekusi. Hasilnya? Muncul file “hacked” di folder /tmp. Selanjutnya terserah anda: curl -A ‘() {:; }; /bin/rm -rf /var/www http://<target>/cgi-bin/blablabla.cgi kah?. Hehehe. Liatlah betapa berbahayanya bug ini… benar-benar seperti backdoor massal di Internet!
Proof of Concept Dampak Bug Bash pada DHCP
Remote-bug “shellshock” ini tidak hanya berdampak di sisi web server saja. Karena bug ini akan berdampak ke semua service/program/script/daemon yang menggunakan bash… Contoh lainnya seperti DHCP. Pada PoC yang dilakukan oleh seorang konsultan security di internet, shellshock bisa berdampak ke DHCP client. Dengan menyisipkan function yang ditambahkan embel-embel command echo ‘foo’, command tersebut juga akan dieksekusi oleh bash. Lebih parahnya shellshock di dhcp adalah hampir semua klien akan mengeksekusi DHCP script sebagai root! Berikut ini PoC shellshock di DHCP server dengan menyisipkan function () yang ditambahkan command echo ‘foo’ di field DHCP option:
PoC Bug Bash pada DHCP
Kemudian, ada seorang klien yang request IP ke DHCP server… dan berikut hasilnya (lihat bahwa command echo ‘foo’ juga dieksekusi):
Klien DHCP Mengeksekusi Command echo ‘foo’
Bisa dibayangkan kaaan… kalau pada server DHCP nya disisipkan command untuk ‘rm -rf /*’ atau lebih lengkapnya ‘() { :; }; rm -rf /*’. Seluruh klien berbasis *nix yang connect ke si server DHCP bakalan terformat! Hahahahah…
Lalu, aku kudu piye? (Lalu, saya harus bagaimana?)
Patch per-distro sudah tersedia sesaat setelah bug bash ini diumumkan ke publik kok. Silakan update package bash dari distro masing-masing.. Walaupun pada proses patch juga ada cerita lucu dimana distro-distro sempat dua kali merilis patch dalam hitungan jam saja. Karena Tavis Ormandy, sempat melaporkan patch nya masih bisa diakalin dengan metoda lainnya, sehingga RCE kemungkinan masih bisa dilakukan. Kemudian di rilis lagi patch kedua. Hehehe.
Ladies & Gentlemen, patch your system! Now! Go! Go! GO!
FYI PoC script python untuk bug bash + CGI dengan reverse shell: http://pastebin.com/dEYQndKG
Category
Komentar