前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >甲方安全建设- Velociraptor初体验协助应急响应

甲方安全建设- Velociraptor初体验协助应急响应

作者头像
Jumbo
发布2024-07-20 12:28:42
740
发布2024-07-20 12:28:42
举报
文章被收录于专栏:中国白客联盟

前言

刷到顺丰安全发表关于Velociraptor的文章,提到可以用它实现数据的查询,在应急的时候起很大作用,再加上刷到Velociraptor的一个ppt,笔者觉得挺不错,就来体验下。

安装

安装比较简单,直接下载https://docs.velociraptor.app/downloads/中的二进制文件运行即可。有一说一,Velociraptor的官方资料真的少,当然也有可能是笔者没找到,连个基本的手册都没,只好根据ppt里面提到的内容进行后续动作。

下载完成以后,生成配置文件,期间会让你填写hostname、绑定端口、ui的账号密码等等:

代码语言:javascript
复制
./velociraptor-v0.72.0-linux-amd64  config generate -i

第一个坑点,生成完以后,就算hostname写的外网ip,他的ui端口还是绑定在127上面,因此需要改生成出来的server.config.yaml文件把里面的127.0.0.0全部改成你的外网IP,可能API接口不需要改,但是为了方便笔者是直接全部改掉了。然后执行如下命令启动UI:

代码语言:javascript
复制
velociraptor --config server.config.yaml frontend -v

地址为:

代码语言:javascript
复制
https://your_ip:8889/app/index.html#/

为了方便可以创建服务来启动常驻的UI而不用每次都执行上述命令:

代码语言:javascript
复制
# 生成服务端包,笔者这里是生成rpm              
./velociraptor-v0.72.0-linux-amd64 --config server.config.yaml rpm server              
rpm -i velociraptor-server-0.72.0.x86_64.rpm    

第二个坑点来了,他创建的服务是以velociraptor用户启动的,虽然机器上有这个用户但是迟迟运行不起来。后面发现是日志目录权限不足导致的,因此需要给这些目录配置好权限:

代码语言:javascript
复制
sudo journalctl -u velociraptor_server -n 50 --no-pager              
sudo chown -R velociraptor:velociraptor /etc/velociraptor              
sudo chown velociraptor:velociraptor /usr/local/bin/velociraptor              
sudo chown -R velociraptor:velociraptor /opt/velociraptor              
sudo chmod 755 /opt/velociraptor              
sudo chmod 755 /opt/velociraptor/logs              
sudo chown velociraptor:velociraptor /opt/velociraptor/logs/*

然后生成客户端,也就是Agent,到相应的机器上注册节点就行:

代码语言:javascript
复制
velociraptor --config server.config.yaml rpm client              
rpm -i velociraptor_client_0.72.0_x86_64.rpm

这时候UI上就会出现对应的机器了:

这时候可以大概了解下都有什么功能了:

第三个坑点来了,尝试使用列目录竟然一直没成功。。

工件管理

Velociraptor内置了一些工件可以直接使用,根据内置的工件也可以自行编写相应的工件,以Linux.Syslog.SSHLogin 工件为例:

该工件为通过查询log日志,然后利用grok解析日志内容展示结果,尝试下发该工件:

得到结果,如果日志大的话就要等待一会:

既然体验Velociraptor的原因是因为在应急时有所帮助,那么可以设定这么一个场景:

代码语言:javascript
复制
现在已经发现/tmp/evil_是恶意木马,需要定位所有网内执行过该命令的机器,包括持续观察未来的机器是否有执行迹象。

现在有几个思路:

代码语言:javascript
复制
1. 通过获取机器上的进程来判断 - 不可取,因此是一次性的,且进程可能在获取时不在运行              
2. 通过hunter下发工件来获取机器上历史的命令记录 - 本文尝试该思路,因为hunter在上面提到可以持续监控所有机器,包括新上线的机器

获取历史命令记录将依托于audit实现,因此需要事先安装好audit服务并开启execve命令记录:

代码语言:javascript
复制
-a always,exit -F arch=b64 -S execve -k execve_audit              
-a always,exit -F arch=b32 -S execve -k execve_audit

然后通过Velociraptor的解析audit日志的函数完成audit日志的解析,就像上面笔者说的,官方文档是真的少,就给个简单的方法名,连输出哪些字段也不知道,只能自己摸索。所以先简单的来个select *看看都有啥字段:

得到结果如下:

接下来获取想要的细分字段就行了,比如pid、cmd等:

代码语言:javascript
复制
name: Linux.ParseAuditLog.ExecveEvents              
description: |              
  This artifact parses the Linux audit log and extracts command execution information,              
  specifically focusing on events tagged with "execve_audit".              


              
type: CLIENT              


              
parameters:              
  - name: AuditLogPath              
    description: Path to the audit log file              
    default: "/var/log/audit/audit.log"              


              
sources:              
  - precondition:              
      SELECT OS From info() where OS = 'linux'              


              
    query: |              
      LET parse_audit = SELECT * FROM parse_auditd(              
        filename=AuditLogPath,              
        accessor="auto"              
      )              


              
      SELECT              
        Timestamp,              
        Category,              
        Type,              
        Result,              
        Process.pid AS PID,              
        Process.ppid AS PPID,              
        Process.name AS ProcessName,              
        Process.exe AS Executable,              
        Process.cwd AS WorkingDirectory,              
        if(condition=Process.title, then=Process.title, else=join(array=Process.args, separator=" ")) AS CommandLine,              
        User.ids.auid AS AUID,              
        User.ids.uid AS UID,              
        User.ids.gid AS GID,              
        File.path AS FilePath,              
        File.mode AS FileMode              
      FROM parse_audit              
      WHERE "execve_audit" IN Tags

上述代码定义两个变量,一个变量是在下发任务可以改的,为日志路径;第二个变量是代码中通过LET定义的,是通过parse_auditd解析日志赋值给parse_audit,然后再从parse_audit读取想要的pid等信息。这里第四个坑点来了,pid死活读不到,其他的都能读到,pid也确实是字符串类型,尝试转成int就会变成0,笔者研究了很久都没办法解决,还是上面说的,官方文档太简单了。。

hunter

完成了工件的编写,接下来尝试使用hunter来持续采集客户端上的信息,因此笔者这里只有一台client,所以先把client服务停掉,然后下发hunter任务,再把client启动起来看看能否hunter到。可以看到成功获取到了数据,且hunter任务持续running中:

但是这里有第五个坑点,这时候再在已经hunter过的机器上执行相关命令就不会再hunter了,从结果中看也是finish状态了,并且重启hunter任务也不会再次hunter:

总结

本文通过对Velociraptor的初体验,发现Velociraptor是一个非常强大的工作,通过工件可以完成很多采集任务,在应急响应中可以起到很大的作用,当然坑点也不少,该工具还需持续完善,包括更多的文档介绍等等。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 中国白客联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档