ZYXEL EX3501-T0 ANA KONUSU


-
-
Kesinlikle bir konu + bununla uğraşmayı sevecek bir yazılımcı lazım. Aynı modemden bende de var. Henüz geçen gün bağlandı SOL 1000mbit ve hemen verdikleri EX3501-T0 modemi söküp kendi modemimi bağlamak istedim ama maalesef internete giriş yapamadım. MAC klonlama da yapsam SOL bir şekilde başka bir kontrol daha yapıyor olmalı. Bu modemim arayüzü dediğiniz gibi çok kısıtlı, ayrıca wifi6 destekli cihazımda 230mbit görebiliyorum en fazla yaklaşık 6 metre uzaklıktaki odadan ama kendi modemimi bu modeme bağlayıp interneti dağıtırsam 600mbite kadar çıkıyorz hız. Superonline'da kesinlikle başka modem kullanamazsınız dedi.
Bu modeminde root şifresini veya supervisor şifresini bulamıyorum maalesef, çok araştırdım, bulabilsek hiç olmazsa esktra ayarlar yapıp biraz kişiselleştiririz.
Chrome'da modem arayüzünde Developer console açarak eski yöntemleri de denedim, yetkim varmış gibi görünmedi maalesef.
SSID'leri ayırmayı bile kapatmışlar, bu ne biçim modem SSID ayırmayı bile kapatmışsınız dedim biz buradan ayırabiliriz dediler.
Benim evimdeki modeme müdahale edebiliyor olmalarını istemiyorum. TR-069, TR-369 ne varsa kapatmak istiyorum.
Bu konuya destek verebildiğim kadar vericem, yeni bilgi sahibi olursam yazarım, umarım birileri birşeyler başarabilmiştir bu modemle ilgili de bizlere yardımcı olur.
-
Şu en son teknolojiye sahip olma takıntım yüzünden sırf WIFI6 olsun diye modem değişimi istedim. Önceki modemim H267a idi. Birçok özelliğini kişiselleştirmiştim ve genelde memnundum. Bu modem bütün heyecanımı söndürdü. wifi şifresini değiştiremediğim için evdeki akıllı cihazları resetlemek zorunda kaldım. Zaten kablosuz bağlantı olarak harici mesh sistem kullandığım için modemin kablosuz ağını sadece 2.4 gHz isteyen cihazlar çin kullanıyordum. Umarım daha çok kullanıcı bu modeme geçtikçe özellikleri değiştirmenin yollarını buluruz. Zaten bu konuyu bu amaçla açtım.
-
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)
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.
-
Bayağı zaman ve emek harcamışsınız. Elinize sağlık.
-
Emeğinize sağlık ancak alın bi hopper 3811 geçin bu kadar uğraşmak yerine. :)
-
@sokrat68 çok teşekkürler, umarım biryerde işe yararlar.
@Michael Scofield hopper 3811'in ne gibi bir özelliği var merak ediyorum. Kendi modemimle bağlanabilmek için ASUS RT-AXE7800 satın aldım, kullanıcı adı şifre bilgilerini yazdım, SOL modemindeki WAN MAC adresini de bu modemime klonladım ama maalesef online olmadı. Çok deneme yaptım ve sonra modemi iade ettim maalesef.
Hopper daha farklı ne yapıyor acaba?
-
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.
-
Wan MAC adresi modemin bağlantı bilgileri sayfasında açık açık yazdığı için orada yanlışlık olmadığına eminim.
Iade ettiğim modemde Vlan ayarı yoktu maalesef, hatta onuda araştırdım ve bu modemde yok ama diğer modellerin bazılarında ancak custom firmware yüklendiğinde bu ayarın açıldığını da öğrendim.
O zaman şu anda deneyemediğim kalan tek ayar Vlan, onu da 0 olarak görüyorum modem backup dosyasında, tv+ içinde 103
Daha eski bir router var, ondaki ayarları da kontrol edeyim, vlan varsa yine denerim.
-
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.
-
Evet fiyatı biraz iyiydi.
Peki şimdi neler değişti superonline'da onu da merak ediyorum açıkçası. Yaklaşık 2 sene önce başka bir adreste yine 1000mbit superonline hizmeti alıyordum ve geldiği gün kendi modemimi kullanmaya başlamıştım. O modem hala duruyor, çalıştırıp ayarlarına baktım ve o superonline bilgilerim hala içinde yazılı, MAC klonlama yok, ayrıca VLANID diye bir ayar da yok, yani kullanıcı adı ve şifresini girip bağlanmışım ama şimdi kullanıcı adı + şifre + MAC klon işe yaramadı, artık VLANID kesin şart o zaman? veya ana router'ın seri numarasını da kontrol ediyor olabilirler mi? Esas soru kesin emin olduğumuz superonline'ın yeni bağlantı kontrol mekanizması nedir? k.adı + şifre + MAC + VLAN + seri numarası veya seri numarası dışında hepsi?
Bağlanabileceğimden emin olduğum zaman yeni bir router siparişi vericem, ama kesin emin olmam lazım.
-
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.
-
Benim aklımda da OpenWrt kullanabileceğim bir Asus router araştırmak var aslında ama dediğim gbi bağlantı kısmından emin olmam lazım.
Keenetic konusunda biraz araştırma yapmıştım, youtube'ta ana modemi Keenetic modeme bağlayıp klonlama yaptıktan sonra bağlantı sağlandığını gördüm ama videolarda bahsedilen Keenetic modemin kullanıcı adı, şifre ve MAC adresini klonladığı, VLAN gibi ayarları da klonluyor gibi bir özellikten bahseden bir video izlemedim o yüzden MAC klon yapan herhangi bir modemin işime yarayacağını düşündüm ama yaramadı.
Şimdi Keenetic araştırması da yapıcam neleri klonluyor diye, araştırmaya başlamadan önce bilen birisi varsa cevabı çok işe yarar.
2 Soruyla devam ediyorum araştırmaya;
- Keenetic hangi bilgileri kendine klonluyor?
- Superonline WAN bağlantısında hangi bilgileri kontrol ediyor?
-
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.
-
Detaylı WAN bilgilerini alabileceğimiz kodu da yazdım, bu bilgilerin içinde açık şekilde superonline@fiber kullanıcı adı ve şifre de gösteriliyor, VLANID vs gibi birçok bilgi mevcut
import base64
import json
import requests
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import re
AES_KEY_B64 = "Application altındaki AesKey Buraya Yazın"
MODEM_URL = "https://192.168.1.1/cgi-bin/DAL?oid=wan"
SESSION = "Network altındaki herhangi bir objeye tıkladıktan sonra sağda çıkan Session anahtarını buraya yazın"
headers = {
"Accept": "application/json",
"User-Agent": "Mozilla/5.0",
"X-Requested-With": "XMLHttpRequest"
}
cookies = {"Session": SESSION}
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)
print(decrypted_bytes.decode("utf-8",errors="ignore").replace(",", ",\n").replace('"', ""))
response = requests.get(MODEM_URL, headers=headers, cookies=cookies, verify=False)
data = response.json()
decrypt_response(data["content"], data["iv"])
-
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.
/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)
-
TR-069 komutu olarak ben belirtilen sitede
{
"InternetGatewayDevice.X_ZYXEL_EXT.LoginCfg.LogGp.1.Account.2.Password": "buraya kendi şifrenizi yazın"
}
bunları yazdım çünkü login group 1 account 2 sUser hesabına ait -- LogGp.1.Account.2. süslü parantez parametreleri set ayarlıyor, eğer bu grup numarası ve 2 numaralı hesapta hangi kullanıcı olduğundan emin olmak istersenizde Get yapabilirsiniz yani çağırabilirsiniz onun komutu da aşağıda:
[
"InternetGatewayDevice.X_ZYXEL_EXT.LoginCfg.LogGp.1.Account.2.Username"
]
-
Hocam kendi routerınıza geçtiğinizde iptv'i halledebildiniz mi?
Benzer içerikler
- arcadyan arc-vlax1800 wi-fi 6 ax1800 premium vdsl modem
- 192.168.1.1 modem arayüzüne giremiyorum
- huawei hg255s
- vodafone wifi 6 modem
- fiber modem tavsiye
- wlan nedir
- modem resetleme
- firmware nedir
- wifi sinyal güçlendirici
- wifi 7 modem
Bu mesaj IP'si ile atılan mesajları ara Bu kullanıcının son IP'si ile atılan mesajları ara Bu mesaj IP'si ile kullanıcı ara Bu kullanıcının son IP'si ile kullanıcı ara
KAPAT X