본문 바로가기
3. 웹 애플리케이션 취약점 진단/비박스를 활용한 웹 애플리케이션 취약점 진단

[비박스를 활용한 웹 취약점 진단] 5-2.인증 결함 [비밀번호 사전 대입 공격]

by Robert8478 2023. 12. 13.

비밀번호 사전 대입 공격이란? - 무차별 대입 공격과 비슷하지만 이는 비밀번호를 설정하는 사람들이 선호하는 문자열을 사전 파일로 만들어 대입하는 공격이다. 인증 과정의 암호화가 복잡하다고 하더라도 사용자가 설정하는 비밀번호가 간단하다면 공격자는 쉽게 로그인 할수있다.
무차별 대입 공격보다 속도가 빠르지만 사전 파일에 비밀번호 정보가 없으면 실패한다.

[난이도 하]
https://github.com/fuzzdb-project/fuzzdb

 

GitHub - fuzzdb-project/fuzzdb: Dictionary of attack patterns and primitives for black-box application fault injection and resou

Dictionary of attack patterns and primitives for black-box application fault injection and resource discovery. - GitHub - fuzzdb-project/fuzzdb: Dictionary of attack patterns and primitives for bla...

github.com

우선 사전공격에 사용할 비밀번호 목록 파일을 다운로드 하자. FuzzDB는 퍼징에 사용되는 입력값을 모은 데이터베이스이다.
퍼징이란? - 악의적인 입력값을 주입하여 취약점 여부를 찾는 기법이다. FuzzDB는 국가와 사용환경에 따라 다른 입력값을 제공하고, 사용자가 주로 쓰는 이름을 저장하기에 아이디나 비밀번호, 디렉터리나 파일명 등을 찾는데 유용하다.
압축을 풀면 바이러스로 인식하니 백신 예외 설정을 해서 다운로드 받자.
폴더안의 wordlists-user-passwd\passwds 안에 있는 phpbb.txt 파일을 이용할 것이다.

아이디와 비밀번호를 입력해서 intercept 하고 이를 send to intruder 로 전송한다.

Intruder 탭의 Positions으로 이동해서 아이디와 비밀번호 둘다 모르니 § 변수를 사용해서 login 과 password 에만 넣어준다.

사전 공격을 위해 Attack type을 Cluster Bomb 으로 지정한다.

그 다음 Payloads 탭으로 이동한다. Payload type은 simple list로 두자.
위의 Payload set에서 1은 login 변수를 공격하는 페이로드 지정이고 2는 password 변수를 공격한다.
payload set 2도 payload type을 simple list로 해준다.

그 뒤 아래 Payload Options에 있는 Load ... 를 누른 뒤 다운 받았던 phpbb.txt 파일을 불러와준다.

그러면 사전 파일이 불러와지며 아래에 Add 부분에 단어를 추가하고 Add 버튼을 누르면 단어를 추가할 수도 있다.
Payload set을 2로 바꾸어 2도 똑같은 작업을 해주어야 한다.
이제 우측 위에 Start attack 버튼을 눌러 공격을 시도하자.

이런 식으로 공격이 시작되는데 여기서 Length가 다르거나 Status 코드가 다른 부분을 찾으면 된다.
버프슈트가 프로버전이 아니라서 그런지 공격 도중 한정이 되어 멈추게 되기 때문에 버프슈트 말고 칼리리눅스로 사전 공격을 하는것이 나을것같다. 칼리 리눅스로 공격했을 때에 아이디 test 비밀번호 test 가 나왔다.

[난이도 중,상]
난이도 중,상 부터는 비밀번호에 특수문자 등을 포함해서 그런 것인지 사전 공격을 수행하는데 오랜 시간이 걸린다.
비밀번호가 길고 복잡해지면 조합이 너무 많아져서 사실상 사전 대입 공격이 힘들다고 보아야 한다. 사전에 있는 문자열만 보고 대입하기 때문에 사전에 없는 비밀번호를 만들기 위해 복잡한 패스워드를 만들어야 하는 것이다.

비밀번호 사전 대입 공격을 막기 위해서는 회원 가입 시 비밀번호 유효성 검사를 통해 방지한다. 비밀번호에 특수문자, 영문자, 숫자를 섞었는지 정규 표현식을 사용하여 검사한다. 자바스크립트나 VBScript 같은 클라이언트 스크립트에서 처리하면 우회할 수 있기 때문에 반드시 서버사이드 스크립트에서 이를 처리해야 한다. PHP에서는 'preg_match' 함수를 사용해서 비밀번호 길이를 지정하고 특수문자, 문자, 영문이 포함되었는지 체크한다.