[SK shieldus Rookies 19기] 클라우드 기반 취약점 진단 및 대응 실무 8일차

기록하는짱구·2024년 5월 8일
0

SK Shieldus Rookies 19기

목록 보기
41/43
post-thumbnail

📌 취약점 진단

취약점 진단 소개

💡 공격 수행 시 사전 정보 보유 여부
있다 → 모의 해킹
없다 → 취약점 진단

모의 해킹취약점 진단
시나리오 기반취약점 별 항목 기반
블랙박스 기반 점검화이트박스 기반 점검
대상에 대한 정보 하나만을 가지고 공격 수행담당자에게 정보 요청
Zero Base → 공격수행담당자 정보 요청 → 정보수령 → 공격수행
동적 진단소스코드(정적) 진단
서비스 1개URL 1개
시간 소요 ↑
(최소 1개월-최대 3개월)
상대적으로 시간 소요 ↓
(짧으면 2-3일, 길면 일주일)

취약점 진단 과정

① 대상 서비스 정보 수집/획득

  • 계정 정보(ID/PW) - 관리자/사용자
  • 도메인 정보
  • 서비스 접근 정보
  • 서비스 구성도 및 아키텍처

② 환경 분석(서비스 분석)

  • 서비스 구조 및 동작 방식 파악
  • 인프라 및 애플리케이션 관련 정보 유추
  • 구성도 및 아키텍처 분석

💡 환경분석 목적
1. 제한된 시간에 효율적으로 취약점 진단을 하기 위함
2. 서비스에 대한 이해를 위함

③ 취약점 진단 수행

  • 회사별 자체 또는 KISA 보안 가이드 기반 항목 진단 수행(체크리스트) - 진단 수행(SK 표준/주요정보통신기반 시설)
  • 스크립트 활용(포트 스캔, 디폴트 페이지, 자동화 공격 등)
  • 진단자의 역량에 따라 식별되는 취약점 범위 및 깊이가 다양

④ 보고서 작성 및 취약점 리뷰

  • 식별된 취약점 정리 및 보고서 작성(양호/취약)
  • 담당자 보고서 전달 및 취약점 결과 리뷰

⑤ 취약점 조치 및 이행점검 수행

  • 조치된 취약점 이행점검 수행 및 보고서 작성
  • 보고서 기반으로 취약점 조치

취약점 항목

📌 취약점 진단 실습 - Burp Suite (WEB)

환경설정 및 실습환경 세팅

필수 설치

JDK 다운로드

Burp Suite 다운로드

픽픽 다운로드

회원가입 및 웹 취약점 교육 사이트 소개

PortSwigger

회원가입
웹 취약점 교육 사이트

Burp Suite 설정

💡 Operator
가장 많은 패킷을 잡고 싶을 경우 OR 옵션 사용
패킷에서 구체적인 부분으로 범위를 줄이고 싶을 경우 AND 옵션 사용

Proxy → HTTP history에서 패킷 필터 설정

Target → Scope에서 타켓 서버 설정

Prefix 부분에 정보를 얻고자 하는 URL 입력

암호화 통신을 하지 않을 가능성도 있으므로 https와 더불어 http도 함께 입력

설정의 프록시 서버 세팅

인증서 설치

http://burp/ 접속

CA certificate를 클릭하여 인증서 다운로드

인증서 파일을 열고 설치 클릭

로컬 컴퓨터 클릭 후 다음

신뢰할 수 있는 루트 인증 기관 선택

📌 XSS/CSRF 공격

특정 페이지나 기능에 악의적인 스크립트를 삽입하여 공격자가 의도한대로 행동하도록 하는 공격

결과

✅ 계좌 번호, 계정, 패스워드 등의 사용자 정보를 유출 및 탈취하는 피싱 공격
✅ 사용자 인증 도용
✅ 악성코드 유포 및 브라우저 무한 반복 등의 공격

공격(보안 진단) 포인트

✅ 사용자로부터 입력되어 들어오는 파라미터 값
Ex. 게시판 내용, 게시판 제목, 검색어 조건 등 사용자의 모든 입력 값

종류

Reflected XSS
✅ 사용자(웹 브라우저) → 서버 → 사용자(웹 브라우저) ▶ 공격 발생

DOM-Based XSS
✅ 서버를 거치지 않는 XSS
✅ 단독으로 수행 불가
✅ 사용자(웹 브라우저) → 정적 컨텐츠(JS)

