快速搭建ELK毫秒级响应数据库

关于ELK以及其优势

简单GPT一下

ELK 是 Elasticsearch、Logstash 和 Kibana 三个开源项目的首字母缩写,通常一起使用构成一个强大的日志管理和分析解决方案。下面将介绍它们各自的功能和ELK的优势:
– Elasticsearch:
是一个基于 Lucene 构建的高性能搜索引擎。
主要用于全文搜索和分析。
具有高伸缩性,可以水平扩展,并且能够快速处理大量数据。
– Logstash:
是一个强大的数据处理管道工具。
能够动态地收集、处理和转发日志和事件数据
支持多种输入、过滤、编解码和输出插件。
– Kibana:
是一个为 Elasticsearch 提供数据可视化的 Web 应用程序。
允许用户创建和分享图表、地图、表格等,以图形化展示 Elasticsearch 索引中的数据。
通常用于日志和时间序列分析、应用监控等。

ELK 相比于 MySQL 的优势主要在以下几点:
1. 文本搜索处理能力: Elasticsearch 提供全文搜索功能,对于复杂的文本查询和大数据集的文本处理有明显优势。
2. 数据处理及实时分析: Logstash 能够实时处理和分析数据,适用于日志管理和复杂事件处理,而 MySQL 更多用于结构化数据存储。
3. 数据可视化: Kibana 提供了丰富的数据可视化选择,能够以图表、地图等形式直接在 Web 界面上展示数据分析结果。
4. 扩展性与高可用性: 集群/分你手机友好
5. 大数据兼容性: 对日志和非结构化数据友好

省流:

  • 优点:全文检索、毫秒级响应
  • 缺点:约三倍原文大小的索引

安装

由于网上都是Docker/二进制文件分开部署,让我非常烦躁,怎么这么好的东西就不能一次搞完呢!
PS:这样不方便集群管理,不过本地跑还是很爽的🤣

ELK不支持使用latest部署,我们需要自己指定版本
在测试中8.x版本无法正常部署,建议使用7.x

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.17.19
    environment:
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - discovery.type=single-node
      - cluster.name=es-docker-cluster
      - http.host=0.0.0.0
    volumes:
      - ./es-data:/usr/share/elasticsearch/data
      - ./es-plugins:/usr/share/elasticsearch/plugins
      - ./es-logs:/usr/share/elasticsearch/logs
    networks:
      - elk-net
    ports:
      - "9200:9200"
      - "9300:9300"
    privileged: true

  kibana:
    image: kibana:7.17.19
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - I18N_LOCALE=zh-CN
    networks: 
      - elk-net
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch

  logstash:
    image: logstash:7.17.19
    networks: 
      - elk-net
    ports:
      - "5044:5044"
      - "9600:9600"
    depends_on:
      - elasticsearch

networks:
  elk-net:
    driver: bridge

如果配置正常的话会自动连接配置,等一会访问 http://127.0.0.1:5601 就行

部分情况无法连接可以参考

docker log查看kibana的配置code(实际上并不需要,自动配置失败的话,只要访问那个端口就行)

http://0.0.0.0:5601/?code=xxxxxx

替换 http://0.0.0.0:5601 为 http://127.0.0.1:5601 访问Kibana的管理界面
在这个界面可能需要输入token,token可以docker log查看elasticsearch控制台
如果不行的话可以尝试

docker exec <DOKCER_ID> bin/elasticsearch-create-enrollment-token --scope kibana
# 返回如下
WARNING: Owner of file [/usr/share/elasticsearch/config/users] used to be [root], but now is [elasticsearch]
WARNING: Owner of file [/usr/share/elasticsearch/config/users_roles] used to be [root], but now is [elasticsearch]
<一串JWT密钥>

然后等配置了

完成

左边三道杠 -> Management(管理) -> 堆栈监测

可以看到ELK都正常工作

索引管理

左边三道杠 -> Management(管理) -> Stack Management

解析数据

logstash

TODO:等我nas配起来后去写这个,不然还没有地方存数据

内存DUMP数据的一些尝试

近期某大学在公告版中发送了查询学生考场的EXE文件,一开始我以为是钓鱼的,后来经多方确认属实。

经过断网确认后可知,数据打包在应用内部。
首先尝试了binwalk/foremost无过,只分离出一些bmp文件
拖进IDA,找到动态链接库但是显示unknowlib,静态数据中也没有相关信息。
这里可以采用的方式有两个
1. IDA动态调试
2. DUMP内存

这里使用的是第二种方法,DUMP内存有多种方法,可以采用VS的DEBUG工具进行内存DUMP,但是我们借助任务管理器简单创建完整的转储文件。

Task Manager->Processes->Right Click->Create dump file


通过WinHex查看转储文件,存在相应的明文数据
数据头为
“`… … 49 00 43 00 4F 00 4E 00“`


数据尾为
“`06 00 00 00“`


写脚本提取后分隔导出为csv文件即可
下面为Payload

with open('memory.dmp', 'rb') as f:
    data = f.read()
