2016 天翼杯信息安全竞赛决赛的一些经历

得益于初赛我们的好人品,今年又去决赛水了一波。然而最终我们只拿到了第八名,居然还是个二等奖,难道所有的信安竞赛都是 3-5-8 的奖项分配么?比赛的时候没有好好记录做题经过,但是感觉还是蛮刺激的,所以就凭仅剩的记忆,尽可能复原当时的场景吧!

决赛的形式是渗透测试,断网,禁止与外界交流,手机等设备都需要寄存,现场也没有任何可用的无线网(破掉密码也不敢用,万一是主办方的蜜罐呢)。每个队伍都是一个独立的环境,外加一个独立的答题系统和 Hash 查询服务,选手不得攻击靶机以外的任何机器。选手需要使用自己的电脑进行比赛,电脑中允许携带任何软件、文档。

靶机其实是五台服务器,功能如下:

1
2
3
4
5
* 192.168.100.101(下文简写 1):资产管理系统
* 192.168.100.102(下文简写 2):门户网站
* 192.168.100.103(下文简写 3):信息发布平台(论坛)
* 192.168.100.104(下文简写 4):文件服务器
* ???.???.???.???(下文简写 5):某数据库服务器(IP 未提供)

答题系统中有各种题目,都是让我们获取各种敏感信息然后提交。具体答案我已经忘得差不多了,所以只能把当时的过程写一写了。当时我跟 @SummerZhang 一起做,@WolfZhang 和 @黑白 一起做,彼此交流不太够,这也是我们的一个缺点吧。

比赛刚开始,@SummerZhang 就用 Nmap 扫了一下靶机的网段,发现了那个隐藏的 IP 是 192.168.100.245,于是轻松过掉一道题(给出隐藏的 IP 地址)。

1 的端口只开了 22 和 8080,其中 22 是 ssh 服务,对于用户名和密码我们没有任何头绪。8080 打开之后跳转到了一个不存在的网址 192.168.100.101:8080/jxc/,我抓包看了一下,发现其实 192.168.100.101:8080 是正常返回的,里面有一个 key 以及一段网页跳转的代码,于是又拿下一题(给出 1 中隐藏的 key)。这应该算是签到题。然而 1 的其它题目连入口在哪儿都找不到,所以只能看别的服务器了。

很容易发现 2 有一个登录界面,但是 admin 的密码我们也没头绪,注册新用户也没什么用,扫过全部的表单也没发现什么可注入的地方,一看编辑器用的是 FCKeditor,第一印象:那肯定是有文件上传漏洞了。然而并不能成功。过了一会儿 @黑白 在一个非常奇怪的地方(我也不知道他怎么找到的)扫出来一个 SQL 注入,是个 boolean-based 盲注,开了多线程之后效率还是挺高的。于是 dump 出 admin 的密码 Hash,不过数据库中有两条记录,通过 Hash 查询服务反查得到原文,发现一条是真正的密码,一条是 1 中的一个链接 192.168.100.101:8080/level2jxc/。于是进入了后台并过掉一题(给出 admin 的密码)。我们还惊讶的发现可以 dump 出 mysql 表,说明这个系统居然是用 root 权限连接的数据库!典型的运维跑路系列……于是又过掉一题(给出 2 中数据库 root 的密码)。然后我们顺理成章地传了一个菜刀(这居然是个 Windows 服务器),获取到了一个指定文件的内容,又过掉一道题。看到后面的题目应该需要提权(获取 2 中 C:/1.exe 中的 key),我们打算换一个服务器,过会儿再尝试 2 的提权。

3 中的论坛非常难搞,所有扫描器全开没有任何效果,只是扫出了站点结构。看了一下,感觉里面的 template 很可疑,因为作者在模板文件(一般论坛的模板后缀都是 .html)中使用了大量的 PHP 代码来处理业务逻辑,于是我就自己开始了类似于源码审计的工作。我看到了里面的 $_GET,以及作者自己写的它的副本 $GET 和不知道干什么用的 $SET,看到了通过 $_G[USER][ID] 来判断用户权限,所以一直在想能不能用变量覆盖,但是这一块我掌握的并不好,所以最终还是放弃了。于是猜想是管理员账号弱密码。点开管理员资料发现其账号是 test(我还嘲讽 @SummerZhang 一定没用过论坛,不然连用户账号都不知道怎么获取),看到了开发者的各种信息。然而我试了诸如 admin123puyuetian(开发者)、632827168(QQ)、hadsky(论坛架构)、testuser 等密码都不行,于是只能放弃 3,去看另一台服务器。

按照题目要求(分析 4 中的 Net_Server.exe 文件,获取其中管理员的密码),我们得到了 4 中的一个 exe 文件,@SummerZhang 刚想逆向,我说你先用 strings 搞一下,万一就明文存进去了呢?于是在输出的最开始找到了两行,一行是 admin,另一行是 passw0rd,猜想后者就是密码,提交之后果然过掉了这道题。4 的提权没有什么思路,Linux 的提权工具我们这次都没带,所以只能作罢。

