MENU

WNR2000v4 安装 OpenWRT

March 9, 2016 • 开源硬件,其他

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(联发科)产品的标配引导系统,并且在所有嵌入式的引导系统中市场占有率最大。

A31B296A-8F7E-4F41-BDD3-C2323BA0391B.png

所需准备


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

Screen Shot 2016-03-08 at 11.46.50 PM.png

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

搭建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

Screen Shot 2016-03-08 at 11.55.16 PM.png

<center>当一切完成后,路由会自动重启</center>

进入OpenWrt


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

Screen Shot 2016-03-09 at 12.26.30 AM.png

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

Screen Shot 2016-03-09 at 12.31.51 AM.png

Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment

已有 34 条评论
  1. 我把我的oyewifi也刷了,自己编译了校园网的客户端

    1. @imlonghao嗯,在你博客看到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. @TT___C你有将python代码保存为'telnetenable.py'吗?这个错误大概就是找不到这个文件了。如果你保存了,那需要用'cd'命令定位到'telnetenable.py'所在目录,然后运行就可以啦。

    2. TT___C TT___C

      @Vins0n是的,然后又出现了新的情况……
      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

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

    4. @TT___C估计是一些代码格式问题
      你直接保存这个py文件吧
      https://raw.githubusercontent.com/insanid/netgear-telenetenable/master/telnetenable.py

    5. TT___C TT___C

      @Vins0n收到 ,非常感谢!

    6. TT___C TT___C

      @Vins0n猜不透是哪里出了错
      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: 连接失败

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

    8. Bebo Bebo

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

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

    10. TT___C TT___C

      @Bebo我的仍然没有解锁,

  3. TT___C TT___C

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

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

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

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

  5. 路人 路人

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

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

  6. 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. @PP您好,解鎖腳本適用于Python 2。根據您的報錯,應該是下載錯了Python 3。兩者編碼語法存在一定區別。

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

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

    2. PP PP

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

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

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

    3. anztim anztim

      @Vins0n我用python2也不行

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

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

    2. Evan Evan

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

  8. 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

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

  9. bigma bigma

    解锁成功

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

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

    2. bigma bigma

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

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

  10. KONGE KONGE

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

  11. red red

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