其他文章推荐
前言
刷到顺丰安全发表关于Velociraptor的文章,提到可以用它实现数据的查询,在应急的时候起很大作用,再加上刷到Velociraptor的一个ppt,笔者觉得挺不错,就来体验下。
安装
下载完成以后,生成配置文件,期间会让你填写hostname、绑定端口、ui的账号密码等等:
./velociraptor-v0.72.0-linux-amd64 config generate -i
第一个坑点,生成完以后,就算hostname写的外网ip,他的ui端口还是绑定在127上面,因此需要改生成出来的server.config.yaml文件把里面的127.0.0.0全部改成你的外网IP,可能API接口不需要改,但是为了方便笔者是直接全部改掉了。然后执行如下命令启动UI:
velociraptor --config server.config.yaml frontend -v
地址为:
https://your_ip:8889/app/index.html#/
为了方便可以创建服务来启动常驻的UI而不用每次都执行上述命令:
# 生成服务端包,笔者这里是生成rpm
./velociraptor-v0.72.0-linux-amd64 --config server.config.yaml rpm server
rpm -i velociraptor-server-0.72.0.x86_64.rpm
第二个坑点来了,他创建的服务是以velociraptor用户启动的,虽然机器上有这个用户但是迟迟运行不起来。后面发现是日志目录权限不足导致的,因此需要给这些目录配置好权限:
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,到相应的机器上注册节点就行:
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的原因是因为在应急时有所帮助,那么可以设定这么一个场景:
现在已经发现/tmp/evil_是恶意木马,需要定位所有网内执行过该命令的机器,包括持续观察未来的机器是否有执行迹象。
现在有几个思路:
1. 通过获取机器上的进程来判断 - 不可取,因此是一次性的,且进程可能在获取时不在运行
2. 通过hunter下发工件来获取机器上历史的命令记录 - 本文尝试该思路,因为hunter在上面提到可以持续监控所有机器,包括新上线的机器
获取历史命令记录将依托于audit实现,因此需要事先安装好audit服务并开启execve命令记录:
-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等:
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是一个非常强大的工作,通过工件可以完成很多采集任务,在应急响应中可以起到很大的作用,当然坑点也不少,该工具还需持续完善,包括更多的文档介绍等等。