Malwares.com API 사용시 SSL 인증 오류 해결법
1. 들어가며
개인적으로 HwpScan21는 애착이 가는 프로그램 중 하나이다. HwpScan2는 공공기관에서 사용하는 대표적인 소프트웨어인 한글 워드프로세서(이하 아래아한글 또는 HWP)의 취약점을 이용한 APT 공격을 쉽게 분석하기 위한 용도로 만들어진 소프트웨어이다.
하지만 개인적으로 바쁘다는 이유로 업데이트를 못한지도 꽤 되었다. 어떤 기능을 더 추가하여 아래아한글 취약점 분석을 쉽게 할 수 있을까 고민한 결과 (주)세이트시큐리티2가 운영하는 Malwares.com3을 HwpScan2와 연동하기로 마음 먹었다.
2. Malwares.com이란?
(주)세이트시큐리티에서 운영하는 Malwares.com은 외국의 바이러스토탈4과 유사한 기능을 제공한다. 악성코드로 의심되는 샘플을 전송하면 다양한 국내외 Anti-Virus 제품의 악성코드 검사 결과 뿐만아니라 행위 분석을 통해 악성코드의 가능성에 대해서도 한눈에 볼 수 있다.
3. Malwares.com 사용자 고유 Key
Malwares.com은 별도의 API가 존재하여 사용자 프로그램과 연동을 할 수 있다. 그러기 위해서는 Malwares.com에 가입을 해야 한다. 가입 후 로그인 절차를 거치면 아래 그림처럼 사용자 고유 Key를 확인할 수 있다.
사용자 고유 Key는 Malwares.com 연동을 위해서는 꼭 필요하며 이를 이용해 간단하게 파이썬으로 악성코드로 의심되는 Hash 값을 전송하여 결과 값을 받을 수 있다.
4. File Report API 사용하기
아래의 예는 File Report API의 사용방법을 나태내고 있다.
[File Report API 요청 방식]
URL : https://www.malwares.com/api/v1/file/report?api_key=
<malwares.com API KEY>&hash=<파일 Hash>
Method : GET
- Parameter로 들어가는 hash는 MD5, SHA1, SHA256 중에 하나를 사용할 수 있다.
- Parameter가 올바르지 않은 경우엔 응답으로 비어있는 페이지가 전달된다.
- HTTP 500 Error가 발생할 경우 5분 정도 후 다시 조회를 시도해야 한다.
위 내용을 토대로 파이썬을 통해 간단히 코딩해보았다.
# -*- coding:utf-8 -*-
import urllib2
key = 'User KEY' # 사용자 고유 Key를 입력한다.
hash = '파일 Hash' # 악성코드 의심 파일 : MD5, SHA1, SHA256
url = 'https://www.malwares.com/api/v1/file/report?api_key={}&hash={}'
.format(key, hash)
conn = urllib2.urlopen(url)
r_xml = conn.read()
print r_xml
하지만 소스코드를 실행하니 아래와 같은 에러 메시지를 만났다.
Traceback (most recent call last):
File "Z:\HwpScan2w\malwares.py", line 14, in <module>
conn = urllib2.urlopen(url)
File "C:\Python27\lib\urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "C:\Python27\lib\urllib2.py", line 431, in open
response = self._open(req, data)
File "C:\Python27\lib\urllib2.py", line 449, in _open
'_open', req)
File "C:\Python27\lib\urllib2.py", line 409, in _call_chain
result = func(*args)
File "C:\Python27\lib\urllib2.py", line 1240, in https_open
context=self._context)
File "C:\Python27\lib\urllib2.py", line 1197, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]
certificate verify failed (_ssl.c:581)>
5. SSL 인증 오류 해결 방법은?
파이썬 2.7.x의 urllib2 라이브러리는 기본적으로 서버의 인증서를 확인하는 것으로 보여진다5. 결국 Malwares.com의 API는 https 프로토콜을 기본적으로 사용하기 때문에 발생하는 문제점이다.
이를 해결하기 위해서는 urllib2 라이브러리의 서버 인증서 확인을 무시하도록 하면 된다.
# -*- coding:utf-8 -*-
import urllib2
import ssl
# 서버 인증서를 무시하기 위한 초기화 작업
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
key = 'User KEY' # 사용자 고유 Key를 입력한다.
hash = '파일 Hash' # 악성코드 의심 파일 : MD5, SHA1, SHA256
url = 'https://www.malwares.com/api/v1/file/report?api_key={}&hash={}'
.format(key, hash)
conn = urllib2.urlopen(url, context=ctx)
r_xml = conn.read()
print r_xml
소스코드에서 ctx 변수를 이용하여 SSL 인증을 무시하도록 처리한 후에 urllib2.urlopen()
함수에서 context를 셋팅함으로써 SSL 인증 오류를 해결할 수 있다.
6. 결론
SSL 인증 오류를 해결하기 위해서는 SSL 인증서를 가지고 접속하는 것이 가장 좋은 방법이나 SSL 인증을 우회하여 오류를 쉽게 해결할 수도 있다. 이제 여러분들도 Malwares.com의 API를 이용하여 간단하게 악성코드 검사를 진행할 수 있을 것이다.
Update
- 2015-09-13 : 최초로 작성
-
HwpScan2 : http://www.nurilab.net/#!hwpscan2/ca3h ↩
-
(주)세인트시큐리티 : http://www.stsc.com ↩
-
Malwares.com : http://www.malwares.com ↩
-
바이러스토탈 : http://www.virustotal.com ↩
-
참조링크 : How to validate server’s ssl certificate in python? ↩