
보안 전문가를 위한 PowerShell 무기고
[!IMPORTANT]
이 저장소는 이제 보관되었습니다. 재미있는 여정이었지만, PSArmoury는 더 이상 유용하지 않다고 생각합니다.
PowerShell Armoury는 침투 테스터, "색상-삽입-여기"-팀 구성원 및 업무 중 다양한 PowerShell 도구를 사용하는 모든 사람을 대상으로 합니다. 이 도구를 사용하면 즐겨 사용하는 모든 PowerShell 스크립트를 단일 난독화된 파일로 다운로드하여 저장할 수 있습니다.
Rubeus, PowerView 등을 수동으로 업데이트할 필요가 없습니다. 구성 파일을 한 번만 생성하거나 도구에 포함된 기본 파일을 사용하면 됩니다. 이제 다음 업무를 시작하기 전에 "New-PSArmoury"만 실행하면 됩니다.
또한 PSArmoury는 코드를 난독화하고 AMSI 우회 기능을 포함하고 있습니다. 모듈식 설계 덕분에 탐지가 발생할 경우 회피 또는 난독화 코드를 쉽게 변경할 수 있습니다.
현재 버전의 PSArmoury는 모듈식 설계를 선호합니다.
New-PSArmoury.ps1
PSArmoury.json
utilities
ConvertTo-Powershell.ps1
Invoke-Shuffle.ps1
modules
evasion.ps1
obfuscation.ps1
코드는 New-PSArmoury.ps1이라는 주 생성기 스크립트로 나뉘어 있으며, 이를 실행합니다. 회피, 난독화 및 복호화 코드는 modules 디렉토리의 별도 .ps1 파일에 저장됩니다. 이러한 별도 파일은 주 스크립트에 의해 호출되며, 특정 기능(예: AMSI 우회)을 더 쉽게 변경할 수 있도록 합니다.
모듈 디렉토리 외에도 utilities 디렉토리가 있습니다. 여기에는 특정 시나리오에서 유용할 수 있는 독립 실행형 스크립트가 있습니다.
모듈 디렉토리의 기본 경로는 .\modules이며, 여기서 점은 셸의 현재 작업 디렉토리를 나타냅니다. New-PSArmoury의 -ModulesDirectory 인수를 사용하여 모듈 디렉토리 경로를 변경할 수 있습니다.
그러나 스크립트 파일의 이름 자체는 주 스크립트에 하드코딩되어 있으며 항상 다음과 같아야 합니다.
이 두 파일을 자세히 살펴보겠습니다.
이 스크립트는 우회하려는 모든 것을 우회하기 위한 코드를 포함해야 합니다. 기본적으로 잘 알려진 AMSI 우회(amsi.fail 덕분에)를 포함하고 있습니다. 참고:
이 스크립트는 난독화 및 복호화에 사용되는 코드를 포함해야 합니다. 기본 obfuscation.ps1은 RC2 암호화를 사용합니다. 즉시 사용 가능한 예제:
TEMPLATE_obfuscation_empty.ps1은 실제로 아무것도 하지 않으며, 자신만의 함수를 구축하기 위한 템플릿 역할을 합니다.
이 중 하나를 사용하려면 "obfuscation.ps1"으로 이름을 바꾸고 기본 파일을 삭제하면 됩니다.
사용자 지정 버전을 만들 경우 난독화와 관련하여 다음 사항을 명심하십시오.
복호화와 관련하여 다음 사항을 기억하십시오.
유틸리티 디렉토리에는 유용한 독립 실행형 스크립트가 포함되어 있습니다.
구성 파일은 하나 이상의 객체를 포함하는 단일 배열로 구성된 유효한 JSON이어야 하며, 각 객체는 단일 스크립트 소스로 해석됩니다. 각 객체에는 다음과 같은 속성이 있습니다.
Name (필수)
이 객체에 포함된 스크립트를 식별하기 위해 선택한 이름입니다. 이는 자신을 위한 참조용입니다.
URL (필수)
스크립트 내용을 가져올 위치입니다. 웹 리소스(https://)의 URL, 로컬 경로(C:) 또는 네트워크 리소스(\...)일 수 있습니다. URL은 각각 Net.Webclient 또는 PowerShell의 Get-Item에 전달됩니다. 기본적으로 이 두 가지가 처리할 수 있는 모든 형식이 작동해야 합니다.
Type (필수)
아머리 생성자에게 스크립트 위치에 대한 힌트를 제공합니다. 세 가지 유효한 유형이 있습니다.
FileInclusionFilter (선택 사항)
"GitHub" 유형의 객체에서만 해석됩니다. 전체 파일 이름에 대해 PowerShell의 "like" 비교 연산자와 일치하므로 와일드카드를 직접 포함해야 합니다. 파일 이름의 일부를 일치시키려면 별표(*)를 포함하는 것을 잊지 마십시오. "*.ps1"은 ".ps1"로 끝나는 모든 파일을 의미하지만 ".ps1"은 단지 ".ps1"을 의미합니다.
필터를 포함할 필요는 없지만 포함하는 경우 사용해야 합니다. 빈 InclusionFilter는 파일이 없음을 의미합니다.
FileExclusionFilter (선택 사항)
InclusionFilter와 유사하지만 당연히 반대입니다. 제외가 우선합니다.
자세한 내용은 PowerShell 인라인 도움말(man -full New-PSArmoury)을 참조하십시오.
-Path
새 아머리 파일의 경로입니다. 기본값은 ".\MyArmoury.ps1"입니다.
-FromFile
로컬 폴더나 파일에서 직접 PowerShell 스크립트를 로드하며 구성 파일을 제공할 필요가 없습니다.
-Config
JSON 구성 파일의 경로입니다. 이 스크립트에 포함된 샘플을 참조하십시오.
-ModulesDirectory
모듈 디렉토리의 경로입니다. 기본값은 ".\modules"입니다. ModulesDirectory가 사용되면 EvasionPath 및 ObfuscationPath 매개변수를 사용할 수 없습니다.
-EvasionPath
회피 스크립트의 경로입니다. EvasionPath와 ObfuscationPath가 사용되면 ModulesDirectory 매개변수를 사용할 수 없습니다.
-ObfuscationPath
난독화 스크립트의 경로입니다. EvasionPath와 ObfuscationPath가 사용되면 ModulesDirectory 매개변수를 사용할 수 없습니다.
-ValidateOnly
"-Config"와 함께 사용하여 스크립트가 JSON 구성 파일의 기본 구문을 실행하지 않고 검증하도록 합니다.
-GithubCredentials
GitHub 사용자 이름과 액세스 토큰을 자격 증명 객체로 전달하여 스크립트가 프롬프트를 표시하지 않도록 합니다. 테스트를 위해 반복적으로 아머리를 생성할 때 유용합니다.
다음과 같이 사용하십시오.
$c = get-credential
New-PSArmoury -GithubCredentials $c
스크립트가 GitHub API를 제대로 사용할 수 있도록 유효한 GitHub 사용자 이름과 개인 액세스 토큰을 제공해야 합니다. MFA가 활성화된 경우(활성화해야 함) 사용자 이름/비밀번호는 작동하지 않으므로 사용하지 마십시오. 또한 기본 사용자 이름/비밀번호로 API에 액세스하는 것은 더 이상 사용되지 않습니다.
개인 액세스 토큰을 생성하려면 이 가이드를 따르십시오.
참고: 액세스 토큰에 필요한 유일한 권한은 repo 섹션의 public_repo입니다.
이는 더 큰 리포지토리(예: PowerSploit)에서 포함할 .ps1 파일을 구문 분석할 때 GitHub가 차단하지 않도록 토큰만 필요하기 때문입니다.
기본 설정으로 아머리를 생성하려면(base64 인코딩 외에는 난독화가 없음) 다음을 실행하면 됩니다.
. .\New-PSArmoury.ps1
New-PSArmoury
이렇게 하면 다음을 사용하여 현재 작업 디렉토리에 "MyArmoury.ps1"이라는 .ps1 파일이 생성됩니다.
다음을 사용하여 아머리를 현재 세션에 로드할 수 있습니다.
cat -raw .\MyArmoury.ps1 | iex
아머리를 로드하면 다음 단계가 수행됩니다.
그 후 아머리에 넣은 모든 PowerShell 코드를 사용할 수 있습니다. 다음과 같이 일반적인 cmdlet을 호출하기만 하면 됩니다.
Invoke-Rubeus -Command "kerberoast /stats"
Get-DomainGroupMember -Identity "Domain Admins" -Recurse
아머리에 무엇을 넣었는지 기억나지 않으면 로드한 후 인벤토리를 호출하십시오.
Get-PSArmoury
다음과 같이 -EvasionPath 및 -ObfuscationPath 매개변수로 New-PSArmoury를 시작합니다.
New-PSArmoury -Config C:\myarmouryconfig.json -ObfuscationPath .\modules\TEMPLATE_obfuscation_byte_convert.ps1 -EvasionPath .\modules\evasion.ps1
참고: 이 경우 폴더 경로를 제출했기 때문에 폴더의 모든 .ps1 파일이 추가됩니다. 단일 파일 경로를 제출하면 해당 파일만 처리됩니다.
New-PSArmoury -FromFile C:\myscriptfolder