# Firmware Security ## 1. TL-WR841N V10 - Detail - Vendor: TP-Link - Affected firmware version: 3.16.9 - Vulnerability: Stack-based buffer overflow - Architecture: MIPS - CVE: [CVE-2020-8423](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-8423) - Related link: [PoC](https://ktln2.org/2020/03/29/exploiting-mips-router/) - Summary - [vuln] 在 /usr/bin/httpd 中, 有一個 `stringModify()` 函數, 其功能相當於做字串複製 (src -> dest), 只是對某些特殊字元做代換, 因為沒有檢查 bound, 所以字串 dest 可能出現 overflow; 沒開 non-executable stack 和 ASLR - trace 完可以發現函數 userRpm_popupSiteSurveyRpm_AP.htm() 會取得 GET request 的參數, 此參數會傳給 writePageParamSet(), 又 writePageParamSet() 會呼叫 stringModify(), 會把值再傳給 stringModify() 的字串 src - [exploit] 從 uClibc 找 gadget 構建出 rop chain, 透過 GET request 在 ssid 欄位塞 payload , 造成 stringModify() 的字串 dest overflow, 控制 pc, 拿到 shell 權限 - [trick] 須注意 (1) MIPS branch/jump 指令有採用 delay slot 的機制, 所以 gadget 裡面 jmp 後面要多一道指令 (2) 為了解決 MIPS cache coherence 的問題, 即寫到 buffer 的資料不會馬上存到 stack 上, 要多呼叫 sleep() 等它一下 ## 2. Cisco RV130 router - Detail - Vendor: Cisco - Affected firmware version: RV130 < 1.0.3.45 - Vulnerability: Stack-based buffer overflow - Architecture: ARM - CVE: [CVE-2019-1663](https://nvd.nist.gov/vuln/detail/CVE-2019-1663) - Related link: [Writeup](https://quentinkaiser.be/exploitdev/2019/08/30/exploit-cve-2019-1663/) - Summary - [vuln] 使用者可控制的 login 參數 `pwd` 會 pass 給 strcpy(), 又 strcpy() 是 dangerous function, 可能出現 stack-based 的 buffer overflow; ASLR 沒開 - [exploit] 利用 return-to-libc 攻擊取得 root shell, 發出一個 POST request, 把設計好的 buffer 塞在參數的 pwd 欄位 ## 3. Netgear WNDR3400v3 - Detail - Vendor: Netgear - Affected firmware version: 1.0.1.18 - 1.0.1.24 - Vulnerability: Stack-based buffer overflow - Architecture: MIPS - CVE: [CVE-2019-14363](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-14363) - Related link: [PoC](https://github.com/reevesrs24/CVE/blob/master/Netgear_WNDR2400v3/upnp_stack_overflow/upnp_stack_overflow.md) - Summary - [vuln] upnpd binary 中有個 ssdp_http_method_check() 函數會呼叫 strcpy(), 有 stack-based buffer overflow; 有開 ASLR 但沒開 non-executable stack - [exploit] 利用 `libc.so.0`, `libnat.so` 和 `libcrypt.so.0` 等有 static 位址的 library 找出 gadget, 串成 rop chain, 把設計好的 buffer 包成 UPnP SSDP 封包送出