SSCTF Writeup

Ano_Tom 2014-11-04 14:26:00
CTF

0x01 Web


1.web1-信息获取

Url:http://ctf.sobug.com/hack_game/e82b2db876111afd/index.php Point:100

Description: 获取信息,提交key

Proceess:

打开题目,title为hex和cookie,下载图片载入编辑器,找到如下hex

23696E636C7564652066696C653D22386630306232303465393830303939382E70687022

解码为include file="8f00b204e9800998.php",访问该页面,查看cookie,获得base64加密的key 如图

解密即可。

Key:{SEcL0ver@2014}

2.web2-慧眼识珠

Url: http://ctf.sobug.com/hack_game/5220de5ab2a8ce7d/index.html

Point: 100

Description: 仔细查看页面,获取key

Proceess:

访问,查看到cookie里有check=0,因而想构造check=1的cookie,构造完毕后继续访问发现页面仍未变化。 继续查看后发现当前页面为index.html,里面的一段加密的js代码解密后就为check=0,再无其他数据。修改cookie后尝试需访问其他动态页面,访问index.php后响应中返回key,如图

Key:{seCL0veR1H@CKz0l4}

3.web3-数据&暗语

Url:http://ctf.sobug.com/hack_game/f31c5630b00b0131/index.php

Point:150

Description: 仔细查看页面获取你想要的key

Proceess:

打开后,查看源代码提示referer&code,图片中描述去官网看看,确定referer应为官网Referer:http://www.seclover.com( 注意请求头里若在末尾加了/不会出结果的,Referer:http://www.seclover.com/) 构造referer后,访问获得的响应内容如下

诺基亚的键盘结果如下

2abc 3def 4ghi 5jkl 6mno 7pqrs 8tuv 9wxyz 0空格

根据0分割数据

843 0 539 0 47 0 73256837 0 9352663 0 968

猜出前几个个为the key is,因而确定为有意义的单词,无需做词频统计之类的。最终获得的解密字符为the key is seclover welcome you

Key:{seclover welcome you}

4.web4-代理和搜索

Url:http://ctf.sobug.com/hack_game/390532fb5dc7f219/index.php

Point:150

Description: 仔细查看页面,度娘知道答案哟

Proceess:

通过题目中谷歌是检索不到的,得知存在robots.txt文件,访问获得里面的disallow目录User-agent: * Disallow: /S$cL0ver/ Disallow: /include/

访问/S$cL0ver/

根据说明,测试代理访问,本地设置X-Forwarded-For为www.seclover.com访问,获得您的ip为www.seclover.com 得知其ip获取是利用X-Forwarded-For,修改其为www.seclover.com的ip,访问即可获得key

Key:{S2CloveRWelcomE_Y0u}

5.web5-编程&脚本

Url:http://ctf.sobug.com/hack_game/f8495eeedb8e92ee/index.php

Point:200

Description: 编程解决问题

Proceess:

Burp抓包可以看到响应头中有个password字段

每次请求都会变化,这样只要写个自动化脚本抓取后自动提交就可以了,脚本如下

跑起来就可以得到key:

Key: {b7mIfekXA5lwLq}

6.web6-windows密码

Url:http://ctf.sobug.com/hack_game/1ffd89ff6c2a0012/index.php

Point:150

Description: windows密码机制

Proceess:

下载得到两张图片,进行处理 用stegdetect进行处理,发现利用outguess加密算法,隐藏的数据,根据提示是windows弱口令,试了几次成功读取 如图

查看key文件,得到windows的ntml哈希

ed6c3eb3f56395a1f76ccb47241e3d88:0816f03b51a8ea50bcc7707896c93518

you can guess.what's this? http://www.objectif-securite.ch/ophcrack.php破解得到key wangke1234 Key:{wangke1234}

7.web7-获取后台密码

Url:http://ctf.sobug.com/hack_game/76412c649fb21553/index.php

Point:220

