세계 보안 엑스포  전자정부 솔루션 페어  개인정보보호 페어  국제 사이버 시큐리티 컨퍼런스  세계 태양에너지 엑스포  스마트팩토리  세계 다이어트 엑스포  INFO-CON
Home > 전체기사
[추석특집] 파일레스 공격 통로 파워셸? 피하지 말고 활용해보자
  |  입력 : 2017-10-09 12:54
페이스북 보내기 트위터 보내기 네이버 밴드 보내기 카카오 스토리 보내기
파워셸, 떠오르고 있는 스크립트 언어...하지만 ‘보안 구멍’ 인식 커
그냥 안 쓰기엔 강력하고 쓰기 쉬워...안전한 환경 마련하면 장점 활용 가능


[보안뉴스 문가용 기자] 윈도우를 기반으로 하는 네트워크 관리자에게 있어 파워셸(PowerShell)이란 진정한 힘의 원천이 될 수 있다고 한다. 스크립트 언어의 강력함과 명령행 유틸리티, 윈도우 관리 도구(WMI), VB스크립트로의 접근성까지 겸비한 파워셸은 편리함과 기능성 모두를 제공하기 때문이다. 하지만 세상에 장점만 있는 게 어디 있겠는가? 파워셸은 요즘 사이버 공격자들 사이에서 유행하는 ‘파일레스 공격’의 통로가 되어주기도 한다.

[이미지 = iclickart]


여기에 파워셸에 대한 낯섦도 적잖이 작용해 윈도우 네트워크 관리자들 중 파워셸 도입을 망설이는 사람이 있다고 한다. 구더기 무서워 장 못 담그는 것과 비교할 것까지는 아니지만, 편리하고 강력하게 사용하라고 만든 거, 아예 안 쓰는 것보다 이왕이면 안전하게 편리함만을 누려보는 게 가장 현명한 것일지도 모른다.

파워셸이란 무엇인가?
파워셸은 간단히 말해 스크립트 언어다. 툴이나 프레임워크는 아니다. 평범한 사람이 흔히 쓰는 말들로 스크립트를 작성할 수 있도록 만들어졌다. 이 부분은 아래 cmdlet 부분에서 다시 한 번 설명이 된다. 또한 파워셸은 특정 관리자 작업을 자동화시키기 위해 콘솔 애플리케이션을 통해 평문 파일을 실행시킨다는 점에서 배치 작업(batch job)과 닮아 있다. 여기서 평문 파일이란, 컴파일 과정이 필요 없다는 뜻이며 아무 텍스트 편집 소프트웨어로 작성이 가능하다는 뜻이기도 하다.

파워셸 스크립트에는 논리적인 루프와 변수, 메소드 등 프로그래머들에게 이미 익숙한 개념들이 그대로 들어있다. 파워셸 코드를 평문으로 작성했다면 컴파일 과정 없이 그대로 저장하면 되는데, 확장자를 .ps1로 붙이면 된다. 그런 후 파워셸 콘솔을 시작해 .ps1으로 저장한 스크립트를 실행시킬 수 있다. 파워셸 콘솔은 명령행 콘솔과 거의 똑같이 생겨서 이 또한 친숙하게 느껴질 것이다. 배경이 파랗고 텍스트가 하얗다는 것만 빼면 말이다.

파워셸 스크립트는 외부의 .NET 어셈블리도 활용할 수 있다. 사실 이게 파워셸이 기존 스크립트 언어와 비교했을 때 갖는 가장 큰 장점 중 하나다. 같은 회사에 근무하고 있는 다른 부서 개발자가 .NET 애플리케이션과 서비스에서 활용될 수 있는 .NET 유틸리티를 개발했다고 하자. 그리고 이 중 일부를 조직 내 활용을 목적으로 공개했다고 하자. 파워셸 사용자도 이를 사용해 스크립트를 만들 수 있게 된다.

또 하나 재미있는 건 파워셸이 마이크로소프트의 .NET 스택을 기반으로 만들어졌다는 것이다. 무슨 뜻이냐면, .NET에서 제공되는 그래픽 인터페이스 요소를 얼마든지 재활용할 수 있게 된다는 것이다. 물론 파워셸을 가지고 그래픽 작업을 많이 하지는 않지만, 재미있는 해결책을 만들 수 있는 가능성 자체는 유지된다.

