Latest Publications

Pluggable Authentication Modules for Linux

Linux/Redhat da Su yetkisine sahip olmasini istedigimiz kullanıcılari “whell”  grubuna dahil ederek ssh baglantilari ve local uzerinde  root yetkilerini daha guvenli duruma getirebiliriz.Bu islemleri PAM’i (Pluggable Authentication Modules) devreye sokarak yapacagiz.

“PAM is an authentication layer that allows software to be written independet of a specific authentication schema. Maybe, pam is secret security on sshd service.Applications request connection via the PAM library, and the PAM library determines whether the user is allowed to prcoced.”
[root@localhost ~]# useradd remoteuser
[root@localhost ~]# passwd remoteuser
Changing password for user remoteuser.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

Sisteme remoteuser isimli yeni bir kullanıcı ekledik.Passwd dosyasin’dan konumuna bakalım:

[root@localhost ~]# cat /etc/passwd | grep 'remoteuser'
remoteuser:x:512:512::/home/remoteuser:/bin/bash

Ekledigim 512 UID nolu  kullanıcıyı “Root” kullanıcısının dahil oldugu whell isimli grububa join ettik.

[root@localhost ~]# usermod -G wheel remoteuser

Linux da tum gruplarin kayitlarinin tutuldugu /etc/group adli dosyayi check edelim.

[root@localhost ~]# cat /etc/group | grep 'remoteuser'
wheel:x:10:root,remoteuser

Root ve Remoteuser adli 2 kullanici yukarida gozukmektedir.Direk root girisini kaldırıp, “whell” grubuna dahil ettigimiz remoteuser adli kullanici ile yonetici kimlik dogrulamasi yapip  sistem de kaydi bulunan diger kullanıcılarin Su yetkisini alarak muhtemel root girislerini engelleyelim. (Pluggable Authentication Modules)

” PAM for authentication have a file in  /etc/pam.d directory. “
[root@localhost ~]# vi /etc/pam.d/su
auth           required        pam_wheel.so use_uid

pam.d dizini altindaki “Su” adli dosyayi  use_uid adli parametre’nin basinda’ki diyez isaretini  kaldirip dosyayi kaydedelim.Bu durumda; sadece whell grubu’na dahil olan kullanıcılar root girisi yapabilecek.Yukarida dikkat ettiyseniz whell grubun’da “root” kullanıcısı  da vardi.SSH baglantı ayarlarinin bulundugu konfigurasyon dosyamizi acip bundan sonraki ssh baglantilarin da yonetici olarak giris yapilan root kullanıcısını devre dısı bırakıyoruz.

[root@localhost ~]# vi /etc/ssh/sshd_config
"vi" ile /etc/ssh/sshd_config dosyasini acip asagidaki ayarlari yapiyoruz.

  • PermitRootLogin No
    #Port 22 (Diyez’i kaldirip, baglanti portunu degistirebiliriz.)
    Protocol 2

Bu durumda ssh portunu degistirip, “PAM”  hesabi ile root hesabina giris yapabiliriz. (SSH baglanti portunu Brute Force vb atak’lari engellemek icin degistirmemiz iyi olacaktir.)Ayrica sistemde ekli olan user’lar tarafindan root hesabi sifresi bilinse dahi , PAM ayarlarindan oturu erisim saglanamayacaktir.

PAM hakkında daha detayli bilgiyi Redhat’ın sitesinden inceleyebilirsiniz.

http://www.redhat.com/docs/manuals/linux/RHL-7.2-Manual/ref-guide/s1-pam-config-files.html

IPtables ile ICMP Protokolü Güvenliği

Sunucu/Server hakkında bilgi toplamak amaciyla yapilan port scanner islemlerini firewall ile bloklayabiliyoruz.
Ozellikle smtp sunuculari sadece mail alisverisi icin kullanildigindan icmp servisi filtrelenip gereksiz haberlesmeye kapatilabilir. Icmp servisi , TCP/IP mimarisi  icerisinde IP protokolunun mesajlasma,iletisim hizmetini saglamakla sekronize olmus protokoldur.
Ping ve Traceroute/Tracert parametreleri icmp servisi icerisinde yer alir.(Karsi network hakkinda bilgi sahibi olmak icin  gun icerisinde fazlaca ihtiyac duydugumuz 2 komut )