Description: 获取后台密码

Proceess:

有验证码,查看验证码是否存在绕过,此处的逻辑漏洞为找回密码功能,点开忘记密码,提示四位验证码已发送到您手机, 因而暴力猜解验证码即可。截取请求包,载入burpsuite intruder,设置payloads为0000-9999进行爆破,爆破后如下

登录框登录成功后,弹出key

Key:{4297f44b13955235245b2497399d7a92}

8.web8-U盘病毒

Url:http://ctf.sobug.com/hack_game/eaf10b34b5ba8770/index.php

Point:300

Description: U盘病毒分析,获取key

Proceess:

下载U盘镜像后,解压1.4M,果断mount之。得到一个exe和autorun,根据autorun里的信息,放到windows下。 看了下是winrar的自解压的文件,然后用winrar打开,得到3个文件。如图

运行1.exe解压出一个隐藏的test.txt文件。内容如下,计算md5提交就是flag

Key: {队友玩星际去了,没要到key,我代写的}

9.web9-电报解码

Url:http://ctf.sobug.com/hack_game/70e8ff92f2cb2576/index.php

Point:200

Description: 仔细查看页面获取key

Proceess:

Win7访问是如上图的,但是linux访问直接显示的如下

根据摩斯码表得到明文:

xian seclover welcome you we are very happy for  you

发现其是根据UA的系统进行判断是否返回数据的

Key:{队友玩星际去了,没要到key,我代写的}

10.web10-SQL

Url:http://ctf.sobug.com/hack_game/f9abf127da5264c1/index.php

Point:350

Description: 注入绕过

Proceess:

根据题目得知参数为id,访问获得如下提示

得知sql语句。将其载入sqlmap中可以读取到database() version()等信息,其利用的是盲注。此处过滤了select等字符, 且大小写无法绕过。测试发现大致的过滤思路为,检测到字符串中有= 和select等字符,会提示Holly Shit! Damn it.但union未检测,多次测试select用%00来绕过

2的位置有回显。接下来就是基本的sql注入了 先看版本version()得知为5.5.1、再看数据库database()为ctf0web 读取表index.php?id=-1+union+se%00lect+1,table_name ,3+from+information_schema.tables+where+table_schema='ctf0web'#获得表名helloctf 读取列名

index.php?id=-1+union+se%00lect+1,column_name,3+from+information_schema.columns+where+table_name='helloctf'#

获得列名id title flag 读取flagindex.php?id=-1+union+se%00lect+1,flag,3+from+helloctf+where+id=1#获得key

Key:{5e1325ba32f012c77f02c422251c3b7c}

11.web11-UPLOAD

Url:http://ctf.sobug.com/hack_game/8e3096620b9a89d1/index.php

Point:200

Description: 按题目要求完成

Proceess: Burp抓包,传正常图片,提示{不会吧,上传图片不好吧!至少你也传个能解析的啊!} 但上传php文件无论怎么改、截断都是提示文件类型错误,所以猜测其对content-type进行了验证,看其是否为图片。 此时上传图片改为xx.php提示上传文件出错,然后利用文件名为大写PHP绕过,如图

Key:{KunSecLover2@14}

12.web12-SQL

Url:http://ctf.sobug.com/hack_game/8f0784928387928a/index.php

Point:500

Description: 找找看看,有洞哟

Proceess:

得知为一博客系统,大致探测了下目录结构与文件,收获如下

/config.php
/content.php
/content/2014060212.txt
/content/2014061201.txt
/content/2014060901.txt
/admin/check.php
/admin/index.php
/admin/index.html

Content.php文件通过file参数传入文件名(不带后缀),首先想到文件包含漏洞。 访问http://ctf.sobug.com/hack_game/8f0784928387928a/content.php?file=2014061201

而该文件为