‘쉬운 사용성’의 파워셸, 비밀은 cmdlet
그래서 파워셸을 가장 간단히 설명하면 기존 커맨드 셸(CMD Shell)을 대체할 만한 도구라고 할 수 있다. 윈도우 서버 기반의 컴퓨터들, 특히 윈도우 서버의 가장 라이트한 버전인 서버 코어(Server Core) 운영 체제를 가지고 있는 시스템들에서는 커맨드 셸을 파워셸로 완전히 대체하는 게 가능하다. 대체를 했다면 서버가 시작될 때 커맨드 셸 인터페이스가 파워셸 인터페이스로 바뀐다.

파워셸의 장점 중 하나가 ‘쉬운 사용성’ 혹은 평범한 사람들이 흔히 읽을 수 있는 언어로 구성된 스크립트라고 위에서 밝혔는데, 이를 가능케 해주는 핵심 요소가 바로 cmdlet이다. ‘커맨드렛’이라고 읽는다. 커맨드렛은 윈도우 파워셸에 미리 탑재된 일종의 명령어들로 누구나 새로운 커맨드렛을 생성할 수 있다. 윈도우 파워셸 담당 팀에서 핵심이 되는 커맨드렛들을 만드는데, 이는 윈도우 10과 함께 자동으로 설치된다.

커맨드렛은 실행 가능한 프로그램과 같지만 윈도우 파워셸 내에 탑재된 다양한 기능 및 자원들을 활용한다. 그러므로 ‘코드 작성’이 쉽다. 그러나 커맨드렛이 스크립트는 아니다. 파워셸 5.0 버전에는 약 1300개의 커맨드렛이 존재하는데(윈도우 10), 윈도우에도 새로운 기능들이 추가되는 것처럼 커맨드렛도 꾸준히 추가된다.

커맨드렛의 존재 목적은 네트워크 관리자들이나 그에 준하는 역할을 담당해야 하는 사람들이 스크립트 언어를 따로 배우지 않고도 스크립트 언어의 이점을 활용할 수 있도록 하는 것이다. 그래서 이름들이 대단히 쉽다. Get-Help, Get-EventLog, Set-ExecutionPolicy 등 일반 동사와 일반 명사의 조합으로 보통 이름이 구성된다. 커맨드렛의 동사 부분을 전부 열람하고 싶다면 Get-Verb라고 입력하면 된다. 5.0 버전 기준으로, 파워셸에는 대략 100개의 동사들이 존재한다.

파워셸을 설치해보자 - 컴퓨터와 머릿속에
파워셸 5.0 버전의 경우 윈도우 10 클라이언트를 설치하면 자동으로 탑재된다. 그렇지 않은 경우, 마이크로소프트 다운로드 센터(Microsoft Download Center)로 가서 윈도우 관리 프레임워크 5.0(Windows Management Framework 5.0) 패키지를 받아 설치하면 된다. 이 패키지 안에는 윈도우 원격 관리(Windows Remote Management, WinRM), WMI, 윈도우 파워셸 5.0이 들어있다. 윈도우 7, 윈도우 8.1, 윈도우 서버 2008 R2, 윈도우 서버 2012, 윈도우 서버 2012 R2 버전의 경우 .NET 프레임워크 4.5가 있어야만 윈도우 관리 프레임워크 5.0을 설치할 수 있다. 간단히 여기를 클릭해도 된다.

또한 인터넷 여기 저기 자료를 찾아가며 파워셸을 탐구하다보면 몇 가지 용어가 자꾸만 등장하는데, 이를 먼저 정리해본다. 네 가지 정도가 ‘고정적’으로 등장하기에, 이 네 가지만 간략하게 알아보면 다음과 같다.

1) 세션(session) : 공부를 좀 하다 보면 ‘파워셸 세션’이란 말이 자주 등장하는 걸 알 수 있을 것이다. 굳이 어렵게 생각할 필요 없고, 현재 화면에서 작업을 진행하고 있는 파워셸 창을 세션이라고 생각하면 된다.

2) 프로파일(profile) : 파워셸 프로파일이라고 하면 파워셸 세션이 시작될 때마다 실행되는 스크립트를 말한다. 사용자가 옵션(settings)을 조정할 수 있도록 해주고, 객체와 변수를 지정할 수 있도록 해준다. 파워셸 환경을 개인화시키거나 커스터마이징 하고 싶다면 이 프로파일부터 만지기 시작해야 한다.

3) 스냅인(Snap-in) : 한 개의 파워셸 세션 내로 임포트할 수 있게 만들어진 메소드와 객체들을 스냅인이라고 부른다. 이 스냅인에는 파워셸 커맨드렛들만 들어있다. 또한 모든 파워셸 스냅인들은 .NET으로 작성되어야 하며 어셈블리 형태로 컴파일 되어야만 한다. 디폴트상으로는 \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\Po'ins\라는 레지스트리에 저장된다. Get-PSSnapin - Registered라는 커맨드렛을 실행시키면 현재 세션 내에서 사용가능한 파워셸 스냅인을 전부 열람할 수 있다.

