Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2019-6329 — HP Support Assistant에서의 로컬 권한 상승 | Kitploit
도구/GitHubGitHub/manhndd/cve-2019-6329
Privilege EscalationVulnerability AnalysisExploitationLateral MovementPost-ExploitationPayload DevelopmentBinary Exploitation
GitHubmanhndd/cve-2019-6329

CVE-2019-6329

HP Support Assistant에서의 로컬 권한 상승

저장소 보기
414년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

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의 취약한 코드입니다:

root@kitploit:~
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을 시작하여 버그를 트리거합니다.

root@kitploit:~
ServiceInterface.Instance.RunAnalysis("en-US", true);

따라서 가짜 클라이언트를 만들어 RunAnalysis를 호출해야 합니다. 그러나 서비스는 요청을 처리하기 전에 클라이언트를 검증합니다:

  • 클라이언트가 HP 서명으로 서명되었는지, 그리고 C 드라이브에 있는지 확인합니다.
  • 클라이언트의 부모, 조부모, 증조부모... 프로세스가 HP 서명으로 서명되었는지 또는 유효한 Windows 프로세스(예: System32 내)인지 확인합니다. 단, GetParent 메서드가 null을 반환하면 검사는 중지됩니다.
root@kitploit:~
        {
            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;
        }

클라이언트 검증을 우회해 봅시다:

  • 서명 검사를 우회하려면 HP 서명된 EXE를 시작하고 여기에 코드를 주입하거나, 가짜 DLL을 만들어 HP EXE가 로드하도록 해야 합니다. 저는 두 번째 방법을 선택했습니다. BatteryTest.exe(C:\Program Files (x86)\Hewlett-Packard\HP Support Framework\Resources\HPBatteryCheck 폴더에 있음)가 HP 서명으로 서명되었으며, BatteryTest.exe를 시작하면 %PATH%를 검색하기 전에 해당 디렉터리에서 userenv.dll을 로드하려 시도한다는 것을 발견했습니다. 그래서 가짜 userenv.dll을 만들고 BatteryTest.exe와 같은 폴더에 복사한 다음 BatteryTest를 실행했습니다. 그러면 BatteryTest가 우리의 클라이언트 exe가 되어 RunAnalysis를 트리거하므로 클라이언트 서명 검사를 우회할 수 있습니다.
  • BatteryTest.exe 및 기타 필요한 파일을 %tmp%에 복사하여 C 드라이브에 있도록 하여 클라이언트가 C 드라이브에 있음을 보장합니다.
  • 부모 프로세스 검사를 우회하기 위해 BatteryTest.exe를 호출한 후 즉시 종료되는 프로그램을 만듭니다. 그러면 GetParent가 null을 반환합니다!

이제 하드 링크의 대상이 될 수 있는 실행 파일을 찾아야 합니다. SYSTEM 권한으로 자동 실행되는 EXE 또는 DLL이어야 합니다. 그래야 덮어쓸 때 SYSTEM 권한을 얻을 수 있습니다. RunAnalysis를 호출하면 HPSupportSolutionsFrameworkService가 SYSTEM 권한으로 많은 프로세스를 시작한다는 것을 확인했습니다. 이러한 프로세스를 자신의 실행 파일로 덮어쓸 수 있습니다. 그러나 서비스는 이러한 EXE를 시작하기 전에 서명을 확인하므로 가짜 EXE를 만들 수는 없지만, 해당 EXE가 로드하는 DLL을 활용할 수 있습니다. 이미 로드되어 있는 DLL도 많고, 로드 전에 서명이 확인되는 .NET DLL도 많아 사용할 수 없습니다. 다행히도 여전히 사용 가능한 DLL이 몇 가지 있습니다:

  • c:\program files (x86)\hp\shared\hputils64.dll - Detect_BatteryFailure.exe(HP 서명)에 의해 로드됨.
  • c:\windows\syswow64\rtutils.dll
  • c:\windows\system32\msxml3.dll

저는 hputils64.dll을 수정해 보았고 성공했습니다. hputils64.dll에 대한 하드 링크를 만듭니다. RunAnalysis를 호출하면 HPSAObjUtil8이 hputils64.dll의 권한을 변경하고, 몇 초 후 Detect_BatteryFailure.exe가(LOCAL SYSTEM 권한으로) 시작되어 hputils64.dll을 로드합니다. hputils64가 로드되기 전에 이를 덮어쓸 수 있으므로 Detect_BatteryFailure.exe가 악성 DLL을 로드하게 되어 결국 SYSTEM 권한을 얻을 수 있습니다.

결론

익스플로잇을 작성하기 위해 다음을 만들었습니다:

  • CreateProcess.exe: 프로세스를 호출하고 종료합니다. 부모 프로세스 검증 우회에 사용됩니다.
  • CreateHardlink.exe: 하드 링크를 생성합니다.
  • Userenv.dll: .NET 어셈블리 실행을 위한 환경을 구성하고 BatterTest의 컨텍스트에서 어셈블리 invader.exe를 실행합니다. 클라이언트 서명 검증 우회에 사용됩니다.
  • Invader.exe: 버그를 트리거하는 RunAnalysis를 호출합니다.
  • MalDll.dll: 메모장(notepad)을 실행합니다. hputils64.dll이 이 DLL로 덮어써집니다.

다음은 PrivHP4.py의 악용 단계입니다:

  1. BatteryTest.exe 및 기타 필요한 파일을 %tmp% 폴더에 복사합니다.
  2. C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA\hardlink.xml에서 C:\Program Files (x86)\HP\Shared\hputils64.dll로 하드 링크를 만듭니다.
  3. CreateProcess.exe로 BatteryTest.exe를 시작합니다. CreateProcess.exe는 BatterTest를 시작한 후 즉시 종료됩니다.
  4. C:\Program Files (x86)\HP\Shared\hputils64.dll의 권한이 변경될 때까지 기다린 후 MalDll.dll로 덮어씁니다. 그러면 SYSTEM 권한으로 메모장이 시작될 때까지 기다리면 됩니다!

PoC를 테스트하려면 리포지토리를 클론하고 PrivHP4.py를 실행하기만 하면 됩니다.

참고 자료

  1. https://support.hp.com/us-en/document/c06388027
  2. http://www.securityfocus.com/bid/108891
도구 다운로드