모의해킹&웹취약점진단/주•통기반 웹 취약점 점검

12. 약한 문자열 강도 취약점

sheow13 2023. 12. 27. 11:45
728x90

 

 개요

- 웹 어플리케이션에서 회원가입 시 안전한 패스워드 규칙이 적용되지 않아 취약한 패스워드로 회원가입이 가능할 경우 공격자가 추측을 통한 대입 및 주변 정보를 수집하여 작성한 사전(directory) 파일을 통한 대입을 시도하여 사용자의 패스워드를 추출할 수 있는 취약점

- 패스워드 크랙 도구인 hydra, john 등을 사용하여 계정을 탈취할 수 있는지 확인 또는 계정 잠금 임계값이 설정 유무 등을 파악

- 주요정보통신기반시설 웹 취약점 진단 기준으로 12. 약한 문자열 강도 취약점에 해당

 

 

비밀번호 공격 방법

- 사전 공격(Directory Attack) : 자주 사용되는 단어를 비밀번호에 대입하는 공격 방법

- 무작위 대입공격(Brute Force) : 가능한 한 모든 값을 비밀번호에 대입하는 공격 방법

- 레인보우 테이블 공격(Rainbow Table) : 무작위 대입공격 시 더 빠르게 비밀번호를 시도하기 위해서 해시함수(MD5, SHA-1, SHA-2)을 사용하여 만들어낼 수 있는 값들을 표에 저장하고, 저장된 표를 이용해서 공격 진행

 

약한 문자열 강도 CheckList

- 사전 파일을 대입하여 계정 정보를 탈취할 수 있는가?

- 계정 잠금 임계값이 설정 되어 있는가?

- 패스워드 작성 규칙을 잘 준수하고 있는가?

 

패스워드 작성 규칙 관련 법적 관련 사항

 개인정보 기술적 관리적 보호조치 기준(제 4조 접근통제 8항)

  - 정보통신서비스 제공자등은 개인정보취급자를 대상으로 다음 각 호의 사항을 포함하는 비밀번호 작성규칙을 수립하고, 이를 적용, 운용하여야 한다.

   1. 영문,숫자,특수문자 중 2종류 이상을 조합하여 최소 10자리 이상 또는 3종류 이상을 조합하여 최소 8자리 이상의 길이를 구성

   2. 연속적인 숫자나 생일,전화번호 등 추측하기 쉬운 개인정보 및 아이디와 비슷한 비밀번호는 사용하지 않는 것을 권고

   3. 비밀번호에 유효기간을 설정하여 반기별 1회 이상 변경

 

  개인정보의 안전성 확보조치 기준(제5조 접근 권한 5항)

  - 개인정보처리자는 개인정보취급자 또는 정보주체가 안전한 비밀번호를 설정하여 이행할 수 있도록 비밀번호 작성규칙을 수립하여 적용하여야 한다.

  • 알파벳 대문자와 소문자, 특수문자, 숫자 중 2 종류 이상을 조합하여 최소 8자리 이상 또는 하나의 문자종류로 구성할 경우 최소 10자리 이상의 길이를 구성    

 

■ 패스워드 크랙 성공 예시

- 정보 수집 과정에서 관리자 페이지 접근 가능하다는 사실을 확인하였으며, 계정 ID는 admin으로 추측

- admin 계정으로 임의의 패스워드 입력 후 로그인 시 'Invalid Password!'라는 문구가 뜨는 것을 확인

- 해당 정보를 토대로 계정 ID는 'admin'임을 확인 하였으며, 패스워드 크랙 도구인 hydra를 사용하여 패스워드 추출 성공

- 자세한 과정은 하기 링크 참조

- https://sheow13.tistory.com/34

 

