6.1 KiB

Writable Sys Path +Dll Hijacking Privesc

{{#include ../../../banners/hacktricks-training.md}}

Introduction

시스템 경로 폴더에 쓰기가 가능하다고 판단되면(사용자 경로 폴더에 쓸 수 있는 경우에는 작동하지 않음) 시스템에서 권한 상승을 할 수 있는 가능성이 있습니다.

이를 위해 Dll Hijacking을 악용할 수 있으며, 이는 당신보다 더 높은 권한을 가진 서비스나 프로세스에 의해 로드되는 라이브러리하이재킹하는 것입니다. 해당 서비스가 아마도 시스템 전체에 존재하지 않는 Dll을 로드하려고 시도하기 때문에, 당신이 쓸 수 있는 시스템 경로에서 로드하려고 할 것입니다.

Dll Hijacking에 대한 더 많은 정보는 다음을 확인하세요:

{{#ref}} ./ {{#endref}}

Privesc with Dll Hijacking

Finding a missing Dll

가장 먼저 해야 할 일은 당신보다 더 높은 권한으로 실행 중인 프로세스식별하는 것입니다. 이 프로세스는 당신이 쓸 수 있는 시스템 경로에서 Dll을 로드하려고 하고 있습니다.

이 경우의 문제는 아마도 해당 프로세스들이 이미 실행 중이라는 것입니다. 필요한 서비스의 부족한 Dll을 찾기 위해 가능한 한 빨리 procmon을 실행해야 합니다(프로세스가 로드되기 전에). 따라서 부족한 .dll을 찾으려면:

  • C:\privesc_hijacking 폴더를 생성하고 C:\privesc_hijacking 경로를 시스템 경로 환경 변수에 추가합니다. 이는 수동으로 또는 PS를 사용하여 할 수 있습니다:
# Set the folder path to create and check events for
$folderPath = "C:\privesc_hijacking"

# Create the folder if it does not exist
if (!(Test-Path $folderPath -PathType Container)) {
New-Item -ItemType Directory -Path $folderPath | Out-Null
}

# Set the folder path in the System environment variable PATH
$envPath = [Environment]::GetEnvironmentVariable("PATH", "Machine")
if ($envPath -notlike "*$folderPath*") {
$newPath = "$envPath;$folderPath"
[Environment]::SetEnvironmentVariable("PATH", $newPath, "Machine")
}
  • **procmon**을 실행하고 Options --> **Enable boot logging**으로 이동한 후 프롬프트에서 **OK**를 누릅니다.
  • 그런 다음 재부팅합니다. 컴퓨터가 재시작되면 **procmon**이 가능한 한 빨리 이벤트를 기록하기 시작합니다.
  • Windows가 **시작된 후 procmon**을 다시 실행하면 실행 중임을 알려주고 이벤트를 파일에 저장할 것인지 묻습니다. 라고 말하고 이벤트를 파일에 저장합니다.
  • 파일생성된 후, 열린 procmon 창을 닫고 이벤트 파일을 엽니다.
  • 이러한 필터를 추가하면 어떤 프로세스가 쓰기 가능한 시스템 경로 폴더에서 Dll을 로드하려고 했는지 알 수 있습니다:

놓친 Dlls

무료 가상 (vmware) Windows 11 머신에서 실행했을 때 다음과 같은 결과를 얻었습니다:

이 경우 .exe는 쓸모가 없으므로 무시하고, 놓친 DLL은 다음과 같습니다:

서비스 Dll CMD 라인
작업 스케줄러 (Schedule) WptsExtensions.dll C:\Windows\system32\svchost.exe -k netsvcs -p -s Schedule
진단 정책 서비스 (DPS) Unknown.DLL C:\Windows\System32\svchost.exe -k LocalServiceNoNetwork -p -s DPS
??? SharedRes.dll C:\Windows\system32\svchost.exe -k UnistackSvcGroup

이것을 찾은 후, WptsExtensions.dll을 이용한 권한 상승 방법에 대해서도 설명하는 흥미로운 블로그 게시물을 발견했습니다. 이제 우리가 할 일입니다.

악용

따라서 권한을 상승시키기 위해 라이브러리 WptsExtensions.dll을 하이재킹할 것입니다. 경로이름을 알았으니, 이제 악성 dll을 생성하기만 하면 됩니다.

이 예제 중 하나를 사용해 볼 수 있습니다. 리버스 쉘을 얻거나, 사용자를 추가하거나, 비콘을 실행하는 등의 페이로드를 실행할 수 있습니다...

Warning

모든 서비스가 **NT AUTHORITY\SYSTEM**으로 실행되는 것은 아닙니다. 일부는 **NT AUTHORITY\LOCAL SERVICE**로 실행되며, 이는 권한이 적습니다. 따라서 새로운 사용자를 생성하여 권한을 남용할 수 없습니다.
그러나 해당 사용자는 seImpersonate 권한을 가지고 있으므로, potato suite를 사용하여 권한을 상승시킬 수 있습니다. 따라서 이 경우 리버스 쉘이 사용자를 생성하려고 시도하는 것보다 더 나은 옵션입니다.

작성 시점에 작업 스케줄러 서비스는 Nt AUTHORITY\SYSTEM으로 실행되고 있습니다.

악성 Dll을 생성한 후 (제 경우 x64 리버스 쉘을 사용했으며 쉘을 받았지만 defender가 msfvenom에서 온 것이기 때문에 이를 차단했습니다), 쓰기 가능한 시스템 경로에 WptsExtensions.dll이라는 이름으로 저장하고 컴퓨터를 재시작합니다 (또는 서비스를 재시작하거나 영향을 받는 서비스/프로그램을 다시 실행하기 위해 필요한 작업을 수행합니다).

서비스가 재시작되면 dll이 로드되고 실행되어야 합니다 (이때 procmon 트릭을 재사용하여 라이브러리가 예상대로 로드되었는지 확인할 수 있습니다).

{{#include ../../../banners/hacktricks-training.md}}