Browse Source

Added files readme, 101 improvements

Giulio 4 years ago
parent
commit
bd10b76b07
2 changed files with 160 additions and 25 deletions
  1. 152 25
      Readme.md
  2. 8 0
      stuff/Readme.md

+ 152 - 25
Readme.md

@@ -8,9 +8,9 @@ As a penetration tester I have to deal daily with Oracle DBMS, both via SQL Inje
 ## Basic Information
 ## Basic Information
 Most of the times Oracle RDMS run on linux, specifically RedHat or Oracle Linux. The most version I found in the wild were 9 which is extremely old, 10, 11 as most common and 12 in the best cases.
 Most of the times Oracle RDMS run on linux, specifically RedHat or Oracle Linux. The most version I found in the wild were 9 which is extremely old, 10, 11 as most common and 12 in the best cases.
 Oracle has an official client called `sqlplus`. Sometimes it is extremely useful to have `sqlplus` and the import and export utilities ready in standalone packages. Please see the #Downloads sections for that.
 Oracle has an official client called `sqlplus`. Sometimes it is extremely useful to have `sqlplus` and the import and export utilities ready in standalone packages. Please see the #Downloads sections for that.
-Oracle instances are defined in a file called `tnsmaes.ora` where an instance name is associated to a connection string.
+Oracle instances are defined in a file called `tnsnames.ora` where an instance name is associated to a connection string.
 
 
-Example tnsnames.ora:
+Example `tnsnames.ora`:
 
 
 ```
 ```
 PROD_DB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = 10.50.50.10) (PORT = 1521)) (CONNECT_DATA = (SID = PROD)))
 PROD_DB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = 10.50.50.10) (PORT = 1521)) (CONNECT_DATA = (SID = PROD)))
@@ -40,6 +40,13 @@ sqlplus my_user@"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.1.10)(Port=15
 # For a local instance if logged in with the oracle user
 # For a local instance if logged in with the oracle user
 sqlplus "/ as sysdba"
 sqlplus "/ as sysdba"
 sqlplus "sys as sysdba"
 sqlplus "sys as sysdba"
+sqlplus my_user/my_password@PROD_DB as sysdba
+```
+
+Better formatiing:
+```
+set pagesize 0;
+sel linesize 5000;
 ```
 ```
 
 
 ## Import/Export
 ## Import/Export
@@ -49,7 +56,7 @@ Oracle uses a proprietary format both for storing the actual data on the disk an
 
 
 Both require special privileges: this means that even if you have select privileges on a table that doesn't mean you have the privilege to bulk export it. Please refer to https://docs.oracle.com/database/121/SUTIL/GUID-8B6975D3-3BEC-4584-B416-280125EEC57E.htm
 Both require special privileges: this means that even if you have select privileges on a table that doesn't mean you have the privilege to bulk export it. Please refer to https://docs.oracle.com/database/121/SUTIL/GUID-8B6975D3-3BEC-4584-B416-280125EEC57E.htm
 
 
-Now the old import export format has been reverse engineered and a python script for decosing the data is provided in the downloads section. You can also find the stabdalone utilities with the required dependencies packed.
+Now the old import export format has been reverse engineered and there's a python script available.
 
 
 ## Password hashes
 ## Password hashes
 Oracle password hashes are both stored inside the database and selectable from a privileged users and stored on disk.
 Oracle password hashes are both stored inside the database and selectable from a privileged users and stored on disk.
@@ -58,10 +65,51 @@ $ORACLE_HOME/dbs/orapw<sid> # Unix,
 %ORACLE_HOME%\database\PWD<sid>.ora # Windows
 %ORACLE_HOME%\database\PWD<sid>.ora # Windows
 ```
 ```
 ```
 ```
-> SELECT * FROM SYS.USER
-```
-
-Fopr more info http://marcel.vandewaters.nl/oracle/security/password-hashes
+> SELECT NAME, PASSWORD FROM SYS.USER$;
+SYS                            DCB748A5BC5390F2
+PUBLIC
+CONNECT
+RESOURCE
+DBA
+SYSTEM                         EED9B65CCECDB2E9
+SELECT_CATALOG_ROLE
+EXECUTE_CATALOG_ROLE
+DELETE_CATALOG_ROLE
+EXP_FULL_DATABASE
+IMP_FULL_DATABASE
+OUTLN                          4A3BA55E08595C81
+RECOVERY_CATALOG_OWNER
+GATHER_SYSTEM_STATISTICS
+LOGSTDBY_ADMINISTRATOR
+AQ_ADMINISTRATOR_ROLE
+AQ_USER_ROLE
+SCHEDULER_ADMIN
+DIP                            CE4A36B8E06CA59C
+HS_ADMIN_ROLE
+TSMSYS                         3DF26A8B17D0F29F
+_NEXT_USER
+OEM_ADVISOR
+OEM_MONITOR
+DBSNMP                         E066D214D5421CCC
+PLUSTRACE
+CTXSYS                         D1D21CA56994CAB6
+CTXAPP
+XDB                            E76A6BD999EF9FF1
+ANONYMOUS                      anonymous
+XDBADMIN
+AUTHENTICATEDUSER
+XDBWEBSERVICES
+MDSYS                          72979A94BAD2AF80
+HR                             4C6D73C3E8B0F0DA
+FLOWS_FILES                    364B78B9EABB9E56
+FLOWS_020100                   16E4C012E98710D0
+```
+Old password format is `3DES(upper($username.$password))` for <12c and an harder custom method for >12.
+Both are supported by hashcat as `-m3100` and `-m 12300`. 
+
+Fopr more info:
+ - http://marcel.vandewaters.nl/oracle/security/password-hashes
+ - https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/changes-in-oracle-database-12c-password-hashes/
 
 
 ## Recon
 ## Recon
 To begin with Oracle has plenty of system tables and views to keep track of its properties. Some of them have either `all`, `dba` or `user` prefix. What does it mean?
 To begin with Oracle has plenty of system tables and views to keep track of its properties. Some of them have either `all`, `dba` or `user` prefix. What does it mean?
