PowerShell 기반 시스템 탐색 및 스크립트 자동화

개요

이 문서는 PowerShell을 활용한 시스템 정보 수집과 자동화 스크립트 작성에 대해 설명합니다. 특히 적대적 환경에서 초기 접근 후 수행할 수 있는 정보 탐색 절차와 기본적인 포트 스캔 로직 구현 방법을 다룹니다.

PowerShell의 핵심 개념

PowerShell은 .NET 프레임워크 위에서 동작하는 명령줄 셸이자 스크립팅 언어입니다. 가장 중요한 특징 중 하나는 모든 cmdlet(명령어)의 출력이 객체(object)라는 점입니다. 이는 단순한 문자열이 아닌 속성(property)과 메서드(method)를 가진 구조화된 데이터이므로, 파이프라인을 통해 다음 명령으로 전달될 때 그 구조를 유지합니다.

cmdlet은 일반적으로 동사-명사 형식으로 구성됩니다. 예: Get-Process, Stop-Service. 이러한 패턴은 명령어의 목적을 직관적으로 이해하게 해줍니다.

기초 명령어 탐색

  • Get-Help [Cmdlet]: 특정 cmdlet에 대한 설명, 사용법, 예제를 제공합니다. 예: Get-Help Get-ChildItem -Examples
  • Get-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은 파일 내 텍스트를 검색하는 데 매우 유용하며, 정규 표현식 패턴도 지원합니다.

태그: PowerShell Windows Security Enumeration Scripting automation

6월 14일 00:24에 게시됨