작은 메모장

7. CriminalIP API 활용 및 doc 파일 문서 자동화 본문

실더스 루키즈 교육

7. CriminalIP API 활용 및 doc 파일 문서 자동화

으앙내눈 2023. 11. 29. 17:23

API를 제공하는 서비스들
- 공공데이터
- 포탈
등등

 

여기서 주로 쓰는 것 OSINT(오픈소스 인텔리전스)

- 구글 검색(구글 해킹)

- 이메일, 직원 정보 검색 등

이게 왜 퍼짐? 관리자 페이지 미흡(IoT 기기)

 

각종 IP, 도메인에 대한 취약점, 악성 내력같은 것을 조회 가능

취약점으로 인해 유출된 웹캠, 스크린샷 취득 정보 확인 가능

 

< 사용한 라이브러리 >

pip install folium

pip install python-docx

pip install docx2pdf

 

import requests


def get_criminalip_info(ip_address):
    url = f"https://api.criminalip.io/v1/asset/ip/summary?ip={ip_address}"

    payload = {}
    headers = {
        "x-api-key": "API KEY INPUT"
    }

    response = requests.request("GET", url, headers=headers, data=payload)

    return response.json()

if __name__ == "__main__":
    ip_address = "8.8.8.8"
    result = get_criminalip_info(ip_address)
    
    print(f"IP Address : {result['ip']}")
    print(f"Inbound Score : {result['score']['inbound']}")
    print(f"Outbound Score : {result['score']['outbound']}")

OSINT 기초적인 사용법

 

from flask import Flask, render_template, request
import re
from collections import Counter
import requests
import time

app = Flask(__name__)


def get_criminalip_info(ip_address):
    url = f"https://api.criminalip.io/v1/asset/ip/summary?ip={ip_address}"
    payload = {}
    headers = {
        "x-api-key": "YOUR API KEY"
    }

    response = requests.get(url, headers=headers, data=payload)
    if response.status_code == 200:
        return response.json()
    else:
        return None


@app.route("/", methods=["GET", "POST"])
def index():
    if request.method == "POST":
        file = request.files["file"]

        with open("access.log", "wb") as f:
            f.write(file.read())

        with open("access.log", "r", encoding="utf-8") as f:
            log_content = f.read()

        ip_list = re.findall(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", log_content)
        ip_counter = Counter(ip_list)
        top_10_ips = ip_counter.most_common(10)

        results = []
        for ip_address, count in top_10_ips:
            time.sleep(2)
            result = get_criminalip_info(ip_address)
            if result:
                results.append(
                    {
                        "ip_address": result["ip"],
                        "inbound_score": result["score"]["inbound"],
                        "outbound_score": result["score"]["outbound"],
                        "country": result["country"],
                        "country_code": result["country_code"],
                        "region": result["region"],
                        "city": result["city"],
                        "latitude": result["latitude"],
                        "longitude": result["longitude"],
                    }
                )

        return render_template("index.html", results=results)

    return render_template("index.html")


if __name__ == "__main__":
    app.run(debug=True)

응용 사용

 

import openpyxl

workbook = openpyxl.load_workbook("korean_data.xlsx")
sheet = workbook.active

masked_workbook = openpyxl.Workbook()
masked_sheet = masked_workbook.active

for row in sheet.iter_rows(min_row=2, values_only=True):
    name, address, phone_number, email = row[0], row[1], row[2], row[3]
    username, domain = email.split("@")
    masked_email = "*" * len(username) + "@" + domain
    maksed_data = [name, address, phone_number, masked_email]
    masked_sheet.append(maksed_data)

masked_workbook.save("masked_excel.xlsx")

split을 이용한 새로운 도메인 파싱

 

from docx import Document
from docx2pdf import convert

doc = Document("test.docx")

for paragraph in doc.paragraphs:
    if "NAME" in paragraph.text:
        paragraph.text = paragraph.text.replace("NAME", "홍길동")
    if "EMAIL" in paragraph.text:
        paragraph.text = paragraph.text.replace("EMAIL", "a@a.com")
    if "COUNT" in paragraph.text:
        paragraph.text = paragraph.text.replace("COUNT", "200")

doc_file = "test_01.docx"
pdf_file = "test_01.pdf"
doc.save(doc_file)
convert(doc_file, pdf_file)

docx 수정 및 pdf 변환

 

import streamlit as st
import pandas as pd

st.title("Loading Data")

uploaded_file = st.file_uploader("Upload Log File", type=["log"])

if uploaded_file is not None:
    logs = uploaded_file.read().decode("utf-8")
    log_lines = logs.split("\n")
    log_data = [line.split(" ") for line in log_lines]

    df = pd.DataFrame(log_data)
    st.write(df)

streamlit 사용해서 간편하게 구현