网吧网管如何在 DEF COOON CTF 中存活

全文都是流水帐writeup没什么关系

俗话说的好别人的作业交的越晚能抄的样本就越多并不

因为个人参与度的问题就不多讨论Quals只谈四年里参与过的Final

Oh, Take Me Back, My Timemachine

在大学是跟着big1cewilson师傅通过CTF接触了安全领域打了一些比赛虽然成绩不太好但自我感觉还不错

工作之后因为一些机缘巧合的因素开始参与 DEF CON CTFDC CTF的题比较难起初做逆向他们往往让我的F5没什么用机器码也看不得后来看看Pwn和流量各家神仙的payload也看的紧exp也很为难所以过了几天又觉得自己干不了这事幸亏荐头的情面大辞退不得便改为专管网络的一种 无聊并不 职务了或许这就是网吧网管的宿命罢(neta结束)

The Order of Overflow2018起开始作为出题人直到2021年结束我则从2018 Final逐渐参与到这一局游戏中2018年的事情几乎没有留下太多印记只记得几个同事在Flamingo的房间里逆向以及同事D在赛前帮我回酒店拿了一份快递记忆消失了一块有点可惜直到长大后才会明白有些东西如果不记下来就会随风飘逝

Summer Night Wind

实际2019年本来是会在国内参与后勤做题的只是没想到有同学的签证没有过原本在做运维的Azure需要被解放去做题想当年我还在做某方向的商业测试项目人呐就都不知道自己不可以预料一个人的命运啊当然要靠自我奋斗但是也要考虑到历史的行程我绝对不知道我作为一个包邮区的测试工程师怎么就把我当作主力运维选到Las Vegas去了所以Azure同志跟我讲话中央已经研究决定了后来我就念了……

和你们想的不太一样后来我就因为担心协作平台R不够稳定跟他在会议室拍桌子吵了两个小时此处音量-20dBm

事情是这样的DC 26我们引入了一个新的协作平台R这是一个非常富有远见的做法试图解决在CTF这个特殊场景下多人协作的问题实际上后来我们也发现在其他队伍示例1示例2示例3中也引入了类似的实践侧面说明Azure还是很牛逼的而也是因为大家对平台的期望很高导致DC26中出现了一些影响访问的问题打击了大家对协作平台的信心不过还好在赛前AzureMr. Robot完成了部分后端代码的强化工作并在比赛之前完成了核心模块的测试工作我则从公司出发带着

  • 一台用作路由器的BPI-R2以及作为备份的树莓派
  • 一台支持VLAN的交换机防止OOO的网络配置和DC26不一样当然事后证明多虑了
  • 一块将近160Wh的蓄电池足以支撑上述设备在没有电源供应的情况下满负载工作几个小时航空公司竟然真的让我把电池带上去了
  • 以及一些笔记本和摄像头用来协助做现场监视

在提议将热点名称改成Tea Receivers就收拾东西准备迎接正式比赛了DC 27是分布式布局CTF场地是在Planet HollywoodMezzanine不过和其他国内队伍差不多我们的人员也是分在三个点现场酒店套房和国内支援三点之间靠OpenVPN组成了一个大内网内网和主办方的内网互通此外为了保证协作平台R正常运行需要维护用来执行攻击任务的脚本Ra和用来解析主办方题目状态的脚本Rp那么作为运维的常规工作就很清楚了维护好内网维护好bot应对一些奇妙的新网络需求顺便水个签到题

第一天过去布好网络后最大的感受就是这空调开的真足加上楼下人不多没人帮我挡风感觉腿好冷不知道是不是酒店要照顾楼下在赌博的大爷大妈们……网络方面除了因为Google一如既往的对酒店网络访问Google DNS做了干扰其他一切正常所以作为国内队伍自然祭出了114.114.114.114除了一些服务被d服务下线服务被d后下线之外的小插曲外第一天的比赛就结束了

第二天的比赛主办方一大早就给每个队伍发了一个xbox 360说要把这个连到主办方的网络上来完成题目dooom接上显示器后发现显示器应该会走DHCP拉一个IP地址于是重新配置了下交换机将网线分出来一条接到了xbox同时把xbox的包抓出来分析了下但不巧的是因为自己手滑把路由器的一些配置写错了再加上主办方似乎应用了DHCP限制导致我们大概有半个小时左右的时间没法从DHCP拉到IP后来分析这个DHCP限制应该一部分原因是由于xbox本身是通过DHCP拿到IP去找网关启动的可能他们认为网络上过多的DHCP请求会间接加重服务器负担所以就做了一些限制有趣的是此时也似乎恰好赶上了主办方自己的网络出现问题从中午11点多开始scoreboard的可用性开始下降一段时间后完全不可用

网络恢复后开始和来楼下的同学一起看这个题分析流量后认为应该是可以通过我们自己的DHCP服务器xboxbootloader下发一个新的固件达到patch于是飞速重新划了个vlan启动dhcp服务器跑起来队友的脚本之后就是常规的逆向patch打人的操作了可以把KoH当作Pwn来做了不过Zach大师的writeup也介绍了他们的方法只能说毕竟是老牌队伍这都能干这么多分自叹不如……

