from django.db import models from targetApp.models import Domain from scanEngine.models import EngineType from django.db.models import JSONField class ScanHistory(models.Model): last_scan_date = models.DateTimeField() scan_status = models.IntegerField() domain_name = models.ForeignKey(Domain, on_delete=models.CASCADE) scan_type = models.ForeignKey(EngineType, on_delete=models.CASCADE) celery_id = models.CharField(max_length=100, blank=True) def __str__(self): # debug purpose remove scan type and id in prod return self.domain_name.domain_name def get_subdomain_count(self): return ScannedHost.objects.filter(scan_history__id=self.id).count() def get_endpoint_count(self): return WayBackEndPoint.objects.filter(url_of__id=self.id).count() def get_vulnerability_count(self): return VulnerabilityScan.objects.filter( vulnerability_of__id=self.id).count() def get_info_vulnerability_count(self): return VulnerabilityScan.objects.filter( vulnerability_of__id=self.id).filter( severity=0).count() def get_low_vulnerability_count(self): return VulnerabilityScan.objects.filter( vulnerability_of__id=self.id).filter( severity=1).count() def get_medium_vulnerability_count(self): return VulnerabilityScan.objects.filter( vulnerability_of__id=self.id).filter( severity=2).count() def get_high_vulnerability_count(self): return VulnerabilityScan.objects.filter( vulnerability_of__id=self.id).filter( severity=3).count() def get_critical_vulnerability_count(self): return VulnerabilityScan.objects.filter( vulnerability_of__id=self.id).filter( severity=4).count() class ScannedHost(models.Model): subdomain = models.CharField(max_length=1000) cname = models.CharField(max_length=500, blank=True) scan_history = models.ForeignKey(ScanHistory, on_delete=models.CASCADE) open_ports = models.CharField(max_length=1000) http_status = models.IntegerField(default=0) content_length = models.IntegerField(default=0) page_title = models.CharField(max_length=1000) http_url = models.CharField(max_length=1000) ip_address = models.CharField(max_length=1000) is_ip_cdn = models.BooleanField(null=True, default=False) screenshot_path = models.CharField(max_length=1000, null=True) http_header_path = models.CharField(max_length=1000, null=True) technology_stack = models.CharField(max_length=1500, null=True) directory_json = JSONField(null=True) checked = models.BooleanField(null=True, blank=True, default=False) discovered_date = models.DateTimeField(blank=True, null=True) target_domain = models.ForeignKey( Domain, on_delete=models.CASCADE, null=True, blank=True) interesting_subdomain = models.BooleanField(null=True, default=False) interesting_subdomain_reason = models.CharField(max_length=100, null=True) def __str__(self): return str(self.subdomain) class WayBackEndPoint(models.Model): url_of = models.ForeignKey(ScanHistory, on_delete=models.CASCADE) http_url = models.CharField(max_length=5000) content_length = models.IntegerField(default=0) page_title = models.CharField(max_length=1000) http_status = models.IntegerField(default=0) content_type = models.CharField(max_length=100, null=True) discovered_date = models.DateTimeField(blank=True, null=True) target_domain = models.ForeignKey( Domain, on_delete=models.CASCADE, null=True, blank=True) def __str__(self): return self.page_title class VulnerabilityScan(models.Model): vulnerability_of = models.ForeignKey(ScanHistory, on_delete=models.CASCADE) host = models.ForeignKey( ScannedHost, on_delete=models.CASCADE, blank=True, null=True) discovered_date = models.DateTimeField(null=True) url = models.CharField(max_length=1000) name = models.CharField(max_length=400) severity = models.IntegerField() description = models.CharField(max_length=1000, null=True, blank=True) extracted_results = models.CharField( max_length=1000, null=True, blank=True) template_used = models.CharField(max_length=100) matcher_name = models.CharField(max_length=400, null=True, blank=True) open_status = models.BooleanField(null=True, blank=True, default=True) target_domain = models.ForeignKey( Domain, on_delete=models.CASCADE, null=True, blank=True) def __str__(self): return self.name def get_severity(self): return self.severity class ScanActivity(models.Model): scan_of = models.ForeignKey(ScanHistory, on_delete=models.CASCADE) title = models.CharField(max_length=1000) time = models.DateTimeField() status = models.IntegerField() def __str__(self): return str(self.title)