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

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

文章目录


题目背景

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

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

相关推荐
Pedantic2 小时前
SwiftUI 手势层级(Gesture Hierarchy)详解
前端
飘尘2 小时前
前端转型全栈(Java后端)的快速上手指引
前端·后端·全栈
一颗烂土豆2 小时前
Meshopt 压缩深度解析,为什么它比 Draco 更快
前端·javascript·webgl
浏览器工程师3 小时前
AI Agent 接浏览器任务,先别让它一路点到底
前端·后端
雨季mo浅忆3 小时前
VSCode自动格式化三要素
前端
爱勇宝4 小时前
深扒 Anthropic 1680 位工程师简历:应届生几乎没机会,AI 公司最缺的不是博士
前端·后端·程序员
kyriewen4 小时前
同事每天催我 Code Review,我写了个脚本让 AI 替我 review PR——现在他反过来催 AI 了
前端·javascript·ai编程
user20585561518137 小时前
Windows 项目安装时报 `node-sass` 错误,如何快速处理
前端
LiaCode7 小时前
Redis 在生产项目的使用
前端·后端