美好的做题时光总是短暂的jackyx开心的游戏时间虽然没有nb的枪也走到了尾声dooom在被HITCON拿了一堆分数后很快就离开了我们rip而我的网管任务也在第三天来到了尾声第三天和前两天一样没有什么变化只是在实践中发现攻击脚本Ra的运行不仅不够平稳规则也不太灵活因此后面的一两个题现场好像还是依赖人工打出去的

我是在酒店看最后的颁奖典礼的结果算是差强人意但在比赛结束时也多多少少有预计到会是这样的结果因为准备和朋友们去黄石玩所以跳过了一些有趣的party和自助餐环节直奔机场了事后想了下

  • 从来没有预计到DHCP竟然会成为卡点
  • 酒店网络实在是糟糕也不知道明年会在哪个酒店头大
  • 今年攻击脚本没有发挥出最大的效用表面原因还是大家的习惯问题但深层原因是协作本身的成本就很高
  • 类似的和我们一样Tea Delivererswriteup中也有提到idarling也需要改进在赛前我们实际花了很多时间和精力处理idarling相关的问题相信TD也有但看来无论是我们还是TD都没有达到符合预期的成果深入思考后我觉得核心问题在于IDA的重交互让实现协同逆向这个目标的难度过高了

Baba O'Riley

实际去年在去DEF CON之前感觉或许DC27是我为数不多的几次DEF CON因为周围的环境已经和之前不一样了然而万万没想到环境不仅变了变的还很剧烈以至于干爽的夏夜晚风变得燥热和阴湿

在这次Cancelled DEF CON国内的疫情基本上得到了有效控制所以最后决定在公司的会议层把线下参与的所有同学召集起来羡慕麦香的大别野因为今年整个DEF CON都是线上版本所以CTF的时间也被划分成了四个赛段基本上几个主要大陆的白天和晚上都包含进来了对运维的好处就是因为不需要考虑套房网络这个最不稳定的因素所有基础设施都可以放在云上了此外按照去年的经验以及我们观察到的OOO出题特征感觉攻击脚本Ra和状态解析器Rp所带来的成本会大于收益因此决定在比赛中仅使用协作平台的基本功能

纯远程的比赛大概需要考虑的就是这么几个部分

  • 和比赛方网络的连接按照OOO给出的指南我们会通过一个带有wireguardjumpbox接入比赛内网考虑到美国云市场的情况估计他们用的就是aws所以在云上提前买了美国的机器用来写入wireguard配置
  • 选手接入网络由于大多数选手都在国内因此需要准备好国内的VPN服务器并提前分发配置信息此外因为在美国也有同学参与比赛也需要准备给他们的VPN服务不过需要在服务器上屏蔽掉对方的IP地址防止国内同学误接到国外VPN或者反过来导致被GFW封锁
  • 我们自己的服务设施根据业务特性的不同服务器可能需要在不同的地点比如协作平台的主要用户在国内因此相关服务要部署在国内的服务器上而有些exp对延迟要求比较高比如涉及到侧信道的攻击方法因此需要在国外也准备服务器
  • 中美服务器网络的Peer因为所有的服务都部署在上考虑到中美之间的网络本身就不够稳定我们果断决定借用〇〇〇提供的专线将国内和国外的两个云内网接在一起

大致决定好了基础网络架构后用一个下午的时间设置起了整套系统以及重启后的恢复措施保证不会因为一些奇怪的母鸡问题导致VM重启后长时间中断业务顺便加了一些安全策略并将所有服务器加入了Netdata然后就静待OOO的配置了整体的网络架构大体是这样了


                              +---------------------------------------------------------------------------+
                              |                                                                           |
                              |                       >Other players in our team<                         |
                              |                                                                           |
                              +-----------------+----------------------------------+----------------------+
                                                |                                  |
                                                |                                  |
                                                | OpenVPN                          | OpenVPN
                                                |                                  |                     The `dc28-redir-controller`
                                       +--------+------+                    +------+--------+                 is deployed here
                                       |               |                    |               |
                                       | VPN Endpoint  |                    | VPN Endpoint  |                        |
                                       | for CHN users |                    | for USA users |                        |
                                       |               |                    |               |                        v
                                       +-------+-------+                    +-------+-------+
                                               |                                    |                  +---------------------------+     +--------------------+
                                               |      bandwidth and ACL limited!    |                  |                           |     |                    |
                                               |           save some money  ;)      |                  |   Jumpbox, config copied  +-----+  OOO's WG endpoint |
                                               |                |                   |            +-----+    from OOO's machine     |     |                    |
                                               |                |                   |            |     |                           |     |                    |
