[시나리오]

공격자는 IAM 사용자 Chris가 Lambda 액세스 권한이 있음을 발견하고 관리자 권한을 획득하여 모든 리소스에 액세스할 수 있다.

 

1) 실습 환경 구성

먼저, cloudgoat 폴더에서 lambda_privesc을 생성했고, 명령이 잘 실행되면 Apply Complete가 출력된다.

AWS 콘솔 확인해보면 chris-lambda_privesc_~~ 잘 생성된 것을 확인할 수 있다.

 

2) Chris 계정 등록

start.txt 파일을 확인해보면 Chris의 AWS Key 값을 획득할 수 있고, 이를 이용하여 Chris 계정을 등록해주었다.

 

3) 정책과 버전 확인

list-attached-user-policies를 통해 Chris 계정의 정책명과 정책Arn을 확인할 수 있다.

list-policy-versions를 통해 정책 버전을 확인할 수 있고, v1 한 개만 존재하고 있다.

v1 버전을 자세히 확인해보면 sid가 chris로 되어 있으므로 현재 사용자에 대한 정책이라는 것을 알 수 있다.

허용된 Action 중 sts:AssumeRole 부분이 있는데, 이는 일반적으로 접근할 수 없는 리소스에 접근할 수 있도록 일시적으로 보안 자격을 주는 API이다.

 

4) 역할 확인

$ aws iam list-roles --profile 계정명

list-roles 명령어로 특정 경로에서 가지게 되는 IAM 역할들을 확인할 수 있다.

AWSServiceRoleForSupport
AWSServiceRoleForTrustedAdvisor
cg-debug-role
cg-lambdaManager-role

sid가 ""로 되어 있는 것은 현재 사용자인 Chris를 가리키므로 Chris에게 cg-debug-role과 cg-lambdaManager-role 역할이 주어져있다는 것을 의미한다.

 

$ aws iam list-attached-role-policies --role-name 역할명 --profile 계정명

list-attached-role-poicies 명령을 통해 각 역할의 정책들을 확인해볼 수 있다.

 

$ aws iam get-policy-version --policy-arn 정책명 --version-id 버전 --profile 계정명

AdministratorAccess 정책을 확인해보면 모든 권한을 허용하고 있는 것을 확인할 수 있다.

해당 정책을 사용하는 역할을 수행할 때 일시적으로 관리자 권한을 획득하는 공격을 수행할 수 있을 것이다.

lambdaManager 정책을 확인해보면 Action 중 iam:PassRole 부분이 있는데, 이는 lambda 함수를 통해 역할을 전달할 수 있으며 lambda에 대한 모든 작업을 수행할 수 있게 해준다. 즉, lambdaManager 역할을 통해 권한 상승을 할 수 있게 된다.

 

5) 역할 부여

$ aws sts assume-role --role-arn 정책명 --role-session-name 역할명 --profile 계정명

assume-role 명령을 이용하여 lambdaManager 역할에 일시적으로 권한 상승을 할 수 있도록 자격을 부여한다.

즉, lambdaManager는 관리자만이 접근할 수 있는 리소스들에 접근할 수 있는 자격을 일시적으로 갖게 된다.

위에서 얻은 키값, 세션값들을 .aws/credentials 파일에 추가해준다.

 

6) lambda 함수 생성 및 실행

위와 같이 chris-lambda_privesc_~ 사용자에게 AdministratorAccess 정책을 연결해주는 lambda 함수를 생성한다.

위 코드를 압축한 후 이를 이용하여 lambda 함수를 생성해준다.

이때 lambdaManager 역할을 수행하는 계정을 이용하고, region은 us-east-1로 해주었다.

invoke 명령을 이용하여 함수를 실행할 수 있고, StatusCode가 200으로 잘 출력되는 것을 확인할 수 있다.

 

7) 공격 수행

Chris 계정을 확인해보면 관리자 권한이 포함된 AdministratorAccess 정책이 잘 추가되어 있는 것을 확인할 수 있다.

