해외에서는 Sextortion이라는 용어로 알려져 있습니다. 국내에서는 몸캠 사기, 몸캠 피싱과 같은 용어로 불려지고 있는데 엄밀히 따지자면 Sextortion은 성관련 협박 범죄를 총칭하는 의미가 될 수 있기 때문에 몸캠 피싱이 Sextortion 범죄의 여러 종류 중 하나라고 볼 수 있겠습니다. 몸캠 피싱의 주된 피해자는 남성이며 생식기가 대뇌의 컨트롤을 벗어난 경우에 주로 피해가 발생하게 됩니다. 주소록에 삭제하지 않은 전 여자 친구에게까지 본인의 나체를 영상으로 공유하고 싶은 게 아니라면, 모르는 이성과의 은밀한 데이트는 오프라인에서 만나 안전한 장소에서 합의하에 하시길 바랍니다. 이에 관련된 내용을 정리해 봤습니다.

 

몸캠 피싱 앱은 어떻게 생겼나?


몸캠 피싱 앱은 위와 같은 아이콘과 함께 "요가영상", "갤러리", "Support", "동영상", "상상톡", "비밀채팅", "야밤톡" 등 다양한 이름을 가지고 있다.

 

악성 앱 (com.android.mobilephone)


  • 몸캠 피싱에 사용되는 악성 앱이 요구하는 권한
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

  • 실행하면 보이는 화면

클랜 앱같은 소리 ...

악성 앱은 최초 실행 시 필요 권한을 사용자에게 요청하도록 팝업을 띄우게 되며 허용하는 순간 기기에 저장된 주요 정보가 C&C 서버로 유출된다. 여기서 말하는 주요 정보는 "전화번호, IMEI, 기기 모델명, 주소록, 전화 송수신 내역, SMS 송수신 내역, 저장된 사진과 동영상" 등이다. 즉, 감염되는 순간 매우 개인적인 정보들이 유출되는데 범죄자 입장에선 고마운 일이고, 피해자 입장에선 돌이킬 수 없는 결과를 낳게 된다.

 

C&C 서버 (222.239.248[.]195, KR, AS9318)


C&C 서버는 이렇게 생겼는데 한글이 보이네?

C&C 서버는 이렇게 생겼다. 아이디와 비밀번호를 입력하고 접속하게 되면 아마도 감염된 기기들이 리스트업 되어 있고, 감염된 기기에서 업로드된 정보들을 볼 수 있는 메뉴로 구성되어 있을 것이다. C&C 서버의 IP주소는 SKB가 관리하는 국내 대역이라는 건 불편한 진실이다.

 

결론


C&C 서버를 국내 대역을 쓰는만큼 수사가 시작되면 증거물 압수에는 문제가 없을 듯한데, 한 가지 이상한 점은 C&C 서버의 IP주소가 호스팅 업체 대역이 아니라 ISP 대역이라는 점이다. 정상적인 시스템을 해킹해서 C&C로 기생하고 있는 것인지 간 큰 공격자가 집에서 C&C를 돌리고 있는 건지는 모르겠다. 블로그에서 공개할 수 없는 재밌는 내용이 몇 개 있는데, 이 내용들은 따로 정리해서 비공개 모임에서 다룰 예정이다.

 

IoC (Indicator of compromise)


  • C&C 서버
    • http://222.239.248[.]195/erf/Home/
  • 분석에 사용된 샘플
    • (sha256) 0fad128f4aa25df09b5981c6949cb72a0d178b0d36e3a0a26dee45215e5d90bc
,

대한민국 법무부를 사칭하는 악성 앱이 발견되었는데, 악성 앱 내부에 또 다른 악성 앱이 숨겨져 있는 구조가 확인되었습니다. 이에 관련된 내용들을 정리해봤습니다.

악성 앱 안의 악성 앱


com.helloworld.mytest 안에 com.emersonclimate.aebulletin

com.helloworld.mytest 앱을 열어서 Assets 경로를 들여다보면 com.emersonclimate.aebulletin라는 앱이 숨겨져 있는 것을 확인할 수 있다. PE 악성코드에서도 실행파일의 리소스 영역에 악의적인 코드를 추가로 숨겨두는 경우가 종종 있는 것처럼 이 경우도 비슷한 경우라고 판단된다. 하지만 PE 악성코드처럼 리소스 영역으로 쉽게 분기하는 형태가 아니라 Assets 경로 안에 숨겨진 앱을 인스톨하는 형태기 때문에 관련된 코드들을 봤을 때 com.helloworld.mytest는 "악성 앱 인스톨러"라고 불러야겠다. 

