mokbu

Uzman
Katılım
5 Mart 2025
Mesajlar
8
Beğeniler
5
Merhaba dostlar,

Elimdeki Turkcell Superbox 5G ZTE MC8520B Modem mevcut DNS ayarlarını değiştirebilmek için yöntemler arıyordum ChatGPT-5.6 Sol Ultra sağ olsun gizli bir Geliştirici Şeçenekleri bölümü ve sUser girişi olduğunu tespit etti.

Buradaki şifre encrypt edilmiş bir şekilde backendde hash olarak tutuluyormuş arayüz şifre alanındaki yazdığınız şifreyi SHA-256 olarak encrypt edip backende gönderiyor arka planda bu hash kayıtlı ve sadece admin girişi ile tüm yetkili kullanıcıların sUser dahil şifre hashlerine erişebiliyoruz.

Dolayısıyla aşağıdaki yöntem ile şifre giriş alanını tamamen bypass edip backende direkt şifre hashini gönderiyoruz ve Geliştirici Seçenekleri ile birlikte sUser girişi ve yetkisi almış oluyoruz.

Burada çok fazla kurcalamadım başka ne yapılabilir diye DHCP ayarlarında gördüğünüz gibi DNS değiştirme aktif oluyor sUser girişi ile.

1. Öncelikle modem arayüzüne admin şifresi ile giriş yapıyorsunuz;

zte-login.webp


2. Giriş yaptıktan sonra adres çubuğuna aşağıdaki linki yazarak geliştirici seçenekleri giriş ekranına geçiyoruz.

https://192.168.1.1/index.html#developer_options_login

zte-gelistirici-login.webp


3. Chrome tarayıcıda F12 ile DevTools açıp Console kısmında aşağıdaki kodu yapıştırıp Enter basıyoruz. Yapıştırma izni gerekirse allow pasting yazarak onay verebilirsiniz.

zte-gelistirici-login-js.webp



JavaScript:
(async () => {
  const ZERO = "00000000000000000000000000000000";
  const adminSid = sessionStorage.getItem("ct");

  if (!adminSid) {
    throw new Error("Önce normal admin hesabıyla WebUI'a giriş yap.");
  }

  let id = Date.now();

  async function ubus(
    session,
    object,
    method,
    args = {},
    tag = method,
    mode = "0"
  ) {
    const request = [{
      jsonrpc: "2.0",
      id: ++id,
      method: "call",
      params: [session, object, method, args]
    }];

    const response = await fetch(`/ubus/?t=${Date.now()}`, {
      method: "POST",
      credentials: "same-origin",
      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(request)
    });

    const body = await response.json();
    const item = body?.[0];

    if (item?.error) {
      throw new Error(
        `${object}.${method}: ${JSON.stringify(item.error)}`
      );
    }

    return {
      raw: body,
      result: item?.result
    };
  }

  // Hashi mevcut admin oturumu sona ermeden al.
  const configReply = await ubus(
    adminSid,
    "uci",
    "get",
    {config: "zwrt_web"},
    "zwrt_web"
  );

  const superUser =
    configReply.result?.[1]?.values?.user2;

  if (
    superUser?.username !== "sUser" ||
    superUser?.usergroup !== "superadmin" ||
    !/^[0-9A-F]{64}$/i.test(superUser?.password || "")
  ) {
    throw new Error("sUser/superadmin iç hash kaydı bulunamadı.");
  }

  const innerHash = superUser.password;

  // Yalnız mevcut modem WebUI oturumunu kapat.
  await ubus(
    adminSid,
    "zwrt_web",
    "web_logout",
    {},
    "web_logout",
    "1"
  );

  // sUser normal giriş challenge'ı.
  const loginInfo = await ubus(
    ZERO,
    "zwrt_web",
    "web_login_info",
    {},
    "web_login_info"
  );

  const loginSalt =
    loginInfo.result?.[1]?.zte_web_sault;

  const loginChallenge =
    paswordAlgorithmsCookie(innerHash + loginSalt);

  const loginReply = await ubus(
    ZERO,
    "zwrt_web",
    "web_login",
    {
      username: superUser.username,
      password: loginChallenge
    },
    "web_login",
    "0"
  );

  const loginResult = loginReply.result?.[1];
  const sUserSid = loginResult?.ubus_rpc_session;

  if (
    String(loginResult?.result) !== "0" ||
    !sUserSid
  ) {
    console.error("sUser giriş yanıtı:", loginReply.raw);
    throw new Error(
      `sUser girişi başarısız: ${JSON.stringify(loginResult)}`
    );
  }

  // Yeni sUser oturumu için güncel developer salt'ı.
  const developerInfo = await ubus(
    sUserSid,
    "zwrt_web",
    "web_login_info",
    {},
    "web_login_info"
  );

  const developerSalt =
    developerInfo.result?.[1]?.zte_web_sault;

  const developerChallenge =
    paswordAlgorithmsCookie(innerHash + developerSalt);

  const developerReply = await ubus(
    sUserSid,
    "zwrt_web",
    "web_developer_option_login",
    {
      username: superUser.username,
      password: developerChallenge
    },
    "web_developer_option_login",
    "1"
  );

  const finalInfo = await ubus(
    sUserSid,
    "zwrt_web",
    "web_info",
    {},
    "web_info"
  );

  const state = finalInfo.result?.[1];

  console.table([{
    login_current_user: state?.login_current_user,
    developer_option_loginfo:
      state?.developer_option_loginfo,
    developerResult:
      developerReply.result?.[1]?.result,
    success:
      state?.login_current_user === "sUser" &&
      String(state?.developer_option_loginfo) === "1"
  }]);

  if (
    state?.login_current_user !== "sUser" ||
    String(state?.developer_option_loginfo) !== "1"
  ) {
    sessionStorage.setItem("ct", sUserSid);
    throw new Error(
      "sUser oturumu açıldı fakat developer durumu doğrulanamadı."
    );
  }

  // Uygulamanın yeni oturumu tanıması için kaydet ve tam yenile.
  sessionStorage.setItem("ct", sUserSid);

  const destination = new URL(location.href);
  destination.searchParams.set("_su", Date.now());
  destination.hash = "#developer_options";
  location.replace(destination.href);
})();

