php.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import socketserver
  2. import paramiko
  3. import usbmux
  4. import select
  5. import sys
  6. from threading import Thread
  7. from socket import socket
  8. class SocketRelay(object):
  9. def __init__(self, a: socket, b: socket, max_buffer: int = 65535):
  10. self.a = a
  11. self.b = b
  12. self.atob = bytes()
  13. self.btoa = bytes()
  14. self.max_buffer = max_buffer
  15. def handle(self) -> None:
  16. while True:
  17. rlist = list()
  18. wlist = list()
  19. xlist = [self.a, self.b]
  20. if self.atob:
  21. wlist.append(self.b)
  22. if self.btoa:
  23. wlist.append(self.a)
  24. if len(self.atob) < self.max_buffer:
  25. rlist.append(self.a)
  26. if len(self.btoa) < self.max_buffer:
  27. rlist.append(self.b)
  28. rlo, wlo, xlo = select.select(rlist, wlist, xlist)
  29. if xlo:
  30. return
  31. if self.a in wlo:
  32. n = self.a.send(self.btoa)
  33. self.btoa = self.btoa[n:]
  34. if self.b in wlo:
  35. n = self.b.send(self.atob)
  36. self.atob = self.atob[n:]
  37. if self.a in rlo:
  38. s = self.a.recv(self.max_buffer - len(self.atob))
  39. if not s:
  40. return
  41. self.atob += s
  42. if self.b in rlo:
  43. s = self.b.recv(self.max_buffer - len(self.btoa))
  44. if not s:
  45. return
  46. self.btoa += s
  47. class TCPRelay(socketserver.BaseRequestHandler):
  48. def handle(self) -> None:
  49. print("Incoming connection to %d" % self.server.server_address[1])
  50. mux = usbmux.USBMux(None)
  51. print("Waiting for devices...")
  52. if not mux.devices:
  53. mux.process(1.0)
  54. if not mux.devices:
  55. print("No device found")
  56. self.request.close()
  57. return
  58. dev = mux.devices[0]
  59. print("Connecting to device %s" % str(dev))
  60. d_sock = mux.connect(dev, self.server.r_port)
  61. l_sock = self.request
  62. print("Connection established, relaying data")
  63. try:
  64. fwd = SocketRelay(d_sock, l_sock, self.server.buffer_size * 1024)
  65. fwd.handle()
  66. finally:
  67. d_sock.close()
  68. l_sock.close()
  69. print("Connection closed")
  70. class TCPServer(socketserver.TCPServer):
  71. allow_reuse_address = True
  72. class ThreadedTCPServer(socketserver.ThreadingMixIn, TCPServer):
  73. allow_reuse_address = True
  74. class PhoneConnect:
  75. def __init__(self,
  76. host: str = "localhost", mobile_port: int = 44, computer_port: int = 2222, buffer_size: int = 128):
  77. self.host = host
  78. self.mobile_port = mobile_port
  79. self.computer_port = computer_port
  80. self.buffer_size = buffer_size
  81. def start(self) -> None:
  82. servers = list()
  83. ports = [(self.mobile_port, self.computer_port)]
  84. for r_port, l_port in ports:
  85. print(f"Forwarding local port {l_port} to remote port {r_port}")
  86. server = ThreadedTCPServer((self.host, l_port), TCPRelay)
  87. server.r_port = r_port
  88. server.buffer_size = self.buffer_size
  89. servers.append(server)
  90. alive = True
  91. while alive:
  92. try:
  93. rl, wl, xl = select.select(servers, [], [])
  94. for server in rl:
  95. server.handle_request()
  96. except KeyboardInterrupt:
  97. print("Server stopped")
  98. except Exception:
  99. alive = False
  100. if __name__ == '__main__':
  101. print("Cloudpass by Bu3srh")
  102. server = PhoneConnect()
  103. thread = Thread(target=server.start)
  104. thread.start()
  105. # get args if we dump from a device or to a device
  106. args = sys.argv
  107. arg = args[1]
  108. host = "localhost"
  109. user = "root"
  110. secret = "alpine"
  111. port = 2222
  112. paths = ['System/Library/PrivateFrameworks/MobileActivation.framework/Support/Certificates/RaptorActivation.pem']
  113. local_paths = ['./source/scripts/phpbypass/raptor/RaptorActivation.pem']
  114. client = paramiko.SSHClient()
  115. client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  116. try:
  117. client.connect(hostname=host, username=user, password=secret, port=port)
  118. sftp = client.open_sftp()
  119. if arg == "dump":
  120. for path in paths:
  121. sftp.get(path,local_paths[paths.index(path)],)
  122. elif arg == "restore":
  123. for path in paths:
  124. sftp.put(local_paths[paths.index(path)],path)
  125. sftp.close()
  126. except paramiko.ssh_exception.AuthenticationException:
  127. print("Authentication failed")
  128. except paramiko.ssh_exception.NoValidConnectionsError:
  129. print("Failed to establish connection with the server")
  130. client.close()
  131. print("Done!")
  132. thread.join()