
Windows 로컬 권한 상승 (CVE-2023-21746)에 대한 개념 증명 익스플로잇으로, NTLM 로컬 인증을 악용하여 SMB 공유 액세스 및 DLL 하이재킹을 통해 SYSTEM 권한을 획득합니다.
Windows에서 로컬 권한 상승(LPE) 취약점이 2022년 9월 9일 Andrea Pierini(@decoder_it)와 Antonio Cocomazzi(@splinter_code)에 의해 Microsoft에 보고되었습니다. 이 취약점은 호스트에 낮은 권한 계정을 가진 공격자가 SYSTEM 권한으로 임의 파일을 읽고 쓸 수 있게 합니다.
취약점 자체만으로는 SYSTEM으로 명령을 직접 실행할 수 없지만, 여러 벡터를 결합하여 이를 달성할 수 있습니다. 편리하게도, 2023년 2월 13일 BlackArrowSec이 StorSvc 서비스를 남용하는 또 다른 권한 상승 PoC를 발표했습니다. 이는 공격자가 PATH 내 디렉토리에 DLL 파일을 쓸 수만 있다면 SYSTEM으로 코드를 실행할 수 있게 합니다.
LocalPotato PoC는 NTLM 로컬 인증이라는 NTLM 인증의 특별한 경우의 결함을 이용하여, 권한 있는 프로세스가 공격자가 로컬 SMB 서버에 대해 시작한 세션을 인증하도록 속입니다. 결과적으로 공격자는 속은 프로세스의 권한으로 모든 공유(특수 공유인 C$ 또는 ADMIN$ 포함)에 접근할 수 있는 연결을 갖게 됩니다.
익스플로잇이 따르는 과정은 다음과 같습니다:
SMB 공유에 대한 권한 있는 연결을 통해 공격자는 대상 머신의 모든 위치에서 파일을 읽거나 쓸 수 있습니다. 이것만으로는 취약한 머신에 대해 명령을 직접 실행할 수 없지만, 다른 공격 벡터와 결합하여 그 목적을 달성할 것입니다.
이 취약점은 SMB 서버보다는 NTLM 프로토콜에 있으므로, 이론적으로는 NTLM을 통한 인증을 활용하는 모든 서비스에 동일한 공격 벡터를 사용할 수 있습니다. 그러나 실제로는 공격할 프로토콜을 선택할 때 몇 가지 주의 사항을 처리해야 합니다. PoC는 유사한 공격 벡터에 대한 다른 프로토콜의 추가 보호를 피하기 위해 SMB 서버를 사용하며, 심지어 SMB 서버에 대해 익스플로잇이 작동하도록 빠른 우회를 구현합니다. 원본 익스플로잇 작성자의 게시물 - (https://decoder.cloud/2023/02/13/localpotato-when-swapping-the-context-leads-you-to-system/)
지금까지 LocalPotato를 사용하여 대상 머신에 임의의 파일을 썼습니다. 권한 있는 셸을 얻으려면, 임의 쓰기를 사용하여 명령을 실행하는 방법을 알아내야 합니다.
최근에 또 다른 권한 상승 벡터가 발견되었는데, 공격자가 누락된 DLL을 하이재킹하여 SYSTEM 권한으로 임의의 명령을 실행할 수 있습니다. 이 벡터의 유일한 문제는 공격자가 DLL을 시스템 PATH에 써야 트리거할 수 있다는 것입니다. 기본적으로 Windows PATH에는 권한 있는 계정만 쓸 수 있는 디렉토리만 포함됩니다. 특정 애플리케이션의 설치로 PATH 변수가 변경되어 머신이 취약해진 경우를 찾을 수 있지만, 이 공격 벡터는 특정 시나리오에만 적용됩니다. 이 공격을 LocalPotato와 결합하면 이러한 제한을 극복하고 완전히 작동하는 권한 상승 익스플로잇을 얻을 수 있습니다.
StorSvc 및 DLL 하이재킹 BlackArrowSec (https://github.com/blackarrowsec/redteam-research/tree/26e6fc0c0d30d364758fa11c2922064a9a7fd309/LPE via StorSvc)이 발견한 바에 따르면, 공격자는 "StorSvc" 서비스가 제공하는 "SvcRebootToFlashingMode" 메서드에 RPC 호출을 보낼 수 있으며, 이는 결국 "SprintCSP.dll"이라는 누락된 DLL을 로드하려는 시도를 트리거합니다. RPC에 익숙하지 않다면, 원격으로 사용할 수 있는 함수를 노출하는 API라고 생각하면 됩니다. 이 경우 StorSvc 서비스는 SvcRebootToFlashingMode 메서드를 노출하며, 머신에 접근 권한이 있는 모든 사람이 호출할 수 있습니다. StorSvc는 SYSTEM 권한으로 실행되므로 PATH 어딘가에 SprintCSP.dll을 생성하면 SvcRebootToFlashingMode 호출이 있을 때마다 로드됩니다.
익스플로잇 컴파일 익스플로잇 링크 - (https://github.com/decoder-it/LocalPotato) 이 익스플로잇을 사용하려면 먼저 제공된 두 파일을 컴파일해야 합니다:
"RpcClient.exe"부터 처리해 보겠습니다. 앞서 언급했듯이 대상 머신의 Windows 버전에 따라 익스플로잇을 변경해야 합니다. 이를 위해 "LPE via StorSvc\RpcClient\RpcClient\storsvc_c.c"의 첫 번째 줄을 변경하여 올바른 운영 체제를 선택해야 합니다. 이렇게 하면 익스플로잇이 올바른 RPC 인터페이스 식별자를 사용하도록 설정됩니다. 이제 코드가 수정되었으므로 개발자 명령 프롬프트를 열고 다음 명령을 실행하여 프로젝트를 빌드해 보겠습니다: 명령: C:\LPE via StorSvc\RpcClient> msbuild RpcClient.sln C:\LPE via StorSvc\RpcClient> move x64\Debug\RpcClient.exe C:\Users\user\Desktop\ (컴파일된 실행 파일이 바탕 화면에 있습니다.)
이제 "SprintCSP.dll"을 컴파일하려면 "C:\LPE via StorSvc\SprintCSP\SprintCSP\main.c"의 "DoStuff()" 함수만 수정하여 머신에 대한 권한 있는 접근을 부여하는 명령을 실행하도록 하면 됩니다. 간단히 하기 위해 DLL이 현재 사용자를 Administrators 그룹에 추가하도록 만들겠습니다. 또한 대상에서 우리 머신으로 리버스 셸을 얻을 수도 있습니다. 이제 다음 명령을 실행하여 DLL을 컴파일하고 결과를 바탕 화면으로 이동합니다: 명령: C:\LPE via StorSvc\SprintCSP> msbuild SprintCSP.sln C:\LPE via StorSvc\SprintCSP> move x64\Debug\SprintCSP.dll C:\Users\user\Desktop\
이제 익스플로잇을 실행할 준비가 되었습니다. "LocalPotato.exe" 익스플로잇, "RpcClient.exe" 및 "SprintCSP.dll" 파일이 있는지 확인하십시오.
탐지 및 완화
탐지 이제 localpotato 익스플로잇이 어떻게 작동하는지, 그리고 StorSrv 서비스와 체인으로 연결되어 SYSTEM으로 코드를 실행하는 방법을 이해했으므로, 시스템 내에서 이를 탐지하고 이러한 공격을 예방하는 방법을 살펴보겠습니다.
YARA 규칙: 이 공격은 명령줄 터미널에서 인수와 함께 실행 파일을 실행하는 것을 포함하므로, 이 활동을 탐지하는 일반적인 두 가지 방법은 패턴 일치 도구 YARA를 사용하여 파일 패턴을 탐지하고, 이 해킹 도구 localpotato.exe의 실행으로 생성된 이벤트를 검사하는 것입니다. 이 공격은 localpotato.exe로 알려진 해킹 도구를 사용하므로, YARA 또는 THOR와 같은 다른 탐지 도구를 사용하여 시스템 내에서 이 도구의 존재를 탐지하는 YARA 규칙을 만들 수 있습니다. (YARA 규칙은 이 저장소에 첨부되어 있습니다. 이 최소 규칙은 localpotato 실행 파일에서 일반적인 문자열 패턴을 찾습니다.)
Sigma 규칙: SIGMA는 이벤트 로그에서 발견된 패턴을 기반으로 탐지 규칙을 작성하는 데 사용되는 일반 시그니처 언어입니다. 네트워크에서 localpotato를 탐지하려면 중앙 집중식 로그 모니터링이 활성화되어 있어야 합니다. 다음 SIGMA 규칙은 SIGMA 공식 저장소 (https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_creation/proc_creation_win_hktl_localpotato.yml)에서 가져왔습니다.
이러한 sigma 규칙을 사용하여 해당 환경의 탐지/모니터링 도구로 변환하고 이벤트 로그를 검색하여 잠재적인 공격을 사냥할 수 있습니다.
완화