Stored XSS
✅ 사용자(웹 브라우저) → 서버 → DB → 서버 → 사용자(웹 브라우저)
✅ 제 3자에게도 손쉽게 피해를 입힐 수 있어 가장 위험한 XSS
✅ DB(서버)에 악의적인 스크립트가 저장되어 지속적으로 호출될 수 있으므로 위험성 ↑

CSRF
✅ 공격자가 명확한 목적을 가지고 작성한 XSS 스크립트 구문을 활용하여 자동화한 XSS 공격
✅ 사용자(피해자)가 눈치채지 못하게 자동 공격 수행

대응 방안

최선 > 차선 > 차차선 적용

보안 대책

  1. 특수문자(<> () "' #) 필터링
  2. 키워드(script) 필터링
  3. 오픈소스 XXS 필터링 라이브러리 적용(Lucy-Filter, Anti-Samy)
  4. 보안 장비 내 XXS 필터링 정책 활용(WAF)
  5. Http Only 설정 / CSP(Content Security Policy)

실습 #1

Stored XSS 취약점 확인

블로그 내 포스트 확인

포스트 댓글 작성

댓글 작성 시 악의적 구문 삽입 후 저장 시도

댓글 저장 시 응답 패킷 확인

저장된 댓글 확인

응답 값 내 악의적 구문 필터링 없이 등록 확인

스크립트 실행 확인

실습 #2

DOM Based XSS 취약점 확인

💡 HTML 태그 문법 관련해서 참고 사이트

별도의 XSS 필터링이 존재하지 않음을 확인

검색창에 아무 값이나 입력해 Burp Suite로 Response 확인

검색창에 잘못된 값을 입력해 함수 호출

실습 #3

Reflected XSS(XSS 우회) 취약점 확인

script 구문의 필터링 여부 확인

검색창에 script 구문 입력 후 검색
상단은 필터링이 되고 있으나 하단은 필터링이 안되고 있는 것을 확인

검색창에 값 입력 후 Intercept on으로 전환하고 검색 버튼 클릭

검색창에 필터링 우회 값 삽입 후 Intercept Off

📢 웹 사이트는 특정 문자열 패턴을 찾아 필터링하거나 이스케이프하기 위해 <script> 태그를 찾아 처리하게 된다고 한다. 그러나 이런 처리가 완벽하게 되지 않았을 때 <script> 태그가 여러 개 연속으로 나타났다면 첫 번째 태그만 필터링하거나 이스케이프하고 나머지 태그를 놓치는 경우도 있을 수 있다고 한다.

실습 #4

Stored XSS 취약점 확인 및 CSRF 공격 구문 작성

💡 CSRF
웹 사이트 내 XSS 취약점을 이용하여 사용자가 의도하지 않는 요청을 송신하도록 하는 공격을 의미하며 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 하여 특정 웹 페이지를 보안에 취약하게 한다거나 수정, 삭제 등의 작업을 하게 만드는 공격 방법

My account를 클릭하여 로그인 창 접속

wiener와 peter를 각각 입력하여 로그인

My Account에 이메일 업데이트 기능이 있는 것을 확인

Home 버튼으로 메인 화면으로 돌아간 후 포스트 접속

이메일 변경

이메일을 변경하고 패킷 확인

Intercept on으로 변경 후 코멘트 입력

코멘트에 스크립트 구문 삽입

스크립트가 정상 실행되는 것을 보아 댓글에 스크립트 필터링이 제대로 되지 않고 있음을 알 수 있고 csrf 공격 구문의 삽입이 가능하다는 것도 확인 가능

csrf 공격 구문 작성

<script>
var req = new XMLHttpRequest();
req.addEventListener('load', handleResponse);
req.open('get','/my-account',true);
req.send();
function handleResponse() {
    var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
    var changeReq = new XMLHttpRequest();
    changeReq.open('post', '/my-account/change-email', true);
    changeReq.send('csrf='+token+'&email=test@test.com')
};
</script>

코멘트에 공격 구문 삽입 후 Intercept on

📢 XMLHttpRequest
JavaScript에서 HTTP 요청을 만들 수 있는 내장 브라우저 객체

📌 SQL Injection

OWASP Injection 공격 중 한 형태

특정 페이지나 기능 사용 시 입력 값에 대한 DB 쿼리 유효성 검증을 하지 않아 DB 쿼리가 조작되어 공격자가 의도한 대로 행동하도록 하는 공격

결과

✅ DB 내 주요 정보 유출
✅ DB 내 데이터 수정/삭제
✅ 인증 우회

공격(보안 진단) 포인트

✅ 게시판 view/write/edit 시 DB의 쿼리 문에 포함되는 파라미터 값
✅ 첨부 파일 다운로드 시 DB의 쿼리문에 포함되는 파라미터 값

종류

Boolean Based SQL Injection
✅ 쿼리 요청 시 응답 값의 참/거짓 반응을 통해 DB 결과 조회

Error Based SQL Injection
✅ 쿼리 실행 시 오류나 예기치 않은 예외 상황이 발생될 때 클라이언트 측에서 DB 정보가 노출되는 공격

Time Based SQL Injection
✅ DB 시간 관련 함수를 활용해 참과 거짓을 반응을 통해 DB 결과 조회

대응 방안

인자화된 질의문 사용
✅ 자바의 경우 prepared Statement 클래스와 하위 메소드 executeQuery(), execute(), executeUpdate() 사용

실습 #5

SQL Injection 취약점 확인 및 관리자(administrator) 계정으로 로그인

Injection 공격은 Repeater를 주로 사용
→ 변경사항이 많이 생기기 때문

아이디만 아는 상태이니 로그인은 당연히 실패

Injection 공격은 크게 두 가지 형태
여기서 SQL문은 주석으로 -- 대신 #을 넣을 수도 있음

① ' or 1=1--
② 'and 1=1--

쿼리문

SELECT * FROM users WHERE username='입력한_아이디' AND password='입력한_비밀번호'

SELECT * FROM users WHERE username='administrator' OR 1=1--' AND password='입력한_비밀번호'

① '%20or%20+1=1#

💡 %20은 공백문자를 의미

에러 발생

② '%20or%20+1=1--

로그인 성공

위의 결과로 추측 가능한 것

✔ 해당 서버는 # 필터링
✔ DBMS를 MySQL이 아닌 다른 sql을 사용 중

실습 #6

SQL Injection 취약점 확인 및 Blind SQL Injection 공격을 통해
관리자(administrator) 계정의 비밀번호 획득 후 로그인 시도

힌트

  1. Cookie 내부에 존재 → tracking cookie
  2. 테이블명 : users
  3. 컬럼명 : username / password
  4. 패스워드는 소문자로 구성(대문자 미존재)
  5. 목적 : administrator의 패스워드를 알아내라

sql 구문을 넣어도 정상 동작하지만 참인 경우에만 Welcome Back 문구가 뜸

AND (SELECT 'a' FROM users LIMIT 1)='a

users 테이블이 존재하는지 여부 확인

→ Welcome Back이 뜨므로 참

' AND (SELECT 'a' FROM users WHERE username='administrator')='a

user 테이블 안에 administrator 계정이 존재하는지 여부 확인

→ Welcome Back이 뜨므로 참

' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a

administrator 계정의 password 길이 확인

→ Welcome Back이 뜨므로 참

하지만 여기서 정확한 패스워드의 길이를 알고자 한다면?
Intruder 기능 사용

→ 확인 결과, 20부터는 Welcome Back이 뜨지 않으므로 패스워드는 20자리라는 것을 알 수 있음

'AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a

administrator 패스워드 확인

→ Welcome Back이 뜨지 않으므로 패스워드 첫번째 자리가 a가 아님을 확인
→ 아까와 마찬가지로 반복적인 작업을 위해 Intruder 사용

→ 메모장에 abc 등의 소문자 영단어 전체와 123 등의 숫자 전체를 적고 저장한 후 Load로 저장한 메모장을 불러와 Start attack

→ Welcome Back이 f에서 뜨므로 패스워드 첫번째 자리가 f임을 확인 가능

→ 패스워드의 두번째 자리를 알아내기 위해 Positions로 돌아가 1을 2로 바꿔준 후 Start attack 클릭

→ Welcome Back이 x에서 뜨므로 패스워드 두번째 자리가 x임을 확인 가능

※ 패스워드
→ fx~~

📌 악성 코드 파일 업로드 공격

게시판 등에서 악성 파일 업로드에 대한 검증이 없을 경우 이를 악용해 악성 스크립트(웹쉘) 파일이 업로드되어 원격 명령 실행, 권한 획득 등의 공격이 실행될 수 있는 보안 취약점

업로드 파일이 서버에 저장되고 해당 경로를 공격자가 파악할 수 있을 때 공격이 가능하며 업로드 후 공격자는 해당 파일에 접근해서 원하는 행위(원격 명령 실행 등)를 수행

공격(보안 진단) 포인트

✅ 게시판의 첨부파일
✅ 게시판 내부의 이미지 삽입 박스
✅ 게시판 내부의 동영상 첨부 부분
✅ 업로드 검증 로직이 존재할 경우 BlackList/WhiteList인지 확인
✅ 환경 분석을 통한 환경에 맞는 웹쉘 사용

대응 방안

최선
✅ 확장자 검증(화이트리스트)

차선
✅ 확장자 검증(블랙리스트)
✅ 파일 타입 검증
✅ Path Traversal 경로순회 특수 문자(.././;%#) 검증
✅ 파일명을 경로로 받지 않고 UUID
✅ 업로드 경로의 디렉토리나 파일 실행 권한 삭제

차차선
✅ 업로드 경로 노출 제한

실습 #7

파일 업로드 취약점 확인 후 서버 내 /home/carlos/secret 값 확인

제공된 wiener/peter 계정으로 로그인

이미지를 선택해 업로드가 성공적으로 되었다면 아래와 같은 화면이 뜸

다음과 같은 공간에 웹쉘 코드 삽입

메모장에 웹쉘 코드를 적어 저장한 후 파일 첨부

# test.php

<? php
$fp = fopen("/home/carlos/secret", "r");
while( !feof($fp) )
{
echo fgets($fp);
}
fclose($fp);
?>

패킷 확인

→ 악의적인 웹쉘 코드가 삽입되었음을 확인

실습 #8

파일 업로드 취약점 확인 후 서버 내 /home/carlos/secret 값 확인

제공된 wiener/peter 계정으로 로그인

php 파일 업로드 후 결과 확인


→ 403 에러 발생

php 소스 코드는 그대로 유지하고 파일 확장자만 바꿔 저장한 후 업로드

<? php
echo file_get_contents('/home/carlos/secret');
?>

결과 확인

💡 .htaccess 파일
서버의 설정을 바꿀 수 있는 파일 중 하나
백도어 역할의 파일
보안 상 안전 X

.htaccess 파일 업로드

# 파일을 php 파일 타입으로 변환
AddType application/x-httpd-php .abcdef

abcdefg 파일 업로드

→ .htaccess 파일로 인해 abcdefg 파일이 php 파일로 인식됐다는 것을 확인 가능

📌 경로 순회 공격 (Directory traversal)

웹을 통해 웹 어플리케이션의 소스파일 및 시스템 파일을 다운로드 할 수 있는 취약점

다운로드 경로의 인수 값에 ../ 문자열 등을 입력해 상위 디렉터리로 접근해서 일반적으로 접근이 불가능한 경로의 파일이 접근 또는 다운로드가 가능

리눅스 및 유닉스 계열의 웹 서버에서는 /etc/passwd 와 같은 시스템 파일도 다운로드 가능

공격(보안 진단) 포인트

첨부파일 또는 특정파일들의 다운로드 소스로 붙어있는 파라미터 값 변조
Ex. http://www.test.com/../../../../board/dbconn.inc
Ex. http://www.test.com/download.asp?path=/board/download/&filename=test.jpg

대응 방안

파일이 위치하는 경로를 변수로 사용하지 말고 해당 파일의 키 값을 변수로 사용하여 다운로드
Ex. http:// www.test.com/download.do?path=5&filename=test.jpg

파일 위치 경로 변수를 사용할 경우 "../", "\", ".\", "%"특수문자의 보안 필터링 적용

실습 #9

Directory Traversal 취약점 확인 후 서버 내 /etc/passwd 값 확인

이미지 패킷 확인

임의의 패킷 하나를 리피터로 전송한 다음, /etc/passwd 값을 찾기 위해 패킷 수정

→ 현재 경로의 위치를 모르기 때문에 한 단계씩 상위 경로로 이동

결과 확인

→ 400 응답과 No such file 출력

더 상위 경로로 이동

결과 확인

→ 아까와 값은 결과 값 출력 확인

한번 더 상위 경로로 이동

결과 확인

→ 세 차례 정도 이동하니 루트 경로로 이동한 것을 확인
→ ../../../etc/passwd가 시스템 상의 루트라는 것과 데이터 조회 가능 여부 확인

그 외

→ 호스트 파일 확인

실습 #10

Directory Traversal 취약점 확인 후 서버 내 /etc/passwd 값 확인

이미지 패킷 확인

임의의 패킷 하나를 리티퍼로 전송하고 패킷 확인

상위 경로로 이동하며 Response 확인

→ 그러나 아무리 입력해봐도 No such file만 뜨고 공격이 이뤄지지 않음을 확인
../이 필터링되고 있음을 유추
→ 이런 경우, URL 인코딩 후 filename의 인자 값으로 입력해서 접근

Burp Suite의 Decoder 이용해 URL 인코딩

→ Encode as를 클릭해 URL 선택

리피터로 돌아와 인코딩 값을 ../../../../../../../../../etc/passwd이 있던 자리에 삽입

결과 확인

→ 그러나 여전히 No such file이 뜨는 것을 확인

Decoder를 이용해 한번 더 URL 인코딩 진행

→ Encode as를 클릭해 URL 선택

맨 하단의 URL 인코딩 값 복사 후 리피터에 입력 후 send

결과 확인

→ 루트의 값이 정상적으로 뜨는 것을 확인 가능
→ 해당 서비스는 URL 서버 쪽에서 URL 디코딩을 한번, 내지는 두번 정도는 풀어서 사용 중이라고 유추 가능

📌 인증 우회 공격

종류

접근제어 우회 가능성
✅접근 제어 부분을 클라이언트에서 Javascript를 이용하여 체크할 경우, Javascript 구문을 삭제 후 우회 공격

비인증 상태로 중요 page 접근 가능성
✅ 로그인 확인 모듈이 존재하지 않는 페이지에서 강제 브라우징하여 내부 page 접근 가능

일반 계정 권한 상승 가능성
✅ 일반 계정 로그인 상태에서 관리자 page에 접근 가능

해결 방안

✅ 인증, 권한, 제어, 확인 등의 과정을 처리하는 부분은 Javascript 가 아닌 Server Side Language 로 구현

✅ 인증이 필요한 페이지의 경우 해당 페이지 주소를 직접 입력하여 접근하지 못하도록 페이지 각각에 대하여 로그인 체크 및 권한 체크를 하도록 접근제어통제(ACL)를 수립하여 계정권한에 맞게 접근제어 설정

권한 검증

실습 #11

권한 검증이 취약한 페이지 확인 후 carlos 계정 삭제

💡 robots.txt
웹 사이트 검색 로봇이 접근하는 것을 방지하기 위한 국제 규약으로, 일반적으로 접근 제한에 대한 설정을 robots.txt 파일에 적용하며 WEB Root 밑에 존재해야 적용됨
Ex. abc.abc.com/robots.txt

URL 창에 robots.txt 입력 후 결과 확인

→ administrator 패널이 검색 로봇에 의해 크롤링 되지 못하도록 설정
→ 그러나 반대로 공격자는 Disallow 설정을 통해 /administrator-panel 이란 경로가 존재함을 유추 가능

URL 창에 /administrator-panel 입력 후 결과 확인

→ 인증이 미흡할 경우 노출된 경로를 통해 타고 들어가는 것이 가능
→ 계정 옆에 자리한 Delete 버튼을 클릭해 계정 삭제 가능

실습 #12

권한 검증이 취약한 페이지(기능) 확인 후 wiener 계정의 권한을 Admin으로 변경

아이디와 패스워드 창에 administratior와 admin를 입력해 관리자 페이지로 이동

Admin panel 클릭하면 계정의 권한 상승·다운 기능이 존재

carlos 계정에게 관리자 권한 부여

→ carlos 계정만 권한이 변경된 것을 확인 가능

업그레이드 시 받은 패킷을 리피터에 저장

Cookie: session=wjYcd9KdQO7eYs0FoYb9KTyEK61Ruru4
→ administrator(ADMIN) 세션 값

administrator 계정 로그아웃 후 wiener 계정으로 로그인

로그인 시 받은 패킷을 리피터에 저장

session=xaDeuEPpiafo418X2RaoNP0jOsufIs0J
→ wiener(NORMAL) 세션 값

리피터를 이용해 패킷 수정

  1. username에 carlos의 이름을 지우고 wiener 입력
  2. session에 administrator의 세션 값을 지우고 wiener의 세션 값 입력
  3. Referer 값을 지운 다음 Send 클릭

결과 확인

→ 권한 검증을 하는 듯한 값 출력

지웠던 Referer 값을 지우지 말고 그대로 둔 후, Send

💡 HTTP Referer
① 사용자 요청의 출처를 표시하기 위함 (= Origin 헤더)
② 사용자의 대상 서버로의 요청이 올바른지 확인하기 위함
③ 사용자의 요청 값을 확장하여 서버로 전달하기 위함
④ 분석, 로깅, 최적화 된 캐싱 등 활용

결과 확인

→ wiener 계정임에도 불구하고 Admin panel이 뜨는 것을 보아 wiener 계정에 관리자 권한이 부여됐음을 확인 가능

0개의 댓글