Changing ZTE MF823 4G modem IP address – web interface hacking

Here in Poland ZTE MF823 USB 4G modem is one of the most popular devices bundled with LTE data plans. I’ve got two of these – one from Play and the other from Plus GSM.

It’s one of those driverless modems which appear as a network interface (using cdc_ether driver under Linux) and have an embedded web server for management. This modem (?) also has a DHCP server and performs traffic routing with NAT.

Here comes my problem with the device. It assignes IP addresses from pool which collides with my home network ( and unfortunately, there is no option to change the IP address by using the web interface.

After some googling, I’ve found that this modem actually runs Linux (OpenEmbedded) and you can telnet it!

Username: root
Password: zte9x15

michal@debiandev:~$ telnet
Connected to
Escape character is '^]'.

OpenEmbedded Linux 9615-cdp

msm 20130829 9615-cdp

9615-cdp login: root

Hey, look! All filesystems are mounted read-write – a hacker’s delight 😉

root@9615-cdp:~# mount
rootfs on / type rootfs (rw)
/dev/root on / type yaffs2 (rw,relatime)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
none on /dev type tmpfs (rw,relatime,mode=755)
devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,relatime,mode=777)
/dev/mtdblock19 on /usr type yaffs2 (rw,relatime)
/dev/mtdblock11 on /cache type yaffs2 (rw,relatime)
/dev/mtdblock16 on /usr/zte_web type yaffs2 (rw,relatime)

Modem features Qualcomm MSM9615 ARMv7 CPU running (max) at 550MHz with about 46MB of RAM.

root@9615-cdp:~# cat /proc/cpuinfo
Processor : ARMv7 Processor rev 1 (v7l)
BogoMIPS : 274.02
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc05
CPU revision : 1

Hardware : QCT MSM9615 CDP
Revision : 0000
Serial : 0000000000000000

Overall impression is that this hardware/OS pack is common for some other ZTE devices including 4G routers (there are config settings for WiFi, battery etc. – of course they are disabled).

Now, let’s play with the web interface.

Web server’s root directory is at /usr/zte_web/web.
Web frontend is written in JavaScript using jQuery and require.js and communicates with the hardware via zte_topsw_goahead process (web/application server?).
Code is very modular and clean and (suprisingly) it is not obfuscated or minified in any way!
As I mentioned, there are traces of HW features from other ZTE devices:

  • in the wifi directory there are modules used for WLAN/AP configuration
  • the firewall directory features modules for port forwarding/filtering, uPnP setting etc.
  • the adm is a place for some administrative stuff (passwords/pins/reboots etc.) and there’s a lan.js file… hmm… :)

Bingo! After a quick look at the code, lan.js contains IP address and DHCP configuration stuff. But how to make it visible?

Let’s move to the config/datacard/mf823 folder. Quick look at the config.js file ensures us that our modem has no battery or WiFi. What a shame… 😉
Now create a backup copy of the menu.js file:

cp ./menu.js ./

and open it in your favourite text editor – vi, as it is the only option here :)

Take a look at the menu array. It contains the menu structure definition – every item defines it’s JS module’s path, level, parent (for lower level items), and access control settings.
Let’s analyze the “Settings” menu definition:

