취약한 MS-SQL 서버 집중 공격하는 CLR SqlShell의 정체는?

SqlShell은 웹 서버에 설치될 수 있는 웹셸(WebShell)과 유사하게 MS-SQL 서버에 설치돼 공격자의 명령을 실행하거나 다양한 악의적 행위를 수행할 수 있는 기능을 지원하는 악성코드이다. MS-SQL 서버에서는 확장된 기능을 사용할 수 있도록 CLR 저장 프로시저(CLR Stored Procedure) 방식을 지원하는데, 이 방식으로 제작된 동적 링크 라이브러리(Dynamic Link Library, DLL)가 바로 SqlShell이다. CLR 저장 프로시저는 xp_cmdshell 명령과 함께 공격자가 MS-SQL 서버에서 악의적인 명령을 실행할 수 있는 대표적인 방식이다. 이번 글에서는 MS-SQL 서버 대상 공격에 사용되는 CLR SqlShell 악성코드 및 관련 사례를 분석한 내용을 소개한다.

 

SqlShell은 CLR 저장 프로시저가 전달받은 명령을 실행하는 기능을 포함하고 있지만, 정상적인 목적으로 사용되도록 제작됐을 수도 있다. 하지만 MS-SQL 서버를 겨냥한 대다수 공격에 악용되며, 공격자가 코인 마이너, 랜섬웨어와 같은 악성코드를 설치하는 데 사용하는 수단이기도 하다.

 

외부 인터넷에 공개돼 있으면서, 단순한 형태의 암호를 사용하는 MS-SQL 서버는 윈도우 시스템을 노린 공격 벡터 중 하나이다. 공격자들은 부적절하게 관리되는 MS-SQL 서버를 찾아 스캐닝 한 후, 무차별 대입 공격이나 사전 공격을 통해 관리자 권한으로 로그인한다. 이후 공격자는 다양한 방식으로 악성코드를 설치해 감염 대상 시스템에 대한 제어 권한을 획득한다.

 

공격자가 MS-SQL 서버에 관리자 계정으로 로그인한 후 악성코드를 설치하는 데 xp_cmdshell 명령을 많이 사용한다. 이 명령을 통해 윈도우 환경에서도 동작 가능한 악의적인 명령을 실행할 수 있다. 또한, OLE 저장 프로시저(OLE Stored Procedure) 및 MS-SQL 에이전트 작업(MS-SQL Agent Jobs)에 악의적인 명령을 등록하는 것도 윈도우 명령을 실행하는 방식에 속한다. 이 밖에, 특정 기능이 구현된 실행 파일을 제작해 등록하는 방식도 있는데, 이를 위해 MS-SQL 서버에서는 확장 저장 프로시저(Extended Stored Procedure) 또는 CLR 저장 프로시저 형태의 DLL을 지원하며, 개발자는 원하는 기능이 포함된 DLL을 제작 및 등록해 특정 기능을 제공할 수 있다.

 

안랩 분석팀은 ASEC 리포트(Report)를 통해 분기별로 부적절하게 관리되는 MS-SQL 서버 공격에 사용되는 악성코드에 대한 통계를 제공했다. [그림 1]에서 2022년 4분기 MS-SQL 서버를 노린 공격 유형 중 CLR Shell 악성코드가 최다 비중을 차지한다.

 

[그림 1] 안랩 ASEC 리포트 2022년 4분기 통계

 

​안랩은 MS-SQL 서버에서 제공하는 기능 중 윈도우 운영체제(OS) 명령을 실행할 수 있는 기능을 소개하고, 실제 악성코드를 종류 별로 분류해 정리했다. SqlShell 중에는 단순하게 전달받은 명령을 실행하는 형태부터 파일 다운로드 및 업로드, 권한 상승 기능을 제공하는 형태도 있다. 물론 공격자의 명령을 받는 대신 특정 주소에서 악성코드를 다운로드해 설치하는 다운로더(DownLoader) 형태도 존재한다.

