
클라우드 자격 증명으로부터 권한을 브루트포스 테스트로 확인합니다.
자격 증명을 얻었는데, 이제 뭐지?
CloudPrivs는 Boto3와 같은 SDK의 기존 기능을 활용하여 모든 클라우드 서비스의 권한을 무차별 대입하여 주어진 자격 증명에 어떤 권한이 있는지 확인하는 도구입니다.
이 도구는 침투 테스터, 레드 팀 및 기타 보안 전문가에게 유용합니다. 클라우드 서비스는 일반적으로 주어진 자격 증명에 어떤 권한이 있는지 확인하는 방법을 제공하지 않으며, 방대한 서비스 및 작업 수로 인해 수동으로 확인하는 것은 어려운 작업입니다. 이는 자격 증명 집합에서 권한 상승이 가능할 수 있지만, 발견한 AWS 자격 증명으로 Lambda를 실행할 수 있다는 사실을 모르기 때문에 절대 알지 못할 수 있음을 의미합니다.
현재 PyPi에서 사용할 수 없지만 작업 중입니다
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
python -m pip install -e .
이는 가상 환경 없이 설치하는 방법이며, 많은 Python 프로그램을 실행하는 경우 권장되지 않습니다.
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
python -m venv venv/
./venv/bin/activate # activate.ps1 on windows
python -m pip install -e .
사용 가능한 경우 Pyenv+virtualenv를 사용할 수도 있습니다:
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
pyenv virtualenv CloudPrivs
pyenv local CloudPrivs
python -m pip install -e .
cloudprivs [PROVIDER] [ARGS]
현재 사용 가능한 제공자는 AWS뿐이지만 GCP를 작업 중입니다. 도움을 원하시면 #Customizing을 참조하세요.
Options:
-v, --verbose Show failed and errored tests in the output
-s, --services TEXT Only test the given services instead of all
available services
-p, --profile TEXT The name of the AWS profile to scan, if not
specified ENV vars will be used
-t, --custom-tests FILENAME location of custom tests YAML file. Read docs
for more info
-r, --regions TEXT A list of filters to match against regions,
i.e. "us", "eu-west", "ap-north-1"
--help Show this message and exit.
--region 및 --service에 대해 여러 인수가 지원되지만 매번 플래그와 함께 제공되어야 합니다. 예: cloudprivs aws -r us -r eu -s ec2 -s lambda. 저도 마음에 들지 않지만 Click의 한계로 아직 해결 방법을 찾지 못했습니다.
참고로
region플래그는 부분 일치를 지원하며, 가장 일반적인 인수는-r us -r eu로 공통 리전만 포함합니다.
결과는 리전별로 그룹화되어 표시되며 각 줄에는 테스트 케이스와 테스트 결과가 포함됩니다.
도구가 테스트 중 예상치 못한 오류를 만나면 발생하는 즉시 stderr로 출력되므로 출력 흐름을 방해할 수 있습니다. 오류를 보고 싶지 않으면 stderr를 리디렉션할 수 있습니다.
각 테스트 케이스를 수동으로 작성하는 WeirdAAL과 같은 다른 도구와 달리 CloudPrivs는 Boto3 SDK를 직접 쿼리하여 사용 가능한 모든 서비스와 각 서비스의 모든 리전 목록을 동적으로 생성합니다.
전체 목록이 생성되면 기본적으로 각 함수가 인수 없이 호출되지만, 작업별로 사용자 정의 인수를 추가하는 옵션이 지원됩니다(#Customizing에서 자세한 정보).
참고: 일부 AWS 함수를 호출하면 비용이 발생할 수 있습니다. 우발적인 비용을 완화하기 위해
get_,list_,describe_로 시작하는 작업만 허용했으며, 이는 제 테스트에서 안전해 보였지만 주의해서 사용해 주십시오. enumerate-iam과 같은 다른 도구에서도 안전해 보이지만, 이러한 함수를 (인수 없이) 호출할 때 우발적인 비용이 발생하지 않을 것이라고 보장하지는 않습니다.
CloudPrivs는 두 가지 영역에서 쉬운 확장/사용자 정의를 지원합니다:
새 제공자(예: GCP)를 구현하는 것은 간단합니다.
CloudPrivs/providers 폴더 아래에 제공자에 대한 새 폴더를 만듭니다(예: 'gcp').CloudPrivs/providers/__init__.py 파일에서 제공자를 __all__ 변수에 추가합니다. 이는 폴더 이름과 일치해야 합니다.cli.py 파일을 만듭니다.cli로 지정합니다(참조: AWS 제공자).cloudprivs <provider>를 실행하면 CLI가 표시됩니다.AWS 제공자는 AWS 함수 호출 시 인수 주입을 지원합니다. 이 기능은 AWS 함수가 호출에 인수를 필요로 하는 경우가 많고, 어떤 경우에는 이러한 인수가 고정 변수일 수 있기 때문에 제공됩니다. 즉, 더미 변수를 제공하면 테스트 범위를 늘릴 수 있습니다. 다른 경우에는 dryrun=true와 같은 인수를 주입하여 호출 속도를 높일 수 있습니다.
사용자 정의 테스트는 cloudprivs/providers/aws/CustomTests.yaml의 YAML 파일에 저장됩니다.
YAML의 구조는 다음과 같습니다:
---
<service-name>:
- <function-name>:
args:
- <arg1>
- <arg2>
kwargs:
arg1: val1
arg2: val2
참고: 함수 이름은 부분 일치로 작동합니다. 즉, 'describe_'와 같은 함수 이름을 사용하면 지정된 인수가 'describe_'를 포함하는 모든 함수에 주입됩니다. 규칙은 '첫 번째 발견' 기준으로 일치하므로 일반 규칙을 재정의하려면 더 구체적인 규칙을 일반 규칙 위에 배치하세요. 예:
ec2:
- describe_instances
args:
kwargs:
DryRun: True
NoPaginate: True
- describe_
args:
kwargs:
DryRun: True
새 규칙은 기존 CustomTests.yaml 파일을 수정하거나 새 YAML 파일을 만들고 --custom-tests 플래그로 지정하여 추가할 수 있습니다. 새 파일은 기존 테스트 파일과 병합되며 중복 값은 제공된 파일이 우선 적용되어 재정의됩니다.
AWS 제공자는 다른 도구에 통합하기 위한 라이브러리로 작성되었습니다. 다음과 같이 사용할 수 있습니다:
import boto3
from cloudprivs.providers.aws import service
from concurrent.futures import ThreadPoolExecutor
session = boto3.Session('default')
with ThreadPoolExecutor(15) as executor:
iam = service.Service('iam', session, executor=executor)
scan_results = iam.scan() # will cover all regions listed in the executor (all available regions by default)
formatted_results iam.pretty_print_scan(scan_results)
print(formatted_results)
모든 것이 코드에 완전히 문서화되어 있어 파싱하기 매우 쉬울 것입니다.
이 도구는 기능적이지만 완성과는 거리가 멉니다. 새로운 기능을 적극적으로 개발 중이며 기여를 환영합니다. 자유롭게 이슈/기능 요청을 열고 PR을 보내주세요.
계획된 기능