Home
home

P2 섹션 12 - 웹 취약점 점검 - AWS WAF

1. 기본 환경 구성

이번 실습은 IAM 사용자 계정을 통해 관리 콘솔에 접근하고 액세스 키를 활용해 awscli 도구를 사용합니다.
해당 작업을 수행하지 않았다면 아래 토글을 확장해 작업을 선행하고 본격적인 실습에 들어갑니다.
IAM 사용자 생성 및 액세스 키 생성

1.1. Terraform을 통한 기본 인프라 배포

Terraform을 통한 기본 인프라 배포에 앞서 SSH 키 페어, IAM User Access Key ID, IAM User Secret Access Key를 미리 확인하고 메모해 둡니다.
Terraform으로 기본 인프라 배포
cd cnasg_class_tf/Section12
Bash
복사
# 실습 코드 경로 진입
export TF_VAR_KeyName=[각자 ssh keypair] export TF_VAR_NickName=[각자 닉네임] export TF_VAR_MyIamUserAccessKeyID=[각자 iam 사용자의 access key id] export TF_VAR_MyIamUserSecretAccessKey=[각자 iam 사용자의 secret access key] export TF_VAR_SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32
Bash
복사
# Terraform 환경 변수 저장
terraform init terraform plan
Bash
복사
# Terraform 배포
nohup sh -c "terraform apply -auto-approve" > create.log 2>&1 &
Bash
복사
Note:  Terraform 배포가 완료되면(약 5분 정도 대기) 정상적으로 자원 생성이 되었는지 확인을 합니다.(cat create.log)
실수로 Terraform 환경 변수를 설정하지 않은 상태에서 nohup으로 실행하면, terraform 에러가 발생해도 프로세스가 종료되지 않고 계속 점유될 수 있습니다.
이 경우 terraform 프로세스를 강제로 종료한 뒤, 환경 변수를 설정하고 다시 실행해야 합니다.
ps aux | grep -i terraform kill -9 <terraform_PID>
Bash
복사
# terraform 프로세스 강제 종료

1.2. 기본 정보 확인 및 설정

Terraform 배포가 완료 후 출력되는 Outputs 정보에서 lab_admin_ipgiga_coffee_ip의 퍼블릭 IP를 확인합니다.
대상 IP로 인스턴스에 SSH로 접속하고 아래 명령어를 통해 정보를 확인합니다.
LAB-ADMIN
기본 정보 확인
echo ${AWS_DEFAULT_REGION} echo ${ACCOUNT_ID}
Bash
복사
# 변수 확인
aws sts get-caller-identity
Bash
복사
# caller id 확인
Note:  인스턴스가 생성되고 너무 빠르게 접속하면 aws 자격 증명이 완료되지 않을 수 있습니다.
그럴 경우에는 약간의 대기 후 다시 접속해 주세요.
대상 그룹 모니터링
export TG_ARN=$(aws elbv2 describe-target-groups \ --names giga-coffee-tg \ --query 'TargetGroups[0].TargetGroupArn' \ --output text) echo $TG_ARN
Bash
복사
# ALB 대상 그룹의 ARN 변수 선언
while true do STATUS=$(aws elbv2 describe-target-health \ --target-group-arn $TG_ARN \ --query 'TargetHealthDescriptions[0].TargetHealth.State' \ --output text) echo "$(date '+%H:%M:%S') - $STATUS" [ "$STATUS" = "healthy" ] && break sleep 5 done echo echo "Target Group Healthy!"
Bash
복사
# ALB 대상 그룹의 상태 확인 (반복문)
대상 그룹에 속한 GIGA-COFFEE에게 TCP 18080 포트로 Health Check를 수행합니다.
하지만 현재 대상 포트의 웹 애플리케이션이 동작하지 않아 Unhealthy 상태를 유지합니다,
GIGA-COFFEE
실습용 웹 애플리케이션 실행 및 접근
cd giga-coffee
Bash
복사
# 웹 애플리케이션 실행
python3 app.py
Bash
복사
대상 그룹 상태 모니터링이 Healthy 상태로 전환되면 브라우저에서 웹 애플리케이션에 접근합니다.
http://$giga_alb_dns:18080 ← ALB DNS 주소는 출력된 terraform output 정보를 활용

2. 취약점 공격 및 WAF 보안 설정

2.1. SQL Injection 공격