我们再次将目光转向 1,刚才给出的链接就是真正的资产管理系统登录界面。右下角有个系统手册下载,看链接 download.jsp?path=upload&name=handbook.zip 应该是有文件下载漏洞,试了一下 download.jsp?path=/&name=../../../../../etc/passwd 果然可以,于是果断拿到了目录下的一个文件并过掉一道题。后面一道题是给出资产管理系统用户 tom 的密码,我们本来想通过 /etc/shadow 获取 root 的密码,然后通过 ssh 连接过去。结果发现这个文件并没法下载,说明还是有权限问题的。于是转换思路,看了一遍扫到的全部文件,发现登录是用 dwr 实现的,并不是网页中写的那个 formaction,抓包后发现格式好奇怪,都没法用 sqlmap 跑注入的。无意中发现有一个 loginService 的单元测试,点进去之后发现可以看到 loginService 中的全部方法名,并且可以直接远程执行代码,然而我们并不知道具体的参数,于是将所有扫到的文件全部 dump 下来,JSP 文件没什么好看的,基本都是 HTML;class 文件用 jd-gui 来看,但是 loginService 类中的 login 函数居然没法被解析出来,adminPwEdit 似乎可以修改管理员密码,但是服务器就是想要这个密码,所以应该也没什么用处。于是这个服务器又到了一个比较尴尬的状态。

好吧继续看 2。@SummerZhang 在 Kali linux 下通过 Armitage 连接到了这台服务器,但是权限是个临时的低权限。Windows 的提权工具我跟他都没带,不过在这紧要关头 @黑白 贡献出了他的工具集,然而说这些工具都好老了,不确定行不行。抱着试试看的心态,我们找了一个名字最好听的工具:“Windows 通杀提权”,按照说明将两个文件上传到服务器,然后按照说明执行了一遍,发现用户变成了 SYSTEM,但是还是不能获取到那个文件,这太神奇了。于是又想到了远程桌面,但是经过尝试 SYSTEM 似乎弹不出远程桌面,于是凭借着高权限在命令行中使用 net user add 新建了一个账号并将其加入 Administrators 用户组,但是连过去还是提示密码错误。看了一眼用户列表,发现并没有新建成功,后来猜想可能是密码太简单,于是 @SummerZhang 作死设了一个超奇怪的密码 !@#$asdfQWER,然后过了两分钟他自己给忘了……总之最后连进去了,然后右键 1.exe ,将 Everyone 的权限改成“完全控制”,然后直接用菜刀下载下来了。@SummerZhang 刚想逆向,我又说咱们再 strings 一下呗……然而输出很奇怪,居然发现了 JFIF 的字样,我还吐槽他们是嵌了一张图片进去么,然后随手用 file 命令看了一下,发现这特么就是张 JPEG 图片……于是修改后缀点开发现了画在图片里面的 key 并过掉了这个服务器环境中的最后一题。

5 通过浏览器访问会有一个登录界面,但是用户名和密码都不知道。主办方提示是弱口令爆破,第一印象是需要爆破 sa 的口令,但是最终没能爆破出结果。最后得知密码是 root_123 之后,暗自决定:下次比赛带的字典一定要弱一些……

此时 3 还是没有任何进展。在距离比赛结束只剩不到一个小时、各种攻击方式无果的时候,@WolfZhang 居然破出来了 test 账户的弱密码 111111,好吧,我们想到了是弱密码,但是没想到有这么弱。我眼疾手快登进了后台,修改了可上传文件的后缀和大小,然后传了个菜刀进去,结果发现居然不能被执行?然而不知道为什么 @WolfZhang 上传的一个 70 多 K 的大马却可以执行,打开发现是一个登录界面,于是去翻源码,发现了写死在里面的账号和密码,登进去之后功能还挺全,可以看有权限的任意文件和目录、在任何有权限的地方上传/下载文件、执行 PHP 代码/SQL 代码、端口扫描等等。果断翻了一下网站代码,找到了数据库的密码并过掉一道题(获取数据库的连接密码),然后拿到一个有权限的文件并过掉一道题(获取 C:/1.txt 中的内容),然后题目中的下一个文件需要提权,果断将之前的提权工具外加 Armitage 生成的各种 reverse_tcp、vnc 程序一块上传上去(vnc 是为了获取 360 杀毒软件白名单中的文件名)。只不过比较尴尬的是,服务器禁用了 PHP 中一切可执行 shell 命令的函数,包括 execshell_execsystem 等,所以并不知道该怎么通过 webshell 运行那些 exe 文件。联想到两年前 @SummerZhang 将可执行文件直接上传到 cgi-bin 目录下最终成功执行木马的思路(传送门:Web 服务器 CGI 安全——由一次信息安全竞赛引发的思考),我们又做了一次尝试,发现目标机的 cgi-bin 默认是开启的,但是上传的文件都没法正常运行,都会秒退,写了 bat 来运行也不行。猜想是我们的木马在运行的时候被 360 干掉了,但是做了免杀好像也不行,所以又一次陷入了僵局。此时比赛的时间已经结束,我们只能停止目前的操作。


听其他队伍的选手说,这次决赛是有真的逆向题目的,然而我们水平有限没能做到那个地方。此外,这次决赛给我的感觉就是:各种提权,各种爆破,比初赛只有各种爆破好多了。

顺便提一句,感觉 Armitage 真的好好用啊,有空一定好好熟悉一下。

其实对于第八名的成绩,我内心还是不太满足的,然而转念一想,我一个平时画界面的,偶尔搞一搞安全,能拿到这个名次也不算太差是吧……