4) 모듈(module) : 파워셸에 모듈 개념이 처음 도입된 것은 파워셸 2.0 버전부터다. 간단히 말해 파워셸의 여러 기능들 중 파워셸 세션에 추가할 수 있는 일부를 말한다. 물론 이 ‘일부’란 미리부터 정해진 것이 아니고 사용자가 그때 그때 이런 저런 목적으로 섞고 합하고 떼어내어 만들 수 있다. 모듈 안에는 커맨드렛, 함수, 변수 등이 포함될 수 있다. 즉 필요에 따라 파워셸 요소들을 현재 세션으로 임포트한다는 건데, 스냅인과 다른 점은 컴파일된 어셈블리일 필요가 없다는 것이다.

파워셸에는 유능한 도우미가 있다
파워셸의 또 다른 장점은 자체 ‘헬프’ 기능이 매우 충실하다는 것이다. 그래서 파워셸을 익히기 위해 파워셸 내부 헬프만 열람해도 충분할 정도다. 파워셸에서 ‘헬프’ 기능을 사용하기 위해서 몇 가지 메소드를 입력할 수 있다. 먼저 “Get-Help Get-Help”를 입력하면 장문의 설명문이 여러 구문(syntax)과 함께 화면에 출력된다. 아쉬운 건 영문이라는 점이다.

장점은 출력이 3단계로 나뉜다는 것인데, 보통(normal), 상세(detailed), 전문(full)이 바로 그것이다. 전문 버전의 경우 온라인 매뉴얼 수준의 내용이 출력된다. Get-Help about*을 입력하면 헬프 기능과 관련된 모든 문건들의 목록을 읽을 수 있게 된다. 또한 Get-Help get*은 사용하고 싶은 커맨드렛이 Get으로 시작하는 것만 기억나지 그 뒤 이름이 잘 떠오르지 않을 때 유용하다. 기억이 조금 더 떠올라, Get으로 시작하고, 뒤에 오는 명사가 p로 시작하는 것이 기억났다면? Get-Help get -p*를 입력하면 된다. 커맨드렛은 정확히 알겠는데 정확한 문법이 기억나지 않을 수도 있다. 그럴 땐 해당 커맨드렛 뒤에 -Examples를 붙이면 된다. 예를 들면 Get-Help Get-PSDrive -examples.

흔치 않은 경우지만 Get-Help라는 여덟 글자를 입력하는 것도 귀찮을 때가 있다. 그럴 땐 단축키를 설정할 수 있다. 이 단축키를 에일리어스(alias)라고 부른다.
1) 시작 - 실행 - 파워셸을 차례로 클릭해 파워셸을 연다.
2) 현재 설정되어 있는 모든 단축키를 살펴본다. 그래야 Get-Help에 대한 단축키를 지정할 때 충돌하지 않는다. 이는 Get-Alias | Sort로 실행 가능하다.
3) 원하는 단축키(예 : G +H)에 배정된 기능이 아무 것도 없다면, New-Alias라는 커맨드렛의 문법을 충분히 알아야 할 차례다. Get-Help New-Alias -full을 입력하면 된다.
4) 이제 실제로 New-Alias 커맨드렛을 사용해 G+H라는 단축키를 지정해야 할 차례다. 이는 New-Alias gh Get-Help라고 입력함으로써 완료된다. 이제 GH를 키보드에서 누르면 Get-Help가 입력된다.

파워셸의 안전한 사용법
여러 프로그래밍 언어에 있는 명령들은 대부분 실제로 실행해봤을 때 가장 빠르고 확실하게 이해할 수 있다. 그래서 프로그래머들은 콘솔을 열고 이 명령 저 명령을 실행해본다. 그런데 Format C:가 뭔지 몰라 설명서를 읽기 전에 실행부터 해봤다면 어떻게 될까? 게다가 입력하자마자 곧바로 명령이 실행된다면?

파워셸의 커맨드렛들 중에도 위험할 수 있는 것, 혹은 사용자가 평범한 상황에서 실행하고 싶지 않은 것들이 존재한다. 다행히 파워셸에는 원치 않게 드라이브가 포맷되는 등의 위험을 방지하기 위해 사용할 수 있는 매개변수들이 있다. 모든 커맨드렛에 다 통용되는 건 아니지만 거의 대부분 적용이 가능하다.

