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'를 제공한다.
댓글 없음:
댓글 쓰기