不要憎恨你的敌|

.N1nEmAn

园龄:1年7个月粉丝:37关注:1

IoT认证前漏洞学习总结

主要都是oneshlel师傅的文章学习而来。原文很多也是复制的,博客oneshell.top。以及oneshell的总结天工文章

端口弱认证

CVE-2024-5053是发生在三频游戏路由器TP-Link Archer C4500X,固件版本1_1.1.6及之前的认证前命令执行漏洞,漏洞发生在程序rftest中。该程序是和射频测试相关的,用于帮助AP进行无线接口自评价,程序会监听在TCP端口8888、8889、8890上。未授权的攻击者可以向这些端口发送构造的请求包,进行命令注入。

简单来说,这种漏洞的问题在于,开放端口在非80等常规端口用于其他目的,从而忽视了安全性。漏洞是只能执行wl命令,但是可以wl;id进行命令注入。使用了strncmp。

让鉴权函数返回是

发生在websSecurityHandler中的认证绕过(CVE-2020-15633)

该漏洞是发生在LAN口的一个登录认证绕过漏洞,影响设备DIR-867、DIR-878、DIR-882,固件版本1.20B10_BETA。漏洞产生的原因是在处理HNAP请求的过程中,验证用户登录逻辑时处理不当,使用strstr函数来检查无需验证权限的接口,导致可以构造特定URI来绕过身份认证,从而访问敏感接口。

大致就是/HNAP1/会调用如下链条:

sub_423ECC -> 0
sub_4249EC -> 0
websSecurityHandler -> 0

在函数sub_423ECC中,会使用函数strstr比较环境变量REQUEST_URI(也就是请求路径)中是否含有字符串列表actions_list中的字符串,然后触发到return 0。

if ( a1[57] && strstr(a1[57], &actions_list[32 * index]) )// REQUEST_URI
{
if ( strcmp(&actions_list[32 * index], "/HNAP1/") || !a1[50] || strcmp(a1[50], "POST") )
return 0;
}
  1. actions_list中的字符串表如下:
.data:004D01A0 actions_list: .ascii "GetCAPTCHAsetting"<0>
.data:004D01A0 # DATA XREF: sub_423ECC+D8↑o
.data:004D01A0 # sub_423ECC+12C↑o ...
.data:004D01B2 .align 4
.data:004D01C0 aGetdevicesetti_3:.ascii "GetDeviceSettings"<0>
.data:004D01D2 .align 4
.data:004D01E0 aBlockedpageHtm:.ascii "blockedPage.html"<0>
.data:004D01F1 .align 4
.data:004D0200 aMobileloginHtm:.ascii "MobileLogin.html"<0>
.data:004D0211 .align 4
.data:004D0220 aLoginHtml: .ascii "Login.html"<0>
.data:004D022B .align 5
.data:004D0240 aEulaHtml: .ascii "EULA.html"<0>
.data:004D024A .align 5
.data:004D0260 aIndexHtml_2: .ascii "Index.html"<0>
.data:004D026B .align 5
.data:004D0280 aWizardHtml: .ascii "Wizard.html"<0>
.data:004D028C .align 5
.data:004D02A0 aHnap1_5: .ascii "/HNAP1/"<0>
.data:004D02A8 .align 5
.data:004D02C0 aEulaTermHtml: .ascii "EULA_Term.html"<0>
.data:004D02CF .align 5
.data:004D02E0 aEulaPrivacyHtm:.ascii "EULA_Privacy.html"<0>
.data:004D02F2 .align 4
  1. 然后返回到函数sub_4249EC,触发该函数继续返回0;

  2. 再返回到函数websSecurityHandler中,使得该认证函数返回0,达到认证绕过;

websUrlHandlerDefine("/", 0, 0, websSecurityHandler, 1);

综上所述,对于路由/HNAP1/,只需要在uri后添加?GetCAPTCHAsetting或者任意其他字符串列表的中字符串,就可以达到认证绕过访问该接口的目的。

发生在函数auth_check中的认证绕过(CVE-2021-35973)

发生在netgear wac104设备、固件版本1.0.4.15之前的身份认证绕过漏洞,漏洞产生的原因是在鉴权过程中,使用了strstr来判断:如果请求uri中包含currentsetting.htm,设置无需认证标志。因此攻击者可以在需要鉴权的uri中包含currentsetting.htm标志,从而达到认证绕过的目的。

存在g_bypass_flag=1,只要请求path中包含currentsetting.htm就可以设置为1,从而不需要认证。

CVE-2021-32030

ASUS RT-AX56U设备,需要鉴权的接口都会从请求获取cookie参数,之后传入auth函数。auth函数中,从nvram获取ifttt_token。在默认情况IFTTT没有开启,ifttt_token为空,通过请求中传入空的cookie可绕过认证。

使用相关漏洞,进行未授权重置密码从而登陆。

让登陆接口返回是

同样是发生在函数websSecurityHandler中的认证绕过(CVE-2020-8864)

CVE-2020-8864是发生在固件版本为 1.10B04 的 D-Link DIR-867、DIR-878 和 DIR-882 路由器的认证绕过漏洞。该漏洞是由于HNAP请求中处理登录密码时缺乏对空密码的正确处理而导致的,攻击者可以利用该漏洞进行命令执行

函数hnap_login是寻常的账号、密码验证流程,大概简化的流程就是先从请求中获取账号、密码,然后比较账号是否为Admin/admin,先获取密码长度然后调用strncmp比较密码是否正确。但是如果输入密码为空则会导致strncmp比较通过。

int __fastcall hnap_login(int a1)
{
...
post_username = webGetVarString(a1, "/Login/Username");
post_password = webGetVarString(a1, "/Login/LoginPassword");
if (... || !post_username || !post_password || strncmp(post_username, "Admin", 5) && strncmp(post_username, "admin", 5) )
{
goto LOGIN_FAIL;
}
...
if ( !strcmp(nvram_isDefaultLogin, "1")
|| (len_password = strlen(post_password), !strncmp(v13, post_password, len_password)) )
{
...
return 0;
}
else
{
LOGIN_FAIL:
...
return 1;
}
}

内存溢出型

发生在函数handle_request(CVE-2021-34979)

发生在NETGEAR R6260,固件版本V1.1.0.78_1.0.1中,处理SOAPAction标头由于未判断全局数组spapServiceName的边界,导致越界写。写入的数据会以环境变量的形式传递到setupwizard.cgi中,进而造成缓冲区溢出。

越界写:发生在处理数据包的函数handle_request中,未判断边界。

else if (strncasecmp(line, "SOAPAction:", 11) == 0)
{
char *pTemp = NULL;
cp = &line[11];
cp += strspn(cp, " \t");
pTemp = strcasestr(cp, "urn:NETGEAR-ROUTER:service:");
if (pTemp != NULL)
{
int i = 0;
pTemp += strlen("urn:NETGEAR-ROUTER:service:");
while (*pTemp != ':' && *pTemp != '\0')
{
soapServiceName[i++] = *pTemp; // <-- Out-Of-Bounds Write
pTemp++;
}
}
}

后续调用setupwizard.cgi时,环境变量会传入,并且造成缓冲区溢出。

bool check_soap_login_record()
{
...
v1 = getenv("SOAP_LOGIN_TOKEN");
...
if ( !v3 )
{
...
strcat((char *)v25, v1);
...
```[oneshell](https://research.qianxin.com/archives/1972 "oneshell")

本文作者:.N1nEmAn

本文链接:https://www.cnblogs.com/9man/p/18719370

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   .N1nEmAn  阅读(38)  评论(0编辑  收藏  举报
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示