玄机——某医院系统被脱库
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 靶机介绍
- 1. 首次发起端口扫描的IP是
- 2.审计流量和日志快速定位扫描次数最多的IP
- 3.审计流量和日志快速定位扫描次数第二的IP
- 4.哪个IP使用了AWVS扫描器
- 5. 还有个IP也使用了扫描器进行主机+WEB扫描,提交其扫描次数(以wireshark数量为主)
- 6.运维人员发现有IP进行了WEB登录爆破,提交其IP
- 7.运维人员发现有IP进行了WEB登录爆破,提交其爆破次数
- 8.运维发现数据库疑似被写入了垃圾用户(批量注册)请提交其IP
- 9. 运维发现数据库疑似被写入了垃圾用户(批量注册)请提交注册成功数量
- 10.请提交攻击者登录成功admin用户的IP及密码,以&连接
- 11.数据库疑似被脱库,你需要找到漏洞点,如漏洞文件
- 12.找到攻击者获取医院数据(患者身份信息的数量)
靶机介绍
应急加固-医院脱库应急处理
来源公众号:州弟学安全
登录账号密码:administrator/Zhoudi666
某医院系统疑似被攻击,攻击者常规手段获取到了后台账号密码,在此之前攻击者使用多个IP进行> 扫描,你作为安全服务工程师需要分析其流量包和日志来快速审计,每个IP的扫描特征并快速归类,并思考在常规渗透中,攻击者是怎么获取到的管理员密码进行登录的后台
此外除了已有需要提交的题目,你还需要做的是
- 根据桌面已有的工具进行分析
根据桌面已有的文档模板进行编写报告进行整个流程的梳理(后期给客户进行汇报)- 修复出现的相关漏洞(无论使用任何方法),保证业务系统正常运行
- 看看系统中自己能不能挖出其他漏洞
下载地址:
123网盘:https://www.123684.com/s/oJnajv-EzWnh
玄机:https://xj.edisec.net/challenges/140
参考文章:州弟学安全(公众号)
靶机系统:Windows server 2019
文件类型:OVA
大小:8G左右
已有工具:WPS、wireshark、phpstudy、Google浏览器、ZUI流量分析工具等
请确保你的电脑硬盘有足够的空间
题目:
- 首次发起端口扫描的IP是
- 审计流量和日志快速定位扫描次数最多的IP
- 审计流量和日志快速定位扫描次数第二的IP
- 哪个IP使用了AWVS扫描器
- 还有个IP也使用了扫描器进行主机+WEB扫描,提交其扫描次数(以wireshark数量为主)
- 运维人员发现有IP进行了WEB登录爆破,提交其IP
- 运维人员发现有IP进行了WEB登录爆破,提交其爆破次数
- 运维发现数据库疑似被写入了垃圾用户(批量注册)请提交其IP
- 运维发现数据库疑似被写入了垃圾用户(批量注册)请提交注册成功数量
- 请提交攻击者登录成功admin用户的IP及密码,以&连接
- 数据库疑似被脱库,你需要找到漏洞点,如漏洞文件
- 找到攻击者获取医院数据(患者身份信息的数量)
1. 首次发起端口扫描的IP是
这里我们进入靶机,发现页面被锁定,按键盘也没有用:
不多说——>虚拟机——>发送ctrl+Alt+Del
进入后可以找到一个流量包,根据题目首次发起端口扫描的IP是:
- 思路:
- (1)首先根据时间排序,找到最先发起端口扫描的IP地址
- (2)端口扫描的特征:SYN 半扫描不会完成三次握手,为排除正常建立连接的 SYN 包
- (3)可使用
tcp.flags.syn == 1 && tcp.flags.ack == 0
,表示只显示 SYN 标志位为 1 且 ACK 标志位为 0 的数据包。
可以发现最开始有192.168.27.3
使用54977端口去对192.168.37.2进行端口扫描(被访问不同的端口),可认为这个IP是一个可疑IP;
flag{192.168.27.3}
–
2.审计流量和日志快速定位扫描次数最多的IP
根据题目,要去扫描次数最多的IP,那么我们就要知道有哪些IP,访问的次数分别是多少?如何实现呢?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
答:扫描最多,那么肯定会访问到404页面;但由于不知道当前系统使用的是404还是302,301或者自定义的状态码,所以要进行尝试;
(1)这里就会用到我们之前接触过的工具 ZUI;它 的一大优势在于,当我们导入流量包后,它能自动把流量数据拆解成五元组信息。
(2)更方便的是,在将流量数据转化为日志格式后,我们可以对这些数据进行快速的聚合分析和查询操作,整个过程几乎不需要等待加载,效率非常高。
(3)之前学校挖矿应急响应也使用过。
使用语句,进行筛选:
count() by status_code | sort -count() # 得到所有的状态码数量
count() by id.orig_h,status_code |where status_code==404
可以发现404的次数最多;
随后再查找那个IP访问的次数最多:
话不多说,明眼人都看得出来,到wireshark验证一下:
可以分别看看192.168.37.3
和192.168.37.1
这两个IP的流量情况:
ip.addr==192.168.37.3
ip.addr==192.168.37.1
可以看到大多数时候,192.168.37.3都与192.168.37.2进行通信;
这么看扫描次数最多的还是192.168.37.3,再看192.168.37.1是有很多UDP协议的其它流量使用的,比如DHCP,ssdp和一些其它出网的协议,因为在仿真的过程中,它是作为网关的。
问题来了:有些师傅问,统计次数有什么用?
别忘了我们的专题是学习安全服务,统计次数多用于HW和一些日常重保和应急响应中,最终汇报给客户工作的报告中需要提及到详细的流程以供复盘。
所以结果:
flag{192.168.37.3}
–
3.审计流量和日志快速定位扫描次数第二的IP
根据之前的结果,可以得知192.168.37.1
是排第二的IP地址
结果为:
flag{192.168.37.1}
–
4.哪个IP使用了AWVS扫描器
常见的AWVS扫描器特征:
- 域名 / 标识:acunetix、bxss.me
- 特征描述:“请求头以及 url 中包含 acunetix” ,这是识别与 AWVS 相关流量或请求的特征点,常用于安全检测中识别 AWVS 工具发起的扫描等操作 。
所以我们可以去匹配他的这些关键字:
http contains "acunetix"
http contains "bxss.me"
可以看到,没有意外,都是192.168.37.1这个IP进行扫描;
这里的知识点主要学习对于安服在常规日常值守的情况下,对于互联网资产或内部突发扫描,可以及时对扫描器进行做特征识别,来研判是否为误报,每个工具(无论扫描还是shell管理都有自己的特征)
flag{192.168.37.1}
–
5. 还有个IP也使用了扫描器进行主机+WEB扫描,提交其扫描次数(以wireshark数量为主)
根据题目,注意到说的是“主机+web扫描”,那么还是按照题目1的方法进行筛选,看看和192.168.37.3一样进行主机扫描的还有哪个?
tcp.flags.syn == 1 and tcp.flags.ack == 0 and ip.addr != 192.168.37.3
可以看到主要有一下IP值得注意:
(1)针对192.168.37.100
行为分析:
发现他不断访问着8080端口,正常的扫描行为则是扫描多个不同的端口,所以暂时可排除嫌疑;
(2)针对192.168.37.1
行为分析:
同理;
(3)针对192.168.37.177
行为分析:
(4)针对192.168.37.200
行为分析:
(5)针对192.168.37.100
行为分析,也是终于有了发现:
很明显这就是端口扫描的特征;
已知192.168.37.100确定存在端口扫描的特征,那么筛选一下是否存在漏洞扫描特征(相比于192.168.37.1和192.168.37.3数量不是很多
)
id.orig_h==192.168.37.100 |status_code==404
到wireshark里输入ip.src==192.168.37.100 and http
发现有着目录遍历,任意文件读取的特征;(相比于192.168.37.1和192.168.37.3,只有100有着这些特征)
(1)所以大概筛选一遍,只有192.168.37.100存在这个问题,进行了主机服务和web服务以及漏洞扫描的特征,那么他的扫描次数来统计一下:ip.src192.168.37.100&&ip.dst192.168.37.2
(2)最终结果是4812次
flag{192.168.37.100}
–
6.运维人员发现有IP进行了WEB登录爆破,提交其IP
思路:先打开桌面的phpstudy,去网页127.0.0.1登录账号,看页面会跳转到哪个接口
输入账号密码,然后按F12查看响应:
所以我们可以知道,攻击者呀进行web登录爆破,必然会进入到 /login 页面进行操作,所以到流量包中,我们可以去筛选关键字;
使用的POST方式进行的请求,那么直接筛选一下:
count() by id.orig_h,uri,method| uri=="/login.php" | method=="POST"
去wireshark查看一下192.168.37.87
这个IP:
http.request.uri=="/login.php" and http.request.method=="POST"
可以看到清一色的 /login.php 页面登录,还有几个不同的IP地址;
通过流量分析192.168.37.87确实存在爆破行为,然后192.168.37.200也存在爆破行为,但是爆破有特征,最后还登录成功了,所以存在爆破行为的是:192.168.37.87&192.168.37.200
192.168.37.87&192.168.37.200
–
7.运维人员发现有IP进行了WEB登录爆破,提交其爆破次数
已知以上两个IP存在爆破行为,那么直接进行筛选就行:
(ip.src==192.168.37.87 || ip.src==192.168.37.200) && http.request.uri=="/login.php" && http.request.method=="POST"
同理,用ZUI也是一样:
count() by id.orig_h,uri,method,http| uri=="/login.php" | method=="POST"
flag{112}
–
8.运维发现数据库疑似被写入了垃圾用户(批量注册)请提交其IP
批量注册的危害:
垃圾用户会占用数据库存储和服务器资源,拖慢系统性能;导致业务数据统计失真,干扰运营决策;可能被用于薅取福利、发送垃圾信息,破坏用户体验和平台声誉;还可能成为后续攻击的跳板,增加安全风险与运维清理成本,甚至引发合规问题。
这里回到靶机,可以看到网页跳转的url接口是: /register.php
与登陆时的页面同理,操作不再赘述;
count() by id.orig_h,uri,method,http| uri=="/register.php" | method=="POST"
到wireshark去验证:
所以,批量注册的IP是
192.168.37.177
–
9. 运维发现数据库疑似被写入了垃圾用户(批量注册)请提交注册成功数量
注意
: 批量注册请求不代表注册成功数量,所以我们需要去数据库中校验表,在此之前需要知道是哪个数据表;
注册走的是insert语句,直接在register搜索insert关键字就行,可以看到是users表
进入php的数据库管理工具:
从第一个请求的时间往后看,然后对比users表内的时间往后数;
可以看到后面有规律的用户,直接看数量就行了;
剩下是官方的原解释:
zhangsan0-zhangsan57一共是58个用户,有些师傅会说,你这太简单了,如果人家批量注册,不同IP,不同用户名你怎么办?
好的,这个情况下就根据注册开始时间以及特征开始算起,如果短时间,大批量的注册以及登录等相同的行为特征,那么可以判定为恶意用户,如:某购物站分别使用代理IP进行注册机注册,且注册用户名,密码无规则或强规则,以及登录后分别做了相同操作的,可以判定为恶意用户,我记得腾讯之前有个叫做防水墙的安全工具是专门针对这一类的,当然了这些需要判断行为特征记录到日志中,需要结合非常多的特征,不单单是判断行为就足够,这样会误封很多账号,所以在对抗薅毛行为的情况下是十分心累的。
在此环境中我们可以通过sql语句进行查询:
SELECT COUNT(*)
FROM users
WHERE username LIKE '%zhangsan%';
加上条件:
SELECT COUNT(*)
FROM users
WHERE created_at >= '2025-04-30 09:59:00';
flag{57}
–
10.请提交攻击者登录成功admin用户的IP及密码,以&连接
根据题目,可以知道攻击者的账号是admin,之前登录时不是知道了账号密码的payload以及请求方式为POST吗,所以可以根据关键词进行筛选;
http contains "username" and http.request.uri =="/login.php" and http.request.method == "POST"
可以看到有一百多条记录,还是要继续过滤:
”窍门“:正常情况下,登录成功会进行302跳转,那么就需要筛选状态码了;
http.response.code == 302
但是这样还是不能很清晰的看到,因为有很多请求可能也是302状态码,所以直接url看/admin/index.php
,因为302跳转到这个地址(在熟悉业务系统的情况下可以这么做,实际情况下需要进行测试然后分析流量)
输入命令进行尝试:
http.request.uri=="/admin/index.php"
分别点击进行查看:
毋庸置疑,就是192.168.37.200登录成功的了,因为可以看到192.168.37.3应该是扫描目录到admin/index了然后未授权跳转到登录页面了,所以才302状态码的,而192.168.37.200则是200状态码,代表登录成功了,那么直接追一下流量,看到登录密码为zhoudi123
–
11.数据库疑似被脱库,你需要找到漏洞点,如漏洞文件
首先,认识到脱库一般都与sql语句有关,执行sql操作;
回看之前的 /login.php 登录页面,发现了某些规律:
为什么攻击者会这么有规律的输入账号密码呢?
肯定不是爆破的,有位师傅在我之前已经写出来WP了,但是也确实没想到怎么获取到密码的,假设在此之前爆破的是同一个人,为什么突然爆破账号就有规律了呢?
其实很多人还是忽略了一点,在攻击之前,渗透测试的信息收集,攻击者是否找到了一些信息?还记得之前多次说过信息收集的地方吗?使用Google,GitHub,gitee进行搜集,我们在逆向思路的适合一定要走攻击者的路子
在gitee中模糊搜索关键字看到了有这个系统,至于源码是什么背景下被上传的自行分析,但在生产环境下这肯定是严重事件问题
1)可以看到账户的默认信息,所以就证明了攻击者有规律的爆破是根据这里来的,那么攻击者使用的是zhoudi123而不是admin123登录成功的,这个密码哪里来的呢?
2)还记得之前提到的渗透测试中密码复用技术吗?我不知道细心的师傅有没有发现数据库密码也是zhoudi123
这也就证明了攻击者尝试了密码复用进入了管理员后台,但是为什么攻击者不直接连接数据库呢?
有可能数据库配置权限只能本地。
已知是脱库,那么大概率和SQL有关了,我们使用ZUI进行筛选一下:
count () by uri,status_code,id.orig_h|status_code!=404|id.orig_h==192.168.37.200
上图看到settings.php竟然被请求了79次,这非常不正常,直接wireshark看看:
http.request.uri=="/admin/settings.php"&&http.request.method=="POST"
随便点击进去,可以发现参数存在sql注入特征:
既然在打SQL注入,那么漏洞点是username,看看这个settings.php里面的这一块语句
可以看到username会直接被拼接到语句中进行执行,存在SQL注入,那么攻击者在之前获取到了源代码,审计出漏洞也很合理,所以漏洞文件是settings.php
或/admin/settings.php
--
12.找到攻击者获取医院数据(患者身份信息的数量)
暂未学到没有思路,以后补充。欢迎在评论区指点。