본문 바로가기

My Study/Programming&Theory

Windows 7 x86 Bypass UAC

다들 UAC 창을 보신적이 있나요?

Windows 7 을 처음 설치하고나면 보통은 기본적으로 생성된 계정을 가지고 그냥 사용을 합니다. 



사용자 창을 봐보면 저렇게 Administrator 계정은 기본적으로 disable 되어 있습니다. 기본적으로 사용하는 계정은 두번째 나와있는 계정이지요. 



해당 계정은 Administrators와 Users 두 그룹에 속해 있습니다. 그리고 실행은 Users 권한으로 돌아가게되죠.

그러므로 그냥 Ezbeat 계정으로 로그온을 하게되면 explorer.exe 또한 Users 권한으로 실행되게 됩니다.


저 상태에서는 아래와 같은 경우 UAC 창이 뜨게 됩니다.


1. MS 프로그램에서 MANIFESTUAC:level 값이 highestAvailable 값을 가진 MS 프로그램을 실행시키려할 경우

2. MS 프로그램에서 MANIFESTUAC:level 값이 requireAdministrator 또는 

    highestAvailable 권한을 가진 서드파티 프로그램을 실행시키려할 경우

3. 서드파티 프로그램에서 MANIFESTUAC:level 값이 requireAdministrator 또는 

    highestAvailable 권한을 가진 프로그램을 실행시키려할 경우


위 세 가지 경우에 대해서 UAC 창이 뜨게 됩니다.

MSDN에서 찾아보니 순서도로 나와있네요.




그러면 일반적으로 커널에 드라이버를 로드하는 루트킷의 경우를 생각해보겠습니다.


Windows 7 에서 커널에 드라이버를 로드하기 위해선 로더가 Administrator 권한으로 돌아가야합니다. 그렇지 않을 경우 로드에 실패를 하게 되죠. 그러면 이렇게 질문하시는 분이 계실수도 있겠습니다.


루트킷을 컴파일 시 UAC 실행 수준을 디폴트 "asInvoker" 에서 "requireAdministrator" 로 바꿔서 컴파일 하면 되지 않느냐?


위 방법도 맞긴 맞습니다. 하지만 저렇게 컴파일을 할 경우 Users 권한을 가진 MS 프로그램이던 서드파티 프로그램이던 UAC 창이 뜨게 될 것입니다. 창이 뜬다는 것은 더이상 사용자몰래 숨어든다는 것은 불가능합니다. 사용자가 UAC 창이 떴을 때 아니오를 눌러버리면 모든게 끝나버리죠.


그래서 UAC를 우회해하는 것입니다.


2~3일에 걸쳐서 UAC 우회하는 프로그램을 만들어보았습니다. 방법은 기회가 되면 상세하게 작성해보겠습니다.

기본적인 방법은 metasploit 에서 제공되는 Bypass UAC 프로그램에서 사용되는 방법을 사용해봤습니다. 레지스트리 값 수정같은거 없구요. 깔끔하게 되는 방법입니다.


테스트 해볼 프로그램은 regedit.exe를 UAC 창 안뜨고 켜보는 것입니다. regedit.exe는 기본적으로 highestAvailable 값을 가지고 있습니다. 그렇기 때문에 Users 권한의 MS 프로그램이 실행시키는 경우에도 UAC 창이 뜨게되죠.



시연 동영상 입니다.

위 시연 동영상에서는 레지스트리 편집기를 대상으로 해보았지만 이 방법을 사용해 Users 권한에서 UAC창 안뜨고 드라이버 로드하는 것도 성공하였습니다.


현재는 Windows 7 x86 에서밖에 못해봤지만 기회가 되면 x64 에서도 해봐야겠습니다.


현재 이 취약점을 막으려면 MS에선 MS 프로그램 중에 특정 취약점을 가진 모든 프로그램에 대해서 수정을 해줘야합니다.


'My Study > Programming&Theory' 카테고리의 다른 글

C언어 처음 본 연산자?  (10) 2013.03.15
윈도우 드라이버 로드 시 에러  (2) 2013.03.15
ObCreateObjectType & ObjectType  (8) 2012.12.31
ObRegisterCallbacks 사용해보기  (2) 2012.12.27
Red-Black Tree - 3  (1) 2012.12.24