com.helloworld.mytest 의 AndroidManifest.xml 중 일부
인스톨과 관련된 코드 중 일부

 

인스톨러 (com.helloworld.mytest)


인스톨러는 스팸전화와 관련된 앱들이 설치되었는지 확인하고 설치되어 있을 경우 사용자에게 악성 앱으로 소개하며 삭제를 유도한다.

this.setContentView(0x7F09001F);  // layout:activity_web
this.mPkgArray = new String[]{"com.ktcs.whowho", "gogolook.callgogolook2", "com.andr.evine.who", "com.whosthat.callerid", "kr.co.thecall", "com.whox2.lguplus", "com.lguplus.blocksmishing", "tpkorea.com.moim"};
this.mWebView = (WebView)this.findViewById(0x7F0700D4);  // id:webview
WebSettings v11_1 = this.mWebView.getSettings();
v11_1.setJavaScriptEnabled(true);
v11_1.setDomStorageEnabled(true);
this.mWebView.setWebViewClient(new e(this, null));
this.mWebView.loadUrl("file:///android_asset/web/" + this.mType + ".html");
this.mWebView.setBackgroundColor(0);
int v11_2 = this.mType;
if(v11_2 == 2) {
    this.mHandler.postDelayed(this.mRunnable, 666L);
}
else if(v11_2 == 3) {
    this.addedReceiver();
    c.b(this.mContext, "K_INIT_SCAN_DONE", "ok");
}
else if(v11_2 == 4) {
    try {
        c.a(this.mContext);
        this.startActivity(new Intent("android.intent.action.VIEW", Uri.parse("openqjaanqnauth://hello")));
    }
    catch(Exception unused_ex) {
    }
}

정상 앱들을 보고 악성 앱이라고 하지만 법무부를 사칭하기 때문에 사용자들은 충분히 속을 수 있다.

법무부를 사칭하는 악성 앱이 정상 앱을 삭제하라네 ... ?

만약 스팸전화와 관련된 앱들이 하나도 없다면 탐지된 스파이앱이 없다고 친절하게 알려준다.

스파이앱이 스파이앱이 없다고하면 ...

 

악성 앱 (com.emersonclimate.aebulletin)


  • 설치되는 악성 앱이 요구하는 권한
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="android.permission.BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_UPDATES" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_MMS" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

 

  • 악성 앱 파일의 내부

인스톨러를 통해 설치되는 악성 앱의 내부

악성 앱 파일 내부를 보면 secret-classesN.dex 파일들이 존재하는데 이 파일에 실제 악의적인 행위를 하는 코드들이 들어 있다. 하지만 중국 개발자가 만든 프로텍터로 암호화 되어있기 때문에 복호화하지 않으면 정적 분석은 불가능하다. 물론 키값을 알고 있으면 복호화해서 정적 분석을 할 수 있는데, 이번 경우에는 개발자의 실수(?)로 인해 암호화된 dex 파일을 복호화하는 루틴과 관련된 키 값이 존재하지 않아 암호화된 dex 파일을 복호화할 수 없었다.

 

결론


2020년 9월 2일에 수집된 이 앱은 안타깝게도 정상적으로 동작하지 않는다. 개발자의 실수인지 의도인지 모르겠지만 인스톨러가 내부에 가지고 있는 악성 앱을 인스톨 조차 하지 못하는 문제가 있고, 숨겨진 악성 앱도 강제로 추출해서 확인해본 결과 앱 구성상에 문제가 있어 인스톨러가 악성 앱을 정상 설치 했더라도 동작하지 못했을 것이다. 공격자의 실수로 좋은 힌트를 얻었으니 이제 앞으로 벌어질 공격에 대비만 하면 되겠다.

 

IoC (Indicator of compromise)


  • 피싱 사이트
    • http://nimabi7.gnway[.]cc/seoul/kics/login.html
  • 앱 설치 후 등록되는 아이콘

이런 앱이 실제로 있나?

,

HDCON 2017 rock.apk write up

from War Game 2017. 9. 19. 13:06

배점은 100점이며, 가위 바위 보에 연속적으로 이겨서 플래그를 획득할 수 있다는 문제이다.

파일크기가 800kb 가 안되는 apk 파일을 문제로 제공한다.

apk 파일 열어 일단 Manifest 를 봤다.


메인엑티비티와 CallMe, WhyCall 이라는 2개의 리시버가 보인다.

그리고 각 리시버들의 priority 값이 할당되어 있는데 CallMe는 1이고 WhyCall은 2이다.

둘다 core.hdcon.android2017.oops 로 호출이 되는데 priority 값 때문에 단순히 호출만으로는 절대 CallMe를 동작시킬 수 없다.

