WNR2000v4 安装 OpenWRT

5月18日更新


很多网友表示Telnet无法解锁,若你使用本教程成功解锁或遇到问题劳烦你在下面评论区留言,感谢!

背景


当初为了刷OpenWRT购入WNR2000,然而当时只有v1 – v3支持第三方固件,在JD上买的却是v4啊,收到货瞬间(目瞪口呆.jpg)。吃灰几个月拿出来用,突发奇想查一波OpenWRT WIKI,果真已经支持了WNR2000v4。然而网上并没有详细教程啊..即立此坑

原理


大概流程:
1.通过Telnet访问路由
2.本地计算机搭建TFTP服务器
3.从下载存在TFTP的Uboot和固件
4.替换Unlock的Uboot以及OpenWRT

关于Uboot:Uboot是德国DENX小组开发、用于嵌入式CPU的Bootloader,它支持10多种不同的操作系统(包括x86架构)。其小巧速度快,已经成为了Atheros(高通)和Ralink(联发科)产品的标配引导系统,并且在所有嵌入式的引导系统中市场占有率最大。

所需准备


1.更新路由固件到1.0.0.58
WNR2000v4-Stock-Firmware version 1.0.0.58

2.下载修改好的uboot
uboot_env_bootcmd_nocrc.backup

3.下载 openwrt for wnr2000v4 并 将其更名为sysupgrade.bin
openwrt-15.05-ar71xx-generic-wnr2000v4-squashfs-sysupgrade.bin

4.[重要]使用网线连接路由器并将你的计算机ip设置为’192.168.1.10′

使用python发送UDP


需要使用telnet对路由执行刷机指令,所以刷机的门槛就在能否用telnet连接路由。Netgear的路由默认是打开了telnet:23端口的,可是无法直接访问,需要解锁。不同路由的解锁方法不同,这里我们使用Github提供的 telnetenable.py 发送UDP解锁。

https://github.com/insanid/netgear-telenetenable

此处需要使用 pycrypto 库

pip install pycrypto

telnetenable.py

# Copyright (c) 2009 Paul Gebheim
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

import sys
import socket
import array
from optparse import OptionParser
from Crypto.Cipher import Blowfish
from Crypto.Hash import MD5

TELNET_PORT = 23

# The version of Blowfish supplied for the telenetenable.c implementation
# assumes Big-Endian data, but the code does nothing to convert the
# little-endian stuff it's getting on intel to Big-Endian
#
# So, since Crypto.Cipher.Blowfish seems to assume native endianness, we need
# to byteswap our buffer before and after encrypting it
#
# This helper does the byteswapping on the string buffer
def ByteSwap(data):
  a = array.array('i')
  if(a.itemsize < 4):
    a = array.array('L')

  if(a.itemsize != 4):
    print "Need a type that is 4 bytes on your platform so we can fix the data!"
    exit(1)

  a.fromstring(data)
  a.byteswap()
  return a.tostring()

def GeneratePayload(mac, username, password=""):
  # eventually reformat mac
  mac = mac.replace(":","").upper()

  # Pad the input correctly
  assert(len(mac) < 0x10)
  just_mac = mac.ljust(0x10, "\x00")

  assert(len(username) <= 0x10)
  just_username = username.ljust(0x10, "\x00")

  assert(len(password) <= 0x21)
  just_password = password.ljust(0x21, "\x00")

  cleartext = (just_mac + just_username + just_password).ljust(0x70, '\x00')
  md5_key = MD5.new(cleartext).digest()

  payload = ByteSwap((md5_key + cleartext).ljust(0x80, "\x00"))

  secret_key = "AMBIT_TELNET_ENABLE+" + password

  return ByteSwap(Blowfish.new(secret_key, 1).encrypt(payload))


def SendPayload(ip, payload):
  for res in socket.getaddrinfo(ip, TELNET_PORT, socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_IP):
    af, socktype, proto, canonname, sa = res
    try:
      s = socket.socket(af, socktype, proto)
    except socket.error, msg:
      s = None
      continue

    try:
      s.connect(sa)
    except socket.error, msg:
      s.close()
      s= None
      continue
    break

  if s is None:
    print "Could not connect to '%s:%d'" % (ip, TELNET_PORT)
  else:
    s.send(payload)
    s.close()
    print "Sent telnet enable payload to '%s:%d'" % (ip, TELNET_PORT)

def main():
  args = sys.argv[1:]
  if len(args) < 3 or len(args) > 4:
    print "usage: python telnetenable.py <ip> <mac> <username> [<password>]"

  ip = args[0]
  mac = args[1]
  username = args[2]

  password = ""
  if len(args) == 4:
    password = args[3]

  payload = GeneratePayload(mac, username, password)
  SendPayload(ip, payload)

