Sqlmap Veritabanı Kullanıcısı Şifre Kırma / Pentester

Pentester

Özel Üye
8 Eyl 2016
1,646
1
1,001
Bu videoda, Sqlmap ile mysql veritabanı kullanıcısının yetkilerine ve rollerine baktım. Aynı zamanda, mysql kullanıcısının şifresini kırdım. Bu şekilde uzak mysql bağlantısı yapabilirsiniz. Bir sonraki videoda, sqlmap ile sql sorgusu çalıştırma, dosya okuma, shell açma, işletim sistemi komutları çalıştırmaya yarayan parametrelerinden bahsedeceğim.

VİDEO

[ame]https://www.youtube.com/watch?v=Riw1hWoqXP4&feature=youtu.be[/ame]
 

Anonim6

Yeni üye
29 Şub 2012
0
5
Öncelikle emeğine sağlık, Eray
Videonu izledim, her şey gayet güzelce açıklanıp anlatılmış. Buna ek olarak, ben de bu parametrelerin arka planda neleri gerçekleştirdiklerine değinmek istiyorum ki kişiler parametreleri ezberlemek yerine öğrensinler. Anlatımım güncel SQLMAP uygulamasının (VERSION = "1.1.4.27") GitHub depoları üzerinden olacak. Başlangıcımızı, bu parametrelerin hangi fonksiyonları çağırdıklarına göz ataraktan yapalım.
Düzenleme: "Bu herif ne anlatmış bu kadar" dendiğini duyar gibi oldum. Siz beni takmayın, buralar analiz safhası. Tüm olay son 3 paragrafta, he diyip geçin.

'lib/parse/cmdline.py' dosyasına göz atıldığı taktirde, kullanıcıyı aşağıdaki gibi bir kod blogu karşılayacaktır,
Kod:
[..]
enumeration.add_option("--passwords", dest="getPasswordHashes", [..])
enumeration.add_option("--privileges", dest="getPrivileges", [..])
enumeration.add_option("--roles", dest="getRoles", [..])
enumeration.add_option("--current-user", dest="getCurrentUser", [..])
[..]
Bu bloktan yola çıkarak, "passwords, privileges, roles" ve "current-user" komut satırı argümanlarının sırasıyla "getPasswordHashes, getPrivileges, getRoles" ve "getCurrentUser" fonksiyonlarını çağırdıklarını söyleyebiliriz. Gelenek bozulmasın, ben "getCurrentUser"ın ne halta yaradığını açıklayaraktan devam edeyim.

Herhangi bir veritabanı yazılımının 'enumeration.py' dosyasına (örn. plugins/dbms/oracle/enumeration.py) göz attığımızda, "Enumeration" adında bir sınıf tanımlamasının yapıldığını görüyoruz,
Kod:
class Enumeration(GenericEnumeration):
    def __init__(self):
        GenericEnumeration.__init__(self)
[..]
Sınıfın mimarisini anlamak açısından, önce miras aldığı "GenericEnumeration" sınıfını incelemeliyiz. Bunun için, yukarıda içe aktarılan kütüphanelere baktığımızda bizi şu aktarım karşılıyor,
Kod:
from plugins.generic.enumeration import Enumeration as GenericEnumeration
'Enumeration' sınıfımızın kendi tanımlamasında kullanılan 'GenericEnumeration' objesi, 'plugins/generic/enumeration.py' dosyasında bulunuyor imiş. Ki zaten dosyaya gittiğimizde, bizi o sınıfın tanımlaması karşılıyor,
Kod:
class Enumeration([..], Users):
    def __init__ (self):
        [..]
        Users.__init__(self)
[..]
Bu sınıfta yer alan 'Users' objesine dikkat çekmek istiyorum, sonrasında bu sınıfa geri döneceğiz. Bu yüzden nereden içe aktarıldığına bakıp, 'Enumeration' sınıfımıza göz atmaya devam edelim.
Kod:
from plugins.generic.users import Users
'Enumeration' sınıfında yer alan 'getRoles (master, query2=False)' fonksiyonu, aşağıdaki gibi bir kod blogu içermekte. Bu kod blogunda yer alan 3. satırda, 'self.getCurrentUser ()' deyimciğinden sınıf içerisinde yer alan 'getCurrentUser' fonksiyonunun çağırıldığını görüyoruz.
Kod:
if conf.user == "CU":
    infoMsg += " for current user"
    conf.user = self.getCurrentUser()