@@ -77,7 +125,8 @@ From https://sqljana.wordpress.com/2016/12/21/oracle-data-dictionary-views-user-
 > DBA* Views
 > DBA* Views
 > DBA_*: Views that start with DBA_ list all objects unless restricted by the WHERE clause
 > DBA_*: Views that start with DBA_ list all objects unless restricted by the WHERE clause
 
 
-Most of the time the most useful will be the ones with the `all_` prefix, exceot if we already are dba.
+Most of the time the most useful will be the ones with the `all_` prefix, except if we already are dba.
+Query to `SYS` tables and to `dba_*` do require high privileges.
 
 
 
 
 Oracle default databases to exclude to get cleaner results for custom tables/columns/procedures (from https://github.com/sqlmapproject/sqlmap/blob/master/lib/core/settings.py):
 Oracle default databases to exclude to get cleaner results for custom tables/columns/procedures (from https://github.com/sqlmapproject/sqlmap/blob/master/lib/core/settings.py):
@@ -87,33 +136,51 @@ Oracle default databases to exclude to get cleaner results for custom tables/col
 
 
 Check Oracle version:
 Check Oracle version:
 ```
 ```
-SELECT * FROM V$VERSION;
-SELECT * FROM V$INSTANCE;
-SELECT * FROM PRODUCT_COMPONENT_VERSION;
+> SELECT BANNER FROM V$VERSION;
+Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
+PL/SQL Release 10.2.0.1.0 - Production
+CORE    10.2.0.1.0      Production
+TNS for Linux: Version 10.2.0.1.0 - Production
+NLSRTL Version 10.2.
 ```
 ```
-Get the current user:
 ```
 ```
-SELECT USER FROM DUAL;
+> SELECT INSTANCE_NAME, HOST_NAME, EDITION, VERSION FROM V$INSTANCE;
+INSTANCE_NAME    HOST_NAME                                                        EDITION VERSION
+---------------- ---------------------------------------------------------------- ------- -----------------
+XE               oracle.lsd.cat                                                   XE      10.2.0.1.0
 ```
 ```
-Get the instance name:
 ```
 ```
-SELECT SYS_CONTEXT('USERENV','INSTANCE_NAME') FROM DUAL;
-SELECT SYS_CONTEXT('USERENV', 'SID') FROM DUAL;
+> SELECT PRODUCT, VERSION FROM  PRODUCT_COMPONENT_VERSION;
+
+PRODUCT                                                          VERSION
+---------------------------------------------------------------- ----------------------------------------------------------------
+NLSRTL                                                           10.2.0.1.0
+Oracle Database 10g Express Edition                              10.2.0.1.0
+PL/SQL                                                           10.2.0.1.0
+TNS for Linux:                                                   10.2.0.1.0
+
 ```
 ```
-Check if user is DBA:
+
+Get the current user:
+```
+SELECT USER FROM DUAL;
+SELECT USERNAME FROM USER_USERS;
 ```
 ```
 
 
+Get current user privileges:
+```
+SELECT * FROM SESSION_PRIVS;
 ```
 ```
 Check if Java is available:
 Check if Java is available:
 ```
 ```
-SELECT dbms_java.get_ojvm_property(PROPSTRING=>'java.version') FROM DUAL;
+SELECT DBMS_JAVA.GET_OJVM_PROPERTY(PROPSTRING=>'java.version') FROM DUAL;
 ```
 ```
 
 
 List all users
 List all users
 ```
 ```
-SELECT USER FROM SYS.USER$
-SELECT USER, PASSWORD FROM SYS.USER$;
-SELECT USERNAME from DBA_USERS;
+SELECT USER, PASSWORD FROM SYS.USER$
+SELECT USERNAME, PASSWORD from DBA_USERS;
+SELECT USERNAME FROM ALL_USERS;
 ```
 ```
 
 
 List all databases
 List all databases
@@ -135,19 +202,79 @@ SELECT OWNER, TABLE_NAME, COLUMNS NAME FROM ALL_TAB_COLUMNS;
 Linked instances
 Linked instances
 ```
 ```
 SELECT * FROM SYS.LINK$;
 SELECT * FROM SYS.LINK$;
+SELECT * FROM DBA_DB_LINKS;
+SELECT OWNER, USERNAME, HOST, DB_LINK FROM ALL_DB_LINKS;
 ```
 ```
+Password for DB Links may be cleartext, encrypted or non present depending on the version. See #Linked_Instances
 
 
-Past queries:
+It is also possibile to view past queries. This is extremely useful to understand how the database is being used.
 ```
 ```
 SELECT SQL_TEXT FROM V$SQL;
 SELECT SQL_TEXT FROM V$SQL;
-SELECT * FROM WRH$_SQLTEXT;
+SELECT SQL_TEXT FROM WRH$_SQLTEXT;
 ```
 ```
 
 
-## Common error based vectors
+List all procedures:
+```
+SELECT OWNER, OBJECT_NAME, OBJECT_TYPE FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY');
+```
+List user procedures:
+```
+SELECT OBJECT_NAME, OBJECT_TYPE FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY');
+```
+
+Get all non system procedures:
+```
+SELECT OWNER, OBJECT_NAME, OBJECT_TYPE FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY') AND WHERE OWNER NOT IN ('ANONYMOUS', 'APEX_030200', 'APEX_PUBLIC_USER', 'APPQOSSYS', 'BI', 'CTXSYS', 'DBSNMP', 'DIP', 'EXFSYS', 'FLOWS_%', 'FLOWS_FILES', 'HR', 'IX', 'LBACSYS', 'MDDATA', 'MDSYS', 'MGMT_VIEW', 'OC', 'OE', 'OLAPSYS', 'ORACLE_OCM', 'ORDDATA', 'ORDPLUGINS', 'ORDSYS', 'OUTLN', 'OWBSYS', 'PM', 'SCOTT', 'SH', 'SI_INFORMTN_SCHEMA', 'SPATIAL_CSW_ADMIN_USR', 'SPATIAL_WFS_ADMIN_USR', 'SYS', 'SYSMAN', 'SYSTEM', 'WKPROXY', 'WKSYS', 'WK_TEST', 'WMSYS', 'XDB', 'XS$NULL')
+
+```
+
+Get the source code of an object:
+```
+SELECT TEXT FROM ALL_SOURCE WHERE NAME = 'MY_PROCEDURE' ORDER BY LINE;
+```
+Somatimes a source code might be obfuscated with a method that Oracle calls 'wrapping'. This is the case of most default procedures. THis format is easily reversible:
+ - https://github.com/DarkAngelStrike/UnwrapperPLSQL/blob/master/unwrap.py
+ - https://www.codecrete.net/UnwrapIt/
 
 
-## Common out of bound channels
+
+## Common error based vectors
 
 
 ## Linked instances
 ## Linked instances
+Linked instances are used very often. They're very useful to an attacker because they extend the attack surface and may even allow to jump to different network.
+
+Basic Syntax:
+```
+SELECT USER FOM DUAL@MY_LINKED_DB;
+```
+
+Password are stored cleartext or a in a reversible format:
+```
+> SELECT PASSWORDX FROM SYS.LINK$;
+
+PASSWORDX
+--------------------------------------------------
+05D3BB995A60D0F7BC8724E1FB001819169BD0818171F28256
+```
+To decode the password look at:
+ - 
+ -
+
+It is important to note that the whole recon process might be done in every linked databases. The user in the linked database might have higher privileges, a different Oracle version and different procedures and packages. It might be possibile to gain RCE in a linked database and not in the one used as entry point.
+
+Queries to linked database may also be nested which means that it is possible to run queries on a database linked to a database linked to the main instance thus making a 'jump' to a third database.
+While the following syntax will not work:
+```
+SELECT USER FROM DUAL@DB1@DB2; error
+```
+It is possible to create a view or a synomin to overcome the syntax problem as described here https://stackoverflow.com/questions/2094843/possible-to-link-to-another-database-link
+```
+DB1:
+CREATE SYNONYM X FOR MyTable@sqlServerDB
+
+DB2:
+(assumes db link to DB1 connects as owner of synonym)
+SELECT * from X@DB1
+```
 
 
 ## Procedures, packages and functions
 ## Procedures, packages and functions
 
 

+ 8 - 0
stuff/Readme.md

@@ -0,0 +1,8 @@
+## Usage
+```
+LD_LIBRARY_PATH=. ORACLE_HOME=./deps ./sqplus user/password@descriptor
+```
+
+## Files
+ - x86 version is packed from the files at https://oss.oracle.com/debian/dists/unstable/non-free/binary-i386/
+ - x64 version is packed from