3 Mayıs 2014 Cumartesi

Web Sunucu Loglarından Saldırı Analizi

Paylaşım Unknown on 01:16 with Şuan Yorum Yok


Bilişim sistemlerine yönelik saldırıları belirlemek ve engellemek için aktif ve pasif olmak üzere temelde iki yöntem vardır. Aktif saldırı belirleme ve engelleme sistemleri genellikle ağ/host tabanlı çalışır NIPS/HIPS(Network / Host Intrusion Prevention System) olarak adlandırılır ve anlık ağ trafiği ya da işletim sistemi fonksiyonlarını kullanarak engelleme işlemi gerçekleştirir.




Pasif belirleme sistemleri çok farklı olabilmektedir. Bunlardan biri de sistemin loglarını inceleyerek gerçekleşmiş saldırıları belirlemektir. Saldırıların büyük çoğunluğu log(kayıt) dosyalarındaki – eğer yeterli loglama altyapısı var ve sağlıklı çalışıyorsa- anormallikler incelenerek belirlenebilir.




Konunun detayına girmeden bu yöntemin(log analizi->saldırı inceleme) ciddi eksikliklerinin bulunduğunu belirtmek gerekir. Log analizi yöntemiyle sadece sıradan saldırılar konusunda bulgular elde edilebilir. Genel web sunucu altyapısının eksikliği nedeniyle karmaşık saldırılar sadece web sunucu log analizinden bulunamaz. Ortamda paketleri olduğu gibi gören ve kaydeden başka bileşenlere ihtiyaç vardır (IDS, FPL gibi)




Mesela web sunucular POST isteklerinin detaylarını loglamaz ve eğer saldırganın gerçekleştirdiği atak POST detayında gizli ise sunucu logunda şüpheli bir işlem olarak gözükmeyecektir. Yine saldırgan çeşitli encoding yöntemlerini kullanarak aranacak kelimelerin farklı şekillerde log dosyasında saklamasını sağlayabilir. Burada log analizi gerçekleştiren uzmanın konu hakkında etraflıca bilgi sahibi olması önemlidir.




Log Analizi

Genellikle iki şekilde log analizi gerçekleştirilir.

Hazır araçlar kullanarak,

UNIX/Linux sistemlerdeki cat, awk, grep, cut .. gibi basit araçlar kullanarak.

Hazır araç kullanmak işlemleri hızlandırsa da false positive oranı yüksek olduğu için çıkan sonucun tekrar gözden geçirilmesi gerekmektedir.

Bu yazıda hem otomatize araç hem de elle yapılan ve toplamda 100.000.000’dan fazla satır içeren yoğun bir sunucuya ait gerçekleştirilen analize dair notlar bulacaksınız.




Apache Loglarında Saldırı İmzası Arama – Log Tabanlı IDS

Gerçekleştirilen her saldırı arkasında mutlaka bir iz bırakır. Bu iz bazı durumlarda saldırının gerçekleştirildiği sistem üzerinde olur bazı durumlarda -saldırganın teknik bilgi seviyesine bağlı olarak- aradaki IDS/IPS gibi pasif sistemlerde olur. Apache, IIS gibi web sunucu yazılımlarının loglarını analiz ederek saldırı imzası arayan çeşitli yazılımlar vardır. Bu yazılımların ortak özelliği kayıtlı loglar arasında daha önceden tanımlanmış belirli kelime/kelime gruplarını aramak ve buna göre uyarı vermektir.




Bu tip yazılımları kullanırken unutulmaması gereken en önemli konu Apache ve diğer web sunucular ön tanımlı olarak POST isteklerinde gelen değerleri loglamazlar. Bunun için mod_forensic gibi ya da mod_security gibi ek bileşenler kullanılmalıdır ya da POST üzerinden gerçekleştirilecek saldırıları yakalamak için WAF, Load Balancer, IPS gibi ürünlerin loglarına başvurmak gerekir.




HTTP GET / POST İstekleri

Aşağıdaki iki farklı sistem tarafından alınmış bir POST istek detayı bulunmaktadır. Bunlardan ilki web sunucu kayıtlarından alınmış, diğeri web sunucuya gidip gelen trafiği dinleyen bir sniffer tarafından alınmıştır.

POST isteğinin web sunucu logundaki çıktısı

