
HP Support Assistant에서의 로컬 권한 상승
하드 링크를 악용한 HP Support Assistant의 로컬 권한 상승 버그
연구자: Bkav의 ManhNDd
HP Support Assistant GUI에서 업데이트 및 메시지 확인(Check for updates and messages) 을 클릭하면 HP Support Solution Framework 서비스가 일부 작업을 실행하고, HPSAObjUtil8.exe(SYSTEM 권한으로 실행)를 시작하여 C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA 폴더의 모든 .xml 파일 권한을 변경합니다. 자세히 말하면, HPSAObjUtil8.exe는 모든 사용자에게 이 .xml 파일들에 대한 완전한 제어 권한을 부여합니다. 다음은 HPSAObjUtil8의 취약한 코드입니다:
public static void AddTempLogsPermission()
{
string path = Environment.GetEnvironmentVariable("ProgramData") + "\\Hewlett-Packard\\HP Support Framework\\Logs\\Temp\\HPSA";
if (Directory.Exists(path))
{
string[] files = Directory.GetFiles(path, "*.xml");
if (files != null && files.Length != 0)
{
foreach (string fileOrFolderName in files)
{
Patches._utils.AddFileSecurity(fileOrFolderName);
}
}
}
}
사용자는 C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA 폴더에 ???.xml이라는 이름의 하드 링크를 만들고 이를 우리가 선택한 대상 파일(읽기 권한만 있으면 됨)에 연결한 다음, HPSAObjUtil8이 해당 파일의 권한을 변경하도록 하여 해당 파일에 대한 완전한 권한(읽기/쓰기/삭제)을 얻을 수 있습니다. 따라서 이 버그를 통해 시스템 파일에 대한 완전한 권한을 얻을 수 있으며, 시스템 DLL을 덮어써서 시스템 권한을 획득할 수 있습니다. 참고로, 이 버그의 CVSS 3.0 점수는 필요 권한(Privileges Required) 이 High로 설정되어 있습니다. 하지만 이는 None이어야 합니다. 저는 비관리자 사용자로 이 버그를 성공적으로 테스트했기 때문입니다.
HPSF.exe와 HPSupportSolutionsFrameworkService.exe를 리버싱하여, 클라이언트 HPSF.exe가 HP.SupportFramework.ServiceManager.Interfaces.IServiceInterface 인터페이스(HP.SupportFramework.ServiceManager.dll에 정의됨)를 통해 서비스와 통신한다는 것을 알아냈습니다. 클라이언트가 IserviceInterface.RunAnalysis 메서드를 호출하면 서비스가 HPSAObjUtil8을 시작하여 버그를 트리거합니다.
ServiceInterface.Instance.RunAnalysis("en-US", true);
따라서 가짜 클라이언트를 만들어 RunAnalysis를 호출해야 합니다. 그러나 서비스는 요청을 처리하기 전에 클라이언트를 검증합니다:
{
Process processById = Process.GetProcessById(\u0002);
string text = \u000E.\u0001(processById);
if (processById.MainModule.FileName.ToLowerInvariant() != text.ToLowerInvariant())
{
if (DebugLog.IsDebug)
{
DebugLog.LogDebugMessage("Invalid File detected: " + text, DebugLog.IndentType.None);
}
return false;
}
Process parent = processById.GetParent();
bool flag = true;
int num = 0;
while (parent != null && flag && num <= 5)
{
bool flag2;
flag = \u000E.\u0001(parent, out flag2);
if (!flag || flag2)
{
break;
}
num++;
parent = parent.GetParent();
}
return flag;
}
클라이언트 검증을 우회해 봅시다:
이제 하드 링크의 대상이 될 수 있는 실행 파일을 찾아야 합니다. SYSTEM 권한으로 자동 실행되는 EXE 또는 DLL이어야 합니다. 그래야 덮어쓸 때 SYSTEM 권한을 얻을 수 있습니다. RunAnalysis를 호출하면 HPSupportSolutionsFrameworkService가 SYSTEM 권한으로 많은 프로세스를 시작한다는 것을 확인했습니다. 이러한 프로세스를 자신의 실행 파일로 덮어쓸 수 있습니다. 그러나 서비스는 이러한 EXE를 시작하기 전에 서명을 확인하므로 가짜 EXE를 만들 수는 없지만, 해당 EXE가 로드하는 DLL을 활용할 수 있습니다. 이미 로드되어 있는 DLL도 많고, 로드 전에 서명이 확인되는 .NET DLL도 많아 사용할 수 없습니다. 다행히도 여전히 사용 가능한 DLL이 몇 가지 있습니다:
저는 hputils64.dll을 수정해 보았고 성공했습니다. hputils64.dll에 대한 하드 링크를 만듭니다. RunAnalysis를 호출하면 HPSAObjUtil8이 hputils64.dll의 권한을 변경하고, 몇 초 후 Detect_BatteryFailure.exe가(LOCAL SYSTEM 권한으로) 시작되어 hputils64.dll을 로드합니다. hputils64가 로드되기 전에 이를 덮어쓸 수 있으므로 Detect_BatteryFailure.exe가 악성 DLL을 로드하게 되어 결국 SYSTEM 권한을 얻을 수 있습니다.
익스플로잇을 작성하기 위해 다음을 만들었습니다:
다음은 PrivHP4.py의 악용 단계입니다:
PoC를 테스트하려면 리포지토리를 클론하고 PrivHP4.py를 실행하기만 하면 됩니다.