윈도우 시스템에 내장된 파워쉘(Powershell)은 기본적으로 원격 명령어를 실행할 수 없도록 제한되어 있다.
하지만, 파워쉘의 목적은 원격 작업을 하기 위한 목적으로 내부 사용자들에게 정책을 내리거나 정보를 가져와야 하므로 원격 명령어를 실행할 수 있도록 설정한다.
액티브 디렉토리(AD, Active Directory), 단일 서버(Standalone)에서 원격 명령어를 실행하는 방법을 알아본다.
액티브 디렉토리 환경
invoke-command는 로컬, 원격 명령어를 실행하거나 여러개의 명령어를 일괄적으로 처리한다.
-scriptblock {get-process}은 로컬에서 실행중인 현재의 프로세스 정보를 가져오는 옵션으로 중괄호 안에 실행할 명령어를 적는다.
PS C:\Users\dazeuser\Desktop> invoke-command -scriptblock {get-process}
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
88 5 4340 10836 69 0.20 2912 conhost
34 2 820 2836 30 0.03 3668 conhost
569 6 1800 5052 52 316 csrss
252 8 7804 14652 164 368 csrss
195 8 2964 8924 36 308 dllhost
126 7 64616 75020 132 2.61 3624 dwm
125 6 3724 8688 74 0.42 1772 Everything
윈도우 클라이언트에서 invoke-command 명령어를 이용해 도메인 컨트롤러의 현재 실행중인 프로세스를 가져온다. 하지만, 명령어 실행 시 자격 증명(패스워드)를 입력해도 액세스가 거부되었다는 메시지가 출력된다.
○ -computername nyc-dc1 : 원격 컴퓨터 이름
○ -credential dazehack\dazeuser : 도메인\일반사용자
PS C:\Users\dazeuser> invoke-command -scriptblock {get-process} -computername nyc-dc1 -credential dazehack\dazeuser
[nyc-dc1] 다음 오류 메시지가 발생하여 원격 서버에 연결하지 못했습니다. 액세스가 거부되었습니다. 자세한 내용은 about_Rem
ote_Troubleshooting 도움말 항목을 참조하십시오.
+ CategoryInfo : OpenError: (:) [], PSRemotingTransportException
+ FullyQualifiedErrorId : PSSessionStateBroken
액세스가 거부된 이유는 dazeuser 사용자의 권한이 제한되어 있거나 원격 관리 서비스(WinRM)가 비활성화 된 것이다. dazeuser 사용자의 그룹을 Domain Users 그룹에 포함시킨다.
○ 도메인 컨트롤러에서 시작 > 관리 도구 > Active Directory 사용자 및 컴퓨터
○ Users > dazeuser 속성 > 소속 그룹에 Domain Admins를 추가
도메인 컨트롤러에서 Enable-PSRemoting 명령어를 입력하면 원격 관리 서비스가 활성화된다.
PS C:\Users\Administrator> Enable-PSRemoting
WinRM 빠른 구성
WinRM 서비스를 통해 원격 관리할 이 컴퓨터를 사용하도록 설정하는 "Set-WSManQuickConfig" 명령을 실행합니다.
이 작업에는 다음과 같은 내용이 포함됩니다.
1. WinRM 서비스 시작 또는 다시 시작(이미 시작된 경우)
2. WinRM 서비스 유형을 자동 시작으로 설정
3. 모든 IP 주소에 대한 요청을 허용하는 수신기 만들기
4. WS-Management 트래픽에 대한 방화벽 예외 사용(http 전용)
계속하시겠습니까?
[Y] 예(Y) [A] 모두 예(A) [N] 아니요(N) [L] 모두 아니요(L) [S] 일시 중단(S) [?] 도움말 (기본값은 "Y"임): Y
이 컴퓨터에서 요청을 수신하도록 WinRM이 이미 설정되었습니다.
원격 관리를 위한 WinRM이 업데이트되었습니다.
이 컴퓨터에서 모든 IP 주소로 WS-Man 요청을 수락하려면 HTTP://*에서 WinRM 수신기를 만드십시오.
WinRM 방화벽 예외를 사용합니다.
확인
이 작업을 수행하시겠습니까?
대상 "세션 구성 "Microsoft.PowerShell32"이(가) 없습니다. "Register-PSSessionConfiguration Microsoft.PowerShell32
-processorarchitecture x86 -force" 명령을 실행하여 "Microsoft.PowerShell32" 세션 구성을 만들면 WinRM 서비스가 다시
시작합니다."에서 "세션 구성 등록" 작업을 수행합니다.
[Y] 예(Y) [A] 모두 예(A) [N] 아니요(N) [L] 모두 아니요(L) [S] 일시 중단(S) [?] 도움말 (기본값은 "Y"임): Y
dazeuser 사용자에게 Domain Admins 권한을 부여하고, 원격 관리 서비스를 활성화한 상태이다. 윈도우 클라이언트에서 invoke-command 명령어를 입력하면 도메인 컨트롤러의 현재 실행중인 프로세스를 가져온다.
PS C:\Users\dazeuser\Desktop> invoke-command -scriptblock {get-process} -computername nyc-dc1 -credential dazehack\dazeus
er
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName PSComputerName
------- ------ ----- ----- ----- ------ -- ----------- --------------
81 8 4856 8168 77 0.20 1676 conhost nyc-dc1
30 4 1112 2796 41 0.00 2536 conhost nyc-dc1
566 12 2096 5824 113 0.66 328 csrss nyc-dc1
191 11 2252 9148 175 1.36 404 csrss nyc-dc1
229 13 14944 15448 158 0.90 2364 csrss nyc-dc1
윈도우 클라이언트에서 enter-pssession 명령어를 입력하고, 도메인 컨트롤러의 이름을 입력하면 도메인 컨트롤러의 세션(쉘)을 로컬로 가져온다. 도메인 컨트롤러의 쉘에서 1.txt 파일을 생성한다.
PS C:\Users\dazeuser> enter-pssession
cmdlet Enter-PSSession(명령 파이프라인 위치 1)
다음 매개 변수에 대한 값을 제공하십시오.
ComputerName: nyc-dc1
[nyc-dc1]: PS C:\Users\dazeuser\Documents> ipconfig
Windows IP 구성
이더넷 어댑터 로컬 영역 연결:
연결별 DNS 접미사. . . . :
IPv4 주소 . . . . . . . . . : 10.10.0.20
서브넷 마스크 . . . . . . . : 255.255.0.0
기본 게이트웨이 . . . . . . : 10.10.0.2
터널 어댑터 isatap.{87D394AF-B114-4B26-AE4B-FBFC492F1C1D}:
미디어 상태 . . . . . . . . : 미디어 연결 끊김
연결별 DNS 접미사. . . . :
[nyc-dc1]: PS C:\Users\dazeuser\Documents> ls
[nyc-dc1]: PS C:\Users\dazeuser\Documents> 1 > 1.txt
[nyc-dc1]: PS C:\Users\dazeuser\Documents> ls
디렉터리: C:\Users\dazeuser\Documents
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2019-12-27 오후 12:55 12 1.txt
윈도우 클라이언트에서 new-pssession 명령어를 이용해 도메인 컨트롤러의 세션을 가져와서 현재 실행중인 프로세스 정보를 가져온다.
PS C:\Users\dazeuser> new-pssession -computername nyc-dc1
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
1 Session1 nyc-dc1 Opened Microsoft.PowerShell Available
PS C:\Users\dazeuser> $a = get-pssession
PS C:\Users\dazeuser> $a
Id Name ComputerName State ConfigurationName Availability
-- ---- ------------ ----- ----------------- ------------
1 Session1 nyc-dc1 Opened Microsoft.PowerShell Available
PS C:\Users\dazeuser> invoke-command -scriptblock {get-process} -session $a
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName PSComputerName
------- ------ ----- ----- ----- ------ -- ----------- --------------
81 8 4856 8188 77 0.34 1676 conhost nyc-dc1
30 4 1112 2796 41 0.00 2536 conhost nyc-dc1
549 12 2096 5816 113 0.66 328 csrss nyc-dc1
단일 서버 환경
A_computer\bughunting에서 Enable-PSRemoting 명령어를 입력하여 원격 관리 서비스를 활성화 시킨다.
PS C:\Users\bughunting> enable-psremoting
WinRM 빠른 구성
WinRM 서비스를 통해 원격 관리할 이 컴퓨터를 사용하도록 설정하는 "Set-WSManQuickConfig" 명령을 실행합니다.
이 작업에는 다음과 같은 내용이 포함됩니다.
1. WinRM 서비스 시작 또는 다시 시작(이미 시작된 경우)
2. WinRM 서비스 유형을 자동 시작으로 설정
3. 모든 IP 주소에 대한 요청을 허용하는 수신기 만들기
4. WS-Management 트래픽에 대한 방화벽 예외 사용(http 전용)
계속하시겠습니까?
[Y] 예(Y) [A] 모두 예(A) [N] 아니요(N) [L] 모두 아니요(L) [S] 일시 중단(S) [?] 도움말 (기본값은 "Y"임): y
이 컴퓨터에서 요청을 수신하도록 WinRM이 이미 설정되었습니다.
이 컴퓨터의 원격 관리에 사용할 WinRM이 이미 설정되었습니다.
확인
이 작업을 수행하시겠습니까?
대상 "이름: microsoft.powershell SDDL: O:NSG:BAD:P(A;;GA;;;BA)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD). 선택된 사용자가 이
컴퓨터에서 Windows PowerShell 명령을 원격으로 실행하도록 허용합니다."에서 "Set-PSSessionConfiguration" 작업을
수행합니다.
[Y] 예(Y) [A] 모두 예(A) [N] 아니요(N) [L] 모두 아니요(L) [S] 일시 중단(S) [?] 도움말 (기본값은 "Y"임): y
B_computer\Administrator에서 B_computer와 연결된 모든 컴퓨터를 신뢰할 수 있도록 설정한다.
PS C:\Users\Administrator> get-service winrm
Status Name DisplayName
------ ---- -----------
Stopped winrm Windows Remote Management (WS-Manag...
PS C:\Users\Administrator> Set-Item WsMan:\localhost\Client\Trustedhosts -Value "*" -Force
PS C:\Users\Administrator> get-Item WsMan:\localhost\Client\Trustedhosts
WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Client
Name Value Type
---- ----- ----
TrustedHosts * System.String
PS C:\Users\Administrator> get-service winrm
Status Name DisplayName
------ ---- -----------
Running winrm Windows Remote Management (WS-Manag...
B_computer\Administrator에서 invoke-command 명령어를 입력하면 원격 컴퓨터(A_computer\bughunting)에서 실행중인 프로세스 정보를 가져온다.
PS C:\Users\Administrator> invoke-command -scriptblock {get-process} -computername "10.10.0.29" -credential bughunting
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName PSComputerName
------- ------ ----- ----- ----- ------ -- ----------- --------------
61 3 776 3092 33 0.00 1360 armsvc 10.10.0.29