127.0.0.1 – - [04/Mar/2012:02:10:10 -0500] “POST /dvwa/login.php HTTP/1.1¨ 302 454 “http://localhost/dvwa/login.php” “Mozilla/5.0 (X11; Linux i686; rv:5.0.1) Gecko/20100101 Firefox/5.0.1¨

POST isteğinin sniffer aracılığıyla gösterimi

T 127.0.0.1:47635 -> 127.0.0.1:80 [AP]

POST /dvwa/login.php HTTP/1.1.

Host: localhost.

User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0.1) Gecko/20100101 Firefox/5.0.1.

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8.

Accept-Language: en-us,en;q=0.5.

Accept-Encoding: gzip, deflate.

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7.

Connection: keep-alive.

Referer: http://localhost/dvwa/login.php.

Cookie: security=high; XpLiCo=i68o2ejvm6jnp3b9pv083i4mi7; PHPSESSID=uvn4olrlfd6sckjhe4eea4jno4.

Content-Type: application/x-www-form-urlencoded.

Content-Length: 49.

username=admin&password=hatali_parola&Login=Login




Görüleceği gibi POST isteğini detaylı olarak incelendiğinde (Network üzerinden) hangi kullanıcı adı ve parola bilgilerinin girildiği ortaya çıkmaktadır. Bu detay web sunucu loglarında gözükmeyecektir. Web sunucu loglarında sadece hangi URL’e istek yapıldığı bilgisi kayıt altına alınır.




SQLi Denemesinin Web Sunucu Logu ve Sniffer Üzerinden Analizi

Web sunucu logu:

127.0.0.1 – - [04/Mar/2012:02:10:10 -0500] “POST /dvwa/login.php HTTP/1.1¨ 302 454 “http://localhost/dvwa/login.php” “Mozilla/5.0 (X11; Linux i686; rv:5.0.1) Gecko/20100101 Firefox/5.0.1¨




Sniffer üzerinden alınan çıktı

T 127.0.0.1:47632 -> 127.0.0.1:80 [AP]

POST /dvwa/login.php HTTP/1.1.

Host: localhost.

User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0.1) Gecko/20100101 Firefox/5.0.1.

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8.

Accept-Language: en-us,en;q=0.5.

Accept-Encoding: gzip, deflate.

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7.

Connection: keep-alive.

Referer: http://localhost/dvwa/login.php.

Cookie: security=high; XpLiCo=i68o2ejvm6jnp3b9pv083i4mi7; PHPSESSID=uvn4olrlfd6sckjhe4eea4jno4.

Content-Type: application/x-www-form-urlencoded.

Content-Length: 234.

.

username=ECYH%252C%2528SELECT%2520%2528CASE%2520WHEN%2520%25282167%253D2167%2529%2520THEN%2520ECYH%2520ELSE%25

202167%252A%2528SELECT%25202167%2520FROM%2520INFORMATION_SCHEMA.CHARACTER_SETS

%2529%2520END%2529&password=parola&Login=Login




URL encode edilmiş veri decode edilirse aşağıdakine benzer bir SQL sorgusu olduğu ortaya çıkacaktır.

ECHO SELECT … CASE … WHEN … THEN ECYH ELSE SELECT FROM INFORMATION_SCHEMA.CHARACTER_SETS AND password=parola&Login

Bu tip POST isteği kullanılarak gerçekleştirilen saldırılar Ağ tabanlı IPS/IDS sistemleri ya da WAF/Load Balancer sistemler kullanarak da belirlenebilir.

Hazır Araçlar Kullanarak Log Analizi, Scalp

Scalp, Web sunucu loglarından denenmiş web saldırılarını log analizi yöntemiyle bulmaya çalışır. Saldırı analizinde kullanacağı değişkenleri de PHPIDS projesinden almaktadır.

https://dev.itratos.de/projects/php-ids/repository/raw/trunk/lib/IDS/default_filter.xml

Komut satırı parametrlerini görme




root@bt:/home/huzeyfe# python scalp-0.4.py

Scalp the apache log! by Romain Gaucher – http://rgaucher.info

usage: ./scalp.py [--log|-l log_file] [--filters|-f filter_file] [--period time-frame] [OPTIONS] [--attack a1,a2,..,an]

[--sample|-s 4.2]

–log |-l: the apache log file ‘./access_log’ by default

–filters |-f: the filter file ‘./default_filter.xml’ by default

–exhaustive|-e: will report all type of attacks detected and not stop

at the first found

