brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Sep 24. 2023

37탄-5. AWS - 웹 취약점보기, 테스트 환경

<1> 웹서버 취약점 동영상 미리 보기

<2> 웹보안 DVWA 테스트 환경 구축 - 실습




<1> 웹서버 취약점 동영상 미리 보기


1

https://youtu.be/laQAQeuuJF4?si=YJfdjUnCmOPnAtKV


2

https://youtu.be/qzas_-u4Nxk


3

https://youtu.be/bSGqBoZd8WM?si=PlnlxWrBhlfqn5fv




<2> 웹보안 DVWA 테스트 환경 구축 - 실습


DVWA에서 다운 받아 취약한 웹서버 만들자

공격서버도 만들자.

공격서버에서 공격해보자.



1

취약한 웹 서버 만들자

DVWA ( Damn Vulnerable Web Application) : Apache(Web) + PHP + DB(Mysql or MariaDB) - Github Container

https://github.com/digininja/DVWA

https://github.com/digininja/DVWA/pkgs/container/dvwa 



2

취약점 공유

OWASP The Open Web Application Security Project - 링크 

K8S Top Ten - 링크 Github


https://owasp.org/www-project-top-ten/ 

https://owasp.org/www-project-kubernetes-top-ten/

https://github.com/OWASP/www-project-kubernetes-top-ten  



3

크롬 확장프로그램 Browsec VPN 설치

https://chrome.google.com/webstore/detail/browsec-vpn-free-vpn-for/omghfjlpggmjjaagoclmmobgdodcjboh  



4

Cloudformation으로 기본 환경 구축 

AWS console login


https://console.aws.amazon.com/console/home



Cloudformation으로 기본 환경 구축 


Ec2를 배포하므로 pem키 필요. 

아래 클릭

https://ap-northeast-2.console.aws.amazon.com/cloudformation/home?region=ap-northeast-2#/stacks/create?stackName=mywaf&templateURL=https:%2F%2Fs3.ap-northeast-2.amazonaws.com%2Fcloudformation.cloudneta.net%2Fsecurity%2Fahss-waf.yaml 


또는


Download

curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/security/ahss-waf.yaml 


CF파일 다운로드 사이트

https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/security/ahss-waf.yaml  



// 아래 파일 내용중 , ALB 보안그룹의 IP를  개인 IP 로 변경 필요

예)   110.1.1.100/32   나의 IP로 변경 후 배포 필요


나의 IP확인

https://www.findip.kr/






설정 내용


