정보보안/정보보안 실습

[Python] VT(VirusTotal) API 연동

Developer D 2023. 12. 21. 18:57

Conti 유저들의 대화를 분석하고 IoC정보를 자동으로 VT에 연동하는 API를 제작한다.

* "conti"는 러시아 기반의 랜섬웨어 공격 그룹 중 하나로 아래 깃허브에서 대화내용을 영어로 해석하여 제공해 주고 있다.

그 중 2020년~2022년 데이터 셋을 이용하여 정제하고, VT API를 연동해보고자 했다.

2020년:'https://github.com/NorthwaveSecurity/complete_translation_leaked_chats_conti_ransomware/blob/main/jabber_chat_2020_translated.csv?raw=true'
2021-2022년 : 'https://github.com/NorthwaveSecurity/complete_translation_leaked_chats_conti_ransomware/blob/main/jabber_chat_2021_2022_translated.csv?raw=true'

 

1. 먼저 파이썬을 통해 데이터셋을 불러오고 IoC 추출도구를 import하여 IoC정보를 파싱한다.

*IoC(Indicator Of Compromise) 침해지표 디지털 침해사고를 분석하는데 사용되는 지표

2. 이 중 Ipv4정보가 유효할 것이라고 판단하여 Ipv정보만 파싱 하였다.

ioc_ipv4 =ioc_df[ioc_df["IoCType"].str.contains("ipv4")==True]

3. VT 회원가입 이후 API Key를 확인한다.

무료 계정은 500회 호출 까지 무료로 사용가능하다.

4. Test API를 Code 작성

IP값을 조회하는 방식으로 선택하였다.

API DOCs : https://docs.virustotal.com/reference/ip-info

 

Get an IP address report

Returns an IP address object.

docs.virustotal.com

 

https://www.virustotal.com/api/v3/ip_addresses/{ip}
import requests

api_key = ''
# 본인의 VirusTotal API 키

ip = '54.89.230.95'  # 변수로 받아오고자 하는 IP 주소
# Malicious IP

url = f'https://www.virustotal.com/api/v3/ip_addresses/{ip}'

headers = {
    'x-apikey': api_key,
}

response = requests.get(url, headers=headers)

if response.status_code == 200:  # 요청이 성공적으로 처리된 경우
    data = response.json()
    print(data)
else:
    print(f"Error {response.status_code}: {response.text}")

 코드 실행 시 JSON정제 되지 않아 상당히 많은 정보들을 얻을 수 있는데 요청이 성공한 경우, 해당 IP가 악성 주소인지 아닌지만 판별하기 위한 정보만 정제해서 출력하도록 변경한다.

if response.status_code == 200:  # 요청이 성공적으로 처리된 경우
    data = response.json()
    last_analysis_results = data['data']['attributes']['last_analysis_results']
    malicious_results = [engine_result['result'] for engine_result in last_analysis_results.values() if engine_result['category'] == 'malicious']
    clean_results = [engine_result['result'] for engine_result in last_analysis_results.values() if engine_result['category'] == 'clean']
    print( malicious_results)
    print( clean_results)
else:
    print(f"Error {response.status_code}: {response.text}")

5. IoC Ipv4 Dataframe에서 순차적으로 IP를 검사하도록 수정

간단하게 Conti Data set에서 malicious 한 ip를 자동으로 VT에서 검색하는 출력하는 코드가 완성되었다.

# Index 로드 문제가 있어 CSV Load로 정제
ipv4= pd.DataFrame(ioc_ipv4)

# CSV 파일로 저장
ipv4.to_csv('data.csv', index=False)

# CSV 파일에서 데이터 로드 (인덱스를 제외하고 로드)
ipv4 = pd.read_csv('data.csv', index_col=False)

print(ipv4)

import requests

def get_ip_analysis(api_key, ip):
    url = f'https://www.virustotal.com/api/v3/ip_addresses/{ip}'
    headers = {
    'x-apikey': api_key,
    }
    response = requests.get(url, headers=headers)
    
    if response.status_code == 200: 
        data = response.json()
        last_analysis_results = data['data']['attributes']['last_analysis_results']
        malicious_results = [engine_result['result'] for engine_result in last_analysis_results.values() if engine_result['category'] == 'malicious']
        print(ip,': ',malicious_results)
    else:
        print(f"Error {response.status_code}: {response.text}")

if __name__ == '__main__':
    api_key = '' # 본인의 VirusTotal API 키
    start_ip_range = 0  # 시작 IP 
    end_ip_range = 5   # 종료 IP 

    for i in range(start_ip_range, end_ip_range):
        ip = ipv4['Observable'][i]
        get_ip_analysis(api_key, ip)

반응형