MS-SQL 서버 공격 방식

​일반적으로 공격자나 악성코드는 MS-SQL 서비스가 설치된 환경, 즉 1433번 포트가 오픈된 서버를 스캐닝해 찾는다. 스캐닝 이후에는 확인된 MS-SQL 서버에 무차별 대입 공격 또는 사전 공격을 통해 로그인을 시도한다. 참고로 윈도우 OS 명령을 실행하도록 하는 기능은 대부분 sa (SQL Admin) 계정이 필요하다. sa 계정은 관리자 계정을 의미한다.

공격자가 직접 스캐닝 및 사전 공격을 수행하는 대신 악성코드가 취약한 MS-SQL 서버에 자체적으로 전파되는 경우도 있다. 레몬덕(LemonDuck) 코인 마이너 악성코드가 대표적이다. [그림 2]는 레몬덕이 사전 공격에 사용하는 sa 계정의 비밀번호 목록이다.

[그림 2] 레몬덕이 사용하는 사전 공격 비밀번호 목록

 

​참고로 레몬덕은 내부 전파, 즉 측면 이동 과정에서 MS-SQL 서버를 대상으로 사전 공격 방식을 사용하지만, 킹마이너(Kingminer)나 볼가르(Vollgar) 코인 마이너는 외부에 오픈된 MS-SQL 서버를 대상으로 무차별 대입 공격을 수행한다.

 

공격자 및 악성코드는 sa 계정 또는 sa 계정 권한을 획득한 이후 악의적인 명령을 실행하거나 실질적인 악성코드를 설치해 감염 대상 시스템에 대한 제어를 획득한다. 참고로 sa 계정 권한을 가지고 있다고 하더라도, MS-SQL 데이터베이스 서버에 대한 제어 권한을 획득했을 뿐, 윈도우 OS 자체에 대한 제어 권한을 획득한 것은 아니다. 다시 말해, SQL 명령을 실행할 수는 있지만 윈도우 OS에 영향을 미치는 행위를 기본적으로 제공하지 않는다는 것이다.

 

하지만 MS-SQL은 윈도우 OS에서 OS 명령을 실행하도록 하는 여러 기능을 지원한다. MS-SQL 데이터베이스 서버를 통해 OS 명령을 실행할 수 있는 방식을 간단히 소개한다. 이런 기능들은 기본적인 SQL 관련 명령이 아니기 때문에 보안에 취약한 항목으로, 대부분 기본적으로 비활성화돼 있다. 하지만 관리자 계정으로 로그인하면 이 기능을 활성화할 수 있다. sa 계정을 획득하면 결국 윈도우 OS에 대한 제어 권한도 획득하는 셈이다.

 

1. xp_cmdshell 명령

xp_cmdshell 명령은 인자로 전달받은 명령을 윈도우 셸(Windows Shell)에서 실행한다. xp_cmdshell 명령으로 실행된 윈도우 명령은 sqlservr.exe 프로세스에 의해 “cmd.exe /c” 명령으로 실행된다.

레몬덕은 xp_cmdshell을 사용해 추가 악성코드를 다운로드한다. 레몬덕은 xp_cmdshell이 비활성화가 아닌 등록 해제돼 있을 경우에 대비해 재등록하는 기능도 포함한다.

 

[그림 3] xp_cmdshell 명령을 사용하는 레몬덕

 

2. OLE 저장 프로시저

OLE 저장 프로시저를 이용하는 방식은 OLE의 기능을 악용해 다른 애플리케이션, 즉 악의적인 명령이나 악성코드를 실행한다. 이 기능 역시 xp_cmdshell 명령처럼 비활성화돼 있기 때문에 활성화시키는 작업이 필요하다.

 

[그림 4]는 마이킹스(MyKings) 코인 마이너 악성코드가 실제 공격에 사용하는 루틴을 재현한 것이다.

 

[그림 4] OLE 저장 프로시저를 악용할 때의 프로세스 트리

 

​3. MS-SQL 에이전트 작업