+---------------------------------+            |                v                   |            |     +---------------------------+     +--------------------+
|                                 |      +-----+-----+                        +-----+-----+      |
| CPU-intensive applications      |      |           |      QoS Promised      |           |      |
| since EPYC servers are only     +------+  Gateway  +------------------------+  Gateway  +------+     +------------------------------------+
| available in CHN available zone |      |   China   |  MPLS VPN? not sure.   |  U.S West |            |                                    |
|                                 |      |           |  110-130ms, <0.1% loss |           +------------+ Latency-aware programs             |
+---------------------------------+      +-----------+                        +-----------+            | &                                  |
                                                                                                       | Traffic-heavy programs (like pcap) |
                                                                                                       | Reduce costs under the ocean       |
                                                                                                       |                                    |
                                                                                                       +------------------------------------+
                        - All connections are using WireGuard unless specified.
                        - Netdata is installed on all machines so we can do remote telemetry
                          and receive alarms.

在比赛前突然想起来OOO有提到过这次比赛会有NormalStealth两种端口方式因此和spacedadong临时赶工做了一个转发控制器保证不会因为手滑打错端口上线后大家的反响还不错而且从赛后听到的一些情况看的确有的队伍出现过打流量打错的情况第一轮打Normal之后就开始打Stealth侧面证明这个工作还是有意义的

OOO方面因为这次是一次云原生请允许我滥用下这个概念CTF因此他们也引入了一些措施包括

  • 私有题目实例导致就算你能D别人其他队伍也不会被影响而且OOO原本就会手动检查patch这无疑进一步加重了运维同学的工作量也带来了一些问题但可能更多的是他们的经验不够丰富因为在〇〇〇和〇〇〇〇等公司的CTF平台中为了阻止一些老搅〇棍以及我这种乐于看戏的获得乐趣就引入了这种方式
  • 打到600flag就下线服务结合之前的分段下线这个很好很活跃气氛而且实际上给了队伍更多动力能否找到更奇妙的利用方式能否找到更奇妙的洞

云原生的好处就是OOO的资源几乎是无限的depends on your credit card但坏处就是往往让人对架构过于自信以至于忽视了一些原生运维中遇到的带宽等问题结合他们之前的一些Devops问题总的一算确实给这次比赛的体验带来了一些影响实际和他们一样我也犯了一些不大不小的错误不过好在没有影响最终结果对大盘有比较严重影响的就是在比赛中间预设的网络报警弹了下起初以为是偶发抖动后来发现专线丢包率可以达到10%以至于影响到了队友打exp登录监控系统发现为了把流量发回另一个分析系统进行分析和重放20M的专线带宽被占满了因此临时把专线带宽限制提升到了100Mbps不过还好比赛后就没有发生类似的情况至于服务器爆内存等基本都通过云上的快速资源扩容解决了没有收到太多的影响甚至还充当人肉打字员帮做crypto的同学打了几圈直到题目下线此外赛中做KoH的同学提议是不是有个面板能看到得分历史比较好一些想了想也有道理但即便写了解析脚本Rp也不太好实现这个功能索性用一些现成工具快速搓了一个上线效果还不错感觉自己也算是DevSecOps一把了你说看不到Sec在哪里我不是有配iptables

因为赛中大家基本都在会议室感觉会议室会变的很热虽然有空调所以大部分运维工作都是在工位通过线上会议完成的虽然在最后的十几个小时到会议室跟着看了几个题但基本上已经错过了整场比赛最有意思的部分Manchester Dataflow Architecture数据驱动的思想虽然让我有点不怀好意的想起了某理论但仔细想了下这个思路其实和六七十年代的模拟计算机有一点关系Compiler理解成电路图后也大概能了解一些题目的意图了感觉如果用电容和电感搭一台这样的计算机应该是一个很有趣的挑战途中还去围观了下pinboool的题感觉可以通过scoreboard上的那个长的很像CFG的动画映射到真正的程序执行流上然后就有队友做出来了md好强虽然两者有一定差别不过还是对这个题起到了一些帮助一边看题一边想这个东西对思维模式的冲击还是很大的出题好用所以明年估计还是会用没想到一语成谶……

最后投入时间比较长的是gameboooy这道题也恰好因为自己对gameboy比较感兴趣指在工位抽屉里有一台山寨的gameboy就跟着过去逆了一下把涉及到VRAMROM的一些东西逆了一圈确认了GPU的工作过程和原生的ROM没有太多差别但没找到任何有帮助的东西百思不得其解最后搞得会议室里众人十分萎靡dmxcsnsbh说这应该是一个不知道为什么被出错了的条件竞争而我不信最后证明他的想法是对的的确是一个条件竞争但似乎是因为编译器优化的原因被吃掉了

比赛结束后会议室里的气氛并不算特别好因为结果实在不好确定直到成绩最后公布的那一刻Zardus宣布成绩的gif其实还没反应过来直到听到第二名是PPP才意识到是自己第一听到自己被宣布是第一名时就激动了甚至把旁边几个会议室开会的人都吓了一跳抱歉……

