Web hacking/기법

브루트 포스(Brute Force)

jin_li 2023. 2. 17. 04:29
Brute Force

패스워드 크래킹의 일종으로 가능한 모든 패스워드 후보를 다 대입하는 기법이다. 폭력을 뜻하는 단어 Brute Force 그대로, 무식하지만 패스워드를 확실하게 알아낼 수 있으므로 강력한 기법이다.

위키백과, 나무위키 참조~

 

 

실습

 

※ "화이트 해커를 위한 웹 해킹의 기술" 강의 및 책에 수록된 실습이다.

※ 허가 받지 않은 웹사이트에 해킹을 시도 하는 것은 불법.

※ dvwa 등 테스트 가능하게 만들어진 곳에서만 모의해킹을 해야한다.

 

 

 

칼리리눅스에 xampp와 dvwa를 설치했다.(xampp는 버전 5점대로 설치해야한다)

 

 

dvwa 로그인 후(첫 로그인 id는 admin, pw는 password) security창에 들어가서 low 난이도부터 해보자. 

 

 

 

Brute Force 창으로 가서 id는 admin으로, 패스워드는 아무거나 쳐서 로그인 해봤다. 당연히 로그인 실패.

이제 이 패스워드를 브루트 포스 기법으로 구해볼 것이다. 

 

 

 

버프 스위트에서 Proxy의 HTTPhistory탭으로 들어가서, 내가 로그인 시도 실패한 최근 기록을 찾는다.

HTTP Request 메시지의 헤더에서 id를 admin, pw를 aaaa로 로그인 시도했음을 볼 수 있다. 

 

 

 

이 기록을 intruder로 보낸다.

 

 

intruder 탭으로 가서, 

positions에서 쿼리스트링과 쿠키를 변수해제(clear)하고, 패스워드로 입력했던 내용인 aaaa만 변수의 값으로 저장(add)한다. 

 

 

그 후 payloads 탭으로 들어가서, type을 Brute forcer을 선택한다.

Character set에는 패스워드로 입력할 문자들을 설정할 수 있고, Min length 와 Max length에서는 패스워드 길이의 최소 최댓값을 정할 수 있다.

 나는 문자에 !와 *를 추가하고, 최대 6자까지 패스워드를 대입하게 했다. 그러면 Payload count에서 대입할 패스워드 경우의 수를 계산해서 보여주는데, 너무 많아서 unknown이 떴다.

 

 

 

이후 창 오른쪽 상단의 start attack을 클릭한다. 무슨 경고창이 뜨는데 무료버전이라 그렇다. 그냥 ok를 누른다.

 

 

Payload에서 어떤 패스워드를 입력해 공격중인지 볼 수 있다.

빨간 박스의 항목에서

Status : 응답코드, Error : 에러 여부, Timeout : timeout 여부, Length : 응답메시지의 길이

를 알 수 있다.

위의 사진에서 모두 똑같이 나오는데, 만약 이 중 하나가 다른 값이 나오는 게 있다면 그 payload가 패스워드일 것이다. 

 

 

 

이 공격이 다 진행될 때까지.. 언제 기다려? 브루트 포스는 확실하지만 시간이 많이 걸린다. (사실상 불가능)

그래서 사람들이 많이 패스워드로 설정하는 문자열을 사전처럼 모아서, 그 문자열을 우선 대입하는 방법이 있다.

이를 사전(dictionary) 공격이라고 한다.

 

 

 

칼리 리눅스에 내장된 딕셔너리 파일로 실습해보자.

터미널을 열어서, /usr/share/john/password.lst를 확인해보면

주석에 2006년대부터 2010년대까지 많이 쓰인 패스워드라고 적혀있다..

3546개의 패스워드가 적혀있다.

(생각보다 적다... 그래서 실제 해커들은 천만개가 넘는 파일을 사용하기도 한다고 함.)

 

 

다시 버프스위트로 돌아가서, Payload type을 Sipmle list로 바꾸고 password.lst 파일을 불러온다.

패스워드 파일 찾아보면 엄청 많은데, 그걸 다운받아서 불러와도 된다.

 

 

주석은 다 지우고 패스워드만 남기고, 다시 공격 시작!

 

 

혼자 length가 5352로 다른 패스워드를 발견했다. 아마 이게 패스워드일 것이다.

 

 

실제로 입력해보면, 로그인되는 것을 확인할 수 있다.

 

 

 

브루트 포스 대응

 

난이도를 하나씩 올리면서 어떤 방법으로 브루트 포스 공격을 대응할 수 있는 지 알아보자.

 

난이도를 미디움으로 올린다음,

로그인 창에서 패스워드 아무거나 쳐봤는데 좀 늦게 잘못된 패스워드라고 떴다.

 

화면 우측 하단의 view source를 눌러서 로그인 창의 소스코드를 확인했다.

로그인 실패시 2초의 딜레이 후 응답을 하도록 되어있다. 이런 식으로 공격 시간을 지연시켜서 어느정도 대응할 수 있다.

 

 

이번엔 난이도를 high로 올렸다.

다시 로그인 창에서 잘못된 패스워드를 입력했는데, 바로 로그인 실패 안내가 나왔다.

소스코드를 확인해보니

로그인 실패 시 랜덤으로 0초에서 3초까지의 딜레이가 있도록 해놨다.

 

랜덤시간 딜레이가 해킹하기 더 까다로운 이유는,

아까처럼 2초라는 일정한 시간동안 응답이 없으면 틀린 패스워드로 간주해서 패스워드를 골라내는 프로그램을 만들 수 있는데 랜덤은 그런 프로그램을 만들기 어렵기 때문이다.

 

 

마지막으로 impossible 단계를 보자.

틀린 패스워드 입력했을 때, 로그인 시도실패 많다고 계정이 잠겨버렸다. 15분 후에 다시 로그인 시도할 수 있다.

이를 락킹이라고 하는데, 이 방법을 쓰면 브루트 포스 공격을 거의 완전히 차단할 수 있다.

 

다만 해커가 일부러 틀린 패스워드를 계속 입력해서 사용자가 계정을 일정 시간동안 사용 못하게 만들 수 있다는 부작용이 있다.

 

 

 

정리하면, 브루트 포스 공격은

잘못된 로그인 시도가 반복될 때 응답을 랜덤시간동안 딜레이 시키거나 락킹해서 대응할 수 있다.

또는 캡챠를 이용하는 것(사람이 로그인하는 지 확인하는 것)도 공격을 무력화할 수 있다.

'Web hacking > 기법' 카테고리의 다른 글

SQL injection_(1) 공격 개요  (0) 2023.04.18
파일 인클루전  (0) 2023.04.03
CSRF(2)  (0) 2023.03.23
CSRF(1)  (0) 2023.03.23
커맨드 인젝션(command injection)  (1) 2023.02.23