–tough |-u: try to decode the potential attack vectors (may increase

the examination time)

–period |-p: the period must be specified in the same format as in

the Apache logs using * as wild-card

ex: 04/Apr/2008:15:45;*/Mai/2008

if not specified at the end, the max or min are taken

–html |-h: generate an HTML output

–xml |-x: generate an XML output

–text |-t: generate a simple text output (default)

–except |-c: generate a file that contains the non examined logs due to the

main regular expression; ill-formed Apache log etc.

–attack |-a: specify the list of attacks to look for

list: xss, sqli, csrf, dos, dt, spam, id, ref, lfi

the list of attacks should not contains spaces and comma separated

ex: xss,sqli,lfi,ref

–output |-o: specifying the output directory; by default, scalp will try to write

in the same directory as the log file

–sample |-s: use a random sample of the lines, the number (float in [0,100]) is

the percentage, ex: –sample 0.1 for 1/1000




çalıştırıldığında aşağıdaki gibi hata alınabilir.




# python scalp-0.4.py –log access.101223.log –filters default_filter.xml -e –html

Loading XML file ‘default_filter.xml’…

The rule ‘(?:union\s*(?:all|distinct|[(!@]*)?\s*[([]*\s*select)|(?:\w+\s+like\s+\”)|(?:like\s*”\%)|(?:”\s*like

\W*["\d])|(?:”\s*(?:n?and|x?or|not |\|\||\&\&)\s+[\s\w]+=\s*\w+\s*having)|(?:”\s*\*\s*\w+\W+”)|(?:”\s*

[^?\w\s=.,;)(]+\s*[(@"]*\s*\w+\W+\w)|(?:select\s*[\[\]()\s\w\.,”-]+from)|(?:find_in_set\s*\()’ cannot be compiled properly







Çözümü:

http://code.google.com/p/apache-scalp/issues/list




Belirli Tipteki Saldırıları Belirleme

Sadece belirli tipteki saldırıları aratmak için –a sqli, xss gibi parametre kullanılabilir.

diretct

85.95.238.173 – - [11/Feb/2012:00:50:50 -0600] “GET /nessus\\..\\..\\..\\..\\..\\..\\winnt\\win.ini HTTP/1.1¨ 404 21816 “-” “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)”

Reason: “Detects basic directory traversal”




85.95.238.173 – - [11/Feb/2012:00:50:50 -0600] “GET /exchweb/bin/auth/owalogon.asp?url=http://12345678910 HTTP/1.1¨ 404 21816 “-” “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)”

Reason: “Detects specific directory and path traversal”




85.95.238.173 – - [11/Feb/2012:00:50:50 -0600] “GET /%80../%80../%80../%80../%80../%80../windows/win.ini HTTP/1.1¨ 404 21816 “-” “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)”

Reason: “Detects basic directory traversal”




85.95.238.173 – - [11/Feb/2012:00:50:51 -0600] “GET /%80../%80../%80../%80../%80../%80../winnt/win.ini HTTP/1.1¨ 404 21816 “-” “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)”

Reason: “Detects basic directory traversal”




85.95.238.173 – - [11/Feb/2012:00:50:52 -0600] “GET /%c0.%c0./%c0.%c0./%c0.%c0./%c0.%c0./%c0.%c0./windows/win.ini HTTP/1.1¨ 404 21816 “-” “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)”

Reason: “Detects basic directory traversal”

scalp log satırı yüksek olan log analizlerinde genellikle yüksek oranda false positive ürettiği için gerçek ortamlarda kullanılmayacak bir yazılımdır. Ortalama %10-%15 civarında false positive ürettiği göz önüne alınırsa log analizi yapan uzmanın logları analiz ettiği kadar sonuçları da analiz etmesini gerek kılacaktır.




Basit UNIX Araçlarıyla Log Analizi

Bu yöntemde önemli olan logların arasından ne tip özellikte olanlarını bulmak istediğimizi belirlemektir. Zira milyonlarca satır log arasında ne aradığını bilmeyen birinin samanlıkta iğne arayandan farkı kalmayacak ve zamanı boşa geçirecektir.

Saldırı Olarak Değerlendirilebilecek Durumlar

Saldırı yapılan sunucuya özel bazı dizin/dosyaların istenmesi

Mesela WordPress gibi sistemlerde genellikle /wp-admin gibi dizinler ya da wp-login.php gibi dosyalara yönelik brute force denemeleri gerçekleştirilir. Saldırı imzası olarak /wp-admin ve wp-login.php gibi kelimeleri arattırırsak saldırı yapanların bir kısmı belirlenmiş olunur.




Sunucuya bağlantı kuran ip adresleri ve bağlantı sayıları

Sunucu üzerinde deneme gerçekleştiren ip adreslerinin normalin üzerinde bağlantı sayısına sahip olması beklenir.

Aşağıdaki komutla Apache loglarında hangi ip adresi kaç adet bağlantı gerçekleştirmiş (top 10) ortaya çıkarılabilir.

# cat siber-access_log |awk -F ” ” ‘{print $1}’|sort -n|uniq -c|sort -nr|head

3556 9.6.2.2

1527 9.2.4.1

1142 1.1.2.8

1055 193.2.2.1

1046 9.1.2.1




Directory Traversal Denemelerini Bulma

Web üzerinden gerçekleştirilebilecek önemli saldırı yöntemlerinden birisi web üzerinden sistemdeki dosyaları okuma olarak tanımlayabileceğimiz LFI(Local File Inclusion) saldırılarıdır.

Web üzerinden gerçekleştirilen LFI vs saldırılarını loglardan yakalamak için ara bileşen olarak kullanılan ../ ..\ gibi özel ifadeleri aratmak yeterli olacaktır. Yine burada hatırlanması gereken önemli nokta bu karekterler GET isteği üzerinden taşındığı zaman web sunucu loglarında yer bulacaktır.

.

13.22.1.129 – - [01/Dec/2010:02:20:55 +0200] “GET /imprimer.asp?no=/../../../../../../../../etc/passwd|44|80040e14|[Microsoft][ODBC_SQL_Server_Driver][SQL_Server]Line_1:_Incorrect_syntax_near_'/'. HTTP/1.1¨ 404 210 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3¨

19.22.1.1 – - [01/Dec/2010:02:20:55 +0200] “GET /mailview.cgi?cmd=view&fldrname=inbox&select=1&html=../../../../../../etc/passwd HTTP/1.1¨ 404 210 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3¨

13.22.1.19 – - [01/Dec/2010:02:20:55 +0200] “GET /modif_infos.asp?n=../../../../../../../../../etc/passwd HTTP/1.1¨ 404 213 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3¨

13.22.1.19 – - [01/Dec/2010:02:20:55 +0200] “GET /modif_infos.asp?n=/../../../../../../../../../../../../../../../../../../../../boot.ini HTTP/1.1¨ 404 213 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3¨

13.22.1.19 – - [01/Dec/2010:02:20:55 +0200] “GET /modif_infos.asp?n=/../../../../../../../../../etc/passwd HTTP/1.1¨ 404 213 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3¨

13.22.1.19 – - [01/Dec/2010:02:20:56 +0200] “GET /pm/lib.inc.php HTTP/1.1¨ 404 212 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3¨

13.22.1.19 – - [01/Dec/2010:02:20:56 +0200] “GET /productcart/pc/Custva.asp?|-|0|404_Object_Not_Found HTTP/1.1¨ 404 223 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3¨

13.22.1.19 – - [01/Dec/2010:02:20:56 +0200] “GET /ProductCart/pc/msg.asp?|-|0|404_Object_Not_Found HTTP/1.1¨ 404 220 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3¨

13.22.1.19 – - [01/Dec/2010:02:20:56 +0200] “GET /rubrique.asp?no=../../../../../../../../../etc/passwd|55|80040e14|[Microsoft][ODBC_SQL_Server_Driver][SQL_Server]Line_1:_Incorrect_syntax_near_'/'. HTTP/1.1¨ 404 210 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3¨

13.22.1.19 – - [01/Dec/2010:02:20:56 +0200] “GET /rubrique.asp?no=/../../../../../../../../../../../../../../../../../../../../boot.ini|55|80040e14|[Microsoft][ODBC_SQL_Server_Driver][SQL_Server]Line_1:_Incorrect_syntax_near_'/'. HTTP/1.1¨ 404 210 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3¨

13.22.1.19 – - [01/Dec/2010:02:20:56 +0200] “GET /rubrique.asp?no=/../../../../../../etc/passwd|55|80040e14|[Microsoft][ODBC_SQL_Server_Driver][SQL_Server]Line_1:_Incorrect_syntax_near_'/'. HTTP/1.1¨ 404 210 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3¨

13.22.1.19 – - [01/Dec/2010:02:20:56 +0200] “GET /rubrique.asp?no=/../../../etc/passwd|55|80040e14|[Microsoft][ODBC_SQL_Server_Driver][SQL_Server]Line_1:_Incorrect_syntax_near_'/'. HTTP/1.1¨ 404 210 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3¨

13.22.1.19 – - [01/Dec/2010:02:20:56 +0200] “GET /shoutbox/expanded.php?conf=../../../../../../../etc/passwd%20 HTTP/1.1¨ 404 219 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3¨




13.22.1.19 ip adresinin sisteme yönelik normal olmayan bir şeyler denediği ortadadır. Bu IP adresinin başka neler denediğine bakarak saldırı imzası olarak aranacak kelime grupları genişletilebilir.

Burada önemli olan bu tip isteklere web sunucunun döndüğü cevaptır . Web sunucu 404 değil 300 veya 200 lü cevap dönüyorsa saldırının başarılı olmuş olma ihtimali vardır. 404 alınıyorsa bu saldırganın denediği atakların başarılı olmadığı, sunucu tarafında bulunmadığı anlamına gelir.




SQL Injection Denemelerini Yakalama

SQLi denemelerini web sunucu loglarından yakalamak için genellikle tercih edilen yöntem sqli için kullanılan kelimeler ve evasion amaçlı kullanılan özel karekterlerin web sunucu loglarından aratılmasıdır.

SQLi aratmak için Concat, char, union, select, order by, group by gibi komutlar ‘ denenebilir. Bu kelimeleri log dosyasında aratmak false positive sonuçlar çıkarabileceği için çıkan sonuçların teker teker incelenmesi gerekir.

Burada yine sadece GET üzerinden denenen sqli sldırılarının loglarından anlamlı bir şeyler çıkacağını belirtmemiz gerekiyor.

Concat denemeleri




127.0.0.1 – - [28/Feb/2012:05:03:40 -0500] “GET /dvwa/vulnerabilities/sqli/?id=9&Submit=Submit%27%29%20AND%20%28SELECT

%204770%20FROM%28SELECT%20COUNT%28%2A%29%2CCONCAT

%28CHAR%2858%2C118%2C106%2C115%2C58%29%2C%28SELECT%20%28CASE%20WHEN

%20%284770%3D4770%29%20THEN%201%20ELSE%200%20END%29%29%2CCHAR%2858%2C101%2C111%2C102%2C58%29

%2CFLOOR%28RAND%280%29%2A2%29%29x%20FROM%20

INFORMATION_SCHEMA.CHARACTER_SETS%20GROUP%20BY%20x%29a%29%20AND%20%28%27JrPI%27%3D%27JrPI HTTP/1.1¨ 200 4660 “-” “sqlmap/1.0-dev (r4009) (http://sqlmap.sourceforge.net)”

127.0.0.1 – - [28/Feb/2012:05:03:40 -0500] “GET /dvwa/vulnerabilities/sqli/?id=9&Submit=Submit%27%20AND%20%28SELECT%204770%20FROM%28SELECT%20COUNT%28%2A%29%2CCONCAT%28

CHAR%2858%2C118%2C106%2C115%2C58%29%2C%28SELECT%20%28CASE%20WHEN%20%284770%3D4770%29%20

THEN%201%20

ELSE%200%20END%29%29%2CCHAR%2858%2C101%2C111%2C102%2C58%29%2CFLOOR%28RAND%280%29%2A2%29%29x%20

FROM%20INFORMATION_SCHEMA.CHARACTER_SETS%20GROUP%20BY%20x%29a%29%20AND%20%27AwiQ%27%3D%27AwiQ HTTP/1.1¨ 200 4660 “-” “sqlmap/1.0-dev (r4009) (http://sqlmap.sourceforge.net)”




Not: İleri seviye sql injection denemelerini yakalamak için PHPIDS’deki düzenli ifadeler kullanılmalıdır.




Command Execution Denemeleri

Eğer saldırgan başarılı bir şekilde sisteme sızmayı başardıysa ilk işi Linux sistemde çalıştırılacak temel komutları id, whoami, wget, .etc.passwd vs denemek olacaktır.

Bu komutları sistemde çalıştırarak saldırganın sisteme erişim sağlayıp sağlayamadığı belirlenebilir.

0 yorum:

Yorum Gönder