HackTheBox - Nineveh

 HackTheBox - Nineveh환경 실습  진행 절차 Step 1. HackTheBox 사용을 위해 Kali Linux에서 VPN 맺은 후, 정보 수집을 위해 mnap을 통해 확인해본 결과, HTTP, HTTPS가 Open되어 있음을 확인 Step 2. HTTP로 접근 시

sheow13.tistory.com

 

[정보 수집을 통해 관리자 페이지를 발견하였으며, admin 계정으로 임의의 패스워드 입력 시 에러 문구 뜨는 것을 확인]

 

[개발자 도구를 통해 POST로 ID, PW를 전달하고 있음을 확인]

 

[패스워드 크랙 도구인 hydra를 통해 패스워드 크랙 성공 확인]

 

 

■ 약한 문자열 강도 점검 방법

수동 점검

- 사용자 계정 패스워드 변경 시, 패스워드 작성 규칙을 준수하고 있는지 확인

 

자동화 도구를 통한 점검

- 자동화 도구(Ex, hydra, john )를 사용하여 패스워드 크랙이 가능한 지 점검

- 아래 예시는 Kali linux에서 제공하는 hydra 도구를 예시로 들었으며, 자세한 사항은 하기 링크 참조

 

 

■ 약한 문자열 강도 조치 방안

1. 패스워드 복잡도 설정 및 패스워드 사용기간 설정 등을 통해 패스워드 추축이 불가능하도록 설정

더보기

Step 1) 다음 각 목의 문자 종류 중 2종류 이상 문자를 조합하는 경우 최소 10자리 이상, 또는 3종류 이상 문자를 조합하는 경우 최소 8자리 이상의 길이로 구성
   (1) 영문 대문자(26개)
   (2) 영문 소문자(26개)
   (3) 숫자(10개)
   (4) 특수문자(32개)

Step 2) 연속적인 숫자나 생일, 전화번호 등 추측하기 쉬운 개인정보 및 아이디와 비슷한 비밀번호는 사용하지 않는 것을 권고

Step 3) 비밀번호에 유효기간을 설정하여 반기별 1회 이상 변경

Step 4) 최근 사용되었던 패스워드 재사용 금지

                                                                             [패스워드 작성 규칙]

 

2.  시큐어코딩 통해 패스워드 작성 규칙 준수

from flask import request, redirect
from Models import User
from Models import db
import re

@app.route('/register', methods=['POST'])
def register():
    userid = request.form.get('userid')
    password = request.form.get('password')
    confirm_password = request.form.get('confirm_password')

    if password != confirm_password:
       return make_response("패스워드가 일치하지 않습니다.", 400)

    if not check_password(password):
       return make_response("패스워드 조합규칙에 맞지 않습니다.", 400)
    else:
       usertable = User()
       usertable.userid = userid
       usertable.password = password

       db.session.add(usertable)
       db.session.commit()
       return make_response("회원가입 성공", 200)

def check_password(password):

    # 3종 이상 문자로 구성된 8자리 이상 패스워드 검사 정규식 적용
    PT1 = re.compile('^(?=.*[A-Z])(?=.*[a-z])[A-Za-z\d!@#$%^&*]{8,}$')
    PT2 = re.compile('^(?=.*[A-Z])(?=.*\d)[A-Za-z\d!@#$%^&*]{8,}$')
    PT3 = re.compile('^(?=.*[A-Z])(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,}$')
    PT4 = re.compile('^(?=.*[a-z])(?=.*\d)[A-Za-z\d!@#$%^&*]{8,}$')
    PT5 = re.compile('^(?=.*[a-z])(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,}$')
    PT6 = re.compile('^(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,}$')


    # 문자 구성 상관없이 10자리 이상 패스워드 검사 정규식
    PT7 = re.compile('^[A-Za-z\d!@#$%^&*]{10,}$')

    for pattern in [PT1, PT2, PT3, PT4, PT5, PT6, PT7]:
        if pattern.match(password):
           return True
    return False

 

                                                                             [패스워드 작성 규칙 시큐어 코딩]