2016년 3월 14일 월요일

PowerShell이란

PowerShell이란


PowerShell은 Microsoft가 개발한 확장 가능한 CLI(Command Line Interface) Shell이며 스크립트 언어로, 객체 지향적인 구조를 가지며, .NET Framework 기반이다. PowerShell을 사용하면 작업 자동화 뿐만 아니라 구성 관리 등 여러 분야에서 작업을 쉽게 수행하는 것이 가능하다.

  • Microsoft가 개발한 확장 가능한 CLI Shell로 스크립트 언어
  • 객체 지향적 구조, .NET Framework 기반
  • 자동화 뿐만 아니라 구성 관리 등 여러 분야에서 작업을 쉽게 수행하는데 사용 가능


PowerShell은 Windows XP/ Vista/7/8 그리고 Server 2003/2008/2012를 지원한다. 기본적으로 Windows 7 SP1(Service Pack)과 Server 2008 R2 부터 PowerShell Ver2가 설치돼 있다. 최신 버전은 Version 5이며 Windows 10에 기본으로 설치돼 있다.


  • Windows XP/Vista/7/8 및 Server 2003/2008/2012를 지원
    • Windows 7 SP1과 Server 2008 R2 부터 기본으로 PowerShell Version 2.0가 설치
    • Windows 10에는 최신 버전인 Version 5.0이 설치


Windows 마다 PowerShell 버전

PowerShell을 사용하는데 가장 큰 단점은, 만약 Version 2.0에서 Version 5.0으로 업데이트를 원하면 '2.0->3.0->4.0->5.0'과 같은 업데이트 과정이 필요하므로 상당히 번거롭다.


PowerShell로 무엇을 할 수 있는가?

 PowerShell의 특징을 알아본 결과, CLI 기반의 스크립트 언어이며, 객체 지향적이고 .Net 기반이다. 이러한 점은 공격자 입장에서도 악용하기 편리하다는 뜻이 되므로, 악성코드 내에서 사용자에게 쉽게 피해를 입힐 수 있다. 또한, PSDrive와 같이, PC에 드라이브에 접근히 편리하여 PC를 쉽고 편리하게 분석하는데 사용될 수 있다. 마지막으로 PowerShell의 목적인 서버관리를 위해 사용될 수 있다. 나는 보안을 공부하는 입장이기 때문에 Attack과 Analysis에 초점을 두고 공부를 할 예정이다.

  • PowerShell Attack: Malware에서 악용되는 사례
  • PowerShell Analysis: PSDrive와 같이 레지스트리 등등 접근 가능
  • PowerShell Manage: 주 목적인 서버 관리

 하지만, 그전에 PowerShell을 어떻게 사용하는지에 대해서 한번 정리할 필요가 있을거 같아서 한번 정리하였다.

PowerShell 명령어 특징

 PowerShell CLI에서 사용되는 명령어를 cmdlet이라고 하며 기본 구조는 '동사-명사' 구조를 가지고 있다. 간단한 예로는 명령어들을 보여주는 get-command, 날짜를 설정해주는 명령어인 set-date, 콘솔을 통해 디버그 메세지를 쓰는 cmdlet인 write-debug가 있다.

* write-debug : 기본으로 $DebugPreference변수는 'SilentlyContinue'가 설정되어 있으며, 변수를 'Continue'로 변경하면 디버그 메세지를 확인할 수 있다. (추가로 "Inquire: 경고 메세지를 표시하고 실행하기 전에 확인 메세지 표시, Stop: 경고 메시지를 표시하고 명령 실행을 중지" 가 있다.)

매개 변수는 사용할 때 앞에 ' - '를 붙인다. 일반 매개 변수로는 아래와 같은 매개 변수가 존재한다.


  • Verbose : 명령이 수행하는 작업에 대한 자세한 정보를 표시
  • Debug : 명령이 수행하는 작업에 대한 프로그래머 수준의 세부 정보 표시
  • WarningAction : cmdlet이 명령의 경고에 응답하는 방법을 결정
  • WarningVariable : 지정된 변수에 명령에 대한 경고 저장
  • ErrorAction : cmdlet이 명령에서 발생하는 종료되지 않는 오류에 응답하는 방법을 결정
  • ErrorVariable : 명령에 대한 오류 메시지를 지정된 변수와 $Error 자동 변수에 저장
  • OutVariable : 명령의 출력 개체를 지정된 변수에 저장하고 명령줄에 표시


 좀 더 자세한 매게변수에 대한 정보는 참고를 확인하거나, 'help about_preference_variables' 명령을 통해 확인할 수 있다. 경로를 설정할 때는 /, \을 모두 사용하여 경로를 지정해줄 수 있다.


기본적으로 오른쪽 표와 같은 cmdlet이 있다. 만약 명령어가 궁금할 경우는 매개변수로 '-?'를 넣어주면 해당명령어의 설명을 확인할 수 있다.

그리고 좀 더 자세한 설명이 필요하면 버전 별로 아래와 같은 명령어를 사용할 수 있다.


  • Ver2.0: Get-Command -full
  • Ver4.0: Get-Help Get-Command -online
또한, 명령어가 너무 길 경우 'Get-Alias' cmdlet을 사용해 명령어의 별칭을 확인할 수 있다.



PowerShell 변수 설정

PowerShell의 변수 설정을 위해서는 변수명 앞에 '$'을 붙이면 변수 지정이 가능하며 아래와 같이 지정할 수 있다.
  • $a = '<span style = "border:1px solid none">'  : 문자열
  • $b = 1,2,3,"Hello" : 배열
  • $c = (1,2,3,(4,5,6)) : 배열
  • $d = 1..5 : 배열
  • $myhash = @{'one'=1; 'two'=2; 'three' = 3} : 딕셔너리



위 변수 설정하는 것을 보면 Perl과 매우 유사하다는 걸 느낄 수 있다. 만약 변수의 타입이 확인하고 싶을 때는 '$a.GetType()'을 통해서 a변수의 타입을 확인할 수 있다.

또한, PowerShell에는 기본으로 내장되어 있는 변수가 있으며, 기본 내장 변수는 아래와 같다.

  • $$: 이전 줄의 마지막 토큰
  • $?: 마지막으로 성공이나 실패 상태
  • $^: 이전 줄의 첫 번째 토큰
  • $pshome: PowerShell이 설치된 디렉토리. 

PowerShell 도구

Windows에서는 PowerShell을 위해서 커맨드 쉘인 'Windows PowerShell'과 PowerShell 통합 스크립팅 환경을 제공하기 위해 'Windows PowerShell ISE'를 제공한다.




댓글 없음:

댓글 쓰기