MS-SQL 에이전트 작업 기능을 사용하면 윈도우 명령을 실행하는 작업을 등록할 수 있다. SQL 서버 에이전트는 단순하게 OS 명령을 실행하는 CmdExec 방식과 JS 및 VBS 스크립트를 사용하는 엑티브 스크립팅(Active Scripting) 방식을 지원한다.

 

4. 확장 저장 프로시저

MS-SQL 서버는 확장된 기능을 제공하기 위해 확장 저장 프로시저 방식을 지원한다. 공격자는 악성 DLL을 제작하고 sp_addextendedproc 명령으로 등록한 후, 해당 DLL의 익스포트 함수를 실행한다. 이 익스포트 함수는 악성 DLL 로드 및 악성 행위를 담당한다.

 

5. CLR 저장 프로시저

CLR 저장 프로시저는 확장 저장 프로시저와 유사하지만, 닷넷(.NET) DLL이라는 점에서 차이가 있다. CLR 저장 프로시저를 등록해 사용하려면 xp_cmdshell처럼 활성화 작업이 필요하다.

 

레몬덕은 xp_cmdshell을 사용하지만, CLR 저장 프로시저를 사용하기도 한다.

 

[그림 5] CLR 저장 프로시저 어셈블리를 사용하는 레몬덕

 

다양한 CLR SqlShell 유형

이 글에서는 명령 실행, 파일 다운로드와 같은 기본적인 기능 만을 제공하는 SqlShell 위주로 소개한다. SqlShell은 공격 과정에서 다른 악성코드를 설치하는 중간 단계로서 종종 사용되기에 이런 단순한 형태의 기능도 공격 과정에서 자주 확인된다.

 

​1. 명령 실행

레몬덕은 StoredProcedures 클래스의 ExecCommand() 메소드를 등록하고 사용하며, ExecCommand() 메소드는 내부적으로 RunCommand() 메소드를 호출한다. 이름은 evilclr.dll로, 기능적으로는 명령 실행 루틴만 존재한다. 레몬덕은 이 과정을 통해 등록된 CLR 어셈블리의 ExecCommand() 함수를 이용해 추가 페이로드를 다운로드하는데 사용된다.

 

[그림 6] 레몬덕의 CLR SqlShell

 

​2. 다운로드 명령 지원 (shaw20211224)

“shaw20211224.dll”이라는 이름의 SqlShell은 전달받은 명령을 실행하는 RunCommand() 함수 외에도 외부에서 파일을 다운로드하는 DownloadRun() 함수와 전달받은 경로의 파일을 탈취하는 PutDatas() 함수가 제공된다.

 

[그림 7] shaw20211224.dll의 익스포트 함수

 

​3. 셸코드 실행 (메타스플로잇)

침투 테스트 툴인 메타스플로잇(Metasploit)도 MS-SQL 서버 공격을 지원한다. 메타스플로잇은 위에서 다룬 사전 공격부터 권한 상승, CLR SqlShell 기법을 비롯한 다양한 OS 명령 실행 기법을 제공한다.

 

메타스플로잇은 공격 과정에서 [그림 8]과 같은 SqlShell을 설치하며, 전달받은 셸코드를 메모리 상에서 실행하는 기능을 담당한다. 메타스플로잇은 단순한 형태의 리버스 쉘(Reverse Shell), 바인드 쉘(Bind Shell)이나 다양한 기능을 제공하는 백도어 악성코드인 미터프리터(Meterpreter)를 추가적으로 지원한다.

 

[그림 8] 메타스플로잇에서 제공하는 SqlShell

 

​[그림 9]는 공격자가 부적절하게 관리되고 있는 MS-SQL 서버에 침투해 메타스플로잇의 “SqlClrPayload.dll”을 설치한 후 메타스플로잇의 미터프리터 백도어를 sqlservr.exe 프로세스의 메모리 상에서 실행시킨 로그이다.

[그림 9] 메타스플로잇을 이용한 공격 사례에 관한 ASD(AhnLab Smart Defense) 로그

 

