Last Update : 2009.02.06.
오래 전이지만 진단을 수행하다 다수의 MSSQL 서버 중 딱 한대에서 MSSQL 2000의 사용자 권한을 획득한 적이 있다. 운이 좋게도 sysxlogins에 접근이 가능하여 hash 값 획득이 가능하였다. Hash Crack을 시도할려고 한참을 애먹었던 기억이 있다. 잼있게도 운이 좋았던지 SA 계정에서 단순 패스워드 6자리 미만을 사용하여 SA궈한을 획득한 적이 있었다.
MSSQL 2000 서버의 사용자 패스워드에 대해서 많은 자료가 있겠지만 국내에서는 별 자료가 없는거 같기도 하고 정리 차원에서 기억을 더듬어 노트에 필기한다는 생각으로 몇자 정리해 본다.
1. HASH 획득 방법
권한이 있으면 아래의 쿼리를 수행하면 HASH 값 획득이 가능하다.
select name, password from master.dbo.sysxlogins where password is not null
syslogins에 접근이 가능할 경우
select name,convert(varbinary(50),password) from master.dbo.syslogins where password is not null
Password 값이 null이면 시스템 계정이거나, Hash Crack과 연관이 없으므로 제외한 결과를 보는게 깔끔하다.
※ 해당 구문 실행 화면
password의 HASH 값이 매우 길어 도대체 이게 무슨 HASH 값인지 대략난감해 했던 기억이 난다.
2. HASH의 구조
HASH 값의 구조를 알아보기 위해 먼저 pwdencrypt 함수(SQL 패스워드 암호화 알고리즘을 사용하여 문자열 암호화)를 이용하여 획득한 값을 이용한다.
select pwdencrypt('AAAAAA')
수행 결과 :
0x0100226CEE648255C971121406E4CB9083DD68DA392FADEA98048255C9711214
06E4CB9083DD68DA392FADEA9804
위의 HASH의 값을 분석해 보면 아래와 같은 결과를 얻을 수 있다.
0x0100 : [6자리] 정적 헤더
226CEE64 : [8자리] rand() 함수를 두번 호출한 Salt
8255C971121406E4CB9083DD68DA392FADEA9804 : [40자리] 대소문자 구분 SHA Hash
8255C971121406E4CB9083DD68DA392FADEA9804 : [40자리] 대문자 SHA Hash
※ 참고자료
http://www.ngssoftware.com/papers/cracking-sql-passwords.pdf
http://www.alleged.org.uk/pdc/2005/04/11.html
http://netraju.blogspot.com/2008/12/how-to-hack-n-crack-sql-login-passwords.html
3. HASH 크랙방법
크랙 방법은 위의 참고자료에서 소개한 코드를 활용하여도 되지만 여기에서는 이미 우리에게 인숙한 Cain&Abel를 이용한 방법을 소개한다.
■ Cain → Cracker → MSSQL Hashes 에서 Add MSSQL Hashes
여기에서는 위에서 분석한 hash를 수작업으로 입력한 방법을 설명하나 ODBC를 이용하면 HASH분석 없이 바로 입력이 가능하다.
■ Brute Force를 이용한 방법
알파벳 조합으로 되어 있고 대소문자가 HASH에 구분되어 있어 대문자 조합으로 수행하였을 경우 대소문자 혼합에 비해서 매우 짧은 시간에 획득이 가능하다.(아래의 sample은 10초 미만이 소요됨)
MSSQL HASH 분석 방법에 대하여 기술하였다.
보통 기업에서는 주기적으로 또는 보안 진단시에 HASH값을 분석하여 단순 패스워드 사용 유무를 점검하곤 하는데 도움이 되었으면 한다.
잠깐 시간내서 정리하였다.