总之开心是很开心赛后想了下

  • 疫情控制得当在这次比赛中显然演变成了主场优势但人多带来的沟通问题和人力浪费问题也超过了预期
  • KoH的确很有意思虽然被打的有点惨但真的有意思比攻防有意思虽然会被人吐槽不纯粹
  • 传数据包这种典型的大流量业务应该走公网的不应该出问题后才扩容浪费了一些预算而且影响了业务
  • 监控指标应该再精细一些且占用带宽长期高于一定程度的话就应该先扩容了不应该等到丢包的地步
  • 缺少更精细的流量调度能力不过说是这么说到底要怎么调度也没有想好……
  • 协作方面协作工具实际上并没有太大变化而且甚至都使用起了微信群个人觉得这个东西是真的不堪用不仅沟通效率低新来的人也不知道上下文而且这个小而美的应用可真的是……
  • 不过语音会议真的是个好东西以至于在DC结束之后如果需要远程工作的场合都喜欢挂一个会议软件在线上这样别人要叫我的话只要加入会议就可以了

一边开心一边在想明年的CTF要怎么办呢也算是比较深刻的领会到了美国的联邦制特色不同州的控制力度截然不同在当时也完全看不出两国边境重开的迹象总之一边怀着对边境重开的美好期盼一边沟通badge的邮寄事项一边思考明年的CTF有什么可以做

所以最后请吃饭了嘛

I Don't Wanna Leave Tonight

到了今年事情变得更糟了有关部门甚至暂停了护照签发两国关系也每况愈下和朋友之间的正常邮路被干扰邮局的朋友也说从美国的退包变多了以至于直到今年的Quals之前还没收到奖牌索性不想这些安心准备比赛

新的网络

相比于前几年赛前组织的几次专门比赛今年Quals前大家基本以其他CTF作为练习和娱乐的方式仅在Final前一周举办了一次测试赛以便新同学习惯环境今年的比赛采用Hybrid模式线上和线下同时进行根据主办方提前发过来的邮件接入比赛网络的方式似乎和去年一样是通过jumpbox里的一个wireguard配置文件设置好路由表所以今年在云端的框架也基本和去年类似不同的是经过之前在其他业务上的一些测试我对云服务上的VPC能力更有信心了因此决定今年在云端除了必要的peering比如和主办方peer其他流量都通过云上的虚拟网络来解决这也算是云原生CTF ;-)

此外由于在Quals不常驻在公司的同学反馈链接公司网络过于麻烦需要绕来绕去而且带宽也有限因此在Final前我决定除了保留原有的VPN接入方式作为备份外还是给大家部署一个专用的无线网络比较好这也是今年的网络部署和去年最大的不同整体拓扑就变成了这样

                          +---------------------------------------------------------------------------+
                          |                                                                           |
                          |                       >Other players in our team<                         |
                          |                                                                           |
                          +----------+------------------------------------------------+---------------+
                                     |                                                |
                                     |                                                |
                                     | OpenVPN                                        | OpenVPN
+-----------------+  +------------------------+                            +---------------------------------------------------------------------------------------+
|                 |  |      +---------------+ |                            |   +---------------+                                                                   |
|                 |  |      |               | |                            |   |               |                                                                   |
|  Meeting Rooms  +---------+ VPN Endpoint  | |                            |   | VPN Endpoint  |                                                                   |
|                 |  |      | for CHN users | |                            |   | for USA users |                                                                   |
|                 |  |      |               | |                            |   |               |         The `dc28+redir+controller`                               |
|                 |  |      +-------+-------+ |                            |   +-------+-------+              is deployed here                                     |
+-----------------+  |              |         |                            |           |                                                                           |
                     |              |         |        QoS Promised        |           |                             +                                             |
                     |              |         <<-------------------------->>           |                             |                                             |
                     |              |         |    MPLS VPN? not sure.     |           |                             v                                             |
                     |              |         |    110+130ms, <0.1% loss   |           |                                                                           |
                     |              |         |                            |           |               +---------------------------+     +--------------------+    |
                     |        +-----+-----+   | bandwidth and ACL limited! |     +-----+-----+         |                           |     |                    |    |
                     |        |           |   |      save some money  ;)   |     |           |         |   Jumpbox, config copied  +-----+  OOO's WG endpoint |    |
                     |        |   Other   |   |                            |     |   Other   +---------+    from OOO's machine     |     |                    |    |
                     |        |  Servers  |   |                            |     |  Servers  |         |                           |     |                    |    |
                     |        |           |   |                            |     |           |         +---------------------------+     +--------------------+    |
                     |        +-----------+   |                            |     +-----------+                                                                     |
                     |                        |                            |                                                                                       |
                     |     Cloud VPC - CN     |                            |                            Cloud VPC - US                                             |
                     +---------------+--------+                            +--------------------------------------+------------------------------------------------+

                    + All connections are using WireGuard unless specified.
                    + Netdata is installed on all machines so we can do remote telemetry
                      and receive alarms.

mamamiya10那里打听到和去年差不多本次比赛会用到会议楼层的5间会议室每间会议室大概是6mx8m的样子外网方面不巧的是由于一些大人的原因每条外网链路的带宽只有40Mbps而且需要为每条外网链路单独引一根网线不是光纤在这根网线上只能有一个mac地址但幸运的是这些链路的数量是基本不受限制的此外在用户接入方面最好能让用户直接接入到比赛内网中

