바로가기 => http://www.ahnlab.com/kr/site/securityinfo/secunews/secuNewsView.do?seq=25049
<div style="margin: 0px; padding: 0px; color: rgb(112, 112, 112); line-height: 24px;">
<div style="border-top-color: rgb(106, 142, 198); border-top-width: 2px; border-top-style: solid;">
<p style='background: rgb(251, 252, 253); margin: 0px; padding: 22px 20px 0px; color: rgb(40, 40, 40); letter-spacing: -1px; overflow: hidden; font-family: "맑은 고딕", "Malgun Gothic", sans-serif; font-size: 20px;'>
안랩, CryptXXX 암호화 비밀과 복구 툴 공개
</p>
<ul style="background: rgb(251, 252, 253); list-style: none; margin: 0px; padding: 13px 0px 15px; overflow: hidden; border-bottom-color: rgb(216, 216, 216); border-bottom-width: 1px; border-bottom-style: solid; -ms-zoom: 1;">
<li style="list-style: none; margin: 0px; padding: 0px 0px 0px 20px; color: rgb(112, 112, 112); line-height: 18px; font-size: 13px; float: left;">
<span style='color: rgb(31, 71, 135); font-family: "맑은 고딕", "Malgun Gothic", sans-serif; font-size: 14px; margin-right: 6px;'>
AhnLab
</span>
</li>
<li style='background: url("http://image.ahnlab.com/img_upload/kr/site/images2/common/bar_1x12_d8d8d8.gif") no-repeat 0px 50%; list-style: none; margin: 0px 0px 0px 15px; padding: 0px 0px 0px 15px; color: rgb(112, 112, 112); line-height: 18px; letter-spacing: 0px; font-family: "맑은 고딕", "Malgun Gothic", sans-serif; font-size: 14px; float: left;'>2016-05-26</li>
</ul>
</div>
<div class="scrapBbsViewCont" style='padding: 30px 20px; color: rgb(112, 112, 112); letter-spacing: -1px; font-family: "맑은 고딕", "Malgun Gothic", sans-serif; font-size: 14px; min-height: 200px;'>
<p>크립트엑스엑스엑스(CryptXXX) 랜섬웨어는 정상 파일을 암호화한 후 “.crypt” 확장자로 변경하여 사용자에게 비트코인을 요구하는 랜섬웨어이다. 이 랜섬웨어는 현재까지 버전 1.x, 2.x, 3.x 세 가지 형태가 알려져 있다. 안랩은 현재 크립트엑스엑스엑스 2.x 버전에 의해 암호화된 파일에 대한 복구 툴을 제공하고 있다. 특히, 국내 사용자들이 많이 사용하고 있으나 기존 복구 툴이 지원하지 않는 한글파일(HWP)의 복구도 가능하다는 점이 주목할만하다. </p>
<p> </p>
<p>이 글에서는 크립트엑스엑스엑스 2.x 버전의 암호화 방식과 안랩이 제공하는 복구 툴에 대해 소개한다. </p>
<p> </p>
<p>▶관련 콘텐츠: <a href="http://www.ahnlab.com/kr/site/securityinfo/secunews/secuNewsView.do?seq=25048" target="_self"><span style="color: rgb(0, 117, 200);">CryptXXX 랜섬웨어 분석 완료∙∙∙복구 툴 제공</span></a></p>
<p> </p>
<p><b>1. 암호화 방식</b></p>
<p>[그림1]은 크립트엑스엑스엑스에 의해 암호화된 "Photo.jpg" 파일을 나타낸다. 암호화는 고정크기(0x1FFF)의 블록 단위로 순차적으로 이루어지며, 암호화 최대 크기는 0xD012FE (대략 13M)로 이후의 데이터는 원본과 동일하다.</p>
<p> </p>
<div align="center" style="text-align: center;"><img title="1605262214952981.JPG" src="http://image.ahnlab.com/img_upload/editor/1605262214952981.JPG"></div>
<div align="center" style="text-align: center;"><span style="font-size: 10pt;">[그림1] 크립트엑스엑스엑스 암호화 방식</span></div>
<p> </p>
<p>암호화된 파일은 원본파일과 비교하여 260(=0x104)바이트가 증가한 형태이며, 이는 파일 끝 부분에 삽입된 키테이블(KeyTable) 정보로 인한 것이다([그림 1]에서 붉은 색 블록 참고). 이 키테이블 정보는 블록 단위의 암호를 복호화하는데 핵심이 되는 데이터로 공개키를 통해 암호화되어 저장된다. 즉, 구조적으로는 해당 공개키에 매칭되는 개인키 정보 없이는 해당 키테이블 정보를 복호화할 수 없고, 파일 복구가 불가능하다. 하지만, 해당 키테이블 정보는 개인키 없이도 원본파일 시작부분 일부 데이터(예를 들면 파일포맷 별 Magic 정보)를 통해 파일의 형태를 확인할 수 있으며, 그것을 토대로 유추할 수 있는 키 값으로 복구가 가능하다. </p>
<p> </p>
<p><b>2. KeyTable 생성방식과 취약성</b></p>
<p>[그림 2]는 파일 끝에 삽입된 0x104 바이트 크기의 키테이블이 생성되는 과정을 나타낸다. 이 그림에서 노란색 부분이 공개키로 암호화된 KeyTable_A[0x40] 이며, CryptEncrypt() API를 통해 공개키로 암호화 시 원본 0x40 크기의 데이터가 최종 0x80 크기로 증가된다.</p>
<p> </p>
<div align="center" style="text-align: center;"><img title="1605262215227658.JPG" src="http://image.ahnlab.com/img_upload/editor/1605262215227658.JPG"></div>
<div align="center" style="text-align: center;"><span style="font-size: 10pt;">[그림2] 키테이블 생성과정</span></div>
<p> </p>
<p>[그림2]에서 언급된 암호화에 사용되는 핵심 정보 3가지는 ‘4바이트 SEED 값’, ‘KeyTable_A[0x40]’, KeyTable_B[0x100]이며, 최초 4바이트 크기의 SEED 값으로부터 이후 정보들이 순차적으로 만들어지는 구조를 갖는다. 키 생성과정의 최 상위에 위치하는 SEED 값은 감염 시점의 시스템시간(SystemTime) 정보 중, 시(wHour), 분(wMinute), 초(Second), 밀리초(Millisecond) 를 이용하여 얻어지며, 이 SEED 값으로부터 0x40 크기의 KeyTable_A[0x40] 데이터가 생성된다. 바로 이 부분에서 제작자가 의도하지 않은 취약성이 존재하며, SEED 값이 동일하면 매번 동일한 KeyTable_A[0x40] 가 생성되는 구조를 갖는다. 최종 블록 단위의 암호화에 사용되는 KeyTable_B[0x100]의 데이터와 원본파일로부터 읽은 블록과의 XOR(배타적 논리합)을 통해 암호화가 수행된다. </p>
<p> </p>
<p>즉, SEED 값이 동일하면, 매번 생성되는 최종 키 테이블 정보가 동일한 점과 암호화 방식이 XOR라는 2가지 포인트를 바탕으로 복구대상 파일의 Magic 정보가 존재한다면, 역으로 키를 유추할 수 있는 구조이다. 아래 [그림 3]은 SEED 값이 0x02978CAC 일 때, 생성되는 키 테이블 A, B의 예를 나타낸다.</p>
<p> </p>
<div align="center" style="text-align: center;"><img title="1605262215838116.JPG" src="http://image.ahnlab.com/img_upload/editor/1605262215838116.JPG"></div>
<div align="center" style="text-align: center;"><span style="font-size: 10pt;">[그림 3] 키 테이블 A, B 예제</span></div>
<p> </p>
<p>KeyTable_A[0x40] 데이터가 생성되는 방식은 아래의 2가지 기본 테이블 중, 델파이 랜덤(Delphi Random) 함수를 통해 얻은 랜덤값을 바탕으로 하나의 값이 선택되어 구성되는 구조를 갖는다.</p>
<p>(1) "QWERTYUIOPASDFGHJKLZXCVBNM<>:\<u>?!@$%^&*()_+~|</u></p>
<p>(2) "qwertyuiop[]asdfghjkl;zxcvbnm,./`1234567890-="</p>
<p> </p>
<p>크립트엑스엑스엑스는 총 2번의 델파이 랜덤 함수를 사용하여 아래의 Index(A)와 Index(B)를 얻게 된다. 이 때 Index(A)는 위 기본 테이블 중 하나를 선택하기 위한 목적으로, Index(B)는 선택된 테이블의 데이터 중 하나를 선택하기 위한 목적으로 사용된다.</p>
<p> </p>
<p>Index(A): DelphiRandom(3) - 0 ~ 2 범위의 랜덤 값 생성 (0, 2인 경우 -> (1)번, 1인 경우 -> (2))</p>
<p>Index(B): DelphiRandom(44) - 0 ~ 43 범위의 랜덤 값 생성</p>
<p> </p>
<p>예를 들어 Index(A) == 0 이고, Index(B) == 3이면, ‘R’ 문자열이 선택된다.</p>
<p> </p>
<p><b>3. 키 테이블 생성함수</b></p>
<p>크립트엑스엑스엑스 랜섬웨어에서 파일 암호화 시 사용되는 핵심 정보 3가지의 생성함수는 다음과 같다.</p>
<p> </p>
<p><b>(1) SEED 값 생성</b></p>
<p>[그림4]는 SystemTime 정보를 통해 4바이트 크기의 SEED 값을 생성하는 함수를 나타낸다.</p>
<p> </p>
<div align="center" style="text-align: center;"><img title="1605262216678456.JPG" src="http://image.ahnlab.com/img_upload/editor/1605262216678456.JPG"></div>
<div align="center" style="text-align: center;"><span style="font-size: 10pt;">[그림 4] SEED 값 생성함수</span></div>
<p> </p>
<p><b>(2) 키 테이블(A) 생성</b></p>
<p>[그림5]는 SEED 값을 바탕으로 0x40 크기의 키 테이블을 생성하는 함수이며, do-while 문을 통해 생성되는 0x40 크기의 데이터가 SEED 값이 동일하면 동일 형태로 생성되는 취약성이 존재하는 부분이다.</p>
<p> </p>
<div align="center" style="text-align: center;"><img title="1605262216891063.JPG" src="http://image.ahnlab.com/img_upload/editor/1605262216891063.JPG"></div>
<div align="center" style="text-align: center;"><span style="font-size: 10pt;">[그림 5] 키 테이블(A) 생성 함수</span></div>
<p> </p>
<p><b>(3) 키 테이블(B) 생성</b></p>
<p>[그림 6]은 키 테이블(A)로부터 0x100 크기의 최종 키 테이블(B)가 생성되는 함수를 나타낸다. 이 키 테이블 정보는 1바이트 단위의 블록단위의 암호화 시 XOR 키 값으로 사용된다.</p>
<p> </p>
<div align="center" style="text-align: center;"><img title="1605262217197337.JPG" src="http://image.ahnlab.com/img_upload/editor/1605262217197337.JPG"></div>
<div align="center" style="text-align: center;"><span style="font-size: 10pt;">[그림 6] 키 테이블(B) 생성 함수</span></div>
<p> </p>
<p><b>4. 복구 방식</b></p>
<p>시, 분, 초, 밀리초 정보를 통해 계산되는 SEED 값의 범위는 다음과 같다.</p>
<p> </p>
<p>- 최소값: 00:00:00:0000 -> 0, 최대값: 23:59:59:999 -> 0x5265bff</p>
<p> </p>
<p>사용자마다 그리고 암호화된 파일마다 서로 다른 SEED 값을 유추하기 위해 0 ~ 0x5265bff 범위의 SEED 를 순차적으로 선택하며, 이를 바탕으로 암호화에 사용된 키 테이블을 생성 및 복호화를 시도한다. 첫 번째 블록에 대한 복호화를 통해 파일의 고유한 식별정보(Magic)가 확인되면, 유효한 SEED 값으로 판단하고 전체 파일에 대한 블록단위의 복구를 시도한다. 우선 첫 번째 파일이 복구에 성공하면, 두번째 파일부터는 SEED의 범위를 제한하여 좀 더 빠른 복구가 가능하도록 했다. 이러한 설정은 복구 대상 파일들이 동일 시간대에 감염된 형태가 대부분일 것으로 가정하여 이루어진 것으로 복구 대상 파일들이 서로 다른 시스템에서 다른 시간대에 수집된 형태의 경우, 복구 시간이 더 오래 걸리는 특징을 갖는다.</p>
<p> </p>
<p>[그림7]은 크립트엑스엑스엑스 복구 툴에서 파일 복구를 위해 이루어지는 과정을 나타낸 것으로 구조상 첫 번째 파일을 복구하는데 오랜 시간이 소요되며, 이후 파일부터는 빠르게 복구가 가능하다.</p>
<p> </p>
<div align="center" style="text-align: center;"><img title="1605262217630714.JPG" src="http://image.ahnlab.com/img_upload/editor/1605262217630714.JPG"></div>
<div align="center" style="text-align: center;"><span style="font-size: 10pt;">[그림 7] 크립트엑스엑스엑스 복구 과정 </span></div>
<p> </p>
<p><b>5. 복구 대상 리스트</b></p>
<p>복구 툴을 통해 복구 가능한 그립트엑스엑스엑스 버전은 2.x 로 제한적이며, 우선 아래의 확장자들에 대해 복구가 가능하도록 제작되었다. 특히, 국내 사용자들이 많이 사용하고 있으나 기존 복구 툴이 지원하지 않는 한글파일(HWP)의 복구가 가능하다. 이 외에도 원본파일의 고유한 식별정보만 알 수 있다면, 복구가 가능한 구조임으로 추후 복구 대상이 추가될 수 있다.</p>
<p> </p>
<p>CHM, AI, HWP, PDB, PDF, RTF, HTM, HTML, PHP, XML, DWG, PS, WSF, KEY, CSR, CRT, WAV, MP3, OGG, WMA, WMV, AVI, ASF, MP4, MOV, MID, MPG, FLV, PNG, GIF, BMP, TIF, JPG, JPEG, ZIP, RAR, BZ2, 7Z, GZ, JAR, APK, TGZ, ODS, DOC, DOT, PPT, POT, PPS, XLS, XLT, DOCX, DOCM, DOTX, DOTM, PPTX, PPTM, POTM, POTX, PPSM, XLSX, XLSB, XLSM, XLTM, XLTX, EPS, ISO, SQLITE3, MDB, MSI, APP, FDB, ACCDB, SLN, CLASS, VCXPROJ</p>
<p> </p>
<p><b>6. 복구 툴 경로</b></p>
<p>안랩은 크립트엑스엑스엑스 랜섬웨어 2.x 버전에 대한 복구 툴을 랜섬웨어 보안센터를 통해 무료로 제공하고 있다. </p>
<p> </p>
<p>▶<a href="http://www.ahnlab.com/kr/site/securityinfo/ransomware/index.do" target="_self"><span style="color: rgb(0, 117, 200);">안랩 랜섬웨어 보안센터 바로가기</span></a></p>
<p> </p>
</div>
<div style="padding: 20px 20px 15px; border-top-color: rgb(216, 216, 216); border-bottom-color: rgb(179, 179, 179); border-top-width: 1px; border-bottom-width: 1px; border-top-style: solid; border-bottom-style: solid;">
<ul style="list-style: none; margin: 0px; padding: 0px 0px 5px; width: 100%; overflow: hidden;">
<li style='background: url("http://image.ahnlab.com/img_upload/kr/site/images2/common/bar_1x12_d8d8d8.gif") no-repeat 0px 50%; list-style: none; margin: 0px; padding: 0px; height: 30px; line-height: 30px; float: left;'>
<div style='background: url("http://image.ahnlab.com/img_upload/kr/site/images2/common/img_no_100_30.gif") no-repeat -11px -2px; margin: 3px 0px 0px; width: 77px; height: 25px;'>
<img class="photo" alt="AhnLab 로고" src="http://image.ahnlab.com/img_upload/info/securityinfo/200809/008.gif">
</div>
</li>
<li style='background: url("http://image.ahnlab.com/img_upload/kr/site/images2/common/bar_1x12_d8d8d8.gif") no-repeat 0px 50%; list-style: none; margin: 0px 0px 0px 20px; padding: 0px 0px 0px 20px; height: 30px; color: rgb(40, 40, 40); line-height: 30px; font-family: "맑은 고딕", "Malgun Gothic", sans-serif; font-size: 14px; float: left;'>
ASEC 분석팀
</li>
</ul>
</div>
</div>
<div style="margin: 30px 0px 0px; padding: 20px; border: 1px solid rgb(216, 216, 216); border-image: none; color: rgb(112, 112, 112); line-height: 24px; letter-spacing: -1px; font-size: 14px; background-color: rgb(250, 250, 250);">
<p style='color: rgb(31, 71, 135); font-family: "맑은 고딕", "Malgun Gothic", sans-serif; font-size: 14px;'>이 정보에 대한 저작권은 AhnLab에 있으며 무단 사용 및 도용을 금합니다.</p>
<p style='font-family: "맑은 고딕", "Malgun Gothic", sans-serif; font-size: 14px;'>단, 개인이 비상업적인 목적으로 일부 내용을 사용하는 것은 허용하고 있으나, 이 경우 반드시 출처가 AhnLab임을 밝혀야 합니다.<br>
기업이 이 정보를 사용할 때에는 반드시 AhnLab 의 허가를 받아야 하며, 허가 없이 정보를 이용할 경우 저작권 침해로 간주되어 법적인 제재를 받을 수 있습니다. 자세한 내용은 <a title="새창" style='color: rgb(14, 119, 217); font-family: "맑은 고딕", "Malgun Gothic", sans-serif; font-size: 14px; text-decoration: underline;' href="http://www.ahnlab.com/kr/site/etc/agreement.do?gubun=3" target="_blank">컨텐츠 이용약관</a>을 참고하시기 바랍니다.</p>
<p style='margin: 25px 0px 0px; font-family: "맑은 고딕", "Malgun Gothic", sans-serif; font-size: 14px;'>정보 이용 문의 : <a style='color: rgb(14, 119, 217); font-family: "맑은 고딕", "Malgun Gothic", sans-serif; font-size: 14px; text-decoration: underline;' href="mailto:contents@ahnlab.com">contents@ahnlab.com</a></p>
</div>