이런 ‘통제용’ 매개변수는 크게 세 가지가 있는데 -WhatIf, -Confirm, Suspend다. 물론 마지막 Suspend는 매개변수라고 할 수 없다. 하지만 확인 창을 통해 제공할 수 있는 ‘행위’ 중 하나이므로 ‘안전장치’라는 면에서는 앞선 두 가지와 동일하다. -WhatIf는 커맨드렛 뒤에 붙여서 사용할 수 있는데, 시스템 상태에 변화를 일으키는 커맨드렛들에만 붙을 수 있다. 정보를 출력하는 데 그치는 Get-Process 와 같은 커맨드렛과는 사용할 수가 없다.

1) 파워셸 콘솔을 연다.
2) notepad를 입력하고 엔터를 누른다.
3) Get-Process 커맨드렛을 입력해 현재 실행되고 있는 노트패드 프로세스를 확인한다. Get-Process note*를 입력하면 된다.
4) Get-Process note*를 입력했을 때 어떤 정보가 출력되는지 검토하라. 그리고 노트패드에 해당하는 프로세스의 ID가 무엇인지 외워두라.
5) 이제 노트패드 프로세스를 종료시킬 것이다. Stop-Process라는 커맨드렛을 사용할 텐데, 4)번에서 확인한 ID와 -WhatIf 매개변수를 사용할 것이다.
Stop-Process -id 1234 -whatif
6) 명령을 실행했을 때 어떤 결과가 나타나는지 확인하라. -whatif를 빼면 노트패드가 곧바로 종료되지만 -whatif를 붙이면 해당 명령에 대한 설명만이 출력된다.

이와 달리 -Confirm 매개변수는 커맨드렛을 실행하기 전 사용자에게 한 번 더 확인해보는 기능을 갖는다. 이를 확인해보기 위해서 위의 1)~4)번까지를 먼저 실행해본다. 그런 후 다음과 같은 명령을 실행한다.
Stop-Process -id 1234 -confirm

뒤에 -Confirm을 붙이지 않았을 때와 달리 ‘정말로 이 기능을 실행하겠느냐?’라는 질문이 뜨는 것을 확인할 수 있다. 여기서 사용자는 한 번 더 Y키를 눌러야 노트패드를 종료시킬 수 있다. 이 때 Y 대신 S를 누르면 Suspend 기능이 활성화 되어 프로세스가 잠시 중단된다. 이 상태에서 사용자는 좀 더 확실히 프로세스들을 확인할 수 있고, 확인을 마쳤으면 exit을 쳐서 다시 ‘확인 절차’로 돌아갈 수 있다. 다시 Y를 누르면 아까 실행되려다 만 커맨드렛이 시작된다. 파워셸을 처음 사용할 땐 이 매개변수들을 반드시 붙여보라는 게 전문가들의 조언이다.

파워셸 보안
애석하게도 파워셸을 검색 엔진에 입력해 결과를 보면 온통 파워셸을 이용한 해킹 공격에 대한 소식뿐이다. 그래서 일부 보안 전문가들은 파워셸을 사용하지 않는 게 현명하다고도 조언한다. 하지만 파워셸은 깃허브 기준 현재 가장 많이 사용되는 언어 중 하나다. 바로 앞에 펄(Perl)과 R이 있다. 더 위로는 자바스크립트, 자바, PHP, 파이선, C, 루비, 스위프트가 차례로 순위를 석권하고 있다. 뒤로는 셀 수 없는 언어들이 줄을 서있고 말이다. 즉, 단순 보안 사고 위험 때문에 사용하지 않기에는 개발자들 사이에서 이미 너무 인기가 있는 언어라는 것이다. 사실 해커들이 파워셸을 악용한다는 것도, 파워셸의 인기를 반증한다.

1) 해커들에게 악용되지 않도록 파워셸을 최대한 안전하게 사용하는 건 그리 어렵지 않다. 먼저는 최신 버전을 사용하는 것부터 시작하면 된다. 지금 시점에서 가장 최신 버전은 5.0으로 윈도우 관리 프레임워크 5.1 버전을 통해 다운로드 받을 수 있다. 참고로 해커들이 가장 선호하는 파워셸 버전은 로깅 기능이 없는 파워셸 2.0이다.

2) ExecutionPolicy : 파워셸에는 ExecutionPolicy라는 최소한의 보안 장치가 마련되어 있다. 말 그대로 실행 규칙이라는 건데 최소한의 방패 역할을 해준다. 두 문장에 연속해서 ‘최소한’이라는 표현을 썼는데, 많은 보안 담당자들이 ExecutionPolicy를 보안의 ‘전부’인 것처럼 활용하고 있기 때문이다. ExecutionPolicy를 사용하는 건 중요하지만, 이는 절대로 강력하지 않다. 기본 중의 기본일 뿐이다.