SQL Injection 공격을 시연하고 AWS WAF 보안 설정으로 방어합니다.
GIGA-COFFEE-WEB
SQL Injection 공격
메뉴 조회 ⇒ 메뉴 ID 입력란
1
Bash
복사
# 정상 입력
1 OR 1=1
Bash
복사
# SQL Injection 공격
-1 UNION SELECT 999,'물',999999
Bash
복사
1 UNION SELECT 999,sqlite_version(),0
Bash
복사
-1 UNION SELECT 1,name,1 FROM sqlite_master WHERE type='table'
Bash
복사
-1 UNION SELECT id,username,password FROM users
Bash
복사
WAF-CONSOLE
[AWS WAF] Web ACL 생성
WAF 및 Shield ⇒ AWS WAF ⇒ 보호 팩(웹 ACL) → 보호 팩(웹 ACL) 생성
앱에 대한 정보 제공
앱 카테고리: 기타
앱 포커스:
보호할 리소스 선택
리소스 추가리전별 리소스 추가 → giga-coffee-alb (선택) → 추가
초기 보호 기능 선택
직접 구축 (선택)
규칙 추가취소>
이름 및 설명
이름: giga-coffee-waf
보호 팩(웹 ACL) 생성
[AWS WAF] SQL Injection 규칙 추가
보호 팩(웹 ACL) ⇒ giga-coffee-waf ⇒ (작업) 규칙 관리 ⇒ 규칙 추가 ⇒ AWS 관리형 규칙 그룹 → 다음
무료 → SQL database (선택)
세부 정보버전 → 기본값(Version_1.3 사용)
검사: 일치 문
요청이 다음과 같은 경우: 문과 일치
검사: URI 경로
일치 유형: 문자열 포함
일치시킬 문자열:
/lookup
Bash
복사
규칙 재정의모든 규칙 작업 재정의Count
규칙 추가
SQL Injection 공격 [성공] ⇒ 대시보드 & 샘플링된 요청(대시보드)
[AWS WAF] SQL Injection 규칙 수정
규칙 관리 ⇒ AWS-AWSManagedRulesSQLiRuleSet (선택)
규칙 재정의모든 규칙 작업 재정의Block
규칙 저장
SQL Injection 공격 [403 Forbidden] ⇒ 샘플링된 요청(대시보드)

2.2. XSS 공격

XSS(Cross Site Scripting) 공격을 시연하고 AWS WAF 보안 설정으로 방어합니다.
GIGA-COFFEE-WEB
XSS 공격
고객 리뷰 ⇒ 리뷰 입력란
좋아요~!
Bash
복사
# 정상 입력
<script>alert('XSS Attack')</script>
Bash
복사
# XSS 공격
<script> alert(navigator.userAgent) </script>
Bash
복사
<script> alert(document.cookie) </script>
Bash
복사
<script> document.querySelector('header h1').innerText='GIGA COFFEE HACKED 😜🤪'; document.querySelector('header h1').style.color='red'; document.querySelector('header p').innerText= 'This website has been compromised'; document.body.style.background='#111'; document.body.style.color='red'; </script>
Bash
복사
GIGA-COFFEE 인스턴스에서 reviews db 삭제
sqlite3 giga.db "DELETE FROM reviews;"
Bash
복사
⇒ 이후에 app.py를 다시 실행합니다.
WAF-CONSOLE
[AWS WAF] XSS 규칙 추가
규칙 관리 ⇒ 규칙 추가 ⇒ AWS 관리형 규칙 그룹 → 다음
무료 → Core rule set (선택)
세부 정보버전 → 기본값(Version_1.21 사용)
검사: 일치 문
요청이 다음과 같은 경우: 문과 일치
검사: URI 경로
일치 유형: 문자열 포함
일치시킬 문자열:
/review
Bash
복사
규칙 재정의모든 규칙 작업 재정의Allow
CrossSiteScripting_* (4개) → Block
규칙 추가
XSS 공격 [403 Forbidden] ⇒ 샘플링된 요청(대시보드)

2.3. Backdoor 공격