​4. 확장 기능을 제공하는 유형

공격자는 단순한 형태의 SqlShell 외에도 훨씬 더 다양한 기능을 제공하는 SqlShell을 사용하기도 한다. 다양한 기능이 제공될수록 공격자는 그 다음에 수행할 악성 행위를 더 쉽게 수행할 수 있기 때문이다.

 

4-1. SqlHelper

공격에 자주 사용되는 대표적인 SqlShell은 “SqlHelper”이다. 이 악성코드는 유사한 형태가 다수 존재하기 때문에 소스 코드가 공개돼 있을 것으로 추정되며, 상대적으로 명령 실행 기능 외에 사용자 계정 추가나 터널링, 파일 작업과 같은 기능을 제공한다.

 

[그림 10] SqlHelper가 지원하는 기능

 

과거 트리고나 랜섬웨어 공격 사례에서 확인된 SqlShell 역시 SqlHelper이다. 당시 SqlHelper에는 권한 상승을 위한 MS16-032 취약점 공격 루틴이 함께 존재했다. 공격자는 이를 악용해 MS-SQL 서비스를 상승된 권한으로 실행시키고, 이 권한으로 트리고나 랜섬웨어를 서비스에 등록한다.

4-2. CLRSQL

“CLRSQL”이라는 이름의 SqlShell도 SqlHelper와 유사하다. 파일 및 디렉터리, 프로세스, 계정 관련 작업 등을 지원하는 함수들을 보면, 일반적인 웹셸 악성코드와 상당히 유사하다.

 

CLRSQL SqlShell 중에는 PingCastle이 함께 구현된 형태도 존재한다. PingCastle은 액티브 디렉터리(Active Directory) 환경에서 공격에 필요한 정보를 수집하는 데 사용될 수 있는 툴이다.

 

[그림 11] PingCastle이 함께 구현된 SqlShell

 

​PingCastle이 함께 구현된 CLRSQL SqlShell은 섀도우 포스(Shadow Force)의 공격에도 사용된다. 섀도우 포스는 2013년부터 확인된 공격 그룹으로, 주로 국내 기업 및 기관을 겨냥해 온 것으로 알려져 있다. 특히 MS-SQL 서버를 공격 대상으로 삼는다는 점이 특징이다.

 

[그림 12]의 ASD 로그를 살펴보면, “Tmp1C4E.tmp”, 즉 SqlShell이 가장 먼저 설치되고나서 그 이후에 섀도우 포스의 다른 악성코드가 차례대로 생성되는 것을 확인할 수 있다. 섀도우 포스는 부적절하게 관리되는 MS-SQL에 침투한 후 추가 악성코드를 설치하기 위해 CLR 저장 프로시저 악성코드를 사용하고 있으며, 대부분의 공격 과정에서 동일한 흐름이 확인된다.

 

[그림 12] ASD에서 확인된 섀도우 포스의 공격 로그

 

​4-3. CLR_module

“CLR_module”이라는 이름을 가진 SqlShell도 CLRSQL과 유사하게 다양한 기능과 함께 PingCastle을 지원한다는 공통점이 있다. 다만, CLR_module은 CLRSQL이 제공하는 기능 외에도 추가적으로 BadPotato, EfsPotato 등 권한 상승 툴을 함께 제공한다는 점에서 CLRSQL과 조금 차이가 있다. 섀도우 포스 그룹의 공격 과정에서도 CLRSQL과 함께 확인되는 사례가 다수 존재한다.

[그림 13] 권한 상승 기능도 함께 지원하는 CLR_module SqlShell

 

5. 코인 마이너 설치

지금까지는 웹셸처럼 공격자의 명령을 받아 특정 명령을 수행하는 형태를 다뤘다면, 이제부터는 SqlShell 자체적으로 특정 기능이 구현된 유형을 소개한다. 이런 유형은 대다수가 코인 마이너를 설치하며, 이에 따라 공격에 사용된 SqlShell은 대부분 다운로더 또는 드로퍼(Dropper) 기능을 담당한다.

 