Chris 계정을 이용하여 새로운 사용자 생성을 시도했고, 콘솔에서 확인해보면 잘 추가되어 있는 것을 볼 수 있다.

'CLOUD CLUB > CloudGoat' 카테고리의 다른 글

vulnerable_lambda  (0) 2024.03.21
iam_privesc_by_rollback  (0) 2024.03.12
CloudGoat  (0) 2024.03.11

1. 환경설정

1) Python : 3.6 이상

2) Terraform : 0.14 이상

$ sudo apt-get update
$ sudo apt-get install -y gnupg software-properties-common
$ wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor
$ sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg

$ echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
$ sudo tee /etc/apt/sources.list.d/hashicorp.list
$ sudo apt update
$ wget https://releases.hashicorp.com/terraform/1.4.5/terraform_1.4.5_linux_amd64.zip

$ unzip terraform_1.4.5_linux_amd64.zip
$ sudo mv terraform /usr/local/bin/

 

3) AWS CLI

$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install

 

4) jq

$ sudo apt-get install jq

 

5) cloudgoat 

$ git clone https://github.com/RhinoSecurityLabs/cloudgoat.git
$ cd cloudgoat
$ pip3 install -r ./core/python/requirements.txt
$ chmod u+x cloudgoat.py

$ ./cloudgoat.py config profile # AWS profile : cloudgoat
$ ./cloudgoat.py config whitelist --auto

 

6) IAM 사용자 추가

위와 같이 IAM 사용자 추가한 후 보안 자격 증명에서 액세스 키 만들기 (CLI)

$ aws configure --profile cloudgoat
# 위에서 발급받은 Access Key, Secret Access Key 입력

$ ./cloudgoat.py config profile
$ ./cloudgoat.py config whitelist --auto

 

 

2. iam_privesc_by_rollback

[시나리오]

- IAM 사용자 "Raynor"은 제한된 권한을 가짐

- 공격자는 "Raynor"의 권한을 분석하고 SetDefaultPolicyVersion 권한을 확인

- 정책 버전 검토 결과 한 버전이 전체 관리 권한을 제공함을 발견

- 전체 관리자 권한을 얻어 Raynor 외의 임의 계정 생성하는 등 악의적 작업 수행 가능 

 

1) iam_priversc_by_rollback 실습 환경 구성

먼저, cloudgoat 폴더에서 iam_priversc_by_rollback을 생성했고, 명령이 잘 실행되면 Apply Complete가 출력된다.

AWS 콘솔 확인해보면 raynor-iam_priversc_by_rollback- 이 잘 생성된 것을 확인할 수 있다.

 

2) raynor 계정 등록

해당 폴더에서 ls로 조회해보면 관련 config 파일들을 확인할 수 있다.

그 중 start.txt 파일을 확인해보면 raynor의 AWS Key 값을 획득할 수 있다.

위에서 획득한 Key 값을 이용하여 raynor 계정 등록을 진행해주었다.

$ aws iam get-user --profile 계정명

위와 같이 get-user 명령을 사용하여 raynor 계정의 프로파일을 확인할 수 있다.

Arn 정보를 통해 aws의 iam 정책을 사용 중인 것을 알 수 있다.

 

3) 정책과 버전 확인

$ aws iam list-attached-user-policies --username 사용자명 --profile 계정명

list-attached-user-policies를 통해 raynor 계정의 정책명과 정책Arn을 확인할 수 있다.

$ aws iam list-policy-version --policy-arn 정책arn --profile 계정명

위 명령어를 통해 IAM의 정책 버전을 확인할 수 있다.

5개의 정책 버전 중 v1의 IsDefaultVersion이 true로 취약점이 발견되었다.

 

4) 취약한 버전 확인

$ aws iam get-policy-version --policy-arn 정책arn --version-id v1 --profile 계정명

get-policy-version 명령으로 v1 정책을 확인해보면 iam:SetDefaultPolicyVersion이 모든 리소스에 대해 허용되어 있는 것을 확인할 수 있다.

