不会入侵渗透,水一篇低水平的文章,只写思路,有错误请指点。
场景/问题
Oracle 注入可利用 Java 执行命令,但数据库服务器不能连外网,如何获取一个可交互的 Shell?
反弹 Shell 的原理
一般在反弹 Shell 前,我们需要利用 nc 监听一个本地端口。然后在目标主机上启动一个 Shell 进程,并创建一个 socket 连接到之前 nc 监听的本地端口,将该 Shell 进程的 stdin 与 stdout 与 socket 的 stdin 与 stdout 做数据交互。
障碍
因数据库服务器无法出网,所以无法让数据库服务器利用 Socket 连回来。我们重新审视一下反弹 Shell 所需要的步骤:
本地监听端口
服务端启动 Shell 进程
服务端创建 Socket 连接连回本地的端口
服务端的 Shell 进程的 stdin & stdout 与 socket 连接的 stdin & stdout 做数据交换
第 3 步与第 4 步无法实现。 但是 Socket 只是用来做数据交换的,不通过这个反连的 Socket,也可以达到同样的数据交换的目的。
我的思路
对注入点的要求:可以回显数据。
说一下步骤,这也许不是最优的思路:
利用 Java 调用 mkfifo 在服务器上创建两个命名管道
commands,我们将利用注入点来将要执行的命令写入此管道,同时 shell 进程将从此管道读取命令并执行
output,shell 进程的所有输出将写入此管道,同时我们利用注入点从此管道内读取输出
利用 Java 在数据库服务器上启动 shell 进程,并用 Java 代码完成上面第 1 点提到的那些功能。
用一个自己写的脚本代替 nc,来处理客户端的事情
交换数据的通道由一个反连的 Socket 变成了 HTTP 的连接(注入点)。所以,这本质上应该算是一个正向的 Shell,随后利用 Python 将其提升为一个可交互的 Shell。
在写 PoC 的过程中,遇到了不少坑,印象最深的是不同的 Oracle 数据库连接,Java 运行环境是隔离的。
最后放一下 PoC 的图片
客户端 Python 脚本
原文发在了 ThreatHunter 上。