Rehber Turkcell Superbox ZTE MC8520b 5G sUser şifresi değiştirme ve CWMP / TR-069 kapatma

Selamlar dostlar.

Turkcell Superbox ZTE MC8520B 5G cihazda geliştirici seçeneklerini açtıktan sonra sUser kullanıcısının şifresini değiştiremiyorduk, default şifresini bilmediğimiz için onunla ilgili bir çalışma yaptım. Başarılı oldu. Ekstra olarak modemin web paneline WAN üzerinden HTTP/HTTPS erişimi veren etkin kuralı ve CWMP / TR‑069 kuralını kapatmayı başardım.


1. Öncelikle sUser kullanıcısına geçiş yapıyoruz. Admin üzerinden, bilmeyenler için hazır makale var, buradan erişebilirsiniz.



2. F12 ile konsolu açıp aşağıda verdiğim komutu yapıştırdığınızda, konsoldan "Hazır" diye bir çıktı verecek. Ben yaptığım için farklı bir uyarı veriyor; sizde "Hazır" uyarısı verecek.



JavaScript:
(async () => {
  if (location.origin !== "https://192.168.1.1" ||
      location.hash !== "#password_management") {
    throw new Error("Kodu Superbox Hesap Yönetimi sayfasında çalıştır.");
  }

  const session = sessionStorage.getItem("ct");
  const jquery = require("jquery");
  const config = require("config/config");
  if (!session || String(config.WEB_ATTR_IF_SUPPORT_SHA256) !== "2") {
    throw new Error("Geçerli oturum veya beklenen SHA-256 ayarı bulunamadı.");
  }

  let id = Date.now();
  async function readRpc(service, method, values, tag, mode) {
    const response = await fetch(`/ubus/?t=${Date.now()}`, {
      method: "POST",
      headers: {
        "Accept": "application/json, text/javascript, */*; q=0.01",
        "Content-Type": "application/json",
        "X-Requested-With": "XMLHttpRequest",
        "Z-Mode": mode,
        "Z-Tag": tag
      },
      body: JSON.stringify([{
        jsonrpc: "2.0",
        id: ++id,
        method: "call",
        params: [session, service, method, values]
      }])
    });
    if (!response.ok) throw new Error(`Modem HTTP hatası: ${response.status}`);
    const [reply] = await response.json();
    if (reply?.error || String(reply?.result?.[0]) !== "0" || !reply.result[1]) {
      throw new Error(`Modem okuma isteğini reddetti: ${reply?.error?.code ?? "RPC"}`);
    }
    return reply.result[1];
  }

  async function readAccounts() {
    const config = await readRpc("uci", "get", {config: "zwrt_web"}, "zwrt_web", "0");
    return Object.values(config.values ?? {});
  }

  const info = await readRpc("zwrt_web", "web_info", {}, "web_info", "1");
  const isSuperadmin = user => ["sUser", "superadmin"].includes(user);
  if (!isSuperadmin(info.login_current_user)) {
    throw new Error("Önce superadmin oturumunu aç.");
  }

  const accounts = await readAccounts();
  const target = accounts.find(account =>
    account?.username === "sUser" && account?.usergroup === "superadmin");
  const admin = accounts.find(account => account?.username === "admin");
  const isHash = value => /^[0-9A-F]{64}$/i.test(value ?? "");
  if (!isHash(target?.password) || !isHash(admin?.password) ||
      accounts.some(account => account !== target &&
        account?.password?.toLowerCase?.() === target.password.toLowerCase())) {
    throw new Error("sUser ve admin için ayrı şifre kayıtları doğrulanamadı.");
  }

  if (typeof window.cancelMc8520bPasswordChange === "function") {
    window.cancelMc8520bPasswordChange();
  }
  let armed = true;
  const timer = setTimeout(cancel, 120000);
  function cancel() {
    armed = false;
    clearTimeout(timer);
    if (window.cancelMc8520bPasswordChange === cancel) {
      delete window.cancelMc8520bPasswordChange;
    }
  }
  window.cancelMc8520bPasswordChange = cancel;

  jquery.ajaxPrefilter((options, _original, request) => {
    if (!armed || !options.url?.startsWith("/ubus/") ||
        typeof options.data !== "string") return;
    let batch;
    try {
      batch = JSON.parse(options.data);
    } catch {
      return;
    }
    const change = Array.isArray(batch) && batch.find(call =>
      call.params?.[1] === "zwrt_web" && call.params?.[2] === "web_change_password");
    if (!change) return;
    cancel();
    const [requestSession, , , fields] = change.params;
    const problems = [];
    if (batch.length !== 1) problems.push("birden fazla RPC çağrısı");
    if (requestSession !== session || sessionStorage.getItem("ct") !== session) {
      problems.push("form oturumu ile doğrulanan oturum farklı");
    }
    if (!isSuperadmin(fields?.user)) {
      problems.push(fields?.user === "admin" ? "form admin hesabını hedefliyor" :
        "form hedefi sUser veya superadmin olarak tanınmadı");
    }
    if (fields && "username_new" in fields) problems.push("istek kullanıcı adı değişikliği içeriyor");
    if (!fields?.password_new) problems.push("yeni şifre alanı eksik");
    if (!isHash(fields?.password_old)) problems.push("mevcut şifre alanı SHA-256 biçiminde değil");
    if (problems.length) {
      request.abort();
      console.error("İstek gönderilmedi — " + problems.join("; "));
      return;
    }

    fields.password_old = target.password;
    options.data = JSON.stringify(batch);
    request.done(async reply => {
      const row = reply?.[0];
      if (row?.error) {
        console.error("Modem RPC hatası:", row.error.code);
        return;
      }
      const result = row?.result?.[1]?.result;
      if (!["0", "success", "ok"].includes(String(result))) {
        console.warn("Modem başarı bildirmedi. Formdaki mesajı kontrol et.");
        return;
      }
      try {
        const after = await readAccounts();
        const updated = after.find(account =>
          account?.username === "sUser" && account?.usergroup === "superadmin");
        const currentAdmin = after.find(account => account?.username === "admin");
        if (isHash(updated?.password) && updated.password !== target.password &&
            currentAdmin?.password === admin.password) {
          console.info("Doğrulandı: sUser şifresi değişti.");
          return;
        }
      } catch {
        // A successful password change can close the current session.
      }
      console.info("Modem başarı bildirdi. Yeni şifreyi geliştirici girişinde dene.");
    });
    request.fail(() => console.warn("İstek doğrulanamadı. Tekrar göndermeden önce giriş yapmayı dene."));
  });

  console.info("Hazır. İki dakika içinde ÜSTTEKİ Kullanıcı Hesap Yönetimi formunu doldur. Mevcut şifreye deneme değeri, yeni şifre ve doğrulama alanlarına seçtiğin yeni şifreyi yaz. Üstteki Uygula'ya bas.");
})().catch(error => console.error(error.message));