因而可以确认其不是文件包含,而是文件读取。因而想构造参数读取confi.php里的内容。多次测试发现传入字符会提示日期错误,传入file=2014061202000000一个超长数据,提示服务器内部500错误,说明过了日期检测函数;传入file=2014061202000000../提示日期格式不对,传入file=0xabcdef123提示服务器内部500错误。多次测试发现无法绕过其日期检测函数。

将注意力放在admin的登录框里,有验证码,输入帐号错误会提示不存在该帐号,测试了多个常用管理帐号后依然提示帐号不存在,由于题目是SQL,因而考虑到是sql注入,测试了多次后,发现注入应该不在登录框处。

点开搜索框,url为search.php?word=&tongpeifu=*&sqltongpei=%显示结果如下

根据url参数命名方式,确定此处应该是注入点了,就是如何构造语句了。 通过搜索

search.php?word=l&tongpeifu=*&sqltongpei=%
search.php?word=x&tongpeifu=*&sqltongpei=%

都能返回linux的搜索结果,从而确定sql执行的语句大致为

Select * from articles where title like ‘%word%’

然后需要弄清楚tongpeifu与sqltongpei以及word三者之间是个怎样的逻辑关系

默认三个参数都不传word=&tongpeifu=&sqltongpei=,返回所有数据 传入/search.php?word=li?ux&tongpeifu=?&sqltongpei=发现没有回显内容,如图

提交search.php?word=li?ux&tongpeifu=?&sqltongpei=n获得回显

因而大致确定程序的逻辑tongpeifu是指word中的,在执行sql语句时候将word中tongpeifu代表位置用sqltongpei替换。 逻辑清晰了,下面就是要构造sql语句进行注入。构造恒成立语句查看

search.php?word=*&tongpeifu=*&sqltongpei=n%' and 1=1 and '%'='

发现并无返回数据,多次测试仍无果。

猜测是单引号被转义了,查看了php版本为5.5默认无gpc,则考虑到可能是对获取的数据进行了addslashes处理,现在要做的就是如何绕过addslashes,使单引号逃逸出来。 本地测试。

其实word tongpeifu sqltongpei的处理逻辑,在php中实现就是一个str_replace函数。

构造本地测试的代码为 先查看addslashes的处理单引号、双引号、反斜线、空字符 测试代码

<?php
//addslashes处理的内容有'、\、"、NULL四个字符
if (isset($_GET['singleq'])) {
    echo "' -----> ".addslashes($_GET['singleq'])."<br/>";
}
if (isset($_GET['doubleq'])) {
    echo "\" -----> ".addslashes($_GET['doubleq'])."<br/>";
}
if (isset($_GET['backslash'])) {
    echo "\\ -----> ".addslashes($_GET['backslash'])."<br/>";
}
if (isset($_GET['null'])) {
    echo "%00 -----> ".addslashes($_GET['null'])."<br/>";
}
//sql test
$word=addslashes($_GET['word']);
$tongpeifu=addslashes($_GET['tongpeifu']);
$sqltongpei=addslashes($_GET['sqltongpei']);
echo $word."<br/>";
echo $tongpeifu."<br/>";
echo $sqltongpei."<br/>";
$result=str_replace($tongpeifu, $sqltongpei, $word);
echo "sql--query:"."select title from articles where title like '%{$result}%'"."<br/>";

输出为

有没有很熟悉,echsop之前爆过的一个插件注入也是类似,利用替换,将单引号逃逸出来 仔细想想,该怎样进行替换,才会使单引号逃逸出来? 首先在word中测试,另外两个参数为空,查看输出

Word中的 ‘ %00中的反斜线都是成对出现的,所以要想使得单引号逃逸出来,必须使得其前面的\被转义, 那通配符该用哪个进行替换呢,使得通配符分别为’或\或%00,时候,其替换的时候也为成对替换,因为其自身也被转义了。

但是将通配符变为\0查看输出

令sqltongpeif= 输出查看,单引号逃逸

