Removed more old files

This commit is contained in:
Frikky
2025-06-26 00:24:50 +02:00
parent 0c9931a70f
commit 4f48d71252
44 changed files with 0 additions and 2278 deletions
@@ -1,2 +0,0 @@
# AWS Lambda forwarder to Shuffle
This function is made to forward S3 notifications to Shuffle to run a workflow when an object is made or updated.
@@ -1,22 +0,0 @@
import json
import urllib.parse
import urllib3
import os
print('Loading function')
def lambda_handler(event, context):
# Get the object from the event and show its content type
bucket = event['Records'][0]['s3']['bucket']['name']
webhook = os.environ.get("SHUFFLE_WEBHOOK")
if not webhook:
return "No webhook environment defined: SHUFFLE_WEBHOOK"
http = urllib3.PoolManager()
ret = http.request('POST', webhook, body=json.dumps(event["Records"][0]).encode("utf-8"))
if ret.status != 200:
return "Bad status code for webhook: %d" % ret.status
print("Status code: %d\nData: %s" % (ret.status, ret.data))
return "Successfully started with data %s" % ret.data
@@ -1,2 +0,0 @@
cortexutils
requests
@@ -1,43 +0,0 @@
{
"name": "Shuffle",
"version": "1.0",
"author": "@frikkylikeme",
"url": "https://github.com/frikky/shuffle",
"license": "AGPL-V3",
"description": "Execute a workflow in Shuffle",
"dataTypeList": ["thehive:case", "thehive:alert", "thehive:case_artifact"],
"command": "Shuffle/shuffle.py",
"baseConfig": "Shuffle",
"configurationItems": [
{
"name": "url",
"description": "The URL to your shuffle instance",
"type": "string",
"multi": false,
"required": true,
"defaultValue": "https://shuffler.io"
},
{
"name": "api_key",
"description": "The API key to your Shuffle user",
"type": "string",
"multi": false,
"required": true
},
{
"name": "verifyssl",
"description": "Verify SSL certificate",
"type": "boolean",
"multi": false,
"required": true,
"defaultValue": true
},
{
"name": "workflow_id",
"description": "The ID of the workflow to execute",
"type": "string",
"multi": false,
"required": true
}
]
}
@@ -1,27 +0,0 @@
#!/usr/bin/env python3
#encoding: utf-8
from cortexutils.responder import Responder
import requests
class Shuffle(Responder):
def __init__(self):
Responder.__init__(self)
self.api_key = self.get_param("config.api_key", "")
self.url = self.get_param("config.url", "")
self.workflow_id = self.get_param("config.workflow_id", "")
self.verify = self.get_param('config.verifyssl', True, None)
def run(self):
Responder.run(self)
parsed_url = "%s/api/v1/workflows/%s/execute" % (self.url, self.workflow_id)
headers = {
"Authorization": "Bearer %s" % self.api_key,
"User-Agent": "Cortex-Analyzer"
}
requests.post(parsed_url, headers=headers,verify=self.verify)
self.report({'message': 'message sent'})
if __name__ == '__main__':
Shuffle().run()
@@ -1,2 +0,0 @@
cortexutils
requests
@@ -1,28 +0,0 @@
{
"name": "Shuffle_webhook",
"version": "1.0",
"author": "@azgaviperr",
"url": "https://github.com/frikky/shuffle",
"license": "AGPL-V3",
"description": "Execute a webhook in Shuffle",
"dataTypeList": ["thehive:case", "thehive:alert", "thehive:case_artifact"],
"command": "Shuffle_Webhook/shuffle_webhook.py",
"baseConfig": "Shuffle_Webhook",
"configurationItems": [
{
"name": "webhook_url",
"description": "The URL to your shuffle instance",
"type": "string",
"multi": false,
"required": true
},
{
"name": "verifyssl",
"description": "Verify SSL certificate",
"type": "boolean",
"multi": false,
"required": true,
"defaultValue": true
}
]
}
@@ -1,28 +0,0 @@
#!/usr/bin/env python3
#encoding: utf-8
from cortexutils.responder import Responder
import requests
class Shuffle(Responder):
def __init__(self):
Responder.__init__(self)
self.api_key = self.get_param("config.api_key", "")
self.webhook_url = self.get_param("config.webhook_url", "")
self.webhook_id = self.get_param("config.webhook_id", "")
self.verify = self.get_param('config.verifyssl', True, None)
self.data = self.get_param('data')
def run(self):
Responder.run(self)
headers = {
"Content-Type": "application/json",
"Accept": "application/json",
"User-Agent": "Cortex-Analyzer"
}
requests.post(self.webhook_url, headers=headers,verify=self.verify, json=self.data)
self.report({'message': 'message sent'})
if __name__ == '__main__':
Shuffle().run()
-19
View File
@@ -1,19 +0,0 @@
#docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ELASTICSEARCH_USERNAME=frikky -e ELASTICSEARCH_PASSWORD=likeme -e xpack.security.enabled=true docker.elastic.co/elasticsearch/elasticsearch:7.12.1
#docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.12.1
#
#
#
#echo "\nWaiting for 1.5 minute, then adding data"
#sleep 90
#echo "\nSlept 90 seconds: ADDING DATA"
#curl -XPOST http://localhost:9200/_security/user/frikky -H "Content-Type: application/json" -d '{"enabled": true, "email": "frikky@shuffler.io"}'
#curl -XPOST -u frikky:likeme http://localhost:9200/samples/_doc -H "Content-Type: application/json" -d '{"src": "122.14.137.67", "dst": "103.35.191.16", "message": "alert", "md5": "CAEF973033E593C625FB2AA34F7026DC", "sha256": "DB1AEC5222075800EDA75D7205267569679B424E5C58A28102417F46D3B5790D", "hits": 0}'
#echo
#curl -XPOST -u frikky:likeme http://localhost:9200/samples/_doc -H "Content-Type: application/json" -d '{"src": "134.119.219.71", "dst": "103.35.191.41", "message": "alert", "md5": "9498FF82A64FF445398C8426ED63EA5B", "sha256": "8B2E701E91101955C73865589A4C72999AEABC11043F712E05FDB1C17C4AB19A", "hits": 0}'
#
#echo
#curl -XPOST -u frikky:likeme http://localhost:9200/samples2/_doc -H "Content-Type: application/json" -d '{"src": "122.14.137.67", "dst": "103.35.191.16", "message": "alert", "md5": "CAEF973033E593C625FB2AA34F7026DC", "sha256": "DB1AEC5222075800EDA75D7205267569679B424E5C58A28102417F46D3B5790D"}'
#echo
#curl -XPOST -u frikky:likeme http://localhost:9200/samples2/_doc -H "Content-Type: application/json" -d '{"src": "134.119.219.71", "dst": "103.35.191.41", "message": "alert", "md5": "9498FF82A64FF445398C8426ED63EA5B", "sha256": "8B2E701E91101955C73865589A4C72999AEABC11043F712E05FDB1C17C4AB19A"}'
#echo
@@ -1,23 +0,0 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*.orig
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/
@@ -1,24 +0,0 @@
apiVersion: v2
name: shuffle
description: A Helm chart for Kubernetes
# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.2.0
# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
appVersion: "2.0.0"
@@ -1,22 +0,0 @@
1. Get the application URL by running these commands:
{{- if .Values.ingress.enabled }}
{{- range $host := .Values.ingress.hosts }}
{{- range .paths }}
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
{{- end }}
{{- end }}
{{- else if contains "NodePort" .Values.service.type }}
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "shuffle.fullname" . }})
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
{{- else if contains "LoadBalancer" .Values.service.type }}
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "shuffle.fullname" . }}'
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "shuffle.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
echo http://$SERVICE_IP:{{ .Values.service.port }}
{{- else if contains "ClusterIP" .Values.service.type }}
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "shuffle.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
{{- end }}
@@ -1,62 +0,0 @@
{{/*
Expand the name of the chart.
*/}}
{{- define "shuffle.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "shuffle.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "shuffle.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "shuffle.labels" -}}
helm.sh/chart: {{ include "shuffle.chart" . }}
{{ include "shuffle.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "shuffle.selectorLabels" -}}
app.kubernetes.io/name: {{ include "shuffle.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Create the name of the service account to use
*/}}
{{- define "shuffle.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "shuffle.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
{{- end }}
@@ -1,253 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.name }}frontend
namespace: {{ .Values.namespace | quote }}
spec:
replicas: 1
selector:
matchLabels:
service: shuffle
app: shuffle-frontend
template:
metadata:
labels:
service: shuffle
app: shuffle-frontend
spec:
containers:
- name: shuffle-frontend
image: ghcr.io/frikky/shuffle-frontend:nightly
imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
env:
- name: BACKEND_HOSTNAME
value: backend-service
- name: TZ
value: Asia/Shanghai
ports:
- name: http
containerPort: 80
hostPort: 3001
- name: https
containerPort: 443
hostname: shuffle-frontend
restartPolicy: Always
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.name }}backend
namespace: {{ .Values.namespace | quote }}
spec:
replicas: 1
selector:
matchLabels:
service: shuffle
app: shuffle-backend
template:
metadata:
labels:
service: shuffle
app: shuffle-backend
spec:
containers:
- name: shuffle-backend
image: ghcr.io/frikky/shuffle-backend:nightly
env:
- name: BACKEND_HOSTNAME
value: "backend-service"
- name: BACKEND_PORT
value: "5001"
- name: ENVIRONMENT_NAME
value: "Shuffle"
- name: HTTPS_PROXY
- name: HTTP_PROXY
- name: ORG_ID
value: "Shuffle"
- name: OUTER_HOSTNAME
value: "backend-service"
- name: SHUFFLE_APP_FORCE_UPDATE
value: "false"
- name: SHUFFLE_APP_HOTLOAD_FOLDER
value: "/shuffle-apps"
- name: SHUFFLE_APP_HOTLOAD_LOCATION
value: "/shuffle-apps"
- name: SHUFFLE_CONTAINER_AUTO_CLEANUP
value: "false"
- name: SHUFFLE_DEFAULT_APIKEY
- name: SHUFFLE_DEFAULT_PASSWORD
- name: SHUFFLE_DEFAULT_USERNAME
- name: SHUFFLE_DOWNLOAD_AUTH_BRANCH
- name: SHUFFLE_DOWNLOAD_AUTH_PASSWORD
- name: SHUFFLE_DOWNLOAD_AUTH_USERNAME
- name: SHUFFLE_DOWNLOAD_WORKFLOW_BRANCH
- name: SHUFFLE_DOWNLOAD_WORKFLOW_LOCATION
- name: SHUFFLE_DOWNLOAD_WORKFLOW_PASSWORD
- name: SHUFFLE_DOWNLOAD_WORKFLOW_USERNAME
- name: SHUFFLE_ELASTIC
value: "true"
- name: SHUFFLE_OPENSEARCH_APIKEY
- name: SHUFFLE_OPENSEARCH_CERTIFICATE_FILE
- name: SHUFFLE_OPENSEARCH_CLOUDID
- name: SHUFFLE_OPENSEARCH_PASSWORD
- name: SHUFFLE_OPENSEARCH_PROXY
- name: SHUFFLE_OPENSEARCH_SKIPSSL_VERIFY
value: "true"
- name: SHUFFLE_OPENSEARCH_URL
value: http://opensearch-service:9200
- name: SHUFFLE_OPENSEARCH_USERNAME
value: ""
- name: SHUFFLE_PASS_APP_PROXY
value: "FALSE"
- name: SHUFFLE_PASS_WORKER_PROXY
value: "FALSE"
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-sock
- mountPath: /shuffle-apps
name: shuffle-app-hotload-location
- mountPath: /shuffle-files
name: shuffle-file-location
hostname: shuffle-backend
volumes:
- name: docker-sock
hostPath:
path: /var/run/docker.sock
- name: shuffle-app-hotload-location
hostPath:
path: /data/kubernetes/shuffle-apps
type: DirectoryOrCreate
- name: shuffle-file-location
hostPath:
path: /data/kubernetes/shuffle-files
type: DirectoryOrCreate
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.name }}orborus
namespace: {{ .Values.namespace | quote }}
spec:
replicas: 1
selector:
matchLabels:
service: shuffle
app: shuffle-orborus
template:
metadata:
labels:
service: shuffle
app: shuffle-orborus
spec:
containers:
- name: shuffle-orborus
image: ghcr.io/frikky/shuffle-orborus:nightly
env:
- name: RUNNING_MODE
value: kubernetes
- name: BASE_URL
value: http://backend-service:5001
- name: CLEANUP
value: "false"
- name: DOCKER_API_VERSION
value: "1.40"
- name: ENVIRONMENT_NAME
value: Shuffle
- name: HTTPS_PROXY
- name: HTTP_PROXY
- name: ORG_ID
value: Shuffle
- name: SHUFFLE_APP_SDK_VERSION
value: 0.8.97
- name: SHUFFLE_BASE_IMAGE_NAME
value: frikky
- name: SHUFFLE_BASE_IMAGE_REGISTRY
value: ghcr.io
- name: SHUFFLE_BASE_IMAGE_TAG_SUFFIX
value: "-0.8.80"
- name: SHUFFLE_ORBORUS_EXECUTION_TIMEOUT
value: "600"
- name: SHUFFLE_ORBORUS_EXECUTION_CONCURRENCY
value: "50"
- name: SHUFFLE_PASS_WORKER_PROXY
value: "TRUE"
- name: SHUFFLE_WORKER_VERSION
value: nightly
- name: TZ
value: Asia/Shanghai
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-sock
hostname: shuffle-orborus
volumes:
- name: docker-sock
hostPath:
path: /var/run/docker.sock
#---
#apiVersion: apps/v1
#kind: Deployment
#metadata:
# name: {{ .Values.name }}opensearch
# namespace: {{ .Values.namespace | quote }}
#spec:
# replicas: 1
# selector:
# matchLabels:
# service: shuffle
# app: shuffle-opensearch
# template:
# metadata:
# labels:
# service: shuffle
# app: shuffle-opensearch
# spec:
# nodeSelector:
# node.bdlab-venus.com/opensearch: available
# initContainers:
# - name: permissions-fix
# image: frikky/busybox
# #volumeMounts:
# # - name: opensearch-claim0
# # mountPath: /usr/share/elasticsearch/data
# command: [ 'chown' ]
# args: [ '1000:1000', '/usr/share/elasticsearch/data' ]
# containers:
# - name: shuffle-opensearch
# image: opensearchproject/opensearch:1.0.1
# env:
# - name: TZ
# value: Asia/Shanghai
# - name: bootstrap.memory_lock
# value: "false"
# - name: OPENSEARCH_JAVA_OPTS
# value: "-Xms1024m -Xmx1024m"
# - name: opendistro_security.disabled
# value: "true"
# - name: cluster.routing.allocation.disk.threshold_enabled
# value: "false"
# - name: cluster.name
# value: shuffle-cluster
# - name: node.name
# value: opensearch-service
# - name: discovery.seed_hosts
# value: opensearch-service
# - name: cluster.initial_master_nodes
# value: opensearch-service
# volumeMounts:
# - mountPath: /usr/share/opensearch/data
# name: opensearch-claim0
#volumes:
# - name: opensearch-claim0
# persistentVolumeClaim:
# claimName: opensearch-claim0
# volumeMounts:
# - mountPath: /usr/share/opensearch/data
# readOnly: true
# name: db-location
# volumes:
# - name: db-location
# hostPath:
# path: /data/kubernetes/shuffle-opensearch
# type: DirectoryOrCreate
@@ -1,28 +0,0 @@
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: {{ include "shuffle.fullname" . }}
labels:
{{- include "shuffle.labels" . | nindent 4 }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "shuffle.fullname" . }}
minReplicas: {{ .Values.autoscaling.minReplicas }}
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
metrics:
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
- type: Resource
resource:
name: cpu
targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
{{- end }}
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
- type: Resource
resource:
name: memory
targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
{{- end }}
{{- end }}
@@ -1,61 +0,0 @@
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "shuffle.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
{{- end }}
{{- end }}
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
name: {{ $fullName }}
labels:
{{- include "shuffle.labels" . | nindent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
ingressClassName: {{ .Values.ingress.className }}
{{- end }}
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.hosts }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ .path }}
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
pathType: {{ .pathType }}
{{- end }}
backend:
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
service:
name: {{ $fullName }}
port:
number: {{ $svcPort }}
{{- else }}
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
@@ -1,24 +0,0 @@
#apiVersion: v1
#kind: PersistentVolume
#metadata:
# name: opensearch-claim0
# labels:
# app: opensearch-claim0
#spec:
# capacity:
# storage: "10G"
# volumeMode: Filesystem
# persistentVolumeReclaimPolicy: Retain
# storageClassName: local-storage
# accessModes:
# - "ReadWriteOnce"
# local:
# path: "/data/kubernetes/shuffle-opensearch"
# nodeAffinity:
# required:
# nodeSelectorTerms:
# - matchExpressions:
# - key: node.dollar.com/opensearch
# operator: In
# values:
# - available
@@ -1,17 +0,0 @@
#apiVersion: v1
#kind: PersistentVolumeClaim
#metadata:
# name: opensearch-claim0
# namespace: {{ .Values.namespace }}
# labels:
# app: opensearch-claim0
#spec:
# selector:
# matchLabels:
# app: opensearch-claim0
# accessModes:
# - ReadWriteOnce
# storageClassName: local-storage
# resources:
# requests:
# storage: 5Gi
@@ -1,52 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: backend-service
namespace: {{ .Values.namespace | quote }}
spec:
ports:
- name: "5001"
port: 5001
targetPort: 5001
selector:
app: shuffle-backend
---
apiVersion: v1
kind: Service
metadata:
name: frontend-service
namespace: {{ .Values.namespace | quote }}
spec:
type: NodePort
externalTrafficPolicy: Local
ports:
- name: "3001"
port: 3001
nodePort: 3001
targetPort: 80
- name: "3443"
port: 3443
nodePort: 3443
targetPort: 443
protocol: TCP
selector:
app: shuffle-frontend
#---
#apiVersion: v1
#kind: Service
#metadata:
# name: opensearch-service
# namespace: {{ .Values.namespace | quote }}
#spec:
# type: NodePort
# externalTrafficPolicy: Local
# ports:
# - name: "9200"
# port: 9200
# targetPort: 9200
# nodePort: 9200
# protocol: TCP
# selector:
# app: shuffle-opensearch
@@ -1,12 +0,0 @@
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "shuffle.serviceAccountName" . }}
labels:
{{- include "shuffle.labels" . | nindent 4 }}
{{- with .Values.serviceAccount.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}
@@ -1,15 +0,0 @@
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "shuffle.fullname" . }}-test-connection"
labels:
{{- include "shuffle.labels" . | nindent 4 }}
annotations:
"helm.sh/hook": test
spec:
containers:
- name: wget
image: busybox
command: ['wget']
args: ['{{ include "shuffle.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never
@@ -1,82 +0,0 @@
# Default values for shuffle.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: nginx
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: ""
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
serviceAccount:
# Specifies whether a service account should be created
create: true
# Annotations to add to the service account
annotations: {}
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name: ""
podAnnotations: {}
podSecurityContext: {}
# fsGroup: 2000
securityContext: {}
# capabilities:
# drop:
# - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000
service:
type: ClusterIP
port: 80
ingress:
enabled: false
className: ""
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- host: chart-example.local
paths:
- path: /
pathType: ImplementationSpecific
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local
resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80
nodeSelector: {}
tolerations: []
affinity: {}
-23
View File
@@ -1,23 +0,0 @@
FROM python:3.9.4-alpine as base
FROM base as builder
RUN mkdir /install
WORKDIR /install
FROM base
RUN apk add g++
COPY --from=builder /install /usr/local
COPY requirements.txt /requirements.txt
RUN pip3 install -r /requirements.txt
RUN mkdir /app
WORKDIR /app
COPY requirements.txt /app/requirements.txt
RUN python3 -m pip install -r /app/requirements.txt
COPY sub.py /app/sub.py
CMD ["python3", "sub.py"]
@@ -1,9 +0,0 @@
version: '3'
services:
zmq:
image: ghcr.io/frikky/shuffle-zmq:latest
environment:
- ZMQ_HOSTNAME=localhost
- ZMQ_PORT=50000
- ZMQ_FORWARD_URL=https://shuffler.io/api/v1/hooks/webhook_e09bea36-9976-1421-82bc-b8764ca83c1e
restart: unless-stopped
@@ -1,2 +0,0 @@
pyzmq
requests
-57
View File
@@ -1,57 +0,0 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
print("Running imports")
import sys
import zmq
import json
import time
import pprint
import os
import sys
import requests
forward_url = os.getenv("ZMQ_FORWARD_URL", "")
print("Checking forward url (ZMQ_FORWARD_URL): %s" % forward_url)
def handle_hook(data):
ret = requests.post(forward_url, json=data)
print(ret.text)
print(ret.status_code)
def main():
host = os.getenv("ZMQ_HOST", "localhost")
port = os.getenv("ZMQ_PORT", "50000")
if len(forward_url) == 0:
print("Failed to start - define ZMQ_FORWARD_URL for webhook forwarder")
exit(0)
print("Starting connection setup to %s:%s" % (host, port))
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect ("tcp://%s:%s" % (host, port))
socket.setsockopt(zmq.SUBSCRIBE, b'')
poller = zmq.Poller()
poller.register(socket, zmq.POLLIN)
print("Starting zmq check for %s:%s" % (host, port))
while True:
socks = dict(poller.poll(timeout=None))
if socket in socks and socks[socket] == zmq.POLLIN:
message = socket.recv()
#print(message)
topic, s, m = message.decode('utf-8').partition(" ")
d = json.loads(m)
try:
# print test if you want status (heartbeat)
test = d["status"]
except KeyError:
handle_hook(d)
time.sleep(1)
if __name__ == "__main__":
print("In init ")
main()
@@ -1,11 +0,0 @@
curl -XPUT -u admin:admin https://localhost:9200/_cluster/settings -H "Content-Type:application/json" -k -d \
'{
"transient": {
"cluster.routing.allocation.disk.threshold_enabled": false
}
}'
curl -XPUT -u admin:admin https://localhost:9200/_all/_settings -H "Content-Type: application/json" -k -d \
'{
"index.blocks.read_only_allow_delete": null
}'
-1
View File
@@ -1 +0,0 @@
shuffle-database/nodes
@@ -1,131 +0,0 @@
version: '3.4'
services:
backend:
image: ghcr.io/frikky/shuffle-backend:nightly
#hostname: shuffle-backend
environment:
BACKEND_HOSTNAME: backend
OUTER_HOSTNAME: backend
BACKEND_PORT: '5001'
HTTPS_PROXY: ''
HTTP_PROXY: ''
SHUFFLE_APP_DOWNLOAD_LOCATION: https://github.com/frikky/shuffle-apps
SHUFFLE_APP_FORCE_UPDATE: 'false'
SHUFFLE_APP_HOTLOAD_FOLDER: /shuffle-apps
SHUFFLE_APP_HOTLOAD_LOCATION: ./shuffle-apps
DATASTORE_EMULATOR_HOST: "shuffle-database:8000"
DOCKER_API_VERSION: '1.40'
SHUFFLE_BASE_IMAGE_NAME: frikky
SHUFFLE_BASE_IMAGE_REGISTRY: ghcr.io
SHUFFLE_BASE_IMAGE_TAG_SUFFIX: '-0.9.30'
SHUFFLE_CONTAINER_AUTO_CLEANUP: 'true'
SHUFFLE_DEFAULT_APIKEY: ''
SHUFFLE_FILE_LOCATION: /shuffle-files
SHUFFLE_OPENSEARCH_APIKEY: ''
SHUFFLE_OPENSEARCH_CERTIFICATE_FILE: ''
SHUFFLE_OPENSEARCH_CLOUDID: ''
SHUFFLE_OPENSEARCH_PROXY: ''
SHUFFLE_OPENSEARCH_SKIPSSL_VERIFY: 'true'
SHUFFLE_OPENSEARCH_URL: http://opensearch:9200
SHUFFLE_PASS_APP_PROXY: 'FALSE'
SHUFFLE_PASS_WORKER_PROXY: 'TRUE'
SHUFFLE_ELASTIC: 'true'
#SHUFFLE_ENCRYPTION_MODIFIER:
ports:
- "5001:5001"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./shuffle-apps:/shuffle-apps
- ./shuffle-files:/shuffle-files
networks:
- shuffle_prod
#- reverseproxy
depends_on:
- opensearch
logging:
driver: json-file
frontend:
image: ghcr.io/frikky/shuffle-frontend:nightly
healthcheck:
test: curl -fs http://localhost:80 || exit 1
interval: 30s
timeout: 5s
retries: 3
ports:
- "3001:80"
- "3443:443"
networks:
- shuffle_prod
#- reverseproxy
environment:
- "BACKEND_HOSTNAME=backend"
depends_on:
- backend
deploy:
update_config:
order: start-first
opensearch:
image: opensearchproject/opensearch:1.1.0
healthcheck:
test: curl -fs http://localhost:9200/_cat/health || exit 1
interval: 30s
timeout: 5s
retries: 3
environment:
- bootstrap.memory_lock=false
- "OPENSEARCH_JAVA_OPTS=-Xms1024m -Xmx1024m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM
- plugins.security.disabled=true
- cluster.routing.allocation.disk.threshold_enabled=false
- cluster.name=shuffle-cluster
- node.name=opensearch
- discovery.seed_hosts=opensearch
- cluster.initial_master_nodes=opensearch
- node.store.allow_mmap=false
volumes:
- ./shuffle-database:/usr/share/opensearch/data:rw
networks:
- shuffle_prod
#- reverseproxy
logging:
driver: json-file
orborus:
image: ghcr.io/frikky/shuffle-orborus:nightly
#hostname: shuffle-orborus
environment:
#SHUFFLE_WORKER_VERSION: nightly
SHUFFLE_APP_SDK_VERSION: 0.8.97
SHUFFLE_WORKER_VERSION: nightly
BASE_URL: http://backend:5001
#BASE_URL: http://192.168.86.37:5001
CLEANUP: 'true'
DOCKER_API_VERSION: '1.40'
ENVIRONMENT_NAME: Shuffle
HTTPS_PROXY: ''
HTTP_PROXY: ''
ORG_ID: Shuffle
SHUFFLE_BASE_IMAGE_NAME: frikky
SHUFFLE_BASE_IMAGE_REGISTRY: ghcr.io
SHUFFLE_BASE_IMAGE_TAG_SUFFIX: -0.8.80
SHUFFLE_ORBORUS_EXECUTION_CONCURRENCY: '50'
SHUFFLE_ORBORUS_EXECUTION_TIMEOUT: '800'
SHUFFLE_PASS_APP_PROXY: 'FALSE'
SHUFFLE_PASS_WORKER_PROXY: 'TRUE'
SHUFFLE_SCALE_REPLICAS: 5
SHUFFLE_SWARM_NETWORK_NAME: shuffle_prod
SHUFFLE_SWARM_CONFIG: "run"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- shuffle_prod
#- reverseproxy
logging:
driver: json-file
networks:
shuffle_prod:
driver: overlay
external: true
#reverseproxy:
# driver: overlay
# #external: true
-1
View File
@@ -1 +0,0 @@
docker network create -d overlay shuffle_prod
-39
View File
@@ -1,39 +0,0 @@
version: '3.4'
services:
orborus:
image: ghcr.io/frikky/shuffle-orborus:nightly
#hostname: shuffle-orborus
environment:
#SHUFFLE_WORKER_VERSION: nightly
SHUFFLE_APP_SDK_VERSION: 0.8.97
SHUFFLE_WORKER_VERSION: nightly
BASE_URL: http://<BACKEND>:5001
#BASE_URL: http://192.168.86.37:5001
CLEANUP: 'true'
DOCKER_API_VERSION: '1.40'
ENVIRONMENT_NAME: Shuffle
HTTPS_PROXY: ''
HTTP_PROXY: ''
ORG_ID: Shuffle
SHUFFLE_BASE_IMAGE_NAME: frikky
SHUFFLE_BASE_IMAGE_REGISTRY: ghcr.io
SHUFFLE_BASE_IMAGE_TAG_SUFFIX: -0.8.80
SHUFFLE_ORBORUS_EXECUTION_CONCURRENCY: '50'
SHUFFLE_ORBORUS_EXECUTION_TIMEOUT: '800'
SHUFFLE_PASS_APP_PROXY: 'FALSE'
SHUFFLE_PASS_WORKER_PROXY: 'TRUE'
SHUFFLE_SCALE_REPLICAS: 5
SHUFFLE_SWARM_NETWORK_NAME: shuffle_prod
SHUFFLE_SWARM_CONFIG: "run"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- shuffle_prod
#- reverseproxy
logging:
driver: json-file
networks:
shuffle_prod:
driver: overlay
external: true
-4
View File
@@ -1,4 +0,0 @@
docker swarm init
chown 1000:1000 -R shuffle-database/
docker network create -d overlay shuffle_prod
docker stack deploy --compose-file=docker-compose.yml shuffle_swarm
@@ -1,4 +0,0 @@
docker swarm init
chown 1000:1000 -R shuffle-database/
docker network create -d overlay shuffle_prod
docker stack deploy --compose-file=orborus.yml shuffle_orborus
-3
View File
@@ -1,3 +0,0 @@
docker stack rm shuffle_swarm
#
-36
View File
@@ -1,36 +0,0 @@
#!/bin/sh
# Created by Shuffle, AS. <frikky@shuffler.io>.
WPYTHON_BIN="framework/python/bin/python3"
SCRIPT_PATH_NAME="$0"
DIR_NAME="$(cd $(dirname ${SCRIPT_PATH_NAME}); pwd -P)"
SCRIPT_NAME="$(basename ${SCRIPT_PATH_NAME})"
case ${DIR_NAME} in
*/active-response/bin | */wodles*)
if [ -z "${WAZUH_PATH}" ]; then
WAZUH_PATH="$(cd ${DIR_NAME}/../..; pwd)"
fi
PYTHON_SCRIPT="${DIR_NAME}/${SCRIPT_NAME}.py"
;;
*/bin)
if [ -z "${WAZUH_PATH}" ]; then
WAZUH_PATH="$(cd ${DIR_NAME}/..; pwd)"
fi
PYTHON_SCRIPT="${WAZUH_PATH}/framework/scripts/${SCRIPT_NAME}.py"
;;
*/integrations)
if [ -z "${WAZUH_PATH}" ]; then
WAZUH_PATH="$(cd ${DIR_NAME}/..; pwd)"
fi
PYTHON_SCRIPT="${DIR_NAME}/${SCRIPT_NAME}.py"
;;
esac
${WAZUH_PATH}/${WPYTHON_BIN} ${PYTHON_SCRIPT} "$@"
@@ -1,206 +0,0 @@
#!/usr/bin/env python3
# Created by Shuffle, AS. <frikky@shuffler.io>.
# Based on the Slack integration using Webhooks
import json
import sys
import time
import os
try:
import requests
from requests.auth import HTTPBasicAuth
except Exception as e:
print("No module 'requests' found. Install: pip install requests")
sys.exit(1)
# ADD THIS TO ossec.conf configuration:
# <integration>
# <name>custom-shuffle</name>
# <hook_url>http://<IP>:3001/api/v1/hooks/<HOOK_ID></hook_url>
# <level>3</level>
# <alert_format>json</alert_format>
# </integration>
# Global vars
debug_enabled = False
pwd = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
json_alert = {}
now = time.strftime("%a %b %d %H:%M:%S %Z %Y")
# Set paths
log_file = '{0}/logs/integrations.log'.format(pwd)
try:
with open("/tmp/shuffle_start.txt", "w+") as tmp:
tmp.write("Script started")
except:
pass
def main(args):
debug("# Starting")
# Read args
alert_file_location = args[1]
webhook = args[3]
debug("# Webhook")
debug(webhook)
debug("# File location")
debug(alert_file_location)
# Load alert. Parse JSON object.
try:
with open(alert_file_location) as alert_file:
json_alert = json.load(alert_file)
except:
debug("# Alert file %s doesn't exist" % alert_file_location)
debug("# Processing alert")
try:
debug(json_alert)
except Exception as e:
debug("Failed getting json_alert %s" % e)
sys.exit(1)
debug("# Generating message")
msg = generate_msg(json_alert)
if isinstance(msg, str):
if len(msg) == 0:
return
debug(msg)
debug("# Sending message")
try:
with open("/tmp/shuffle_end.txt", "w+") as tmp:
tmp.write("Script done pre-msg sending")
except:
pass
send_msg(msg, webhook)
def debug(msg):
if debug_enabled:
msg = "{0}: {1}\n".format(now, msg)
print(msg)
f = open(log_file, "a")
f.write(msg)
f.close()
# Skips container kills to stop self-recursion
def filter_msg(alert):
# These are things that recursively happen because Shuffle starts Docker containers
skip = ["87924", "87900", "87901", "87902", "87903", "87904", "86001", "86002", "86003", "87932", "80710", "87929", "87928", "5710"]
if alert["rule"]["id"] in skip:
return False
#try:
# if "docker" in alert["rule"]["description"].lower() and "
#msg['text'] = alert.get('full_log')
#except:
# pass
#msg['title'] = alert['rule']['description'] if 'description' in alert['rule'] else "N/A"
return True
def generate_msg(alert):
if not filter_msg(alert):
print("Skipping rule %s" % alert["rule"]["id"])
return ""
level = alert['rule']['level']
if (level <= 4):
severity = 1
elif (level >= 5 and level <= 7):
severity = 2
else:
severity = 3
msg = {}
msg['severity'] = severity
msg['pretext'] = "WAZUH Alert"
msg['title'] = alert['rule']['description'] if 'description' in alert['rule'] else "N/A"
msg['text'] = alert.get('full_log')
msg['rule_id'] = alert["rule"]["id"]
msg['timestamp'] = alert["timestamp"]
msg['id'] = alert['id']
msg["all_fields"] = alert
#msg['fields'] = []
# msg['fields'].append({
# "title": "Agent",
# "value": "({0}) - {1}".format(
# alert['agent']['id'],
# alert['agent']['name']
# ),
# })
#if 'agentless' in alert:
# msg['fields'].append({
# "title": "Agentless Host",
# "value": alert['agentless']['host'],
# })
#msg['fields'].append({"title": "Location", "value": alert['location']})
#msg['fields'].append({
# "title": "Rule ID",
# "value": "{0} _(Level {1})_".format(alert['rule']['id'], level),
#})
#attach = {'attachments': [msg]}
return json.dumps(msg)
def send_msg(msg, url):
debug("# In send msg")
headers = {'content-type': 'application/json', 'Accept-Charset': 'UTF-8'}
res = requests.post(url, data=msg, headers=headers, verify=False)
debug("# After send msg: %s" % res)
if __name__ == "__main__":
try:
# Read arguments
bad_arguments = False
if len(sys.argv) >= 4:
msg = '{0} {1} {2} {3} {4}'.format(
now,
sys.argv[1],
sys.argv[2],
sys.argv[3],
sys.argv[4] if len(sys.argv) > 4 else '',
)
#debug_enabled = (len(sys.argv) > 4 and sys.argv[4] == 'debug')
debug_enabled = True
else:
msg = '{0} Wrong arguments'.format(now)
bad_arguments = True
# Logging the call
try:
f = open(log_file, 'a')
except:
f = open(log_file, 'w+')
f.write("")
f.close()
f = open(log_file, 'a')
f.write(msg + '\n')
f.close()
if bad_arguments:
debug("# Exiting: Bad arguments. Inputted: %s" % sys.argv)
sys.exit(1)
# Main function
main(sys.argv)
except Exception as e:
debug(str(e))
raise
-6
View File
@@ -1,6 +0,0 @@
<integration>
<name>custom-shuffle</name>
<level>9</level>
<hook_url>http://<IP>:<PORT>/api/v1/hooks/webhook_hookid</hook_url>
<alert_format>json</alert_format>
</integration>
-16
View File
@@ -1,16 +0,0 @@
# Mindmap exporter
Shuffle has a mindmap for Workflow use-cases. These can be changed and exported, with the most important piece being that they're explorable and editable. This has and will come in handy for us as we build it into the product.
https://www.mindmeister.com/map/2172644474
## Editing the Mindmap
There are a few categories. To edit them, click the small plus next to the branch you want to change.
## Exporting the Mindmap
Click "Export as RTF" in the top left corner of the URL. Download it there.
## Generating the Shuffle-comaptible mindmap
1. Move the rtf file here
2. Rename it categories.rtf
3. Run the read_categories.py file (python3 read_categories.py)
4. You now have a file called categories.json locally with all the categories in JSON format, ready to be used in graphs.
-260
View File
@@ -1,260 +0,0 @@
[
{
"name": "1. Collect & Distribute",
"color": "#c51152",
"list": [
{
"name": "2-way Ticket synchronization",
"items": {}
},
{
"name": "Email management",
"items": {
"name": "Release a quarantined message",
"items": {}
}
},
{
"name": "EDR to ticket",
"items": {
"name": "Get host information",
"items": {}
}
},
{
"name": "SIEM to ticket",
"items": {}
},
{
"name": "ChatOps",
"items": {}
},
{
"name": "Threat Intel received",
"items": {}
},
{
"name": "Domain investigation with LetsEncrypt",
"items": {}
},
{
"name": "Botnet tracker",
"items": {}
},
{
"name": "Get running containers",
"items": {}
},
{
"name": "Assign tickets",
"items": {}
},
{
"name": "Firewall alerts",
"items": {
"name": "URL filtering",
"items": {}
}
},
{
"name": "IDS/IPS alerts",
"items": {
"name": "Manage policies",
"items": {}
}
},
{
"name": "Deduplicate information",
"items": {}
},
{
"name": "Correlate information",
"items": {}
}
]
},
{
"name": "2. Enrich",
"color": "#f4c20d",
"list": [
{
"name": "Internal Enrichment",
"items": {
"name": "...",
"items": {}
}
},
{
"name": "External historical Enrichment",
"items": {
"name": "...",
"items": {}
}
},
{
"name": "Realtime",
"items": {
"name": "Analyze screenshots",
"items": {}
}
},
{
"name": "Ticketing webhook verification",
"items": {}
}
]
},
{
"name": "3. Detect",
"color": "#3cba54",
"list": [
{
"name": "Search SIEM (Sigma)",
"items": {
"name": "Endpoint",
"items": {}
}
},
{
"name": "Search EDR (OSQuery)",
"items": {}
},
{
"name": "Search emails (Phish)",
"items": {
"name": "Check headers and IOCs",
"items": {}
}
},
{
"name": "Search IOCs (ioc-finder)",
"items": {}
},
{
"name": "Search files (Yara)",
"items": {}
},
{
"name": "Correlate tickets",
"items": {}
},
{
"name": "Honeypot access",
"items": {
"name": "...",
"items": {}
}
}
]
},
{
"name": "4. Respond",
"color": "#4a148c",
"list": [
{
"name": "Eradicate malware",
"items": {}
},
{
"name": "Quarantine host(s)",
"items": {}
},
{
"name": "Trigger scans",
"items": {}
},
{
"name": "Update indicators (FW, EDR, SIEM...)",
"items": {}
},
{
"name": "Autoblock activity when threat intel is received",
"items": {}
},
{
"name": "Lock/Delete/Reset account",
"items": {}
},
{
"name": "Lock vault",
"items": {}
},
{
"name": "Increase authentication",
"items": {}
},
{
"name": "Get policies from assets",
"items": {}
}
]
},
{
"name": "5. Verify",
"color": "#4885ed",
"list": [
{
"name": "Discover vulnerabilities",
"items": {}
},
{
"name": "Discover assets",
"items": {}
},
{
"name": "Ensure policies are followed",
"items": {}
},
{
"name": "Find Inactive users",
"items": {}
},
{
"name": "Ensure access rights match HR systems",
"items": {}
},
{
"name": "Ensure onboarding is followed",
"items": {}
},
{
"name": "Third party apps in SaaS",
"items": {}
},
{
"name": "Devices used for your cloud account",
"items": {}
},
{
"name": "Too much access in GCP/Azure/AWS/ other clouds",
"items": {}
},
{
"name": "Certificate validation",
"items": {}
},
{
"name": "Monitor new DNS entries for domain with passive DNS",
"items": {}
},
{
"name": "Monitor and track password dumps",
"items": {}
},
{
"name": "Monitor for mentions of domain on darknet sites",
"items": {}
},
{
"name": "Reporting",
"items": {
"name": "Monthly reports",
"items": {
"name": "...",
"items": {}
}
}
}
]
}
]
-555
View File
@@ -1,555 +0,0 @@
{\rtf1\ansi\deff0\deflang2057\plain\fs24\fet1
{\fonttbl
{\f0\froman Arial;}
}
{\info
{\createim\yr2022\mo2\dy20\hr1\min15}
}
\paperw11907\paperh16840\margl1800\margr1800\margt1440\margb1440
\slmult0\ltrpar\li0
{\b\fs28
Shuffle categories
}
\par\pard\plain
\slmult0\ltrpar\li200
{\fs24
1. Collect & Distribute
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
2-way Ticket synchronization
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Email management
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Attachments
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Manage senders
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Manage URLs
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Encode & Decode URLs
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Release a quarantined message
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
EDR to ticket
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Fetch incidents & events
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Quarantine files
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Quarantine host (respond)
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Get host information
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
SIEM to ticket
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
ChatOps
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Threat Intel received
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Domain investigation with LetsEncrypt
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Botnet tracker
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Get running containers
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Assign tickets
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Firewall alerts
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Block/accept policies
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Add addresses and ports to groups
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Support custom URL categories
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Fetch logs for specific address
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
URL filtering
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
IDS/IPS alerts
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Get/Fetch alerts
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Receive alerts real-time
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Get PCAP files
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Get network logs
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Manage policies
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Deduplicate information
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Correlate information
}
\par\pard\plain
\slmult0\ltrpar\li200
{\fs24
3. Detect
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Search SIEM (Sigma)
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Network
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Endpoint
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Search EDR (OSQuery)
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Search emails (Phish)
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Check malware
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Check targeted
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Check headers and IOCs
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Search IOCs (ioc-finder)
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Search files (Yara)
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Correlate tickets
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Honeypot access
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
S3 Honeypot
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
SSH Honeypot
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
FTP honeypot
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Network honeypot
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
...
}
\par\pard\plain
\slmult0\ltrpar\li200
{\fs24
rich
}
\par\pard\plain
\slmult0\ltrpar\li200
{\fs24
5. Verify
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Discover vulnerabilities
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Discover assets
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Ensure policies are followed
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Find Inactive users
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Ensure access rights match HR systems
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Ensure onboarding is followed
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Third party apps in SaaS
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Devices used for your cloud account
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Too much access in GCP/Azure/AWS/ other clouds
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Certificate validation
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Monitor new DNS entries for domain with passive DNS
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Monitor and track password dumps
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Monitor for mentions of domain on darknet sites
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Reporting
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Automation time saved
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Automation money saved
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Incident response report
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Department cost
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Monthly reports
}
\par\pard\plain
\slmult0\ltrpar\li800
{\fs24
EDR alerts
}
\par\pard\plain
\slmult0\ltrpar\li800
{\fs24
SIEM alerts
}
\par\pard\plain
\slmult0\ltrpar\li800
{\fs24
Emails quarantined
}
\par\pard\plain
\slmult0\ltrpar\li800
{\fs24
...
}
\par\pard\plain
\slmult0\ltrpar\li200
{\fs24
4. Respond
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Eradicate malware
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Quarantine host(s)
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Trigger scans
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Update indicators (FW, EDR, SIEM...)
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Autoblock activity when threat intel is received
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Lock/Delete/Reset account
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Lock vault
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Increase authentication
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Get policies from assets
}
\par\pard\plain
\slmult0\ltrpar\li200
{\fs24
2. Enrich
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Internal Enrichment
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Users
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Hostnames
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
IPs
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Departments
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Role
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Software
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
...
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
External historical Enrichment
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
IPs
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
URLs
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Hashes
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Files
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
...
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Realtime
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
File detonation
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
URL detonation
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
PCAP analysis
}
\par\pard\plain
\slmult0\ltrpar\li600
{\fs24
Analyze screenshots
}
\par\pard\plain
\slmult0\ltrpar\li400
{\fs24
Ticketing webhook verification
}
\par\pard\plain
}
-66
View File
@@ -1,66 +0,0 @@
data = ""
with open("categories.rtf", "r") as tmp:
data = tmp.read()
fixed_json = []
linearity = 0
heading = ""
subheading = ""
subsubheading = ""
cnt = -1
subcnt = -1
colors = ["#c51152", "#3cba54", "#4885ed", "#4a148c", "#f4c20d"]
for line in data.split("\n"):
if line == "rich":
continue
if "li" in line:
lisplit = line.split("\\")
try:
linearity = int(lisplit[-1][2])
except:
pass
#print("Linearity: %s" % linearity)
if line.startswith("{") or line.startswith("}"):
continue
if line.startswith("\\"):
continue
if linearity == 0:
continue
if linearity == 2:
#if cnt >= 0:
# for key, value in fixed_json[cnt].items():
# print(key, value)
cnt += 1
subcnt = -1
fixed_json.append({"name": line, "color": colors[cnt], "list": []})
heading = line
elif linearity == 4:
subheading = line
fixed_json[cnt]["list"].append({"name": line, "items": {}})
subcnt += 1
elif linearity == 6:
fixed_json[cnt]["list"][subcnt]["items"] = {"name": line, "items": {}}
elif linearity == 8:
fixed_json[cnt]["list"][subcnt]["items"]["items"] = {"name": line, "items": {}}
else:
print("No handler for %s" % line)
#print(line)
#print(data)
import json
filename = "categories.json"
fixed_json.sort(key=lambda x: x["name"])
with open(filename, "w+") as tmp:
tmp.write(json.dumps(fixed_json, indent=4))
print("Wrote to file %s" % filename)