首页
社区
课程
招聘
[原创]Iptime漏洞分析,未授权、未授权修改账号密码、远程调试(后门)
发表于: 2025-12-14 21:37 203

[原创]Iptime漏洞分析,未授权、未授权修改账号密码、远程调试(后门)

2025-12-14 21:37
203


一、信息收集

我们拿到手发现熵值有很大变化,我们尝试解包一下。应该是没加密的,我们解包后发现了一个文件系统,我们进去看一下。


1、漏洞信息

未授权远程代码执行

  • 由于逻辑错误存在未授权访问漏洞,可以利用该漏洞进行账号密码修改,功能开启,进而进行远程命令执行
  • 供应商: ipTIME
  • 产品: AX2004M
  • 版本: 14.19.0


2、确定架构

这里我们发现是Mips、32位小端架构。

发现了有NX保护,没有栈保护。


二、FirmWare模拟

启动模拟后访问网页看到了这个登录界面。

(1)、查看进程

这里我们能确定是启动了httpd服务。


(2)、分析路由器文件

这里有一个cgibin的文件。

/cgibin目录与路由器相关,他会将Web界面上的操作,例如更改目录、设置网络等转换为实际的系统命令。

我们看到Web页面也发现了几乎所有的功能都在这个路径下,去看一下这个位置。

都会调用这类cgi文件,哪这类文件应该就是功能处理的作用了。看一下这个比较河西你懂文件,timepro.cgi,这个文件里面有很多参数,甚至还有system命令。

这个位置很有RCE的嫌疑,我们先去看这个timepro文件,看一下能不能发现什么。

后面再看看这个数据包,还有一个cookie的验证。


(3)、cgi文件分析

这里我们就关注比较核心的cgi文件。

login.cgi, login-cgi    作为请求登录请求
sys_apply.cgi           应用系统设置,重启、时间等,可能会存在很多system()或execve()
net_apply.cgi           网络设置、子网掩码、静态路由等,可能出现ipconfig、route等命令
wireless_apply.cgi      应用无线设置(SSID、密码、加密类型)
download.cgi, download_...cgi   提供下载功能,可能有任意文件读取、目录遍历
比较重要的应该是timepro.cgi,因为我们之前的请求
/sess-bin/timepro.cgi?tmenu=system&smenu=info
就是通过这个文件进行的,很大概率会有漏洞。

(4)、IDA分析,未授权访问

根据漏洞作者披露,该路由器固件在验证身份验证时存在逻辑错误,漏洞点在ftext函数。

我们根据提示说有验证身份时存在逻辑错误,在ftext函数,找到这个函数看看。

我们逐行分析这个函数作用以及谁调用它

一开始会去做一共session验证,然后又在下面做了一共检查csrf攻击的检擦。

然后下面

我们看下这一段,是对POST请求做一个处理,他会经过一个get_value_post函数,就是获取我们提交的命令commit,然后经过一个commit_process函数,else下面又是获取我们的commit,再往下走又出现一个goto LABEL_46,大概率是判断我们输入的值是否为空 。

接下来我们看下commit_process函数是怎么处理的命令。

我们能看到,我们输入的commit会当作a3进入到下面的if中,分析一下这几个函数的作用。

commit_current_wireless(a1) ,无线配置提交,负责WI-FI名称、密码之类的,可能调用iwconfig,有RCE风险。

commit_pf_restore(a1, a2) ,端口转发函数。

commit_fw_restore(a1, a2)  防火墙恢复、 commit_vpncli_file_upload(a1, a2)  VPN客户端文件上传。

我们再往下分析,这一大段伪代码用于认证检验、还是一个请求分配中心,负责处理Web界面的大部分操作。


看下第二个判断的函数,这里是两个参数,会获取我们的session和Cookie,来进行一个判断。

这一段,比对session和v9,检查Web服务器是否配置使用session认证,认证机制不是session函数返回1。

检查用户是否已登录的核心逻辑,说先获取COOKIE头部,通过 extract_session_id_from_cookie(v5, v8)  从COOKIE中解析出Session ID, check_session("httpcon", v8, v4)  比对服务器的Session列表中检查ID是否有效。

所有结果都成立,Session有效情况下,进入if,最终返回1认证成功,如果认证失败则走下面的else if。

就是这个redirect_login函数

这里负责未通过认证的用户重定向登录页面。

现在后面的我们了解了逻辑来看前面的函数

这里就是检查URL是否检查以/sess-bin/开头,是的话返回True,不是的话返回False。


(5)、漏洞链分析

因此我们就能得出两条路来进行未授权和远程调试的后门。

if ( httpcon_check_session_url() && !httpcon_auth(1, 1) )
    return 0;
远程调试(后门链)

当我们再次回归这里,第一条链。

攻击路径/cgi/d.cgi,整条条件不成立,执行到包含后门的代码块。

( httpcon_check_session_url() && !httpcon_auth(1, 1) )
                        False && True

这条链我们不需要删除Cookie,这样逻辑最终返回错误。

因为这条链的逻辑是两个条件都为True才会返回0,终止这条链。

因此我们只需要任意一条为0即可。


未授权操作(未授权链)
( httpcon_check_session_url() && !httpcon_auth(1, 1) )
                       True && False

走这条链时,我们需要删除Cookie才不会终止程序,然后左边路径要


三、回归身份验证逻辑函数

