본문 바로가기
digital forensics

[우암던전] 주통기 W-01, W-02, W-04, W-06을 점검하는 스크립트

by FAPER 2024. 12. 10.

W-01 : 계정관리 > 1.1 Administrator 계정 이름 변경 또는 보안성 강화

점검 스크립트 짜는 법 : Get-LocalUser로 Administrator가 있는지 보고 레지스트리 키를 조회해서 패스워드 복잡도 설정이 활성화 되어 있는지 본다.

# W-01 점검 스크립트: Administrator 계정 이름 변경 및 비밀번호 보안성 점검

# Function to check Administrator account name and password complexity
function Check-W01 {
    # Check if the Administrator account name is changed
    $adminAccount = Get-LocalUser | Where-Object { $_.Name -match "Administrator" }
    $isNameChanged = $adminAccount -eq $null

    # Check if password complexity is enabled
    $complexity = Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name "PasswordComplexity" -ErrorAction SilentlyContinue
    $isPasswordComplex = $complexity.PasswordComplexity -eq 1

    # Detailed results
    $reasons = @()
    if (-not $isNameChanged) {
        # Administrator 계정 이름이 변경되지 않았습니다.
        $reasons += "QWRtaW5pc3RyYXRvciDqs4TsoJUg7J2066aE7J20IOuzgOqyveuQmOyngCDslYrslZjsirXri4jri6Qu"
    }
    if (-not $isPasswordComplex) {
        # 비밀번호 복잡성 정책이 활성화되지 않았습니다.
        $reasons += "67mE67CA67KI7Zi4IOuzteyeoeyEsSDsoJXssYXsnbQg7Zmc7ISx7ZmU65CY7KeAIOyViuyVmOyKteuLiOuLpC4="
    }

    # Final output based on checks
    if ($isNameChanged -and $isPasswordComplex) {
        # Base64 인코딩된 양호 메시지
        $message = "Vy0wMSDsoJDqsoAg6rKw6rO8OiDslpHtmLggLSBBZG1pbmlzdHJhdG9yIOqzhOyglSDsnbTrpoTsnbQg67OA6rK965CY7JeI6rOgLCDruYTrsIDrsojtmLgg67O17J6h7ISxIOygleyxheydtCDtmZzshLHtmZTrkJjslrQg7J6I7Iq164uI64ukLg=="
        $decodedMessage = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($message))
        Write-Output $decodedMessage
    } else {
        # Base64 인코딩된 취약 메시지
        $message = "Vy0wMSDsoJDqsoAg6rKw6rO8OiDst6jslb0gLSBBZG1pbmlzdHJhdG9yIOqzhOyglSDsnbTrpoQg67OA6rK9IOuYkOuKlCDruYTrsIDrsojtmLgg67O17J6h7ISxIOygleyxheydtCDtmZzshLHtmZTrkJjsp4Ag7JWK7JWY7Iq164uI64ukLgo="
        $decodedMessage = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($message))
        Write-Output $decodedMessage

        # Base64 디코딩된 세부 사유 출력
        $reasonHeader = "7IS467aAIOyCrOycoDo=" # "세부 사유:" Base64 인코딩된 문자열
        Write-Output ([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($reasonHeader)))
        $reasons | ForEach-Object { 
            $decodedReason = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($_))
            Write-Output "- $decodedReason"
        }
    }
}

# 실행
Check-W01

한글이 깨져서 base64로 인코딩해서 출력해야 한다.

실제로 복잡성을 만족하지 않고, Administrator 계정이 살아있기 때문에 취약하다고 뜸

 

 

W-02 : 계정관리 > 1.2 Guest 계정 비활성화

# W-02 점검 스크립트: Guest 계정 비활성화 여부 점검

function Check-W02 {
    # Guest 계정 상태 확인
    $guestAccount = Get-LocalUser | Where-Object { $_.Name -eq "Guest" }
    $isGuestDisabled = $guestAccount.Enabled -eq $false

    # 결과 출력
    if ($isGuestDisabled) {
        # Base64 인코딩된 양호 메시지
        $message = "Vy0wMiDsoJDqsoAg6rKw6rO8OiDslpHtmLggLSBHdWVzdCDqs4TsoJXsnbQg67mE7Zmc7ISx7ZmU65CY7Ja0IOyeiOyKteuLiOuLpC4="
        $decodedMessage = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($message))
        Write-Output $decodedMessage
    } else {
        # Base64 인코딩된 취약 메시지
        $message = "Vy0wMiDsoJDqsoAg6rKw6rO8OiDst6jslb0gLSBHdWVzdCDqs4TsoJXsnbQg7Zmc7ISx7ZmU65CY7Ja0IOyeiOyKteuLiOuLpC4="
        $decodedMessage = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($message))
        Write-Output $decodedMessage
        Write-Output "7IS467aAIOyCrOycoDo=" # "세부 사유:" Base64
        Write-Output "LSBHdWVzdCDqs4TsoJXsnbQg7Zmc7ISx7ZmU65CY7Ja0IOyeiOyKteuLiOuLpC4="
    }
}