赛前整理了下手中的材料似乎有

  • 比赛前从淘宝买到了一台6端口的杂牌软路由
  • 在仓库中挖掘出若干态TP-Link入门型家用无线路由器
  • 一台由Azure留下的无线路由器装好了openwrt在往年的比赛中这台路由器是放在酒店房间的
  • 原本被用来 拆解 测试的一台H3C S51xx的三层交换机24个千兆电口4个光口

除此之外在京东上买了一些网线地毯胶带之类的耗材

网络部署方案则相对从简

  • 从各个地方接出10条公网网线接入交换机上
  • 软路由作为网关使用全部网口和交换机做bonding连接lacpL2+L3 hash并透传所有VLAN
  • 在交换机上划分出四类VLAN分别用于
    • 用户接入1000
    • 流量路由1500
    • 网管500
    • 与公网上游互连1200-1300
  • 每个房间各部署1个无线路由器当作接入点使用链接到用户接入VLAN并通过调整接入点信号强度保证终端尽量落到最合适的接入点上
  • 用交换机承载接入业务DHCPDNS转发三层路由到网关并实现部分ACL
  • 刚好剩下两个网口在路由设备所在的会议室用有线预留几根网线供紧急情况下接入网管段或进行流量镜像使用

因为所有VLAN都被透传到了网关所以和公网互连的工作也要由网关负责通过ECMP可以保证不同的会话被分配到不同的外网链路上从而让接入到网络中的用户能够分担不同链路除此之外就是一些常规的SNAT防火墙配置等工作

但仅通过ECMP并不能实现带宽的有效利用因为在比赛中需要优先保障的是会议层用户和云上服务器之间的高带宽OpenVPN只会有一条TCP链路因此经过比较了一些方案的性能后我决定使用MPTCP作为会议室网关和云上互联的三层协议由于我们需要通过OpenVPN实现对接因此除了更新到较新版本的内核外还需要将已有的OpenVPN程序适配到MPTCP由于时间比较紧张在不熟悉程序的情况下重新编译程序比较麻烦因此我决定使用systemtap修改系统调用的参数也可以使用LD_PRELOAD实现此目的从抓包中便可以看到服务器和客户端之间已经带着MPTCP相关的协议头在公网链路上进行三次握手了

带着mptcp的三次握手

理论上只要给服务器再增加一些公网IP就可以让mptcp在多条链路上建立通信从而发挥ECMP的负载均衡作用实现VPN内的高带宽和强可靠性了但在我们的场景中仅是这样还不足以让mptcp发挥作用因为在我们的云服务器中由于采用了私有网络因此服务器上网卡的IP地址都是某个子网的私有地址而非这个网卡对应的公网IP为了在不做重度修改的情况下让通信双方发现服务器所具备的公网IP还需要使用ip mptcp endpoint命令进行一些修改这样就可以了我们选择了两条链路作为测试如图

可以突破单线带宽

除此之外吸取了去年的教训对传数据包这种重要性一般但代价极大的业务用公网定期rsync对其他一些反馈过的问题也做的调整此外除了将所有服务器加入netdata本次也在netdata上配置了更多的监控告警规则防止发生网没了但自己不知道的尴尬情况

在决赛前一周的练习赛前上述网络就已经准备好了但在练习赛中有同学反应自己上网非常困难经过检查感觉是交换机的DNS转发服务如果直接使用公网的DNS服务器会有问题因此我决定在网关上加布一个SmartDNS作为缓存服务器将查询转发到这台缓存服务器上flag1调整后仅有零星几个请求出现了问题我感觉应该是偶发问题可能和对端有关因此没有深入看flag2不过当时也没想这么多训练赛结束后将所有用到的命令脚本等整理到一个在线文档后就开始等待决赛现在回头看没处理好这两个flag给比赛中的基础设施带来了不少麻烦幸亏有这个在线文档救了一命

A-roll

决赛那周的周一晚上因为一些其他事情我不得不临时离开比赛地直到比赛开始的六小时前我还被堵在首都机场高速上在此期间在现场的ramboudigle等大佬们已经从我零散的文档中推断出了一些网络规划并已经帮忙大致铺设好了遍布五个会议室的所有网线总长度约300比赛前一小时我终于回到了比赛现场马上打开电脑开始部署借助之前整理好的在线文档完成了启动顺便帮忙整理了剩下的一些网线总算是没有耽误比赛但原本在比赛之前预留的一小时网络测试时间就不见了

因为今年是线上线下混合模式的比赛所以和往年的线下比赛一样分三轮进行setup时间是每天凌晨0为了保证线上队伍和线下队伍有尽量公平的环境OOO要求所有队伍都使用jumpbox接入比赛网络他们的服务也都部署在云上按照往年的经验DEF CON现场的网络不是很稳定偶尔会有奇怪的断网行为但估计是因为疫情影响没有太多队伍在Discord频道里反馈有断网的问题