var menu = [
  // this is the top-level "Settings" menu
    requireLogin:needLogin, // login is disabled in config.js
    checkSIMStatus:true  // allow access when a SIM card is inserted
    path:'adm/pin', // default module, there's another item defined for PIN
  // SIM card PIN management module

To enable IP address configuration we have to add a new level 3 menu item definition – I’ve placed it after the PIN management.


Save the file and check the final result:

After menu.js modification

After menu.js modification

Now we can change the modem/router’s IP address, disable DHCP – everything you’ll need to hook it up to your custom router 😉

PS: This modification should work with a device from any operator – core JS code is the same.


28 thoughts on “Changing ZTE MF823 4G modem IP address – web interface hacking

  1. bl4ckOut

    Thanks for this nice tutorial !
    It works absolutely perfectly.
    One question:
    When we already have access via telnet, is it possible to do other nice stuff with the stick ?

  2. e

    Do not do that, it’s dangerous. You can brick device even if u change address from web, I’ve just finished repairing this device, I wanted /30 subnet. I’ve lost connectivity. Firstly device was available but after few seconds it stops responding to ICMP echo request. Only high scripting skill saved my ass. I was able to reconfigure device to it’s default settings. I’ve taken a look to its network configuration. It’s a mess. Do not change IP address of this device.

    1. elevendroids Post author

      I can’t agree with you.
      You can not brick your device by changing your IP address – you just have to be careful.
      First of all, why did you want a /30 subnet? It’s a very uncommon configuration – there are only two available IP addresses.
      In such case you should check the modem’s network configuration first (by using simple “ifconfig” or “ip addr”).
      You would notice that the modem uses two IP addresses for itself – there are two internal network interfaces, one “official” LAN iface and the second one is used for the communication with the modem – it’s not just a simple PPP connection. This is a part of Qualcomm MSM interface between the network/Linux layer and the modem layer. In addition of the network traffic, it carries the modem commands (as QMI messages, not legacy AT commands).
      You can read some more info here:
      I would definitely not call it “a mess”, it’s just a different architecture.


      1. e

        I am some sort ISP and I use USB HiLink modems to provide Internet in branch offices customers of mine. So in big short I connect it to MiktoTik device and set up routing, VPNs and everything. I need to manage it and monitor the infrastructure. Believe me if u have hunderts of networks then every wasted private address IPv4 is pain in the as, that’s why I needed /30 subnet. I believe that procedure you described above works only with /24. Please look again at network interface structure, it’s addressing scheme and try not to change your mind abut mess in it’s configuration. I use mostly ZTE MF 823 from Cyfrowy Polsat and Plus GSM from Poland. It’s possible that our devices are in different configurations. Why did I say that? Because your modification in modems provided by mentioned ISP’s simply not working. For isntance; even if I change IP address then I can’t reach ZTE’s administraton panel, there is a lot links from web server to it’s static default IP address. Network configuration seems to be from RetHat like system, but they use custom init scripts. Looking at it from Linux Administrator point of view there is a mess. I can’t agree with u either.

        1. elevendroids Post author

          I’m from Poland too 😛
          I work as an Embedded Software Engineer with some experience with Linux-based systems for different hardware architectures.
          I have two of these modems – one from Play (works 24/7) and one from Plus (backup).
          Both of them have modified JS files and both of them work without a flaw.
          Yes, the Plus version has a hardcoded IP in the index.html (only there and yes, it sucks) file in a JS function which checks the host value in case of DNS redirection (ie. when a SMS arrives, Play version does not do that).
          Network interface scheme is somewhat forced by the chipset vendor (Qualcomm) as modem firmware runs separately on the baseband processor (not the one running the web interface server).
          Base system is not based on RedHat. It’s a custom embedded Linux system built using OpenEmbedded framework ( – common solution for an embedded hardware (the other one is Buildroot).
          Remember this is a custom solution – we’re not supposed to mess with it 😉

          1. gogo

            After setting the IP address for the same Network I got the connection back.
            Thank you for the Support!
            My error was that after deactivating my WiFi connection, Windows removed also the IP address ( I had to find out the Rmnet and then change it IP. Than it worke perfect.

  3. Lars

    Thanks for the nice info, it works very well.
    But I want also to enable port forward and that type of stuff
    I managed to display Virtuell server settings Enable Disable by
    the following:{hash:’#router_setting’,path:’firewall/port_forward’,level:’3′,parent:’#setting’,requireLogin:false,checkSIMStatus:false}
    That’s all
    Do you know how to enable all these nice things which I can see….


    1. DesertF0x

      I think other files have to be modified … the functions the config pages are not there as far as I can see…

  4. gogo

    just bricked my device with this approach.
    The web page for changing the Settings was ok.
    I changed: NO dhcp Server and as an address
    Now I cannot find the device on any IP address. Telnet times out.

    Somebody any idea?

    1. elevendroids Post author

      Should be OK.
      Did you set your computer’s/server’s (the one you are trying to access the modem via telnet from) IP address to a static one in the same network as the modem?
      Something like:

      1. gogo

        I pushed the wrong button an replayed above. Sorry.
        You could probably fix my replay.
        Thank you for the Support!

  5. nick

    can you access any of these hidden pages just by typing the correct url?
    Have no coding knowledge at all, but i want to access the port forwarding on the modem so i can access webcams through the dongle (attached to a router). at the moment this seems impossible.

    if a URL cannot access these pages, could a more detailed guide of the code required to unlock more control pages be created so the lines could be copied and pasted into the editor?



  6. Dan

    I have a zte mf823 branded Beeline , I followed the steps but I found some differences : menu.js is located in another directory / usr / zte_web / web / js / config / datacard / mf823 #
    I added ” router setting” but does not open the configuration page lan . The graphics are different , I think it has a different firmware version , you know where I can find the firmware that you have installed ?

    1. qunaki

      Thanks Dan for help me find the right directory for my original branded ZTE MF823, bought March 2015.
      The above guide is perfectly, even for a stupid fellow like me. Sitting on Win7 and using putty.

      But Dan and others whom find the menu.js in js folder. I just changed my file as the present file was done.
      I.e not false but 0, Not Level 3 but. Not #device_setting” but #setting”. Not ‘ but “.
      Here is my string added after #Pin_management and before #update_manual.
      Then it just showed up, but it was grayed. But that issue is correct, I hadn’t dissconneted the conncetion.
      After that I was able to change the settings. Renew my computer.

      I’m thrilled that it worked that easy, Thanks everybody for a amazing page!! The page was even translated. Hope this helps somebody else too. This was really a fun tweak.

  7. edass

    Świetny artykuł – otwiera nowe mozliwości ale ja mam jakiś problem z dodaniem tej zakładki…
    Możesz pokazać swój plik menu.js po modyfikacji?
    Jaka jest dokładna scieżka do tego pliku?
    /usr/zte_web/web/js/config/datacard/mf823 ?


  8. Was my MF823 bricked?

    Hello and thanks for the interesting thread. I have a problem with my Netcom-branded MF823 from Norway. As most of those modems are, this one was locked as well. So, with the coming trip to Poland in sight, I decided to unlock my MF823 with DC-unlocker (dc-unlocker_client-1.00.1154), on windows 7, 32-bit. I bought the credits and started to search for the modem in DC-U, with the Tak-Tak card from T-mobile PL placed in. Unfortunately, the “Modem not found message” popped up whenever I tried to find the device, both by name and with auto search. I thought that the modem drivers hadn’t been installed. I tried to locate them on the modem’s built-in storage, but, at some point when I was trying to detect the modem, the storage with drivers on became unavailable. So I found a set of drivers for the same model, but a different operator (Play PL) and tried to install them – still with no success.. Finally, full of resignation, I reinserted the original Netcom card and, to my horror, the modem issued a message saying something about the corruption of the SIM card. This issue hadn’t happened some weeks earlier, when I swapped the cards., Surely, the foreign card didn’r work on the Internet, due to the SIM lock restrictions, but upon reinsertion of the native Netcom card, the address popped up and I had just to reinsert the PIN code and things came back to normal. Now, yesterday something went terribly wrong. the LED lights now steady red with Netcom, while flashing blue with Tak-Tak (ordinary prepaid card for mobile phones). I cannot access any pages on the modem’s web server, sinse cannot be found. I’m also stuck with unused credits which I purchased for unlocking with DC-U, What is going on with this modem, Will it be possible to fix it?

    1. qunaki

      Guess everything is ok.
      1. If you follwed the tutorial above then you will still have an orginal
      2. What I’ve seen here is that there are slight different sw-versions, so this might not be used right on.
      3. Look att you settings page and find where Pin Management are. The turoial above has it in a sub menu, thus level 3, I have mine in the menu, this is apparently level 2. No wories, the ip config will be found right beneath the pin management or under the sub menu if your layout is like that.

      4. After you are familiar with your settings page, time for change.
      5. Telnet in as in the tutorial, find and copy menu.js. Edit the file, I guess copy #Pin_Management is the easiest way to make best luck. Just change it with the neccessary changes, else leave as is.
      Like the tutorial says false, my string had 0 instead, so go use that instead (true i !0 bu not needed here).
      Mine had ” and not ‘, so use ” instead for strings etc.
      I din’t use #device_setting” but #setting”, because #Pin_Management had that. As said before how your settings page look like. Just keep data from #pin.
      The level-option should be the same, and this will cause router settings appear just below the pin-config.
      So my final string ended up into (note “, no false and level 2 instead of 3):

      Hope this helps anyone.
      // qunaki

  9. Benny

    HI @ll,

    can someone explain me if or how it`s possible to save the Sim Pin in the mf823 ?
    I want to use it with a openwrt Router but i have to go after every power-loss in webinterface and input the Pin :(
    Fix Pin or a Pin-Save function would be great :))

    1. qunaki

      I have that option in my settings atleast.
      To be able to change pin, you must disconnetc first. Save and reconnect, else they are grayed out.

      Another option would be to put the sim in a phone and disable the pin.

      // qunaki – whom glad he found this page today and made my zte configurable.

  10. Robert

    Ci followed your hack and it worked. I changed my ip to also DHCP. Rebooted and the new dress is but i no longer can access the web browser. By accusing it get redirected to
    What now?

  11. petker

    Hi there
    Just tried out your “hack” on a ZTE MF93D, and – beside from a difference in the file structure – it worked like a charm. I am now able to see the Router settings – BUT – It’s all greyed out, so I can’t change my settings. Any suggestions to help me out?

    Rgds Peter

    1. qunaki

      If you can see it, then the trickiest part is done.
      It’s correct that they are greyed out. Just disconnect, then you can change the settings.
      Save and reconnect and it should be fine.

  12. zskk


    Greetings from Krakow.

    I have a ZTE MF823 from plus network. I’ve been trying to enable UPnP in the files. As the result I can see the option in the settings page, but it is inactive.

    Also, as a workaround I tried to enable a simple iptables rule to direct traffic. Unfortunately there are no kernel modules I can use.

    Any hints?

  13. Jarek

    Mam problem z Ufi MF93D nie działa w nim kompletnie Port Mapping Dmz itp .Potrzeba mi przekierowac porty pod xboxem ale na tym ustroistwie nic nie działa. Gdy karte przełoze do telefonu i zrobie hotspota i połacze z routerem pod xboxem wszystko działa jak należy Nie dało by sie jakos poprzez telnet wyłaczyć całkowicie firewall w ZTE bo moim zdaniem to on mi blokuje Byłbym wdzieczny za pomoc. Pozdrawiam

  14. Pedro

    I’ve been able to access via telnet, User/Password is right, but I’m getting “permission denied” when trying to access /usr/zte_web/web

    Could anyone help me out?



Leave a Reply

Your email address will not be published. Required fields are marked *