# 실행
Check-W02

 

Guest 계정이 비활성화 되어 있기 때문에 양호라고 뜸

 

W-04 : 계정관리 > 1.4 계정 잠금 임계값 설정

# W-04 점검 스크립트: 계정 잠금 임계값 설정 여부 점검

function Check-W04 {
    # 계정 잠금 임계값 확인
    $lockoutThreshold = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters" -Name "LockoutThreshold" -ErrorAction SilentlyContinue).LockoutThreshold

    # 값이 null인 경우 0으로 초기화
    if ($null -eq $lockoutThreshold) {
        $lockoutThreshold = 0
    }

    # 결과 판별
    if ($lockoutThreshold -le 5 -and $lockoutThreshold -gt 0) {
        # Base64 인코딩된 양호 메시지
        $message = "LSBHdWVzdCDqs4TsoJXsnbQg7Zmc7ISx7ZmU65CY7Ja0IOyeiOyKteuLiOuLpC4=" # "Guest 계정 이름이 변경되었고 비밀번호 복잡성 정책이 활성화되어 있습니다."
        $decodedMessage = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($message))
        Write-Output $decodedMessage
    } else {
        # Base64 인코딩된 취약 메시지
        $message = "Vy0wNCDsoJDqsoAg6rKw6rO8OiDst6jslb0gLSDqs4TsoJUg7J6g6riIIOyehOqzhOqwkuydtCA2IOydtOyDgeydtOqxsOuCmCDshKTsoJXrkJjsp4Ag7JWK7JWY7Iq164uI64ukLg==" # 취약 메시지
        $decodedMessage = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($message))
        Write-Output $decodedMessage

        # 세부 사유 출력
        $reasonHeader = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("7IS467aAIOyCrOycoDo=")) # "세부 사유:"
        Write-Output $reasonHeader
        if ($lockoutThreshold -eq 0) {
            # Base64 디코딩된 세부 사유 메시지 출력
            $reasonMessage = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("LSDqs4TsoJUg7J6g6riIIOyehOqzhOqwkuydtCDshKTsoJXrkJjsp4Ag7JWK7JWY7Iq164uI64ukLg==")) # "계정 잠금 임계값이 설정되지 않았습니다."
            Write-Output "- $reasonMessage"
        } else {
            $reasonMessage = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("LSDqs4TsoJUg7J6g6riIIOyehOqzhOqwkuydtCA2IOydtOyDgeycvOuhnCDshKTsoJXrkJjslrQg7J6I7Iq164uI64ukLg==")) # "계정 잠금 임계값이 6 이상으로 설정되어 있습니다."
            Write-Output "- $reasonMessage"
        }
    }
}

# 실행
Check-W04

 

W-06 : 계정관리 > 1.6 관리자 그룹에 최소한의 사용자 포함

# W-06 점검 스크립트: 관리자 그룹에 최소한의 사용자 포함 여부 점검

function Check-W06 {
    # Administrators 그룹의 구성원 확인
    $adminGroup = Get-LocalGroupMember -Group "Administrators"
    $membersCount = $adminGroup.Count

    # 기본적으로 포함될 사용자 리스트 (예: Administrator 계정)
    $defaultAdmins = @("Administrator")

    # 기본 사용자를 제외한 나머지 구성원 확인
    $additionalMembers = $adminGroup | Where-Object { $_.Name -notin $defaultAdmins }

    # 결과 판별
    if ($membersCount -le 1 -or $additionalMembers.Count -eq 0) {
        # Base64 인코딩된 양호 메시지
        $message = "LSDqs4TsoJUg7J6g6riIIOyehOqzhOqwkuydtCA2IOydtOyDgeycvOuhnCDshKTsoJXrkJjslrQg7J6I7Iq164uI64ukLg=="
        $decodedMessage = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($message))
        Write-Output $decodedMessage
    } else {
        # Base64 인코딩된 취약 메시지
        $message = "Vy0wNiDsoJDqsoAg6rKw6rO8OiDst6jslb0gLSBBZG1pbmlzdHJhdG9ycyDqt7jro7nsl5Ag67aI7ZWE7JqU7ZWcIOyCrOyaqeyekOqwgCDtj6ztlajrkJjslrQg7J6I7Iq164uI64ukLg=="
        $decodedMessage = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($message))
        Write-Output $decodedMessage

        # 세부 사유 출력
        $reasonHeader = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("7IS467aAIOyCrOycoDo=")) # "세부 사유:"
        Write-Output $reasonHeader
        foreach ($member in $additionalMembers) {
            Write-Output "- $($member.Name)"
        }
    }
}

# 실행
Check-W06