Parameters:

 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

     :

 

  ALBSG:

    Type: AWS::EC2::SecurityGroup

    Properties:

      GroupDescription: ELB Security Group

      VpcId: !Ref MyVPC

      Tags:

        - Key: Name

          Value: ELB-SG

      SecurityGroupIngress:

      - IpProtocol: tcp

        FromPort: '80'

        ToPort: '80'

        CidrIp: 0.0.0.0/0    //   배포후  본인의 IP로 변경 필요  110.1.1.100/32

      - IpProtocol: tcp

        FromPort: '443'

        ToPort: '443'

        CidrIp: 0.0.0.0/0    //   배포후  본인의 IP로 변경 필요  110.1.1.100/32

  ALBTG:

    Type: AWS::ElasticLoadBalancingV2::TargetGroup

    Properties:

      Name: ALBTG

      Port: 80

      Protocol: HTTP

      HealthCheckPath: '/login.php'

      VpcId: !Ref MyVPC

      Targets:

        - Id: !Ref MYEC2

          Port: 80

      TargetGroupAttributes:

      - Key: stickiness.enabled

        Value: 'true'

      - Key: stickiness.type

        Value: lb_cookie

      - Key: stickiness.lb_cookie.duration_seconds

        Value: '180'

  MyALB:

    Type: AWS::ElasticLoadBalancingV2::LoadBalancer

    Properties:

      Scheme: internet-facing

      Name: My-ALB

      SecurityGroups:

        - !Ref ALBSG

      Subnets:

        - !Ref MyPublicSN

        - !Ref MyPublicSN2

  ALBListener:

    Type: AWS::ElasticLoadBalancingV2::Listener

    Properties:

      DefaultActions:

        - Type: forward

          TargetGroupArn: !Ref ALBTG

      LoadBalancerArn: !Ref MyALB

      Port: 80

      Protocol: HTTP

  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: 10.0.0.20/32

      - IpProtocol: tcp

        FromPort: '80'

        ToPort: '80'

        SourceSecurityGroupId : !GetAtt ALBSG.GroupId

  MySG2:

    Type: AWS::EC2::SecurityGroup

    Properties:

      GroupDescription: WEB Security Group

      VpcId: !Ref MyVPC

      Tags:

        - Key: Name

          Value: My-SG2

      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

      - IpProtocol: tcp

        FromPort: '4280'

        ToPort: '4280'

        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: DVWA

      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 DVWA

            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

            amazon-linux-extras install epel -y

            yum update -y

            yum install -y tree git htop jq httpd mariadb-server mariadb php php-mysql php-gd

            systemctl start mariadb httpd && systemctl enable httpd mariadb

            amazon-linux-extras install php8.2 -y

            # Configure mariadb

            echo -e "\n\nqwe123\nqwe123\ny\nn\ny\ny\n" | /usr/bin/mysql_secure_installation

            mysql -uroot -pqwe123 -e "create database dvwa; GRANT ALL PRIVILEGES ON dvwa.* TO 'dvwa'@'localhost' IDENTIFIED BY 'qwe123'; flush privileges;"

            # Install DVWA

            git clone https://github.com/digininja/DVWA.git

            mv DVWA/* /var/www/html/

            cp /var/www/html/config/config.inc.php.dist /var/www/html/config/config.inc.php

            sed -i "s/p@ssw0rd/qwe123/g" /var/www/html/config/config.inc.php

            sed -i 's/allow_url_include = Off/allow_url_include = on/g' /etc/php.ini

            sed -i 's/display_errors = Off/display_errors = on/g' /etc/php.ini

            sed -i 's/display_startup_errors = Off/display_startup_errors = on/g' /etc/php.ini

            chmod 777 /var/www/html/hackable/uploads

            chmod 777 /var/www/html/config

            systemctl restart httpd

  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 MySG2

          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


Outputs:

  WebServerIP:

    Value: !GetAtt MYEC2.PublicIp

  AttackerIP:

    Value: !GetAtt MYEC22.PublicIp



 //   배포후  ALB 보안그룹을 수정하자  =  본인의 IP로 수정이 필요  110.1.1.100/32

본인의 IP만 DVWA 서버로 접속 되도록 하자.

admin / password로 아무나 접속해 로그온할수 있도록 되어 있어 수정이 필요하다.





5

생성 ?

DVWA EC2 생성 = 취약한 웹서버 생성 = 10번 ip = iam role가지고 있음.

공격자 ec2 생성 20번  IP

마리아 디비 생성 - Qwe123  사용

Alb -  스티키 옵션.

출력에  eip  확인 - 로그인 하세요.

Dvwa Ec2는  EC2 인스턴스 프로파일을 가지고 있다.  Aws cli 사용가능.  



6

생성 확인?

Dvwa ec2 로그인

Database 접속 확인. 

Var/www/html에 파일들이 들어가 있는것 확인



# mariadb 확인 : 계정(root / qwe123)

mysql -V

systemctl status mariadb

mysql -u root -pqwe123 -e "SHOW DATABASES;" 



# apache web 확인 & DVWA 웹 디렉터리 확인

httpd -v

systemctl status httpd

tree /var/www/html/ -L 1

tree /var/www/html/ -L 2 


# DVWA의 연결 DB 정보 확인

grep 'db_' /var/www/html/config/config.inc.php 


# php 정보 확인

php -v

php --ini 



aws s3 ls

된다.

# EC2 Instance Profile 확인 : AmazonS3ReadOnlyAccess  가지고 있다.



메타 데이터 확인

curl -s http://169.254.169.254/latest/meta-data/ ; echo


curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/IAMLabInstanceRole | jq 

//  메타데이터에서 AWS ACCESS-KEY , SECRET-KEY , 토큰 , EXPIRE 시간을 알수 있음.

// 보안에 취약함.


  "Code": "Success",

  "LastUpdated": "2023-09-25T09:11:39Z",

  "Type": "AWS-HMAC",

  "AccessKeyId": "ASF3RCB",

  "SecretAccessKey": "ayA+Us",

  "Token": "IQoJb3JpZ2luX2VjEGEaDmFwLW5vcnRoZWFzdC0yIkcwRQIhAKIBq2X9/wA4vOlJhT7BSqtDaE0jyUDuLULJelS9TyN7r3XbrmzsZ7zeKfF7/E2Y0M2rnSR+b/VmnfIqOmubWUevuaHwk+1yST6Xjc4L5nM4ct2jtC/vTCg=",

  "Expiration": "2023-09-25T15:46:27Z"




# 웹 접속 로그 실시간 확인

tail -f /var/log/httpd/access_log


tail -f /var/log/httpd/access_log | grep -v ELB-HealthChecker 



## 로그 확인

접속자 IP 주소 - - 접속 시간 - 요청 방식 - 요청 페이지 - 프로토콜 버전 - HTTP 응답 코드 - 전송 크기 - 접속 브라우저 도구

10.0.1.120 - - [10/Sep/2023:14:28:59 +0900] "GET /favicon.ico HTTP/1.1" 304 - "http://waf.gasida.link/1.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"   



6

별도 터미널로 실시간 로그 감시 요망!   



7

Attacker 서버 로그인 설치 유틸 확인 ? 

히드라

도커 엔진 설치

도커 컴포즈도 설치됨 

도커 컴포즈에 러닝해서 바로 접속 됨 - 4280 

도커 컴포즈로도 DVWA 설치 가능 - 참고만 하세요.  


#

hydra

docker info

docker-compose version 



8

# (참고) docker-compose 로 DVWA 설치 가능하다.

여기서는 사용하지 않는다.  아래 출력 웹 접속 하여 설치 가능.


git clone https://github.com/digininja/DVWA.git

cd DVWA

docker-compose up -d

docker ps

docker-compose ps

docker images

docker-compose images

docker exec -it dvwa-dvwa-1 ps -ef

docker exec -it dvwa-db-1 mysql -V

echo -e "http://$(curl -s ipinfo.io/ip):4280" 


## 삭제 시

docker-compose down    




9

동작은 ? 

ALB ---DVWA  웹서버  구성이다.


DVWA 서버로 직접 접속은 안됨.

Alb로는 접속 됨. 


DVWA 서버에 보안그룹의 소스를 alb sg를 사용함.

 

Console에서 확인

웹서버 보안 그룹 확인

웹서버 보안그룹의 소스가 ALB 보안 그룹이다.

그래서, ALB를 통해서는 접속이 되나,  웹서버로 직접 접속은  안된다.


웹서버 보안그룹을 확인하면,  sg-0f에서만 80 접속 가능하다.



ALB 보안 그룹 이름

sg-0f



보안그룹 공부


출처

https://gasidaseo.notion.site/ACL-LabGuide-7cb671ce353148c08e7ddd7b293f4931#ff1853c715034c10909c180b91f3cfb0    




10

DVWA EC2

 : 접속자 액세스 로그 확인 → XFF 로깅 설정  


# 실시간 웹 접속 로그 : "ELB-HealthChecker/2.0" 접속자는 누구인가?

tail -f /var/log/httpd/access_log

tail -f /var/log/httpd/access_log |grep -v "ELB-HealthChecker/2.0" 


# (옵션) apache2 에 XFF 설정으로 ALB - Web 접속 시 Client IP 확인



11

## Apache 기본 로그 설정 변경 : 196번째(196 입력 후 Shift+G) 줄에 %{X-Forwarded-For}i 추가


vim /etc/httpd/conf/httpd.conf

 LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

 ESC -> :q -> 엔터로 저장하고 빠져나오기 


## HTTP 다시 로드 : reload 와 restart 차이는?

systemctl reload httpd 


# 실시간 웹 접속 로그

tail -f /var/log/httpd/access_log |grep -v "ELB-HealthChecker/2.0"  




12

ALB 도메인 확인

ALB 도메인으로 웹 접속하기

사용자 공인 IP가 찍힌다.


110.12.81.248 10.0.1.218 - - [25/Sep/2023:21:24:49 +0900] "GET /favicon.ico HTTP/1.1" 200 1406 "http://my-alb-547735861.ap-northeast-2.elb.amazo                                                                      naws.com/login.php" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"



13

도메인 소유한 멤버일 경우 → ALB도메인을 Route53에서 설정

www  A레코드

트래픽 라우팅 대상 : Application 

아시아 태평양(서울) >   레코드 선택  > 레코드 생성



www 도메인으로 접속


admin

password




14

디비 만들어 실습환경 준비하자

Setup/Reset DB > Create / Reset Database 버튼 클릭

이제 디비가 준비되었다.




다음은 웹 공격 하기

https://brunch.co.kr/@topasvga/3446



주말 CloudNet  스터디 내용 참고하여  정리한 부분입니다.

https://gasidaseo.notion.site/gasidaseo/CloudNet-Blog-c9dfa44a27ff431dafdd2edacc8a1863  



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari