본문 바로가기

My Study/Programming&Theory

WRP 무력화

이번엔 Windows Vista 이후에서 WFP 대신에 적용된 WRP 무력화 방법에 대해서 알아보겠습니다.


그 전에 WRP에서 많이 사용되는 DACL에 대해서 알아보도록 하겠습니다.

만약에 윈도우 오브젝트가 DACL을 가지고 있지 않는다면 해당 시스템은 모든 사람에게 full access 권한을 허락합니다. 반면 DACL을 가지고 있는다면 DACL의 ACE에 의해 명시적으로 허가된 사람만 접근 권한을 가집니다. 만약에 DACL에 ACE가 없다면 해당 시스템은 전체 사용자에게 접근 권한을 주지 않습니다. 유사하게 DACL이 ACE를 가지고 있으면 제한된 유저 또는 그룹에게한 접근 권한을 줍니다. 시스템은 ACE에 포함되어 있지 않은 사용자에 대해서는 절대적으로 접근을 거부합니다.


위 그림을 보면 바로 이해를 할 수 있을 것입니다.

현재 DACL에는 접근이 거부된 유저 ACE, 접근이 허가된 그룹 A ACE, 모든 사람에게 접근이 허용된 ACE가 있습니다.

딱 봐도 Andrew 사용자는 Read, Write, Execute 가 전부 금지된다는 것입니다.

그리고 유일하게 그룹 A는 쓰기 권한이 있군요. 그리고 전체 사용자는 읽기 권한과 실행 권한만 있습니다.

아무튼.. 저게 DACL의 대략적인 그림입니다. 이제 WRP 무력화 방법을 들어가겠습니다.


인터넷 검색결과 대략 2가지의 무력화 방법을 알아내었습니다.

첫번째는 원래 Windows에 있는 시스템 프로그램을 사용해 합법적으로? 무력화시키는 방법입니다.

이 방법을 사용할 때의 단점은 현재 권한이 Administrator 권한이어야 한다는 것입니다.


일단 관리자 권한인 상태에서 notepad.exe를 삭제하려고 했을 때의 결과 창입니다.



당연히 WRP에 의해 관리자 또한 해당 파일을 삭제할 권한이 없습니다. TrustedInstaller에서 사용 권한을 부여 받으라고 나오는군요. 위 DACL과 매치시켜서 이해하려고 하면 더욱 확실히 알 수 있을 것입니다.


이 때 저희는 Windows의 실행 파일인

takeown.exe와 icacls.exe 두 프로그램을 사용해 해당 파일을 수정 및 삭제할 권한을 얻을 수 있습니다.

두 프로그램은 Windows 설치하면 %Windows\System32 폴더에 존재하는 실행파일들 입니다.


각각 프로그램이 의미하는 바와 사용 방법을 보겠습니다.


takeown.exe

http://technet.microsoft.com/en-us/library/cc753024(v=ws.10).aspx


해당 툴은 이전에 접근이 거부되어 있던 파일을 administrator가 해당 파일을 소유하게 함으써 administrator에서 접근이 가능하도록 합니다.


사용방법은 아래와같습니다.

takeown [/s <Computer> [/u [<Domain>\]<User name> [/p [<Password>]]]] /f <File name> [/a] [/r [/d {Y|N}]]


복잡한데.. 자세한 파라미터 정보는 위 링크 들어가셔서 보시면 되고 여기선 저희에게 당장 필요한 부분만 보겠습니다.

저희는 다른 옵션 다 빼고 /f 하나만 사용하면 됩니다. 즉..

takeown /f <File Name>



이러면 끝일까요? 한번 이상태로 다시 notepad.exe를 삭제해보겠습니다.


아까는 "TrustedInstaller" 에서 사용권한을 받으라더니 이젠 "WIN-LPS876UM7BJ\Administrator"에서 사용권한을 받으라네요.


여기서 icacls.exe 를 사용해주면 됩니다.


icalcs.exe

http://technet.microsoft.com/ko-kr/library/cc753525(v=ws.10).aspx#BKMK_examples

지정된 파일에 대해 DACLs(discretionary access control lists)을 보여주거나 수정합니다.


사용 방법은 위 링크를 참조하시고 역시나 필요한 부분만 보겠습니다.

저희는  [/grant[:r] <Sid>:<Perm>[...]]  옵션을 사용할 것입니다.

/grant - Grant는 유저 접근 권한을 지정합니다. 즉, 이전에 부여되었던 권한을 재정의한다고 하네요.


이렇게 사용하면 됩니다.

icacls <File Name> /grant administrator:F


administrator 뒤에 붙은 F는 Full Access를 뜻합니다.

그 외에도 M(Modify Access), RX(Read and Execute Access) 등등이 있습니다.



이제 모든 처리는 끝났습니다. notepad.exe는 administrator가 full access 권한을 가지고 소유하고 있으므로 삭제~ 하면 됩니다. 이 과정을 코드상에서 적용하기 위해선 CreateProcess를 사용해 주면 되겠네요.


아래는 적용 코드입니다.


코드는 엉망입니다. -_-;; 작동 잘되는 것은 확인 했습니다. ( 영상을 찍진 않았습니다. )
그리고 이거의 또 단점은... 위 코드를 실행하면 cmd 창이 깜빡하고 켜졌다 꺼집니다.
당연히 이건 악의적인 프로그램을 만드는 입장이나 좋은 프로그램을 만드는 입장이나 두 측면에서 다 봤을 때 별로 좋지 않은 현상입니다.

이번엔 다른 방법을 봐보도록 하겠습니다.
이 방법 역시 Administrator 권한일 때만 가능한 방법입니다. 위 방법보다 나은 점이라면 cmd 창이 안뜬다는 것이지요 :)

제가 이해한 내용의 방법은 이렇게 됩니다. 
Everyone과 Administrators에 대해 새로운 SID을 만듭니다.
그리고 만들어진 SID을 DACL에 넣는 것입니다.

코드를 짜려고봤더니 막막했는데 마침 microsoft 홈페이지 뒤적이다보니 코드는 있더군요.
해당 코드를 사용해 제가 테스트한 코드를 올리겠습니다.

main함수 내부를 보면 처음에 notepad.exe에 대해 삭제 시도를 하고 권한을 바꾼 후 또 삭제 시도를 합니다.

이제 이 코드를 사용한 테스트 영상을 보겠습니다.



잉? 끝은 어떻게? 아무튼 이렇게 무력화 ㅎㅎ

다른 방법도 생각해봐야겠군요.