WeChat Message Analyzer
Github:https://github.com/SewellDinG/WeChatMessageAnalyzer
目的:微信群组敏感信息行为记录、分析、取证、预警、可视化。
原理:使用ItChat编写微信机器人,将机器人账号伪装并添加至待监测群组,实时记录聊天内容;使用基于Trie Tre的关键字匹配实时分析威胁言论;使用ELK(Elasticsearch、Logstash、Kibana)取证并可视化预警。
技术栈:CentOS7+Nginx+Python3+SQLite3+ELK(JAVA)
源工程:SourceCode,包含一些小脚本:词云、邮件等。
混淆代码:ObfuscatedCode,使用Oxyry混淆关键代码,可直接使用。
测试:SQLite3、Kibana
CentOS
使用Docker安装CentOS7并将源码映射到系统tmp目录下:
docker pull centos
docker run -it --name centos_ori -v ~/Share:/tmp centos /bin/bash
Python
CentOS Linux 7自带Python2.7,使用yum管理安装Python3.6:
yum install epel-release
yum install https://centos7.iuscommunity.org/ius-release.rpm
yum install python36u
ln -s /bin/python3.6 /bin/python3
yum install python36u-pip
ln -s /bin/pip3.6 /bin/pip3
ELK
使用rpm管理安装相应模块:
rpm -ivh jdk-8u131-linux-x64.rpm
rpm -ivh logstash-6.5.4.rpm
rpm -ivh elasticsearch-6.5.4.rpm
rpm -ivh kibana-6.5.4-x86_64.rpm
elasticsearch.yml: default
network.host: 127.0.0.1
http.port: 9200
logstash.conf
input {
file {
path => [ "/home/log/log/*.log" ]
type => "info"
start_position => "beginning"
codec => "json"
}
}
filter {
date{
match=>["create_time", "yyyy-MM-dd HH:mm:ss"]
locale => "en"
timezone => "+08:00"
}
}
output{
stdout { codec => rubydebug }
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "cs-%{+YYYY.MM.dd}"
}
}
kibana.yml: default
server.port: 5601
server.host: 127.0.0.1
Nginx
使用Nginx来反向代理ELK,同时添加访问权限。
Nginx配置文件:server_name是对外访问IP,与listen端口无关。
server {
listen 80;
server_name 192.168.1.16;
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/htpasswd.users;
location / {
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
使用htpasswd生成访问密码:每次生成的密文都不一样
yum install -y httpd-tools
htpasswd -c /etc/nginx/htpasswd.users admin
然后在配置文件中添加auth_basic(弹窗提示内容)、auth_basic_user_file
SQLite3
数据库各关键表结构:
-- ----------------------------
-- Table structure for wc_friends
-- ----------------------------
DROP TABLE IF EXISTS "wc_friends";
CREATE TABLE `wc_friends` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` TEXT NOT NULL,
`sex` TEXT,
`province` TEXT,
`city` TEXT,
`signature` TEXT
);
-- ----------------------------
-- Table structure for wc_gchat
-- ----------------------------
DROP TABLE IF EXISTS "wc_gchat";
CREATE TABLE `wc_gchat` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`create_time` TEXT NOT NULL,
`group_id` TEXT NOT NULL,
`group_one_id` TEXT NOT NULL,
`group_chat_text` TEXT,
`file_type` TEXT,
`file_name` TEXT,
`file_dst` TEXT,
`kw_word` TEXT,
`kw_type` TEXT
);
-- ----------------------------
-- Table structure for wc_var
-- ----------------------------
DROP TABLE IF EXISTS "wc_var";
CREATE TABLE `wc_var` (
`gchat_count` INTEGER NOT NULL,
`gchat_kw_count` INTEGER NOT NULL
);
-- ----------------------------
-- Auto increment value for wc_friends
-- ----------------------------
UPDATE "main"."sqlite_sequence" SET seq = 238 WHERE name = 'wc_friends';
-- ----------------------------
-- Auto increment value for wc_gchat
-- ----------------------------
UPDATE "main"."sqlite_sequence" SET seq = 124 WHERE name = 'wc_gchat';
PRAGMA foreign_keys = true;
端口和进程
监听端口:
➜ netstat -antp | grep -i listen
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 16130/nginx: master
tcp 0 0 127.0.0.1:5601 0.0.0.0:* LISTEN 10257/node
tcp6 0 0 :::80 :::* LISTEN 16130/nginx: master
tcp6 0 0 127.0.0.1:9200 :::* LISTEN 10033/java
tcp6 0 0 127.0.0.1:9300 :::* LISTEN 10033/java
tcp6 0 0 127.0.0.1:9600 :::* LISTEN 10163/java
相应进程:
➜ ps aux | grep 16130
root 16130 0.0 0.0 125008 2280 ? Ss 18:56 0:00 nginx: master process /usr/sbin/nginx
➜ ps aux | grep 10033
elasticsearch 10033 1.7 25.2 4896104 1493920 ? Ssl 17:12 2:32 /bin/java -Xms1g -Xmx1g ... org.elasticsearch.bootstrap.Elasticsearch -p /var/run/elasticsearch/elasticsearch.pid --quiet
➜ ps aux | grep 10163
logstash 10163 2.8 14.0 4719420 833064 ? SNsl 17:13 4:02 /bin/java -Xms1g -Xmx1g ... --path.settings /etc/logstash -f /etc/logstash/conf.d/logstash.conf
➜ ps aux | grep 10257
kibana 10257 0.8 5.0 1447288 301796 tty1 Sl 17:13 1:11 /usr/share/kibana/bin/../node/bin/node --no-warnings /usr/share/kibana/bin/../src/cli -c /etc/kibana/kibana.yml
TODO
- 日志格式化JSON
- logstash conf 时间头问题
- log记录中文问题
- 群组聊天内容数据库
- 消息数等关键数值数据存数据库,程序入口值问题
- 私聊信息处理
- 群组位置、名片、分享消息数据类型处理
- kibana、logstash时间统一问题:timestamp使用的UTC时间…修改logstash配置,设置时区,并偏移8小时
- 预警,指定用户回复功能
- 指定好友发送消息,好友检索问题
- 分析保存的视频、音频、图像、名片等消息内容。
- 群成员信息获取?
- 私聊内容进库,是否需要处理,前端展示?
- 好友信息索引,cron定时执行?好友人数、位置信息等
Contributors
感谢学弟:littleghost2016