我们分析这一大段伪代码,我们关键分析点应该检擦绕过httpcon_auth,是这样的,漏洞点在于未授权,那我们就应该想办法绕过这个鉴权机制,然后就能访问里面的文件了,所有回归鉴权函数。

 e_log_init("cgi.timepro", a2, a3);
  if ( httpcon_check_session_url() && !httpcon_auth(1, 1) )
    return 0;
  • httpcon_check_session_url() == 1(会话有效)且 httpcon_auth(1, 1) == 0(认证失败),条件成立,return 0 ,无法进行后续操作。
  • httpcon_check_session_url() == 1(会话有效)且 httpcon_auth(1, 1) == 1(认证成功),条件不成立,可以进行后续操作。

含义就是我们要让前面函数为1并且后面函数为1。

对于未授权用户来说的话,!httpcon_auth(1, 1)应该始终为1,我们需要让前面函数返回0

我们去找一下这个函数位置。

这个函数是用到外部库,我们分析一下这个库。用IDA打开后搜索这个函数。

我们找到了这个函数,简单分析一下,他会读取我们请求的URL,然后做一个判断,不为空会执行右边的操作。

这个函数的目标就是需要认证的页面(如/sess-bin/)返回1,阻止访问,不需要认证的页面,返回0,实现绕过。那我们要做的就是不能以/sess-bin/开头。

那接下来就很简单了,我们只需要把sess-bin改成其他文件路径就可以任意访问了呗。


四、未授权漏洞/未授权修改账号密码复现


1、未授权




我们把Cookie删除,然后退出登录,再次尝试。

未授权访问成功。



2、未授权修改账户密码


这里我们在修改账号密码位置抓包。

成功修改密码

captcha_file(验证码路径)
captcha_code(验证码)
new_passwd(新密码)
new_login(新用户名)

我们想获取这个验证码就去/sess-bin/captcha.cgi下面找,会访问这个路径生成验证码。

3、远程调试

开启了远程调试功能,我们去看看数据包

抓包后看一下信息

这一行就是他的调用方式了,我们找找这个服务,远程支持。

能发现很多这个服务,我们看下这些函数。

在这个函数中发现了有remtesupport字样,看着像一个表单,我们分析这个函数功能。

这个函数就是一个生成html的表单,用于创建用户界面的,我们要找这个远程支持的功能点或者函数。

我们就看谁调用了这个远程支持的函数,先看这个函数。这个函数

首先看这一段,就是调用get_remote_support()函数,把结果放进去,然后检查默认密码。

回归之前的绕过,这段代码就是获取系统配置中远程支持的状态,然后查看远程支持是否开启。

来看这一段,这里就是如果没忍住跳转到LABEL_51,如果认证了会获取aaksjdkfj值,然后检查这个值是否匹配一个字符串。

看着一段,如果设置了fdump=on则程序会读取用户输入的rname参数作为文件名。

这里输入是程序调用get_value(a1,"cmd",...)获取用户输入的cmd参数,把他拼接到v20后面,然后调用popen(v20,"r")执行。这里好像是通过后门钥匙就能提交cmd=[shell],一会儿尝试一下。

那其实就是说我们可以通过URL或POST数据包提交一个名为cmd的参数,他会存入v20中并且调用popen,或许可以尝试构造一下。

其实这里相当于构造一个密钥,把他转换一下就是 !@dnjsrurelqjrm*& ,这个应该就是密钥了。

那我们应该是只需要输入密钥和指令应该就行进行命令执行了。

构造成功。

如果想找到这个后门就需要到这个函数中,这里有解释。

这段代码做了三件事,确认参数名称,确认了参数就是 aaksjdkfj  ,确认渲染方式,这是一个<input type=text>字段,这意味着他会在调试界面的文本框里,确认默认值,格式字符串中%s对应遍历就是v8。

并且在上面提到了提交的方法,是\d.cgi\

这段会确定我们没有提交了aaksjdbfj参数,那么v8的值就是空的,就是strcpy(v8,""),空字符串

如果提交了aaksjdkfj那么v8就是我们提交的密钥字符串,也就是有这个参数才能进入后门页面。

当我们调试时,URL没有携带密钥,渲染的文本框是空,提交了文本框才会回显密钥。

over。

漏洞原理:

第一步,就是认证机制绕过。这个漏洞是故意让认证失败来实现的。/sess-bin/d.cgi,认证条件是

if ( httpcon_check_session_url() && !httpcon_auth(1, 1) ) ,利用条件就是攻击者不提供有效Cookie。

如果httpcon_auth(1, 1)失败会返回0,也就是没有Cookie的情况下,但是前面有一个!符号,也就是说只有不带Cookie他才会返回1嘛,因为在这个函数内的逻辑是有session返回1,没有session返回0,我们就让他返回0,然后加上前面的!符号,就绕过去了,所以我们想绕过去就不能带Cookie。这样后面的函数就永为1,也就是True。

条件成立后会往下走,在认证失败后触发隐藏代码中的后门。

而且我们在ftext函数中发现了后门的踪迹,如果调用了这个d.cgi文件,他会检查cgi脚本的路径,路径匹配后会进入到show_debug_screen函数中再次进行判断,它会调用我们之前发现包含 aaksjdkfj  后门的密钥检查和cmd命令诸如函数。

也就是进入这里,访问了这个路径后检查我们的参数是否为这个密码

都通过了就进入到这个后门了,也就打开了。











[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回