[Case #5] Deep dive into MS-SQL IR Case : Trend and attack method

데이터베이스 관리 시스템에서 중추적인 역할을 하는 MS-SQL 서버는 막대한 정보를 다루고 있다. 그러나 이러한 중요한 시스템에도 보안 취약점이 존재하며 공격 위협에 노출되고 있다. 특히, MS-SQL은 다양한 확장 기능을 제공한다. 이때, 공격에 주로 악용되는 xp_cmdshell과 CLR 저장 프로시저 확장 기능은 보안 문제를 야기할 수 있다. 이에 따라, 공격자들은 이러한 방식을 통해 공격을 수행할 가능성이 높아진다.

최근, MS-SQL 서버를 대상으로 한 공격이 지속적으로 발생하고 있으며, 이러한 공격들은 매우 위협적이다. 이에 본 글에서 최근 MS-SQL 서버를 대상으로 유행중인 공격에 대해 심층적으로 분석하고, 보안 대책 마련에 도움이 될 수 있는 방안을 제시하고자 한다.

본 글은 아래 순서로 구성되며, 이를 통해 MS-SQL 서버 보안을 강화하고 해당 기능들을 통한 침해사고를 예방하는데 기여하고자 한다.

  1. MS-SQL 서버의 취약점 및 위협 요소 소개
  2. xp_cmdshell과 CRL 저장 프로시저를 활용한 CLR Shell 공격 방식 소개
  3. 공격 로그 분석을 통한 보안 대책 제시

1. 공격 동향

ERP와 그룹웨어와 같은 소프트웨어의 보급 증가로 인해 데이터베이스에 대한 공격이 증가하고 있다. Cyber Magazine¹의 기사에 따르면, 2022년 MS-SQL 서버를 대상으로 한 공격이 전년 대비 56% 증가했다고 보고되었다. "2023-04-21" 일자 기준으로, 공개 출처 정보(OSINT) 검색 엔진을 통해 국내에서 기본 포트(1433)로 설정되어 외부에 오픈된 MS-SQL 서버는 약 2만 5천 대로 확인되었다.

[그림 1] 국내 기본 포트(1433)로 설정된 MS-SQL 서버 노출 현황 (Censys.io)

이런 공격이 집중되는 기업들은 대부분 별도의 보안 조직이나 관리 인력이 부족해, 관리가 미흡한 서버가 공격 대상으로 노출되어 있다. 데이터베이스 서버를 대상으로 한 공격 중 랜섬웨어가 대표적이며, 2021년부터 Globeimposter, Mallox, Masscan 등 다양한 랜섬웨어 공격이 확산되고 있다. 최근 Trigona 랜섬웨어 역시 관리가 미흡한 MS-SQL 서버를 공격 대상으로 삼고 있다. 이러한 랜섬웨어 감염 사례를 분석하면, 공격자는 sa 계정 같은 관리 권한을 가진 계정의 비밀번호 설정이 미흡(복잡성을 충족하지 않거나 상용 소프트웨어의 기본 비밀번호로 설정)해 무차별 공격 등으로 탈취한 후 침투한다. 그 후, xp_cmdshell이나 CLR Shell과 같은 저장 프로시저를 활용하는 악성 코드로 시스템에 직접 명령을 실행해 랜섬웨어에 감염시킨다.

최근에는 공격자들이 CLR 저장 프로시를 활용해 다양한 형태의 CLR Shell을 사용하는 추세다. 보안 기술 발전으로 인해 xp_cmdshell을 사용하려 할 때 특정 문자열이나 키워드를 우회하는 것이 어렵지만, 탐지는 상대적으로 쉽다. 그러나 CLR Shell의 경우 .NET Framework로 더 많은 기능을 사용할 수 있고, 맞춤형 로직을 작성할 수 있어 공격을 더 효과적으로 수행할 수 있기 때문에 더 큰 위협으로 인식된다.

[그림 2] 다양한 기능을 지원하는 CLR Shell

2. 공격 과정

2.1. 서버 침투

공격자는 공개 출처 정보(Shodan, Censys와 같은 검색 엔진 등)를 활용해 취약한 MS-SQL 서버를 탐색하고 공격 대상을 파악한다. 이후 무차별 대입 공격(Brute-force attack) 또는 사전 공격 (Dictionary attack)을 통해 서버에 접근할 수 있는 계정 정보를 획득하려고 시도한다. 공격자는 무차별 대입 공격이나 사전 공격을 통해 계정 정보를 획득할 수도 있지만 해킹 커뮤니티나 다크웹 등에서 판매되고 있는 계정 정보를 구매해 서버에 침투할 수도 있다.

2.2. 프로시저 활성화

기본적으로 xp_cmdshell이나 CRL 저장 프로시저는 활성화되어 있지 않은 프로시저로 공격자는 서버에 침투한 후 해당 기능을 활성화한다. 이외에도 OLE, Extended 저장 프로시저나 Agent Jobs 등을 통해 악의적인 행위가 가능하나 본 글에서는 자주 악용되는 두 가지 저장 프로시저만 분석한다.

2.2.1. xp_cmdshell

xp_cmdshell을 활성화하면 운영체제 명령을 실행할 수 있으며, 공격자는 보통 해당 기능을 통해 악성코드를 다운로드하거나 서버 내 파일을 조작하는 등의 행위를 수행한다. 해당 기능은 sysadmin 권한을 소유해야 활성화할 수 있으며, 설정 방법은 아래와 같다.

-- 전역 구성 설정 확인
EXEC sp_configure 'show advanced options', 1;

RECONFIGURE;

-- xp_cmdshell 활성화
EXEC sp_configure 'xp_cmdshell', 1;

RECONFIGURE;

2.2.2. CLR 저장 프로시저

CLR 저장 프로시저는 Common Language Runtime(CLR)을 사용해 SQL Server에서 관리 코드를 실행하는 기능으로 .NET 프로그래밍 언어(예: C#, VB.NET 등)를 사용해 데이터베이스를 조작할 수 있다. CLR Shell은 이를 악용하는 악성 코드로 공격자들은 데이터베이스를 조작하고, 시스템에 명령을 내릴 수 있다.

-- 전역 구성 설정 확인
SP_CONFIGURE 'SHOW ADVANCED OPTIONS', 1

GO

-- CLR 어셈블리 사용 허용
SP_CONFIGURE 'CLR ENABLED', 1

RECONFIGURE;

2.3. 명령 실행

xp_cmdshell을 이용한 공격에서는 SQL 명령 실행을 통해 추가적인 악성코드 다운로드 등의 과정을 거친다. 그러나, CLR 저장 프로시저에서는 직접적인 명령 실행이 복잡한 과정이 필요하다. 그 결과, 공격자들은 .NET Assembly로 작성된 CLR Shell을 SQL Server Assembly에 추가하는 방식으로 공격을 진행하게 된다.

2.3.1. xp_cmdshell

cmd.exe로 실행할 수 있는 모든 명령을 xp_cmdshell을 통해 실행할 수 있다.

  • xp_cmdshell을 호출해 명령을 실행한다.
EXEC xp_cmdshell 'whoami';
[그림 3] 명령 실행 결과 (xp_cmdshell)

2.3.2. CLR Shell

다음은 CLR Shell을 서버에 추가하고 명령을 실행하는 과정이다.

  • CLR Shell을 SQL Server 어셈블리에 추가한다.
use msdb;
GO

CREATE ASSEMBLY [어셈블리 명]
FROM '[CLR Shell 바이너리]'
WITH PERMISSION_SET = UNSAFE; --- 권한설정: 제한없음
GO
💡
msdb에 CLR Shell을 사용하는 목적은 주로 다음과 같다.

1. 지속성 확보: msdb데이터베이스는 SQL Server에 내장된 시스템 데이터베이스 중 하나로, 유저 데이터베이스와 달리 관리자에 의해 확인될 가능성이 낮으므로 지속정을 확보할 수 있다.
2. 권한 및 기능 확장: msdb는 시스템 데이터베이스로 TRUSTWORTHY 속성이 기본적으로 ON이다. 따라서, 추가 권한을 획득 하거나 기능 확장, 데이터 추출 및 조작등을 수행하기 쉽다.
  • CLR Shell을 서버에 추가한 후, 프로시저를 생성한다.
-- 어셈블리 내 프로시저로 생성
CREATE PROCEDURE [dbo].[생성할 프로시저 명] @execCommand NVARCHAR (4000) AS EXTERNAL NAME [어셈블리 명].[StoredProcedures].[어셈블리 내 함수 명]; 
GO
  • 추가한 프로시저로 명령을 실행한다.
EXEC sp_cmdExec 'whoami';
[그림 4] 명령 실행 결과 (CLR Shell)

CLR Shell은 대부분 초기 침투 이후 추가 악성 파일 다운로드 등 추가 악성 행위를 위한 중간 매개체로 활용된다. Github에 공개된 CLR Shell들의 주요 기능을 살펴보면 대부분 파일 다운로드 및 권한 상승과 같은 기본적인 기능이 주를 이룬다.

[그림 5] Github에 공개된 CLR Shell 기능 일부 - (https://github.com/mindspoof/MSSQL-Fileless-Rootkit-WarSQLKit)

이 글에서는 SQL Server 공격에 사용되는 xp_cmdshell과 CLR Shell을 살펴봤다. xp_cmdshell은 직접 명령 실행이 가능한 반면, CLR Shell은 DLL 로드 과정을 거쳐 실행되며, 공격자들은 .NET Assembly로 작성된 CLR Shell을 SQL Server Assembly에 추가해야 한다. 다음 글에서는 이 두 저장 프로시저를 이용한 공격에서 남는 로그 및 아티팩트들을 확인해 공격 기법에 대한 이해를 기반으로 로그 설정 방법을 알아보겠다.


Reference

  1. https://cybermagazine.com/articles/microsoft-sql-server-attacks-rise-by-56-in-2022
  2. https://github.com/mindspoof/MSSQL-Fileless-Rootkit-WarSQLKit
  3. https://learn.microsoft.com/ko-kr/sql/relational-databases/system-stored-procedures/xp-cmdshell-transact-sql?view=sql-server-ver16
  4. https://learn.microsoft.com/ko-kr/sql/database-engine/configure-windows/clr-enabled-server-configuration-option?view=sql-server-ver16
You've successfully subscribed to PLAINBIT
Great! Next, complete checkout to get full access to all premium content.
Error! Could not sign up. invalid link.
Welcome back! You've successfully signed in.
Error! Could not sign in. Please try again.
Success! Your account is fully activated, you now have access to all content.
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.