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
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
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
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
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
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
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
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
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
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