「웹 메일 비밀번호를 잊어 버렸어요!」

일반입력 :2008/09/18 08:59

김성우

필자가 해킹과 보안 관련 글을 몇 번 쓴 덕분에 희한하고도 곤란한 부탁들이 들어오는 경우가 종종 있습니다. 그 대표적인 것 중 하나가 특정인의 전자메일 계정에 접근할 수 있느냐는 것입니다. 대부분 연예를 하고 있는 남성들의 부탁으로 보아 연인이 잘해준다는 동아리 선배와 바람이 났는지, 키가 크고 멋지게 생겼다는 직장상사와 은밀한 메일을 주고받는 것은 아닌지 확인하고 싶었겠지요.

과연 필자는 이들의 부탁을 들어 주었을까요? 물론 그렇지 않았습니다. 무슨 수로 남의 비밀번호를 알아내겠습니까. 알고자하는 메일 서버의 관리자도 아닌데다 큰 메일 서버의 비밀번호는 암호화가 되어 있기 때문에 관리자라고 하더라도 비밀번호를 알아내는 것은 사실상 불가능합니다.

그녀의 메일함을 열어 보고 싶어요

그렇지만 말도 안되는 무식한 방법을 동원한다면 1%의 가능성도 없다고 말할 수는 없습니다. 가능성이 있어 보이는 모든 비밀번호를 다 입력해 보는 방법이 바로 그것입니다. 물론 이 방법이 얼마나 무식하고 희박한 확률인지는 간단히 계산해 봅시다. 만약 비밀번호가 6자리였다고 가정하면,

68(알파벳 26 + 숫자 10 + 특수 문자 32) × 68 × 68 × 68 × 68 × 68=686 = 98,867,482,624

1초에 한번 시도한다고 했을 때 1,144,299일이 걸리고 년으로 따지면 3135년이 걸리게 됩니다. 설상가상으로 비밀번호가 6자리라는 보장도 없습니다. 그렇지만 실제로 사용되는 비밀번호의 가짓수가 저렇게 많지는 않습니다.

필자의 비공식적 통계에 의하면 4자리 이상을 비밀번호로 받는 전산 시스템의 1/4 가량이 4자리 숫자를 사용하고 있습니다. 또한 영어단어나 한글단어나 숫자 조합 등 그 수를 줄여 보면 훨씬 줄어들게 됩니다. 정말 다행이 아닐 수 없지요.

이 한낱 같은 가능성을 붙들고 한번 시도를 본격적으로 시작해 보도록 하겠습니다. 그렇다고 남의 메일 계정의 비밀번호를 알아내는 것은 불법적인 행위이니 사용한지가 오래되어 잊어버린 내 메일의 비밀번호를 찾아내는 것으로 상황 설정을 합시다.

로그인 구조

알고 싶은 메일 계정이 모 사이트에서 사용하는 couldyouman@XXXl.net이라고 합시다. 우선 로그인 시도를 위해 첫 페이지로 가봅시다.

<화면 1> 모 사이트 메인 페이지의 로그인 루틴

<화면 1>을 보면 아이디와 비밀번호를 넣는 란이 있습니다. 소스보기를 하여 확인해 보면 폼 객체로 아이디는 id, 비밀번호는 pw로 담으며 이 정보를 http://login.XXX.net/Mail-bin/login.cgi로 보냄을 확인할 수 있습니다. method=“post”의 의미는 이 넘기는 정보를 보이지 않게 하라는 의미입니다. 실제로 로그인 버튼을 눌렀을 때 보내는 형태는 다음과 같습니다.

1: POST /Mail-bin/login.cgi HTTP/1.0

2: Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*

3: Accept-Language: en-us

4: Accept-Encoding: gzip, deflate

5: User-Agent: Mozilla/4.0

6: Host: LOGIN.XXX.NET

7: Content-Type: application/x-www-form-urlencoded

8:

9: Id= couldyouman&pw=dkwlrahffk

앞에 숫자는 줄 번호입니다. 1번 줄의 굵은 글씨는 로그인 처리하는 웹 페이지 주소입니다. 옆에 HTTP/1.0이라는 것은 웹 페이지를 주고받은 프로토콜인 HTTP이자 버전이 1.0인 방식으로 서버와 통신을 하겠다는 의미입니다.

6번 줄은 서버 주소이며 9번 줄이 아이디와 비밀번호를 넘기는 주소입니다. 실제로 통신 포토를 80번 열고 다음과 같은 데이터를 보내면 로그인 성공 아니면 실패의 메시지를 받게 됩니다.

<화면 2>는 그 절차를 나타내고 있습니다. 이 절차를 자동으로 해주는 프로그램을 비주얼 베이직 6.0으로 작성해 보도록 하겠습니다.

<화면 2> 모 사이트의 로그인 절차

4자리 숫자 비밀번호 찾기 프로그램

