Anda di halaman 1dari 3

Pemograman Socket di PHP Part I

PHP biasanya digunakan untuk mengintegrasikan penggunaan database pada web interface, atau untuk kemudahan fungsi built-in nya saat mengakses service IMAP, POP dan sejenisnya. Tetapi sebetulnya ada lagi feature PHP yang menarik, yaitu penggunaan socket. Bagi mereka yang 'kreatif', mempunyai akses ke sebuah webserver dengan standard PHP enabled sama nilainya dengan mempunyai sebuah 'shell' sekaligus dengan compilernya karena kita hampir dapat mem 'porting' semua program untuk network, terutama sebagai client, ke PHP. Hampir semua program ... bahkan exploit sekalipun :). Di akhir artikel ini penulis akan memberikan link ke contoh sebuah PHP script lama yang dibuat penulis untuk educational purpose dan berfungsi sebagai semacam 'Penetration Testing' untuk portscan, sampai tingkat eksploitasi memanfaatkan bugs yang sepertinya sudah kadaluarsa :P. Itulah mengapa disarankan bagi PHP web provider untuk memanfaatkan konfigurasi PHP lewat php.ini dalam memilih mana service yang betul-betul perlu dan mana yang tidak. Berikut step-step umum untuk mengestablished TCP connection (sebagai client) via PHP script. 1. Memulai koneksi Terlebih dahulu kita harus mengalokasikan sebuah socket: $ip = "127.0.0.1"; $port = 21; $fp = fsockopen("$ip", $port, &$errno, &$errstr); variabel ip adalah IP address atau hostname dari server / target koneksi kita, 'port' adalah port number yang kita ingin tuju. pada contoh di atas kita akan melakukan koneksi tcp ke sebuah server ftp. 2. Definisikan jenis mode koneksi set_socket_blocking($fp, true); dengan mengeset nilai 'true', berarti bahwa kita harus menunggu packet yang datang dari server yang dituju tersedia lebih dahulu di socket yang sudah di alokasikan di atas untuk di 'ambil' oleh fungsi yang membaca data dari socket, seperti fungsi 'fgets()'. Apabila nilai ini kita set menjadi 'false' maka fungsi fgets() akan langsung membaca socket tanpa harus menunggu datanya tersedia lebih dahulu. 3. Error checking if(!$fp) { echo "$errstr ($errno)<br>\n"; } PHP sudah menyediakan vaiabel yang menampung status berhasil atau tidaknya koneksi di buat yaitu lewat variabel '$errstr' dengan nomer pesan status '$errno'. Semuanya di lakukan oleh fungsi fsockopen() di atas. 4. Established koneksi Apabila semua ok, kita tinggal melakukan operasi, baik itu write atau read pada socket tersebut 4.1 Write / menulis data ke socket fputs($fp,"user ftp\n"); fputs($fp, "pass mypass\n");

fputs($fp, "pwd\nquit\n") ; menulis data ke socket bisa dilakukan lewat fungsi 'fputs()'. pada contoh di atas, sekaligus kita mengirim empat perintah ke server tujuan yaitu memasukkan username & password, memberi perintah 'pwd' dan perintah 'quit'; 4.2 Read / membaca data dari socket while(!feof($fp)) { echo fgets($fp,128); echo "<br>\n"; } fungsi fgets() digunakan untuk membaca data dari packet yang datang ke socket. fungsi feof() akan mendeteksi saat packet yang di terima mengandung tanda end-of-file atau termination. itulah mengapa pada saat kita menulis data pada bagian 4.1 kita menambahkan perintah 'quit', ingat bahwa kita sekarang menggunakan mode true untuk set_socket_blocking(), tanpa perintah 'quit' fungsi fgets() akan selalu menunggu packet tersedia di socket ! nilai 128 adalah nilai perkiraan dari besar packet yang datang pada suatu waktu. fgets() akan berhenti membaca saat nilai tersebut minus 1 tercapai (1 sisanya untuk line baru '\n'), atau saat menerima tanda eof, tergantung mana kondisi yang lebih dulu tercapai. dengan menggunakan looping seperi contoh di atas kita dapat memastikan bahwa kita menangkap semua packet yang datang. Keseluruhan contoh di atas bila digabungkan akan menjadi: <? $ip = "127.0.0.1"; $port = 21; $fp = fsockopen("$ip", $port, &$errno, &$errstr); if(!$fp) { echo "$errstr ($errno)<br>\n"; } fputs($fp,"user ftp\n"); fputs($fp, "pass mypass\n"); fputs($fp, "pwd\nquit\n") ; while(!feof($fp)) { echo fgets($fp,128); echo "<br>\n"; } ?> selesai ... sederhana ya? 5. Menginjeksi binary packet Sekarang kita beranjak ke tahap selanjutnya, yaitu bagaimana menginjeksi atau menulis data berupa binary ke socket. Pada contoh di atas kita hanya menulis data berupa plain text. Fungsi fputs() sendiri men support binary data, tinggal kita menggenerate binary data tersebut. Data yang kita write di atas bila di ubah menjadi binary (hex) formatnya seperti: $data ="user ftp\npass mypass\npwd\nquit"; $data2="\x75\x73\x65\x72\x20\x66\x74\x70\x0a\x70\x61\x73\x73\x20\x6d\x79\x70\x61\x73\x73\x0 a\x70\x77\x64\x0a\x71\x75\x69\x74\x0a"; variabel data dan data2 di atas pada dasarnya adalah sama. perhatikan format penulisan hex nya. Apa bila Anda membaca Manual PHP bagian strings, banyak sekali cara untuk mentranslate dari

character ke hexadecimal dan sebaliknya. Untuk mencoba salahsatunya kita bisa membuat script seperti ini: <? $sss="user ftp\npass mypass\npwd\nquit\n"; $hex=bin2hex($sss); $num=strlen($hex); $d=0; $b=0; $c=$num/2; for ($i=0; $i <= $c; $i++) { $sat[$d]=substr($hex, $b, 2); $b=$b+2; $d=$d+1; } $i=1; echo "\x$sat[0]"; while($sat[$i]) { printf("\x%s", $sat[$i]); $i=$i+1; } ?> dan setelah mendapatkan nilai hex dari data yang diinginkan, kita tinggal menulisnya ke socket. Untuk lebih jelasnya Anda dapat melihat-lihat PHP Manual terutama bagian network dan string. 6. Lampiran Berikut adalah script lama berupa contoh dari penggunaan socket di PHP untuk simple penetration testing berupa port scan sampai tahap exploitasi dari bugs lama yang dibuat untuk kepentingan penelitian saja. dapat di download di:

Anda mungkin juga menyukai