4. Final sayfa yenilendiğinde sUser olarak giriş yapmış olacaksınız eğer oturum kapanırsa tekrar deneyin bir kaç deneme sonraısnda açılacaktır.

Aşağıda Geliştirici Seçenekleri ekranını görebilirsiniz.

zte-gelistirici.webp


zte-dhcp.webp
 
Son düzenleyen: Moderatör:
Güzel.
APN değiştirip başka hatlar takılabiliyor mu bunları test edebilirsin kendine challenge arıyorsan.
 
Merhaba dostlar,

Elimdeki Turkcell Superbox 5G ZTE MC8520B Modem mevcut DNS ayarlarını değiştirebilmek için yöntemler arıyordum ChatGPT-5.6 Sol Ultra sağ olsun gizli bir Geliştirici Şeçenekleri bölümü ve sUser girişi olduğunu tespit etti.

Buradaki şifre encrypt edilmiş bir şekilde backendde hash olarak tutuluyormuş arayüz şifre alanındaki yazdığınız şifreyi SHA-256 olarak encrypt edip backende gönderiyor arka planda bu hash kayıtlı ve sadece admin girişi ile tüm yetkili kullanıcıların sUser dahil şifre hashlerine erişebiliyoruz.

Dolayısıyla aşağıdaki yöntem ile şifre giriş alanını tamamen bypass edip backende direkt şifre hashini gönderiyoruz ve Geliştirici Seçenekleri ile birlikte sUser girişi ve yetkisi almış oluyoruz.

Burada çok fazla kurcalamadım başka ne yapılabilir diye DHCP ayarlarında gördüğünüz gibi DNS değiştirme aktif oluyor sUser girişi ile.

1. Öncelikle modem arayüzüne admin şifresi ile giriş yapıyorsunuz;

Eki Görüntüle 278207

2. Giriş yaptıktan sonra adres çubuğuna aşağıdaki linki yazarak geliştirici seçenekleri giriş ekranına geçiyoruz.

https://192.168.1.1/index.html#developer_options_login

Eki Görüntüle 278206

3. Chrome tarayıcıda F12 ile DevTools açıp Console kısmında aşağıdaki kodu yapıştırıp Enter basıyoruz. Yapıştırma izni gerekirse allow pasting yazarak onay verebilirsiniz.