然后执行常规的查库、查表、读取flag。 Order by判断有4个字段, 查到数据库为sql_seclover 请求为

search.php?word=l\%00' union select 1,schema_name,3,4 from information_schema.schemata where 1 %23&tongpeifu=\0&sqltongpei=\

查表有content、admin(里面无数据,因而后台登录是虚设?)、secret 请求为

search.php?word=l\%00' union select 1,table_name,3,4 from information_schema.tables where table_schema=0x73716C5F7365636C6F766572 %23&tongpeifu=\0&sqltongpei=\

查字段sid skey 请求为

search.php?word=l\%00' union select 1,column_name,3,4 from information_schema.columns where table_name=0x736563726574 %23&tongpeifu=\0&sqltongpei=\

获得key{SecloverW@1C0me ^u0} 请求为

search.php?word=l\%00' union select 1,skey,3,4 from secret where 1 %23&tongpeifu=\0&sqltongpei=\

Key:{SecloverW@1C0me ^u0}

0x02 Crack


1.crack1-Crackme1

Url:http://ctf.sobug.com/crackme/b4dc971ef90cb6ae/index.php

Point:100

Proceess:

拖到ida中,逻辑很简单。 找到关键函数sub_401000,分析。 看了下就是和unk_408030位置的数字进行一系列抑或,而且是简单的抑或。所以这个不用逆算法就行,直接上od。 转到0x401000处,在程序结束的地方下断点,运行程序。成功断下后,直接在栈上可以看到注册码,如图。

2.Crack2-Crackme2

Url:http://ctf.sobug.com/crackme/82a7d5ac894e5bb8/index.php Point:200

Process:

一个易语言写的程序~ OD载入,ALT+M, 在crackme.data段F2下断,F9运行

中断在krnln库文件代码里,F8单步过下面的JMP就到程序领空

,这时找字符串,应该是有2个还是3个失败,1个不能为空,1个成功,所有中文字符串都下上断点,分析下

首先随便输入,如果断下来

判断密码是不是32位的 生成正确注册码

F9重新运行,在上面的那个函数断下后,看栈里,下面的那个就是正确的注册码

3.Crack3-Crackme3

Url:http://ctf.sobug.com/crackme/e26cac7bac3f78c1/index.php

Point:300

Process:

分析个sethc.exe 粘贴键后门。 直接看消息处理的地方吧

1那个地方是判断ecx是不是为0x30,这个地方是鼠标的点击次数,下面会有分析

2 那个地方是判断按的是确定还是取消,确定是1,取消是2

继续往下看

点击鼠标左键右键都会让ecx+1,左键在403070处写入0x4c,右键写入0x52 到满足ecx==0x30的时候,会来到00401C40这个地方判断鼠标点击的那48下的具体情况; 下面这个循环,将0x4c对应一个0,0x52对应一个1,48下转化为6字节

下面那个比较的地方,那6个字节和“查水表”的HEX值比较

比较一样就可以启动“后门”弹出本题的flag:D27789EFCA409B6B6EE297D412334A65 所以把“查水表”的2进制转化出来,就可以确定鼠标左键右键点击的次序,触发“后门”。

4.Crack4-Crackme4

Url:http://ctf.sobug.com/crackme/820af53738bfa68e/index.php Point:400 Process: 提示为:输入正确的密码,会释放出文件。key就在文件中。 tips:第一层密码为6为纯数字,第二层密码也是6位。 拿到程序后,放入PEID

FSG的壳,脱壳后发现里面有文件让损坏,所以带壳分动态调试,IDA分析脱壳后的吧。

运行到第3行命令那,栈里第4个位置就是程序入口。在栈中里那个位置右键数据窗口中跟随

然后下硬件访问断点,F9,然后就可以看到真正的代码了 先看401370函数吧,这个是对结果的处理函数,等下分析的时候需要用到,输入的参数为数字,然后6种情况

然后IDA的F5看

