개요
이 문서는 PowerShell을 활용한 시스템 정보 수집과 자동화 스크립트 작성에 대해 설명합니다. 특히 적대적 환경에서 초기 접근 후 수행할 수 있는 정보 탐색 절차와 기본적인 포트 스캔 로직 구현 방법을 다룹니다.
PowerShell의 핵심 개념
PowerShell은 .NET 프레임워크 위에서 동작하는 명령줄 셸이자 스크립팅 언어입니다. 가장 중요한 특징 중 하나는 모든 cmdlet(명령어)의 출력이 객체(object)라는 점입니다. 이는 단순한 문자열이 아닌 속성(property)과 메서드(method)를 가진 구조화된 데이터이므로, 파이프라인을 통해 다음 명령으로 전달될 때 그 구조를 유지합니다.
cmdlet은 일반적으로 동사-명사 형식으로 구성됩니다. 예: Get-Process, Stop-Service. 이러한 패턴은 명령어의 목적을 직관적으로 이해하게 해줍니다.
기초 명령어 탐색
Get-Help [Cmdlet]: 특정 cmdlet에 대한 설명, 사용법, 예제를 제공합니다. 예:Get-Help Get-ChildItem -ExamplesGet-Command: 시스템에 설치된 모든 명령어를 나열합니다. 와일드카드 사용 가능:Get-Command Get-*또는Get-Command *-Item.
파이프라인과 객체 조작
파이프 기호(|)는 한 명령의 출력 객체를 다음 명령의 입력으로 전달합니다. 텍스트가 아닌 객체 자체가 전달되므로, 데이터의 의미를 잃지 않고 복잡한 작업을 수행할 수 있습니다.
- 객체 구조 확인:
Get-Member를 사용하면 객체가 어떤 속성과 메서드를 가지고 있는지 확인할 수 있습니다.
예:Get-Service | Get-Member -MemberType Property - 속성 선택:
Select-Object를 사용해 원하는 속성만 추출하거나, 첫 번째/마지막 N개의 항목을 선택할 수 있습니다.
예:Get-ChildItem C:\ | Select-Object Name, Length - 데이터 필터링:
Where-Object를 사용하여 조건에 맞는 객체만 걸러냅니다.
예:Get-Process | Where-Object {$_.CPU -gt 100}(CPU 사용량이 100 이상인 프로세스) - 정렬:
Sort-Object를 사용해 결과를 정렬합니다.
예:Get-EventLog -LogName System -Newest 50 | Sort-Object TimeGenerated
시스템 정보 열거 실습
타겟 시스템에 접근한 후, 아래와 같은 정보를 수집할 수 있습니다.
사용자 및 그룹 정보
Get-LocalUser: 로컬 사용자 계정 목록을 가져옵니다.Get-LocalGroup: 존재하는 로컬 그룹을 나열합니다.Get-LocalUser -SID S-1-5-21-...-501: 특정 SID를 가진 사용자를 조회합니다. (예: Guest 계정)- 비밀번호 요구 여부 필터링:
Get-LocalUser | Where-Object PasswordRequired -eq $false
네트워크 상태 확인
Get-NetIPAddress: 할당된 IP 주소 정보를 표시합니다.Get-NetTCPConnection -State Listen: 현재 리스닝 중인 TCP 포트를 나열합니다. 개수 확인을 위해Measure-Object를 연결할 수 있습니다.
예:Get-NetTCPConnection -State Listen | Measure-Object- 특정 포트(예: 445)의 리스닝 상태 확인:
Get-NetTCPConnection -LocalPort 445 -State Listen
보안 관련 파일 탐색
- 파일 내용 검색 (패턴 매칭):
Get-ChildItem C:\ -Recurse -ErrorAction SilentlyContinue | Select-String -Pattern "API_KEY" - 특정 확장자 파일 찾기 (.bak 등 백업 파일):
Get-ChildItem C:\ -Include *.bak -File -Recurse -ErrorAction SilentlyContinue - 파일 내용 읽기:
Get-Content "C:\path\to\file.txt" - 파일 해시 값 계산:
Get-FileHash "C:\path\to\file" -Algorithm MD5
기타 시스템 정보
Get-HotFix: 설치된 업데이트(핫픽스) 목록을 확인합니다. 특정 KB 번호로 필터링 가능.Get-ScheduledTask: 예약된 작업을 나열합니다. 이름으로 필터링 가능.
예:Get-ScheduledTask -TaskName "new-sched-task"Get-Acl: 파일이나 폴더의 접근 제어 목록(소유자 포함)을 확인합니다.
예:Get-Acl C:\
기본 PowerShell 스크립트 작성
복잡한 작업을 자동화하기 위해 .ps1 파일로 스크립트를 작성할 수 있습니다. PowerShell ISE 또는 VS Code를 사용할 수 있습니다.
변수와 반복문
다음 스크립트는 지정된 텍스트 파일에 나열된 포트가 실제로 리스닝 중인지 확인합니다.
$listeningPorts = Get-NetTCPConnection -State Listen | Select-Object -ExpandProperty LocalPort
$targetPorts = Get-Content -Path "C:\Users\Administrator\Desktop\ports.txt"
foreach ($port in $targetPorts) {
if ($listeningPorts -contains [int]$port) {
Write-Output "포트 $port 는 열려 있습니다."
}
}
스크립트는 먼저 시스템의 모든 리스닝 포트를 수집하고, 이후 foreach 루프를 통해 대상 포트 목록을 순회하며 -contains 연산자로 일치 여부를 확인합니다.
간단한 TCP 포트 스캐너
외부 도구 없이 내장 cmdlet을 이용해 범위 내 포트를 스캔할 수 있습니다.
for ($port = 130; $port -le 140; $port++) {
$result = Test-NetConnection -ComputerName localhost -Port $port -InformationLevel Quiet -WarningAction SilentlyContinue
if ($result) {
Write-Output "Open Port: $port"
}
}
이 스크립트는 130번부터 140번까지의 포트에 대해 연결 테스트를 수행하고, 성공한 경우에만 열린 포트를 출력합니다. -InformationLevel Quiet은 불필요한 출력을 억제합니다.
자동화를 통한 데이터 분석
여러 이메일 파일에서 특정 키워드를 추출하는 작업도 스크립트로 처리할 수 있습니다.
$emailPath = "C:\Users\Administrator\Desktop\emails\*"
# 'password'라는 단어를 포함한 파일 찾기
Select-String -Path $emailPath -Pattern "password" -Recurse
# 'HTTPS' 또는 'HTTP' 링크를 포함한 파일 찾기
Select-String -Path $emailPath -Pattern "https?" -Recurse
Select-String cmdlet은 파일 내 텍스트를 검색하는 데 매우 유용하며, 정규 표현식 패턴도 지원합니다.