Eki Görüntüle 278205



JavaScript:
(async () => {
  const ZERO = "00000000000000000000000000000000";
  const adminSid = sessionStorage.getItem("ct");

  if (!adminSid) {
    throw new Error("Önce normal admin hesabıyla WebUI'a giriş yap.");
  }

  let id = Date.now();

  async function ubus(
    session,
    object,
    method,
    args = {},
    tag = method,
    mode = "0"
  ) {
    const request = [{
      jsonrpc: "2.0",
      id: ++id,
      method: "call",
      params: [session, object, method, args]
    }];

    const response = await fetch(`/ubus/?t=${Date.now()}`, {
      method: "POST",
      credentials: "same-origin",
      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(request)
    });

    const body = await response.json();
    const item = body?.[0];

    if (item?.error) {
      throw new Error(
        `${object}.${method}: ${JSON.stringify(item.error)}`
      );
    }

    return {
      raw: body,
      result: item?.result
    };
  }

  // Hashi mevcut admin oturumu sona ermeden al.
  const configReply = await ubus(
    adminSid,
    "uci",
    "get",
    {config: "zwrt_web"},
    "zwrt_web"
  );

  const superUser =
    configReply.result?.[1]?.values?.user2;

  if (
    superUser?.username !== "sUser" ||
    superUser?.usergroup !== "superadmin" ||
    !/^[0-9A-F]{64}$/i.test(superUser?.password || "")
  ) {
    throw new Error("sUser/superadmin iç hash kaydı bulunamadı.");
  }

  const innerHash = superUser.password;

  // Yalnız mevcut modem WebUI oturumunu kapat.
  await ubus(
    adminSid,
    "zwrt_web",
    "web_logout",
    {},
    "web_logout",
    "1"
  );

  // sUser normal giriş challenge'ı.
  const loginInfo = await ubus(
    ZERO,
    "zwrt_web",
    "web_login_info",
    {},
    "web_login_info"
  );

  const loginSalt =
    loginInfo.result?.[1]?.zte_web_sault;

  const loginChallenge =
    paswordAlgorithmsCookie(innerHash + loginSalt);

  const loginReply = await ubus(
    ZERO,
    "zwrt_web",
    "web_login",
    {
      username: superUser.username,
      password: loginChallenge
    },
    "web_login",
    "0"
  );

  const loginResult = loginReply.result?.[1];
  const sUserSid = loginResult?.ubus_rpc_session;

  if (
    String(loginResult?.result) !== "0" ||
    !sUserSid
  ) {
    console.error("sUser giriş yanıtı:", loginReply.raw);
    throw new Error(
      `sUser girişi başarısız: ${JSON.stringify(loginResult)}`
    );
  }

  // Yeni sUser oturumu için güncel developer salt'ı.
  const developerInfo = await ubus(
    sUserSid,
    "zwrt_web",
    "web_login_info",
    {},
    "web_login_info"
  );

  const developerSalt =
    developerInfo.result?.[1]?.zte_web_sault;

  const developerChallenge =
    paswordAlgorithmsCookie(innerHash + developerSalt);

  const developerReply = await ubus(
    sUserSid,
    "zwrt_web",
    "web_developer_option_login",
    {
      username: superUser.username,
      password: developerChallenge
    },
    "web_developer_option_login",
    "1"
  );

  const finalInfo = await ubus(
    sUserSid,
    "zwrt_web",
    "web_info",
    {},
    "web_info"
  );

  const state = finalInfo.result?.[1];

  console.table([{
    login_current_user: state?.login_current_user,
    developer_option_loginfo:
      state?.developer_option_loginfo,
    developerResult:
      developerReply.result?.[1]?.result,
    success:
      state?.login_current_user === "sUser" &&
      String(state?.developer_option_loginfo) === "1"
  }]);

  if (
    state?.login_current_user !== "sUser" ||
    String(state?.developer_option_loginfo) !== "1"
  ) {
    sessionStorage.setItem("ct", sUserSid);
    throw new Error(
      "sUser oturumu açıldı fakat developer durumu doğrulanamadı."
    );
  }

  // Uygulamanın yeni oturumu tanıması için kaydet ve tam yenile.
  sessionStorage.setItem("ct", sUserSid);

  const destination = new URL(location.href);
  destination.searchParams.set("_su", Date.now());
  destination.hash = "#developer_options";
  location.replace(destination.href);
})();

