서문
2025년 9월, 관리형 탐지및 대응 제공업체인 텍사스 A M 대학 시스템(&) 사이버보안은 Elastic Security Labs와 협력하여 악성 IIS 모듈을 설치한 중국어권 위협 행위자의 익스플로잇 후 활동을 발견했으며, 우리는 이를 Tollbooth라고 부르고 있습니다. 이 기간 동안 고질라 포크된 웹셸 프레임워크, 원격 모니터링 및 관리(RMM) 도구인 GotoHTTP의 사용, 활동을 숨기는 데 사용되는 악성 드라이버가 관찰되었습니다. 위협 행위자는 Microsoft의 설명서 또는 StackOverflow 지원 페이지와 같은 공개 리소스에서 발견되는 ASP.NET 머신 키를 사용하는 잘못 구성된 IIS 웹 서버를 악용했습니다.
비슷한 일련의 사건이 올해 초인 2월에 Microsoft에서 처음 보고된 바 있습니다. 안랩은 지난 4월에도 유사한 악성코드와 동작을 기반으로 설명한 바 있는 동일한 위협 활동의 연속으로 보고 있습니다. 이 이벤트 기간 동안 저희는 텍사스 에이엠 시스템 사이버보안(&)과의 파트너십을 활용하여 활동에 대한 인사이트를 수집할 수 있었습니다. 또한, 전 세계 스캐닝 인프라를 활용하는 발리딘과의 협업을 통해 전 세계 조직이 이 캠페인의 영향을 받은 것으로 확인했습니다. 다음 보고서에서는 REF3927로 알려진 이 활동 클러스터에서 사용된 이벤트와 툴링에 대해 자세히 설명합니다. 전 세계적으로 활발하게 악용되고 있는 이 활동에 대해 방어자와 조직이 더 많은 인식을 갖기를 바랍니다.
핵심 사항
- 위협 행위자는 공개적으로 노출된 머신 키를 사용하여 잘못 구성된 IIS 서버를 악용합니다.
- 침해 후 행동에는 악성 드라이버 사용, 원격 모니터링 툴링, 자격 증명 덤핑, 웹셸 배포, IIS 멀웨어 등이 포함됩니다.
- 위협 행위자들은 자신의 존재를 숨기기 위해 오픈 소스 "숨겨진" 루트킷 프로젝트를 조정했습니다.
- 주요 목적은 SEO 클로킹 및 웹셸 기능을 포함하는 TOLLBOOTH라는 IIS 백도어를 설치하는 것으로 보입니다.
- 이 캠페인에는 여러 지역과 산업 분야에 걸친 대규모 익스플로잇이 포함되었습니다.
캠페인 개요
공격 벡터
지난 달, Elastic Security Labs와 텍사스 A M 시스템 사이버보안(&)은 잘못 구성된 Windows IIS 서버와 관련된 침입을 조사했습니다. 이는 이전에 인터넷에 게시된 ASP.NET 머신 키로 구성된 서버와 직접적으로 관련이 있었습니다. ASP.NET 응용 프로그램에서 사용되는 머신 키는 데이터를 암호화하고 유효성을 검사하는 데 사용되는 암호화 키를 의미합니다. 이 키는 ValidationKey 및 DecryptionKey 의 두 부분으로 구성되며, ViewState 및 인증 쿠키와 같은 ASP.NET 기능을 보호하는 데 사용됩니다.
ViewState 는 ASP.NET 웹 애플리케이션에서 페이지의 상태와 HTTP 요청에 대한 컨트롤을 보존하기 위해 사용하는 메커니즘입니다. HTTP는 상태 비저장 프로토콜이므로 ViewState 페이지가 제출되고 다시 렌더링될 때 데이터를 수집할 수 있습니다. 이 데이터는 페이지의 숨겨진 필드(__VIEWSTATE)에 저장되며, 이 데이터는 직렬화되고 Base64로 인코딩됩니다. 이 ViewState 필드는 역직렬화 공격에 취약하여 공격자가 애플리케이션의 머신 키를 사용하여 페이로드를 위조할 수 있습니다. 공개적으로 노출된 머신 키를 사용하여 Windows 웹 서버를 노리는 기회주의적 캠페인의 일환이라고 판단할 만한 근거가 있습니다.
다음은 오픈 소스 .NET 역직렬화 페이로드 생성기를 사용하는 가상 환경의 POST 요청을 통해 이러한 유형의 역직렬화 공격의 예시입니다. __VIEWSTATE 필드에는 whoami 을 수행하고 디렉터리에 파일을 쓰는 URL 인코딩 및 Base64 인코딩 페이로드가 포함되어 있습니다. 익스플로잇 요청이 성공하면 서버는 HTTP/1.1 500 Internal Server Error 로 응답합니다.
침해 후 활동
뷰스테이트 주입을 통한 최초 접속 시, REF3927은 지속적인 접속을 용이하게 하기 위해 고질라 셸 프레임워크를 포함한 웹셸을 배포하는 것이 관찰되었습니다. 그런 다음 권한을 열거하고 자신의 사용자 계정을 만들려고 시도했습니다(실패). 계정 생성 시도가 실패하면 공격자는 GotoHTTP 원격 모니터링 및 관리(RMM) 도구를 업로드하고 실행했습니다. 위협 행위자는 관리자 계정을 생성하고 Mimikatz를 사용하여 자격 증명을 덤프하려고 시도했지만 Elastic Defend가 이를 차단했습니다.
차단된 침입 범위를 더 확장하려는 시도가 계속되자 위협 행위자는 트래픽 하이재킹 IIS 모듈인 톨부스를 배포하여 접속을 통해 수익을 창출했습니다. 또한 공격자는 멀웨어를 난독화하기 위해 오픈 소스 Hidden 루트킷의 수정된 버전을 배포하려고 시도했습니다. 관찰된 침입에서 Elastic Defend는 Tollbooth와 루트킷이 실행되는 것을 모두 차단했습니다.
고질라 EKP 분석
이 그룹이 사용하는 주요 도구 중 하나는 ekkoo-z가 작성한 Z-Godzilla_ekp 이라는 고질라 포크 프레임워크입니다. 이 도구는 AMSI 우회 플러그인과 같은 새로운 기능을 추가하고 네트워크 트래픽을 더 합법적으로 보이도록 위장하여 이전 고질라 프로젝트에 피기백합니다. 이 툴킷을 통해 운영자는 ASP.NET, Java, C#, PHP 페이로드를 생성하고 대상에 연결할 수 있으며 네트워크 트래픽을 숨기기 위한 다양한 암호화 옵션을 제공할 수 있습니다. 이 프레임워크는 다음과 같은 다양한 기능을 갖춘 GUI로 구동되는 플러그인 시스템을 사용합니다:
- 검색/열거 기능
- 권한 에스컬레이션 기술
- 명령 실행/파일 실행
- 셸코드 로더, 미터프리터, 인메모리 PE 실행
- 파일 관리, 압축 유틸리티
- 크레딧 도용 플러그인 (
lemon) - FileZilla, Navicat, WinSCP 및 Xmanager 자격 증명을 검색합니다. - 브라우저 비밀번호 스크래핑
- 포트 검색, HTTP 프록시 구성, 메모 작성
다음은 Z-Godzilla_ekp 을 사용하여 웹셸(error.aspx)에 대한 운영자 트래픽을 보여주는 네트워크 트래픽 예제입니다. 웹셸은 HTTP POST 요청에서 Base64로 인코딩된 AES 암호화 데이터를 가져온 다음 .NET 어셈블리를 인메모리에서 실행합니다. 이러한 요청은 정상적인 네트워크 트래픽으로 위장하기 위해 HTTP POST 매개변수에 암호화된 데이터를 삽입하여 위장합니다.
루트킷 분석
공격자는 커널 루트킷을 배포하여 감염된 컴퓨터에서 자신의 존재를 숨겼습니다. 이 루트킷은 인터페이스 문자열이 중국어로 작성된 HijackDriverManager라는 이름의 유저랜드 애플리케이션과 함께 작동하여 드라이버와 상호 작용합니다. 이 분석을 위해 악성 루트킷과 이 루트킷이 파생된 원래 "숨겨진" 오픈 소스 프로젝트의 코드를 모두 조사했습니다. 내부적으로는 루트킷 HIDDENDRIVER 과 유저랜드 애플리케이션 HIDDENCLI 을 호출하고 있습니다.
이 악성 소프트웨어는 오픈 소스 루트킷 Hidden의 수정된 버전으로, 수년 동안 GitHub에서 사용할 수 있었습니다. 멀웨어 작성자는 컴파일 전에 약간의 수정을 가했습니다. 예를 들어, 이 루트킷은 직접 커널 객체 조작(DKOM)을 사용하여 자신의 존재를 숨기고 손상된 시스템에서 지속성을 유지합니다. 컴파일된 드라이버는 여전히 컴파일 경로 문자열 내에 "숨겨진" 루트킷 프로젝트를 사용했음을 나타내는 "숨겨진"이 있습니다.
커널에 처음 로드할 때 드라이버는 일련의 중요한 초기화 단계에 우선순위를 둡니다. 먼저 7개의 초기화 함수를 호출합니다:
InitializeConfigsInitializeKernelAnalyzerInitializePsMonitorInitializeFSMiniFilterInitializeRegistryFilterInitializeDeviceInitializeStealthMode
드라이버 객체와 주요 함수 등의 관련 필드를 채우기 전에 내부 컴포넌트를 준비합니다.
다음 섹션에서는 이러한 7가지 중요한 초기화 기능 각각에 대해 자세히 설명하며 그 목적을 자세히 설명합니다.
초기화 컨피그
루트킷의 초기 동작은 InitializeConfigs 함수를 실행하는 것입니다. 이 함수의 유일한 목적은 사용자랜드 애플리케이션에 의해 채워지는 Windows 레지스트리의 드라이버 서비스 키에서 루트킷의 구성을 읽는 것입니다. 이러한 값은 추출되어 나중에 루트킷에서 사용할 전역 구성 변수에 저장됩니다.
다음 표에는 루트킷이 레지스트리에서 추출하는 구성 매개변수가 요약되어 있습니다:
| 레지스트리 이름 | 설명 | 유형 |
|---|---|---|
Kbj_WinkbjFsDirs | 숨길 디렉토리 경로 목록 | 문자열 |
Kbj_WinkbjFsFiles | 숨길 파일 경로 목록 | 문자열 |
Kbj_WinkbjRegKeys | 숨길 레지스트리 키 목록 | 문자열 |
Kbj_WinkbjRegValues | 숨길 레지스트리 값 목록 | 문자열 |
Kbj_FangxingImages | 화이트리스트에 추가할 프로세스 이미지 목록 | 문자열 |
Kbj_BaohuImages | 보호할 프로세스 이미지 목록 | 문자열 |
Kbj_WinkbjImages | 숨길 프로세스 이미지 목록 | 문자열 |
Kbj_Zhuangtai | 사용자 영역에서 설정하는 글로벌 킬 스위치 | bool |
Kbj_YinshenMode | 이 플래그는 루트킷이 아티팩트를 숨겨야 한다는 신호를 보냅니다. | bool |
초기화 커널 분석기
그 목적은 커널 메모리를 동적으로 스캔하여 필요한 PspCidTable 및 ActiveProcessLinks 주소를 찾는 것입니다.
는 커널의 구조체입니다. PspCidTable 는 프로세스 및 스레드 ID를 위한 테이블 역할을 하는 커널의 구조이고 ActiveProcessLinks _EPROCESS 는 현재 실행 중인 모든 프로세스를 연결하는 이중 링크 목록 역할을 합니다. 이를 통해 시스템은 모든 활성 프로세스를 추적하고 횡단할 수 있습니다. 이 목록에서 항목을 제거하면 프로세스 탐색기와 같은 열거 도구에서 프로세스를 숨길 수 있습니다.
룩포피에스피시드테이블
함수를 분해하여 PspCidTable 주소를 PsLookupProcessByProcessId 검색합니다. 함수를 분해하고 구문 분석합니다.
룩포액티브프로세스링크
이 함수는 _EPROCESS 구조 내에서 ActiveProcessLinks 필드의 오프셋을 결정합니다. 다른 Windows 버전에 따라 하드코딩된 오프셋 값을 사용합니다. 이러한 하드코딩된 값을 사용하여 다른 함수에 의해 유효성이 검사되는 ActiveProcessLinks 필드를 찾는 빠른 스캔 프로세스가 있습니다. 하드코딩된 값으로 찾지 못하는 경우, 하드코딩된 상대 오프셋에서 시작하여 가능한 최대 오프셋까지 무차별 대입 방식을 취합니다.
초기화PsMonitor
InitializePsMonitor 루트킷의 프로세스 모니터링 및 조작 엔진을 설정합니다. 이것이 바로 프로세스를 숨기는 기능의 핵심입니다.
먼저 프로세스를 제외, 보호 및 숨기기 위한 정보(규칙)를 저장하기 위해 3개의 AVL 트리 구조를 초기화합니다. 고속 조회에는 RtlInitializeGenericTableAvl 을 사용하여 고속 조회를 수행하고 구성의 데이터로 채웁니다. 그런 다음 다양한 커널 콜백을 설정하여 일련의 규칙을 사용하여 시스템을 모니터링합니다.
오브젝트 관리자 콜백을 (ObRegisterCallbacks)로 등록하기
이 훅은 ProcessPreCallback 및 ThreadPreCallback 함수를 등록합니다. 커널의 객체 관리자는 프로세스 또는 스레드에 대한 핸들 생성 또는 복제 요청을 완료하기 전에 이 코드를 실행합니다.
프로세스가 다른 프로세스에 대한 핸들을 가져오려고 하면 콜백 함수 ProcessPreCallback 가 호출됩니다. 먼저 대상 프로세스가 보호된 프로세스인지 확인합니다(목록에서). 이 경우 액세스 권한을 부여하지 않는 대신 액세스 권한을 SYNCHRONIZE | PROCESS_QUERY_LIMITED_INFORMATION 으로 설정하여 보호된 프로세스에 대한 권한을 다운그레이드하면 됩니다.
이렇게 하면 프로세스가 보호된 프로세스와 상호 작용/검사하거나 프로세스를 종료할 수 없게 됩니다.
스레드에도 동일한 메커니즘이 적용됩니다.
프로세스 생성 콜백(PsSetCreateProcessNotifyRoutineEx)
루트킷은 프로세스 생성 시 콜백을 PsSetCreateProcessNotifyRoutineEx API에 콜백을 등록합니다. 새 프로세스가 시작되면 이 콜백은 구성된 이미지 경로 목록에 대해 프로세스의 이미지를 확인하는 CheckProcessFlags 함수를 실행합니다. 그런 다음 내부 추적 테이블에 이 새 프로세스에 대한 항목을 생성하여 excluded, protected, hidden 플래그를 적절히 설정합니다.
플래그에 기반한 동작:
- 제외됨
- 루트킷은 프로세스를 무시하고 예상대로 실행합니다.
- 보호됨
- 이 루트킷은
ProcessPreCallback에서 발생하는 것과 유사하게 다른 프로세스가 권한 있는 핸들을 얻는 것을 허용하지 않습니다.
- 이 루트킷은
- 숨겨진
- 루트킷은 직접 커널 객체 조작(DKOM)을 통해 프로세스를 숨깁니다. 프로세스가 생성되는 바로 그 순간에 커널 구조를 직접 조작하는 것은 불안정할 수 있습니다. 프로세스 생성 콜백에서 프로세스를 숨겨야 하는 경우 ActiveProcessLinks 목록에서 해당 프로세스의 연결이 해제됩니다. 그러나 아래에서 설명할
postponeHiding플래그를 설정합니다.
- 루트킷은 직접 커널 객체 조작(DKOM)을 통해 프로세스를 숨깁니다. 프로세스가 생성되는 바로 그 순간에 커널 구조를 직접 조작하는 것은 불안정할 수 있습니다. 프로세스 생성 콜백에서 프로세스를 숨겨야 하는 경우 ActiveProcessLinks 목록에서 해당 프로세스의 연결이 해제됩니다. 그러나 아래에서 설명할
이미지 로드 콜백(PsSetLoadImageNotifyRoutine)
이것은 LoadProcessImageNotifyCallback 을 사용하여 PsSetLoadImageNotifyRoutine를 등록하여 실행 이미지( .exe 또는 .dll)가 프로세스의 메모리에 로드될 때마다 커널이 호출합니다.
이미지가 로드되면 콜백은 postponeHiding 플래그를 확인하고, 설정된 경우 UnlinkProcessFromCidTable 을 호출하여 마스터 프로세스 ID 테이블(PspCidTable)에서 이미지를 제거합니다.
초기화FS미니필터
이 함수는 FilterRegistration structure(FLT_REGISTRATION). 이 구조는 운영 체제가 어떤 유형의 파일 시스템 작업에 대해 어떤 함수를 호출할지 알려줍니다. 다음 요청에 대한 콜백을 등록합니다:
IRP_MJ_CREATE: 파일이나 디렉토리를 열거나 만들려는 모든 시도를 가로챕니다.IRP_MJ_DIRECTORY_CONTROL: 디렉토리의 내용을 나열하려는 모든 시도를 가로챕니다.
FltCreatePreOperation(IRP_MJ_CREATE)
이 함수는 작업 전 콜백으로, 프로세스가 파일을 생성/열려고 할 때 이 함수가 트리거됩니다. 숨길 파일 목록과 경로를 비교하여 경로를 확인합니다. 일치하는 항목이 발견되면 IRP 요청의 작업 결과가 STATUS_NO_SUCH_FILE 으로 변경되어 요청 프로세스가 제외 목록에 포함된 경우를 제외하고는 파일이 존재하지 않음을 요청 프로세스에 알립니다.
FltDirCtrlPostOperation(IRP_MJ_DIRECTORY_CONTROL)
구현된 후크는 기본적으로 시스템에서 생성된 디렉토리 리스닝을 가로채고 숨김으로 나열된 파일을 제거하여 수정합니다.
레지스트리 필터 초기화
프로세스와 파일을 숨긴 후 루트킷의 다음 단계는 Windows 레지스트리에서 항목을 지우는 것입니다. InitializeRegistryFilter 함수는 레지스트리 필터링 콜백을 설치하여 레지스트리 작업을 가로채고 수정함으로써 이 작업을 수행합니다.
콜백은 파일과 동일한 원리로 CmRegisterCallbackEx API를 사용하여 콜백을 등록하며, 파일과 동일한 원리를 사용합니다. 레지스트리 키 또는 값이 숨겨진 레지스트리 목록에 있는 경우 콜백 함수는 STATUS_NOT_FOUND 상태를 반환합니다.
초기화 디바이스
InitializeDevice 함수는 드라이버 초기화에 필요한 작업을 수행하고 IOCTL communication 를 설정하여 유저랜드 애플리케이션이 직접 통신할 수 있도록 합니다.
다음은 드라이버가 처리하는 각 IOCTL 명령에 대해 설명하는 표입니다.
| IOCTL 명령 | 설명 |
|---|---|
HID_IOCTL_SET_DRIVER_STATE | 마스터 온/오프 스위치 역할을 하는 글로벌 상태 플래그를 설정하여 루트킷 기능을 소프트 활성화/비활성화할 수 있습니다. |
HID_IOCTL_GET_DRIVER_STATE | 루트킷의 현재 상태(활성화/비활성화)를 검색합니다. |
HID_IOCTL_ADD_HIDDEN_OBJECT | 특정 파일, 디렉터리, 레지스트리 키 또는 값을 숨기는 새 규칙을 추가합니다. |
HID_IOCTL_REMOVE_HIDDEN_OBJECT | 고유 ID로 단일 숨김 규칙을 제거합니다. |
HID_IOCTL_REMOVE_ALL_HIDDEN_OBJECTS | 특정 개체 유형(레지스트리 키/값, 파일, 디렉터리)에 대한 모든 숨겨진 개체를 제거합니다. |
HID_IOCTL_ADD_OBJECT | 이미지 경로에 따라 프로세스를 자동으로 숨기거나 보호하거나 제외하는 새 규칙을 추가합니다. |
HID_IOCTL_GET_OBJECT_STATE | 실행 중인 특정 프로세스의 현재 상태(숨김, 보호됨, 제외됨)를 해당 PID로 조회합니다. |
HID_IOCTL_SET_OBJECT_STATE | 이 명령은 실행 중인 특정 프로세스의 상태(숨김, 보호됨 또는 제외됨)를 수정하며, 해당 프로세스의 PID로 식별됩니다. |
HID_IOCTL_REMOVE_OBJECT | 고유 ID로 단일 프로세스 규칙(숨기기, 보호 또는 제외)을 제거합니다. |
HID_IOCTL_REMOVE_ALL_OBJECTS | 이 명령은 특정 유형의 모든 프로세스 상태 및 이미지 규칙을 지웁니다. |
초기화 스텔스 모드
구성, 프로세스 콜백 및 파일 시스템 필터를 성공적으로 설정한 후 루트킷은 최종 초기화 루틴을 실행합니다: InitializeStealthMode. 구성 플래그 Kbj_YinshenMode 를 활성화하면 위에서 설명한 것과 동일한 기술을 사용하여 레지스트리 키, .sys 파일 및 기타 관련 구성 요소를 포함하여 루트킷과 관련된 모든 아티팩트를 숨깁니다.
코드 변형
이 멀웨어는 HIDDENDRIVER 소스 코드를 기반으로 하고 있지만, 분석 결과 몇 가지 사소한 변경 사항이 발견되었습니다. 다음 섹션에서는 저희가 관찰한 주목할 만한 코드 차이점을 자세히 설명합니다.
IsProcessExcluded 함수의 원본 코드는 루트킷의 작업에서 시스템 프로세스(PID 4)를 일관되게 제외합니다. 그러나 악성 루트킷에는 제공된 스크린샷에서 볼 수 있듯이 추가 프로세스 이름에 대한 제외 목록이 있습니다.
파일, 디렉터리, 레지스트리 등 시스템 정보를 필터링하는 원래 코드의 콜백은 IsDriverEnabled 함수를 사용하여 드라이버 기능이 활성화되어 있는지 확인했습니다. 그러나 관찰된 루트킷은 사용자랜드 애플리케이션에 해당하는 이미지 이름 하이잭을 가진 프로세스에 대한 추가 자동 화이트리스트 검사를 도입했습니다.
RMM 사용법
GotoHTTP 도구는 합법적인 원격 모니터링 및 관리(RMM) 애플리케이션으로, 위협 행위자가 손상된 IIS 서버에 쉽게 액세스할 수 있도록 배포합니다. "브라우저-투-클라이언트" 아키텍처를 통해 공격자는 일반 웹 포트(80/443)를 통해 표준 웹 브라우저에서 서버를 제어할 수 있으며, 모든 트래픽을 GotoHTTP의 자체 플랫폼을 통해 라우팅하여 공격자의 자체 인프라로 직접 네트워크 연결을 방지할 수 있습니다.
사이버 킬 체인의 여러 지점에서 다양한 위협 행위자가 사용하기 위해 RMM의 인기가 계속 높아지고 있습니다. 대부분의 안티 멀웨어 공급업체는 이러한 멀웨어를 단독으로 악의적인 것으로 간주하지 않기 때문에 완전히 차단하지 않습니다. RMM C2는 또한 합법적인 RMM 제공업체 웹사이트로만 이동하므로 네트워크 기반 보호 및 모니터링에 대해서도 동일한 역학 관계를 갖습니다.
현재 활성 상태인 RMM을 대량으로 차단하고 기업이 선호하는 RMM만 허용하는 것이 최적의 보호 메커니즘입니다. 그러나 이 패러다임은 적절한 기술 지식, 방어 도구, 성숙한 조직 정책, 부서 간 조율을 갖춘 기업에서만 사용할 수 있습니다.
IIS 모듈 분석
위협 행위자는 악성 IIS 모듈인 32비트 및 64비트 버전의 TOLLBOOTH를 모두 배포하는 것이 관찰되었습니다. 톨부스는 안랩과 보안 연구원 @Azaka가 이전에 논의한 바 있습니다. 멀웨어의 주요 기능에는 SEO 클로킹, 관리 채널, 공개적으로 액세스할 수 있는 웹셸 등이 있습니다. 네이티브 버전과 .NET 관리형 버전이 모두 야생에 배포되는 것을 발견했습니다.
멀웨어 구성 구조
톨부스는 hxxps://c[.]cseo99[.]com/config/<victim_HTTP_host_value>.json, 에서 동적으로 구성을 검색하며 각 피해자의 JSON 구성 파일 생성은 위협 행위자의 인프라에서 처리합니다. 그러나 hxxps://c[.]cseo99[.]com/config/127.0.0.1.json 에서 응답한 결과 분석 방지 검사가 부족하여 분석을 위해 구성 파일 사본을 검색할 수 없었습니다. 이 깃허브 요약에서 볼 수 있으며, 일부 필드가 어떻게 사용되는지 적절히 참조할 것입니다.
네이티브 모듈의 경우 구성 및 기타 임시 캐시 파일은 Gzip으로 압축되어 하드코딩된 경로 C:\\Windows\\Temp\\_FAB234CD3-09434-8898D-BFFC-4E23123DF2C\\ 에 로컬로 저장됩니다. 관리형 모듈의 경우, 키 YourSecretKey123 및 IV 0123456789ABCDEF 로 AES 암호화되고 Gzip 압축되어 C:\\Windows\\Temp\\AcpLogs\\ 에 저장됩니다.
웹쉘
톨부스는 /mywebdll 경로에 웹셸을 노출하며, 파일 업로드 및 명령 실행을 위해 hack123456! 비밀번호를 요구합니다. 양식 제출은 /scjg 엔드포인트로 POST 요청을 보냅니다.
비밀번호는 바이너리에 하드코딩되어 있으며, 이 웹셸 기능은 기본 버전의 TOLLBOOTH v1.6.0 및 v1.6.1 모두에 있습니다.
파일 업로드 기능에는 multipart/form-data 필드의 순차적, 순서에 따른 구문 분석으로 인해 발생하는 버그가 있습니다. 표준 HTML 양식은 파일 입력 필드가 디렉토리 입력 필드 앞에 표시되도록 구조화되어 있습니다. 요청 부분을 처리하는 서버가 대상 디렉터리보다 먼저 파일 데이터를 처리하려고 시도하여 종속성 충돌이 발생하여 표준 업로드가 실패합니다. multipart/form-data 부분을 수동으로 재주문해도 파일 업로드가 성공적으로 트리거될 수 있습니다.
관리 채널
톨부스는 C2 운영자의 관리/디버그 목적을 위해 몇 가지 추가 엔드포인트를 노출합니다. 사용자 에이전트를 다음 중 하나로 설정해야만 액세스할 수 있습니다(구성 가능):
Hijackbot
gooqlebot
Googlebot/2.;
Googlébot
Googlêbot
Googlebót;
Googlebôt;
Googlebõt;
Googlèbot;
Googlëbot;
Binqbot
bingbot/2.;
Bíngbot
Bìngbot
Bîngbot
Bïngbot
Bingbót;
Bingbôt;
Bingbõt;
/health 엔드포인트는 c[.]cseo99[.]com 에 저장된 구성에 액세스할 수 있는 파일 이름, 디스크 공간 정보, 모듈의 설치 경로, TOLLBOOTH 버전을 반환하여 모듈의 상태를 빠르게 평가할 수 있는 방법을 제공합니다.
/debug 엔드포인트는 구성 요약, 캐시 디렉토리, HTTP 요청 정보 등을 포함한 자세한 내용을 제공합니다.
구문 분석된 구성은 /conf 에서 확인할 수 있습니다.
운영자는 /clean 엔드포인트에서 로컬에 저장된 구성 파일(clean?type=conf)을 삭제하여 현재 구성을 지우고, 악성코드가 사용하는 다른 임시 캐시(clean?type=conf)를 지우거나, C:\\Windows\\Temp\\_FAB234CD3-09434-8898D-BFFC-4E23123DF2C\\ 경로에 있는 모든 것(clean?type=all)을 지울 수 있습니다.
SEO 클로킹
톨부스의 주요 목표는 키워드에 최적화된 콘텐츠를 검색 엔진 크롤러에게 표시하는 동시에 일반 사용자 검색에는 숨겨 해당 페이지의 검색 순위를 높이는 SEO 클로킹 프로세스입니다. 방문자가 부스트된 검색 결과의 링크를 클릭하면 멀웨어가 악성 또는 사기성 페이지로 리디렉션합니다. 이 수법은 사용자가 원치 않는 이메일보다 검색 엔진 결과를 더 신뢰하기 때문에 직접 피싱과 같은 다른 수법에 비해 악성 페이지로 유입되는 트래픽을 늘리는 데 효과적입니다.
톨부스는 사용자 에이전트와 리퍼러 헤더에서 구성에 정의된 값을 확인하여 봇과 방문자를 구분합니다.
네이티브 모듈과 관리형 모듈은 거의 동일하게 구현됩니다. 유일한 차이점은 네이티브 모듈( v1.6.0 및 v1.6.1 )은 사용자 에이전트와 리퍼러를 모두 seoGroupRefererMatchRules 목록에서 확인하고, .NET 모듈( v1.6.1 )은 사용자 에이전트를 seoGroupUaMatchRules 목록에서, 리퍼러를 seoGroupRefererMatchRules 목록에서 확인한다는 점입니다.
현재 구성에 따라 seoGroupUaMatchRules 및 seoGroupRefererMatchRules 의 값은 각각 googlebot 및 google 입니다. 구글봇 크롤러는 사용자 에이전트 일치 항목은 있지만 리퍼러 일치 항목은 없는 반면, 인간 방문자는 리퍼러 일치 항목은 있지만 사용자 에이전트 일치 항목은 없습니다. bing 와 yahoo 이 모두 포함된 대체 목록을 보면 과거에도 이 검색 엔진이 표적이 되었음을 알 수 있습니다.
아래 코드 스니펫은 검색 엔진 크롤러가 볼 수 있는 키워드로 채워진 링크로 채워진 페이지를 구축하는 역할을 합니다.
이 모듈은 두 단계로 링크 팜을 구성합니다. 먼저 내부 링크 밀도를 구축하기 위해 affLinkMainWordSeoResArr 구성 필드에 정의된 리소스 URI에서 임의의 키워드 목록을 검색합니다. 각 키워드에 대해 동일한 침해된 웹사이트의 다른 SEO 페이지로 연결되는 "로컬 링크" 를 생성합니다. 다음으로 affLinkSeoResArr 필드에서 "제휴사 링크 리소스" 를 검색하여 외부 네트워크를 구축합니다. 이러한 리소스는 다른 외부 도메인의 SEO 페이지를 가리키는 URI 목록으로, 이 페이지도 TOLLBOOTH에 감염되어 있습니다. URI는 구성에서 hxxps://f[.]fseo99[.]com/<date>/<md5_file_hash><.txt/.html> 처럼 보입니다. 그런 다음 모듈은 현재 사이트에서 이러한 다른 피해자로 연결되는 하이퍼링크를 생성합니다. 링크 파밍으로 알려진 이 기법은 손상된 사이트의 전체 네트워크에서 검색 엔진 순위를 인위적으로 부풀리기 위해 고안되었습니다.
다음은 크롤러 봇이 톨부스에 감염된 웹 서버의 랜딩 페이지를 방문할 때 표시되는 화면의 예시입니다.
SEO 페이지의 URL 경로 접두사에 seoGroupUrlMatchRules 구성 필드의 단어나 문구가 포함되어 있습니다. 이는 방문자를 대상으로 하는 사이트 리디렉션 로직에서도 참조됩니다. 현재입니다:
stockinvestsummarydataminingmarket-outlookbullish-onnews-overviewnews-volatilityvideo/app/blank/
SEO 페이지용 템플릿과 콘텐츠도 구성에서 hxxps://f[.]fseo99[.]com/<date>/<md5_file_hash><.txt/.html> 처럼 보이는 URI에서 외부에서 검색됩니다. 다음은 SEO 페이지 중 하나가 어떻게 보이는지 보여주는 예시입니다:
사용자 리디렉션 로직의 경우 모듈은 먼저 방문자의 IP 주소, 사용자 에이전트, 리퍼러, SEO 페이지의 타겟 키워드 등 방문자의 지문을 수집합니다. 그런 다음 POST 요청을 통해 이 정보를 hxxps://api[.]aseo99[.]com/client/landpage 으로 전송합니다. 요청이 성공하면 서버는 리디렉션의 목적지가 되는 특정 landpageUrl 이 포함된 JSON 객체로 응답합니다.
어떤 이유로든 통신이 실패하면 Tollbooth는 동일한 C2 엔드포인트를 가리키는 새 URL을 다시 구성하는 대신 방문자의 정보를 URL에 직접 GET 매개변수로 인코딩합니다. 마지막으로, 성공적인 C2 응답 또는 폴백에서 선택한 URL이 자바스크립트 스니펫(window.location.href)에 삽입되어 피해자의 브라우저로 전송되어 즉각적인 리디렉션이 이루어집니다.
페이지 하이재커
기본 모듈의 경우 URI 경로에 xlb 이 포함되어 있으면 Tollbooth는 스크립트 태그가 포함된 사용자 지정 로더 페이지로 응답합니다. 이 스크립트의 src 속성은 동적으로 생성된 URL( mlxya[.]oss-accelerate[.]aliyuncs[.]com/<12_random_alphanumeric_characters>)을 가리키며, 이 URL은 난독화된 다음 단계 자바스크립트 페이로드를 검색하는 데 사용됩니다.
난독화된 페이로드는 URL에 있는 특정 트리거 키워드(예: xlbh, mxlb)를 기반으로 실행되는 페이지 교체 도구로 보입니다. 트리거되면 공격자가 제어하는 엔드포인트 중 하나( asf-sikkeiyjga[.]cn-shenzhen[.]fcapp[.]run/index/index?href= 또는 ask-bdtj-selohjszlw[.]cn-shenzhen[.]fcapp[.]run/index/index?key=)에 접속하여 현재 페이지의 URL을 Base64로 인코딩된 매개변수로 추가하여 침해된 사이트를 식별합니다. 그런 다음 스크립트는 document.write() 을 사용하여 현재 페이지의 DOM을 완전히 지우고 서버의 응답으로 대체합니다. 작성 시점에 최종 페이로드는 검색할 수 없었지만, 이 기법은 공격자가 제어하는 콘텐츠(가장 일반적으로 악성 HTML 페이지 또는 다른 악성 사이트로의 JS 리디렉션)를 삽입하도록 설계되었습니다.
캠페인 타겟팅
톨부스와 관련 웹쉘을 분석하는 동안 능동적 및 반 수동적 수집 방법을 통해 추가 피해자를 식별할 수 있는 여러 메커니즘을 확인했습니다.
그런 다음 보다 포괄적인 피해자 목록을 개발하기 위해 Validin의 @SreekarMad와 파트너십을 맺고 그의 전문 지식과 스캔 인프라를 활용했습니다.
게시 시점에 571 IIS 서버 피해자는 활성 Tollbooth 감염으로 확인되었습니다.
이러한 서버는 전 세계에 분산되어 있으며(아래 설명하는 한 가지 주요 예외를 제외하고), 깔끔한 산업별 버킷에 맞지 않습니다. 이러한 이유로, 작업의 엄청난 규모와 함께 피해자를 선정하는 데 있어 표적화되지 않았으며, 자동화된 스캔을 활용하여 공개적으로 나열된 머신 키를 재사용하는 IIS 서버를 식별하는 것으로 추정됩니다.
밸리딘 및 텍사스 에이엠 시스템 사이버시큐리티(&)와의 협력을 통해 톨부스에 감염된 추가 피해자에 대한 방대한 양의 메타데이터를 확보했습니다.
자동화된 익스플로잇도 사용될 수 있지만, TAMUS 사이버 보안은 익스플로잇 이후의 활동이 대화형인 것으로 보인다고 지적했습니다.
Validin은 SEO 파밍 링크 구성을 통해 연결된 다른 감염 가능성이 있는 도메인을 발견했지만, 웹셸 인터페이스를 확인한 결과 일부에서는 액세스할 수 없는 것으로 나타났습니다. 이러한 서버에 대한 심층적인 수동 조사를 수행한 결과, 실제로 톨부스에 감염된 것으로 확인되었지만 소유자가 문제를 해결했거나 공격자가 스스로 물러난 것으로 확인되었습니다.
이후 검사 결과 동일한 서버가 다수 재감염된 것으로 확인되었습니다. 이는 수정이 불완전하다는 의미로 받아들였습니다. 한 가지 그럴듯한 설명은 단순히 위협을 제거한다고 해서 머신 키 재사용으로 인해 열린 취약점이 닫히지 않는다는 것입니다. 따라서 이 마지막 단계를 생략한 피해자는 동일한 메커니즘을 통해 재감염될 가능성이 높습니다. 자세한 내용은 아래의 'REF3927 수정하기' 섹션을 참조하세요.
지리
피해자의 지리적 분포는 특히 중국 국경 내의 서버는 제외되어 있습니다. 홍콩에서 한 서버가 확인되었지만 .co.uk 도메인을 호스팅하고 있었습니다. 이러한 지오펜싱의 가능성은 다른 범죄 위협의 행동 패턴과 일치하며, 이들은 본국의 시스템을 표적으로 삼지 않도록 메커니즘을 구현합니다. 이들 국가의 정부는 외국인을 대상으로 한 범죄 행위를 노골적으로 지지하지는 않더라도 눈감아주는 경향이 있기 때문에 기소될 위험이 줄어듭니다.
다이아몬드 모델
Elastic Security Labs는 다이아몬드 모델을 활용하여 공격자, 기능, 인프라, 침입 피해자 간의 높은 수준의 관계를 설명합니다. 다이아몬드 모델은 단일 인시던트에 가장 일반적으로 사용되며 활동 스레딩(섹션 8)을 활용하여 인시던트 간의 관계를 생성하는 반면, 공격자 중심(섹션 7.1.4)의 경우 접근 방식은 하나의 다이아몬드를 허용합니다.
REF3927 수정
감염 자체의 치료는 깨끗한 상태로 되돌리고 멀웨어 및 지속성 메커니즘을 해결하는 등의 업계 모범 사례를 통해 완료할 수 있습니다. 그러나 자동화된 스캔과 악용 가능성이 있는 상황에서 재사용된 머신 키의 취약성은 서버를 장악하려는 악의적인 공격자에게 여전히 남아 있습니다.
따라서 문제 해결에는 기계 키를 올바르게 생성된 새 키로 교체하는 작업이 포함되어야 합니다.
결론
REF3927 캠페인은 공개적으로 노출된 머신 키 사용과 같은 단순한 구성 오류가 어떻게 심각한 침해로 이어질 수 있는지를 강조합니다. 이 사건에서 텍사스 A M 대학교 시스템 사이버 보안(&)과 피해 고객은 서버를 복구하기 위해 신속하게 조치를 취했지만, 조사 결과 동일한 수법을 사용하는 다른 피해자가 계속 발생하고 있는 것으로 확인되었습니다.
위협 행위자가 오픈 소스 툴링, RMM 소프트웨어, 악성 드라이버를 통합한 것은 성공적인 운영으로 입증된 기술을 효과적으로 조합한 것입니다. 공개적으로 노출된 IIS 환경의 관리자는 머신 키 구성을 감사하고, 강력한 보안 로깅을 보장하며, 잠재적인 사고 발생 시 Elastic Defend와 같은 엔드포인트 탐지 솔루션을 활용해야 합니다.
탐지 로직
탐지 규칙
예방 규칙
YARA 서명
Elastic Security는 REF3927에서 관찰된 멀웨어를 방지하기 위해 다음과 같은 YARA 규칙을 만들었습니다:
REF3927을 통해 MITRE ATT&CK
Elastic은 위협이 엔터프라이즈 네트워크에 대해 사용하는 일반적인 전술, 기술 및 절차를 문서화하기 위해 MITRE ATT& CK 프레임워크를 사용합니다.
전술
전술은 기술 또는 하위 기술의 이유를 나타냅니다. 이는 적의 전술적 목표, 즉 행동을 수행하는 이유입니다.
기술
기술은 공격자가 행동을 수행하여 전술적 목표를 달성하는 방법을 나타냅니다.
- Exploit Public-Facing Application
- 서버 소프트웨어 구성 요소: IIS 구성 요소
- OS 자격 증명 덤프
- Hide Artifacts: Hidden Files and Directories
- 로컬 시스템의 데이터
- Rootkit
- 유효한 계정
관찰
이 연구에서는 다음과 같은 관찰 가능성에 대해 논의했습니다.
| 관측 가능합니다. | 유형 | 이름 | 참조 |
|---|---|---|---|
913431f1d36ee843886bb052bfc89c0e5db903c673b5e6894c49aabc19f1e2fc | SHA-256 | WingtbCLI.exe | 히든클리 |
f9dd0b57a5c133ca0c4cab3cca1ac8debdc4a798b452167a1e5af78653af00c1 | SHA-256 | Winkbj.sys | 히든 드라이버 |
c1ca053e3c346513bac332b5740848ed9c496895201abc734f2de131ec1b9fb2 | SHA-256 | caches.dll | 톨부스 |
c348996e27fc14e3dce8a2a476d22e52c6b97bf24dd9ed165890caf88154edd2 | SHA-256 | scripts.dll | 톨부스 |
82b7f077021df9dc2cf1db802ed48e0dec8f6fa39a34e3f2ade2f0b63a1b5788 | SHA-256 | scripts.dll | 톨부스 |
bd2de6ca6c561cec1c1c525e7853f6f73bf6f2406198cd104ecb2ad00859f7d3 | SHA-256 | caches.dll | 톨부스 |
915441b7d7ddb7d885ecfe75b11eed512079b49875fc288cd65b023ce1e05964 | SHA-256 | CustomIISModule.dll | 톨부스 |
c[.]cseo99[.]com | 도메인 이름 | 톨게이트 구성 서버 | |
f[.]fseo99[.]com | 도메인 이름 | 톨게이트 SEO 파밍 설정 서버 | |
api[.]aseo99[.]com | 도메인 이름 | 톨게이트 크롤러 보고 & 페이지 리디렉터 API | |
mlxya[.]oss-accelerate.aliyuncs[.]com | 도메인 이름 | 톨게이트 페이지 하이재커 페이로드 호스팅 서버 | |
asf-sikkeiyjga[.]cn-shenzhen[.]fcapp.run | 도메인 이름 | 톨게이트 페이지 하이재커 콘텐츠 불러오기 서버 | |
ask-bdtj-selohjszlw[.]cn-shenzhen[.]fcapp[.]run | 도메인 이름 | 톨게이트 페이지 하이재커 콘텐츠 불러오기 서버 | |
bae5a7722814948fbba197e9b0f8ec5a6fe8328c7078c3adcca0022a533a84fe | SHA-256 | 1.aspx | 고질라 포크 웹쉘(VirusTotal의 유사한 샘플) |
230b84398e873938bbcc7e4a1a358bde4345385d58eb45c1726cee22028026e9 | SHA-256 | GotoHTTP.exe | GotoHTTP |
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101213 Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 | 사용자 에이전트 | IIS 뷰스테이트 인젝션을 통한 익스플로잇 중 관찰된 사용자 에이전트 |
참고 자료
위의 조사에서 참조한 내용은 다음과 같습니다:
- https://www.microsoft.com/en-us/security/blog/2025/02/06/code-injection-attacks-using-publicly-disclosed-asp-net-machine-keys/
- https://asec.ahnlab.com/en/87804/
- https://unit42.paloaltonetworks.com/initial-access-broker-exploits-leaked-machine-keys/
- https://blog.blacklanternsecurity.com/p/aspnet-cryptography-for-pentesters
- https://github.com/ekkoo-z/Z-Godzilla_ekp
- https://x.com/AzakaSekai_/status/1969294757978652947
부록
하팡랩은 이 게시물이 공개된 당일에 이 위협에 대한 연구 초안을 게시했습니다. 그 안에는 추가적인 보완적인 인사이트가 있습니다:
