Exemple #1
0
    def scan(self, filehandle, filename, fileformat, filename_ex):  # 악성코드 검사
        mm = filehandle

        if mm[:4] == '{\\rt':  # RTF 파일
            # CVE-2010-3333
            t = self.prog_cve_2010_3333.search(mm)
            if t:
                val = int(t.groups()[0])
                if val != 2 and val != 4 and val != 8:
                    if self.verbose:
                        print '[*] RTF :', val

                    return True, 'Exploit.RTF.CVE-2010-3333', 0, kernel.INFECTED

            # CVE-2014-1761
            t = self.prog_cve_2014_1761.search(mm)
            if t:
                val = t.groups()[0]
                if self.verbose:
                    print '[*] RTF :', val

                t1 = re.findall(r'{\\lfolevel}', mm)
                if t1:
                    if self.verbose:
                        print '[*] N :', len(t1)
                    if len(t1) > int(val):
                        return True, 'Exploit.RTF.CVE-2014-1761', 0, kernel.INFECTED
        else:
            if kavutil.is_textfile(mm[:4096]):
                t = self.prog_eps_dropper.search(mm)
                if t:
                    return True, 'Trojan.PS.Agent', 0, kernel.INFECTED

        # 악성코드를 발견하지 못했음을 리턴한다.
        return False, '', -1, kernel.NOT_FOUND
Exemple #2
0
    def scan(self, filehandle, filename, fileformat, filename_ex):  # 악성코드 검사
        try:
            mm = filehandle

            if not ('ff_html' in fileformat or 'ff_script' in fileformat
                    or 'ff_iframe' in fileformat or 'ff_bat' in fileformat
                    or 'ff_script_external' in fileformat
                    or 'ff_iframe_external' in fileformat):
                raise ValueError  # 해당 포맷이 포함되을때만 script 엔진 검사

            if 'ff_bat' in fileformat and mm[:13] == KICOMAV_BAT_MAGIC:
                p = re.compile(r'set\s+(\w+)=', re.IGNORECASE)
                t_set = p.findall(mm)
                t_count = 0
                for k in t_set:
                    p = re.compile('echo\s+.+?%s' % k)
                    if p.search(mm):
                        t_count += 1

                if t_count > 5:
                    return True, 'Trojan.BAT.Agent.gen', 0, kernel.INFECTED

            if kavutil.is_textfile(mm[:4096]):
                buf = mm[:]

                buf = self.p_http.sub('', buf)  # http:// 제거
                buf = self.p_script_cmt1.sub('', buf)  # 주석문 제거

                # 속도 개선을 위해 두 주석문이 보일때 실제 제거 작업
                pos2 = -1
                pos1 = buf.find('/*')
                if pos1 != -1:
                    pos2 = buf.rfind('*/')

                if 0 <= pos1 < pos2:
                    buf = self.p_script_cmt2.sub('', buf)  # 주석문 제거

                buf = self.p_script_cmt3.sub('', buf)  # 주석문 제거
                buf = self.p_space.sub('', buf)  # 공백 제거
                buf = buf.lower()  # 영어 소문자로 통일

                size = len(buf)
                if kavutil.handle_pattern_md5.match_size(
                        'script', size):  # script 패턴에 해당 크기가 존재하는가?
                    fmd5 = hashlib.md5(buf).hexdigest()  # MD5 해시 구하기
                    vname = kavutil.handle_pattern_md5.scan(
                        'script', size, fmd5)  # script 패턴에서 MD5 해시 검사
                    if vname:  # 악성코드 이름이 존재한다면 악성코드 발견
                        return True, vname, 0, kernel.INFECTED
        except IOError:
            pass
        except ValueError:
            pass

        # 악성코드를 발견하지 못했음을 리턴한다.
        return False, '', -1, kernel.NOT_FOUND
Exemple #3
0
    def scan(self, filehandle, filename, fileformat, filename_ex):  # 악성코드 검사
        try:
            mm = filehandle

            buf = mm[:4096]
            if kavutil.is_textfile(buf):  # Text 파일인가?
                if self.p_html_malware.search(buf):
                    return True, 'Trojan.HTML.IFrame.a', 0, kernel.INFECTED
        except:
            pass

        # 악성코드를 발견하지 못했음을 리턴한다.
        return False, '', -1, kernel.NOT_FOUND
Exemple #4
0
    def format(self, filehandle, filename, filename_ex):
        fileformat = {}  # 포맷 정보를 담을 공간

        mm = filehandle

        buf = mm[:4096]

        if kavutil.is_textfile(buf):  # Text 파일인가?
            obj = self.p_text_format.match(buf)  # 첫 시작 단어로 파일 포맷 인식하기
            if obj:
                t = obj.groups()[0].lower()
                if t in ['cd', 'echo']:
                    return {'ff_bat': 'BAT'}
            elif mm[:13] == KICOMAV_BAT_MAGIC:
                return {'ff_bat': 'BAT'}

            obj = self.p_script_head.match(buf)
            if obj:
                # 내부 스크립트가 존재하나?
                obj_script = self.p_script_in_html.search(mm[:])

                if obj_script:
                    buf_strip = obj_script.groups()[1].strip()
                    n_buf_stript = len(buf_strip)
                    fileformat['size'] = n_buf_stript

                    if n_buf_stript:  # 내부 스크립트
                        if obj_script.groups()[0].lower() == 'script':
                            ret = {'ff_script': fileformat}
                        else:
                            ret = {'ff_iframe': fileformat}
                    else:  # 외부 스크립트
                        if obj_script.groups()[0].lower() == 'script':
                            ret = {'ff_script_external': fileformat}
                        else:
                            ret = {'ff_iframe_external': fileformat}
                else:
                    # 발견하지 못했다면 외부 스크립트일 가능성이 크다
                    fileformat['size'] = 0  # 외부 스크립트

                    if obj.group().lower().find('script') != -1:
                        ret = {'ff_script_external': fileformat}
                    else:
                        ret = {'ff_iframe_external': fileformat}

                return ret

        return None
Exemple #5
0
    def format(self, filehandle, filename, filename_ex):
        ret = {}

        mm = filehandle

        buf = mm[:4096]
        if kavutil.is_textfile(buf):  # Text 파일인가?
            t = []
            for i in self.p_eps.finditer(mm):
                t.append(i.group())

            if len(t):
                ret['ff_eps'] = list(set(t))
                return ret

        return None
Exemple #6
0
    def scan(self, filehandle, filename, fileformat, filename_ex):  # 악성코드 검사
        mm = filehandle

        # 미리 분석된 파일 포맷중에 RTF 포맷이 있는가?
        if 'ff_rtf' in fileformat:
            # 검색 속도를 위해 pfragments가 존재하는지 먼저 확인
            if self.cve_2010_3333_magic.search(mm):
                # CVE-2010-3333 (1)
                t = self.prog_cve_2010_3333_1.search(mm)
                if t:
                    val = int(max(t.groups()))

                    if val != 2 and val != 4 and val != 8:
                        if self.verbose:
                            print '[*] RTF :', val

                        return True, 'Exploit.RTF.CVE-2010-3333.a', 0, kernel.INFECTED

                # CVE-2010-3333 (2)
                t = self.prog_cve_2010_3333_2.search(mm)
                if t:
                    return True, 'Exploit.RTF.CVE-2010-3333.b', 0, kernel.INFECTED

            # CVE-2014-1761
            t = self.prog_cve_2014_1761.search(mm)
            if t:
                val = int(t.groups()[0])

                if self.verbose:
                    print '[*] RTF :', val

                if val >= 25:
                    t1 = re.findall(r'{\\lfolevel}', mm)
                    if t1:
                        if self.verbose:
                            print '[*] N :', len(t1)
                        if len(t1) > val:
                            return True, 'Exploit.RTF.CVE-2014-1761', 0, kernel.INFECTED
        else:
            if kavutil.is_textfile(mm[:4096]):
                t = self.prog_eps_dropper.search(mm)
                if t:
                    return True, 'Trojan.PS.Agent', 0, kernel.INFECTED

        # 악성코드를 발견하지 못했음을 리턴한다.
        return False, '', -1, kernel.NOT_FOUND
Exemple #7
0
    def scan(self, filehandle, filename, fileformat, filename_ex):  # 악성코드 검사
        mm = filehandle

        # 미리 분석된 파일 포맷중에 RTF 포맷이 있는가?
        if 'ff_rtf' in fileformat:
            # 검색 속도를 위해 pfragments가 존재하는지 먼저 확인
            if self.cve_2010_3333_magic.search(mm):
                # CVE-2010-3333 (1)
                t = self.prog_cve_2010_3333_1.search(mm)
                if t:
                    val = int(max(t.groups()))

                    if val != 2 and val != 4 and val != 8:
                        if self.verbose:
                            print '[*] RTF :', val

                        return True, 'Exploit.RTF.CVE-2010-3333.a', 0, kernel.INFECTED

                # CVE-2010-3333 (2)
                t = self.prog_cve_2010_3333_2.search(mm)
                if t:
                    return True, 'Exploit.RTF.CVE-2010-3333.b', 0, kernel.INFECTED

            # CVE-2014-1761
            t = self.prog_cve_2014_1761.search(mm)
            if t:
                val = int(t.groups()[0])

                if self.verbose:
                    print '[*] RTF :', val

                if val >= 25:
                    t1 = re.findall(r'{\\lfolevel}', mm)
                    if t1:
                        if self.verbose:
                            print '[*] N :', len(t1)
                        if len(t1) > val:
                            return True, 'Exploit.RTF.CVE-2014-1761', 0, kernel.INFECTED
        else:
            if kavutil.is_textfile(mm[:4096]):
                t = self.prog_eps_dropper.search(mm)
                if t:
                    return True, 'Trojan.PS.Agent', 0, kernel.INFECTED

        # 악성코드를 발견하지 못했음을 리턴한다.
        return False, '', -1, kernel.NOT_FOUND
Exemple #8
0
    def scan(self, filehandle, filename, fileformat, filename_ex):  # 악성코드 검사
        try:
            mm = filehandle

            if not ('ff_html' in fileformat or 'ff_script' in fileformat
                    or 'ff_iframe' in fileformat or 'ff_script_external'
                    in fileformat or 'ff_iframe_external' in fileformat):
                raise ValueError  # 해당 포맷이 포함되을때만 script 엔진 검사

            if kavutil.is_textfile(mm[:4096]):
                buf = mm[:]

                buf = self.p_http.sub('', buf)  # http:// 제거
                buf = self.p_script_cmt1.sub('', buf)  # 주석문 제거

                # 속도 개선을 위해 두 주석문이 보일때 실제 제거 작업
                pos2 = -1
                pos1 = buf.find('/*')
                if pos1 != -1:
                    pos2 = buf.rfind('*/')

                if 0 <= pos1 < pos2:
                    buf = self.p_script_cmt2.sub('', buf)  # 주석문 제거

                buf = self.p_script_cmt3.sub('', buf)  # 주석문 제거
                buf = self.p_space.sub('', buf)  # 공백 제거
                buf = buf.lower()  # 영어 소문자로 통일

                size = len(buf)
                if kavutil.handle_pattern_md5.match_size(
                        'script', size):  # script 패턴에 해당 크기가 존재하는가?
                    fmd5 = hashlib.md5(buf).hexdigest()  # MD5 해시 구하기
                    vname = kavutil.handle_pattern_md5.scan(
                        'script', size, fmd5)  # script 패턴에서 MD5 해시 검사
                    if vname:  # 악성코드 이름이 존재한다면 악성코드 발견
                        return True, vname, 0, kernel.INFECTED
        except IOError:
            pass
        except ValueError:
            pass

        # 악성코드를 발견하지 못했음을 리턴한다.
        return False, '', -1, kernel.NOT_FOUND
Exemple #9
0
    def scan(self, filehandle, filename, fileformat, filename_ex):  # 악성코드 검사
        try:
            mm = filehandle

            if not ('ff_html' in fileformat or
                    'ff_script' in fileformat or
                    'ff_iframe' in fileformat or
                    'ff_script_external' in fileformat or
                    'ff_iframe_external' in fileformat):
                raise ValueError  # 해당 포맷이 포함되을때만 script 엔진 검사

            if kavutil.is_textfile(mm[:4096]):
                buf = mm[:]

                buf = self.p_http.sub('', buf)  # http:// 제거
                buf = self.p_script_cmt1.sub('', buf)  # 주석문 제거

                # 속도 개선을 위해 두 주석문이 보일때 실제 제거 작업
                pos2 = -1
                pos1 = buf.find('/*')
                if pos1 != -1:
                    pos2 = buf.rfind('*/')

                if 0 <= pos1 < pos2:
                    buf = self.p_script_cmt2.sub('', buf)  # 주석문 제거

                buf = self.p_script_cmt3.sub('', buf)  # 주석문 제거
                buf = self.p_space.sub('', buf)  # 공백 제거
                buf = buf.lower()  # 영어 소문자로 통일

                size = len(buf)
                if kavutil.handle_pattern_md5.match_size('script', size):  # script 패턴에 해당 크기가 존재하는가?
                    fmd5 = hashlib.md5(buf).hexdigest()  # MD5 해시 구하기
                    vname = kavutil.handle_pattern_md5.scan('script', size, fmd5)  # script 패턴에서 MD5 해시 검사
                    if vname:  # 악성코드 이름이 존재한다면 악성코드 발견
                        return True, vname, 0, kernel.INFECTED
        except IOError:
            pass
        except ValueError:
            pass

        # 악성코드를 발견하지 못했음을 리턴한다.
        return False, '', -1, kernel.NOT_FOUND