5-1. Mrb마이너

Mrb마이너(MrbMiner)는 과거 MS-SQL 서버를 대상으로 유포됐던 대표적인 코인 마이너이다. 이는 2020년 처음 발견됐으며, 최종적으로 XMRig 코인 마이너를 설치한다. MrbMiner 설치 과정에서 사용되는 SqlShell은 자체적인 분석 방해 기법들이 존재하기는 하지만, Mrb마이너를 설치하는 다운로드 기능만 제공한다.

 

​[그림 14] Mrb마이너의 SqlShell​

 

버전에 따라 다르지만, [그림 15]와 같이 하드코딩된 C&C 주소를 직접 확인할 수 있다.

 

​[그림 15] Mrb마이너 SqlShell에 하드코딩된 C&C 주소​

 

5-2. 마이킹즈

마이킹즈 코인 마이너는 MS-SQL에 다양한 방식으로 유포된다. OLE 저장 프로시저 방식 또는 [그림 16]과 같이 CLR 어셈블리를 이용하는 방식인 ExecCode.dll 파일이 존재한다.

 

[그림 16] 마이킹즈 ExecCode.dll의 다운로더 CLR 저장 프로시저

 

​SqlStoredProcedure1() 메소드는 특정 주소에서 텍스트 파일을 다운로드하는데, 여기에는 추가 페이로드를 다운로드할 주소들이 적혀 있다. 이후 해당 주소들을 파싱해 실제 마이킹즈 페이로드를 설치한다. ExecCode.dll은 위와 같이 간단한 형태이지만, 마이킹즈가 사용하는 CLR 어셈블리 중에는 더 복잡한 형태들도 확인된다.

MSSqlInterface.dll은 ExecCode.dll과 유사하게 StoredProcedures 클래스 및 SqlStoredProcedure() 메소드를 통해 실행되지만 추가 기능들이 제공된다. 먼저 초기 루틴에서 0xFA로 1바이트 XOR 인코딩되어 있는 C&C 주소를 복호화한다. 그럼 다음 메인 루프에서 주기적으로 C&C 서버에 탈취한 기본적인 정보들을 전달하고 파일 및 셸코드를 다운로드해 실행한다.

[그림 17] Operate 클래스에서 제공하는 함수들과 인코딩된 C&C 주소​

 

5-3. 러브마이너
러브마이너(LoveMiner)도 취약한 MS-SQL 서버에 유포되는 코인 마이너 악성코드로, exe 실행 파일 형태의 다운로더 외에도 CLR 저장 프로시저 형태의 다운로더도 함께 확인된다.

 

[그림 18] 러브마이너의 CLR 저장 프로시저​


러브마이너 다운로더는 특정 주소에 접속해 베이스64(Base64)로 인코딩된 코인 마이너를 “C:\windows\temp\0c0134c0cbebf48be8c95920f5ea74fc.txt” 경로에 다운로드해 저장한다. 해당 파일이 이미 존재하는 경우에는 디코딩한 후 메모리 상에 로드한다.

[그림 19] 베이스64로 인코딩된 코인 마이너와 복호화된 루틴​

 

최종적으로 코인 마이너 DLL을 로드한 후 익스포트 함수 중 ExecSql()를 인자와 함께 호출한다. 해당 DLL은 커스터마이징된 XMRig로, 첫 번째 인자로 전달받은 문자열이 “getmoney#2021″가 맞는지 검사한다. 그런 다음, 3번째 인자로 전달받은 마이닝 풀 주소 및 ID 등을 파싱해 모네로(Monero) 코인에 대한 마이닝을 진행한다.

 

러브마이너를 설치하는 SqlShell 중에는 다운로더 외에 드로퍼 형태도 존재한다. XMRig 코인 마이너는 내부 리소스 “gmp”에 저장돼 있으며, SqlShell은 이를 메모리 상에서 로드하는 역할을 수행한다. gmp 또한 커스터마이징된 XMRig로서, 초기 루틴에서 마이닝 풀 주소처럼 마이닝에 필요한 정보를 설정한다.

 

