使用nmap对ip扫描发现域名,放进hosts中去访问80,还有5000存在docker

img

打开网站发现是一个卖花的

img

没什么可用信息,扫一下网站目录

img

有一个admin,访问查看

img

存在一个注册页面,查了一下有这个cms,但是具体版本没办法找到,所以先放一放image-20240701154742374

注册一个账号登录网页看看有没有信息,因为这是个卖花的,所以买一朵花看看

img

大概意思就是购买成功了,出示二维码可以折扣,我们找一下二维码

img

找了半天,发现在右上角

img

进入之后发现有三种卡可以升级

img

但是我升级的时候发现三张卡是不同的域名,鼠标悬停就可以显示

img

抓包看一下参数

img

bank是显示域名,将bank改成本地的IP地址,再用python搭建一个局域网看看有没有访问记录

img

有回显但是501报错了,用别的方法试一下api

img

没找到这个域名,那就把这个加进hosts中

img

img

这个报错是405,说明请求方式不对,那就改成POST请求

img

请求方式对了,但是缺少参数,或者是格式有问题,再进行修改,将POST参数加进去

img

把参数加进去之后回显了402报错,具体报错信息我查了,感觉

img

到这里我没思路了,大概就是需要触发条件,借鉴了一下大佬的py:猜测是需要某种条件才能接受,使用flask框架写一个简单python服务脚本,这个脚本当客户端以POST方法请求/api/payments/时,服务器会返回一些信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from flask import Flask, jsonify
# 创建Flask应用
app = Flask(__name__)
# 预定义的任务数据,这里用于模拟支付信息的返回
tasks = { "status": "200", # HTTP状态码
"message": "OK", # 返回消息
"cardname": "sun", # 演示用卡名
"cardnumber": "12345678901" # 演示用卡号}
# 定义路由和方法,这里仅允许POST请求
@app.route('/api/payments/', methods=['POST'])
def get_tasks(): # 将预定义的支付信息以JSON格式返回
return jsonify(tasks)
# 程序入口,指定主机和端口
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)

img

编写好py后直接运行,然后我们将刚刚抓的包,重放一下试试,就会发现可以有正确回显,我们再重新抓包,修改bank地址,改成我们自己的ip,然后发包就会得到一个二维码

img

img

我们把二维码保存下来,然后重新去买花,重新购买一朵花,然后回到自己主页,过几秒钟就会得到一个短信通知image-20240701170057913

img

大概意思花明天就到,把二维码上传,给我们打折

上传后没什么动静了,我们将二维码解密看看内容

img

解码后有对应的信息和购买人

img

回过头发现这个框子可以输入文字,那就试一试XSS看看能不能获取到cookie

ef6572e4cd58bb39a3f4e82fc64fe9f0.0d341bcdc6746f1d452b3f4de32357b9.

将我们要上传的二维码换成攻击的二维码,更换方法

img

然后我们上传这个二维码,再将xss攻击的语句放在输入框中,进行监听

img

以为没成功,重新访问了一下,发现好了,获取到cookie了,我们将cookie逆解密得到对应的参数和信息

img

然后去登录admin

img

成功进入后台,进入后台之后点击change passwd 发现里面有几个用户

img

查看morty得到密码

img

使用脚本快速解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import concurrent.futures
from passlib.hash import django_pbkdf2_sha256

# 哈希值,应替换为具体的哈希字符串
hash = 'pbkdf2_sha256$600000$y7K056G3KxbaRc40ioQE8j$e7bq8dE/U+yIiZ8isA0Dc0wuL0gYI3GjmmdzNU+Nl7I='
# 从哈希字符串中提取轮数和盐值
parts = hash.split('$')
rounds = int(parts[1])
salt = parts[2]

# 读取所有密码到内存中
with open("../rockyou.txt", "r", errors="ignore") as f:
passwords = [line.strip() for line in f]

def check_password(password):
"""检查密码是否匹配给定的哈希值"""
if django_pbkdf2_sha256.hash(password, rounds=rounds, salt=salt) == hash:
return password
return None

# 使用多线程来加速哈希计算
with concurrent.futures.ThreadPoolExecutor() as executor:
future_to_password = {executor.submit(check_password, pwd): pwd for pwd in passwords}
for future in concurrent.futures.as_completed(future_to_password):
result = future.result()
if result:
print("password: " + result)
break

使用多线程进行爆破,可以加快速度(kaliCPU核心给的少的慎用!!!!!)

img

我的已经卡死,没办法用的物理机跑

成功破解出的密码是jonasbrothers,直接使用ssh登录

img

连上来之后发现没有user.txt,说明还得继续,使用ps查看进程发现另外一个用户也进程存在

img

查了一下这个东西

img

这个叫harvest的应用,指定日志文件的存储路径为 /home/alex/.harvest_logs ,-l 选项通常用于设置日志输出的位置。这意味着 harvest 服务器将其活动日志保存到指定的目录中,morty用户有该应用的权限,下载下来,在/usr/local/bin,之后没思路了,这个题目有点难,网上有一种非预期的解法很简单,但是被作者修复了,后面在研究,太菜了