Exemple #10
0
    def format(self, filehandle, filename, filename_ex):
        fileformat = {}  # 포맷 정보를 담을 공간

        mm = filehandle

        buf = mm[:4096]
        if kavutil.is_textfile(buf):  # Text 파일인가?
            obj = self.p_script_head.match(buf)
            if obj:
                # 내부 스크립트가 존재하나?
                obj_script = self.p_script_in_html.search(mm[:])

                if obj_script:
                    buf_strip = obj_script.groups()[1].strip()
                    n_buf_stript = len(buf_strip)
                    fileformat['size'] = n_buf_stript

                    if n_buf_stript:  # 내부 스크립트
                        if obj_script.groups()[0].lower() == 'script':
                            ret = {'ff_script': fileformat}
                        else:
                            ret = {'ff_iframe': fileformat}
                    else:  # 외부 스크립트
                        if obj_script.groups()[0].lower() == 'script':
                            ret = {'ff_script_external': fileformat}
                        else:
                            ret = {'ff_iframe_external': fileformat}
                else:
                    # 발견하지 못했다면 외부 스크립트일 가능성이 크다
                    fileformat['size'] = 0  # 외부 스크립트

                    if obj.group().lower().find('script') != -1:
                        ret = {'ff_script_external': fileformat}
                    else:
                        ret = {'ff_iframe_external': fileformat}

                return ret

        return None
Exemple #11
0
    def format(self, filehandle, filename, filename_ex):
        fileformat = {}  # 포맷 정보를 담을 공간

        mm = filehandle

        buf = mm[:4096]
        if kavutil.is_textfile(buf):  # Text 파일인가?
            obj = self.p_script_head.match(buf)
            if obj:
                # 내부 스크립트가 존재하나?
                obj_script = self.p_script_in_html.search(mm[:])

                if obj_script:
                    buf_strip = obj_script.groups()[1].strip()
                    n_buf_stript = len(buf_strip)
                    fileformat['size'] = n_buf_stript

                    if n_buf_stript:  # 내부 스크립트
                        if obj_script.groups()[0].lower() == 'script':
                            ret = {'ff_script': fileformat}
                        else:
                            ret = {'ff_iframe': fileformat}
                    else:  # 외부 스크립트
                        if obj_script.groups()[0].lower() == 'script':
                            ret = {'ff_script_external': fileformat}
                        else:
                            ret = {'ff_iframe_external': fileformat}
                else:
                    # 발견하지 못했다면 외부 스크립트일 가능성이 크다
                    fileformat['size'] = 0  # 외부 스크립트

                    if obj.group().lower().find('script') != -1:
                        ret = {'ff_script_external': fileformat}
                    else:
                        ret = {'ff_iframe_external': fileformat}

                return ret

        return None
Exemple #12
0
    def format(self, filehandle, filename, filename_ex):
        fileformat = {}  # 포맷 정보를 담을 공간

        if filename_ex:
            try:
                if filename_ex.split('/')[-2] == 'HTML':
                    return None
            except IndexError:
                pass

        mm = filehandle

        buf = mm[:4096]
        if kavutil.is_textfile(buf):  # Text 파일인가?
            # HTML 문서
            ret = self.p_html.findall(buf)
            if len(set(ret)) >= HTML_KEY_COUNT:
                fileformat['keyword'] = list(set(ret))  # 존재하는 HTML Keyword 보관
                ret = {'ff_html': fileformat}

                return ret

        return None
Exemple #13
0
    def format(self, filehandle, filename, filename_ex):
        fileformat = {}  # 포맷 정보를 담을 공간

        if filename_ex:
            try:
                if filename_ex.split('/')[-2] == 'HTML':
                    return None
            except IndexError:
                pass

        mm = filehandle

        buf = mm[:4096]
        if kavutil.is_textfile(buf):  # Text 파일인가?
            # HTML 문서
            ret = self.p_html.findall(buf)
            if len(set(ret)) >= HTML_KEY_COUNT:
                fileformat['keyword'] = list(set(ret))  # 존재하는 HTML Keyword 보관
                ret = {'ff_html': fileformat}

                return ret

        return None