周六凌晨一点比赛开始但随后大家就反馈访问网络断断续续的从抓包结果看似乎依然是DNS问题登上交换机一看原来是训练赛时候设置的DNS没有保存还在往外网的DNS服务器发送请求因为DNS是工作在转发模式所以修改配置后可以立刻生效但似乎依然不能访问team interface不久Zardus在公屏通知大家比赛因为网络问题延迟一小时开始并顺手发送了第一道题目PPPWriteup里大概介绍了这个题目很有趣赛后我也玩了一会不过在比赛时完全没有时间顾及这道题目因为要在服务器上跑起来各种脚本

在若干脚本中其中一个脚本是负责获取当前比赛信息的OOO的比赛中所有数据会通过一个game_state.json提供出来我们则用一个非常简单的while true; do ... done每隔一段时间抓取这个json并将解析后的结果输出给其他服务按照正常的放题规律在比赛初期这个文件应该只有几k大小因为放出的题目不多不过出人意料的是第一次运行脚本就拉下了一个1MB的文件还没等开始分析这个文件就看到Zardus在公告频道说PPP已经发现了这个问题并通知了主办方文件泄漏是他们不小心将测试文件放到了生产环境中因此为了公平起见他们决定公布这个泄露的json文件不久后的captain meetingZardus也说原本600Flag即下线服务的机制可能会暂时取消了

不久后比赛开始但又有人反应访问外网出现问题查了半天发现是那台Netgear路由器不知道怎么回事二层表现很奇怪用户间不能互相访问而且在网络上乱发一些二层报文感觉可能是要寿终正寝了加上感觉来的人也不多甚至有一个会议室是空的索性把空会议室的路由器挪用过去就解决问题了回到椅子上感叹可能网管就是这样吧用最简单的思路解决最低级的问题……

没等感叹完又有人报警了而且是连同自己的监控脚本一起报警的是访问外网偶有超时链接不上等等不过对到比赛网络的VPN链接没有影响看了半天流量和抓包结果没有头绪感觉是偶发问题但在部分同学的机器上甚至无法访问网络像极了在测试赛中的那个没有回收的flag因为流量比较大大家也都在比赛找用户抓包显然是一个不太讲道理的选择考虑到只影响一部分用户且不影响比赛流量感觉还是等这一轮比赛结束后再处理比较好索性让有问题的用户先用VPN自己也不准备再看题了还是看网络情况保证大家能做题比较要紧直到第一轮比赛结束没有太严重的问题

第一轮比赛结束后趁着大多数人都去睡觉用户不多开始修网此前提过为了实现对多条外网带宽的负载均衡我们使用了ECMP同时也使用了MPTCP一般来说在这种情况下要使用策略路由然后设置好这样的路由表

# route table eth1, gateway 192.168.1.254/24
default via 192.168.1.254 dev eth1 src 192.168.1.1 table eth1table 
192.168.1.0/24 on link  table eth1table ...

# route table eth2, gateway 192.168.2.254/24
default via 192.168.2.254 dev eth2 src 192.168.2.1 table eth2table
192.168.2.0/24 on link table eth2table ...

并添加这样的策略

3000: from 192.168.1.1 lookup table eth1table
3000: from 192.168.2.1 lookup table eth2table

这样的目的是保证流量被正确的发送到对应的网卡上这样理论上我们可以用这样的一条命令来测试eth1这条链路的状况

ping -c 1 --interface 192.168.1.1 192.168.1.254 # test link
ping -c 1 --interface 192.168.1.1 1.1.1.1       # test network

这样在默认路由表中加入一条

default 
    nexthop via 192.168.1.254 dev eth1 src 192.168.1.1 weight 1
    nexthop via 192.168.2.254 dev eth2 src 192.168.2.1 weight 1

来方便的控制路由此外通过使用上面的命令检查链路状态可以在检测到某条链路出现问题时ip link set dev eth1 down关掉从而保证默认路由不受影响然而在抓包过程中意外发现上面两条用来测试eth1网卡的ping命令会在eth2网卡上发出ICMP源地址却还是eth1网卡的源地址由于上游链路的限制比较多这个包显然会被上游直接丢掉使用iptablestrace发现并不是netfilter导致的问题此外前面提到过的systemtap程序仅对openvpn起作用按理讲不会影响ping才对看来是路由层面出现的问题百思不得其解之时查看了下路由表的内容

# ip route show table eth1table
default via 192.168.2.254 dev eth2 src 192.168.2.1 table eth2table
192.168.2.0/24 on link table eth2table ...

很灵异为什么查看的是eth1table返回的却是eth2table突然想起来内核实际并不用名字来区分路由表而是用一个编号名字和编号的对应关系定义在rt_tables打开一看果然不出所料


30    eth1table
30    eth2table
40    eth3table
40    eth4table

不同的编号被赋予了相同的名字……想来是配置的时候太困导致打错字而和云端互联的VPN通道之所以没有受影响是因为我们给云端的VPN通道分配了4IP加上MPTCP的保证只要有一个IP恰好被分配到正确的路由表项上就不会出问题总之这是一个非常低级的错误