Backdoor 공격을 시연하고 AWS WAF 보안 설정으로 방어합니다.
echo "<?php // GIGA COFFEE backdoor upload test file ?>" > backdoor.php
Bash
복사
# [각자 PC] backdoor.php 파일 생성
GIGA-COFFEE-WEB
Backdoor 공격
고객 리뷰 ⇒ 파일 업로드
이미지 파일 업로드
Bash
복사
# 정상 입력
backdoor.php 파일 업로드
Bash
복사
# backdoor.php 업로드 및 Web Shell 공격
http://$TARGET/uploads/backdoor.php?cmd=ls%20-al
Bash
복사
http://$TARGET/uploads/backdoor.php?cmd=tree
Bash
복사
WAF-CONSOLE
[AWS WAF] Backdoor 웹셸 규칙 추가
규칙 관리 ⇒ 규칙 추가 ⇒ 사용자 지정 규칙 → 다음 → 사용자 지정 규칙 → 다음
작업: Block
규칙 이름: uploads_uri_block
요청이 다음과 같은 경우: 모든 문과 일치(AND)
검사: URI 경로
일치 유형: 문자열로 시작
일치 시킬 문자열:
/uploads/
Bash
복사
검사: URI 경로
일치 유형: 정규 표현식과 일치
정규 표현식:
^/uploads/.*\.(jpg|jpeg|png|gif)$
Bash
복사
텍스트 변환: 소문자
규칙 구성문 부정(NOT) → 문 결과 부정 (체크)
규칙 추가
Backdoor 공격 [403 Forbidden] ⇒ 샘플링된 요청(대시보드)

2.4. XXE 공격

XXE(XML External Entity) 공격을 시연하고 AWS WAF 보안 설정으로 방어합니다.
GIGA-COFFEE-WEB
XXE 공격
제휴 신청 ⇒ XML 문 입력창
<partner> <company>CloudNeta</company> <manager>홍길동</manager> <message>단체 주문 문의</message> </partner>
XML
복사
# 정상 입력
<?xml version="1.0"?> <!DOCTYPE partner [ <!ENTITY xxe SYSTEM "file:///root/giga-coffee/partner_api_key.txt"> ]> <partner> <company>GIGA Partner</company> <manager>attacker</manager> <message>&xxe;</message> </partner>
XML
복사
# XXE 공격
WAF-CONSOLE
[AWS WAF] XXE 규칙 추가
규칙 관리 ⇒ 규칙 추가 ⇒ 사용자 지정 규칙 → 다음 → 사용자 지정 규칙 → 다음
작업: Block
규칙 이름: xxe_block
요청이 다음과 같은 경우: 모든 문과 일치(AND)
검사: URI 경로
일치 유형: 문자열로 시작
일치 시킬 문자열:
/event
Bash
복사
검사: 본문
크기 초과 처리: 계속
일치 유형: 문자열 포함
일치시킬 문자열:
<!DOCTYPE
Bash
복사
텍스트 변환: URL 디코드
규칙 추가
XXE 공격 [403 Forbidden] ⇒ 샘플링된 요청(대시보드)

2.5. Path Traversal 공격

Path Traversal 공격을 시연하고 AWS WAF 보안 설정으로 방어합니다.
GIGA-COFFEE-WEB
Path Traversal 공격
쿠폰 다운로드 ⇒ 쿠폰 다운로드
쿠폰 다운로드
Bash
복사
# 정상 입력
http://$TARGET/coupon?file=../internal_coupon_plan.txt
Bash
복사
# Path Traversal 공격
WAF-CONSOLE
[AWS WAF] Path Traversal 규칙 추가
규칙 관리 ⇒ AWS-AWSManagedCommonRuleSet (선택)
검사: 일치 문
요청이 다음과 같은 경우: 문 중 하나 이상과 일치(OR) ← 변경
검사: URI 경로
일치 유형: 문자열 포함
일치시킬 문자열:
/coupon
Bash
복사
규칙 재정의
GenericLFI_* (3개) → Block
규칙 추가
Path Traversal 공격 [403 Forbidden] ⇒ 샘플링된 요청(대시보드)

2.6. Brute Force 공격

