おふとん

IT全般、セキュリティとかCTFとかに偏りがち

Node1 Writeup

https://ohuton.hatenadiary.jp
の続き

この記事はWriteupです。
本問題のネタバレになってしまうので
それを理解の上で見てください。
また引き続きツールの導入や使用法は省略



まず目標は以下のようになります
目標:ユーザー、rootのflagを見つける
これは
userのflag:一般ユーザーでログインする
rootのflag:一般ユーザーから権限昇格する

と言い換えることも可能でほとんどの問題がこの流れだと思われます。
よってまずはSSHなどでログインすることを目標とします。

1.ポートスキャン

まずは作成したホストオンリーネットワークから対象となるホストを探します。
今回は1つ余計なホストが紛れ込んでいますが結果的には192.168.58.4でした。

$ sudo nmap -sP 192.168.58.0/24
Starting Nmap 7.70 ( https://nmap.org ) at 2018-08-30 00:43 JST
Nmap scan report for 192.168.58.2
Host is up (0.000090s latency).
MAC Address: 08:00:27:C4:9A:3C (Oracle VirtualBox virtual NIC)
Nmap scan report for 192.168.58.4
Host is up (0.00022s latency).
MAC Address: 08:00:27:A2:8A:95 (Oracle VirtualBox virtual NIC)
Nmap scan report for 192.168.58.1
Host is up.
Nmap done: 256 IP addresses (3 hosts up) scanned in 8.57 seconds


次に開いているポートを探します。

$ sudo nmap -sS -Pn -O -A 192.168.58.4
Starting Nmap 7.70 ( https://nmap.org ) at 2018-08-30 00:52 JST
Nmap scan report for 192.168.58.4
Host is up (0.00031s latency).
Not shown: 998 filtered ports
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 dc:5e:34:a6:25:db:43:ec:eb:40:f4:96:7b:8e:d1:da (RSA)
|   256 6c:8e:5e:5f:4f:d5:41:7d:18:95:d1:dc:2e:3f:e5:9c (ECDSA)
|_  256 d8:78:b8:5d:85:ff:ad:7b:e6:e2:b5:da:1e:52:62:36 (ED25519)
3000/tcp open  http    Node.js Express framework
| hadoop-datanode-info: 
|_  Logs: /login
| hadoop-tasktracker-info: 
|_  Logs: /login
|_http-title: MyPlace
MAC Address: 08:00:27:A2:8A:95 (Oracle VirtualBox virtual NIC)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.10 - 4.11, Linux 3.16 - 4.6, Linux 3.2 - 4.9, Linux 4.4
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.31 ms 192.168.58.4

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 18.76 seconds


様々な情報が出て来ますが最低限22/tcpssh、3000/tcpでhttpが動いているのさえ把握出来れば問題ないです。
またこれらのスキャンは決して外部には撃たないように気を付けて下さい。

2.Webサーバにアクセス

f:id:yu_sh38:20180830193338p:plain
f:id:yu_sh38:20180830193409p:plain
http//192.168.58.4:3000にアクセスするとトップページとログインフォームのページが確認出来ます。


まずはフォームに対してSQLインジェクションを試行しました。
POSTでJSON形式のユーザー名とパスワードを送信する方式なので

POST /api/session/authenticate HTTP/1.1
Host: 192.168.58.4:3000
Content-Type: application/json

{"username":"1","password":"1"}

で作成したjsonpost.txtを使用して

$ python sqlmap.py http://192.168.58.4:3000/api/session/authenticate -r jsonpost.txt

で実行しましたが脆弱性はありませんでした。


その後、NiktoやDirbを用いてWebページの構造を調べましたが大した成果はなし、結局手動でスクリプトの欄からユーザーリストのようなものを見つけました。良い感じにクローリングしてくれるツールとかありそう。


f:id:yu_sh38:20180830195238p:plain
するとユーザー名とパスワードのハッシュ一覧がありましたので登録してあるハッシュ値ならデコード出来るサイトでハッシュ値からパスワードを復元しました。
このパスワードを用いてログインするとadmin権限がある場合はmyplace.backup.txtがダウンロード出来ます。
CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.

3.backupファイル解析

f:id:yu_sh38:20180830201435p:plain
myplace.backup.txtを見ると内容が分かりません。文字種からBase64エンコードだと判断し、CyberChefを用いて復号化しました。
https://gchq.github.io/CyberChef/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true)



f:id:yu_sh38:20180830201644p:plain
一定文字数を超えるとダウンロードのみになるんですね...(初めて見ました)
これをdownload.datとして保存します。


f:id:yu_sh38:20180830202130p:plain
vimでdownload.datを開くと先頭がPKから始まっていたためZIP Formatだと判断し、拡張子をzipに変更します。


f:id:yu_sh38:20180830202147p:plain
...ですよね。

$ ./john-1.8.0-jumbo-1/run/john --wordlist=./john-1.8.0-jumbo-1/run/wordlist.txt ./list.hashes 
Loaded 1 password hash (PKZIP [32/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
magicword        (download.zip)
1g 0:00:00:00 DONE (2018-08-30 20:25) 16.66g/s 3048Kp/s 3048Kc/s 3048KC/s majid..madeli
Use the "--show" option to display all of the cracked passwords reliably
Session completed

John The Ripperを使ってパスワードを解読します。ここが中々、上手くいくリストが無く苦労しました。
John The Ripperはリストの組み合わせまではしてくれないんですね。
解凍したフォルダを探索するとapp.jsに以下のような部分が存在します。


f:id:yu_sh38:20180830203628p:plain
MongoDBへのURLです。SSHログインのssh://user:pass@ip/repo/の記法で見ることはあるかと思います。
ここでmarkがDBサーバとubuntuのログインパスワードを一緒のものにしていると考えubuntuにログインを試行します。


f:id:yu_sh38:20180830203919p:plain
行けました。パスワードの使い回し怖いですね...


4.権限昇格

解け次第追記
Privilege Escalation - ATT&CK for Enterprise
これらのどれかがハマるんでしょうね。
にしてもこれペネトレーションテストではなく完全にCTFでは()