mirror of
https://github.com/mariocandela/beelzebub.git
synced 2025-07-01 18:47:26 -04:00

* improve beelzebub cloud integration * refactoring cloud integration, fix unit test * add unit test get honeypots * improve code coverage
231 lines
6.1 KiB
Go
231 lines
6.1 KiB
Go
package plugins
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/go-resty/resty/v2"
|
|
"github.com/jarcoal/httpmock"
|
|
"github.com/mariocandela/beelzebub/v3/parser"
|
|
"github.com/mariocandela/beelzebub/v3/tracer"
|
|
"github.com/stretchr/testify/assert"
|
|
"net/http"
|
|
"testing"
|
|
)
|
|
|
|
func TestBuildSendEventFailValidation(t *testing.T) {
|
|
beelzebubCloud := InitBeelzebubCloud("", "")
|
|
|
|
_, err := beelzebubCloud.SendEvent(tracer.Event{})
|
|
|
|
assert.Equal(t, "authToken is empty", err.Error())
|
|
}
|
|
|
|
func TestBuildSendEventWithResults(t *testing.T) {
|
|
client := resty.New()
|
|
httpmock.ActivateNonDefault(client.GetClient())
|
|
defer httpmock.DeactivateAndReset()
|
|
|
|
uri := "localhost:8081"
|
|
|
|
// Given
|
|
httpmock.RegisterResponder("POST", fmt.Sprintf("%s/events", uri),
|
|
func(req *http.Request) (*http.Response, error) {
|
|
resp, err := httpmock.NewJsonResponse(200, &tracer.Event{})
|
|
if err != nil {
|
|
return httpmock.NewStringResponse(500, ""), nil
|
|
}
|
|
return resp, nil
|
|
},
|
|
)
|
|
|
|
beelzebubCloud := InitBeelzebubCloud(uri, "sdjdnklfjndslkjanfk")
|
|
beelzebubCloud.client = client
|
|
|
|
//When
|
|
result, err := beelzebubCloud.SendEvent(tracer.Event{})
|
|
|
|
//Then
|
|
assert.Equal(t, true, result)
|
|
assert.Nil(t, err)
|
|
}
|
|
|
|
func TestBuildSendEventErro(t *testing.T) {
|
|
client := resty.New()
|
|
httpmock.ActivateNonDefault(client.GetClient())
|
|
defer httpmock.DeactivateAndReset()
|
|
|
|
uri := "localhost:8081/events"
|
|
|
|
// Given
|
|
httpmock.RegisterResponder("POST", uri,
|
|
func(req *http.Request) (*http.Response, error) {
|
|
return httpmock.NewStringResponse(500, ""), nil
|
|
},
|
|
)
|
|
|
|
beelzebubCloud := InitBeelzebubCloud(uri, "sdjdnklfjndslkjanfk")
|
|
beelzebubCloud.client = client
|
|
|
|
//When
|
|
result, _ := beelzebubCloud.SendEvent(tracer.Event{})
|
|
|
|
//Then
|
|
assert.Equal(t, false, result)
|
|
}
|
|
|
|
func TestGetHoneypotsConfigurationsWithResults(t *testing.T) {
|
|
client := resty.New()
|
|
httpmock.ActivateNonDefault(client.GetClient())
|
|
defer httpmock.DeactivateAndReset()
|
|
|
|
uri := "localhost:8081"
|
|
|
|
// Given
|
|
httpmock.RegisterResponder("GET", fmt.Sprintf("%s/honeypots", uri),
|
|
func(req *http.Request) (*http.Response, error) {
|
|
resp, err := httpmock.NewJsonResponse(200, &[]HoneypotConfigResponseDTO{
|
|
{
|
|
ID: "123456",
|
|
Config: "apiVersion: \"v1\"\nprotocol: \"ssh\"\naddress: \":2222\"\ndescription: \"SSH interactive ChatGPT\"\ncommands:\n - regex: \"^(.+)$\"\n plugin: \"LLMHoneypot\"\nserverVersion: \"OpenSSH\"\nserverName: \"ubuntu\"\npasswordRegex: \"^(root|qwerty|Smoker666|123456|jenkins|minecraft|sinus|alex|postgres|Ly123456)$\"\ndeadlineTimeoutSeconds: 60\nplugin:\n llmModel: \"gpt4-o\"\n openAISecretKey: \"1234\"\n",
|
|
TokenID: "1234567",
|
|
},
|
|
})
|
|
if err != nil {
|
|
return httpmock.NewStringResponse(500, ""), nil
|
|
}
|
|
return resp, nil
|
|
},
|
|
)
|
|
|
|
beelzebubCloud := InitBeelzebubCloud(uri, "sdjdnklfjndslkjanfk")
|
|
beelzebubCloud.client = client
|
|
|
|
//When
|
|
result, err := beelzebubCloud.GetHoneypotsConfigurations()
|
|
|
|
//Then
|
|
assert.Equal(t, &[]parser.BeelzebubServiceConfiguration{
|
|
{
|
|
ApiVersion: "v1",
|
|
Protocol: "ssh",
|
|
Address: ":2222",
|
|
Description: "SSH interactive ChatGPT",
|
|
Commands: []parser.Command{
|
|
{
|
|
Regex: "^(.+)$",
|
|
Plugin: "LLMHoneypot",
|
|
},
|
|
},
|
|
ServerVersion: "OpenSSH",
|
|
ServerName: "ubuntu",
|
|
PasswordRegex: "^(root|qwerty|Smoker666|123456|jenkins|minecraft|sinus|alex|postgres|Ly123456)$",
|
|
DeadlineTimeoutSeconds: 60,
|
|
Plugin: parser.Plugin{
|
|
LLMModel: "gpt4-o",
|
|
OpenAISecretKey: "1234",
|
|
},
|
|
},
|
|
}, &result)
|
|
assert.Nil(t, err)
|
|
}
|
|
|
|
func TestGetHoneypotsConfigurationsWithErrorValidation(t *testing.T) {
|
|
//Given
|
|
beelzebubCloud := InitBeelzebubCloud("", "")
|
|
|
|
//When
|
|
result, err := beelzebubCloud.GetHoneypotsConfigurations()
|
|
|
|
//Then
|
|
assert.Nil(t, result)
|
|
assert.Equal(t, "authToken is empty", err.Error())
|
|
}
|
|
|
|
func TestGetHoneypotsConfigurationsWithErrorAPI(t *testing.T) {
|
|
client := resty.New()
|
|
httpmock.ActivateNonDefault(client.GetClient())
|
|
defer httpmock.DeactivateAndReset()
|
|
|
|
uri := "localhost:8081"
|
|
|
|
// Given
|
|
httpmock.RegisterResponder("GET", fmt.Sprintf("%s/honeypots", uri),
|
|
func(req *http.Request) (*http.Response, error) {
|
|
return httpmock.NewStringResponse(500, ""), nil
|
|
},
|
|
)
|
|
|
|
beelzebubCloud := InitBeelzebubCloud(uri, "sdjdnklfjndslkjanfk")
|
|
beelzebubCloud.client = client
|
|
|
|
//When
|
|
result, err := beelzebubCloud.GetHoneypotsConfigurations()
|
|
|
|
//Then
|
|
assert.Nil(t, result)
|
|
assert.Equal(t, "Response code: 500, error: ", err.Error())
|
|
}
|
|
|
|
func TestGetHoneypotsConfigurationsWithErrorUnmarshal(t *testing.T) {
|
|
client := resty.New()
|
|
httpmock.ActivateNonDefault(client.GetClient())
|
|
defer httpmock.DeactivateAndReset()
|
|
|
|
uri := "localhost:8081"
|
|
|
|
// Given
|
|
httpmock.RegisterResponder("GET", fmt.Sprintf("%s/honeypots", uri),
|
|
func(req *http.Request) (*http.Response, error) {
|
|
resp, err := httpmock.NewJsonResponse(200, "error")
|
|
if err != nil {
|
|
return httpmock.NewStringResponse(500, ""), nil
|
|
}
|
|
return resp, nil
|
|
},
|
|
)
|
|
|
|
beelzebubCloud := InitBeelzebubCloud(uri, "sdjdnklfjndslkjanfk")
|
|
beelzebubCloud.client = client
|
|
|
|
//When
|
|
result, err := beelzebubCloud.GetHoneypotsConfigurations()
|
|
|
|
//Then
|
|
assert.Nil(t, result)
|
|
assert.Equal(t, "json: cannot unmarshal string into Go value of type []plugins.HoneypotConfigResponseDTO", err.Error())
|
|
}
|
|
|
|
func TestGetHoneypotsConfigurationsWithErrorDeserializeYaml(t *testing.T) {
|
|
client := resty.New()
|
|
httpmock.ActivateNonDefault(client.GetClient())
|
|
defer httpmock.DeactivateAndReset()
|
|
|
|
uri := "localhost:8081"
|
|
|
|
// Given
|
|
httpmock.RegisterResponder("GET", fmt.Sprintf("%s/honeypots", uri),
|
|
func(req *http.Request) (*http.Response, error) {
|
|
resp, err := httpmock.NewJsonResponse(200, &[]HoneypotConfigResponseDTO{
|
|
{
|
|
ID: "123456",
|
|
Config: "error",
|
|
TokenID: "1234567",
|
|
},
|
|
})
|
|
if err != nil {
|
|
return httpmock.NewStringResponse(500, ""), nil
|
|
}
|
|
return resp, nil
|
|
},
|
|
)
|
|
|
|
beelzebubCloud := InitBeelzebubCloud(uri, "sdjdnklfjndslkjanfk")
|
|
beelzebubCloud.client = client
|
|
|
|
//When
|
|
result, err := beelzebubCloud.GetHoneypotsConfigurations()
|
|
|
|
//Then
|
|
assert.Nil(t, result)
|
|
assert.Equal(t, "yaml: unmarshal errors:\n line 1: cannot unmarshal !!str `error` into parser.BeelzebubServiceConfiguration", err.Error())
|
|
}
|