3. "Hazır" dedikten sonra 2 dakika içinde kullanıcı hesap yönetimi kısmından mevcut şifre bölümüne rastgele 10 haneli bir şifre, yeni şifre kısmına da sUser kullanıcısında kullanacağınız şifreyi girip "Uygula"ya basıyorsunuz. Konsol kısmında sUser şifresi değişti çıktısını verirse işlem tamamlanmıştır. Çıkış yapıp sUser kullanıcısı ile arayüze giriş yapabilirsiniz.



HTTP/HTTPS erişimi kapatma
1. sUser ile giriş yapıyoruz. Yaptıktan sonrahttps://192.168.1.1/index.html#HTTP/HTTPS URL'sine giriş yapıyoruz.



2. Gelen ekranda soldaki tiki seçip "Düzenle" butonuna basıyoruz. Durum kısmını kapalıya getirip kaydediyoruz; HTTP/HTTPS erişimini kapatıyoruz.



1.https://192.168.1.1/index.html#tr069 URL'sine giriş yapıyoruz.



2. Gelen ekranda F12 ile konsol kısmını açıyoruz. Aşağıda verdiğim kodu yapıştırıyoruz; konsoldan çıktı verecek. Zaten "Doğrulandı, CWMP kapandı" diye ekstra kontrol içinde bir kod ekliyorum aşağıya.


JavaScript:
(() => {
  const api = require("service_rpc");
  const c = api.getTR069Config();

  if (String(c?.enableCWMP) === "0") {
    console.info("CWMP zaten kapalı.");
    return;
  }

  const fields = [c?.serverUrl, c?.serverUserName, c?.serverPassword,
    c?.requestUserName, c?.requestPassword, c?.requestPort];
  if (String(c?.enableCWMP) !== "1" || fields.some(v => !v)) {
    console.error("Mevcut ayarlar okunamadı. Değişiklik gönderilmedi.");
    return;
  }

  api.setTR069Configuration({
    enableCWMP: 0,
    serverURL: c.serverUrl,
    serverusername: c.serverUserName,
    serveruserpassword: c.serverPassword,
    connrequestname: c.requestUserName,
    connrequestpassword: c.requestPassword,
    connrequestport: c.requestPort,
    tr069_PeriodicInformEnable: c.tr069_PeriodicInformEnable,
    tr069_PeriodicInformInterval: c.tr069_PeriodicInformInterval
  }, response => {
    const closed = response?.result === "success" &&
      String(api.getTR069Config()?.enableCWMP) === "0";
    console.info(closed ? "Doğrulandı: CWMP kapalı." : "CWMP'nin kapandığı doğrulanamadı.");
  });
})();

Kontrol için

Kod:
require("service_rpc").getTR069Config()?.enableCWMP



Kontrol kodunu yazdığınızda 0 çıktısını veriyorsa, başarılı olarak işlem tamamlanmış demektir. Modemimize dışarıdan erişim kapatıldı şu an.
 
Son düzenleyen: Moderatör:
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…