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_ip과 giga_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를 마칩니다.
수고하셨습니다 :)



