Apache 1.3.29 – 404
Microsoft-IIS/4.0 – 404
# telnet target1.com 80
Trying target1.com…
Connected to target1.com.
Escape character is ’^]’.
HEAD /non-existent-file.txt HTTP/1.0
HTTP/1.1 404 Not Found
Date: Mon, 07 Jun 2004 14:31:03 GMT
Server: Apache/1.3.29 (Unix) mod_perl/1.29
Connection: close
Content-Type: text/html; charset=iso-
8859-1
Connection closed by foreign host.
# telnet target2.com 80
Trying target2.com…
Connected to target2.com.
Escape character is ’^]’.
HEAD /non-existent-file.txt HTTP/1.0
HTTP/1.1 404 Object Not Found
Server: Microsoft-IIS/4.0
Date: Mon, 07 Jun 2004 14:41:22 GMT
Content-Length: 461
Content-Type: text/html
Connection closed by foreign host.
3. Baþlýklarda Kullanýlan Kelimeler – “Content-length” yerine geri dönülen “Content-Length” baþlýðý.
Netscape-Enterprise/6.0 – HEAD
Microsoft-IIS/4.0 – HEAD
# telnet target1.com 80
Trying target1.com…
Connected to target1.com.
Escape character is ’^]’.
HEAD / HTTP/1.0
HTTP/1.1 200 OK
Server: Netscape-Enterprise/6.0
Date: Mon, 07 Jun 2004 14:55:25 GMT
Content-length: 26248
Content-type: text/html
Accept-ranges: bytes
Connection closed by foreign host.
# telnet target2.com 80
Trying target2.com…
Connected to target2.com.
Escape character is ’^]’.
HEAD / HTTP/1.0
HTTP/1.1 404 Object Not Found
Server: Microsoft-IIS/4.0
Date: Mon, 07 Jun 2004 15:22:54 GMT
Content-Length: 461
Content-Type: text/html
Connection closed by foreign host.
4. Sözdizimi – HTTP RFC tarafýndan, bütün web haberleþmelerinde haberleþen partilerin birbirlerini anlamalarý için önceden belirlenmiþ yapýlar ve oluþumlarýn kullanýlmasý zorunlu tutulur. Yine de HTTP Cevap baþlýklarýnýn sýrasýnda ve formatýnda farklýlýklar vardýr.
5. Baþlýk Sýralamasý – Apache sunucularý sürekli olarak “Date” baþlýðýný “Server” baþlýðýndan önce yerleþtirirken Microsoft-IIS bu baþlýklarý ters sýrada yerleþtirir.
Apache 1.3.29- HEAD
Microsoft-IIS/4.0 – HEAD
# telnet target1.com 80
Trying target1.com…
Connected to target1.com.
Escape character is ’^]’.
HEAD / HTTP/1.0
HTTP/1.1 200 OK
Date: Mon, 07 Jun 2004 15:21:24 GMT
Server: Apache/1.3.29 (Unix) mod_perl/1.29
Content-Location: index.html.en
Vary: negotiate,accept-language,accept-charset
TCN: choice
Last-Modified: Fri, 04 May 2001 00:00:38 GMT
ETag: “4de14-5b0-3af1f126;40a4ed5d”
Accept-Ranges: bytes
Content-Length: 1456
Connection: close
Content-Type: text/html
Content-Language: en
Expires: Mon, 07 Jun 2004 15:21:24 GMT
Connection closed by foreign host.
# telnet target2.com 80
Trying target2.com…
Connected to target2.com.
Escape character is ’^]’.
HEAD / HTTP/1.0
HTTP/1.1 404 Object Not Found
Server: Microsoft-IIS/4.0
Date: Mon, 07 Jun 2004 15:22:54 GMT
Content-Length: 461
Content-Type: text/html
Connection closed by foreign host.
6. List metodu Sýralamasý – Bir HTTP isteðinde OPTIONS metodu yollandýðýnda, istenilen URL için izin verilen metodlar “Allow” baþlýðý içinde dönülür. Apache sadece “Allow” baþlýðýný dönerken, IIS ayrýca “Public” baþlýðýný da içerir.
Apache 1.3.29- OPTIONS
Microsoft-IIS/5.0 – OPTIONS
# telnet target1.com 80
Trying target1.com…
Connected to target1.com.
Escape character is ’^]’.
OPTIONS * HTTP/1.0
HTTP/1.1 200 OK
Date: Mon, 07 Jun 2004 16:21:58 GMT
Server: Apache/1.3.29 (Unix) mod_perl/1.29
Content-Length: 0
Allow: GET, HEAD, OPTIONS, TRACE
Connection: close
Connection closed by foreign host.
# telnet target2.com 80
Trying target2.com…
Connected to target2.com.
Escape character is ’^]’.
OPTIONS * HTTP/1.0
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Mon, 7 Jun 2004 12:21:38 GMT
Content-Length: 0
Accept-Ranges: bytes
DASL: <DAV:sql>
DAV: 1, 2
Public: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, POST, COPY, MOVE, MKCOL,
PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH
Allow: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, POST, COPY, MOVE, MKCOL,
PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH
Cache-Control: private
Connection closed by foreign host.
7. Semantic – HTTP cevabýnda dönülen kelimeler ve ibarelerin yaný sýra, doðru ve yanlýþ oluþturulmuþ isteklerin yorumlarýnda belirgin farklýlýklar vardýr.
8. Belli baþlýklarýn bulunmasý – Bir sunucu, cevabýnda istediði baþlýðý kullanabilir. Bazý baþlýklar spesifikasyon tarafýndan zorunlu tutulmuþlarsa da, bir çok baþlýk (mesela ETag) opsiyoneldir. Aþaðýdaki örneklerde, Apache sunucularý cevap baþlýklarýnda IIS tarafýndan kullanýlmayan þu ilave kayýtlarý içerir; ETag, Vary ve Expires.
Apache 1.3.29- HEAD
Microsoft-IIS/4.0 – HEAD
# telnet target1.com 80
Trying target1.com…
Connected to target1.com.
Escape character is ’^]’.
HEAD / HTTP/1.0
HTTP/1.1 200 OK
Date: Mon, 07 Jun 2004 15:21:24 GMT
Server: Apache/1.3.29 (Unix) mod_perl/1.29
Content-Location: index.html.en
Vary: negotiate,accept-language,accept-charset
TCN: choice
Last-Modified: Fri, 04 May 2001 00:00:38 GMT
ETag: “4de14-5b0-3af1f126;40a4ed5d”
Accept-Ranges: bytes
Content-Length: 1456
Connection: close
Content-Type: text/html
Content-Language: en
Expires: Mon, 07 Jun 2004 15:21:24 GMT
Connection closed by foreign host.
# telnet target2.com 80
Trying target2.com…
Connected to target2.com.
Escape character is ’^]’.
HEAD / HTTP/1.0
HTTP/1.1 404 Object Not Found
Server: Microsoft-IIS/4.0
Date: Mon, 07 Jun 2004 15:22:54 GMT
Content-Length: 461
Content-Type: text/html
Connection closed by foreign host.
9. Normal olmayan Cevap Baþlýklarý – Ayný istekler hedef web sunucularýna gönderilse de, yorumlar farklý olabilir ve bu yüzden deðiþik cevap kodlarý üretilebilir. Bu anlamsal (semantik) farklýlýða en iyi örnek Whisker tarayýcý aracýnýn kullandýðý “Light FingerPrinting” kontrolüdür. Whisker 2.1’in main.test dosyasýndan alýnan aþaðýdaki Perl kodu bölümü, hedef sunucunun Apache olup olmadýðýný anlamak için banner’lerinde görülen bilgilerden baðýmsýz olarak iki test koþar. Ýlk istek “GET //” isteðidir ve eðer cevap HTTP durum kodu 200 ise, ikinci istek yollanýr. Ýkinci istek URL kodlanmýþ ve “GET //” olarak çevrilen “GET /%2f”’dir. Bu sefer Apache sunucusu, 404 – Not Found hatasý döner. Diðer web sunucularý (IIS) bu tür istekler için ayný durum kodunu (404) dönmez.
# now do some light fingerprinting…
– CUT –
my $Aflag=0;
$req{whisker}->{uri}=’//’;
if(!_do_request(\\\\\\\\\\\\\\\\\\%req,\\\\\\\\\\\\\\\\\\%G_RESP)){
_d_response(\\\\\\\\\\\\\\\\\\%G_RESP);
if($G_RESP{whisker}->{code}==200){
$req{whisker}->{uri}=’/%2f’;
if(!_do_request(\\\\\\\\\\\\\\\\\\%req,\\\\\\\\\\\\\\\\\\%G_RESP)){
_d_response(\\\\\\\\\\\\\\\\\\%G_RESP);
$Aflag++ if($G_RESP{whisker}->{code}==404);
} } }
m_re_banner(’Apache’,$Aflag);
Hedef siteye karþý Whisker koþulduðunda, ön testler ýþýðýnda web sunucusunun Apache sunucusu olduðu rapor edilir. Aþaðýdaki örnek Whisker raporundan bir bölümdür;
———————————————————————–
Title: Server banner
Id: 100
Severity: Informational
The server returned the following banner:
Microsoft-IIS/4.0
———————————————————————–
Title: Alternate server type
Id: 103
Severity: Informational
Testing has identified the server might be an ’Apache’ server. This Change could be due to the server not correctly identifying itself (the Admins changed the banner). Tests will now check for this server type as well as the previously identified server types.
———————————————————————–
Bu rapor saldýrgana, sadece sunucu yöneticilerinin web bannerlarýný deðiþtirecek kadar becerikli olduklarýný göstermez ayný zamanda Whisker raporun doðruluðunu güçlendirebilecek diðer Apache testlerini de taramasýna ekleyecektir.
Çözümler
Web sunucunuz tarafýndan saðlanan tanýmlayýcý bütün verileri kaldýrmak mümkün deðildir. Gerçek þudur ki, kararlý bir saldýrý web sunucu yazýlýmýnýzý tanýmlayabilecektir. Amacýnýz keþif barýný olabildiðince yukarýya çekerek saldýrganýn güvenlik tehlike alarmlarýný tetikleyecek kadar fazla uðraþmasýný saðlamak olmalýdýr. Aþaðýdaki adýmlar bu iþ için yardýmcý olacaktýr. Öneriler uygulanmasý kolaydan zora doðu sýralanmýþlardýr.
1. Sunucu Banner Bilgisinin Deðiþtirilmesi
Web sunucusunun cevap baþlýklarýndaki “Server” alaný tarafýndan gösterilen bilgiyi deðiþtirmek (aldatma amaçlý) mümkündür. HTTP Server alanýný deðiþtirmek ile kazanýlacak güvenlik hakkýnda web güvenlik çevrelerinde bir çok tartýþma olmuþtur. Sadece banner bilgisinin deðiþtirilmesi ve yazýlým versiyonunu gizleyici diðer önleyici faktörlerin uygulanmamasý keþfi düzenleyen gerçek insanlara karþý etkili olmamakla beraber, otomatikleþtirilmiþ WORM (solucan) programlarýna karþý yardýmcý olur. Çok miktarda sistemi enfekte etmek için kullanýlan solucanlarýn gittikçe artan popülerliði nedeniyle web sunucularýn bu þekilde korunmasý hayati önem taþýr. Bu adým organizasyonlara yama üretilme süresinde yeni çýkacak ve banner bilgisine göre hareket eden solucanlara karþý zaman kazandýrýr.
· Apache Sunucularý – Modsecurity’nin Server banner bilgisini Apache kodunun derlemeden önce deðiþtirilmesi yerine httpd.conf dosyasýný edit?? ederek deðiþtirmesini saðlayan SecServerSignature ayarý vardýr.
· IIS Sunucularý – IISLockDown ve URLScan araçlarýný kurarak, istemcilere dönen banner bilgisini deðiþtirebilirsiniz.
2. Baþlýklardaki Bilgi Detayýnýn Minimize Edilmesi
Cevap baþlýklarýnda dönülen bilgi miktarýný kýsýtlayýn. Mesela, Apache ServerTokens direktifini kullanarak Server banner alanýndaki bilginin detaylarýnýn kontrol edilmesini saðlar:
ServerTokens Prod[uctOnly]
Server sends (e.g.): Server: Apache
ServerTokens Min[imal]
Server sends (e.g.): Server: Apache/1.3.0
ServerTokens OS
Server sends (e.g.): Server: Apache/1.3.0 (Unix)
ServerTokens Full (or not specified)
Server sends (e.g.): Server: Apache/1.3.0 (Unix) PHP/3.0 MyMod/1.2
Baþlýklarý minimize ederek, ek olarak kurulmuþ Apache modülleri gibi bilgileri gizleyebilirsiniz.
3. Sahte Baþlýklar Oluþturun
Web sunucu parmak izi araþtýrmasýný engelleyici/þaþýrtýcý alternatif tekniklerden bir tanesi sahte bir web topolojisi oluþturmaktýr. Saldýrganlar genellikle banner elde etme tekniði oturumlarýný Parmak Ýzi araþtýrmasý iþinin bir parçasý olarak kullanýrlar. Parmak Ýzi araþtýrmasýnda saldýrgan hedefin genel yapýsýný tanýmlamaya çalýþýr. Ýlave olarak eklenen sahte baþlýklar ile karmaþýk bir web yapýsý simule edilebilir (Mesela bir DMZ). Ek baþlýklar eklenerek sahte bir geri vekilin (reverse proxy) olduðu simule edilebilir.
Bu iþi baþarmak için Apache sunucularýnda httpd.conf dosyasýna aþaðýdaki kayýtlar eklenebilir;
_ Header set Via “1.1 squid.proxy.companyx.com (Squid/2.4.STABLE6)”
_ ErrorHeader set Via “1.1 squid.proxy.companyx.com (Squid/2.4.STABLE6)”
_ Header set X-Cache “MISS from www.nonexistenthost.com”
_ ErrorHeader set X-Cache “MISS from http://www.nonexistenthost.com/ - www.nonexistenthost.com “
Bu kayýtlar aþaðýda gösterildiði gibi “Via” ve “X-Cache” ibarelerini bütün HTTP cevap baþlýklarýna ekler:
# telnet localhost 80
Trying 127.0.0.1…
Connected to localhost.
Escape character is ’^]’.
HEAD / HTTP/1.0
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Sun, 30 Mar 2003 21:59:46 GMT
Content-Location: index.html.en
Vary: negotiate,accept-language,accept-charset
TCN: choice
Via: 1.1 squid.proxy.companyx.com (Squid/2.4.STABLE6)
X-Cache: MISS from www.nonexistenthost.com
Content-Length: 2673
Connection: close
Bu durum sanki Squid Proxy sunucusu kullandýðýmýzý ve web verilerini olmayan bir sunucudan sunduðumuzu gösterir. Bu durum saldýrganý ya Apache sunucumuza (tabi ki baþarýsýz olacak) Squid saldýrýlarýný uygulamaya ya da olmayan ve X-Cache baþlýðýnda belirtilen bileþene saldýrý yapmaya sevk eder.
4. Üçüncü Parti Web Güvenlik Araçlarýný Kurulumu
Modsecurity veya ServerMask gibi ek üçüncü parti web güvenlik araçlarýný kurarak HTTPrint gibi günümüz web sunucu parmak izi araþtýrma araçlarýný þaþýrtmak veya tamamen egale etmek mümkündür. Yukarýdaki örnek bölümünde anlatýldýðý gibi bu tür araçlar hedef web sunucularýný bir çok isteðe boðacak ve belli cevaplar üretmeye zorlayacaklardýr. Aþaðýda HTTPrint tarafýndan üretilen bazý anormal istekler bulunmaktadýr:
192.168.139.101 – - [08/Jun/2004:11:21:40 -0400] “JUNKMETHOD / HTTP/1.0″ 501
344 “-” “-”
192.168.139.101 – - [08/Jun/2004:11:21:40 -0400] “GET / JUNK/1.0″ 400 381 “-”
“-”
192.168.139.101 – - [08/Jun/2004:11:21:40 -0400] “get / HTTP/1.0″ 501 330 “-”
“-”
192.168.139.101 – - [08/Jun/2004:11:21:40 -0400] “GET / HTTP/0.8″ 200 1456 “-”
“-”
192.168.139.101 – - [08/Jun/2004:11:21:40 -0400] “GET / HTTP/1.2″ 200 1456 “-”
“-”
192.168.139.101 – - [08/Jun/2004:11:21:40 -0400] “GET / HTTP/3.0″ 200 1456 “-”
“-”
192.168.139.101 – - [08/Jun/2004:11:21:40 -0400] “GET /../../ HTTP/1.0″ 400 344
“-” “-”
Eðer Apache sunucularý için ModSecurity gibi bir araç implement etmek istersek bu anormal istekler nedeniyle tetiklenecek HTTP RFC uyumlu filtreler üretebiliriz. Ýþte kullanýlabilecek ModSecurity httpd.conf kayýtlarý:
# This will return a 403 – Forbidden Status Code for all Mod_Security actions
SecFilterDefaultAction “deny,log,status:403″
# This will deny directory traversals
SecFilter “\\\\\\\\\\\\\\\\\\.\\\\\\\\\\\\\\\\\\./”
# This entry forces compliance of the request method. Any requests that do NOT
# start with either GET|HEAD|POST will be denied. This will catch/trigger on
# junk methods.
SecFilterSelective THE_REQUEST “!^(GET|HEAD|POST)”
# This entry will force HTTP compliance to the end portion of the request. If
# the request does NOT end with a valid HTTP version, then it will be denied.
SecFilterSelective THE_REQUEST “!HTTP\\\\\\\\\\\\\\\\\\/(0\\\\\\\\\\\\\\\\\\.9|1\\\\\\\\\\\\\\\\\\.0|1\\\\\\\\\\\\\\\\\\.1)$”
5. Kaynak Kodu Deðiþtirme
Bu parmak izi deðiþtirme önlemlerinden en zor fakat en etkili olaný budur. Bu iþte riskin ödüle oraný programlama becerinizin seviyesine ve web yapýnýza göre büyük ölçüde deðiþebilir. Genel olarak konuþursak, bu iþi web sunucunuzun kaynak kodunu derlemeden önce veya makina kodunu bir editör yardýmý ile direk olarak deðiþtirerek yapabilirsiniz. Apache gibi açýk kaynak kodlu web sunucularý için bu iþ daha kolaydýr çünkü kaynak koduna eriþiminiz vardýr.
Baþlýk Sýralamasý – Aþaðýdaki Apache 1.3.29 sunucusu için DATE/SERVER sýralamasýný düzeltecek ve IIS OPTIONS çýktý bilgisini taklit edecek bir yama kodudur. Bu yama /apache_1.3.29/src/main dizini içerisindeki http_protocol.c dosyasýný yeniler. OPTIONS bölümü normal olarak IIS cevap alanlarý ile iliþkilendirilen baþlýklarýn dönülmelerini saðlar. Bu baþlýklar Public, DASL, DAV ve Cache-Control’ü kapsar.
— http_protocol.c.orig Mon Apr 26 02:11:58 2004
+++ http_protocol.c Mon Apr 26 02:43:31 2004
@@ -1597,9 +1597,6 @@
/* output the HTTP/1.x Status-Line */
ap_rvputs(r, protocol, ” “, r->status_line, CRLF, NULL);
- /* output the date header */
- ap_send_header_field(r, “Date”, ap_gm_timestr_822(r->pool, r->request_time));
-
/* keep the set-by-proxy server header, otherwise
* generate a new server header */
if (r->proxyreq) {
@@ -1612,6 +1609,9 @@
ap_send_header_field(r, “Server”, ap_get_server_version());
}
+ /* output the date header */
+ ap_send_header_field(r, “Date”, ap_gm_timestr_822(r->pool, r->request_time));
+
/* unset so we don’t send them again */
ap_table_unset(r->headers_out, “Date”); /* Avoid bogosity */
ap_table_unset(r->headers_out, “Server”);
@@ -1716,7 +1716,9 @@
ap_basic_http_header(r);
ap_table_setn(r->headers_out, “Content-Length”, “0″);
+ ap_table_setn(r->headers_out, “Public”, “OPTIONS, TRACE, GET, HEAD, DELETE, PUT, POST, COPY, MOVE, MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH”);
ap_table_setn(r->headers_out, “Allow”, make_allow(r));
+ ap_table_setn(r->headers_out, “Cache-Control”, “private”);
ap_set_keepalive(r);
ap_table_do((int (*) (void *, const char *, const char *))
ap_send_header_field,
Saygýlar..