1단계로 비주얼 베이직을 실행하면 새 프로젝트 창이 뜹니다. 이중에서 새 파일 ‘표준EXE’를 선택합니다. 2단계는 폼 위에 화면구성을 합니다.

3단계는 메뉴의 프로젝트 밑에 구성요소를 선택합니다.(<화면 3>) 4단계는 구성요소의 컨트롤 중 Microsoft Internet Transfer Control 6.0을 선택하고 확인을 누릅니다. Microsoft Internet Transfer Control은 HTTP와 FTP 프로토콜을 구현한 비주얼 베이직의 대표적인 인터넷 컨트롤 입니다.

<화면 3> 메뉴 -> 프로젝트 -> 구성요소 선택

<화면 4> Microsoft Internet Transfer Control 6.0 컨트롤 추가

<화면 5> inetHttp 추가

5단계로 맨 좌측 컨트롤 팔레트 맨 하단에 지구와 컴퓨터 그림의 Microsoft Internet Transfer Control이 추가되어 있을 것입니다. 이것을 폼 위에 추가하고 이름을 inetHttp로 바꿉니다. 그리고 추가한 Microsoft Internet Transfer Control을 더블클릭합니다(<화면 5>).

6단계는 <리스트 1>을 Form1의 코드에 넣습니다. 7단계는 <화면 6>과 같이 Module1의 이름으로 모듈을 한 개 추가하고 <리스트 2>를 모듈에 넣습니다. 8단계는 작성한 프로그램을 저장하고 실행합니다. <화면 9>와 같이 프로그램이 실행될 것인데, 잃어버린 비밀번호를 아이디에 넣고 시작을 하면 0000부터 9999까지 1만개의 비밀번호가 맞는지 확인하게 됩니다.

<화면 6> 모듈 추가

<화면 7> 모 사이트 4자리 숫자 비밀번호 찾기 프로그램

그런데 6자리부터라니 InStr 함수가 생소한 독자도 있을 듯 합니다.

a = InStr(1, strTemp, 로그아웃)

strTemp 문자열의 1번째부터 찾아서 ‘로그아웃’이라는 문자가 있느냐를 찾게 되고 찾는 문자가 나오면 그 위치가 리턴되고 없다면 0이 리턴됩니다. 모 사이트 4자리 숫자 암호 찾기 프로그램은 워낙 간단하기 때문에 나머지 소스 코드는 설명하지 않겠습니다.

그런데 문제가 있습니다. 모 사이트의 경우 비밀번호가 6자리 이상이 되어야 하기 때문에 이 프로그램을 모 사이트에 직접 사용할 수는 없습니다.

좀더 발전된 방법을 찾아야 하는데 사전 대입 방법을 적용해 보도록 하겠습니다. 비밀번호다 싶은 텍스트 파일을 읽어 차례대로 대입하도록 프로그램을 수정해 보겠습니다.

사전으로 비밀번호 찾기 프로그램

1단계는 구성요소에서 Microsoft Common Dialog Control 6.0을 추가합니다. 2단계는 <화면 9>처럼 폼 배치를 합니다.

<화면 8> Microsoft Common Dialog Control 6.0 추가

<화면 9> 화면 구성

3단계는 <리스트 3>을 Form1의 코드에 넣습니다. 4단계는 <화면 6>과 같이 Module1의 이름으로 모듈을 한 개 추가하고 <리스트 2>를 모듈에 넣습니다.

5단계로 작성한 프로그램을 저장하고 실행합니다. <화면 9>과 같이 프로그램이 실행됩니다. 우선 사전에서 가져오기 버튼을 누릅니다. 사전은 보통 텍스트 파일로 그 내용은 다음과 같습니다.

dlgyfl

  thsdPwls

참고로 비밀번호는 한글이 들어가지 않습니다. 그리고 나서 아이디를 넣고 시작 버튼을 누르면 비밀번호를 찾기 시작합니다.

<화면 10> 다음 사전으로 비밀번호 찾기 프로그램

학습목적으로만 사용하길

예제를 위해 최소의 기능만을 넣었기 때문에 이 프로그램을 발전시키면 활용할 수 있는 것이 많을 것입니다. 한 가지 이 프로그램은 원리를 알기 위한 예제로 학습을 하는 데만 활용하고 악의적인 목적으로는 발전시키지 말기 바랍니다. 지난 번에 언급했듯 대한민국 치안이 그리 만만하지 않거든요.

아, 그리고 잊을 뻔 했네요. 잃어버린 비밀번호를 꼭 찾기를 바랍니다. 그리고 훨씬 멋진 바이러스나 버퍼오버플로우 같은 고급 기술에 도전할 수 있도록 기초를 다지는데 노력을 게을리하지 말고 다음 호에 만납시다. 숨차도록 열심히! @

* 이 기사는 ZDNet Korea의 자매지인 마이크로소프트웨어에 게재된 내용입니다.