First Commit
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
.env
|
||||
database.db
|
||||
utils/__pycache__/
|
||||
@@ -0,0 +1,49 @@
|
||||
import datetime
|
||||
import dotenv
|
||||
import json
|
||||
import requests
|
||||
import socket
|
||||
import utils.database
|
||||
import utils.teamsconnector
|
||||
|
||||
def main():
|
||||
utils.database.createdatabasefile()
|
||||
current_date = datetime.date.today()
|
||||
month = current_date.month
|
||||
year = current_date.year
|
||||
try:
|
||||
response = requests.get(f'https://api.ransomware.live/v2/victims/{year}/{month}')
|
||||
except Exception as e:
|
||||
print(e)
|
||||
json_parse = json.loads(response.content)
|
||||
format_date_string = "%Y-%m-%d %H:%M:%S.%f"
|
||||
for vic in json_parse:
|
||||
date_object = datetime.datetime.strptime(vic['discovered'], format_date_string)
|
||||
date = date_object.date()
|
||||
if current_date == date:
|
||||
sqlresult = utils.database.checkdatabase(vic['victim'], vic['discovered'])
|
||||
if sqlresult is False:
|
||||
vendor = vic['victim']
|
||||
date_added = vic['discovered']
|
||||
domain = vic['domain']
|
||||
group = vic['group']
|
||||
try:
|
||||
if domain != "" and " " not in domain:
|
||||
ip_address = socket.getaddrinfo(domain, 0, 0, 0, 0)
|
||||
unique_ips = list(set([addr[-1][0] for addr in ip_address]))
|
||||
else:
|
||||
unique_ips = "Unknown"
|
||||
except:
|
||||
unique_ips = "Unknown"
|
||||
print("=== Victim Added ===")
|
||||
print(f"""
|
||||
Vendor: {vendor}
|
||||
Date: {date_added}
|
||||
Domain: {domain}
|
||||
IP Addresses: {str(unique_ips).replace('[','').replace(']', '')}
|
||||
Attack Group: {group}
|
||||
""")
|
||||
utils.teamsconnector.teamswebhook(vic['victim'], vic['discovered'], vic['domain'], vic['group'], unique_ips, vic['description'])
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1 @@
|
||||
dotenv
|
||||
@@ -0,0 +1,25 @@
|
||||
import pathlib
|
||||
import sqlite3
|
||||
|
||||
conn = sqlite3.connect('database.db')
|
||||
cursor = conn.cursor()
|
||||
|
||||
def createdatabasefile():
|
||||
pathlib.Path("database.db").touch(exist_ok=True)
|
||||
cursor.execute("SELECT * FROM sqlite_master WHERE type='table' AND name='active_attacks'")
|
||||
result = cursor.fetchone()
|
||||
if result is None:
|
||||
cursor.execute('''CREATE TABLE active_attacks
|
||||
(vendor_name text, date_accessed datetime)
|
||||
''')
|
||||
conn.commit()
|
||||
|
||||
def checkdatabase(victimname, date_discovered):
|
||||
query = f"SELECT vendor_name FROM active_attacks WHERE vendor_name= ?"
|
||||
cursor.execute(query, (victimname,))
|
||||
result = cursor.fetchone()
|
||||
if result is None:
|
||||
query = f"INSERT INTO active_attacks VALUES ('{victimname}', '{date_discovered}')"
|
||||
cursor.execute(query)
|
||||
conn.commit()
|
||||
return False
|
||||
@@ -0,0 +1,145 @@
|
||||
import dotenv
|
||||
import os
|
||||
import requests
|
||||
dotenv.load_dotenv()
|
||||
|
||||
def teamswebhook(victimname, date_discovered, domain, group, ip_address, description):
|
||||
webhook_url = os.getenv('WEBHOOK_URL')
|
||||
|
||||
headers = {"Content-Type": "application/json"}
|
||||
|
||||
adaptive_card = {
|
||||
"type": "AdaptiveCard",
|
||||
"body": [
|
||||
{
|
||||
"type": "TextBlock",
|
||||
"size": "Medium",
|
||||
"weight": "Bolder",
|
||||
"text": "Ransomware.live Alert!"
|
||||
},
|
||||
{
|
||||
"type": "ColumnSet",
|
||||
"columns": [
|
||||
{
|
||||
"type": "Column",
|
||||
"items": [
|
||||
{
|
||||
"type": "TextBlock",
|
||||
"weight": "Bolder",
|
||||
"text": f"{victimname}",
|
||||
"wrap": "true"
|
||||
},
|
||||
{
|
||||
"type": "TextBlock",
|
||||
"spacing": "None",
|
||||
"text": f"{date_discovered}",
|
||||
"isSubtle": "true",
|
||||
"wrap": "true"
|
||||
}
|
||||
],
|
||||
"width": "stretch"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "TextBlock",
|
||||
"text": f"{description}",
|
||||
"wrap": "true"
|
||||
},
|
||||
{
|
||||
"type": "ColumnSet",
|
||||
"separator": "true",
|
||||
"columns": [
|
||||
{
|
||||
"type": "Column",
|
||||
"width": "stretch",
|
||||
"items": [
|
||||
{
|
||||
"type": "TextBlock",
|
||||
"text": "Domain",
|
||||
"wrap": "true"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Column",
|
||||
"width": "stretch",
|
||||
"items": [
|
||||
{
|
||||
"type": "TextBlock",
|
||||
"text": f"{domain}",
|
||||
"wrap": "true"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "ColumnSet",
|
||||
"columns": [
|
||||
{
|
||||
"type": "Column",
|
||||
"width": "stretch",
|
||||
"items": [
|
||||
{
|
||||
"type": "TextBlock",
|
||||
"text": "IP Addresses",
|
||||
"wrap": "true"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Column",
|
||||
"width": "stretch",
|
||||
"items": [
|
||||
{
|
||||
"type": "TextBlock",
|
||||
"text": f"{ip_address}",
|
||||
"wrap": "true"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "ColumnSet",
|
||||
"columns": [
|
||||
{
|
||||
"type": "Column",
|
||||
"width": "stretch",
|
||||
"items": [
|
||||
{
|
||||
"type": "TextBlock",
|
||||
"text": "Ransomware Group",
|
||||
"wrap": "true"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Column",
|
||||
"width": "stretch",
|
||||
"items": [
|
||||
{
|
||||
"type": "TextBlock",
|
||||
"text": f"{group}",
|
||||
"wrap": "true"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
|
||||
"version": "1.6"
|
||||
}
|
||||
|
||||
payload = {
|
||||
"card": adaptive_card
|
||||
}
|
||||
|
||||
response = requests.post(webhook_url, headers=headers, json=payload)
|
||||
|
||||
if response.ok:
|
||||
print("✅ Card sent to Teams successfully!")
|
||||
else:
|
||||
print(f"❌ Failed to send card: {response.status_code} - {response.text}")
|
||||
Reference in New Issue
Block a user