“[이번 발표에서] 여러분이 꼭 명심해 주셨으면 하는 핵심은, 네트워크를 진정으로 보호하고 싶다면 네트워크를 제대로 파악해야 한다는 점입니다.” TAO 국장, NSA, USENIX Enigma 2016
“네트워크를 파악하는 것”의 핵심은 엔드포인트 지속성 메커니즘, 즉 운영 체제가 코드를 자동으로 불러와 실행할 수 있는 무수히 많은 방식을 추적하는 것입니다. 지난 10여 년 동안 백그라운드 서비스는 Windows에서 가장 널리 사용되는 지속성 저장소 중 하나였습니다. Windows NT 및 XP 시대부터 제공되어 온 서비스는 시스템 부팅, 사용자 로그온 또는 특정 조건이 충족될 때 백그라운드에서 프로세스와 라이브러리를 눈에 띄지 않게 로드할 수 있는 신뢰할 수 있는 방법을 제공합니다. 새로운 은밀한 지속 기법을 추적하는 데 종종 많은 관심이 쏠리지만, 기본을 간과해서는 안 됩니다. 특히 서비스 기반 악성코드가 여전히 널리 퍼져 있다는 점을 고려할 때 더욱 그렇습니다.
한때는 기업 전체에서 실행 중인 시스템 서비스를 면밀히 감시하는 것은 불가능한 일이었습니다. 2년 전만 해도 최첨단 방식이라 할 수 있었던 것은, 이상 징후를 찾아내기 위해 광범위한 수동 분석을 동반한 월간 감사였습니다. 오늘날, Tanium 플랫폼과 그 사고 대응 모듈을 활용하면 이를 지속적이고 자동화된 방식으로 수행할 수 있습니다.
원격 액세스 도구(RAT) 및 기타 악성코드는 세 가지 다른 방식으로 서비스 형태로 상주할 수 있습니다. 즉, 독립형 서비스 실행 파일, 호스팅된 서비스 모듈, COM+ 구성 요소의 형태로 상주할 수 있습니다. 이 글에서는 공격자들이 Windows 서비스를 악용하는 다양한 방법과, Tanium이 이를 탐지하는 데 어떻게 도움이 되는지 살펴보겠습니다.
독립형 서비스
독립형 서비스는 각 구성 레지스트리 키 내의 “ImagePath” 값에 지정된 실행 파일이나 명령줄을 실행합니다. Windows 레지스트리에는 “HKLM\System\CurrentControlSet\Services” 상위 키 아래에 현재 실행 중인 모든 서비스에 대한 구성 설정이 포함되어 있습니다.
Tanium은 오랫동안 (전체 Windows 자산에 걸쳐) 대규모로 Windows 서비스를 모니터링할 수 있는 기능을 제공해 왔습니다. 예를 들어, “ MD5 해시가 포함된 서비스 상태” 센서는 서비스 이름, 상태(실행 중, 중지됨 등), 명령줄, ImagePath 해시 및 서비스가 실행되고 있는 사용자 컨텍스트를 수집하고 비교합니다. 즉, 독립형 서비스의 구성이나 상태가 비정상적이거나, 동일한 이름을 가진 인스턴스 간에 차이가 있는 경우, 해당 서비스의 발생 빈도가 낮게 나타나게 됩니다. Tanium 사용자들은 이 센서를 활용하여 상태에 따라 잘못 구성되었지만 정상적인 서비스(예: 중지된 안티바이러스 서비스)를 식별할 뿐만 아니라, 이름, 사용자 컨텍스트, 명령줄, 또는 이름이 동일한 서비스 인스턴스 간에 서로 다른 ImagePath 해시 값을 기준으로 악성 서비스를 식별해 왔습니다.
공격자의 관점에서 볼 때, 독립형 서비스는 작업 관리자, tasklist.exe 또는 서비스 제어 관리자 쿼리를 통해 실행 경로를 쉽게 파악할 수 있기 때문에 그다지 선호되지 않습니다. “Print Spooler”라는 정상적인 서비스 이름 아래에 악성코드를 위장하려는 공격자를 가정해 봅시다. 이 서비스의 실행 파일 경로는 “c:\windows\system32\spoolsv.exe”입니다. 변조된 서비스 인스턴스는 “c:\windows\spoolsv.exe”나 “c:\windows\system32\spoolsvc.exe”와 같이 파일 이름이나 위치가 미묘하게 변경된 악성 바이너리를 불러올 수 있습니다. 이 기법은 “한눈에” 분석하는 방식으로는 악성코드를 효과적으로 숨길 수 있지만, ImagePath나 명령줄을 통계적으로 집계하면 쉽게 무력화될 수 있다. “ MD5 해시가 포함된 서비스 상태”와 같은 Tanium 센서는 이러한 이상치를 신속하게 군집의 가장자리로 분류하여 후속 분석 및 조사를 진행할 수 있도록 합니다.
호스팅 서비스 및 COM+ 애플리케이션
호스팅 서비스는 독립 실행형 실행 파일이 아닌 라이브러리(일반적으로 DLL) 형태로 구현됩니다. 이들은 일반적으로 Windows 서비스 호스팅 프로세스인 “svchost.exe”에 의해 로드됩니다. 아래 스크린샷은 “애플리케이션 관리” 및 “기본 필터링 엔진”과 같은 여러 호스팅 서비스에 대한 Tanium의 “ MD5 해시가 포함된 서비스 상태” 센서의 출력 결과를 보여줍니다. 각 서비스에 대해, 제공된 해시는 호스팅되는 DLL이 아닌 “svchost.exe”의 해시입니다.
Windows는 특정 호스팅 서비스에 대해 어떤 DLL을 불러와야 하는지 어떻게 알 수 있나요? 이러한 각 서비스의 레지스트리 구성에는 로드할 DLL을 가리키는 “\Parameters\ServiceDLL”이라는 하위 키와 값이 포함되어 있습니다. 효율성과 보안상의 이유로, Windows는 호스팅되는 서비스를 각각에 대해 별도의 “svchost.exe” 인스턴스를 생성하는 대신, 호스팅 프로세스의 공유 인스턴스 아래에 그룹으로 묶어 로드합니다.
호스팅 서비스 그룹은 “HKLM\Software\Microsoft\Windows NT\CurrentVersion\Svchost” 레지스트리 키 아래에 구성됩니다. 각 그룹은 서로 다른 수준의 접근 권한을 부여합니다. “netsvcs”는 네트워크 접근 권한을 가진 서비스에 대해 가장 높은 권한을 가진 그룹 중 하나이므로, 공격자들이 자주 악용합니다. “netsvcs” 값은 아래 스크린샷에 표시된 것처럼, 이 그룹에 로드될 서비스 이름들로 구성된 문자열 배열입니다.
공격자는 호스팅 서비스를 악용하여 여러 가지 방법으로 악성 DLL을 불러올 수 있습니다. 한 가지 방법은 “HKLM\SYSTEM\CurrentControlSet\services” 아래에 구성된 서비스가 없는, 즉 “사용되지 않은” 호스팅 서비스 이름을 선택하는 것입니다. 악성코드 드로퍼는 이러한 사용되지 않은 항목을 순차적으로 훑어보며, 필요한 레지스트리 키(ServiceDLL 매개변수 포함)를 생성함으로써 호스팅된 서비스로서 지속성을 유지할 수 있다. 예를 들어, 구버전 Windows에서는 공격자들이 종종 “netsvcs” 그룹에 속해 있지만, 해당 구성이 없으면 대개 비활성 상태인 “6to4” 서비스를 표적으로 삼곤 했습니다. 공격자는 이 서비스를 “c:\windows\system32\6to4svc.dll”과 같이 그럴듯해 보이는 DLL 이름으로 설정하여, 육안 검사에서는 의심받지 않을 가능성이 높습니다. 또 다른 방법은 기존에 있지만 비활성화된 Windows 서비스의 ServiceDLL 매개변수를 간단히 수정한 다음, 해당 서비스가 자동으로 시작되도록 구성하는 것입니다.
COM+ 시스템 서비스는 악성 DLL을 불러올 수 있는 호스팅 서비스의 또 다른 유형입니다. 이 경우, “dllhost.exe” 프로세스는 DLL 형태의 여러 구성 요소로 이루어질 수 있는 COM+ 애플리케이션을 로드합니다. 예를 들어, 아래 스크린샷에 표시된 ComSysApp 서비스는 COM+ 애플리케이션을 호스팅하는 역할을 합니다. 명령줄에는 “dllhost.exe”의 경로와 COM+ 애플리케이션을 식별하는 “Processid” GUID가 표시되며, 코드 내에서 “components”를 열거할 수 있습니다. 이 구성 요소들은 애플리케이션을 구현하는 데 사용되는 DLL입니다.
요약하자면, 호스팅 서비스와 COM 서비스는 RAT 및 기타 악성코드를 지속시키는 데 널리 사용되는 은밀한 수단을 제공한다. 분석가들은 악성 DLL을 불러오는 서비스를 탐지하기 위해, 단순한 프로세스 모니터링이나 서비스 이름 및 ImagePath 검토를 넘어서는 조치를 취해야 합니다.
Tanium을 사용하여 비정상 서비스 DLL 식별하기
Tanium은 기업 규모에서 서비스 DLL을 손쉽게 탐지하고 분석할 수 있도록 도와주는 여러 가지 센서를 제공합니다. 먼저, 이달 말 출시될 당사의 인시던트 대응 솔루션 3,0 버전에 포함될 새로운 센서인 “서비스 모듈 세부 정보”를 소개해 드리겠습니다. 아래 스크린샷은 이 센서의 출력 결과 일부를 보여줍니다(“count” 열은 생략되었습니다).
이 센서는 앞서 설명한 세 가지 유형의 서비스를 모두 통합적으로 보여줍니다. 서비스 이름 및 ImagePath와 함께 “모듈 경로” 열이 포함되어 있음을 확인하십시오. 이 예제의 처음 두 행에는 “COMSysApp”이라는 COM+ 애플리케이션에 속한 두 개의 구성 요소 DLL에 대한 경로가 표시되어 있습니다. 나머지 결과들은 모두 “svchost.exe”에서 호스팅되며, 각 서비스 DLL의 경로가 포함되어 있습니다. 이 데이터에 대한 스택 분석은 모든 Tanium 센서와 마찬가지로 실시간으로 수행됩니다. 즉, 수만 대에서 수십만 대에 이르는 시스템 전반에서 악성 DLL을 불러오는 서비스의 이상값 인스턴스를 단 몇 초 만에 찾아낼 수 있습니다.
호스팅 서비스 그룹 내의 비정상 회원 식별
지난 분기, Tanium의 사고 대응 업데이트에는 “호스팅 서비스 이름 감사(Hosted Service Name Audit)”라는 또 다른 서비스 분석 센서가 포함되었습니다. 아래 스크린샷은 “netsvcs” 그룹에 대한 출력 예시를 보여줍니다.
이 센서의 출력 데이터는 서비스 그룹 내의 서비스 집합을 대규모로 신속하게 점검하는 데 유용합니다. 각 그룹에 대해 “호스팅된 서비스 이름 정렬 목록” 열에는 알파벳 순으로 정렬된 서비스 이름 목록이 표시됩니다. 이를 통해 각 시스템의 출력 결과가 “겹쳐지도록” 보장되며, 그룹 내에서 흔하지 않은 서비스를 포함하는 시스템은 이로 인해 이상치로 구분됩니다. 물론 시스템마다 운영 체제와 역할에 따라 제공되는 서비스 세트가 다를 수 있지만, 센서 출력 데이터를 분석한 결과 운영 체제 버전과 플랫폼 유형을 중심으로 클러스터가 형성되는 것으로 나타났습니다. Tanium 사용자는 “드릴다운” 기능을 활용하여 이상값이 나타난 시스템을 손쉽게 분석하거나, Tanium Trace로 전환하여 비정상 서비스 생성과 관련된 과거 포렌식 데이터를 검토할 수 있습니다.
Tanium이 실제로 어떻게 작동하는지 궁금하신가요? 와 1:1 데모를 예약하거나 주간 웨비나에 참여해 보세요. 에서 개최될 예정인 행사()에서 Tanium 전문가들과 상담해 보세요.