main()

执行 telnetenable.py 路由ip 路由MAC地址(大写并去除 “:” ) 路由用户 密码

Example:

python telnetenable.py 192.168.1.1 00405E21144E admin password

发送成功后会返回 『Sent telnet enable payload to ip』

搭建TFTP服务器


我们登录telnet后,需要在telnet(路由)获取计算机上的下载好的Uboot和固件。于是就需要搭建供telnet访问的TFTP服务器,具体方法见谷歌。然后将Uboot和固件放在TFTP根目录。

获取文件&&刷机


1.刷入Unlock Uboot

cd /tmp
tftp -g -r uboot_env_bootcmd_nocrc.backup 192.168.1.10 69
mtd -f write uboot_env_bootcmd_nocrc.backup u-boot-env

2.刷入OpenWrt固件

tftp -g -r sysfsupgrade.bin 192.168.1.10 69
mtd -f -r write sysfsupgrade.bin firmware

当一切完成后,路由会自动重启

进入OpenWrt


继续使用网线连接,并在浏览器打开’192.168.1.1′

设置使用中文界面,需要在’软件包’-‘过滤器’输入chinese,然后安装luci-i18n-base-zh-cn

评论

《 “WNR2000v4 安装 OpenWRT” 》 有 38 条评论

  1. imlonghao 的头像

    我把我的oyewifi也刷了,自己编译了校园网的客户端

    1. Manfong P 的头像

      嗯,在你博客看到OpenWRT玩得666,于是就刷了…唉,问题是我那路由Flash只有4M,刷完之后 “/overlay” 就剩几百K了,连个SS都装不进去..

  2. TT___C 的头像
    TT___C

    请教一下我这种情况应该怎么办呢?
    python: can’t open file ‘telnetenable.py’: [Errno 2] No such file or directory

    1. Manfong P 的头像

      你有将python代码保存为’telnetenable.py’吗?这个错误大概就是找不到这个文件了。如果你保存了,那需要用’cd’命令定位到’telnetenable.py’所在目录,然后运行就可以啦。

      1. TT___C 的头像
        TT___C

        是的,然后又出现了新的情况……
        File “telnetenable.py”, line 1
        Python 2.6.1 (r261:67517, Dec 4 2008, 16:51:00) [MSC v.1500 32 bit (Intel)] on win32
        ^
        SyntaxError: invalid syntax

        C:>

  3. TT___C 的头像
    TT___C

    请教精通Linux和Python的大神:python和pycrypto我都已经安装了,就差一个telnetenable.py了,还望闲暇之余指点一二

    1. Bebo 的头像
      Bebo

      我也遇到了类似的问题,telenetebale.py 返回了发送成功的信息,但是用telnet无法连接。该怎么排查问题?

      1. Manfong P 的头像

        请问您有没有更新路由固件到1.0.0.58呢?BTW,可以试试192.168.1.1 MAC地址 Gearguy Geardog,又或者192.168.1.1 ************ admin 你的路由管理页面登录密码 (忘了当初这行命令用的admin和password 是哪个。。)

      2. TT___C 的头像
        TT___C

        我的仍然没有解锁,

  4. TT___C 的头像
    TT___C

    收到 ,非常感谢!

  5. TT___C 的头像
    TT___C

    猜不透是哪里出了错
    C:>python telnetenable.py 192.168.1.1 ************ admin password
    Sent telnet enable payload to ‘192.168.1.1:23’

    C:>telnet 192.168.1.1
    正在连接192.168.1.1…无法打开到主机的连接。 在端口 23: 连接失败

    1. Manfong P 的头像

      你的ip有没有改为’192.168.1.10’并且用网线连接?
      还有中间的MAC地址有没有大写并且去除’:’?
      实在不行可以试试”192.168.1.1 ************ Gearguy Geardog”哦

  6. TT___C 的头像
    TT___C

    细节我都注意到了,我选择放弃吧。主要是最近二会期间网络各种抽风,只想装个SS,好在其他平台也有客户端
    早点休息,祝生活愉快

  7. Rich 的头像

    诶,我的也是WNR2000v4,昨天按照OpenWRT WiKi上的方法在Ubuntu 14.04 LTS和Windows 8上做了一遍,telnet总是无法被开启,路由器固件是1.0.0.58 (ó﹏ò。) 不知道你是怎么做的呢(๑•́ ₃ •̀๑)

    1. Manfong P 的头像

      我是在刷完固件之后才写的文章,所以可能有些步骤遗漏,或许再来一遍就想起了,您现在解决问题了吗?如果没有,可以一起解决这个问题吗?

      1. Rich 的头像

        当然!我尝试很多次了 ,依然没有解决。我在Windows 7上试了一次貌似也还是不行。所以特别想知道你是怎么做的。

  8. 路人 的头像
    路人

    楼主windows系统怎么用telnetEnable,小白求指点谢谢

    1. Manfong P 的头像

      教程同上,只要在windows安装python和对应的库即可。
      参考:https://www.python.org/downloads/windows/

  9. PP 的头像
    PP

    請教博主:

    在telnetenable.py這一步,輸入命令以後顯示:
    c:open>python T.py 192.168.1.1 04A15186484A gearguy geardog
    File “T.py”, line 44
    print “Need a type that is 4 bytes on your platform so we can fix the data!”
    ^
    SyntaxError: Missing parentheses in call to ‘print’

    請問是怎麼回事?

    1. Manfong P 的头像

      您好,解鎖腳本適用于Python 2。根據您的報錯,應該是下載錯了Python 3。兩者編碼語法存在一定區別。

      可以嘗試打開以下連結 https://www.python.org/downloads/release/python-2711/

      下載適合您作業系統的python 2

      1. PP 的头像
        PP

        多謝,原來是小白我的python的版本錯了。還有重要的一點我之前沒交代:我用的win10x64(不過看樣子為了折騰這個路由要多裝個系統了) 。

        現在出現上面網友同樣的問題:telnetenable顯示成功實際還是沒有解鎖。

        但這都是後話,等裝個ubuntu後再說吧。或許也要放棄。
        無論如何,感謝博主指教。

  10. Evan 的头像

    为什么我在你提供的链接下载1.0.0.58版本img 路由固件刷了后端口23是关闭的,50版本及以下23端口都是开的,以上版本都被关闭了。所以更不用说uboot了,就连telnet都进不去,楼主确定没漏什么吗?

    1. Manfong P 的头像

      内容没有遗漏,据网友反馈还跟路由器区域代码有关。
      https://community.netgear.com/t5/Nighthawk-WiFi-Routers/Region-change/td-p/507639

      1. Evan 的头像
        Evan

        那我是按你的和官方的说法,刷了58版本,如果是固件锁的话,那应该固件相同也解锁了才对呀,你的是哪里买的?是什么区域的固件?或者是什么区域的路由硬件?

  11. anztim 的头像
    anztim

    我用python2也不行

  12. bigma 的头像
    bigma

    博主,你好,我按你的流程走了一遍,没有telnet解锁成功,我的是在中国亚马逊上买的,按你的方法刷了58版本。用nmap扫描了一下192.168.1.1,发现23 telnet端口并没有开放。

    但是我又刷了50版本的固件,同样用nmap扫描:
    PORT STATE SERVICE VERSION
    23/tcp open telnet?
    但是使用脚本发送包后还是不能telnet
    Trying 192.168.1.1…
    Connected to 192.168.1.1.
    Escape character is ‘^]’.
    Connection closed by foreign host.
    可以认为只有50版本的固件开放了23端口,下一步就是解锁了!!

    1. mayawei 的头像
      mayawei

      请问您是怎么解锁的呢?我到了这一步,就是发送包之后显示Trying 192.168.1.1…
      Connected to 192.168.1.1.
      Escape character is ‘^]’.
      Connection closed by foreign host.
      试过用Gearguy和Geardog也不行

  13. bigma 的头像
    bigma

    解锁成功

    python telnetenable.py 192.168.1.1 macsddr(路由mac) Gearguy Geardog

    1. Manfong P 的头像

      请问您是使用50版固件的吗?
      能否成功刷入openwrt?
      使用如下账户?
      user:Gearguy
      pwd:Geardog?

      1. bigma 的头像
        bigma

        50固件
        刷不进u_boot
        这一步
        mtd -f write uboot_env_bootcmd_nocrc.backup u-boot-env
        显示:u-boot-env无法解锁。。
        解锁telnet 23端口是用这个用户名和密码。

        1. Manfong P 的头像

          好多网友也反应这个问题,但我确定是通过58固件,然后成功解锁u-boot的。

  14. KONGE 的头像
    KONGE

    我也无法使用58固件解锁!

  15. red 的头像
    red

    你好,我扫描到端口23 状态是open的,但是就是telnet不能上去,是什么情况呢,有什么好的处理方式吗?

  16. 李万一 的头像
    李万一

    弱弱的问一下,怎么知道是v多少的,京东的全是v4吗,我怎么找都找不到是v几的

  17. 李万一 的头像
    李万一

    搜了一下好像支持动态域名的就是v4?

    1. 李万一 的头像
      李万一

      算了才知道京东买的型号是R2000根本不是WNR2000

  18. ccccc 的头像

    有效 感谢

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理