IAM JSON 정책은 특정 작업의 허용 또는 거부의 값을 지정하는데, v2의 경우 Deny로 지정되어 있었다.

v5의 경우 Allow로 지정되어 있었고, 즉 모든 리소스에 대한 접근을 허용하고 있다.

 

5) 공격 수행

$ aws iam set-default-policy-version --policy-arn 정책arn --version-id 버전 --profile 계정명

raynor 계정에서 모든 정책을 허용하고 있는 v5 정책을 사용하기 위해 set-default-policy-version 명령을 수행하여 v5 정책을 지정해준 후

create-user 명령을 이용하여 iamtest라는 계정 생성을 시도했다.

AWS 콘솔에서 확인해보면 위와 같이 iamtest라는 계정이 생성되어 있는 것을 확인할 수 있다.

'CLOUD CLUB > CloudGoat' 카테고리의 다른 글

vulnerable_lambda  (0) 2024.03.21
lambda_privesc  (0) 2024.03.14
CloudGoat  (0) 2024.03.11

※ 컨테이너 띄울 때 고정 IP 추가해서 실행시키기

send-host에서 진행 (여기서 send-host가 프론트 리버스프록시 서버)

# 각 컨테이너에서 진행
# apt update
# apt install nano -y
# apt install systemctl
# nano /etc/nginx/nginx.conf

http { } 안에 위 코드 추가

만약 위 코드 작성 후 접속 실패 시 해당 파일의 맨 마지막 줄 지워주기

# systemctl reload nginx
# systemctl restart nginx.service
# systemctl status nginx.service

 

 

※ 전체적인 토폴로지 구성

 

external-net을 sendhost(프론트) 컨테이너에 연결

ifconfig로 확인해보면 172.21(external) 대역이 잘 추가된 것을 확인할 수 있다.

 

 

1. nginx 인스턴스 생성

# 필요한 패키지 설치
# apt-get update
# apt-get install -y curl gnupg2 ca-certificates lsb-release

# ubuntui-keyring 패키지 설치
# apt-get install -y ubuntu-keyring

# nginx.list 파일 생성
# curl -s https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null
# 다운로드 키 올바른지 확인
# gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

# 저장소 설정 (안정 버전)
# echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
# apt-get update

# nginx 설치
# apt-get update
# apt-get install -y nginx
# nginx -v
# systemctl start nginx

위와 같이 잘 접속되는 것을 확인할 수 있다.

 

 

2. 로드밸런싱 하도록 엔진엑스 설정 바꾸기

 

 

 

 

 

 

 

 

 

 

'네트워크캠퍼스 > JENKINS' 카테고리의 다른 글

로드밸런싱  (1) 2024.02.27
Jenkins를 활용한 무중단배포  (0) 2024.02.26
ssh 설정 및 배포 파이프라인 초기 구축  (0) 2024.02.23
Jenkins 환경설정  (0) 2024.02.23

# apt update
# apt install openssh-server
# apt install nano
# nano -l /etc/ssh/sshd_config  # 14, 38, 57라인 주석해제
# service ssh restart
# apt install openjdk-17-jdk -y
# apt install vim -y

무중단 배포를 위한 여러 서버를 생성하기 위해 위와 같은 절차를 수행한다.

Home > Manage Jenkins > System에서 위와 같이 jenkins-worker2를 추가해준다.

또한, stress_test_deploy의 설정에서 jenkins-worker2를 추가해준다. Exec command에는 jenkins-worker에서 작성했던 구문을 넣어준다.

 

 

 

 

 

 

 

 

'네트워크캠퍼스 > JENKINS' 카테고리의 다른 글

로드밸런싱  (1) 2024.02.27
nginx를 이용한 리버스 프록시  (0) 2024.02.27
ssh 설정 및 배포 파이프라인 초기 구축  (0) 2024.02.23
Jenkins 환경설정  (0) 2024.02.23

+ Recent posts