當前位置:
首頁 > 科技 > 華碩路由器AsusWRT區域網內未授權遠程代碼執行漏洞

華碩路由器AsusWRT區域網內未授權遠程代碼執行漏洞

原標題:華碩路由器AsusWRT區域網內未授權遠程代碼執行漏洞



近期,Agile安全研究員Pedro Ribeiro,發現了華碩路由器固件系統AsusWRT的一個區域網內未授權遠程代碼執行漏洞,我們一起來簡單了解一下該漏洞的生成原因。

漏洞概述


AsusWRT是華碩內置於中高端路由器中一個基於Linux的開源操作系統,它包含一個精美的Web用戶界面以及一個簡潔的外觀,非常適合一些資源受限的路由器使用。非常慶幸的是,華碩是一家負責任的公司,他們不僅按照GPL要求發布了完整的源代碼,而且還能通過SSH為用戶提供對其路由器的root訪問許可權。總體來說,與其他路由器製造商相比,華碩的該開源操作系統安全性相當不錯。然而,由於存在一些編碼性錯誤,導致在區域網內的未授權攻擊者,能以root許可權實現華碩路由器上的遠程代碼執行。


漏洞分析 漏洞#1:HTTP 服務端授權繞過

編號:CVE-2018-5999

利用途徑: 遠程


受限條件: 無;可被任意未授權攻擊者利用


影響版本: 目前經測試,v3.0.0.4.380.7743版本固件受此漏洞影響; 而v3.0.0.4.384.10007之前的所有版本固件也可能會受到影響

AsusWRT的HTTP服務端中,handle_request()函數存在缺陷,可被未授權用戶用來執行某些操作的POST請求。以下是AsusWRT源碼- /router/httpd/httpd.c:


handle_request(void) { ... handler->auth(auth_userid, auth_passwd, auth_realm); auth_result = auth_check(auth_realm, authorization, url, file, cookies, fromapp); if (auth_result != 0) <--- auth fails { if(strcasecmp(method, "post") == 0){ if (handler->input) { handler->input(file, conn_fp, cl, boundary); <--- but POST request is still processed } send_login_page(fromapp, auth_result, NULL, NULL, 0); } //if(!fromapp) http_logout(login_ip_tmp, cookies); return; } ... }

該漏洞與其它漏洞結合,能實現遠程代碼執行。


漏洞#2:未授權配置更改(NVRAM值設置)

編號:CVE-2018-6000


利用途徑: 遠程


受限條件: 無;可被任意未授權攻擊者利用

影響版本:目前經測試,v3.0.0.4.380.7743版本固件受此漏洞影響; 而v3.0.0.4.384.10007之前的所有版本固件也可能會受到影響

利用漏洞#1向vpnupload.cgi執行POST請求,觸發HTTP服務端的do_vpnupload_post() ,該函數存在缺陷,允許攻擊者直接在POST請求中對其NVRAM值進行設置。以下是AsusWRT源碼- /router/httpd/web.c:


do_vpnupload_post(char *url, FILE *stream, int len, char *boundary) { ... if (!strncasecmp(post_buf, "Content-Disposition:", 20)) { if(strstr(post_buf, "name="file"")) break; else if(strstr(post_buf, "name="")) { offset = strlen(post_buf); fgets(post_buf+offset, MIN(len + 1, sizeof(post_buf)-offset), stream); len -= strlen(post_buf) - offset; offset = strlen(post_buf); fgets(post_buf+offset, MIN(len + 1, sizeof(post_buf)-offset), stream); len -= strlen(post_buf) - offset; p = post_buf; name = strstr(p, """) + 1; p = strstr(name, """); strcpy(p++, ""); value = strstr(p, "

") + 4; p = strstr(value, "
"); strcpy(p, ""); //printf("%s=%s
", name, value); nvram_set(name, value); } } ... }


上述NVRAM值包含了管理員密碼等非常關鍵的配置變數,未授權攻擊者可以通過這種方式來實現管理員密碼更改。成功更改之後,代碼執行也不在話下。還能利用新密碼登錄Web管理端,開啟SSH通道,重啟路由器或實現SSH訪問控制。

更為明智的做法對9999埠的UDP守護進程infosvr的利用,該進程針對接收到數據包,如果以root身份執行其中的命令後會存在一個特殊模式,而這種特殊模式只有當參數ateCommand_flag被設置為1時才會出現,這種情況大多在工廠測試或質量檢測過程中才使用,華碩官方網站說明發行固件一般默認不啟用該模式。


但是,我們可以使用前述的VPN配置上傳技術(vpnupload.cgi)將ateCommand_flag設置為1,然後向守護進程infosvr發送一個PKT_SYSCMD數據包,之後,infosvr將會從數據包中讀取命令並以root身份執行,無需更改任何密碼就能完美實現我們的命令執行操作。


(注意:infosvr在2014年曾出現一個漏洞CVE-2014-9583,,即允許在未設置ateCommand_flag的情況下實現未授權命令執行,華碩在2015年初修復了這個問題)。


以下是AsusWRT源碼 -/router/shared/iboxcom.h:


數據包結構


- 包頭


typedef struct iboxPKTEx { BYTE ServiceID; BYTE PacketType; WORD OpCode; DWORD Info; // Or Transaction ID BYTE MacAddress[6]; BYTE Password[32]; //NULL terminated string, string length:1~31, cannot be NULL string } ibox_comm_pkt_hdr_ex;


- 數據包主體


typedef struct iboxPKTCmd { WORD len; BYTE cmd[420]; <--- command goes here } PKT_SYSCMD; // total 422 bytes


PoC


Metasploit利用模塊已發布- asuswrt_lan_rce.rb


漏洞修復


更新到AsusWRT v3.0.0.4.384.10007以上版本,參考此論壇中給出的修復措施進行漏洞修復。PS:也就在最近,其他安全研究員還披露了華碩路由器的多個漏洞,涉及XSS、XXE和密碼更改等,詳情請參考securityartwork。


*參考來源:githubusercontent,FreeBuf小編clouds編譯,轉載請註明來自FreeBuf.COM

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 黑客與極客 的精彩文章:

漏洞暴露近一周才修復,某成人VR App可能泄露用戶信息

TAG:黑客與極客 |