음.... 원래는 각각 수집했던 URL을 나눠서 폴더마다 분리해 관리하려고 했다.
과거 유포됬던 파밍 악성코드의 특징은 유포지(일반 웹사이트) -> 경유지(타 호스트 웹 사이트) -> 최종지(타 호스트 웹 사이트) -> 페이로드(타 호스트 웹 사이트) 이러한 경로로 구성되어있다.
문서에서는 편하게 유포자/악성코드 배포자를 공격자라고 부르겠다.
공격자 특성이 저런식으로 했었는데 당시 나름 추측하기로는 유포지는 굉장히 리스크가 크게 작용하는 것이였다. 뚫는것도 뚫는것이고.. 구지 경유지에 악성코드, 최종지에 악성코드를 넣어 웹 솔루션에 삭제될 바엔 상대적으로 관리가 허술한 개인 홈페이지, 솔루션이 딱히 없는 일반 호스팅에 경유지와 최종지 등을 두고 유포한 것으로 생각했다.
경유지나 최종지, 페이로드 모두 당시에 큰 사이트도 아니였고, 몇 년간 방치돼거나 관리가 허술한 무료 호스팅 서비스로 되어있던 사이트들 이였다.
공격자 입장에서도 관리가 허술한 오래된 웹 빌더 또는 플랫폼이 취약점 해킹에 용이했을테니... 그런식으로 유포한것 같다.
아래는 웹 악성코드 유포 당시 찍은 스크린 샷이다.
마스킹처리가 되어있지만 현 주소에 common.js에서 n2j.js로 연결되는 eval code를 볼 수 있다.
도메인 길이를 보아 서로다른 웹사이트인 것을 알 수 있다.
아래는 아이프레임 구조로 삽입된 비 정상 코드
이 역시 도메인과 다르게 의심돼는 아이피주소로 이루어진 php링크를 볼 수 있다.
이와 같이 404인 상태 또는 최근 기록이 없는것은 비 정상링크로 구분하여 레거시 링크라 표현하는걸로 기억한다
이와 같은 비정상 코드를 구분해내는게 패턴식, 시그니처 방식의 탐지이다
요즘이야 머신러닝으로 학습해서 패턴을 파악하는 반면 이 또한 데이터가 충분히 있어야 학습하여 흔히 말하는 인공지능 악성코드 탐지 시스템이 돼는 것 이다.
패턴이 꽤나 단순하고 의심 링크의 리다이렉션을 따라가 최종적으로 수상한 코드를 탐지해내는 방식이 이전의 방식이였다.
참고로 나는 머리가 나쁘므로 머신러닝과 같은 것 보다 내 손과 단순한 머리가 대신 노동을 해줄 것 이다.
이전 작성했던 코드를 보면 스토리보드를 작성해놨다
악성코드 탐지는 굉장히 단순하면서 코드에서 입력돼는 정보가 많아 복잡할 것도 없다.
단순히 정리하면 페이지 정보 -> 분석 -> 결과 -> 무결성 해시, 웹, 탐지한 url 등등.. 디비에 집어넣는 작업이 더 많다
우리는 웹사이트를 들어가게돼면 아래와 같은 정보를 받는다
현재 웹 페이지의 응답코드가 200인가 ? -> 예 로드함
현재 페이지가 리다이렉션 하는가 ? -> 예 로드함
웹 페이지 메인에서 로드돼는 html, js, css 등등이 있는가 ? -> 예 로드함
크게보면 위와 같은데 디테일하게 들어가면 귀찮아지니 대충 저정도로 마무리하자.
분석코드 1번은 index가 로드될 때 아래와 같은 시그니처를 이용해 탐지해낸다
공격자 특성상, 대부분의 비정상코드 삽입 유형은 로드돼는 js에 집중되어있다.
맨 아래쪽에 위치하거나, 맨 위쪽에 eval코드 또는 쌩 코드로 난독화 하지않고 박아놓는 경우가 있다.
그냥 쌩코드로 인덱스나 자바스크립트 파일에 박는경우도 있다.
이렇게 우리는 각 정보를 받아오고 로컬 도메인 또는 아이피와 다를 경우 먼저 검사 리스트에 올리게 된다.
검사 리스트에 올라온 뒤로는 두번째 분석코드로 내용이 전달된다.
어미루프(최상위 루프)는 받아온 URI를 재 정렬하여 하여 접속과 동시에 두번쨰 루프로 본격적인 분석을 시작하게 된다.
아래는 주요 탐지 코드
위 사진을 보면 ETC_3 컬럼에 설명이 나와있다.
대표적으로 궁금할 수 있는데, bmw;bmw는 실제 ck exploit kit에 탑재된 특정 패턴이다. mini;mini 또한 마찬가지, 이게 약간 익스플로잇 킷에 버전에 따라 다른데, 이전 것이 kaixin 또는 gongda로 불리우던 익스플로잇 킷이 전신이고 기억하기로는 PAC 스크립팅 공격 (2016-0189)이후로 bmw;bmw 패턴을 쓰다가 mini;mini패턴으로 바뀐걸로 알고있다.
해당 변수는 최종적으로 페이로드를 불러오는 부분의 함수... 였는지 기억이안나는데 아무튼 페이로드 로드쪽이였다.
아래는 스크립트 파일 연결 부분..
여기서 str_Base64에 해시값을 볼 수 있는데, 저 해시값을 통해 분석 스크립트를 따로 나눴기 때문에 해당 str_Base64에 맞는 스크립트 파일 str_Base64에 맞게 움직인다, 분석 스크립트를 분리해놓은 이유는 차후 변경 또는 새로운 방식으로 변경되었을 때 분석스크립트의 과거 스크립트 보존과 바뀐 스크립트를 구분하기 위함이였다.
ck exploit kit의 패턴인 bmw;bmw를 base64로 인코딩하면 <Ym13O2Jtdwo=>가 된다.. base64를 쓴건 단순히 스크립트 디버깅때 편리를 위해서였다. (나만 볼꺼니까 뭐...)
이런식으로 분석이 끝나면 텔레그램 API와 연동해 알람이 가게 만들었었다.
추가로 공격자는 공격 링크를 바꾸기도 한다. 앞서 말했듯 공격자는 유포지 -> 경유지 -> 최종지 순으로 악성코드를 구성하기 때문에 경유지가 막히게된다면 다른 경유지로 변경할 수 있기 때문에 호스트를 따로둔다고 했다.
아래는 모니터링하던 페이지에 새로운 링크가 추가된 모습이다
해당 링크는 경유지이다. js로 연결하여 최종지로 연결된다.
파싱한 주소는 404 상태였다.
6일정도 지나자 404상태였던 index.html에 새 링크 counter 추가
여기서 해당 링크가 궁금할 수 있는데, 이는 중국에서 서비스중인 방문자 통계 사이트다
공격자는 해당 사이트에 방문자 통계 스크립트를 먼저 삽입하여 '파급력'을 알아보기위해 나름의 분석을 하게된다
뇌피셜이지만 얼마나 많은 수가 접속하여 얼마나 많이 감염될지 간을 보는것, 사실 기정 사실화된 부분이기도 했다
며칠 후 갑작스러운 다른 링크로 변경
이러한 경우는 공격자가 다른 링크로 변경한 이유는 빠른 차단을 피하기 위함으로 보면 될 것 같다.
링크가 한번더 바뀐모습, 이쯤돼면 차단이고 뭐고 공격자 지맘대로기 때문에 수시로 모니터링이 필요하다.
스크립트 로직상 URI를 등록하게돼면 특별관리 대상으로 빠지기떄문에 해당부분은 따로 모니터링하게된다
바로 공격 시작, 오후 시간대 공격을 시작했다.
그 다음날인 13일 5시 7분전, 페이로드 변경 탐지
페이로드가 변경돼면서 유포돼는 파일 해시역시 바뀌었을 것 이다.
페이로드 파일 해시가 바뀌는건 유포중일때 수시로 바뀌는데 이는 백신이 1차적으로 탐지하는 기준이 데이터가 업데이트된 파일의 해시이기 때문에 많으면 40번정도나 파일해시를 바꾸면서 유포하게된다.
그렇게 다음날 오후시간대쯤 공격 후 하루만에 악성코드가 빠졌다
카운터를 계속 남겨두는 이유는 공격자가 빼지 않았거나, 추후 추가공격을 할 수 있다는 의미이다.
그렇게 다음날 오후 저녁시간대 재탐지
CK Exploit kit으로 유포한건 파밍 악성코드, 이후로는 모바일 악성코드로 공격을 실행한다.
다른 유포지에서 업데이트된 얼럿을 보면 14일 오후 3시에 탐지한 유포지
아래는 해당 APK가 유포중인 모바일 접속 결과
당시에는 플래시 보안 업데이트 어플로 유인하여 설치를 요구하는걸로 기억한다.
이후 15일 오후 23시, 다른 URL로 또 다시 변경
추가공격이 계속됨에따라 모니터링을 계속 했지만 해당 링크에서는 아무것도 나오지 않았다.
이처럼 공격자의 성격을 파악하는게 매우 중요하다
글을 쓰다보니 생각보다 코드리뷰보다는 분석내용이 더많았다... 다시 본론으로 돌아가서
전반적인 스크립트 작업은 아래 그림처럼 나타난다
악성코드 특성상 다른 호스트의 주소를 넣기때문에 모두 보지않으면 위협을 탐지할 수 없을수도 있다.
이에따른 오탐도 생길테고 리스크가 있으니 대부분의 업체가 1~2 페이지 정도의 depth을 설정해뒀는데 나 역시도 메인페이지로부터 1depth정도로 탐지했던걸로 기억한다 (의심링크나 악성링크는 Full depth !)
... 뭐 끝이다. 차라리 코드내용보다 이 글을 보는 사람들은 직접 만들 수 있는사람이 더 많을 것 같으니 분석위주로 올리는게 좋을지도 모르겠다.