TEW654 命令执行漏洞

根据之前的分析,在my_cgi.cgi的main函数中,需要对传递的参数进行验证,传入的可能是命令,如下login/show_message/reboot/logout等

执行bash脚本,传入POST数据

bash ./mycgi.sh “request=login&user_name=admin&user_pwd=pass”

在地址0x004094F8处下断点,执行到此,查看到strcmp要比较的内容在寄存器$A0中

查看此地址内容,是post的login值,上边地址就是request值

第二个断点在exec_sql处,可以看到post提交的用户名和密码

在my_cgi.cgi中,只有一处request

跟POST提交内容关系并不大

将request参数名修改为其他,再次POST提交试试

bash ./mycgi.sh “mlxg=login&user_name=admin&user_pwd=pass”

此时可以看到requst变成了mlxg,并且SQL语句依然没变

据此推断post提交数据跟参数名无关,只是判断参数的值,在login过程中是,第一个参数值login表示是login操作,之后两个参数表示user_name和user_pwd,可以更改第一个参数login的值,从而控制程序的执行流程或者说执行其他的命令

比如我们找到字符串admin_webtelnet,猜测可能与telnet有关,只需要某个参数进行strcmp操作

下断点,构造post数据,第一个参数值为admin_webtelnet

bash ./mycgi.sh “request=admin_webtelnet&user_name=admin&user_pwd=pass”

可以看到传入的参数和值

在之前的login登录判断跳转处设置断点,因为没有传递login参数,所以手动修改V0的值为0

根据CFG图各种跳转关系,在send_telnet_cmd处设置断点

在函数send_telnet_cmd中设置断点位置在system调用处

运行,查看V1寄存器值,在system上可以看到字符串 /tmp/tmp_send_result

根据V1地址查看内存数据,可以看到将第二个参数值admin传给了/tmp/tmp_send_result

据此可以构造第二个参数

bash ./mycgi.sh “request=admin_webtelnet&cmd=echo mlxg2”

再次执行测试

或者将cmd命令改成开启telnet服务

但是实际测试的时候,还是存在一点问题,后边如果直接运行会直接到程序结束了,没有tmp下的临时文件,也启动不了telnet。

额,就先酱吧

参考资料

您可能还喜欢...