新家新路由器。
为了玩 teeworlds,需要 root 权限操作 iptables。我上网找了一堆方案,无果。最后想着,先把自动更新 DNS 的脚本写了吧。
于是研究 API。通讯协议是 JSONRPC 2.0,授权是一个 token。先用从网页取得的 token 调 API,成功~然后我还在想,怎么拿 root shell 呢。结果去看了一下登录后返回的数据:
注意看右下角!「open_dropbear」!
于是:
>>> c.api_request('xapi.basic', 'open_dropbear') [D 08-05 19:28:36.145 connectionpool:243] Resetting dropped connection: localhost [D 08-05 19:28:36.640 connectionpool:396] http://localhost:8080 "POST http://192.168.99.1/ubus/ HTTP/1.1" 200 None {'status': 0}
然后就:
>>> ssh root@192.168.99.1 The authenticity of host '192.168.99.1 (192.168.99.1)' can't be established. RSA key fingerprint is SHA256:............................................ Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.99.1' (RSA) to the list of known hosts. root@192.168.99.1's password: BusyBox v1.22.1 (2017-03-10 15:06:06 CST) built-in shell (ash) Enter 'help' for a list of built-in commands. ____ _____ | _ \ |_ _|__ __ _ _ __ ___ | | | |_____| |/ _ \/ _` | '_ ` _ \ | |_| |_____| | __/ (_| | | | | | | |____/ |_|\___|\__,_|_| |_| |_| ----------------------------------------------------- From BARRIER BREAKER (3.2.1.5900, r39558) ----------------------------------------------------- * By D-Team 2015 present ----------------------------------------------------- root@newifi:~#
WTF,就这么简单!
顺便附上我写的简单客户端:
from requestsutils import RequestsBase class NeWifi(RequestsBase): baseurl = 'http://192.168.99.1/' token = '00000000000000000000000000000000' def api_request(self, cat, name, args={}): req = {"jsonrpc":"2.0","id":1,"method":"call","params":[self.token,cat,name,args]} ans = self.request('/ubus/', json=req).json() return ans['result'][1] def login(self, password): password = base64.b64encode(password.encode('utf-8')).decode('ascii') ans = self.api_request("session","xapi_login",{"username":"root","password":password}) self.token = ans['ubus_rpc_session'] def get_wan_info(self): return self.api_request('xapi.net', 'get_wan_info')