'conf.user' değişkeni, '--current-user' parametresinin karşılığı olan 'getCurrentUser' fonksiyonunun değerini taşımakta. Bunun nasıl gerçekleştirildiğini bulmak için de, 'getCurrentUser' fonksiyonuna göz atmalıyız. E biz ne Enumeration, ne de GenericEnumeration sınıflarında böyle bir tanımlamaya rast gelmedik? Şimdi, biraz önce bahsettiğim 'Users' sınıfına dönebiliriz. Kendisinin tanımlaması, 'plugins/generic/users.py' dosyasında yapılmakta.
Kod:
class Users (object):
    """
    This class defines users' enumeration functionalities for plugins.
    """
    def __init__ (self):
        [..]
        kb.data.currentUser = ""

    def getCurrentUser(self):
        [..]
Bu noktada artık gidilecek pek bir yer kalmadı, method tanımlamamıza göz attığımızda her şey gayet açık.
Kod:
def getCurrentUser(self):
    [..]
    query = queries[Backend.getIdentifiedDbms()].current_user.query
    if not kb.data.currentUser:
        kb.data.currentUser = unArrayizeValue(inject.getValue(query))
    return kb.data.currentUser
Sınıfın işlenmesi durumunda, 'kb.data.currentUser' değişkeninin değeri sıfırlanıyor. Bu methodda ise, 'kb.data.currentUser' değerinin bulunmaması durumunda 'query' adındaki değişkende taşınan, enjekte olacak sorgu değeri web aplikasyonuna gönderiliyor. Gelen cevap da, yani aplikasyonun veritabanı bağlantısında süregelmekte olan kullanıcı, currentUser olarak atanıyor. Analizimiz buraya kadar, bizim için önemli olan asıl nokta, enjekte olunacak sorgu ne? Kod parçacığından anlaşılıyor ki, bu sorgu ifadesi, queries objesinde yer alan 'current_user.query' dalında bulunuyor.
Kod:
queries[Backend.getIdentifiedDbms()].current_user.query
Burada, "Backend.getIdentifiedDbms ()" ise objede yer alan, uygun DBMS yazılımının sorgusunu ele almak adına kullanılıyor. Bu noktada yapacağımız şey, 'queries' objesinin nerede tanımlandığına bakmak. Fazla uzatmadan, tanımlaması 'lib/core/option.py' dosyasında, '_loadQueries' fonksiyonunun döndürdüğü değer ile yapıldığını söyleyeyim.
Kod:
def _loadQueries():
    """
    Loads queries from 'xml/queries.xml' file.
    """
    pass
Yorum satırından da anlaşılacağı üzere, tüm sorguların düzenli olarak bulunduğu konum 'xml/queries.xml' dosyası. Bu dosyaya bakındığımızda, aslında "queries[<MYSQL>].current_user.query" değerinin "CURRENT_USER ()" sorgusuna eşit olduğunu görüyoruz.
Kod:
<current_user query="CURRENT_USER()"/>
Evet arkadaşlar, kaynağı bulduk. MySQL için, "passwords, privileges, roles" parametrelerinin de aslında hangi sorguları çağırdıklarını göstererekten, yazıya son vermek istiyorum.
Kod:
<users>
    <inband query="SELECT grantee FROM INFORMATION_SCHEMA.USER_PRIVILEGES" query2="[..]"/>
    [..]
</users>

<passwords>
    <inband query="SELECT user,password FROM mysql.user" condition="user"/>
    [..]
</passwords>

<privileges>
    <inband query="SELECT grantee,privilege_type FROM INFORMATION_SCHEMA.USER_PRIVILEGES" condition="grantee" query2="[..]" condition2="user"/>
</privileges>
Komutları da hemencecik, lokal ağımda yer alan MySQL servisinde çalıştıraraktan deneyeyim.
Kod:
mysql> SELECT grantee FROM INFORMATION_SCHEMA.USER_PRIVILEGES;
> grantee
'root'@'localhost'
[..]
57 rows in set (0.00 sec)
Kod:
mysql> SELECT user,authentication_string FROM mysql.user
> user:authentication_string
'root' - '<HASH>'
[..]
3 rows in set (0.00 sec)
gibi gibi.. Bu yazıyı yazarak dikkat çekmek istediğim nokta, adı sanı ne olursa olsun (ister Havij, ister SQLMap, ister Hıyar ister Şekerpare v1.0), bu tarz enjeksiyon yazılımlarının 'TÜMÜ'nün asıl yaptığı halt, manuel olarak gerçekleştirebileceğiniz, enjekte edebileceğiniz sorguları otomatikleştirmektir. Arka planda ne yaptığını bilmeksizin dalmak, düpedüz avelliktir. Hangimiz dibini görmediği gölette yüzer ki? Umarım mantığını kavratmış, bir şeyler aktarabilmişimdir. İyi forumlar dilerim efendim. Tekrardan ellerine, emeğine sağlık kardeşim.

j8rdyj.png

< Akıyo bu akşam maşallah. >​
 
Son düzenleme:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.