본문으로 바로가기

[Tools/Linux] - 바이퍼(Viper) #01 - 개요 및 설치
[Tools/Linux] - 바이퍼(Viper) #02 - 프로젝트(Project)




1. 샘플파일 수집


본 문서에서는 바이퍼 디렉터리 안에 malware 이름으로 별도의 디렉터리를 만들어 악성코드들을 저장했으며, 악성코드는 TEKDEFENSE 에서 공개한 샘플들을 이용하였다.


샘플을 다운로드 받는 과정은 귀찮은 작업이 될 수 있다. 그래서 다음 파이썬 소스코드를 이용하면 샘플을 자동으로 다운받을 수 있다. 다운받는 샘플은 확장자가 .zip 으로 끝나는 샘플들을 다운로드 받으며, 사전에 테스트해본 결과 .zip 파일에 압축되어 있는 파일들은 대부분 윈도우 실행 파일 구조를 가지고 있는 악성코드들이다.

# -*- coding: utf-8 -*-
#!/usr/bin/env python
import urllib2
import re
web_page = urllib2.urlopen("http://www.tekdefense.com/downloads/malware-samples/").read()
regex1 = "<h3 class=\"title\"><a href=\"/downloads/malware-samples/(.+)\">"
a = re.findall(regex1, web_page)
for file_name in a:
    ori_url = "http://www.tekdefense.com/downloads/malware-samples/"
    regex2 = "(.+\.zip)"
    b = re.findall(regex2, file_name)
    for file_name2 in b:
        file_name3 = re.sub(" ", "%20", file_name2)
        u = urllib2.urlopen(ori_url+file_name3)
        f = open(file_name3, 'wb')
        meta = u.info()
        file_size = int(meta.getheaders("Content-Length")[0])
        print "Downloading: %s Bytes: %s" % (file_name2, file_size)

        file_size_dl = 0
        block_sz = 8192
        while True:
            buffer = u.read(block_sz)
            if not buffer:
                break
            file_size_dl += len(buffer)
            f.write(buffer)
            status = r"%10d  [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
            status = status + chr(8)*(len(status)+1)
            print status,
        f.close()

소스코드 참조 - http://blog.readiz.com/2#.VK8mPyusWJc


소스코드를 실행하면 다음과 같이 다운로드 받는다.


파일 다운로드 로그


이제 압축을 해제하는데, 우분투 12.04 LTS 에 기본으로 설치되어 있는 unzip 패키지의 버전과 맞지 않아 다운로드 받은 압축파일을 해제할 수 없다.


압축해제 시도


다음과 같이 7z을 설치하여 압축을 해제한다.

$ sudo apt-get install p7zip-full
$ 7za x [파일 명]


하지만 파일 개수가 많으니, 한번에 해제하기 위해 간단하게 파이썬 스크립트를 제작한다. 우선 압축된 파일의 정보를 수집해보면 암호화 되어 있고, 압호화 방식은 AES-128로 되어 있음을 알 수 있다. 


압출파일 정보


AES 방식으로 암호화 되어 있으면 파이썬 라이브러리인 zipfile을 사용할 수 없다. 그래서 리눅스 시스템에 직접으로 명령을 내리도록 작성한다. 소스코드 내용을 설명하면, 현재 실행되는 파이썬 스크립트의 위치에 파일들을 읽어와서 순차적으로 압축을 해제한다. 비밀번호는 infected이다. 


import os, subprocess
for root, dirs, files in os.walk('./'):
    for file in files:
        subprocess.call(["7za","x","-pinfected",file])

소스코드 참조 - http://stackoverflow.com/questions/15553150/python-unzip-aes-128-encrypted-file


만약 다운로드와 동시에 압축을 해제하고 싶다면 다음 소스코드를 이용한다.

# -*- coding: utf-8 -*-
#!/usr/bin/env python

import urllib2
import re
import subprocess

web_page = urllib2.urlopen("http://www.tekdefense.com/downloads/malware-samples/").read()
regex1 = "<h3 class=\"title\"><a href=\"/downloads/malware-samples/(.+)\">"
a = re.findall(regex1, web_page)
for file_name in a:
    ori_url = "http://www.tekdefense.com/downloads/malware-samples/"
    regex2 = "(.+\.zip)"
    b = re.findall(regex2, file_name)
    for file_name2 in b:
        file_name3 = re.sub(" ", "%20", file_name2)
        u = urllib2.urlopen(ori_url+file_name3)
        f = open(file_name3, 'wb')
        meta = u.info()
        file_size = int(meta.getheaders("Content-Length")[0])
        print "Downloading: %s Bytes: %s" % (file_name2, file_size)

        file_size_dl = 0
        block_sz = 8192
        while True:
            buffer = u.read(block_sz)
            if not buffer:
                break

            file_size_dl += len(buffer)
            f.write(buffer)
            status = r"%10d  [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
            status = status + chr(8)*(len(status)+1)
            print status,

        f.close()
        subprocess.call(["7za","x","-pinfected",file_name2])




[Tools/Linux] - 바이퍼(Viper) #04 - 스토어(Store) 명령



댓글을 달아 주세요

티스토리 툴바