Ornegin : Traceroute komutu ile ilgili network’un hangi routerlar arasinda iletisim halinde oldugunu ogrenebiliyoruz.

Guvenlik sebebiyle ICMP Servisini dış agdan gelebilecek isteklere kapayalım.

Neden ICMP Guvenligi ?

- Bir sistem de disardan gelicek isteklere cevap veren icmp protokolu kullanilarak asagidaki atak ve  sunucu uzerinde bilgi toplama islemleri  yapilabilir.

1- Serverin listening durumunda olan  acik portlari ogrenilir.

2- Server uzerinde calisan yazilim veya daemonlarin isim ve surum bilgileri öğrenilebilir.
3- Icmp protokolune yapilabilecek Flood, Distributed DOS ataklar.

Not : Sunucu uzerinde binlerce domain varsa icmp guvenligi biraz geride tutulabilir.Bu durumda server da sadece  80,21,443 Portlari’nin dış network’e acik olmasi yeterlidir. (Dns sunucu uzerinde cozuyorsa tabiki 53. Port’un da acik olmasi gerekir. )

22 SSH
3306 NT Remote Desktop
22 ve 3306. Portlari’ni sabit network’e acilmasi gibi.

ICMP Protokolü Güvenligi

Linux RHEL/Centos uzerindeki IPtables ile  icmp kontrolu  icin gerekli rule’leri yazip dıs hattan gelebilecek icmp paketlerini (echo-reply) drob edip, sabit network’e acalim. Bu islemi asagida hazirladigim basit bash scripti ile kendi mail sunucum (Postfix) uzerine uygulayacagim.

#!/bin/bash
echo 0 > /proc/sys/net/ipv4/ip_forward;
iptables -A INPUT -p icmp --icmp-type 8/0 -s 85.108.244.53 -j ACCEPT;
iptables -A INPUT -p icmp --icmp-type 8/0 -j DROP;
echo 1 > /proc/sys/net/ipv4/ip_forward;
echo "Rhel are having Icmp sec rules!";
exit 0

ilgili scripti  icmp.sh seklinde kaydettikten sonra asagidaki sekilde Iptables rule listesine yazdirabiliriz.

bt ~ # chmod 755 icmp.sh
bt ~ # ./icmp.sh

IPtables’in rule listesine eklenen kuralimiz.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     icmp --  85.108.244.53        0.0.0.0/0           icmp type 8 code 0
DROP       icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 8 code 0

Bu durum da server sadece  , 85.108.244.53 IP adresinden gelen syn isteklerine reply verecektir.

Nmap ile Port Scanner Testi

Nmap  kullanarak kendi email sunucumu scan edecegim.Amacim email sunucumdaki açık  Tcp portlari ogrenmek.

bt ~ # ping mail.ugurengin.com
PING mail.ugurengin.com (64.186.129.45) 56(84) bytes of data.

--- mail.ugurengin.com ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2012ms

bt ~ # nmap -sT 64.186.129.45