为空没有输入密码,不为空进入4013E0处理~ 下面这个函数,当我脱壳后会返回错误5,所以带壳分析了••

进去看下,当返回成0的时候为正确,那么就会生成文件,如果返回2,是密码错误。 里面有把你的密码经过sprintf和“HOWHP”连接在一起,经过401000的2次加密,和一个特定的hash对比。 根据我的那个方法跟一下就OK了,然后需要获得的hash如下 esi=0018F9F0, (ASCII "09B2F924C20C5CA427EED2C5B98BEFBF")

需要加密后的hash为 第一步,我采取的爆破,提示说是第一个密码是6位纯数字,代码在附件里。如果有附件~~ 爆破出来是564987

然后生成了一个一样的exe,同样加壳。只是最后生成的文件会不一样。这个的密码提示为6位,但是不一定是纯数字了,我一开始直接拿第一步写的程序跑了下纯数字,果然不行,然后就去看程序,修改指令,看看会生成什么,结果发现生成了个gif 马上想到GIF89a 6位,也许可以推算出来key 在401270函数里是写文件的,调用了40110把你输入的key和原有资源做运算

看看算法

异或操作,果然可以! 我使用的密码是123456 然后使用爆破的方法让逻辑正确,会生成一个***|||||||.gif的文件 然后你winhex打开生成的gif,比如第一个字节为0x01,然后G的hex值为0x47 使用 chr(0x31^0x01^'0x47') #python 就能得正确key的第一个字母,一次下去,GIF89a,就可以得到正确的key 输入正确的key,解密出来一个gif,打开就是flag.

5.Crack5-Crackme5

Url:http://ctf.sobug.com/crackme/02de861ff6b52930/index.php

Point:500

Process:

1:拿到程序后,首先看了字符串

有反调试,根据那些int3,很明显是seh反调试,打乱程序的执行流程,导致定位关键函数带来困难行流程。 2:来到跟进异常处理,来到

下面的这个地方判断是不是int3引起的异常,是就往下执行,不是就返回EXCEPTION_CONTINUE_SEARCH

这个地方,设置EIP

来我们看看edx的值

也是int3,带着疑惑,继续看~~ 多试几次后,EDX在不断增大~ 最后10多次后,发现了不是int3的情况

进一步的跟踪,发现是用异常处理例程是没隔10次左右的INT3异常对应一条MSAM语句,所有的语句整合起来,也就是注册码的算法了~ 此外UnhandledExceptionFilter在没有debugger attach的时候才会被调用。所以,跟踪起来很困难。 选择设置条件记录断点

整理后

根据结果就可以分析算法了。最后做出注册机,提交OK~ 附上源码和一个可以执行的账号~ 请注意:注册机的输出倒过来才是正确的注册码,然后用户名和注册码不能相同,不想改了,注意下就好

v_dature 536426

评论

Knight 2014-11-04 23:47:37

那个1.exe 360说是病毒把它杀了,我没装虚拟机没敢开。T^T

Knight 2014-11-05 00:02:35

crack1那道题密码要输得和用户名一样才能这样过。这write_up误导小朋友。

B

bey0nd 2014-11-05 11:22:49

学习了

咖啡 2014-11-07 13:19:21

全才啊

路人甲 2014-11-08 00:18:24

web9-电报解码
是检测Accept-Language,不是UA

A

Ano_Tom 2014-11-09 00:31:59

嗯,多谢指正。

C

Conan_Lan 2014-11-19 16:51:42

好腻害!!!膜拜

A

Ano_Tom

Talk is cheap.:

twitter weibo github wechat

随机分类

逻辑漏洞 文章:15 篇
Java安全 文章:34 篇
二进制安全 文章:77 篇
Python安全 文章:13 篇
APT 文章:6 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

H

HHHeey

好的,谢谢师傅的解答

Article_kelp

a类中的变量secret_class_var = "secret"是在merge

H

HHHeey

secret_var = 1 def test(): pass

目录