Web Sunucu Loglarından Saldırı Analizi

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 ‘(?:unions*(?:all|distinct|[(!@]*)?s*[([]*s*select)|(?:w+s+likes+”)|(?:likes*”%)|(?:”s*like
W*[“d])|(?:”s*(?:n?and|x?or|not ||||&&)s+[sw]+=s*w+s*having)|(?:”s**s*w+W+”)|(?:”s*
[^?ws=.,;)(]+s*[(@”]*s*w+W+w)|(?:selects*[[]()sw.,”-]+from)|(?:find_in_sets*()’ 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…………winntwin.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%00 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%00|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.