about summary refs log blame commit diff
path: root/ghostnet
blob: ae316939af911e4c9e540d052ac6532cbc9d3235 (plain) (tree)

























































                                                                                                                                                                                      
                                                                                                                     
                                                                                                                     
                                                                                                                   

                                                                            
                                                                                                                     
                                                                                                                     
                                                                                                                   
                                                                            
                                                                                                                   





































                                                                                                                 










                                                                                                          





















































                                                                                                         
                                                       













                                                                             
                                                     















































































































































































































































                                                                                                                                                     
                                            

































                                                                                                                                                                                 
#!/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()