DEFCON 26 CTF参赛记

您所在的位置:网站首页 ctf比赛现场 DEFCON 26 CTF参赛记

DEFCON 26 CTF参赛记

#DEFCON 26 CTF参赛记 | 来源: 网络整理| 查看: 265

今年作为Tea Deliverers一员参加DEFCON 26 CTF。Redbud、Nu1L、ROIS、长亭科技几个员工组成Tea Deliverers,在DEFCON 26 CTF Quals中晋级Finals。DEFCON 21~25 CTF的主办方Legitimate Business Syndicate退休之后原来Shellphish的一些人组成oooverflow接手了。我们推测赛制可能会发生较大变化(往年使用一种零和赛制,被很多比赛的决赛沿用)。

参加决赛的队伍从15支增加到了24支:

1 0daysober 2 A*0*E 3 BFS 4 binja 5 C.G.K.S 6 DEFKOR00T 7 Dragon Sector 8 HITCON 9 hxp 10 KaisHack+PLUS+GoN 11 koreanbadass 12 mhackeroni 13 pasten 14 PPP 15 PwnThyBytes 16 r3kapig 17 RPISEC 18 Samurai 19 Sauercloud 20 Shellphish 21 Spaceballs 22 Tea Deliverers 23 TeamBaguette 24 TokyoWesterns

其中,A*0*E(浙江大学AAA+上海交大0ops+腾讯eee+复旦大学六星)、r3kapig(Eur3kA+FlappyPig)、Tea Deliverers是来自中国大陆的队伍。BFS(交通大学BambooFox、台湾大学Balsn、中央大学DoubleSigma以及中科院Kerkeryuan CTF)、HITCON是来自台湾的队伍。

赛前我又学习了一些radare2,在缺乏实践的情况下发了一些简单的pull requests,改进tab补全、提高switch case的可读性、修复一些bug、改进meson build system等。

We will run one power cable and one ethernet cable for each team. You will access the game over the ethernet cable using ipv4. We plan to provide internet access over this same link, however, this depends somewhat on the hotel's cooperation, so please be prepared for the contingency where we don't have internet, have filtered internet, or the world suddenly switches to FreeBSD and ipv6.

蛮期待有FreeBSD的,因为我在llvm里有一些(微小的)FreeBSD commits,可惜我们都知道FreeBSD ASLR道阻且长。

8月8日

北京时间8月8日从北京出发的riatre和marche147在Pacific Daylight Time中午到达,随后从SJC出发的我也到达了,因为手机AT&T信号不好没有注意和他们先汇合,独自打车去Caesars Palace,造成多余开销。到达后check in Palace Tower的两间房,在楼下去年吃过几次的北京九号吃推迟的午饭。

Tea Deliverers大部队乘坐Korean Air航班,在首尔转机时前一班延误导致赶不上去Las Vegas的,在首尔多待了一天。他们带着比赛需要的NUC和路由器。因此我们三个人没有办法提前做些准备(riatre称之为“修电脑”)。cxm和ckx也到达了,出去采购。

