NKOJ:面向答案编程
兴趣使然 Lv1

说实话,我一直想着某一天攻入南开的服务器,然后运行echo “hacked by XXX” > ATTENTION.txt,XXX是我的好朋友的名字缩写。可惜能力有限,未曾成功过。

起因

近日,密码学实验课开始,在nkoj上布置了一道密码学题目。

于是我登上了许久未登的OJ

吐槽一句,为什么把我的三叶换成了这个图,管理员没一个二次元吗?

image-20231012203857986

我还是喜欢这张

Miyamizu_Mitsuha_Reading_C_Programming

尝试

上学期学了点文件包含漏洞,加上之前在一个机器学习oj网站上成功getshell进入过后台服务器,说起来那时算是第一次实战,只不过可惜漏洞很早就被别人发现了。

在NKOJ上尝试了很多次都没能成功。

主要是利用payloadallthethings仓库中的各种语言的reverse shell代码进行尝试。因为oj本身可以运行程序,就相当于一个任意命令执行的机会。但是尝试了根本没成功过,基本上只试了python和C++,但是本地的ncat一点反应都没有。遂放弃。

但是并非一无所获,至少收集到了一些信息。

意外之喜

发现OJ只有在产生编译错误的时候才会出现查看按钮

image-20231012204941981

于是打开开发者工具看看是不是有的没显示出来。找到返回的json信息,结果发现只有当答案错误的时候会多显示点detail

image-20231012205100864

然后就可以知道oj的基本逻辑是用/var/www/data/problems-data/4/1.in作为输入,输出和/va/www/data/problems-data/4/1.out对比。4是问题编号,hello world对应的是4号问题。

加上之前的一次编译错误暴露出文件目录,得到了相对位置。

image-20231012205549443

联想到刚学习的编译原理,在第一个预处理阶段,会把包含文件直接替换成对应的文件内容,那这样的话就可以通过包含对应文件,利用编译报错获得文件内容了。

最初我的想法是直接包含别人写的代码文件,那岂不是就直接利用别人的作业通过了。

image-20231012205904284

但是权限不够,只能退而求其次去读输入输出了

image-20231012205920163

于是就通过这种方法获得了对应题目的输入

image-20231012210419079

image-20231012210427705

这样的话,我们就可以写一段万能代码,对于所有的问题,将实际输入和每一个可能的输入文件对比,完全相同时就输出对应的输出文件。

心灰意冷

后续,我利用这个漏洞,又尝试读取很多linux的敏感文件,要么是权限不够,要么是完全没有可用信息。对于很多文件,读出的内容都很反常,不像是一个正常的linux服务器,于是我就怀疑这是否是运行在docker上的

读了/.dockerensdav,系统没有编译错误,这说明这个文件是空的,但是确实存在,于是证明了它运行在docker,遂放弃了更深的渗透,毕竟我连docker都不会,还得花好一会儿学。

再后来,我尝试查找1号用户,找到了他的学号,应该是个管理员,恰好又在我好友列表中。于是从github搜索他的用户名。

出乎意料的,这OJ居然是开源的

image-20231012211112483

顿时发现小丑竟是我自己。