4. Final sayfa yenilendiğinde sUser olarak giriş yapmış olacaksınız eğer oturum kapanırsa tekrar deneyin bir kaç deneme sonraısnda açılacaktır.

Aşağıda Geliştirici Seçenekleri ekranını görebilirsiniz.

Eki Görüntüle 278208

Eki Görüntüle 278204
Bakınız,

 
Sahenizde sUser şifresini değiştirdim. Uzaktan yönetimi de kapattım. OpenWrt kurulumunu nasıl başardılar acaba? SSH erişimini de alsak aslında çok güzel olur.

Giriş yaptıktan sonra hash bilindiği için https://192.168.0.1/index.html#password_management kısmından gönderilen POST verisiyle oynanarak superadmin (sUser) kullanıcısının şifresi değiştirilebiliyor.

Cihazın üzerindeki USB ayaları değiştiriliebiliyor. USB debug açılabiliyor.
 
Son düzenleme:
Merhaba, cihazda sürekli PCC ve SCC değişiyor. Bulunduğum mevkide band 20 PCC, band 1 SCC olduğunda sorunsuz ve pingsiz bir şekilde kullanıyorum ve band 20'nin sinyali de oldukça ideal. Fakat band 1 rezalet durumda. Sürekli band kilitlemeden band 20'yi önce seçiyorum, uygula diyip arkasına band 1 koyuyorum; fakat 1-2 saat sonra yine band 1 öne geçiyor. Tekli bant kullandığım zaman ise verim alamıyorum. Bunun ayarlamasını yapabileceğimiz bir yer var mı? Konuyla alakalı çok az bilgi var. Band 20'ye öncelik atmam lazım, PCC olarak kalması için yardımcı olursanız sevinirim.

Sahenizde sUser şifresini değiştirdim. Uzaktan yönetimi de kapattım. OpenWrt kurulumunu nasıl başardılar acaba? SSH erişimini de alsak aslında çok güzel olur.

Giriş yaptıktan sonra hash bilindiği için https://192.168.0.1/index.html#password_management kısmından gönderilen POST verisiyle oynanarak superadmin (sUser) kullanıcısının şifresi değiştirilebiliyor.

Cihazın üzerindeki USB ayaları değiştiriliebiliyor. USB debug açılabiliyor.
Merhaba, yönetici şifresini değiştirdim; fakat oluşturduğum şifreyi geliştirici seçeneklerine yazdığımda "şifre yanlış" diyor. Bir noktada hatamı yaptım mı?
 
Son düzenleyen: Moderatör:
Merhaba, cihazda sürekli PCC ve SCC değişiyor. Bulunduğum mevkide band 20 PCC, band 1 SCC olduğunda sorunsuz ve pingsiz bir şekilde kullanıyorum ve band 20'nin sinyali de oldukça ideal. Fakat band 1 rezalet durumda. Sürekli band kilitlemeden band 20'yi önce seçiyorum, uygula diyip arkasına band 1 koyuyorum; fakat 1-2 saat sonra yine band 1 öne geçiyor. Tekli bant kullandığım zaman ise verim alamıyorum. Bunun ayarlamasını yapabileceğimiz bir yer var mı? Konuyla alakalı çok az bilgi var. Band 20'ye öncelik atmam lazım, PCC olarak kalması için yardımcı olursanız sevinirim.


Merhaba, yönetici şifresini değiştirdim; fakat oluşturduğum şifreyi geliştirici seçeneklerine yazdığımda "şifre yanlış" diyor. Bir noktada hatamı yaptım mı?
Değiştrememişsiniz o zaman. Şifre değiştirirken giden post verisini editleyerek yapın. Hash değerini zaten bir önceki adımdan biliyorsunuz.
 
Nasıl yapacağım biraz daha terimsel ifadeler kullanmadan açıklayabilir misiniz lütfen çok hakim değilim böyle işlere ve yazdığım diğer konu ile ile bir bilginiz var ise yardımcı olursanız sevinirim.