r3kapig一些队员也在今天到达了。晚上riatre、marche147和我找他们四个队员(Atum、两位天津大学学生、一个参加过ISC'16的USTC学生)吃饭,路上遇到了slipper和Tiffany Bao,原来他们也是主办方oooverflow成员。slipper从对手、联合战队队友、顾问(DEFCON 25 CTF)到主办方😮。

8月9日

cxm 9:00领取给比赛选手提供的8个badges(进入会场的凭证),因此同时在赛场的选手只能有8个(其实很多选手更愿意待在酒店,因为现场嘈杂)。今年段海新老师和刘保君给我们提供后勤支持(采购水、食物、订午餐晚餐)。下午采购东西。

从北京出发的大部队晚上到达,在Caesars Palace开了一间Forum Classic Suite。有一间Palace Tower房间因为延迟一天check in被取消了,好在后来升舱了。

下午cxm和ckx去Blackhat会场买T恤衫。riatre和我拿着badge去会场看看。但根据往年经验,DEFCON第一天并没有多少活动,主要活动时间和CTF重叠。

晚上段海新老师请我们在Paris Las Vegas的Le Village Buffet吃饭。作为常年参加DEFCON CTF Finals的选手发现今年熟悉的kelwin、libmaru、eadom不见了,似乎都是新鲜的面孔:ccls用户iromise(参加过ASC'16,现任清华大学学生网络安全技术协会会长)、去年还能回答知乎问题“高中生进入各大CTF的Final是怎样的一种体验?”的Misty、清华大学地球系统科学系的wirefish、网络研究院的ckx、三个经常更换id的web手(chromium1337、kericwy、wupco),友情支援我们的在UC Riverside交换的吴炜。

回去后大家在套房集合,BrieflyX编排了比赛现场和套房采用的网络环境:现场使用NUC,套房放置极路由(OpenWRT,我们对e1000e驱动传输大文件容易出问题的状况已经有心无力,使用了一个USB to Ethernet adapter),两者连接一个美国VPS部署的OpenVPN server。次日获得比赛现场使用的内网地址后,需要修改OpenVPN server设置push route和iroute推送路由(后来据说r3kapig的iroute配置错误导致网络瘫痪了一段时间)。现场和套房选手连接NUC或路由器后能透明访问比赛内网。

kelwin转发我们邮件,因为次日DEFCON 9:00会有很多人排队,goon设置了一个快速通道供CTF参赛选手进入Augustus Room(比赛现场)。

8月10日Day 1

主办方因为网络配置原因延迟了1个小时开赛。投影的大屏幕上有比赛规则链接http://oooverflow.io/obey。除了DEFCON CTF决赛传统的Attack and Defense类型题目外还设有King of the Hill (KoH)类型题目。

Attack and Defense:故意隐藏漏洞的服务,队伍需要找出漏洞、修补服务(抵挡其他队伍攻击则获得防御分)、攻击其他队伍的服务获得flag、提交flag得分(攻击分) King of the Hill:根据解的质量得分。第一名每回合获得10分,第二到五名分别获得6、3、2、1分。我们推测这可能会考写最短shellcode、达成最低延迟等。

比赛每5分钟为一轮,每轮每个服务,攻击成功一个队伍可以获得1攻击分,没有队伍攻击成我方服务获得1防御分。总分=40%攻击分+40%防御分+20% KoH分。我们推测攻击分最高队伍获得400分,其他队伍按照比例得分;防御分、KoH分类似。

服务随着被利用程度(与能利用的队伍数目有关)会变色:绿、黄、橙、红,变成红色后可能会下架服务。因为服务器带宽限制、计算资源限制(后来得知本次比赛使用两台服务器,但需要服务24支队伍)和运维复杂性,同时开放的题目不能太多。以往服务往往莫名其妙就下架了,这次有个颜色渐变,是个亮点。

结束后的portal个题目颜色

与DEFCON 21~23 CTF Finals不同(24为CGC、25为cLEMENCy,非常规平台),队伍不能ssh各自的gamebox替换服务,需要通过主办方提供的方式(根据主办方发放的private key访问github private repo,后来改成HTTP POST)patch服务。每次patch时主办方会检查合法性。如果patch后影响功能,会被revert。

不允许往其他队伍机器接入网线。如果发现这类不正当行为,可能会被长期ban(>1年)不能参加比赛。

portal

互联网和比赛内网使用同一根网线,但今年主办方没有使用VLAN隔离。riatre和我9:00到达现场,稍晚6人和我们汇合

入场后发现网络不通。因为网络问题主办方推迟到了11:00。最早开放的题目是King of the Hill类型的reverse。每轮每支队伍有12枚coins,投放一枚coin可以玩一次,是个x86-32 x86-64的disassemble选择题游戏,猜指令、指令地址等。有队伍先玩到了90分,我通过r2/pwntools disassemble可以玩到100多分,但不久就有队伍研制出自动化可以弄到600多分。服务端程序明显有bug,有时会有重复选项,有时会有错误选项。 1234567891011121314151617We are at level 4Time remaining: 60, score: 1960Lines: 0x8465eae: mov ecx, dword [edx] 0x8465eb0: mov edx, dword [edx+0x4] ?????????: cmp edx, 0xfffffffa 0x8465eb6: je 0x8466010 0xba9fb: 4889740??8 mov qword [rdx+rcx+0x8], rsiChoices (4): 0. '0x8465eb5\x003 b8 35 ' 1. '0x8465eb3\x00b 57 64 \x00[esp+0x1c ]' 2. '0x8465eb2\x009 70 a0 \x00x10ef51]' 3. '0x8465eb7\x009 c8 cf ' 4. '0x8465eaf\x00f 11 b2 'I think the answer is: 0x8465eb4Cannot solve: no solution?. Saving... 赛后Fish Wang告诉我应该继续逆向,修复程序的功能,利用隐藏指令简化游戏,不需要大力投入到完整的solver上。

BrieflyX根据主办方提供的game_states.json简单处理了下做了个内网portal。我用display: grid;稍微改了改。

新题pointless 1Description: pointless. Flag location /flag. You may patch up to 200 bytes in the pointless binary. 解压下载的pointless.tgz后有32位EM_MIPS程序,提供了MIPS的/usr/lib/ /lib/,可以用qemu-mips执行。我们发现用一些新qemu-user(如2.12)运行时会在: movbe ebp,DWORD PTR gs:[ebp+0x0]处SIGSEGV。

16:20发现新题twoplustwo,没有strip,链接了libjemalloc.so.1。 1234Description: A very shy calculator. Flag location is /flag, and you may patch up to 24 bytes in the twoplustwo binary.Your IP: 10.13.37.22Port: 6969Type: NORMAL

1234567% ./twoplustwowelcome to the ooo approved calculation.appapproved functionality is limited to printing a duck, repeating a string, adding numbers, multiplying numbers, concatinating strings, exiting, and replacing a single character in your nameany unapproved use of this application is not permitted and will be dealt with swiftlyOOORPC_HELLO(),2: OOORPC_REPEAT_STRING(string, num_times), 3: OOORPC_ADD_NUMBERS(num1, num2), 4: OOORPC_MULTIPLY_NUMBERS(num1, num2), 5: OOORPC_CONCAT_STRINGS(string1, string1), 6: OOORPC_FIND_REPLACE(needle, replace), 7: OOORPC_EXIT(message)base64([functionidx]\x00[arg?]\x00[arg?]...[yourname])

17:00 reverse能做level 7了  17:10 DEFKOR00T first blood twoplustwo。之后Sauercloud A*0。 17:30到了23200分,但仍然是第三 Congratulations, you have quite some skills you have anything to say in your defense? It was pure luck, I do not deserve this

PPP可以全场打pointless。

19:50开放新题KoH类型题目doublethink,同时原来的reverse被关闭: 1234Description: How many conflicting ideas can you hold in one thought? Files available at oooverflow.io/obey/doublethink.tar.gz.Your IP: 10.13.37.22Port: 9318Type: KING_OF_THE_HILL 这题很有趣,polyglot shellcode。 * 在现代架构(arm64、amd64、mipsel)上选一,攻击成功后 * 在SimH支持的若干古代架构上选一,攻击成功后 * 可以任意选择尚未攻击的古代架构或“未来”架构,持续该过程直到攻击完所有架构或无法攻击成功

可选架构: 1234567available = { 'past': { 'lgp-30', 'pdp-1', 'pdp-8', 'pdp-10', 'mix', 'ibm-1401', 'nova' }, 'present': { 'amd64', 'arm64', 'mipsel' }, 'future': { 'risc-v', 'hexagon', 'mmix', 'clemency' }}all_available = set.union(*available.values())max_control = len(available['past']) + len(available['future']) + 1

对于支持读取文件的架构,会在固定地址读入你的shellcode并执行: 12345678void *mem = mmap((void *)address, 0x4000, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON, 0, 0);printf("Reading file into %p...\n", mem);int read_bytes = fread(mem, 1, max_size, shellcode_file);printf("Loaded %d bytes of shellcode at %p (tried for %p)...\n", read_bytes, mem, (void *)address);printf("Executing!\n");((void(*)())mem)();

对于SimH支持的模拟器,比如pdp-1,在机器字0处读入flag,机器字64处用deposit填入程序,在64处模拟运行。shellcode能打印处flag的字串即可。 12345678910% ./drive_emu.py pdp-1 flag shellcoded 0100 356424d 0101 760200d 0102 200001...d 0 "ooo"d 01 "fla"d 02 "g "run 100exit

思路是如下编排指令:

架构0的jmp指令,在架构1~n-1上能安全执行(类NOP) 架构1的jmp指令,在架构2~n-1上能安全执行(类NOP) 架构2的jmp指令,在架构3~n-1上能安全执行(类NOP) …… 架构0的shellcode 架构1的shellcode 架构2的shellcode。n个架构的shellcode间顺序无关紧要

但是查找满足的要求的jmp指令很困难。大家搜集各个古老架构的手册、汇编器:

GNU MIX Development Kit LLVM+Clang,可以用来处理amd64、arm64、mipsel、hexagon、risc-v SimH中的lgp处理lgp-30,macro1处理pdp-1 ……

20:00 Day 1结束。oooverflow的zardus召集各个队伍的队长开会。

后来得知很多队伍发现30000/tcp可以访问“DC 26 Admin Interface”,又是一个主办方的bug。推测通过git repo(用于上传patch)可以下载到题目,但好在git repo也挂了,才没有提前泄漏题目。

8月11日Day 2

9:00入场10:00开赛,但主办方因为网络问题推迟到了大约12:20。

在北京远程参与的f1yyy研制出了amd64+pdp-1 shellcode,可惜没有派上用场。很多队伍都能攻击3、4个架构,PPP有攻击5个队伍的polyglot shellcode。Dragon Sector甚至有9个,后来看到HITCON有11个(amd64 pdp10 pdp8 pdp1 nova mix mmix ibm1401 lgp30 risc-v hexagon)。Dragon Sector的一度被主办方查封,但后来恢复。应该是利用了题目漏洞(各个架构共用同一个flag、没有sandbox隔离两个并发的连接),由一个amd64连接读到的flag往另一个进程的模拟器进程写stdin或stdout,后来与主办方交涉后判作合法了。赛后记者问zardus自己有没有试过能打多少架构,他巧妙地避开了这个话题,回答说每个架构都试过能打。(但是组合起来就不知道了,PPP的非漏洞正宗5个架构很棒)

12:40看起来我们的twoplustwo补好了, Dragon Sector、PwnThyBytes、koreanbadass、r3kapig、pasten、Spaceballs似乎没补字节码注入。 13:00发现新题oooeditor 1234Description: The vim vs emacs religious war finally comes to an end. The Order has mandated the use of OOO Editor. Flag location is /flag, and you may patch up to 10 bytes in the oooeditor binary. The binary is available from oooverflow.io/obey/oooeditorYour IP: 10.13.37.22Port: 8297Type: NORMAL 这是一个酷似radare2的服务,几乎可以肯定是defcon.org官方网站介绍页面的lzcnt ("one of the principal developers of the radare2 binary analysis framework")出的。

如果是非Ubuntu 18.04的Debian系环境,没有libgnustep-base1.25,可以r2 oooeditor -wqc 'w 4 @ 0x4009a7'把DT_NEEDED字段patch成1.24运行。 12345678910% ./oooeditor[0x00000000]> lsa.png b.jpg c.elfd.bz2[0x00000000]> o a.png[0x00000000]> p 461 2E 70 6E | a.pn[0x00000000]> p 4 @ 270 6E 67 68 | pngh[0x00000000]> 这个服务用GNU Objective-C编译,链接了GNUStep,大家都不了解这个。在北京远程参与的hankein95推荐我们阅读http://phrack.org/issues/66/4.html。

我们很快注意到了out-of-bound read/write。

15:08 PPP first blood。15:17发现还没有人修补oooeditor,我就用r2修补了一下: 12if ((signed int64_t)file_size > offset) file_contents[pos] = byte; 处的-Wsign-compare问题。

16:20出现新题poool,混入了区块链元素,挖矿赚钱兑换flag: 1234pooolDescription: pay per share stratum mining pool. You may patch the poool binary. Each team may only submit 5 patches. Choose wisely. Flag location /flag. Flag format: 000[A-F0-9]{45}. Files available at oooverflow.io/obey/poool.tgz.Your IP: 10.13.37.22Port: 10001 赛后slipper说:

不利用漏洞,烧钱开服务器用4096核可以兑换到flag 有个type confusion漏洞 有个-Wsign-compare漏洞,可以直接拿flag 用scanf读取nonce,可以算一次提交很多遍

大约有半小时套房内极路由和有线网断开了。

我们能攻击PwnThyBytes的oooeditor。

18:20出现新题bew。是使用Node.js框架Express.js的web服务(在DEFCON CTF Finals上非常罕见,传统上只考硬核的二进制攻防)。 1234Description: Finally the Thought-CyberCrimes Reporting System is up and running. Report your suspects now, because in the new era even thinking about a cybercrime is punishable. You may patch the express-validator.wasm file. Flag location /flag, and you may patch up to 1024 bytes. Download the service from oooverflow.io/obey/bew.tar.gzYour IP: 10.13.37.22Port: 5080Type: NORMAL

里面用的node_modules/express-validator和实际1.0.0版本不同,多了wasm模块node_modules/express-validator/express-validator.wasm,index.js也有很多集成wasm到js的代码。 routes/data.js(/report)可以写入public/suspects.txt routes/suspects.js(/suspects)会读取public/suspects.txt

我们把三个web手唤醒。大家使用wabt等工具分析。Day 2结束后尝试了各种web application firewall逻辑检测恶意代码执行。

18:00多似乎所有队伍的oooeditor都修补了。 19:00主办方宣布oooeditor有pcap了(实际上已经没有用了) 19:15主办方宣布DEFKOR00T first blood了poool。后来得知他们这天就利用了poool的两个漏洞。 19:20宣布每个队伍今天只能修补两次,原因是stratum mining很耗资源(后来得知命题人slipper有个在HT后96核系统上运行2 3分钟的解法,而一轮时间仅为5分钟) 19:27发现PwnThyBytes攻击TokyoWesterns的bew获取了first blood。很快koreanbadass和mhackeroni也能攻击这个服务。

因为开赛浪费了两个小时,主办方把今日比赛从20:00延长到21:00。

20:30出现新题vchat,是个使用gloox的XMPP client。 1234Description: The Order of the Overflow has assigned you a personal virtual assistant. Obey the assistant. You may patch up to 100 bytes in the vbot binary. Files available at oooverflow.io/obey/vchat.tgz **AND AT oooverflow.io/obey/vchat-hint.tgz**. This is a client-server service. The Order runs the *client* on your vulnerable image (on port 2555); the server is on port 5222.Your IP: 10.13.37.22Port: 2555Type: NORMAL

21:00主办方召集各个队伍的队长开会。zardus提到了一些问题:

开赛推迟 pointless服务的问题。不过这个名字起得不错,掩饰/解释了这个服务的众多问题。 用于上传patch的git服务的可靠性。第一天结束后连夜赶做了portal页面提交patch的功能。 防御分计算bug。每轮每个服务没被攻击即可得分,但因为一个bug导致每个服务都没被攻击才得分,会修复。 12- was_service_exploited[service.id] = True+ was_service_exploited[event.service.id] = True 应该还有一些,但我记不起来了

我后来配置了一下XMPP server prosody,不懂XMPP,发现很难和vbot通信,不知道怎么把anonymous模式和starttls调好,倒是发现一个XMPP client profanity高仿irssi/weechat,看起来赏心悦目。后来BrieflyX弄出一个自制简易server可以与vbot通信了,但众人看不出漏洞。赛后知道gloox cache可以导致use-after-free。

8月12日Day 3

2:34 f1yyy说poool可以堆任意读了,6:00多说可以读flag了。

10:00比赛开始,按照惯例,为了留悬念,今天不展示积分榜,但仍然能看到exploitation events。poool的patch次数取消了。我们发现没有队伍能利用vchat。主办方给了vchat的提示,服务端配置是ejabberd SASL ANONYMOUS。

bew主办方把权限配置错误了,有个队伍把其他队伍的文件改了,也有Denial of Service问题。大约12:00主办方关闭了bew。我们研制的若干个bew exploit浪费了。我们的修复也无效TOO_MANY_BYTES,cxm wupco在修复时偷懒寄希望于主办方使用edit distance判断字节限制,很可惜。

发现新题reeducation,是个带符号和调试信息的Rust执行档。 1234Description: You have arrived at the OOO re-education center. You may patch up to 16 bytes in the reeducation binary, available at oooverflow.io/obey/reeducation.Your IP: 10.13.37.22Port: 1221Type: NORMAL

f1yyy的poool exploit可以攻击17个队伍。后来发现有个if ((signed __int64)tmp



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3