2017-02-26

Hashcat을 이용해서 MYSQL 암호 알아내기



  현대를 살아가다 보면, 생각보다 기억의 불확실성을 경험할 경우가 많다.
인간의 기억은 완전하지 않아서, 뇌에 기록되는 단계에서 재정립 된다. 그리고 시간이 지나면 덮여 쓰여지거나,  망각 된다.

세상의 모든 것들이  정확히 디지털화되어 기록되어지는 세상이다 보니, 본의 아니게 내 기억의 불확실성을 자주 깨닫는다.

수많은 인터넷 계정이나, 내 가 관리하는 시스템의 계정암호를 잃어 버리는 경우도 ,비약하지면 하나의 예가 될 수도 있을 것이다.
  • Mysql 암호 알아내기
  • Hash값으로 암호 알아내기

위의 두가지 문구를 들었지만, 모든 현대 암호체계는 이 Hash 알고리즘을 기반으로 하여 구축된다.

Hash란?  자료구조의 한 종류로서, 주로  hash 함수에 의하여 생성된 유일한 값을 의미한다.
학문적으로 들어가면 몇가지 규칙(약 충돌 회피성, 강 충돌 회피성 등..)을 지키며 중복값을 허용하지 않는 난수 생성기에 가깝다.

여튼 A를 입력으로 받아 B라는 해시값을 얻었다면
A이외의 값으로슨 B가 발생하여서는 안되며, B라는 결과값으로A를 유추할수 있어서도 안되다는게 핵심이다.

따라서, 밑에서 언급 하겠지만,  보통 전수검사(Brute force)로 모든 입력값을 입력하여 비교하는 방법밖에는 없다.



본론으로 돌아가서, 여러가지 역해시 프로그램을 사용해 보았지만, hashcat 만큼 성능이 좋았고 기능이 많은 프로그램이 없었기에 소개해본다, ( 단, 처음 사용자 혹은 IT 미숙련자등은 좀 어려울수도 있다)


1. 먼저 Hashcat을 다운 받는다.
 다운로드 위치는 (여기를 클릭) 이다,  다운받은후 압축을 풀어 적당한 위치에 저장한다.
 무료이며, 설치가 따로 필요 없고 여러 플랫폼에서 동작한다.


2. 우선 mysql에서 사용자 계정을 저장하는 column에서 hash 값을 가져온다.
(예를 들면 mysql5.1 에서 passwd()함수를 사용해 암호를 저장하면  다음과 같은 형태로 만들어진다.)

*23AE809DDACAF96AF0FD78ED04B6A265E05AA257
가져온 파일을 적당한 위치에  만든 temp.txt 파일에 저장한다.
저장할때 해시값 앞의 *표는 때어준다.


3. 가져온 해시값의 알고리듬 종료를 알아낸다.
 이부분은 발생한 해시 값만으로는 알수 없다. 따라서 Hashcat에서 제공하는 알고리즘 종료를 보고 선택 해야 한다.
 Hashcat의 실행 파일에 --help 옵션을 주고 실행한후 중간즘을 보면


   .......................
1731 | MSSQL(2014)                                      | Database Server
    200 | MySQL323                                         | Database Server
    300 | MySQL4.1/MySQL5                                  | Database Server
   3100 | Oracle H: Type (Oracle 7+)                       | Database Server
    112 | Oracle S: Type (Oracle 11+)                      | Database Server
  12300 | Oracle T: Type (Oracle 12+)                      | Database Server
   8000 | Sybase ASE                                       | Database Server
............................

위와 같이 해당 프로그램의 해시값 타입을 알수 있다 여기서는  mysql5.1 이므로 300이 해당된다,



4.  Windors key + r을 입력후 실행창에서 cmd를 입력하여 커맨드 입력창을 연후, 다음 명령을 실행 시키다. 자세한 옵션은 추후 설명하도록 한다.

hashcat64.exe --force -m 300 c:\temp.txt -a 3 -w 2 -1 ?a --increment --increment-min=1


5. 위 4번  명령의 실행 결과로 일단 간단한 암호를 사용했다면, 거의 바로 결과를 받을수 있다.


temp 파일에 저장한  해시값의 암호값은 123으로 확인된다.
정말 몇초도 안되어 나온다.
그리고, 이것이  암호를 길고 어렵게 만들어야만 하는 가장 중요한 이유이다.
일반 피시에서 동작 시켜도 9자리 패스워드는 하루만에 알아 낼수 있다.
한자리 암호가 늘어 날떄마다 길어지며 15자리쯤 되면 .. 수천년 걸린다. 남는 시간도 화면에 표시된다. 

간혹, 포털 사이트나 국공립 기관에서 암호나 개인정보가 유출되었지만, 암호화되어 있어서 문제 없다라고 말하는것은 한마디로  "헛소리"이다.  어지간하면 바로 알아 낼수 있고, 따라서 
사용자는 무조건 암호를 길게 가져가야 한다. 기관이나 포털을 믿지는 말고 대처하자.



6. 사설이 길었지만 추가 사항은  Hashcat 홈페이지에 가면 잘 나와있지만 사용한 옵션에 대해서만 간략히 설명하면 다음과 같다.


  • -m 300  : 위에서도 언급 했지만 해시함수의 종류로 mysql5.1은 300을 사용한다.
  • c:\temp.txt : 꼭txt 파일이 아니어도 되며 하나의 파일에 여러개의 해시값을 넣어도 된다
                복수개 입력시 모든 해시값을 찾아낼때까지 계속 실행된다.
  • -a 3 : 동작 모드를 나타낸다. 3번은 전수 검사로 모든 가능한 입력값에 대해서 하나한 검사한다. 추가로 wordlist로 검사하는 항목도 있는데 wordlist란 말그대로 임의의 입력값을 사전의 형태처럼 모아논 값이다. wordlist는 이곳저곳에서 무료로 다운 받을수 있고 , 사용자가 많이 사용할 법한 단어들로 이루어져 효율성이 높지만, 기껏 시간을 들였으나 그 woirdlist에 해당하는 문자열이 없는경우는 찾아낼수 없다.
  • -w 2  : Hashcat에게 얼마나 열심히 일을 시킬것이냐를 나타낸다.  보통 강하게 돌릴경우 3을 지정한다.
  • -1 ?a  : 는 Hahcat --help 옵션을 보면 나오지만, 전수검사를 할때 넣을 입력값을 나타내며 ?a는 모든 대문자,소문자,숫자,특수문자,공백을 포함한 입력값을 나타낸다.
  • --increment --increment-min=1 ㅣ 해시값의 원문의 자리수가 1자리 이상일 겨우 사용하며 8자리가 넘는다는 확신이 있으면 8부터 사용하면 된다.


No comments:

Post a Comment