修好后感觉没什么事做bigtang师傅叫去看broadcooom帮忙分析了一部分交互逻辑这个题实际上是泄漏出题目的一部分归属于ooows系列从名字也能看出来是做了一套虚拟化的体系而这个题自然是netabroadcom写了一张虚拟网卡可以放在不同的主机上通过mosquittoMQTT实现通信MQTT本质上是基于pub/sub客户端连上服务器后可以对某个topic发消息也可以收某个topic的消息在这个题中MQTT大概是被当成一个二层的集线器hub来用是真的hub发消息后所有人都会收到然后根据发送的idvpcid来决定是否要把数据交给网卡的firmware网卡的firmware比较有意思听其他同学介绍是自定义了一个cpu这个cpu4个虚拟的核执行方式有点像node的事件循环机制A核上会一直处理直到阻塞在队列上然后去B核处理事件循环……大概是这个样子不过我并没看这部分除了让我想起了node.js不由得想起了去年决赛和今年预选赛让我受益匪浅的曼彻斯特机……

B-roll

解决了各种混乱的事情后已经离下一轮比赛开始没多久了第二轮比赛开始后见网络没有大问题就去睡觉了没想到睡了三个小时不到space从梦中叫醒说网络又出问题了从气垫床上爬起来登上网关一看外网链路有一大半处于不可用的状态二层的广播包尚且有反应但三层到网关完全不通想了想应该是坑爹的上游链路问题难道是一段时间没有发DHCP包就会被踢下线于是手动renew一切正常了继续回去试图睡觉幸好不影响VPN链路……

睡自然是睡不了多久的醒来回到座位呆了一会就听到www题目被放出来了此时已经完全不清楚大家都在干什么因为睡觉的时间点不是很对于是跟着看了看space的需求写了个脚本循环检测跳板机上的密钥是否存在如果不存在的话重置密钥和rsync然后拉回流量顺便把网络内到这个题目的网段13.37.0.0/16192.168.0.0/16经过redsocks处理后通过跳板机发走不过工作量实际不多主要的经历都分配在如何在碰路由表的时候防止服务中断以及如何配置redsocks顺便将这个题目的分数单独爬出来灌到数据库里以便可视化使用

想来也是有趣我的网络知识大多拜GFW所赐但基本都在CTF中派上过用场

此外因为KoH的一些脚本耗费资源过大导致内存爆炸因此将脚本单独放到了一台服务器上跑再次证明了预先做准备的重要性……这个题给我的感觉是所有人乘着时光机回到了2003

你手里有一个0day有一个ISDN Modem有一堆没有打补丁的机器你要做什么

主办方后来还说他们还在网内放了几台Windows 2000的机器不过我们似乎因为扫描流量太多所以没发现题目页面也冒着一股西部牛仔的风格总之这个题也的确是很有意思

第二天结束后为了保证第三天的比赛不受影响我临时将专线级别从铁牌改到了银牌此外比赛方面主办方循例放了几道题说大家可以在晚上看看但不确保一定会放题其中一道是ows系列题目的最后一体题hyper-o比赛结束不久后dmxcsnsbh在大群里说这个题有点意思于是我也被吸引过去看了起来

题目本身是一个带有符号的kernel module拖进去一看遍地的VMREAD再结合hyper-o这个neta就知道这应该是个VMM队友拉出了好用的插件我不懂挖洞也不懂linux kernel闲着的话也显得格格不入于是索性开始从Intel SDM22章开始读起学习一点虚拟化技术写一点读书笔记从代码来看出题形式应该也不会很复杂shellcode喂进去就好了但因为题目的init还没有给出而整个ows系列也还没出过race于是我在想会不会有那么一种可能一个连接就在VMM里起一台新的虚拟机……以至于最后困的不得了dmxcsnsbh拉着一起一个个bit的看虚拟机的启动逻辑自然也都是一无所获

为了保证第三阶段我的脑子还在线索性去睡觉醒来后才知道大佬们已经在页表中发现了问题但没来得及写出exploit其他同学从流量中发现了exploit通过写寄存器的方法传输flag虽然只读了一半不过汇编很容易读简单修改后我们就抄好了作业因为这一题的题目始终不太稳定因此决定将受害者分成几组分别打

令人伤心的是作业还抄的不够开心这一题就被升级到了第二阶段这一阶段就和其他题目一样我们需要上传一个完整的磁盘镜像虚拟机会从这个磁盘镜像启动然后运行我们的exp洞虽然修了exp不是很好写jackyx试图写显存但似乎因为一些奇怪的原因没有生效我则从流量中看到了一些可疑的痕迹但要么重放后没有效果要么是因为服务问题无法上传到服务器上OOO中途也重置了几次环境这样不仅负责patchxhj需要重传patch我也要测试下之前传过的镜像是不是可以用……在最后几十分钟由于一些奇妙的原因我们和其他队伍都不能访问自己的实例但可以被打不由得让我想起了去年的bdooos无论如何比赛按照预定的时间结束了在最后几分钟我终于完成了本次CTF个人影响最大的一件事公放The Final Countdown