근데 문제 풀이를 위해서 딱히 중요한 내용은 아니다.


Libraries 를 보면 so 파일이 들어 있는데 앱에서 일부 사용되는 native 함수가 구현되어 들어 있다.

이 so 파일은 문제를 풀기 위해 반드시 분석해야되는 파일이다.

(팁: genymotion 은 x86기반 에뮬레이터다.)

Resources->values->strings.xml 을 보면 아래와 같은 내용을 확인할 수 있다.


소스외에 것들은 대충 본것 같으니 이제 소스코드를 보자.

아래는 MainActivity 에 onCreate 코드이다.


MainActivity.this.e 변수가 들고 있는 값이 putExtra 를 통해서 mm 이라는 이름으로 전달된다.

그럼 mm 의 상호참조를 한번 확인해보자.


CallMe의 onRecevie 에서 mm 을 참조하는가 보다.


CallMe의 onReceive 코드를 보니 getString 으로 mm 이 가지고 있는 값을 읽어 오는게 보이고...

그 바로 아래 try 내부에 구현된 코드를 보면 느낌이 딱 온다.

혹시나 저 코드를 보고 아무런 느낌이 오지 않는다면 절레절레… (그렇다고 너무 실망은 하지 마시고 더 열심히 하시면 됩니다.)

배열에 넣고 길이값 만큼 지지고 볶는코드이고, 오랜만에 보는 삼항연산자도 있다.

v4[v1] = v1 < 0x10 ? A : B

전자의 조건식이 참이면 A를 실행하고 거짓이면 B를 실행하는 무시무시한 코드다.

어쨋든 A, B 모두 ck 함수를 호출하는데 이게 또 native 함수다. 즉 위에서 봤던 so 파일에 기능이 구현되어 있기 때문에 apk 만 봐서는 절대 무슨 형태로 문자열을 작살내는지 확인할 길이 없다.

좋은회사라면 당신에게 hexray 를 사줬을 것이다. (hexray를 사주지 않았다고 해서 꼭 나쁜회사는 아니다. 핸드레이를 열심히 하시면 됩니다.)

그럼 아래와 같이 편하게 ck 함수의 슈도코드를 볼 수 있다.

onReceive 에 구현된 코드와 ck 함수를 본인이 원하는 언어로 옮겨 담으면 90%가 끝난다. (저는 python 을 좋아해서 python 으로 옮겨 담았습니다.)



다시 CallMe 의 onReceive 를 보자.


각 변수들이 어떤 값을 가지고 있는지 무슨 용도일지 감이 대부분 잡힌다.

그런데 v7은 v3를 참조한다는거 말고는 어떤 값을 가지고 있는지 현재로서는 알 수 없다.

v3 또한 getString으로 mm의 값을 가져오는데 mm의 값이 뭔지 알 수 없다.

그럼 putExtra로 mm을 던지는 MainActivity로 다시 가보자.


mm의 값은 MainActivity.this.e 를 참조하고, MainActivity.this.e는 rps_calc 을 통해 만들어지는것을 최종적으로 알 수 있다.

rps_calc은 native 함수다. 다시 so 파일을 보자.

hexray로 rsp_calc 함수부분을 보면 k 값이 17916 이상일때 동작하는 코드가 보인다. 

이쯤 되면 느낌이 오지 않는가!


rps_calc 함수 자체는 가위 바위 보 게임을 할때 이기거나, 비기거나, 졌거나 등의 메시지를 다루는데, v10을 보면 뭔가 이상한 문자열이 보인다.

‘S=TX’, ‘^=_=‘, … 그리고 v14의 0(null)까지 하나의 문자열이므로 한줄로 줄을 세워보면…

XT=S=_=^=”= =!=' 이 된다.

그리고 이 문자열을 xor 하는 do while 을 보면 v9 값으로 하나씩 xor 시켜주는걸 볼 수 있다. v9은 ae의 값을 가지며, ae는 0x10 이다.

코드를 간단하게 짜서 돌리면 …


17916 점수를 넘기게 되면  HD-C-O-N-2-0-1-7 이라는 문자열이 만들어진다.

안타깝지만 이 문자열은 flag 값이 아니고, mm 이라는 이름으로 전달되어 flag 를 디코딩(?)하는데 사용되는 값이다.

퍼즐은 다 모았으니 다시 코드를 간단하게 짜서 돌리면 …



이렇게 최종적으로 flag 값을 얻을 수 있다.


모든 문제를 다 풀지는 못했지만 이 문제는 ‘게싱’이 덜 필요한 그나마 정상적인 문제였다고 생각한다. 


,