#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import sys
import time
import socket
import random
import getpass
from os.path import isfile
from subprocess import call
from urllib.request import urlopen
from time import strftime,localtime
class Faded:
_iface = None
torrc = '/etc/tor/torrc'
def __init__(self):
Faded._iface = iface()
@staticmethod
def handle_networkmanager(do):
if do == 'stop':
log('[{0}] Killing network manager service --> '.format(timed()),warn=True)
os.popen('systemctl stop NetworkManager.service > /dev/null 2>&1')
time.sleep(3)
log('dead',err=True,end=True)
else:
log('[{0}] Starting network manager service --> '.format(timed()),warn=True)
os.popen('systemctl start NetworkManager.service > /dev/null 2>&1')
time.sleep(7)
log('actived',resp=True,end=True)
@staticmethod
def kill_process():
log('[{0}] Killing dangerous processes to prevent leaks --> '.format(timed()),warn=True)
os.popen('killall -q -9 chrome dropbox iceweasel skype icedove thunderbird firefox firefox-esr chromium xchat hexchat transmission steam kget xdman > /dev/null 2>&1')
log('dead',err=True,end=True)
@staticmethod
def clear_caches():
log('[{0}] Cleaning caches to prevent leaks --> '.format(timed()),nor=True)
os.popen('bleachbit -c adobe_reader.cache chromium.cache chromium.current_session chromium.history elinks.history \
emesene.cache epiphany.cache firefox.url_history flash.cache flash.cookies google_chrome.cache google_chrome.history \
links2.history opera.cache opera.search_history opera.url_history system.cache system.tmp 2>&1 /dev/null')
log('done',resp=True,end=True)
@staticmethod
def change_mac(job,filters=["","y","yes","n","no"]):
while 1:
ask = input("[{0}] Do you want to change mac address?(y/n) ".format(timed()))
if ask.lower() not in filters:
continue
else:
break
if ask == "" or ask == "y" or ask == "yes":
if job == "start":
proc = os.popen("ifconfig %s down | tail -n 1 | sed 's/ //g'" % Faded._iface).read()
proc = os.popen("macchanger -A %s | tail -n 1 | sed 's/ //g'" % Faded._iface).read()
proc = os.popen("ifconfig %s up | tail -n 1 | sed 's/ //g'" % Faded._iface).read()
os.popen("ip link set %s up" % Faded._iface)
else:
proc = os.popen("ifconfig %s down | tail -n 1 | sed 's/ //g'" % Faded._iface).read()
proc = os.popen("macchanger -p %s | tail -n 1 | sed 's/ //g'" % Faded._iface).read()
proc = os.popen("ifconfig %s up | tail -n 1 | sed 's/ //g'" % Faded._iface).read()
os.popen("ip link set %s up" % Faded._iface)
log('|-- Mac adress succesfully changed!'.format(str(proc).strip('\n')),resp=True,end=True)
else:
log('[-- Mac address not changed!!!',warn=True,end=True)
@staticmethod
def check_torrc_configs():
if isfile(Faded.torrc):
if not 'VirtualAddrNetwork' in open(Faded.torrc).read():
with open(Faded.torrc,'a+') as torconf:
torconf.write(tor_config())
@staticmethod
def redirect_to_tor():
log('[{0}] Redirecting to tor --> '.format(timed()),warn=True)
rules = iptables_rules(Faded._iface)
with open('/opt/load_rules.sh','w+') as script:
script.write(rules)
os.system('sh ' + '/opt/load_rules.sh')
time.sleep(7)
log('done',resp=True,end=True)
@staticmethod
def handle_tor(job,fnull=open(os.devnull,'w')):
if job == "start":
log('[{0}] (Re)start your tor service --> '.format(timed(),warn=True))
TOR_STAT = os.popen('systemctl status tor | grep \"Active\" | awk \'{print $2}\'').read()
if TOR_STAT == "active":
call(['systemctl','restart','tor'],stdout=fnull,stderr=fnull)
else:
call(['systemctl','start','tor'],stdout=fnull,stderr=fnull)
log('done',resp=True,end=True)
else:
log('[{0}] Stop tor service --> '.format(timed(),warn=True))
call(['systemctl','stop','tor'],stdout=fnull,stderr=fnull)
log('done',resp=True,end=True)
@staticmethod
def fixNetworkManagerStart():
os.popen('echo \"[main]\ndns=none\" > /etc/NetworkManager/NetworkManager.conf')
log('[{0}] Fixed network manager to dns=none --> done'.format(timed()),resp=True,end=True)
@staticmethod
def fixNetworkManagerStop():
os.popen('rm /etc/NetworkManager/NetworkManager.conf')
os.popen('touch /etc/NetworkManager/NetworkManager.conf')
log('[{0}] Fixed network manager to blank --> done'.format(timed()),resp=True,end=True)
@staticmethod
def _flush_iptables():
log('[{0}] Flush iptables rules --> '.format(timed(),warn=True))
with open('/opt/flush_iptables.sh','w+') as script:
script.write(flush_iptables())
os.system('sh ' + '/opt/flush_iptables.sh')
log('done',resp=True,end=True)
@staticmethod
def update_resolv():
os.popen('echo \"nameserver 127.0.0.1\" > /etc/resolv.conf')
log('[{0}] Updated resolv.conf to use tor'.format(timed()),resp=True,end=True)
@staticmethod
def check_status():
getip = urlopen('http://ipinfo.io/ip').read()
PUB_IP = getip.decode('utf-8').strip()
TOR_STAT = os.popen('systemctl status tor | grep \"Active\" | awk \'{print $2}\'').read()
log('==> Tor: %s' % TOR_STAT)
log('==> Current public ip: %s' % str(PUB_IP),end=True)
class DoJob(Faded):
def __init__(self,job):
Faded.__init__(self)
if job == "start":
log('[{0}] Starting Gh0stN3t'.format(timed()),warn=True,end=True)
self._check_permission()
self.start_faded()
elif job == "stop":
log('[{0}] Stoping Gh0stN3t'.format(timed()),warn=True,end=True)
self._check_permission()
self.stop_faded()
else:
self.status()
@staticmethod
def _check_permission():
id = os.getuid()
if id != 0:
log('[-] You have not enough permission to do this job.',err=True,end=True)
sys.exit(0)
else : pass
@staticmethod
def start_faded():
try:
DoJob.handle_networkmanager('stop')
DoJob.kill_process()
DoJob.clear_caches()
DoJob.change_mac("start")
DoJob.check_torrc_configs()
DoJob.redirect_to_tor()
DoJob.handle_tor("start")
DoJob.fixNetworkManagerStart();
DoJob.handle_networkmanager('start')
DoJob.update_resolv()
except KeyboardInterrupt:
sys.exit(log('[-] You stoped the program.',err=True))
@staticmethod
def stop_faded():
try:
DoJob.handle_networkmanager('stop')
DoJob.kill_process()
DoJob.clear_caches()
DoJob.change_mac("stop")
DoJob.handle_tor("stop")
DoJob._flush_iptables()
DoJob.fixNetworkManagerStop()
DoJob.handle_networkmanager("start")
except KeyboardInterrupt:
sys.exit(log('[-] You stoped the program.',err=True))
@staticmethod
def status():
try:
DoJob.check_status()
except KeyboardInterrupt:
sys.exit(log('[-] You stoped the program.',err=True))
def timed():
return(strftime("%H:%M:%S",localtime()))
def log(msg,err=False,warn=False,nor=False,resp=False,end=False):
msg = str(msg)
_nor = '\033[33m'
_err = '\033[1;91m'
_warn = '\033[1;93m'
_resp = '\033[1;92m'
if err == True:
msg = _err + msg + _nor
elif warn == True:
msg = _warn + msg + _nor
elif resp == True:
msg = _resp + msg + _nor
else:
msg = _nor + msg
if end:
sys.stdout.write(msg+'\n')
else:
sys.stdout.write(msg)
sys.stdout.flush()
def iface(_iface=None):
_i = os.popen('ip link | grep \"state\" | awk {\'print $2 $9\'}').read()
ifaces = _i.split('\n')
_l = len(ifaces)
ifaces.pop(_l-1)
_list = {}
for i in ifaces:
item = i.split(':')
_list[item[0]] = item[1]
keys = _list.keys()
for key in keys:
stat = _list[key]
if stat == "UP":
_iface = key
else:
pass
if _iface == None:
sys.exit(log
(
'[-] Can\'t detect actived network interface.Please check your connection.',err=True,end=True
)
)
else:
return _iface
def tor_config():
configure = r'''
VirtualAddrNetwork 10.192.0.0/10
AutomapHostsOnResolve 1
TransPort 9040
DNSPort 5353
SocksPort 9050
DNSListenAddress 127.0.0.1
TransListenAddress 127.0.0.1
AutomapHostsSuffixes .exit,.onion
HardwareAccel 1
TestSocks 1
WarnUnsafeSocks 1
AllowNonRFC953Hostnames 0
AllowDotExit 0
ClientRejectInternalAddresses 1
NewCircuitPeriod 40
MaxCircuitDirtiness 600
MaxClientCircuitsPending 48
UseEntryGuards 1
UseEntryGuardsAsDirGuards 1
EnforceDistinctSubnets 1
'''
return configure
def flush_iptables():
rules = r'''
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t raw -F
iptables -t raw -X
iptables -t security -F
iptables -t security -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
'''
return rules
def iptables_rules(iface):
rules = r'''
#!/bin/sh
_tor_uid=`id -u tor` #ArchLinux/Gentoo
_trans_port="9040"
_dns_port="5353"
_virt_addr="10.192.0.0/10"
_out_if="{0}"
# Your incoming interface and assigned local IP (Gateway)
_inc_if="{0}"
_inc_ip="192.168.1.1"
# LAN destinations that shouldn't be routed through Tor
_non_tor="127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16"
# Other IANA reserved blocks (These are not processed by tor and dropped by default)
_resv_iana="0.0.0.0/8 100.64.0.0/10 169.254.0.0/16 192.0.0.0/24 192.0.2.0/24 192.88.99.0/24 198.18.0.0/15 198.51.100.0/24 203.0.113.0/24 224.0.0.0/3"
### Don't lock yourself out after the flush
#iptables -P INPUT ACCEPT
#iptables -P OUTPUT ACCEPT
### Flush iptables
iptables -F
iptables -t nat -F
### *nat PREROUTING (For middlebox)
iptables -t nat -A PREROUTING -d $_virt_addr -i $_inc_if -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j REDIRECT --to-ports $_trans_port
iptables -t nat -A PREROUTING -i $_inc_if -p udp --dport 53 -j REDIRECT --to-ports $_dns_port
# Allow lan access for hosts in $_non_tor
for _lan in $_non_tor; do
iptables -t nat -A PREROUTING -i $_inc_if -d $_lan -j RETURN
done
for _iana in $_resv_iana; do
iptables -t nat -A PREROUTING -i $_inc_if -d $_iana -j RETURN
done
iptables -t nat -A PREROUTING -i $_inc_if -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j REDIRECT --to-ports $_trans_port
### *nat OUTPUT (For local redirection)
# nat .onion addresses
iptables -t nat -A OUTPUT -d $_virt_addr -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j REDIRECT --to-ports $_trans_port
# nat dns requests to Tor
iptables -t nat -A OUTPUT -d 127.0.0.1/32 -p udp -m udp --dport 53 -j REDIRECT --to-ports $_dns_port
# Don't nat the Tor process, the loopback, or the local network
iptables -t nat -A OUTPUT -m owner --uid-owner $_tor_uid -j RETURN
iptables -t nat -A OUTPUT -o lo -j RETURN
# Allow lan access for hosts in $_non_tor
for _lan in $_non_tor; do
iptables -t nat -A OUTPUT -d $_lan -j RETURN
done
for _iana in $_resv_iana; do
iptables -t nat -A OUTPUT -d $_iana -j RETURN
done
# Redirect all other pre-routing and output to Tor's TransPort
iptables -t nat -A OUTPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j REDIRECT --to-ports $_trans_port
### *filter INPUT
# Don't forget to grant yourself ssh access from remote machines before the DROP.
#iptables -A INPUT -i $_out_if -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
# Allow DNS lookups from connected clients and internet access through tor.
iptables -A INPUT -d $_inc_ip -i $_inc_if -p udp -m udp --dport $_dns_port -j ACCEPT
iptables -A INPUT -d $_inc_ip -i $_inc_if -p tcp -m tcp --dport $_trans_port --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
# Allow INPUT from lan hosts in $_non_tor
# Uncomment these 3 lines to enable.
#for _lan in $_non_tor; do
# iptables -A INPUT -s $_lan -j ACCEPT
#done
# Log & Drop everything else. Uncomment to enable logging.
#iptables -A INPUT -j LOG --log-prefix "Dropped INPUT packet: " --log-level 7 --log-uid
iptables -A INPUT -j DROP
### *filter FORWARD
iptables -A FORWARD -j DROP
### *filter OUTPUT
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
# Allow Tor process output
iptables -A OUTPUT -o $_out_if -m owner --uid-owner $_tor_uid -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j ACCEPT
# Allow loopback output
iptables -A OUTPUT -d 127.0.0.1/32 -o lo -j ACCEPT
# Tor transproxy magic
iptables -A OUTPUT -d 127.0.0.1/32 -p tcp -m tcp --dport $_trans_port --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
# Allow OUTPUT to lan hosts in $_non_tor
# Uncomment these 3 lines to enable.
#for _lan in $_non_tor; do
# iptables -A OUTPUT -d $_lan -j ACCEPT
#done
# Log & Drop everything else. Uncomment to enable logging
#iptables -A OUTPUT -j LOG --log-prefix "Dropped OUTPUT packet: " --log-level 7 --log-uid
iptables -A OUTPUT -j DROP
### Set default policies to DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
'''.format(iface)
return rules
def usage(purple='\033[35m'):
global hostname
_ROOT = os.getcwd()
username = getpass.getuser()
hostname = socket.gethostname()
__name__ = sys.argv[0]
__author__ = "[sp3tr3] && [baitinq]"
__version__ = "1.2"
txt =\
'''\033[33m_______ _______ _______ _______ _______ _______ _______ _______
|\ /|\ /|\ /|\ /|\ /|\ /|\ /|\ /|
| +---+ | +---+ | +---+ | +---+ | +---+ | +---+ | +---+ | +---+ |
| | | | | | | | | | | | | | | | | | | | | | | | |
| |G | | |h | | |0 | | |s | | |t | | |N | | |3 | | |T | |
| +---+ | +---+ | +---+ | +---+ | +---+ | +---+ | +---+ | +---+ |
|/_____\|/_____\|/_____\|/_____\|/_____\|/_____\|/_____\|/_____\|
\033[0mH@unt your victim\033[0m\033[33m
[Author]:# {0}
\033[33m[Version]:# {1}
\033[33m[\033[1;92m{2}\033[1;93m@\033[1;94m{3}\033[33m]─[\033[1;92m{4}\033[33m]$\033[1;92m{5} \033[33m[\033[1;92mstart\033[33m|\033[1;92mstop\033[33m|\033[1;92mstatus\033[33m]
'''.format(purple+__author__,__version__,username,hostname,_ROOT,__name__)
return txt
def main():
try:
job = (sys.argv)[1]
except:
sys.exit(usage())
else:
job = job.lower()
filters = ['start','stop','status']
if job not in filters:
sys.exit(usage())
else:
DoJob(job)
if __name__ == '__main__':
main()