赛后大家拍合照的时候才意识到今年的人的确比去年多虽然从WLAN的接入数量上没看出来但网络流量基本是和去年持平的可能是因为大家感觉现场公网比较卡都自己找其他热点了……网卡甚至延续到了公布比赛成绩的时候此时现场临时搭建的网络已经撤除我在用会议室的Wifi给大家直播DEF CON TV奇妙的是在公布第四名的时候twitch开始转起了菊花……坏运气真的是能维持到最后一刻最后大家围成一圈space的手机屏幕前看完了整个闭幕式也算是一种别样的体验了

比赛后整理了下服务器上的数据感觉从流量规模上和去年差不多没有什么值得一提的今年由于用了新的网络也带来了一些问题和反思

  • 多备份多测试早上线早测试真的很重要虽然是有一些不可抗力的因素在但一些低级错误比如写错路由表名字还是不该发生的
  • 复杂度太高不好容易扯〇但多尝试总是好事只要不要太影响大家的信心……
  • 赛中为了应付ogx这个题一度找不到服务器看来只靠云也不太行
  • 今年比赛临时写的三四个脚本里其实去年都写过所以资料保存很重要但复用也很重要不过这个意义不大了毕竟明年要换主办方……
  • 流量调度完全没做也没有准备这可能也是www题里大家互相干扰的一个原因侧面说明协作的重要性
  • 服务器之间数据共享也有问题一份流量传N不过还好都是在同地域没有花流量费……

除了网络有点抖动外还为OOO感到可惜的一点是题目泄漏实在是太出人意料了按照这个题目难度遵循600flag即下线题目的规则如果不出意外这些题甚至很可能是大家都做不完的然而木已成舟事情已经发生了也没有别的办法能够补救

在多人协作方面实际很容易观察到人越多维持协作的成本是几何级上涨的idarling等工具在此时带来的麻烦甚至会远多于能解决的问题我们在多人协作的方式方法和工具上作出了一些努力但这还不够可能还需要更长远的设计以及更多的资源投入

Komm, süsser Tod

流水帐很长也不知道有没有人看总之最后姑且作为运维OOO的比赛中存活下来了特此留念希望老了也不会忘掉从网管视角里看到的就是这么多了年纪大了只能看别人做题选手视角的有队友写了一份其他人或许也会写

赛后看到了OOO原始的proposal反复读了两三遍ZardusadamOOO的所有成员必然是配的上inspiration这几个字的Legitbs时代是在探索pwn的可能性OOO时代则是在探索Attack/Defense外的可能性虽然并不总是能像legitbs一样硬核但拥有了更宽广的想象空间在这样糟糕而充满遗憾的被地缘因素和大人们隔离的20年代能参与这样的ctf比赛无疑是OOOCTF社区的馈赠

很幸运能和这样的一群人打ctf感谢几年中为比赛提供支持的mamamiya10等同学能和你们坐在同一块地毯上让我感到很开心感谢space对本文进行的fact check

没有人知道下一届defcon ctf会是什么样的我只希望在逆全球化的浪潮中还能有这样一个有趣的游戏可以玩

不过对我自己来说可能还会夹杂一点额外的私货最近一年自己已经离纯粹的安全研究远了很多我熟悉的CTF也不是五年前的CTF这并不是坏事反而让CTF对我来说更有意义即是认识新朋友的方式也是和旧识们见面的机会引用宋教授的一句话

每年八月放下手頭的工作Las Vegas見故交新知並肩作戰折騰平時不想折騰的軟件速成平時用不到的技能繼續發光發熱(與其讓生命生鏽)享受這段時光

顺便求奖品啥时候能发货

Rainy Days and Mondays

这几周屋外的雨格外的勤开始写blog的时候是周日写完的时候已经是下一个周日了也意识到自己也很久没更新博客了

这可能也是把爱好当成工作的一个坏处虽然还能有余力在工作之外抽出时间做点自己感兴趣的事情但毕竟要考虑到避嫌的因素不能把工作上的事情带到非工作的场合中所以姑且写了点东西但也没发出来

真的写了

另一方面也发现爱好当成工作对爱好多少还是有一些影响的前段时间和同学一起冒着行程信息被公开分享的风险吃了顿饭等位的时候同学讨论的一些互联网产品自己甚至都没听说过上班几年感觉对新事情的嗅觉显著变淡了不知道是因为和身边的人一样患上了互联网公司流行性感冒闻不出有趣的产品还是说这更多是自己的问题只是假托工作的名义罢了虽然也还年轻但偶尔也会感叹自己老了……毕竟接受新事物的能力真的不如年轻人了看看周围还在努力的同学和同事们不由生出一丝愧意鄙人何德何能……

总之过段时间重写下blog现在这样markdown的编写和存储方式也不太容易和自己的其他资料存储在一起最近在学Rust感觉很有意思清风拂面