[windows] 계정과 권한 그리고 UAC(User Account Control)
이 글을 읽는 여러분들은 '권한' 이라는 용어를 들어보았을까? 어떤 일을 하기에는 나는 그런 권한이없어! 라던가, 그런 권한이 있는 사람에게 요청해! 라던가 말이다. 컴퓨터에서도 이런 권한에 따라 사용자를 관리한다. 예시를 통해 살펴보자
1. 계정과 권한
현대 사회에서 '공용재산' 이라는 의미가 점점 희미해지는것 같다. 이것 내것 저건 니것 하고 나누어 범위를 정하고 그 이상은 넘어가거나 또 넘어오는것을 반기지 않는다. 계정이라는 것은 그런 의미다. 나의 어떤 권한, 그리고 이 권한이 미치는 것들은 내가 접근하고 또 마음대로 사용할 수 있습니다! 하고 정해놓은 어떤 범위라는 의미다.
사실 대부분 개인 사용자는 윈도우즈 시스템을 사용하고 또 일반 사용자는 굳이 PC에 다수 계정을 생성해 따로 사용하지 않으므로 윈도우 운영체제 사용자에게는 이런 권한이라는 문제 또는 의미가 다소 생소할 수 있다. 그렇지만 윈도우 ad서버를 다루거나 리눅스를 다루어본 사용자라면 이 '권한'이 어떤 의미를 가지는지 좀더 쉽게 이해하리라 생각한다. 그럼 실제로 한번 살펴보자
win + r 을 눌러 실행 창을 켜고 lusrmgr.msc 입력하자. 그럼 로컬 사용자와 그룹에 대한 정보를 확인할 수 있다.
여러 가지 계정을 볼 수가 있고, 현재 필자가 사용중인 winuser 계정은 관리가 그룹에 소속되어 있다. 또 다른 계정들을 살펴보면 일반 사용자용 OS인 pro 에서는 관리자 계정과 게스트 계정을 기본적으로 비활성화 한다.
그럼 테스트를 위해 필자는 계정을 하나 더 생성 해 보겠다.
troll 이라는 계정을 생성했고, 관리자 그룹에는 넣지 않았다. troll 로 로그인 후 관리자 권한을 행사하려 하면
이렇게 블락되며 비밀번호를 입력하라는 UAC(사용자 계정 컨트롤) 창을 확인할 수 있다. 다시 winuser 계정으로 돌아가서 관리자 권한을 행사하면.. 여러분은 차이가 보이는가?
이렇게 관리자 그룹에 넣는다는 것은, 관리자가 아니지만 관리자와 동등한 힘을 행사할 수 있는 '권한' 을 준다는 의미와 같다.
2. 권한
CLI 환경에서도 권한 관리가 매우 중요한데, 이 mimikatz는 윈도우 환경에서 사용자의 credential 을 탈취할 수 있는 다양한 방법을 제공한다
사용자가 주어진 권한을 넘어 다른 행위들을 수행하려면 관리자 권한을 요구하는 경우가 많기 때문이다. 관리자 권한을 획득하지 못한 사용자는 현재 계정으로 접근할 수 있는 정보들 이상은 열람할 수 없다. 하지만 관리자 권한을 획득한다면 관리자를 넘어 '시스템 권한' 까지 획득이 가능하다. 그래서 LPE(Local Privilege Escalation) 취약점이 상당히 위험한 취약점으로 취급된다.
리눅스 시스템에서도 이 권한의 의미는 동일하다. 리눅스에서는 관리자 대신 'root' 계정이 항상 존재한다. 이 root 계정은 말그래도 이 시스템 내에서는 신과 다름이 없다. 공격자는 시스템을 장악하기 위해 어떻게든 'root' 권한을 탈취하려한다.
3. UAC(User Account Control) 사용자 계정 컨트롤
리눅스에서는 관리자 권한을 행사하기 위해서는 sudo 를 선입력하거나, root 사용자로 작업(권장되지는 않음)해야한다. 윈도우에서는 sudo 와 같은 방법 보다 좀 더 직관적인 방법을 제공하는데 그것이 바로 UAC다.
잘 생각해보면 우리가 관리자 권한이 필요할 때 마다 아래와 같은 팝업창이 나타나 우리에게 관리자 권한을 요청하고 있다.
권한에 대해 잘 몰랐던 독자라면 이제서야 이 권한의 의미가 어떤 것인지 잘 이해했으리라 생각한다. 그리고 다양한 malware와 공격자들은 항상 이런 보안 조치들을 우회하려고 한다. UAC 설정은 아래와 사진과 같이 설정 패널에서 변경할 수 있다.
오른쪽 사진처럼 UAC를 끈다면 프로그램이 관리자 권한을 사용자에게 요청하지 않고 그대로 관리자 권한으로 실행된다.
다른 방법으로도 이런 UAC를 끄거나 우회할 수 있다.
a. 레지스트리 변경
HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/System 경로 아래에 있는 ConsentPromptBehaviorAdmin 또는 EnableLUA 두 개 값이 이 UAC 설정과 관련 있는 것으로 확인된다. 저 둘중 EnableLUA 값은 구 버전 운영체제에서 사용하던 값으로 추정된다. MSDN에 의하면 " UAC는 이전에 LUA(Limited User Account)였습니다 " 라고 한다.
실험 결과 설정 값과 레지스트리 값의 변화는 다음과 같다.
UAC 설정 | ConsentPromptBehaviorAdmin 값 |
0 | 0 |
1 | 5 |
2 | 5 |
3 | 2 |
b. powershell
파워쉘에서 UAC 설정을 직접적으로 변경하는 방법을 제공하지는 않는 것으로 확인된다. 다만 우리는 파워쉘로 레지스트리 값을 변경할 수 있다. 다음 파워쉘 코드를 사용해볼 수 있겟다.
function Disable-UAC(){
$numVersion = (Get-CimInstance Win32_OperatingSystem).Version
$numSplit = $numVersion.split(".")[0]
if ($numSplit -eq 10) {
Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "ConsentPromptBehaviorAdmin" -Value "0"
}
elseIf ($numSplit -eq 6) {
$enumSplit = $numSplit.split(".")[1]
if ($enumSplit -eq 1 -or $enumSplit -eq 0) {
Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "EnableLUA" -Value "0"
} else {
Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "ConsentPromptBehaviorAdmin" -Value "0"
}
}
elseIf ($numSplit -eq 5) {
Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "EnableLUA" -Value "0"
}
else {
Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "ConsentPromptBehaviorAdmin" -Value "0"
}
Write-Host "Successfully Disabled UAC!"
}
4. 정리
윈도우 시스템도 사용자와 권한에따라 접근할 수 있는 자원에 제한을 두고 있다. 특히 UAC 라는 기능을 통해 이를 좀더 가시적으로 사용자에게 제공하고 있다. 아무래도 개인사용자들이 많으므로 편의적인 측면이라 생각하면 좋을 것이다. 일반적인 작업들은 '관리자 권한'이 필요없는 경우가 많다. 따라서 어떤 어플리케이션을 실행했을때 이런 관리자 권한을 요청하는 UAC 팝업창이 보인다면 실행을 한번 더 고민해 보는 습관을 가지는 것이 좋을 것이다.
5. 참조
EnableLUA
EnableLUA 아티클05/10/2023 기여자 4명 피드백 이 문서의 내용 --> EnableLUA는 프로그램이 컴퓨터를 변경하려고 할 때 Windows UAC(사용자 계정 컨트롤)가 사용자에게 알릴지 여부를 지정합니다. UAC는 이전
learn.microsoft.com
사용자 계정 컨트롤 작동 방법
UAC(사용자 계정 컨트롤) 구성 요소 및 최종 사용자와 상호 작용하는 방법에 대해 알아봅니다.
learn.microsoft.com