3) 원격 관리를 가능하게 하는 파워셸 리모팅(PowerShell Remoting)은 일반적인 견해와 달리 안전하다. 암호화 기술이 디폴트로 적용되어 있으며 5985 혹은 5986 포트 하나만 사용된다. 또한 모든 윈도우 인증 프로토콜을 준수하며, 로컬의 관리자 그룹 멤버십을 반드시 요구한다. 다만 늘 그렇듯 ‘구축’과 ‘설정’이 문제가 되는 경우가 많다. 안전하게만 설정하면 오히려 리모팅 작업에 있어서 가장 안전한 툴 중 하나가 될 수도 있다. 그 ‘구축’과 ‘설정’에 관한 내용은 아래에 일부 언급할 예정이다.

4) FullLanguageMode / ConstrainedLanguageMode : 파워셸은 여러 언어 모드들로 사용이 가능하다. 그 중 하나가 거의 모든 권한을 주는 Full 모드고, 여러 기능을 제한하는 Constrained 모드다. FullLanguageMode를 사용하면 공격자들도 객체, 라이브러리, 클래스, 파워셸 세션을 마음껏 로드할 수 있다. ConstrainedLanguageMode는 이런 가능성을 크게 낮춰준다.

5) 그러나 무조건 Constrained 모드만 사용해서는 Full 모드에서만 가능한 기능을 발휘하지 못할 수도 있다. 파워셸 5.0에서는 앱로커(AppLocker)나 디바이스가드(DeviceGuard)를 통해 이 문제를 해결할 수 있다. 앱로커를 얼라우 모드(Allow Mode)로 맞추면 알려지지 않거나 허가되지 않은 애플리케이션의 실행을 막을 수 있다. 앱로커 정책에 의해 실행이 허용된 스크립트들은 Constrained 모드에 의해서도 제한받지 않는다.

6) 위의 앱로커를 얼라우 모드(Allow Mode)에 맞춰 사용한다는 건 파워셸 자체를 보강하는 게 아니라 파워셸을 안전하게 사용하기 위한 환경을 조성한다는 의미를 가지고 있다. 이는 즉 파워셸이 실행되는 시스템의 보안이 파워셸을 통한 안전 사고를 좌지우지 할 수도 있다는 뜻이다. 그러니 백신, 안티멀웨어 등의 보안 장치를 마련하는 것도 중요하다.

7) PKI 환경에서는 스크립트에 서명을 하고 화이트리스팅 기법을 적용하는 것도 가능하다. 앱로커나 실행 정책을 미리 설정해놓고 서명과 화이트리스팅 프로세스까지도 마련하면 파워셸을 통한 공격이 상당히 까다로워질 수 있다.

[추석특집 시리즈]
1. 공격과 네트워크와 관련된 조각난 기본지식들 모아보기(화)
2. 왜 보안은 그다지도 약한 것인가?(수)
3. 해커란 누구인가?(목)
4. 사이버 범죄 일상화의 시대에서 개인의 보안 지키기(금)
5. 온라인에서 존재를 완전히 감추는 방법(토)
6. 윈도우 파워셸에 관해 알아보자(오늘)
7. 요즘 각광 받는 데이터 과학의 기본기(이번 주말판)
[국제부 문가용 기자(globoan@boannews.com)]

<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>

  •  
  • 3
  • 페이스북 보내기 트위터 보내기 네이버 밴드 보내기 카카오 스토리 보내기


  •  SNS에서도 보안뉴스를 받아보세요!! 
모니터랩 파워비즈 배너 시작 18년9월12일위즈디엔에스 2018WD 파워비즈 2017-0305 시작파워비즈배너 시작 11월6일 20181105-20200131
설문조사
2019년은 4차 산업혁명을 이끌 보안기술들이 본격적으로 상품화될 것으로 기대되고 있습니다. 2019년에 선보이는 다양한 보안기술 중에서 어떤 기술이 가장 주목을 받을 것이라고 생각하시나요?
실시간 위협탐지·대응 기술 EDR
빅데이터 기반의 인공지능(AI) 보안기술
음성인식·행동인식 등 차세대 생체인식기술
차세대 인터넷, 블록체인 기반 보안기술
보안위협 분석 위한 인텔리전스 보안기술
대세는 클라우드, 클라우드 기반 보안기술
IoT 기기를 위한 경량화 보안기술
IP 카메라 해킹 대응 개인영상 정보보호 기술