Brute Force 공격을 시연하고 AWS WAF 보안 설정으로 방어합니다.
curl -O https://raw.githubusercontent.com/cloudneta/ongja/refs/heads/main/password.txt curl -O https://raw.githubusercontent.com/cloudneta/ongja/refs/heads/main/bf-attack.py
Bash
복사
# [각자 PC] Brute Force 공격 파일 다운로드
Brute Force 공격
python3 bf-attack.py http://$TARGET
Bash
복사
# [각자 PC] Brute Force 공격
WAF-CONSOLE
[AWS WAF] Brute Force 규칙 추가
규칙 관리 ⇒ 규칙 추가 ⇒ 사용자 지정 규칙 → 다음 → 속도 기반 규칙 → 다음
작업: CAPTCHA
규칙 이름: bf_captcha
속도 제한: 15 → 평가 기간 : 1분
규칙 구성
요청 집계: 소스 IP 주소
검사 범위와 속도 제한: 규칙 명령문의 기준과 일치하는 요청만 고려하세요. (선택)
요청이 다음과 같은 경우: 문과 일치
검사: URI 경로
일치 유형: 문자열로 시작
일치 시킬 문자열:
/login
Bash
복사
면제 시간
이 규칙의 사용자 지정 면제 시간 설정 (체크)
300초
규칙 추가
Brute Force 공격 [실패] ⇒ 웹에서 로그인 시도 [Captcha] ⇒ 샘플링된 요청(대시보드)

2.7. Command Injection 공격

Command Injection 공격을 시연하고 AWS WAF 보안 설정으로 방어합니다.
GIGA-COFFEE-WEB
Command Injection 공격
관리자 도구관리자 로그인 ⇒ Ping 테스트 입력란
127.0.0.1
Bash
복사
# 정상 입력
127.0.0.1;whoami
Bash
복사
# Command Injection 공격
127.0.0.1;pwd
Bash
복사
127.0.0.1;ls
Bash
복사
WAF-CONSOLE
[AWS WAF] Command Injection 규칙 추가
규칙 관리 ⇒ 규칙 추가 ⇒ AWS 관리형 규칙 그룹 → 다음
무료 → POSIX operation (선택)
세부 정보버전 → 기본값(Version_3.2 사용)
검사: 일치 문
요청이 다음과 같은 경우: 문과 일치
검사: URI 경로
일치 유형: 문자열 포함
일치시킬 문자열:
/admin
Bash
복사
규칙 재정의모든 규칙 작업 재정의Block
규칙 추가
Command Injection 공격 [403 Forbidden] ⇒ 샘플링된 요청(대시보드)

2.8. Geo Match

일반 연결과 VPN 연결을 확인하고 AWS WAF 보안 설정으로 나라별 접근 제어를 수행합니다.
https://chromewebstore.google.com/detail/browsec-vpn-free-vpn-for/omghfjlpggmjjaagoclmmobgdodcjboh?hl=ko&pli=1
Bash
복사
# [각자 PC] Browsec 설치 (크롬 확장 도구)
WAF-CONSOLE
[AWS WAF] Geo Match 규칙 추가
규칙 관리 ⇒ 규칙 추가 ⇒ 사용자 지정 규칙 → 다음 → 지리 기반 규칙 → 다음
작업: Block
규칙 이름: geo_block
국가: Korea, Republic of - KR
규칙 구성
문 부정(NOT): 문 결과 부정 (체크)
오리진의 소스 IP 주소: 소스 IP 주소
규칙 추가
일반 접근 [OK] & VPN(네덜란드) 접근 [실패] ⇒ 샘플링된 요청(대시보드)

3. 실습 환경 삭제

WAF-CONSOLE
[AWS WAF] Web ACL 삭제
1.
ALB 연결 해제
AWS WAF ⇒ 보호 팩(웹 ACL) ⇒ giga-coffee-waf(선택) ⇒ (작업) 리소스 관리
giga-coffee-alb (선택)
연결 해제 (클릭)
연결 해제 (입력) ⇒ 연결 해제 (클릭)
2.
Web ACL 삭제
AWS WAF ⇒ 보호 팩(웹 ACL) ⇒ giga-coffee-waf(선택) ⇒ (작업) 보호 팩(웹 ACL) 삭제
삭제 (입력) ⇒ 삭제 (클릭)
Terraform 자원 삭제
nohup sh -c "terraform destroy -auto-approve" > delete.log 2>&1 &
Bash
복사
# terraform 자원 삭제
Note:  Terraform 자원 삭제가 완료되면(약 3분 정도 대기) 정상적으로 자원 삭제가 되었는지 확인을 합니다.(cat delete.log)
여기까지 섹션 12 실습 - 웹 취약점 점검 - AWS AWF를 마칩니다.
수고하셨습니다 :)