Starting Nmap 4.60 ( http://nmap.org ) at 2009-11-15 05:25 GMT
Note: Host seems down. If it is really up, but blocking our ping probes, try -PN
Nmap done: 1 IP address (0 hosts up) scanned in 3.130 seconds

Nmap Stealt Mode ile TCP Scanner.

bt ~ # nmap -sS 64.186.129.45

 Starting Nmap 4.60 ( http://nmap.org ) at 2009-11-15 17:18 GMT
 Note: Host seems down. If it is really up, but blocking our ping probes, try -PN
 Nmap done: 1 IP address (0 hosts up) scanned in 3.139 seconds

Yukarıda goruldugu gibi, Nmap ile ilgili serveri tarayamadı. (but blocking our ping probes) Syn paketleri gonderemeyen nmap dolayisiyla ack/reply alamadıgından Blocking seklinde bir cıktı veriyor.Bu durumda ICMP uzerinden  port kesif  taramalari ve icmp protokolune flood turu ataklar önlenmis olacaktir.

Not: Yukarıdaki çalışmada ICPM protokolune ait iletisim Type’ler den sadece 8/0 (Echo,Reply) bloklanmis durumda.ICMP icerisindeki tum type’leri de Drop edebiliriz.

Type	Name					Reference
----	-------------------------		---------
  0	Echo Reply				 [RFC792]
  1	Unassigned				    [JBP]
  2	Unassigned				    [JBP]
  3	Destination Unreachable			 [RFC792]
  4	Source Quench			 	 [RFC792]
  5	Redirect				 [RFC792]
  6	Alternate Host Address			    [JBP]
  7	Unassigned				    [JBP]
  8	Echo					 [RFC792]
  9	Router Advertisement			[RFC1256]
 10	Router Solicitation			[RFC1256]

http://www.iana.org/assignments/icmp-parameters

CheckPoint with Point to Point Protection

Checkpoint, bir cok sistem,serverin arkasın da Security Gateway olarak kullanılan kendini kanıtlamıs en iyi IDS/Firewall’lar dan birisidir.

Firewall,IPS,Antivirus alanın da  kesin cozumler sunan CheckPoint’in Webcast sunumlarını paylasmayi dusundum.Webcastler’in konusu;  genel de Wan,Lan uzerinde Checkpoint’în saglayabildigi guvenlik çözümlerini anlatmaktadır.

CheckPoint Webcast

Linux Kernel Patch (hotfix) with Yum Repository

Linux isletim sistemimizin kernel’in de  cikan root exploitler (Son gunlerde ard arda 2.4 /2.6 cekirdekleri exploit edildi.)serverin guvenligi geregi devamli compile/patch edilebilmesi sorununu ortaya çıkarıyor.

En son cikan guvenlik bildirisinde Linux Centos/Redhat’ın tüm kernellerini etkileyen Local Root Exploit yayınlandı.(Asagida belirtilen kernel surumleri, bu acıklıktan etkilenmiyor.)
CentOS 5.3 (2.6.18-128.7.1.el5) is not vulnerable
Red Hat Enterprise Linux 5.3 (2.6.18-128.7.1.el5) is not vulnerable
Red Hat Enterprise Linux 4.8 (2.6.9-89.0.9.EL) is not vulnerable

Referans/Exploit : http://milw0rm.com/exploits/9545 Serverda
acikligi meydana getirecek kodu derleyen bir kullanici  bu kodu calistirdiginda  serveri manipule edip  root kullanicisinin yetkilerine  elde edebiliyor.
Asagida virtual bir linux server da yaptigim test’i gorebilirsiniz.

[elmameta@localhost tmp]$ gcc -Wall -o root root.c-rwxrwxr-x 1 elmameta elmameta 6698 Sep 2 02:21 root-rwxrwxrwx 1 elmameta elmameta 9409 Sep 2 02:20 root.c
[elmameta@localhost tmp]$ ./root
sh-3.2# id

uid=0(root) gid=0(root) groups=500(elmameta) context=root:system_r:unconfined_t:s0-s0:c0.c1023

main(void)
{
char *addr;
int out_fd, in_fd;
char template[] = “/tmp/tmp.XXXXXX”;

#if defined(__i386__) || defined(__x86_64__)

uid = getuid(), gid = getgid();
#endif

Kernel’in hizlica patchlenmesi,

Linux kerneliniz icin güncelleştirmelerin bir an evvel yapilmasini oneririm. (Centos ve bir cok sitedeki mirror listlerden derlenmis kerneli cekebiliriz. )

Mevcut yum update repository’niz de   fixlenmis kernel olmayabilir.
Bu durumda serverin repository’lerini ayarlamamiz gerekecektir.

[root@localhost ~]# cd /etc/yum.repos.d
[root@localhost yum.repos.d]# vi CentOS-Update.repo

vi editorum ile yeni  update dosyamizi hazirlayalim. (CentOS-Update.repo isimli dosya olusturup icine asagidaki satirlari girmemiz gerekiyor.)

name=CentOS-$releasever – Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
baseurl=http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/$releasever/updates/$basearch
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

Yukaridaki paylasimli ftp sitesinde Centos sistemlerin patchlenmis son kerneli mevcut oldugundan(kernel-2.6.18-128.7.1.el5.src.rpm 24-Aug-2009) “baseurl= ” kısmını editledim.
Orjinal adres  : http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.3/updates/

dosyayi :wq ile (Vi editorune ozgu olan komut ) kaydedip cikalım.
Shell konsolumuzda:

[root@localhost yum.repos.d]# yum update kernel
* updates: ftp-stud.fht-esslingen.de
updates

- patchlenen kernel bu bolumde gozukecektir.

Bu islem sonrasi uname -r parametresi ile yeni kernelinizin versiyonunu gorebilirsiniz.

[root@localhost yum.repos.d]# uname -r
2.6.18-128.7.1.el5

Serverdaki cok riskli aciklik bu patch ile birlikde yerini simdlik sessizlige bırakdi. (Bir sureligine safe durumdayiz. )

Sisteme cekilmis tum update ve install loglarini asagidaki komut ile gorebilirsiniz :[root@localhost ~]# cat /var/log/yum.log

Sep 08 02:07:44 Updated: kernel-headers – 2.6.18-128.7.1.el5.i386
Sep 08 02:15:39 Installed: kernel-devel – 2.6.18-128.7.1.el5.i686

Felaket’i önlemek icin baska ne tür önlemler alınabilir ?

1-Server Update’leri nin cekilmesi.

2- Linux’u  web server olarak kullaniyorsaniz  veya paylasimli shell hesabi veriyorsaniz, sistem dizinlerinin permissionlarini guvenli sekilde set etmeniz  olacaktir.
Serverda chmod 777 (Full yetki)  ile set edilen dizinlerinin “execute” yetkisinin kaldırılması gerekir.

Asagidaki dosya sistemleri Linux sistemlerde  default olarak chmod 777 olarak gelmektedir.

/tmp
/dev/shm
/var/tmp

Bir buçuk yıl once Linux da “Chmod 777″ ile set edilmis dizinlerdeki Execute perm yetkisinin nasıl kaldırılacagını (Userler icin) anlatan pdf formatinda bir yazi yazmışim.

Burdan bakabilirsiniz.

2- *nix sistemler genel de  web server olarak kullanıldıgından , bir heçkırın sunucuya backconnect (Reverse Connection) olabilecegini goz ardı edilmemesi gerekir. Konu cok uzayacak boyle ,  Reverse Connection ataklaridan korunma yontemlerini  bir baska gun guzel bir calisma ile ele alalım.Burada diyecegim serverda IPtables firewall varsa icerden disariya tum portlarin kapatilmasidir. (Bu durumda php veya perl,python ile sunucuyu bypass eden birisi root yetkilerini elde etmek icin servera backconnect olamayip  son vurusu yapamayacktır.)
” Destination,Any,Close  ” mantıgı ile olusturulacak bir rule sayesinde  icerden disari tum baglantilar kapatilir.(Ben yaptim :u )

Php ile programlanmis bir scrip de ” Reverse Connection Anatomisi “.

cf(“/tmp/bd.c”,$port_bind_bd_c);

$blah = ex(“gcc -o /tmp/bd /tmp/bd.c”);

@unlink(“/tmp/bd.c”);

$blah = ex(“/tmp/bd “.$_POST['port'].” “.$_POST['bind_pass'].” &”);

cf(“/tmp/bdpl”,$port_bind_bd_pl);

$p2=which(“perl”);

if(empty($p2)) $p2=”perl”;

$blah = ex($p2.” /tmp/bdpl “.$_POST['port'].” &”);

$_POST['cmd']=”ps -aux | grep bdpl”;

$port_bind_bd_c
$port_bind_bd_pl

reverse-connection-code

( Encode edilen”  C#, perl kodlari”)

Yazardan  yorumlar :

2007 yılında Godaddy’nin (Dünyanın en kabul edilmis domain/hosting platformu)  Linux sunucularinin birin de  tespit edilen Local root exploit ile 5 dk icerisinde yüzlerce  domaini hacklendi.(Sitelerin anasayfası degistirildi.) Konunun onemini ve riskini belirtmek icin bu konuya degindim.

Kernel (Gnu) yeni bir operating sisteme port edildiginden beri devamli gelistirildi. ” *nix  ”  serverdaki kernellar da ve diger open source yazilimlarda bu tur acikliklarin cikmasi beklendik bir sey.Onemli olan bu aciklıklar yayınlansa dahi , serveri safe tutan guvenlik cemberlerinin dizayn edilmesidir.

Yazan : Ugur ENGIN
mail(@)ugurengin(.)com
http://ugurengin.com

Powershell with Bulk Domain Ping

Powershell scripting ile iÅŸi hızlandirip birden fazla domainin hangi IP’yi cozdugunu ve ping’e cevap verip vermedigini tespit edebiliriz.

Kısaca Powershell Nedir?
Microsoft’un .Net Framework destekli gelistirdigi en kapsamlı shell konsoludur. Powershell uzerinde  .net tabanlı scripting calistirma imkanı bulabiliyorsunuz. En sevdigim yanı Bash ( Bourne-Again SHell ) destekleyen Unix / Linux da kullanılan yapının buraya aktarılmıs olmasıdır;  bu sebeple konsol da alıskanlık halıne getirdigim cat,pwd,ls,rm komutlarını kullanabilmem cok iyi oluyor.

Bulk Domain Ping Kodlarını asagida paylasıyorum.

$readfile=get-content “C:\Users\root\Desktop\servers.txt
foreach($readf in $readfile)
{
$ALive=get-wmiobject win32_pingstatus -Filter “Address=’$readf’” | Select-Object statuscode
if($ALive.statuscode -eq 0)
{write-host $readf is REACHABLE -background “GREEN” -foreground “BLACk”}

else

{
write-host $readf is NOT reachable -background “RED” -foreground “BLACk”}

}

Domain listesinin path’ini belirmeniz ve Powershell de yukaridaki kodlari calistmaniz yeterli olacaktir.

Ping protokolune cevap veren domainler REACHABLE , pinge cevap vermeyen domainler ise NOT REACHABLE seklinde konsola yansıyacaktır.

http://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx

http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx

Ugur Engin
http://ugurengin.com

Centos da Tcpdump ile AÄŸ Trafigi Analizi

Tcpdump: network da ,veri trafigini analiz edebilmemizi saÄŸlayan (TCP/IP Paket Trafigi ), unix sistemler icin gelistirilmis bir pakettir.
Sniffing ile arasindaki fark , Mac’e karsilik gelen gateway’in poison edilmeyisidir : )

Tcpdump ile komple tum aÄŸ’ı taramak istemeyebiliriz; bu sebeple network trafigini gozlemlemek istedigimiz interface’yi secmemiz gerekmektedir.

Unix de her  interface aynı olmayabiliyor.

ifconfig parametresini girip IP’mize karsilik gelen AÄŸ arayuzunu gorelim.

[root@ugurengin ~]#ifconfig

venet0:2  Link encap:UNSPEC  HWaddr 00-00-00-00-00
inet addr:64.186.129.45  P-t-P:64.186.129.45 
Bcast:64.186.129.45  Mask:255.255.255.255

-i parametresi ile AÄŸ arayuzunu seciyoruz.

[root@ugurengin ~]#tcpdump -i venet0:2
listening on venet0:2, link-type LINUX_SLL (Linux cooked), capture size 96 bytes
1518 packets captured
1519 packets received by filter

Suanda server da 2. Ethernet kartimdaki trafigi dinlemeye aldim.

-n Parametresi ile dns cozumlemesi yapmadan tum trafigi sayisal olarak shell konsala yazdırabiliriz.

[root@ugurengin ~]#tcpdump -i venet0:2 -n

Sadece belli bir porta gelen istekleri de ekrana basabiliriz.

[root@ugurengin ~]#tcpdump -i venet0:2 port 443

Gecenin saat 4′u oldugunu varsayalım, suanda oldugu gibi.
Tum paket trafigini daha sonra incelemek üzere otomatik olarak
server da bir dosyaya yazip – kaydedelebiliriz.

[root@ugurengin ~]# tcpdump -i venet0:2 -w /tmp/tcplogs
Kaydedilen loglari daha sonra okumak icin :

[root@ugurengin ~]# tcpdump -i venet0:2 -r /tmp/tcplogs

reading from file /tmp/tcplogs, link-type LINUX_SLL (Linux cooked)
20:24:28.447908 IP ugurengin.com.rpc2portmap > 85.103.21.236.50677: P 2394369784:2394369916(132) ack 3335487336 win 96

Daha fazlası ;

http://en.wikipedia.org/wiki/Tcpdump
http://www.tcpdump.org/#documentation

Ugur ENGIN