|
Hala uğraşmaya devam ediyorum. Neler yapılabilir bilmiyorum ama araştırmaya devam ediyorum. İlk olarak aklıma şu geldi, operatörler yaptığım görüşmede WiFi SSID'lerini buradan ayıra |
|
Hala uğraşmaya devam ediyorum. Neler yapılabilir bilmiyorum ama araştırmaya devam ediyorum. İlk olarak aklıma şu geldi, operatörler yaptığım görüşmede WiFi SSID'lerini buradan ayırabiliriz sizin için dediklerinde TR-069 protokolünün açık olduğunu anladım. Daha sonra superonline hesap ayarlarında WiFi iyileştirme butonunun olduğunu gördüm ve buraya basınca modeme bir ayar komutu gelecekti. Neler gelebileceğini görmek için modemde loglara bakmam lazımdı ama Maintenance menüsü altında Log Setting başlığında modemin tutacağı log türlerinde TR-069 yoktu. Developer console ile herhangi bir ayarın (Attack) value'sunu TR-069 olarak değiştirip denedim ama olmadı, o yüzden bende python ile denemelere başladım ve istediğim ayarları açabilecek kodu sonunda üretmeyi başardım, gpt sağolsun. Aşağıdaki kod ile birlikte açık olmayan logları da enable yapabiliyoruz. import requests import base64 import json from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad # 🔹 Modem IP Adresi MODEM_IP = "192.168.1.1" # 🔹 Tarayıcıdan aldığın çerezler cookies = { "Session": "Browserda developer console açtıktan sonra, "Application" sekmesinde Cookies'nin altında yazıyor " } # 🔹 ZYSessionKey (Elle Gir) zysession_key = "Browserda developer console açtıktan sonra, "Application" sekmesinde "Local Storage" da yazıyor" # 🔹 AES Key (Base64 formatında) AES_KEY_B64 = "Browserda developer console açtıktan sonra, "Application" sekmesinde "Local Storage" da yazıyor" # 🔹 HTTP Başlıkları headers = { "Accept": "application/json, text/javascript, */*; q=0.01", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/133.0", "X-Requested-With": "XMLHttpRequest", "Referer": f"https://{MODEM_IP}/LogSetting", "Origin": f"https://{MODEM_IP}", "Host": MODEM_IP, "CsrfToken": zysession_key, "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" } json_data = { "Enable": True, "LogMode": "Local", "LogServer": "", "UDPPort": 514, "Interval": 60, "MailEnable": False, "MailTo": "", "MailSubject": "", "MailRef": "", "AlarmTo": "", "AlarmSubject": "", "WAN-DHCP": True, "DHCP Server": True, "PPPoE": True, "TR-069": True, "HTTP": True, "UPNP": True, "System": True, "ACL": True, "Wireless": True, "Voice": True, "MESH": True, "IGMP": True, "Account": True, "Attack": True, "Firewall": True, "MAC Filter": True, "systemLog": [ "WAN-DHCP", "DHCP Server", "PPPoE", "TR-069", "HTTP", "UPNP", "System", "ACL", "Wireless", "Voice", "MESH", "IGMP" ], "securityLog": [ "Account", "Attack", "Firewall", "MAC Filter" ] } # 🔹 Yeni IV Al def get_iv(): response = requests.get( f"https://{MODEM_IP}/cgi-bin/DAL?oid=logset", headers=headers, cookies=cookies, verify=False ) if response.status_code == 200: data = response.json() if "iv" in data: iv = data["iv"] print(f"✅ **Yeni IV Alındı:** {iv}") return iv print("\n❌ **Hata: IV alınamadı!**") return None # 🔹 JSON'u AES ile şifreleme def encrypt_data(data, iv): aes_key = base64.b64decode(AES_KEY_B64) iv_decoded = base64.b64decode(iv)[:16] json_string = json.dumps(data, separators=(",", ":")) cipher = AES.new(aes_key, AES.MODE_CBC, iv_decoded) encrypted_data = cipher.encrypt(pad(json_string.encode(), AES.block_size)) return base64.b64encode(encrypted_data).decode("utf-8") # 🔹 Yanıtı Çözüp Session Key'i Al def decrypt_response(encrypted_content, iv_base64): aes_key = base64.b64decode(AES_KEY_B64) iv = base64.b64decode(iv_base64)[:16] cipher = AES.new(aes_key, AES.MODE_CBC, iv) decrypted_bytes = unpad(cipher.decrypt(base64.b64decode(encrypted_content)), AES.block_size) decrypted_json = decrypted_bytes.decode("utf-8") print("\n✅ **Şifre Çözüldü!**") print(decrypted_json) # **Yeni Session Key'i çek** try: response_dict = json.loads(decrypted_json) if "sessionkey" in response_dict: new_session_key = response_dict["sessionkey"] print(f"\n🔑 **Yeni SessionKey:** {new_session_key}") return new_session_key except json.JSONDecodeError: print("\n❌ **Hata: Yanıt JSON formatında değil!**") return None # 🔹 IV Al iv_base64 = get_iv() if not iv_base64: exit() # 🔹 JSON'u Şifrele encrypted_content = encrypt_data(json_data, iv_base64) # 🔹 Modeme Güncellenmiş Attack: False isteği gönder payload = { "content": encrypted_content, "iv": iv_base64 } print("\n📡 **Modeme Güncellenmiş İstek Gönderiliyor...**") response = requests.put( f"https://{MODEM_IP}/cgi-bin/DAL?oid=logset", headers=headers, cookies=cookies, json=payload, verify=False ) if response.status_code == 200: try: # Yanıt JSON formatında ve şifrelenmiş geliyor response_data = response.json() encrypted_content = response_data["content"] iv_base64 = response_data["iv"] # Şifre çözüp yeni sessionKey alalım new_session_key = decrypt_response(encrypted_content, iv_base64) except json.JSONDecodeError: print("\n❌ **Hata: Yanıt JSON formatında değil!**") else: print(f"\n❌ **Hata! HTTP Kodu:** {response.status_code}") print(response.text) < Resime gitmek için tıklayın > Bu olduktan sonra yine operatör sayfasına gidip WiFi iyileştirme düğmesine bastım ve tekrar modeme dönüp logları kontrol ettim, anında yeni loglar geldi TR-069 altından. içinde set edilmiş bir cookie de bulunuyor. Amacım onların yetkisinda olup bizim yetkimizde olmayan şeyleri yapmak tabi ki. Yani SSID ayırmaya bile izin yok saçmalığından kurtulmak ta istiyorum. Neyse bu logların bilgilerini cookie vs kullanamadım açıkçası. Daha sonra bu şekilde ayar değiştirebildiğim için kullanıcı hesaplarıyla ilgili birşey yapılabilirmi diye bakınmaya başladım. Aşağıdaki kod ile kullanıcı hesaplarında basit değişiklikler yapmayı başardım, hesap aktif olsun veya olmasın, timeout süresi değişsin vs gibi, burda tabi ki hemen supervisor denedim ama maalesef bir sonuca ulaşamadım. Belki bu kısımları ilerleten birileri çıkabilir diye paylaşıyorum. import requests import base64 import json from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad # 🔹 Modem IP Adresi MODEM_IP = "192.168.1.1" # 🔹 Tarayıcıdan aldığın çerezler cookies = { "Session": "Session Key Buraya Yaz" } # 🔹 ZYSessionKey (Elle Gir) zysession_key = "Zysession Key Buraya Yaz" # 🔹 AES Key (Base64 formatında) AES_KEY_B64 = "AES Key buraya yaz" # 🔹 HTTP Başlıkları headers = { "Accept": "application/json, text/javascript, */*; q=0.01", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/133.0", "X-Requested-With": "XMLHttpRequest", "Referer": "https://192.168.1.1/UserAccount", "Origin": "https://192.168.1.1", "Host": MODEM_IP, "CsrfToken": zysession_key, "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" } # 🔹 Attack: False olacak JSON json_data = { "Index":1, "Enabled":True, "Username":"supervisor", "AccountRetryTime":0, "AccountIdleTime":3000, "AccountLockTime":0, "RemoteAccessPrivilege":"LAN,WAN", "group":"Administrator", "editId":"acc_editBtn0", "deleteId":"acc_deleteBtn0", "activeId":"userAccount-1", "Index":2, "Enabled":True, "Username":"admin", "AccountRetryTime":0, "AccountIdleTime":3000, "AccountLockTime":0, "RemoteAccessPrivilege":"LAN,WAN", "group":"Administrator", "editId":"acc_editBtn0", "deleteId":"acc_deleteBtn0", "activeId":"userAccount0", # 🔹 Yeni IV Al def get_iv(): response = requests.get( f"https://{MODEM_IP}/cgi-bin/DAL?oid=user_account&timedelay=1", headers=headers, cookies=cookies, verify=False ) if response.status_code == 200: data = response.json() if "iv" in data: iv = data["iv"] print(f"✅ **Yeni IV Alındı:** {iv}") return iv print("\n❌ **Hata: IV alınamadı!**") return None # 🔹 JSON'u AES ile şifreleme def encrypt_data(data, iv): aes_key = base64.b64decode(AES_KEY_B64) iv_decoded = base64.b64decode(iv)[:16] json_string = json.dumps(data, separators=(",", ":")) cipher = AES.new(aes_key, AES.MODE_CBC, iv_decoded) encrypted_data = cipher.encrypt(pad(json_string.encode(), AES.block_size)) return base64.b64encode(encrypted_data).decode("utf-8") # 🔹 Yanıtı Çözüp Session Key'i Al def decrypt_response(encrypted_content, iv_base64): aes_key = base64.b64decode(AES_KEY_B64) iv = base64.b64decode(iv_base64)[:16] cipher = AES.new(aes_key, AES.MODE_CBC, iv) decrypted_bytes = unpad(cipher.decrypt(base64.b64decode(encrypted_content)), AES.block_size) decrypted_json = decrypted_bytes.decode("utf-8") print("\n✅ **Şifre Çözüldü!**") print(decrypted_json) # **Yeni Session Key'i çek** try: response_dict = json.loads(decrypted_json) if "sessionkey" in response_dict: new_session_key = response_dict["sessionkey"] print(f"\n🔑 **Yeni SessionKey:** {new_session_key}") return new_session_key except json.JSONDecodeError: print("\n❌ **Hata: Yanıt JSON formatında değil!**") return None # 🔹 IV Al iv_base64 = get_iv() if not iv_base64: exit() # 🔹 JSON'u Şifrele encrypted_content = encrypt_data(json_data, iv_base64) # 🔹 Modeme Güncellenmiş Attack: False isteği gönder payload = { "content": encrypted_content, "iv": iv_base64 } print(payload) print("\n📡 **Modeme Güncellenmiş İstek Gönderiliyor...**") response = requests.put( f"https://{MODEM_IP}/cgi-bin/DAL?oid=user_account&timedelay=1", headers=headers, cookies=cookies, json=payload, verify=False ) if response.status_code == 200: try: # Yanıt JSON formatında ve şifrelenmiş geliyor response_data = response.json() encrypted_content = response_data["content"] iv_base64 = response_data["iv"] # Şifre çözüp yeni sessionKey alalım new_session_key = decrypt_response(encrypted_content, iv_base64) except json.JSONDecodeError: print("\n❌ **Hata: Yanıt JSON formatında değil!**") else: print(f"\n❌ **Hata! HTTP Kodu:** {response.status_code}") print(response.text) Modem dosyalarını da karıştırmaya başladım, yine chrome developer altında, Sources kısmında modemin hangi directory'leri var bakmaya başladım. Ufak bir backup dosyası buldum, kolayca indiriliyor, bilgileri denetledim ama ben bir yere varamadım belki siz varabilirsiniz --> https://192.168.1.1/cgi-bin/Backup_Restore?action=Backup Araştırmaya devam ediyorum. 192.168.1.1 adresinden herhangi bir istek gönderdiğinizde content ve iv verilerini içeren şifreli cevap geliyor, bu cevabı plain text olarak görmek isterseniz gelen cevabtaki boşlukların hepsini silip tek satır olacak şekilde düzenleyin, aşağıdaki kodu çalıştırın, şifreli veriyi istedinde yapıştırın ve komut satırında plain text halini gösterir. import base64 import json from Crypto.Cipher import AES from Crypto.Util.Padding import unpad # 🔹 Güncellenmiş AES Key AES_KEY_B64 = "AesKey buraya Gir" def decrypt_response(encrypted_content, iv_base64): try: # AES Anahtarını ve IV'yi decode et aes_key = base64.b64decode(AES_KEY_B64) iv = base64.b64decode(iv_base64)[:16] # Base64 hata düzeltme: veri uzunluğunu 4'ün katına getir missing_padding = len(encrypted_content) % 4 if missing_padding: encrypted_content += "=" * (4 - missing_padding) # Şifre çözme işlemi cipher = AES.new(aes_key, AES.MODE_CBC, iv) decrypted_bytes = unpad(cipher.decrypt(base64.b64decode(encrypted_content)), AES.block_size) decrypted_json = decrypted_bytes.decode("utf-8") print("\n✅ **Şifre Çözüldü!**") print(decrypted_json) # **Yeni Session Key'i çek** try: response_dict = json.loads(decrypted_json) if "sessionkey" in response_dict: new_session_key = response_dict["sessionkey"] print(f"\n🔑 **Yeni SessionKey:** {new_session_key}") return new_session_key except json.JSONDecodeError: print("\n❌ **Hata: Yanıt JSON formatında değil!**") return None except Exception as e: print(f"\n❌ **Hata:** {str(e)}") return None # 📌 Kullanıcıdan Şifreli JSON Verisini Al json_input = input("Şifreli JSON verisini girin:\n") try: # JSON içinden `content` ve `iv` değerlerini al data = json.loads(json_input) encrypted_content = data["content"] iv_base64 = data["iv"] # 📌 Şifre Çözme İşlemini Başlat decrypt_response(encrypted_content, iv_base64) except json.JSONDecodeError: print("\n❌ **Hata: Geçersiz JSON formatı!**") Araştırmaya devam ediyorum. Belki şu ana kadar yaptıklarım başkalarının çoktan yaptıklarıdır ama bişeyler yapmaya başladıkça daha kolay anlıyorum. Umarım ben veya başka birisi bir yerlere varabiliriz. |
| SOL ve TT tarafından verilen bu cihaz için bir ana konu gerekecek sanırım çünkü ayarları fazlasıyla kısıtlanmış görünüyor. Mesela kablosuz SSID zar zor değiştirdim ama kablosuz şifresine istediğim şifreyi koyamadım. Önceki ZTE modemin ayarları daha kolay özelleştirilebiliyordu. |
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.
|
1 dakika önce denemek için yine @TolgaGazi3548 'in bu konuyla alakalı mesajına denk geldim -- > https://forum.donanimhaber.com/mesaj/yonlen/160570090 3. adıma geçtiğimde tv+'ın ip adresi lazım oldu ama yeni router'a takılı değildi, onu taktım ve açınca nasıl hata verecek diye bakayım dedim ama hata gelmedi, canlı kanallar açıldı, film menüsünden filmler de açıldı, başka da önemli bir yer yok heralde orada kontrol edeceğim, yani tv+ ta çalıştı evet. |
|
Herkese selamlar. Uzun uğraşlar sonunda modemi rootlamayı başardım. Öncelikle başlıktaki tr069 metodunu keşfeden arkadaşlara teşekkür ederim. Bu yöntem ile ilerleyip modemi ttg ve zyxel global parametreleriyle rootlamaya çalışıyoruz. mantığı bu şekilde yani. daha uzun bir post yazmayı düşünüyorum bununla ilgili şimdilik sadece tr069-genieacs kodlarını vereceğim. ben "genieacs" kullandım dileyen cloud.tr069.pro dan da yapabilir. curl -i 'http://localhost:7557/devices/(DEVICE-ID)/tasks?connection_request' -X POST --data '{"name": "setParameterValues", "parameterValues": [ ["InternetGatewayDevice.X_TTG.Users.User.2.Password", "SIFREBURAYA09", "xsd:string"], ["InternetGatewayDevice.X_TTG.Users.User.2.Enable", true, "xsd:boolean"], ["InternetGatewayDevice.X_TTG.Users.User.2.X_ZYXEL_Privilege", "1", "xsd:unsignedInt"], ["InternetGatewayDevice.X_ZYXEL_EXT.LoginCfg.LogGp.1.Account.2.Password", "SIFREBURAYA09", "xsd:string"], ["InternetGatewayDevice.X_ZYXEL_EXT.LoginCfg.LogGp.1.Account.2.Enable", true, "xsd:boolean"], ["InternetGatewayDevice.X_ZYXEL_EXT.LoginCfg.LogGp.1.Account.2.Privilege", "supervisor", "xsd:string"] ] }' localhost yazan yere eğer cloud kullanacaksanız cloud url girmelisiniz. curl ile veya parametre ile yapabilirsiniz. provision ile yapacaklar için onu da bırakıyorum. Eğer genieacs kullanacaksanız port da yazmalısınız. üstteki( localhost:7557 ) şeklinde. GENIEACS PROVISION: // --- AYARLAR --- const desiredPassword = "sifreburaya09"; // Şifreni buradan değiştirebilirsin log('Provision: Root yetkisi ve şifre tanımlama başlatılıyor...'); // 1. BLOK: Türk Telekom Özel Parametreleri (X_TTG) // InternetGatewayDevice.X_TTG.Users.User.2 declare("InternetGatewayDevice.X_TTG.Users.User.2.Password", {value: now}, {value: desiredPassword}); declare("InternetGatewayDevice.X_TTG.Users.User.2.Enable", {value: now}, {value: true}); declare("InternetGatewayDevice.X_TTG.Users.User.2.X_ZYXEL_Privilege", {value: now}, {value: 1}); // 2. BLOK: Zyxel Global Parametreleri (X_ZYXEL_EXT) // InternetGatewayDevice.X_ZYXEL_EXT.LoginCfg.LogGp.1.Account.2 declare("InternetGatewayDevice.X_ZYXEL_EXT.LoginCfg.LogGp.1.Account.2.Password", {value: now}, {value: desiredPassword}); declare("InternetGatewayDevice.X_ZYXEL_EXT.LoginCfg.LogGp.1.Account.2.Enable", {value: now}, {value: true}); declare("InternetGatewayDevice.X_ZYXEL_EXT.LoginCfg.LogGp.1.Account.2.Privilege", {value: now}, {value: "supervisor"}); log('Provision: Root komutları işlendi.'); Son olarak ekran görüntüleri: < Resime gitmek için tıklayın > < Resime gitmek için tıklayın > < Resime gitmek için tıklayın > |
Yeni modeminiz hayırlı olsun Bende 2 sene öncesinde farklı bir adreste sadece kullanıcı adı ve şifre ile bağlanabiliyordum. Bölgeden bölgeye farklılık gösteren bir durum sanırım bu. Daha iyi hizmet nasıl sağlarız? diye düşüneceklerine kendi modemimizi kullanmayı engellemek için daha farklı neler yapılabilir diye düşünüyorlar sanırım. |
|
Bu modemde kısıtlı root (dns vb değiştirme) izni elde etmeyi başardım https://forum.donanimhaber.com/zyxel-ex3501-t0-ana-konusu--160700087#160778191 bu mesajdaki gibi tr069 u kendi kontrolünüze aldığınızda InternetGatewayDevice.X_TTG.Users.User.2.Enable ı true ve InternetGatewayDevice.X_TTG.Users.User.2.Password ı da istediğiniz şifre yaparsanız root kullanıcı adı ile girebiliyorsunuz Eğer bu değerler gözükmüyorsa InternetGatewayDevice.X_TTG.Users olarak get çalıştırabilirsiniz ondan sonra gözükür tr069 sağlayıcısında (Resimdeki model farklı biliyorum ama aynı şekilde bu cihazdada oluyor) < Resime gitmek için tıklayın > < Resime gitmek için tıklayın > ssh ve telnet erişimi açılabiliyor ama zycli denen kısıtlı bir araç kullanılabiliniyor sadece ilginç olarak firmware guncellemesinde model ve sürüm kontrolü kapatılabiliyor zycli ile ama bendeki tek modem bu olduğundan ve firmware bulamadığımdan daha fazla kurcalamadım İlgilenen ve yapamayan olursa yazsın o mesajda belirtilen tr069.pro ile anlatım yazabilirim ben kendi sunucum olduğu içn ona genieacs kurarak yaptım işlemleri yapan curl request (genieacs için) curl -sS -X POST 'http://localhost:7557/devices/DEVICE_ID/tasks' -H 'Content-Type: application/json' --data '{"name":"setParameterValues","parameterValues":[ ["InternetGatewayDevice.X_TTG.Users.User.1.Password","ModemBizdedir#!!","xsd:string"], ["InternetGatewayDevice.X_TTG.Users.User.2.Enable",true,"xsd:boolean"], ["InternetGatewayDevice.X_TTG.Users.User.2.Password","ModBizdedirem#!!","xsd:string"] ]}' |
| Emeğinize sağlık ancak alın bi hopper 3811 geçin bu kadar uğraşmak yerine. :) |
| wan mac adresi klonlamada hata yapmış olamaz mısın? ya da vlan değerlerinde? voip ayarları var bir de. elbette kullanıcı adı ve şifre olayı da var ama ben olsam başka bir router ile kullandığın bilgilerden emin olmak için tekrar deneme yap derim. iade ettiğin router'a yazık olmuş. onu yine kullanabilirdin. |
sözümü geri aldım ya, yazık değil iyi olmuş iade ettiğin. kullanım kılavuzuna ve iki yabancı incelemeye baktım, vlan'ın v si bile yazılmamış. inceleme yapıyor bir de. "vlan ayarı yok" dememiş hiç biri. gerçi fiyatına baktım şimdi. boşuna kelime harcamışım bu ürün için. |
| Keenetic konusuna göz at istersen. Yazılımı ile özelleştirme noktasında çok dolu bir markadır Keenetic. Hopper'da son çıkan ürünlerinden gerek cpu gerek ram gerekse yazılımı ile ideal bir cihaz son kullanıcı için. Evet user pass ve vlan ile genelden bağlantı sağlanıyor. Asus tarafında ise mağlesef Zyxel'in Armor G5 gibi vlan girememe durumu olabiliyor o tarafta da destekliyorsa openwrt derim. |
| Asus router konusunda tuf-4200 tuf-6000 veya rt-59u önerebilirim openwrt kanadında. Hepsi de aynı chipset olması lazım. Diğer yandan Keenetic tarafında çalıştıranlar olması lazım. Dediğim gibi keenetic konusunda bir yazın oldukça geniş bir yapı var orda. |
|
Modemden bilgi alabileceğimiz benim bulduğum bütün URL'ler: /cgi-bin/ /cgi-bin/ARPTable_handle /cgi-bin/AtmOptinGet /cgi-bin/CardInfo /cgi-bin/CheckFsecureLicense /cgi-bin/CheckSfpLinkUp /cgi-bin/CheckVoipInuse /cgi-bin/CurrentTime /cgi-bin/DAL? /cgi-bin/DAL?oid=8021AG /cgi-bin/DAL?oid=8023AH /cgi-bin/DAL?oid=EDNS /cgi-bin/DAL?oid=ExtenderNetMAP /cgi-bin/DAL?oid=IPSecVPN /cgi-bin/DAL?oid=LanPortInfo /cgi-bin/DAL?oid=MultiWan /cgi-bin/DAL?oid=NAT_APPLICATION /cgi-bin/DAL?oid=OAMPING /cgi-bin/DAL?oid=OperatingModes /cgi-bin/DAL?oid=OperationMode /cgi-bin/DAL?oid=PINGTEST /cgi-bin/DAL?oid=RDM_OID_BRIDGING_BR /cgi-bin/DAL?oid=RDM_OID_BRIDGING_FILTER /cgi-bin/DAL?oid=RDM_OID_DEV_SEC_CERT /cgi-bin/DAL?oid=RDM_OID_IP_IFACE /cgi-bin/DAL?oid=RDM_OID_LOG_CATEGORY /cgi-bin/DAL?oid=RDM_OID_LOG_CLASSIFY /cgi-bin/DAL?oid=Traffic_Status /cgi-bin/DAL?oid=URL_BlackList /cgi-bin/DAL?oid=URL_WhiteList /cgi-bin/DAL?oid=URL_filter /cgi-bin/DAL?oid=VOIP_Status /cgi-bin/DAL?oid=VPNLite /cgi-bin/DAL?oid=apas /cgi-bin/DAL?oid=apas_macf /cgi-bin/DAL?oid=bandwidth_improvement /cgi-bin/DAL?oid=callblock /cgi-bin/DAL?oid=cardpage_status /cgi-bin/DAL?oid=cellular /cgi-bin/DAL?oid=cellwan_mapn /cgi-bin/DAL?oid=cellwan_sim /cgi-bin/DAL?oid=cellwan_status /cgi-bin/DAL?oid=content_filter /cgi-bin/DAL?oid=cyber_secure /cgi-bin/DAL?oid=ddns /cgi-bin/DAL?oid=dev_sec_cert /cgi-bin/DAL?oid=dns /cgi-bin/DAL?oid=dns_route /cgi-bin/DAL?oid=email_ntfy /cgi-bin/DAL?oid=ethctl /cgi-bin/DAL?oid=ethwanlan /cgi-bin/DAL?oid=firewall /cgi-bin/DAL?oid=firewall_acl /cgi-bin/DAL?oid=firewall_proto /cgi-bin/DAL?oid=gpon /cgi-bin/DAL?oid=gre_tunnel /cgi-bin/DAL?oid=igmp_mld /cgi-bin/DAL?oid=intf_group /cgi-bin/DAL?oid=ipalias /cgi-bin/DAL?oid=ipfilter /cgi-bin/DAL?oid=lan /cgi-bin/DAL?oid=lanadv /cgi-bin/DAL?oid=lanhosts /cgi-bin/DAL?oid=login_privilege /cgi-bin/DAL?oid=logset /cgi-bin/DAL?oid=macfilter /cgi-bin/DAL?oid=media_server /cgi-bin/DAL?oid=mgmt /cgi-bin/DAL?oid=mgmt_srv /cgi-bin/DAL?oid=mqtt_client /cgi-bin/DAL?oid=nat /cgi-bin/DAL?oid=nat_addr_map /cgi-bin/DAL?oid=nat_conf /cgi-bin/DAL?oid=nat_pcp /cgi-bin/DAL?oid=nat_trigger /cgi-bin/DAL?oid=one_connect /cgi-bin/DAL?oid=package_3rdParty /cgi-bin/DAL?oid=paren_ctl /cgi-bin/DAL?oid=phone /cgi-bin/DAL?oid=policy_route /cgi-bin/DAL?oid=portBindingSwitch /cgi-bin/DAL?oid=port_mirror /cgi-bin/DAL?oid=pppoe_setting /cgi-bin/DAL?oid=pptp /cgi-bin/DAL?oid=print_server /cgi-bin/DAL?oid=qos /cgi-bin/DAL?oid=qos_class /cgi-bin/DAL?oid=qos_policer /cgi-bin/DAL?oid=qos_queue /cgi-bin/DAL?oid=qos_shaper /cgi-bin/DAL?oid=quickWanSet /cgi-bin/DAL?oid=reboot_schedule /cgi-bin/DAL?oid=region /cgi-bin/DAL?oid=rip /cgi-bin/DAL?oid=scheduler /cgi-bin/DAL?oid=sensor /cgi-bin/DAL?oid=sip_account /cgi-bin/DAL?oid=sip_sp /cgi-bin/DAL?oid=sip_tls /cgi-bin/DAL?oid=sp_mgmt_srv /cgi-bin/DAL?oid=sp_trust_domain /cgi-bin/DAL?oid=speeddial /cgi-bin/DAL?oid=static_dhcp /cgi-bin/DAL?oid=static_route /cgi-bin/DAL?oid=status /cgi-bin/DAL?oid=time /cgi-bin/DAL?oid=tr369 /cgi-bin/DAL?oid=tr369_con /cgi-bin/DAL?oid=tr369_con_mtp /cgi-bin/DAL?oid=tr369_con_mtp_mqtt /cgi-bin/DAL?oid=tr369_mtp /cgi-bin/DAL?oid=tr369_mtp_mqtt /cgi-bin/DAL?oid=tr69 /cgi-bin/DAL?oid=tr69default /cgi-bin/DAL?oid=trust_domain /cgi-bin/DAL?oid=ttsamba_account /cgi-bin/DAL?oid=usb_filesharing /cgi-bin/DAL?oid=usb_info /cgi-bin/DAL?oid=user_account /cgi-bin/DAL?oid=vlan_group /cgi-bin/DAL?oid=vpnclient /cgi-bin/DAL?oid=wan /cgi-bin/DAL?oid=wan_adv /cgi-bin/DAL?oid=wifi_easy_mesh /cgi-bin/DAL?oid=wifi_macfilter /cgi-bin/DAL?oid=wifi_others /cgi-bin/DAL?oid=wifi_wds /cgi-bin/DAL?oid=wlan /cgi-bin/DAL?oid=wlan_chanhopping /cgi-bin/DAL?oid=wlan_sch_access /cgi-bin/DAL?oid=wlan_scheduler /cgi-bin/DAL?oid=wmm /cgi-bin/DAL?oid=wps /cgi-bin/Diagnostic_Result /cgi-bin/EthctlOptionGet /cgi-bin/Firmware_Upgrade /cgi-bin/GetMTDSize?from=config /cgi-bin/GetMTDSize?from=firmware /cgi-bin/GetMTDSize?from=wwan /cgi-bin/GetRouterLanPortMacList /cgi-bin/Home_Networking?action=WOLCommand /cgi-bin/Home_Networking?action=WOLParseTuple /cgi-bin/Home_Networking?oid=lan /cgi-bin/IgmpTbSt?action=get /cgi-bin/LAN_PORT_LIST_Get /cgi-bin/LogResult?action=GET_LOG&oid=RDM_OID_LOG_CLASSIFY&iid=[1,0,0,0,0,0] /cgi-bin/LogResult?action=GET_LOG&oid=RDM_OID_LOG_CLASSIFY&iid=[1,0,0,0,0,0]&category= /cgi-bin/LogResult?action=GET_LOG&oid=RDM_OID_LOG_CLASSIFY&iid=[2,0,0,0,0,0] /cgi-bin/LogResult?action=GET_LOG&oid=RDM_OID_LOG_CLASSIFY&iid=[2,0,0,0,0,0]&category= /cgi-bin/MULTI_USER_LIST_Get /cgi-bin/McastSt?action=get /cgi-bin/McastTbSt?action=get /cgi-bin/MenuList /cgi-bin/MultiLangSave /cgi-bin/NATSession_handle /cgi-bin/Online_FWInfoCheck /cgi-bin/Online_FWUpgradeAction /cgi-bin/Online_FW_Upgrade /cgi-bin/QosMonitor_handle /cgi-bin/RoutingTable_handle /cgi-bin/SIP?oid=RDM_OID_ETH_LINK /cgi-bin/SIP?oid=RDM_OID_IP_IFACE /cgi-bin/SIP?oid=RDM_OID_PPP_IFACE /cgi-bin/SNMP?oid=snmp /cgi-bin/SteeringStatus_handle /cgi-bin/System?oid=snmp /cgi-bin/TodayWlanSch /cgi-bin/Traffic_Status?mode=NATConntrack_handle /cgi-bin/Traffic_Status?mode=NATStatus_handle /cgi-bin/USB3SupportSave /cgi-bin/USB_Service?action=getIppPrinterName /cgi-bin/USB_Service?oid=RDM_OID_GUI_CUSTOMIZATION /cgi-bin/USB_Service?oid=RDM_OID_ZY_IPP_CFG /cgi-bin/USB_Service?oid=RDM_OID_ZY_SAMBA_DIR /cgi-bin/UserLoginCheck /cgi-bin/WAN_LAN_LIST_Get /cgi-bin/dslLineStatusGet /cgi-bin/getBasicInformation /cgi-bin/getCustomizationData /cgi-bin/getDefaultInformation /cgi-bin/getDefaultWANIP /cgi-bin/getWebGuiFlag /cgi-bin/loginAccountLevel /cgi-bin/snmp?oid=snmp /cgi-bin/xDSLProfileGet /cgi-bin/xDSLStatistics_handle?line= içlerine baktığım kadarıyla yararlı sayılacak bilgiler bu dosyalarda, yine birkaç farklı dosyada fiber kullanıcı adı ve şifre açıkça yazılmış durumda. Tabi açıkça diyorum ama content ve IV ile şifreleri çözünce ortaya çıkıyor. < Resime gitmek için tıklayın > /cgi-bin/ şekline yazdığım bütün urleleri cgi-bin-urls.txt dosyasına kaydederseniz ve aşağıdaki kodu çalıştırırsanız hepsini tek tek sorgulayıp, şifreleri çözüp, decoded_responses diye bir klasör oluşturacak ve içine sorguladıgi urllerin isminde txt dosyaları oluşturacak(görselde göründüğü gibi) import base64 import json import requests import os import re from Crypto.Cipher import AES from Crypto.Util.Padding import unpad AES_KEY_B64 = "AesKey Buraya Yaz" MODEM_IP = "192.168.1.1" SESSION = "Session Buraya Yaz" URLS_FILE = "cgi-bin-urls.txt" OUTPUT_DIR = "decoded_responses" headers = { "Accept": "application/json", "User-Agent": "Mozilla/5.0", "X-Requested-With": "XMLHttpRequest" } cookies = {"Session": SESSION} os.makedirs(OUTPUT_DIR, exist_ok=True) def decrypt_response(encrypted_content, iv_base64): aes_key = base64.b64decode(AES_KEY_B64) iv = base64.b64decode(iv_base64)[:16] encrypted_content += "=" * (4 - len(encrypted_content) % 4) cipher = AES.new(aes_key, AES.MODE_CBC, iv) decrypted_bytes = unpad(cipher.decrypt(base64.b64decode(encrypted_content)), AES.block_size) return decrypted_bytes.decode("utf-8", errors="ignore").replace(",", ",\n").replace('"', "") def sanitize_filename(url): filename = re.sub(r'[^\w\-]', '_', url.split("/cgi-bin/")[-1]) return filename if filename else "root" with open(URLS_FILE, "r", encoding="utf-8") as file: urls = [line.strip() for line in file.readlines() if line.strip()] for url in urls: full_url = f"https://{MODEM_IP}{url}" try: response = requests.get(full_url, headers=headers, cookies=cookies, verify=False) if response.status_code == 200: data = response.json() if "content" in data and "iv" in data: decrypted_text = decrypt_response(data["content"], data["iv"]) filename = sanitize_filename(url) + ".txt" file_path = os.path.join(OUTPUT_DIR, filename) with open(file_path, "w", encoding="utf-8") as f: f.write(decrypted_text) except Exception as e: print(f"❌ Hata: {e} - URL: {full_url}") |
| Elinize sağlık, @18yusuf hocanın söylediği şekilde id/şifreyi öğrenmiştim. Mac adresini kopyalayarak kolayca decoyu router olarak kullanabilmiştim bu sayede fakat iptv vlan'ı bir türlü öğrenemediğim için tekrar modemi kullanmaya geri döndüm. |
|
Uzun süredir TR-069 server nasıl kurarım diye düşünürken https://forum.donanimhaber.com/mesaj/yonlen/159504183 konusunda @TolgaGazi3548 'in yapmış olduğu anlatıma göre belirtilen siteden hesap oluşturdum ve daha önce verdiğim yöntemle python kullanarak modemdeki TR-069 bilgilerini değiştirdim. Bahsedilen linkten modeme erişim sağladığımda ilk defa sUser kullanıcısını gördüm ama şifresi görünmüyordu. TR-069 komutunu kullanarak modemdeki sUser şifresini değiştirdim. Artık sUser olarak giriş yapabiliyorum. Ne değiştir birşey değişmedi, modem aynı rezaletliğini koruyor :) ama bu kadar uğraştan sonra artık rahatladım. Modemdeki bütün bilgileri çektikten sonra yeni router siparişi verdim ve elime ulaştı. OpenWRT kurarak ayarları yaptım ve artık yeni router ile online'ım. superonline'ın modemini de kenara kaldırdım. Benim tarafımdaki ayarlarda tek eksik olan vlan imiş. openWRT ayarlarında wan.0 yapınca IP adresi geldi ve online oldum. Bende kullanıcı adı@fiber + şifre + MAC Klon + vlan ile online oldum, farklı yerlerde farklı güvenlik önlemleri var. Aşağıda forumda belirtilen konudaki siteden üyelik oluşturup gerekli bilgileri aldıktan sonra kendi modeminize nasıl aktaracağınızın kodunu veriyorum. Dediğim gibi bence yine de iyi değil bu modem. import requests import base64 import json from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad # 🔹 Modem IP Adresi MODEM_IP = "192.168.1.1" # 🔹 Tarayıcıdan aldığın çerezler cookies = { "Session": "Session anahtarını buraya yaz" } # 🔹 ZYSessionKey (Elle Gir) zysession_key = "zySessionkey buraya yaz" # 🔹 AES Key (Base64 formatında) AES_KEY_B64 = "Aes anahtarını buraya yaz" # 🔹 HTTP Başlıkları headers = { "Accept": "application/json, text/javascript, */*; q=0.01", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7", "Cache-Control": "no-cache", "Connection": "keep-alive", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "CsrfToken": zysession_key, "Session": "Session anahtarını buraya da yaz", "Dnt": "1", "Host": "192.168.1.1", "If-Modified-Since": "Thu, 01 Jun 1970 00:00:00 GMT", "Origin": "https://192.168.1.1", "Referer": "https://192.168.1.1/", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36", "X-Requested-With": "XMLHttpRequest", "sec-ch-ua-mobile" : "?0" } # 🔹 Attack: False olacak JSON json_data = { "EnableCWMP":True, "URL":"cloud.tr069.pro dan aldığın server adresini buraya yaz", "Username":"cloud.tr069.pro dan aldığın kullanıcı adını buraya yaz", "Password":"cloud.tr069.pro dan aldığın şifreyi buraya yaz", "ConnectionRequestUsername":"cloud.tr069.pro dan aldığın kullanıcı adını buraya yaz", "ConnectionRequestPassword":"cloud.tr069.pro dan aldığın şifreyi buraya yaz", "PeriodicInformEnable":True, "PeriodicInformInterval":86400, "PeriodicInformTime":"0001-01-01T00:00:00Z", "X_ZYXEL_ActiveNotifyUpdateInterval":30, "DebugLevelEnable":13, "FetureOptionEnable":2, "X_ZYXEL_ConnectionRequestPort":7547, "IPv6_Enable":False, "IPv4_Enable":True, "DisplaySOAP":False, "EnableAuthentication":None, "BoundInterfaceMode":"Multi_WAN", "BoundInterfaceList":"IP.Interface.2,IP.Interface.3", "ConnectionRequestURL":"", "CheckCert":False, "DataModelSpec":"TR-098", "Certificate":0, } # 🔹 Yeni IV Al def get_iv(): response = requests.get( f"https://{MODEM_IP}/cgi-bin/", headers=headers, cookies=cookies, verify=False ) if response.status_code == 200: data = response.json() if "iv" in data: iv = data["iv"] print(f"✅ **Yeni IV Alındı:** {iv}") return iv print("\n❌ **Hata: IV alınamadı!**") return None # 🔹 JSON'u AES ile şifreleme def encrypt_data(data, iv): aes_key = base64.b64decode(AES_KEY_B64) iv_decoded = base64.b64decode(iv)[:16] json_string = json.dumps(data, separators=(",", ":")) cipher = AES.new(aes_key, AES.MODE_CBC, iv_decoded) encrypted_data = cipher.encrypt(pad(json_string.encode(), AES.block_size)) return base64.b64encode(encrypted_data).decode("utf-8") # 🔹 Yanıtı Çözüp Session Key'i Al def decrypt_response(encrypted_content, iv_base64): aes_key = base64.b64decode(AES_KEY_B64) iv = base64.b64decode(iv_base64)[:16] cipher = AES.new(aes_key, AES.MODE_CBC, iv) decrypted_bytes = unpad(cipher.decrypt(base64.b64decode(encrypted_content)), AES.block_size) decrypted_json = decrypted_bytes.decode("utf-8") print("\n✅ **Şifre Çözüldü!**") print(decrypted_json) # **Yeni Session Key'i çek** try: response_dict = json.loads(decrypted_json) if "sessionkey" in response_dict: new_session_key = response_dict["sessionkey"] print(f"\n🔑 **Yeni SessionKey:** {new_session_key}") return new_session_key except json.JSONDecodeError: print("\n❌ **Hata: Yanıt JSON formatında değil!**") return None # 🔹 IV Al iv_base64 = get_iv() if not iv_base64: exit() # 🔹 JSON'u Şifrele encrypted_content = encrypt_data(json_data, iv_base64) # 🔹 Modeme Güncellenmiş Attack: False isteği gönder payload = { "content": encrypted_content, "iv": iv_base64 } print(payload) print("\n📡 **Modeme Güncellenmiş İstek Gönderiliyor...**") response = requests.put( f"https://{MODEM_IP}/cgi-bin/DAL?oid=tr69", headers=headers, cookies=cookies, json=payload, verify=False ) if response.status_code == 200: try: # Yanıt JSON formatında ve şifrelenmiş geliyor response_data = response.json() encrypted_content = response_data["content"] iv_base64 = response_data["iv"] # Şifre çözüp yeni sessionKey alalım new_session_key = decrypt_response(encrypted_content, iv_base64) except json.JSONDecodeError: print("\n❌ **Hata: Yanıt JSON formatında değil!**") else: print(f"\n❌ **Hata! HTTP Kodu:** {response.status_code}") print(response.text) |
| Çok teşekkürler. Umarım en kısa zamanda sorun düzelir ve kendi modeminizi kullanmaya devam edebilirsiniz. |
|
Söylediğim gibi yeni bir Mi ax3200 model router satın aldım ve openwrt yükledim. Aynen dediğiniz gibi sadece k.adı, şifre, mac klonu ve wan.0 ayarı ile sorunsuz SOL üzerinden nete bağlanıp ip aldım. Haklıymışsınız :) Bu şekilde bağlanılabileceğini ekran görüntüleriyle keenetic desteğe ilettim. Tekrar çok teşekkür ederim. |
| comnetten turknete geçiş yaptıktan sonra gelip bu modemi taktılar. arayüzden dns değiştirmeye bir türlü ulaşamadım. yolu bilen var mıdır ? |
İlk olarak aklıma şu geldi, operatörler yaptığım görüşmede WiFi SSID'lerini buradan ayırabiliriz sizin için dediklerinde TR-069 protokolünün açık olduğunu anladım. Daha sonra superonline hesap ayarlarında WiFi iyileştirme butonunun olduğunu gördüm ve buraya basınca modeme bir ayar komutu gelecekti. Neler gelebileceğini görmek için modemde loglara bakmam lazımdı ama Maintenance menüsü altında Log Setting başlığında modemin tutacağı log türlerinde TR-069 yoktu.
Developer console ile herhangi bir ayarın (Attack) value'sunu TR-069 olarak değiştirip denedim ama olmadı, o yüzden bende python ile denemelere başladım ve istediğim ayarları açabilecek kodu sonunda üretmeyi başardım, gpt sağolsun. Aşağıdaki kod ile birlikte açık olmayan logları da enable yapabiliyoruz.
import requests
import base64
import json
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
# 🔹 Modem IP Adresi
MODEM_IP = "192.168.1.1"
# 🔹 Tarayıcıdan aldığın çerezler
cookies = {
"Session": "Browserda developer console açtıktan sonra, "Application" sekmesinde Cookies'nin altında yazıyor "
}
# 🔹 ZYSessionKey (Elle Gir)
zysession_key = "Browserda developer console açtıktan sonra, "Application" sekmesinde "Local Storage" da yazıyor"
# 🔹 AES Key (Base64 formatında)
AES_KEY_B64 = "Browserda developer console açtıktan sonra, "Application" sekmesinde "Local Storage" da yazıyor"
# 🔹 HTTP Başlıkları
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/133.0",
"X-Requested-With": "XMLHttpRequest",
"Referer": f"https://{MODEM_IP}/LogSetting",
"Origin": f"https://{MODEM_IP}",
"Host": MODEM_IP,
"CsrfToken": zysession_key,
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
}
json_data = {
"Enable": True,
"LogMode": "Local",
"LogServer": "",
"UDPPort": 514,
"Interval": 60,
"MailEnable": False,
"MailTo": "",
"MailSubject": "",
"MailRef": "",
"AlarmTo": "",
"AlarmSubject": "",
"WAN-DHCP": True,
"DHCP Server": True,
"PPPoE": True,
"TR-069": True,
"HTTP": True,
"UPNP": True,
"System": True,
"ACL": True,
"Wireless": True,
"Voice": True,
"MESH": True,
"IGMP": True,
"Account": True,
"Attack": True,
"Firewall": True,
"MAC Filter": True,
"systemLog": [
"WAN-DHCP", "DHCP Server", "PPPoE", "TR-069", "HTTP", "UPNP",
"System", "ACL", "Wireless", "Voice", "MESH", "IGMP"
],
"securityLog": [
"Account", "Attack", "Firewall", "MAC Filter"
]
}
# 🔹 Yeni IV Al
def get_iv():
response = requests.get(
f"https://{MODEM_IP}/cgi-bin/DAL?oid=logset",
headers=headers,
cookies=cookies,
verify=False
)
if response.status_code == 200:
data = response.json()
if "iv" in data:
iv = data["iv"]
print(f"✅ **Yeni IV Alındı:** {iv}")
return iv
print("\n❌ **Hata: IV alınamadı!**")
return None
# 🔹 JSON'u AES ile şifreleme
def encrypt_data(data, iv):
aes_key = base64.b64decode(AES_KEY_B64)
iv_decoded = base64.b64decode(iv)[:16]
json_string = json.dumps(data, separators=(",", ":"))
cipher = AES.new(aes_key, AES.MODE_CBC, iv_decoded)
encrypted_data = cipher.encrypt(pad(json_string.encode(), AES.block_size))
return base64.b64encode(encrypted_data).decode("utf-8")
# 🔹 Yanıtı Çözüp Session Key'i Al
def decrypt_response(encrypted_content, iv_base64):
aes_key = base64.b64decode(AES_KEY_B64)
iv = base64.b64decode(iv_base64)[:16]
cipher = AES.new(aes_key, AES.MODE_CBC, iv)
decrypted_bytes = unpad(cipher.decrypt(base64.b64decode(encrypted_content)), AES.block_size)
decrypted_json = decrypted_bytes.decode("utf-8")
print("\n✅ **Şifre Çözüldü!**")
print(decrypted_json)
# **Yeni Session Key'i çek**
try:
response_dict = json.loads(decrypted_json)
if "sessionkey" in response_dict:
new_session_key = response_dict["sessionkey"]
print(f"\n🔑 **Yeni SessionKey:** {new_session_key}")
return new_session_key
except json.JSONDecodeError:
print("\n❌ **Hata: Yanıt JSON formatında değil!**")
return None
# 🔹 IV Al
iv_base64 = get_iv()
if not iv_base64:
exit()
# 🔹 JSON'u Şifrele
encrypted_content = encrypt_data(json_data, iv_base64)
# 🔹 Modeme Güncellenmiş Attack: False isteği gönder
payload = {
"content": encrypted_content,
"iv": iv_base64
}
print("\n📡 **Modeme Güncellenmiş İstek Gönderiliyor...**")
response = requests.put(
f"https://{MODEM_IP}/cgi-bin/DAL?oid=logset",
headers=headers,
cookies=cookies,
json=payload,
verify=False
)
if response.status_code == 200:
try:
# Yanıt JSON formatında ve şifrelenmiş geliyor
response_data = response.json()
encrypted_content = response_data["content"]
iv_base64 = response_data["iv"]
# Şifre çözüp yeni sessionKey alalım
new_session_key = decrypt_response(encrypted_content, iv_base64)
except json.JSONDecodeError:
print("\n❌ **Hata: Yanıt JSON formatında değil!**")
else:
print(f"\n❌ **Hata! HTTP Kodu:** {response.status_code}")
print(response.text)
< Resime gitmek için tıklayın >
Bu olduktan sonra yine operatör sayfasına gidip WiFi iyileştirme düğmesine bastım ve tekrar modeme dönüp logları kontrol ettim, anında yeni loglar geldi TR-069 altından. içinde set edilmiş bir cookie de bulunuyor. Amacım onların yetkisinda olup bizim yetkimizde olmayan şeyleri yapmak tabi ki. Yani SSID ayırmaya bile izin yok saçmalığından kurtulmak ta istiyorum. Neyse bu logların bilgilerini cookie vs kullanamadım açıkçası.
Daha sonra bu şekilde ayar değiştirebildiğim için kullanıcı hesaplarıyla ilgili birşey yapılabilirmi diye bakınmaya başladım. Aşağıdaki kod ile kullanıcı hesaplarında basit değişiklikler yapmayı başardım, hesap aktif olsun veya olmasın, timeout süresi değişsin vs gibi, burda tabi ki hemen supervisor denedim ama maalesef bir sonuca ulaşamadım. Belki bu kısımları ilerleten birileri çıkabilir diye paylaşıyorum.
import requests
import base64
import json
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
# 🔹 Modem IP Adresi
MODEM_IP = "192.168.1.1"
# 🔹 Tarayıcıdan aldığın çerezler
cookies = {
"Session": "Session Key Buraya Yaz"
}
# 🔹 ZYSessionKey (Elle Gir)
zysession_key = "Zysession Key Buraya Yaz"
# 🔹 AES Key (Base64 formatında)
AES_KEY_B64 = "AES Key buraya yaz"
# 🔹 HTTP Başlıkları
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/133.0",
"X-Requested-With": "XMLHttpRequest",
"Referer": "https://192.168.1.1/UserAccount",
"Origin": "https://192.168.1.1",
"Host": MODEM_IP,
"CsrfToken": zysession_key,
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
}
# 🔹 Attack: False olacak JSON
json_data = {
"Index":1,
"Enabled":True,
"Username":"supervisor",
"AccountRetryTime":0,
"AccountIdleTime":3000,
"AccountLockTime":0,
"RemoteAccessPrivilege":"LAN,WAN",
"group":"Administrator",
"editId":"acc_editBtn0",
"deleteId":"acc_deleteBtn0",
"activeId":"userAccount-1",
"Index":2,
"Enabled":True,
"Username":"admin",
"AccountRetryTime":0,
"AccountIdleTime":3000,
"AccountLockTime":0,
"RemoteAccessPrivilege":"LAN,WAN",
"group":"Administrator",
"editId":"acc_editBtn0",
"deleteId":"acc_deleteBtn0",
"activeId":"userAccount0",
# 🔹 Yeni IV Al
def get_iv():
response = requests.get(
f"https://{MODEM_IP}/cgi-bin/DAL?oid=user_account&timedelay=1",
headers=headers,
cookies=cookies,
verify=False
)
if response.status_code == 200:
data = response.json()
if "iv" in data:
iv = data["iv"]
print(f"✅ **Yeni IV Alındı:** {iv}")
return iv
print("\n❌ **Hata: IV alınamadı!**")
return None
# 🔹 JSON'u AES ile şifreleme
def encrypt_data(data, iv):
aes_key = base64.b64decode(AES_KEY_B64)
iv_decoded = base64.b64decode(iv)[:16]
json_string = json.dumps(data, separators=(",", ":"))
cipher = AES.new(aes_key, AES.MODE_CBC, iv_decoded)
encrypted_data = cipher.encrypt(pad(json_string.encode(), AES.block_size))
return base64.b64encode(encrypted_data).decode("utf-8")
# 🔹 Yanıtı Çözüp Session Key'i Al
def decrypt_response(encrypted_content, iv_base64):
aes_key = base64.b64decode(AES_KEY_B64)
iv = base64.b64decode(iv_base64)[:16]
cipher = AES.new(aes_key, AES.MODE_CBC, iv)
decrypted_bytes = unpad(cipher.decrypt(base64.b64decode(encrypted_content)), AES.block_size)
decrypted_json = decrypted_bytes.decode("utf-8")
print("\n✅ **Şifre Çözüldü!**")
print(decrypted_json)
# **Yeni Session Key'i çek**
try:
response_dict = json.loads(decrypted_json)
if "sessionkey" in response_dict:
new_session_key = response_dict["sessionkey"]
print(f"\n🔑 **Yeni SessionKey:** {new_session_key}")
return new_session_key
except json.JSONDecodeError:
print("\n❌ **Hata: Yanıt JSON formatında değil!**")
return None
# 🔹 IV Al
iv_base64 = get_iv()
if not iv_base64:
exit()
# 🔹 JSON'u Şifrele
encrypted_content = encrypt_data(json_data, iv_base64)
# 🔹 Modeme Güncellenmiş Attack: False isteği gönder
payload = {
"content": encrypted_content,
"iv": iv_base64
}
print(payload)
print("\n📡 **Modeme Güncellenmiş İstek Gönderiliyor...**")
response = requests.put(
f"https://{MODEM_IP}/cgi-bin/DAL?oid=user_account&timedelay=1",
headers=headers,
cookies=cookies,
json=payload,
verify=False
)
if response.status_code == 200:
try:
# Yanıt JSON formatında ve şifrelenmiş geliyor
response_data = response.json()
encrypted_content = response_data["content"]
iv_base64 = response_data["iv"]
# Şifre çözüp yeni sessionKey alalım
new_session_key = decrypt_response(encrypted_content, iv_base64)
except json.JSONDecodeError:
print("\n❌ **Hata: Yanıt JSON formatında değil!**")
else:
print(f"\n❌ **Hata! HTTP Kodu:** {response.status_code}")
print(response.text)
Modem dosyalarını da karıştırmaya başladım, yine chrome developer altında, Sources kısmında modemin hangi directory'leri var bakmaya başladım. Ufak bir backup dosyası buldum, kolayca indiriliyor, bilgileri denetledim ama ben bir yere varamadım belki siz varabilirsiniz --> https://192.168.1.1/cgi-bin/Backup_Restore?action=Backup
Araştırmaya devam ediyorum.
192.168.1.1 adresinden herhangi bir istek gönderdiğinizde content ve iv verilerini içeren şifreli cevap geliyor, bu cevabı plain text olarak görmek isterseniz gelen cevabtaki boşlukların hepsini silip tek satır olacak şekilde düzenleyin, aşağıdaki kodu çalıştırın, şifreli veriyi istedinde yapıştırın ve komut satırında plain text halini gösterir.
import base64
import json
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
# 🔹 Güncellenmiş AES Key
AES_KEY_B64 = "AesKey buraya Gir"
def decrypt_response(encrypted_content, iv_base64):
try:
# AES Anahtarını ve IV'yi decode et
aes_key = base64.b64decode(AES_KEY_B64)
iv = base64.b64decode(iv_base64)[:16]
# Base64 hata düzeltme: veri uzunluğunu 4'ün katına getir
missing_padding = len(encrypted_content) % 4
if missing_padding:
encrypted_content += "=" * (4 - missing_padding)
# Şifre çözme işlemi
cipher = AES.new(aes_key, AES.MODE_CBC, iv)
decrypted_bytes = unpad(cipher.decrypt(base64.b64decode(encrypted_content)), AES.block_size)
decrypted_json = decrypted_bytes.decode("utf-8")
print("\n✅ **Şifre Çözüldü!**")
print(decrypted_json)
# **Yeni Session Key'i çek**
try:
response_dict = json.loads(decrypted_json)
if "sessionkey" in response_dict:
new_session_key = response_dict["sessionkey"]
print(f"\n🔑 **Yeni SessionKey:** {new_session_key}")
return new_session_key
except json.JSONDecodeError:
print("\n❌ **Hata: Yanıt JSON formatında değil!**")
return None
except Exception as e:
print(f"\n❌ **Hata:** {str(e)}")
return None
# 📌 Kullanıcıdan Şifreli JSON Verisini Al
json_input = input("Şifreli JSON verisini girin:\n")
try:
# JSON içinden `content` ve `iv` değerlerini al
data = json.loads(json_input)
encrypted_content = data["content"]
iv_base64 = data["iv"]
# 📌 Şifre Çözme İşlemini Başlat
decrypt_response(encrypted_content, iv_base64)
except json.JSONDecodeError:
print("\n❌ **Hata: Geçersiz JSON formatı!**")
Araştırmaya devam ediyorum. Belki şu ana kadar yaptıklarım başkalarının çoktan yaptıklarıdır ama bişeyler yapmaya başladıkça daha kolay anlıyorum. Umarım ben veya başka birisi bir yerlere varabiliriz.
Bu mesaja 1 cevap geldi. Cevapları Gizle