TMTV

voip

Dec 2nd, 2020 (edited)
1,851
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.97 KB | None | 0 0
  1. import requests,os,binascii,base64,json,sys
  2. from Crypto.PublicKey import RSA
  3. from Crypto.Util.Padding import pad, unpad
  4. from Crypto.Random import get_random_bytes
  5. from Crypto.Cipher import AES, PKCS1_OAEP
  6. from Crypto.Cipher import PKCS1_v1_5
  7.  
  8. class Zyxel(object):
  9.  
  10.     def __init__(self, url, user, password):
  11.         self.url = url
  12.         self.user = user
  13.         self.password = password
  14.  
  15.         self.r = requests.Session()
  16.         self.r.trust_env = False
  17.  
  18.         self.aes_key = b'\x42'*32
  19.         self.sessionkey = None
  20.  
  21.     def _encrypt_request(self, data):
  22.         iv = b'\x42'*16
  23.  
  24.         cipher = AES.new(self.aes_key, AES.MODE_CBC, iv)
  25.         content = cipher.encrypt(pad(json.dumps(data).encode('ascii'), 16))
  26.  
  27.         request = {
  28.             "content": base64.b64encode(content).decode('ascii'),
  29.             "iv": base64.b64encode(iv).decode('ascii'),
  30.             "key": ""
  31.         }
  32.  
  33.         return request
  34.  
  35.     def _decrypt_response(self, data):
  36.         if not 'iv' in data or not 'content' in data:
  37.             print(f"Het wachtwoord is niet correct.")
  38.             sys.exit(1)
  39.             return data
  40.  
  41.         iv = base64.b64decode(data['iv'])[:16]
  42.         content = data['content']
  43.  
  44.         cipher = AES.new(self.aes_key, AES.MODE_CBC, iv)
  45.         result = unpad(cipher.decrypt(base64.b64decode(content)), 16)
  46.  
  47.         return result
  48.  
  49.     def perform_login(self):
  50.         res = self.r.get(f"{self.url}/getRSAPublickKey")
  51.         pubkey_str = res.json()['RSAPublicKey']
  52.  
  53.         pubkey = RSA.import_key(pubkey_str)
  54.         cipher_rsa = PKCS1_v1_5.new(pubkey)
  55.         enc_aes_key = cipher_rsa.encrypt(base64.b64encode(self.aes_key))
  56.        
  57.         login_data = {
  58.             "Input_Account": self.user,
  59.             "Input_Passwd": base64.b64encode(self.password.encode('ascii')).decode('ascii'),
  60.             "RememberPassword": 0,
  61.             "SHA512_password": False
  62.         }
  63.  
  64.         enc_request = self._encrypt_request(login_data)
  65.         enc_request['key'] = base64.b64encode(enc_aes_key).decode('ascii')
  66.         enc_response = self.r.post(f"{self.url}/UserLogin", json.dumps(enc_request))
  67.         response = json.loads(self._decrypt_response(enc_response.json()))
  68.  
  69.         if 'result' in response and response['result'] == 'ZCFG_SUCCESS':
  70.             self.sessionkey = response['sessionkey']
  71.             enc_response2 = self.r.get(f"{self.url}/cgi-bin/DAL?oid=tr69")
  72.             response2 = str(json.loads(self._decrypt_response(enc_response2.json())))
  73.             acsurl = response2[response2.find("'URL'")+1 : response2.find("'URL'")+999].split("'")[2]
  74.             enc_response3 = self.r.post(f"{self.url}/UserLogout", "")
  75.             if 'acs.indetel.net' in acsurl:
  76.                 print ("Odido heeft iets gewijzigd. Neem contact op met TMTV op de Community.")
  77.                 acsurl = acsurl.replace("https://acs.indetel.net:7548", "http://10.12.0.10:7547")
  78.             return acsurl
  79.         else:
  80.             return False
  81.  
  82. if __name__ == "__main__":
  83.  
  84.     host = "192.168.1.1"
  85.     username = "admin"
  86.     password = input("Login Password: ")
  87.  
  88.     url = f"http://{host}"
  89.  
  90.     router = Zyxel(url, username, password)
  91.     status = router.perform_login()
  92.     if not status:
  93.         print("Het wachtwoord is niet correct.")
  94.         sys.exit(1)
  95.     else:
  96.         acsurl = status
  97.     s1 = requests.Session()
  98.     xml1 = '''<soap:Envelope
  99. xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  100. xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
  101. xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
  102. xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  103. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  104. <soap:Header>
  105. <cwmp:ID soap:mustUnderstand="1"></cwmp:ID>
  106. </soap:Header>
  107. <soap:Body>
  108. <cwmp:Inform>
  109. <DeviceId>
  110. <Manufacturer>DrayTek</Manufacturer>
  111. <OUI>001DAA</OUI>
  112. <ProductClass>Vigor2132FVn</ProductClass>
  113. <SerialNumber>001DAA''' + os.urandom(3).hex().upper() + '''</SerialNumber>
  114. </DeviceId>
  115. <Event soap-enc:arrayType="cwmp:EventStruct[3]">
  116. <EventStruct>
  117. <EventCode>0 BOOTSTRAP</EventCode>
  118. <CommandKey></CommandKey>
  119. </EventStruct>
  120. <EventStruct>
  121. <EventCode>1 BOOT</EventCode>
  122. <CommandKey></CommandKey>
  123. </EventStruct>
  124. <EventStruct>
  125. <EventCode>4 VALUE CHANGE</EventCode>
  126. <CommandKey></CommandKey>
  127. </EventStruct>
  128. </Event>
  129. <MaxEnvelopes>1</MaxEnvelopes>
  130. <CurrentTime>2000-01-01T00:00:00</CurrentTime>
  131. <RetryCount>1</RetryCount>
  132. <ParameterList soap-enc:arrayType="cwmp:ParameterValueStruct[9]">
  133. <ParameterValueStruct>
  134. <Name>InternetGatewayDevice.DeviceInfo.SpecVersion</Name>
  135. <Value xsi:type="xsd:string">1.0</Value>
  136. </ParameterValueStruct>
  137. <ParameterValueStruct>
  138. <Name>InternetGatewayDevice.DeviceInfo.HardwareVersion</Name>
  139. <Value xsi:type="xsd:string">5</Value>
  140. </ParameterValueStruct>
  141. <ParameterValueStruct>
  142. <Name>InternetGatewayDevice.DeviceInfo.SoftwareVersion</Name>
  143. <Value xsi:type="xsd:string">3.7.9.1</Value>
  144. </ParameterValueStruct>
  145. <ParameterValueStruct>
  146. <Name>InternetGatewayDevice.DeviceInfo.ProvisioningCode</Name>
  147. <Value xsi:type="xsd:string"></Value>
  148. </ParameterValueStruct>
  149. <ParameterValueStruct>
  150. <Name>InternetGatewayDevice.ManagementServer.ConnectionRequestURL</Name>
  151. <Value xsi:type="xsd:string"></Value>
  152. </ParameterValueStruct>
  153. <ParameterValueStruct>
  154. <Name>InternetGatewayDevice.ManagementServer.ParameterKey</Name>
  155. <Value xsi:type="xsd:string"></Value>
  156. </ParameterValueStruct>
  157. <ParameterValueStruct>
  158. <Name>InternetGatewayDevice.DeviceInfo.AuthKey</Name>
  159. <Value xsi:type="xsd:string"></Value>
  160. </ParameterValueStruct>
  161. <ParameterValueStruct>
  162. <Name></Name>
  163. <Value xsi:type="xsd:string"></Value>
  164. </ParameterValueStruct>
  165. <ParameterValueStruct>
  166. <Name>InternetGatewayDevice.ManagementServer.UDPConnectionRequestAddress</Name>
  167. <Value xsi:type="xsd:string"></Value>
  168. </ParameterValueStruct>
  169. </ParameterList>
  170. </cwmp:Inform>
  171. </soap:Body>
  172. </soap:Envelope>
  173.                                                  '''
  174.     xml2 = '''<soap:Envelope
  175. xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  176. xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
  177. xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
  178. xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  179. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  180. <soap:Header>
  181. <cwmp:ID soap:mustUnderstand="1"></cwmp:ID>
  182. </soap:Header>
  183. <soap:Body>
  184. <cwmp:SetParameterValuesResponse><Status xsi:type="xsd:int">0</Status></cwmp:SetParameterValuesResponse></soap:Body></soap:Envelope>'''
  185. xml3 = '''<soap:Envelope
  186. xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  187. xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
  188. xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
  189. xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  190. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  191. <soap:Header>
  192. <cwmp:ID soap:mustUnderstand="1"></cwmp:ID>
  193. </soap:Header>
  194. <soap:Body>
  195. <cwmp:SetParameterValuesResponse><Status xsi:type="xsd:int">0</Status></cwmp:SetParameterValuesResponse></soap:Body></soap:Envelope>'''
  196. x = s1.post(acsurl, data=xml1)
  197. y = (x.headers["Set-Cookie"][:-7])
  198. header = {'Cookie': y, 'User-Agent': "Vigor TR-069 CPE", 'Content-Type': "text/xml; charset=utf-8", 'SOAPAction': ""}
  199. z = s1.post(acsurl, headers=header)
  200. a = s1.post(acsurl, data=xml2, headers=header)
  201. b = s1.post(acsurl, data=xml3, headers=header)
  202. c = s1.post(acsurl, data=xml2, headers=header)
  203. d = s1.post(acsurl, data=xml2, headers=header)
  204. e = s1.post(acsurl, data=xml2, headers=header)
  205. f = s1.post(acsurl, data=xml2, headers=header)
  206. u = s1.post(acsurl, data=xml2, headers=header)
  207. v = s1.post(acsurl, data=xml2, headers=header)
  208. w = s1.post(acsurl, data=xml2, headers=header)
  209. g = (d.text)
  210. h = (f.text)
  211. i = g[g.find("Password")+44 : g.find("Password")+107]
  212. j = i.partition("<")[0]
  213. k = h[h.find("Password")+44 : h.find("Password")+107]
  214. l = k.partition("<")[0]
  215. m = g[g.find("DisplayName")+47 : g.find("DisplayName")+110]
  216. n = m.partition("<")[0]
  217. o = h[h.find("DisplayName")+47 : h.find("DisplayName")+110]
  218. p = o.partition("<")[0]
  219. q = g[g.find("DomainRealm")+47 : g.find("DomainRealm")+110]
  220. r = q.partition("<")[0]
  221. s = h[h.find("DomainRealm")+47 : h.find("DomainRealm")+110]
  222. t = s.partition("<")[0]
  223. if "voip.t-mobilethuis.nl" in g or "voip.odido.nl" in g:
  224.     print ("Lijn 1: Gebruikersnaam: " + n + " Wachtwoord: " + j + " Server: " + r)
  225. else:
  226.     print("Geen gegevens gevonden voor lijn 1.")
  227. if "voip.t-mobilethuis.nl" in h or "voip.odido.nl" in h:
  228.     print ("Lijn 2: Gebruikersnaam: " + p + " Wachtwoord: " + l + " Server: " + t)
  229. else:
  230.     print("Geen gegevens gevonden voor lijn 2.")
Add Comment
Please, Sign In to add comment