v4.5 Demo initial commit
This commit is contained in:
@@ -0,0 +1,485 @@
|
||||
from django.db import models
|
||||
import json
|
||||
|
||||
#This class defines the manufacturer
|
||||
class Manufacturer(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
name = models.CharField(max_length=50)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"name": self.name,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_manufacturer'
|
||||
ordering = ['name']
|
||||
|
||||
#This class defines the device type
|
||||
class DeviceType(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
device_type = models.CharField(max_length=50)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"device_type": self.device_type,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_device_type'
|
||||
ordering = ['device_type']
|
||||
|
||||
#This class defines the product
|
||||
class Product(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.PROTECT)
|
||||
device_type = models.ForeignKey(DeviceType, on_delete=models.PROTECT)
|
||||
product_name = models.CharField(max_length=50)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"manufacturer": self.manufacturer.to_json(),
|
||||
"product_name": self.product_name,
|
||||
"device_type": self.device_type.to_json(),
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_product'
|
||||
ordering = ['product_name']
|
||||
|
||||
#This class defines the hardware device
|
||||
class Device(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
product = models.ForeignKey(Product, on_delete=models.PROTECT)
|
||||
serial = models.CharField(max_length=50)
|
||||
comment = models.CharField(max_length=50)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
#firmware = models.ManyToManyField(Firmware, through='FirmwareDevices')
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"product": self.product.to_json(),
|
||||
"serial": self.serial,
|
||||
"comment":self.comment,
|
||||
"created": self.created.isoformat(),
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_device'
|
||||
unique_together = ('product', 'serial')
|
||||
|
||||
#This class defines the software for the hardware device
|
||||
class Firmware(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
version = models.CharField(max_length=50)
|
||||
product = models.ForeignKey(Product, on_delete=models.PROTECT)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
devices = models.ManyToManyField(Device, through='FirmwareDevices')
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"version": self.version,
|
||||
"product": self.product.id,
|
||||
"created": self.created.isoformat(),
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_firmware'
|
||||
unique_together = ('product', 'version')
|
||||
|
||||
class FirmwareDevices(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
firmware = models.ForeignKey(Firmware, on_delete=models.CASCADE)
|
||||
device = models.ForeignKey(Device, on_delete=models.CASCADE)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"firmware_id": self.firmware.id,
|
||||
"device_id": self.device_id,
|
||||
"created": self.created.isoformat(),
|
||||
}
|
||||
class Meta:
|
||||
db_table = 'iot_firmware_devices'
|
||||
|
||||
# This class represents the Pcap file
|
||||
class File(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
firmware = models.ForeignKey(Firmware, on_delete=models.CASCADE)
|
||||
device = models.ForeignKey(Device, on_delete=models.CASCADE)
|
||||
filename = models.CharField(max_length=50)
|
||||
ip_address = models.CharField(max_length=50)
|
||||
status = models.CharField(max_length=50)
|
||||
upload_time = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"filename": self.filename,
|
||||
"ip_address": self.ip_address,
|
||||
"status": self.status,
|
||||
"upload_time": self.upload_time.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_files'
|
||||
|
||||
### Raw data
|
||||
# This class represents the raw dataset
|
||||
class RawDataset(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
file = models.ForeignKey(File, on_delete=models.CASCADE)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"file": self.file.to_json(),
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_raw_dataset'
|
||||
|
||||
# This class represents the raw hash data.
|
||||
class HashRaw(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
raw_dataset = models.ForeignKey(RawDataset, on_delete=models.CASCADE)
|
||||
hash_value = models.CharField(max_length=50)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"raw_dataset.id": self.raw_dataset.id,
|
||||
"hash_value": self.hash_value,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_raw_hash'
|
||||
|
||||
# This class represents the raw DNS data
|
||||
class DnsRaw(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
raw_dataset = models.ForeignKey(RawDataset, on_delete=models.CASCADE)
|
||||
dns_hostname = models.CharField(max_length=200)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"raw_dataset_id": self.raw_dataset.id,
|
||||
"dns_hostname": self.dns_hostname,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_raw_dns'
|
||||
|
||||
# This class represents the raw URL data
|
||||
class UrlRaw(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
raw_dataset = models.ForeignKey(RawDataset, on_delete=models.CASCADE)
|
||||
url = models.CharField(max_length=200)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"raw_dataset.id": self.raw_dataset.id,
|
||||
"url": self.url,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_raw_url'
|
||||
|
||||
# This class represents the tools used
|
||||
class Tool(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
tool_name = models.CharField(max_length=50)
|
||||
version = models.CharField(max_length=50)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"tool_name": self.tool_name,
|
||||
"version": self.version,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_tool'
|
||||
### Analyzed data
|
||||
# A class for discovered ports
|
||||
class Port(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
port = models.IntegerField(unique=True)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"port": self.port,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_ports'
|
||||
|
||||
# A class for discovered TLS versions
|
||||
class TlsVersion(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
tls_version = models.TextField(max_length=50, unique=True)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"tls_version": self.tls_version,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_tls_versions'
|
||||
|
||||
def __str__(self):
|
||||
return self.tls_version
|
||||
|
||||
# A class for discovered CipherSuites
|
||||
class CipherSuite(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
cipher_suite = models.TextField(max_length=50, unique=True)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"cipher_suite": self.cipher_suite,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_cipher_suites'
|
||||
|
||||
def __str__(self):
|
||||
return self.cipher_suite
|
||||
|
||||
# A class for hash types
|
||||
class HashType(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
hash_type = models.TextField(max_length=50, unique=True)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"hash_type": self.hash_type,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_hash_types'
|
||||
|
||||
|
||||
# This class represents an analyzed dataset
|
||||
class AnalyzedDataset(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
file = models.ForeignKey(File, on_delete=models.CASCADE)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"file": self.file.id,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_analyzed_dataset'
|
||||
|
||||
# This class represents the analyzed DNS data
|
||||
class DnsAnalyzed(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
analyzed_dataset = models.ForeignKey(AnalyzedDataset, on_delete=models.CASCADE)
|
||||
dns_hostname = models.TextField(max_length=200)
|
||||
record_type = models.TextField(max_length=50)
|
||||
tool = models.ForeignKey(Tool, on_delete=models.PROTECT)
|
||||
ports = models.ManyToManyField(Port)
|
||||
tls_versions = models.ManyToManyField(TlsVersion)
|
||||
cipher_suites = models.ManyToManyField(CipherSuite)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"analyzed_dataset_id": self.analyzed_dataset.id,
|
||||
"dns_hostname": self.dns_hostname,
|
||||
"record_type": self.record_type,
|
||||
"tool": self.tool.id,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_analyzed_dns'
|
||||
|
||||
# This class represents the analyzed URL data
|
||||
class UrlAnalyzed(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
analyzed_dataset = models.ForeignKey(AnalyzedDataset, on_delete=models.CASCADE)
|
||||
url = models.TextField(max_length=200)
|
||||
tool = models.ForeignKey(Tool, on_delete=models.PROTECT)
|
||||
ports = models.ManyToManyField(Port)
|
||||
tls_versions = models.ManyToManyField(TlsVersion)
|
||||
cipher_suites = models.ManyToManyField(CipherSuite)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"analyzed_dataset_id": self.analyzed_dataset.id, # _id instead of .id for consistency
|
||||
"url": self.url,
|
||||
"tool_id": self.tool.id, # _id added for consistency
|
||||
"ports": [port.to_json() for port in self.ports.all()], # to_json() instead of only id
|
||||
"tls_versions": [version.to_json() for version in self.tls_versions.all()], # to_json()
|
||||
"cipher_suites": [suite.to_json() for suite in self.cipher_suites.all()], # to_json()
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_analyzed_url'
|
||||
|
||||
# This class represents the analyzed hash data
|
||||
class HashAnalyzed(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
analyzed_dataset = models.ForeignKey(AnalyzedDataset, on_delete=models.CASCADE)
|
||||
hash_type = models.ManyToManyField(HashType)
|
||||
hash_value = models.CharField(max_length=50)
|
||||
cracked = models.BooleanField(default=False)
|
||||
cracked_value = models.CharField(max_length=50, blank=True, null=True)
|
||||
crack_time = models.CharField(max_length=50, blank=True, null=True)
|
||||
tool = models.ForeignKey(Tool, on_delete=models.PROTECT)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"analyzed_dataset_id": self.analyzed_dataset.id,
|
||||
"hash_type": [hash_type.to_json() for hash_type in self.hash_type.all()],
|
||||
"hash_value": self.hash_value,
|
||||
"cracked": self.cracked,
|
||||
"cracked_value": self.cracked_value,
|
||||
"crack_time": self.crack_time,
|
||||
"tool": self.tool.id,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_analyzed_hash'
|
||||
|
||||
|
||||
# This class represents Binwalk raw data
|
||||
class BinwalkRaw(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
raw_dataset = models.ForeignKey(RawDataset, on_delete=models.CASCADE)
|
||||
offset = models.CharField(max_length=20) # Hex offset (e.g. 0x1000)
|
||||
description = models.TextField(max_length=500) # What was found
|
||||
file_path = models.TextField(max_length=500, blank=True, null=True) # Extracted file
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"raw_dataset_id": self.raw_dataset.id,
|
||||
"offset": self.offset,
|
||||
"description": self.description,
|
||||
"file_path": self.file_path,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_raw_binwalk'
|
||||
|
||||
# This class represents Strings raw data
|
||||
class StringsRaw(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
raw_dataset = models.ForeignKey(RawDataset, on_delete=models.CASCADE)
|
||||
string_value = models.TextField(max_length=1000)
|
||||
string_type = models.CharField(max_length=50, default='generic') # url, ip, path, generic
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"raw_dataset_id": self.raw_dataset.id,
|
||||
"string_value": self.string_value,
|
||||
"string_type": self.string_type,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_raw_strings'
|
||||
|
||||
# This class represents analyzed Binwalk data
|
||||
class BinwalkAnalyzed(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
analyzed_dataset = models.ForeignKey(AnalyzedDataset, on_delete=models.CASCADE)
|
||||
component_type = models.CharField(max_length=100) # e.g. "Linux Kernel", "U-Boot"
|
||||
offset = models.CharField(max_length=20)
|
||||
size = models.CharField(max_length=20, blank=True, null=True)
|
||||
entropy = models.FloatField(blank=True, null=True) # Encryption/compression
|
||||
tool = models.ForeignKey(Tool, on_delete=models.PROTECT)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"analyzed_dataset_id": self.analyzed_dataset.id,
|
||||
"component_type": self.component_type,
|
||||
"offset": self.offset,
|
||||
"size": self.size,
|
||||
"entropy": self.entropy,
|
||||
"tool_id": self.tool.id,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_analyzed_binwalk'
|
||||
|
||||
# This class represents analyzed Strings data (critical findings)
|
||||
class StringsAnalyzed(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
analyzed_dataset = models.ForeignKey(AnalyzedDataset, on_delete=models.CASCADE)
|
||||
string_value = models.TextField(max_length=1000)
|
||||
category = models.CharField(max_length=50) # credentials, api_key, url, ip, path
|
||||
severity = models.CharField(max_length=20, default='info') # critical, high, medium, low, info
|
||||
tool = models.ForeignKey(Tool, on_delete=models.PROTECT)
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"analyzed_dataset_id": self.analyzed_dataset.id,
|
||||
"string_value": self.string_value,
|
||||
"category": self.category,
|
||||
"severity": self.severity,
|
||||
"tool_id": self.tool.id,
|
||||
"created": self.created.isoformat()
|
||||
}
|
||||
|
||||
class Meta:
|
||||
db_table = 'iot_analyzed_strings'
|
||||
Reference in New Issue
Block a user