[그림 20] 드로퍼 형태의 러브마이너 SqlShell

 

​6. 프록시웨어 설치

프록시웨어(Proxyware)는 설치된 시스템에서 현재 사용 가능한 인터넷 대역폭 일부를 외부에 공유하는 프로그램을 말한다. 프록시웨어를 설치하는 사용자는 일반적으로 대역폭을 제공하는 대신 일정한 금액을 받는다. 사용자 입장에서는 시스템에 프록시웨어를 설치함으로써 일정 수익을 얻을 수 있지만, 외부의 다른 사용자가 자신의 네트워크를 이용해 특정 행위를 수행한다는 점에서 위험을 감수해야 한다. 사용자는 프록시웨어 업체를 정확히 알 수 없으며, 해당 업체에서 자체적으로 검증을 했다고 해도 추후 자신의 인터넷 대역폭이 악의적 목적으로 사용되는지 확인할 길이 없다.

 

프록시웨어를 설치하는 악성코드에 감염된 시스템은 네트워크 대역폭을 탈취당하며, 이를 통해 공격자는 수익을 얻는다. 이 점은 코인 마이너와 유사하다.

 

[그림 21]과 같이 공격자는 MS-SQL 서버에 “sdk.mdf”라는 이름의 프록시웨어를 설치하고, 동시에 이를 실행하는 SqlShell을 사용해 대역폭을 탈취했다. “sdk.mdf”는 실질적인 기능을 담당하는 DLL 파일로, 프록시웨어 업체에서 제공하는 기능만 탑재돼 있다.

 

[그림 21] 프록시웨어와 SqlShell 설치 로그

 

​하지만 함께 생성된 SqlShell, “Tmp417C.tmp”는 “sdk.mdf”를 로드하고 익스포트 함수인 p2p_start()를 호출함으로써 사용자 모르게 동작시킨다. p2p_start() 호출 시에는 수익을 가져갈 이메일 주소를 인자로 전달해야 한다. 공격자 이메일 주소는 [그림 22]에서 확인할 수 있다.

 

[그림 22] SqlShell을 사용한 프록시웨어 실행

 

참고로 SqlShell의 이름이 “SqlServerWorks.CLR.P2P.dll”인데, 이는 러브마이너의 SqlShell과 유사하며, 실제 ASD 로그에서도 러브마이너와 프록시웨어가 함께 설치되는 것으로 보아, 공격자가 동일한 것으로 추정된다.

 

정리하면, 최근 부적절하게 관리되고 있는 MS-SQL 데이터베이스 서버를 대상으로 SqlShell 악성코드가 설치되고 있다. SqlShell은 백도어나 코인 마이너, 프록시웨어와 같은 추가 악성코드를 설치하거나, 웹셸과 같이 공격자의 명령을 전달받아 악의적인 명령을 수행하는 데 사용될 수 있다.

 

MS-SQL 데이터베이스 서버를 노린 공격으로는 계정 정보를 부적절하게 관리 중인 시스템에 대한 무차별 대입 공격과 사전 공격이 있다. 공격 대상이 되는 MS-SQL 서버의 경우, 데이터베이스 서버로 직접 구축한 형태 외에도 ERP 및 업무용 솔루션 설치 과정에서 함께 설치되는 경우도 많다.

 

따라서 관리자는 계정의 비밀번호를 추측하기 어려운 형태로 사용하고 주기적으로 변경하는 것이 안전하다. 또한, 최신 버전으로 패치해 취약점 공격을 차단해야 해야 하며, 외부에 공개돼 접근 가능한 데이터 서버에 대해 방화벽과 같은 보안 제품을 사용함으로써 공격자의 접근을 통제해야 한다.

 

 

출처 : AhnLab

02-553-2331
견적 요청
카카오톡 문의