Nmap açık kaynak kodlu, kullanımı çok yaygın olan bir port tarama yazılımıdır. Yazılımın gelişen sürecinde sadece port tarama özellikleri olan bir yazılım olarak kalmamış, betik desteği ile bir framework haline gelmiştir. Nmap betikleri ile belirlenen porte ve sunucular üzerinde uygulama seviyesinde bir takım işlemler gerçekleştirilebilmektedir. Keşif çalışmalarından, kaba kuvvet saldırılarına, zafiyet taramalarından servis dışı bırakma işlemlerine kadar bir çok kategoride yeteneğe sahiptir. Özellikle sızma testi uzmanları için çok sık kullanılan bir araç haline gelen Nmap, hem sistem yöneticileri için hemde ağ yoneticilerici için olmazsa olmaz yazılımlar arasına girmiştir.
Betikler yardımı ile porte tarama işleminin dahada ötesine gidilerek, özellikle sızma testleri için bir çok iş yapılabilir hale gelmektedir. Betikleri güçlü yapan şey ise Nmap API leri olarak göze çarpmaktadır. Nmap API'lerinin yardımı ile bir çok iş hızlı ve kolay bir şekilde gerçekleştirilebilmektedir. Bu yazıda anlatılacaklar Kali Linux dağıtımı üzerinde Nmap 6.25 surumu ile denenmiş olup, muhtemelen diğer dağıtım ve sürümler içinde uygulanabilir olacaktır.
Bu yazıda örnek bir Nmap betik geliştirme surecinden ve temel Nmap API'lerinden bahsedilecektir. Nmap kurulumu ile birlikte bir çok betik ön tanımlı olarak gelmektedir. Kali Linux dağıtımı altında Nmap ile birlikte gelen betiklere /usr/share/nmap/scripts/dizininden erişim sağlanabilmektedir. Betik kullanımı için --script parametresi kullanılmaktadır. Hedef web sunucusuna ait HTTP başlıklarını listeleyen örnek http-headers.nsebetiğinin çalıştırılması için Nmap aşağıdaki şekilde çalıştırılmaktadır.
# nmap -Pn -sS -p 80 --script=http-headers.nse www.google.com.tr
Starting Nmap 6.25 ( http://nmap.org ) at 2013-05-23 21:30 EDT
Nmap scan report for www.google.com.tr (173.194.70.94)
Host is up (0.049s latency).
rDNS record for 173.194.70.94: fa-in-f94.1e100.net
PORT STATE SERVICE
80/tcp open http
| http-headers:
| Date: Thu, 30 May 2013 10:49:57 GMT
| Expires: -1
| Cache-Control: private, max-age=0
| Content-Type: text/html; charset=UTF-8
| Set-Cookie: PREF=ID=5dac6be88fb7ee88:FF=0:TM=1369910997:LM=1369910997:S=0GLrBrnFqrxXWfJ8; expires=Sat, 30-May-2015 10:49:57 GMT; path=/; domain=.google.com.tr
| Set-Cookie: NID=67=TWlq82N4k5YMo1tGqlMIMPaDzwzB81LaUp3prKTGik3HKKSV_au2ab0UwfLVM8soN4GfauO70dKQpKckkJ1SdPSY6gIPlEPxqCH3yuxUwd0AuDy4EiVLAfAjzLhB0q0W; expires=Fri, 29-Nov-2013 10:49:57 GMT; path=/; domain=.google.com.tr; HttpOnly
| P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
| Server: gws
| X-XSS-Protection: 1; mode=block
| X-Frame-Options: SAMEORIGIN
| Connection: close
|
|_ (Request type: HEAD)
Nmap betikleri genel olarak 3 kısımdan oluşmaktadır. Kural kısmında betiğin çalışmasından önce gerekli adımları belirlenmektedir. Bu bolum portrule, hostrule, prerule ve postrule kısımlarından en az bir tanesini içermelidir. portrule kısmı ile port ve host bazlı olarak ele almaktadır. action = function(host, port) ifadesi ile betiğe ait çalışması gereken kısımlar ele alınmaktadır.
Aşağıdaki betik ile hedef web sunucusuna ait sayfa içerikleri içerisinde password = XXX ifadesinin olup olmadığı aranmaktadır.
description = [[
Hedef web sunucusunda index.html icerigini sunan sunucularin iceriginde password = XXX gecip gecmedigini arar.
]]
author = "Gokhan ALKAN"
license = "GPL 2.0"
categories = {"default","discovery"}
local http = require "http"
local nmap = require "nmap"local shortport = require "shortport"
portrule = function(host, port)
return port.protocol == "tcp"
and port.number == 80
and port.state == "open"
end
action = function(host, port)
local options = {header={}}
options['header']['User-Agent'] = "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
local uri = "/index.html"
local response = http.get(host, port, uri, options)
if ( response.status == 200 ) then
local title = string.match(response.body, "password = [^\n]*")
return title
end
end
portrule kısmı, port ve host kısmına bakarak işlem gerçekleştirir. Örneğin aşağıdaki şekilde bir portrule tanımı yapılıp belirtilen şekilde nmap taraması gerçekleştirildiğinde;
portrule = function(host, port)
return port.protocol == "tcp"
and port.number == 80
and port.state == "open"
end
tarama sonucunda 80/tcp portu açık olan sunucu adresleri için işlem gerçekleştirileceği anlamına gelmektedir. Bu tanımlamanın portrule = shortport.http gibi olması durumunda ise sadece http ve https portları ele alınmaktadır.
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) ifadesi ile gönderilecek olan http isteği başlıl bilgisi belirlenmektedir. Gönderilen istek sonusucunda Apache web sunucusunda isteğe ait oluşan kayıt bilgisi görüldüğü gibi olmaktadır.
127.0.0.1 - - [23/May/2013:22:28:17 -0400] "GET /index.html HTTP/1.1" 200 475 "-" "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
if ( response.status == 200 ) ifadesi ile index.htmlsayfasının hedef sunucu tarafından sunulmasının doğrulanma işlemi kontrol edilmektedir. HTTP sunucuları basarili istekler için istemciye 200 OK yanıtını dönmektedir. Bu ifadenin ardından aşağıdaki ifade ile gelen cevap içerisinde password = XXX kriterinin geçip geçmediği kontrol edilmektedir.
local title = string.match(response.body, "password = [^\n]*")
return title
Betik 127.0.0.1 IP adresine kurulu bir web sunucu üzerinde aşağıdaki şekilde denenmiş ve alınan çıktı gösterilmiştir. Web sunucusu tarafından sunulan içerik ise aşağıdaki gibi olmaktadır.
# cat /var/www/index.html
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
password = 123456
<p>The web server software is running but no content has been added, yet.</p>
</body></html>
Görüldüğü gibi sayfa içeriğinde password = 123456 ifadesi geçmektedir. Betikhttp_sample.nse ismi ile /tmp dizinine kaydedilerek aşağıda gösterildiği şekilde çalıştırılmasının sonucunda aşağıdaki çıktı alınmaktadır.
# nmap -Pn -sS -p 80,443,8080 --script=/tmp/http_sample.nse localhost
Starting Nmap 6.25 ( http://nmap.org ) at 2013-05-23 22:11 EDT
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000090s latency).
Other addresses for localhost (not scanned): 127.0.0.1
PORT STATE SERVICE
80/tcp open http
|_galkan: password = 123456
443/tcp closed https
8080/tcp closed http-proxy
Kaynaklar
http://resources.infosecinstitute.com/nmap-scripting-example/
http://nmap.org/book/nse-usage.html#nse-categories
Yazar: Gökhan ALKAN, twitter: @cigalkan
0 comments:
Post a Comment