head=data.find(b'M\x00A\x00I\x00N\x00I\x00C\x00O\x00N\x00')
data=data[head+16:]
tail=data.find(b'\x06\x00\x00\x00')
data=data[:tail]
data=data.split(b'\x0d\x0a')
with open('memory.csv', 'w') as f:
    for item in data:
        item=item.decode('gbk')
        f.write(item.replace('@',',')+'\n')

原本为了保护学生隐私的设计反而最终成为了泄露隐私的地方。
这里的信息还包括身份证后三位,也就是说我们可以通过户籍地+生日反推出最后一位。
具体有如下解决方法:
不存储明文,只存储加盐后的学号+姓名+身份证后三位的哈希/md5信息再查询,最后的是为什么不能在线查呢?很急。

PS1:后缀改成txt可以直接读出数据
PS2:用Notepad++以GB2312读写可以直接读出所有数据

【MISC】Wordle

TQLCTF-Wordle题目出自当下火热的填字游戏
填字游戏的规则为输入五个字母,然后分别返回五个颜色

  • 绿色:位置和字母均正确
  • 黄色:字母正确位置不正确
  • 灰色:字母和位置均不正确

我们的任务就是用最少的次数,把答案找出来
在该题目中,颜色可以通过字节流分辨出来。在这之前,我在B站大学看到过一个讲述相关技术的视频,于是我就翻了下。
利用信息论解决Wordle问题
理论存在,实践开始
于是,又写了一个10K的代码,发现自己的代码只能做到平均4.3左右。
好废物啊我
于是上Github找轮子Wordle-solver
这个开源项目能做到平均3.4,然后就有了如下10K代码

继续阅读【MISC】Wordle

【MISC】BASE系列加密解析

见到了一题比较离谱的base64题目,VNCTF2022-Web-gocalc0,可能是我太菜的原因,明明hint告诉我,flag在session里面,我却怎样都Base64出不来,一直说解密出错。
这题对于Web没有一点难度,姑且放在MISC分类里面。

Base16

使用字符:数字(0 ~ 9),字母(A ~ F)
Base16先获取输入字符串每个字节的二进制值(不足8bit在高位补0),然后将其串联进来,再按照4bit一组进行切分(2^4=16),将每组二进制数分别转换成十进制,并对应下述编码。
即二进制转十六进制,对应下表

编码 编码 编码 编码
0 0 4 4 8 8 12 C
1 1 5 5 9 9 13 D
2 2 6 6 10 A 14 E
3 3 7 7 11 B 15 F

继续阅读【MISC】BASE系列加密解析

【MISC】图片点阵提取

在打VNCTF2022的时候遇到这样一道题,图片直接放在文章肯能看不清,各位可以点开来仔细观看

放大来看

又是点阵图,这不就是妥妥的点阵提取嘛,打开画图,量出来点之间的距离,然后开造!
结果,出来很意外,每个点之间的距离都是不一样的,都在49~51之间浮动,这就导致直接提取不能提取出有效的信息
好在,每一行每一列的点都在同一条直线上,只要求出最左上角的点,然后跑出每一行每一列的坐标,再拼接即可
拼接的话可以使用OpenCV库,但是Python的PIL(Pillow)好像更胜一筹,于是学了一下写了个脚本

from PIL import Image,ImageDraw
image = Image.open("misc-img-pixel-1.png")
Line=[]
Row=[]
black=image.getpixel((0,0))
for i in range(image.height-1):
    if(image.getpixel((24,i))!=black):
        Row.append(i)
for i in range(image.width-1):
    if(image.getpixel((i,15))!=black):
        Line.append(i)
ret = Image.new('RGB', (len(Line), len(Row)) )
draw = ImageDraw.Draw(ret)
for x in range(len(Line)-1):
    for y in range(len(Row)-1):
        draw.point((x, y), fill=image.getpixel((Line[x],Row[y]))) 
ret.show()
ret.save('result.png')

继续阅读【MISC】图片点阵提取

【MISC】ZIP压缩文件汇总

MISC题目中,ZIP压缩包一般会有五种破解方式

  1. 暴力
  2. 字典
  3. 明文
  4. 冗余数据
  5. 伪加密

一般来说我们可以使用ARCHPR来帮助我们破解ZIP
在得到一个压缩包的时候,我们应该先阅读属性内容,里面能给你一些解题提示
这个就提示我们要六位暴力

以下就是提示我们可能存在冗余数据

其次,我们还可能存在字典,当然啦,我们要有对应的字典才行

在打开压缩包的时候,我们可以留意一下内外压缩包的文件时候有CRC校验码相同的,如果有我们可以尝试明文破解口令。
但是我们也可以不破解口令,直接通过密钥解密文件

在处理冗余数据时,我们可以采用binwalk判断冗余数据,并且binwalk -e提取,有时候不行的话还是自己动手吧

以上四种都很好理解,伪加密我们要使用WinHex打开,修改加密位完成

继续阅读【MISC】ZIP压缩文件汇总