Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[backend/frontend] Implement injectExpectations per agent level #2228

Merged
merged 66 commits into from
Jan 30, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
05d39fb
[backend/frontend] Clean
savacano28 Jan 16, 2025
c757f93
[backend/frontend] Clean
savacano28 Jan 16, 2025
cfc1de5
[backend/frontend] Add injectExpectations for agents
savacano28 Jan 16, 2025
793f140
[backend/frontend] Manage expired injectExpectations for agents and a…
savacano28 Jan 16, 2025
ea8082a
[backend/frontend] Manage expired injectExpectations for agents and a…
savacano28 Jan 16, 2025
4e1ba30
[backend/frontend] Add prevention, detection and manual Expectations …
savacano28 Jan 16, 2025
52b8cea
[backend/frontend] Clean
savacano28 Jan 17, 2025
3904e0a
Create injectExpectations with agents
johanah29 Jan 17, 2025
9f24c1b
Create injectExpectations with agents
johanah29 Jan 17, 2025
2c8baf1
Update expired agents expectations
johanah29 Jan 17, 2025
fe4c991
[backend/frontend] Refact update injectExpectation for agents
savacano28 Jan 18, 2025
763bbfe
[backend/frontend] Refact update injectExpectation for agents
savacano28 Jan 20, 2025
8b84212
[backend] Add update for agent expectations when update from ui
savacano28 Jan 20, 2025
fe10535
[backend] Add remove for agent expectations when update from ui
savacano28 Jan 20, 2025
1682bb3
[backend/frontend] Clean
savacano28 Jan 21, 2025
e7e3d84
[backend/frontend] Clean
savacano28 Jan 21, 2025
150c161
[backend/frontend] Clean
savacano28 Jan 21, 2025
1be6242
[backend/frontend] Clean
savacano28 Jan 21, 2025
aff4169
[backend/frontend] Clean
savacano28 Jan 21, 2025
4cce605
[backend/frontend] Clean
savacano28 Jan 21, 2025
de83a02
[backend/frontend] Clean
savacano28 Jan 21, 2025
033e2e0
[backend/frontend] Clean
savacano28 Jan 22, 2025
166fe5e
[backend/frontend] Clean
savacano28 Jan 22, 2025
8ea1c0c
[backend/frontend] Clean
savacano28 Jan 22, 2025
d41564e
[backend/frontend] Clean
savacano28 Jan 22, 2025
27446c6
[backend/frontend] Clean
savacano28 Jan 22, 2025
643b3e7
[backend/frontend] Modify name of implant exe
savacano28 Jan 23, 2025
e083f98
Finalize inject expectation service test
johanah29 Jan 23, 2025
a8c3469
[backend/frontend] Fix list assets in an assetgroup
savacano28 Jan 23, 2025
4057f00
Clean inject expectation service test
johanah29 Jan 23, 2025
23a043f
Apply spotless
johanah29 Jan 23, 2025
e520100
[backend/frontend] Clean
savacano28 Jan 23, 2025
e4089c7
[backend/frontend] Clean
savacano28 Jan 23, 2025
c699442
Start test on assetGroups
johanah29 Jan 23, 2025
ad64d5e
Finalize creation tests
johanah29 Jan 23, 2025
0bfd7cd
[backend] Fix update/delete from ui
savacano28 Jan 23, 2025
6ba2791
Clean tests file
johanah29 Jan 24, 2025
c6cbead
Add tests with 2 agents
johanah29 Jan 24, 2025
5aed551
Start api test
johanah29 Jan 24, 2025
af7a933
Start api test
johanah29 Jan 24, 2025
38a9765
[backend] Fix update
savacano28 Jan 25, 2025
fadc457
[backend] Clean
savacano28 Jan 26, 2025
e14b1cc
[backend/frontend] Fix
savacano28 Jan 26, 2025
e32511c
[backend/frontend] Fix
savacano28 Jan 26, 2025
9185b97
[backend/frontend] Fix
savacano28 Jan 27, 2025
4b295e4
[backend/frontend] Fix
savacano28 Jan 27, 2025
6b0f253
[backend/frontend] Fix
savacano28 Jan 27, 2025
6db6da2
[backend/frontend] Clean
savacano28 Jan 27, 2025
49272ea
[backend/frontend] Clean
savacano28 Jan 27, 2025
b608f6c
[backend/frontend] Clean
savacano28 Jan 27, 2025
39ade00
[backend/frontend] Clean
savacano28 Jan 27, 2025
188ff7c
[backend/frontend] Clean
savacano28 Jan 27, 2025
9bb8a94
[backend/frontend] Clean
savacano28 Jan 27, 2025
724ab2d
[backend/frontend] Clean
savacano28 Jan 27, 2025
ceddacb
[backend/frontend] Clean
savacano28 Jan 27, 2025
bf1919e
[backend/frontend] Add test bug ui
savacano28 Jan 27, 2025
a4833c4
[backend/frontend] Clean
savacano28 Jan 27, 2025
82c6334
[backend/frontend] Clean
savacano28 Jan 28, 2025
3cf6eec
[backend/frontend] Clean
savacano28 Jan 28, 2025
b824727
[backend/frontend] Clean
savacano28 Jan 28, 2025
1cf2533
[backend/frontend] Clean
savacano28 Jan 28, 2025
60f5fde
[backend/frontend] Clean
savacano28 Jan 28, 2025
7f952a7
[backend/frontend] Clean
savacano28 Jan 28, 2025
8955eff
[backend/frontend] Clean
savacano28 Jan 28, 2025
c085618
[backend/frontend] Clean
savacano28 Jan 29, 2025
0754511
[backend/frontend] Clean
savacano28 Jan 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,46 +19,64 @@
@Log
public class ExpectationsExpirationManagerService {

public static final String COLLECTOR = "collector";
private final InjectExpectationService injectExpectationService;
private final ExpectationsExpirationManagerConfig config;

@Transactional(rollbackFor = Exception.class)
public void computeExpectations() {
List<InjectExpectation> expectations = this.injectExpectationService.expectationsNotFill();
if (!expectations.isEmpty()) {
this.computeExpectationsForAgents(expectations);
this.computeExpectationsForAssets(expectations);
this.computeExpectationsForAssetGroups(expectations);
this.computeExpectations(expectations);
}
}

// -- PRIVATE --

private void computeExpectations(@NotNull final List<InjectExpectation> expectations) {
List<InjectExpectation> expectationAssets = expectations.stream().toList();
expectationAssets.forEach(
(expectation) -> {
expectations.forEach(
expectation -> {
if (isExpired(expectation)) {
String result = computeFailedMessage(expectation.getType());
this.injectExpectationService.computeExpectation(
expectation, this.config.getId(), "collector", PRODUCT_NAME, result, false, null);
expectation, this.config.getId(), COLLECTOR, PRODUCT_NAME, result, false, null);
}
});
}

private void computeExpectationsForAssets(@NotNull final List<InjectExpectation> expectations) {
List<InjectExpectation> expectationAssets =
expectations.stream().filter(e -> e.getAsset() != null).toList();
expectationAssets.forEach(
(expectation) -> {
private void computeExpectationsForAgents(@NotNull final List<InjectExpectation> expectations) {
List<InjectExpectation> expectationAgents =
expectations.stream().filter(e -> e.getAgent() != null).toList();
expectationAgents.forEach(
expectation -> {
if (isExpired(expectation)) {
String result = computeFailedMessage(expectation.getType());
this.injectExpectationService.computeExpectation(
expectation, this.config.getId(), "collector", PRODUCT_NAME, result, false, null);
expectation, this.config.getId(), COLLECTOR, PRODUCT_NAME, result, false, null);
}
});
}

private void computeExpectationsForAssets(@NotNull final List<InjectExpectation> expectations) {
List<InjectExpectation> expectationAssets =
expectations.stream().filter(e -> e.getAsset() != null && e.getAgent() == null).toList();
expectationAssets.forEach(
(expectationAsset -> {
List<InjectExpectation> expectationAgents =
this.injectExpectationService.expectationsForAgents(
expectationAsset.getInject(),
expectationAsset.getAsset(),
expectationAsset.getType());
// Every agent expectation is filled
if (expectationAgents.stream().noneMatch(e -> e.getResults().isEmpty())) {
this.injectExpectationService.computeExpectationAsset(
expectationAsset, expectationAgents, this.config.getId(), COLLECTOR, PRODUCT_NAME);
}
}));
}

private void computeExpectationsForAssetGroups(
@NotNull final List<InjectExpectation> expectations) {
List<InjectExpectation> expectationAssetGroups =
Expand All @@ -70,13 +88,13 @@ private void computeExpectationsForAssetGroups(
expectationAssetGroup.getInject(),
expectationAssetGroup.getAssetGroup(),
expectationAssetGroup.getType());
// Every expectation assets are filled
// Every asset expectation is filled
if (expectationAssets.stream().noneMatch(e -> e.getResults().isEmpty())) {
this.injectExpectationService.computeExpectationGroup(
expectationAssetGroup,
expectationAssets,
this.config.getId(),
"collector",
COLLECTOR,
PRODUCT_NAME);
}
}));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import io.openbas.model.expectation.PreventionExpectation;
import io.openbas.service.AssetGroupService;
import io.openbas.service.InjectExpectationService;
import jakarta.persistence.EntityNotFoundException;
import jakarta.validation.constraints.NotNull;
import java.util.*;
import java.util.stream.Stream;
Expand Down Expand Up @@ -226,7 +227,9 @@
public ExecutionProcess process(Execution execution, ExecutableInject injection)
throws Exception {
Inject inject =
this.injectRepository.findById(injection.getInjection().getInject().getId()).orElseThrow();
this.injectRepository
.findById(injection.getInjection().getInject().getId())
.orElseThrow(() -> new EntityNotFoundException("Inject not found"));

Check warning on line 232 in openbas-api/src/main/java/io/openbas/injectors/openbas/OpenBASImplantExecutor.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/injectors/openbas/OpenBASImplantExecutor.java#L231-L232

Added lines #L231 - L232 were not covered by tests
Map<Asset, Boolean> assets = this.resolveAllAssets(injection);

// Check assets target
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
@Log
public class OpenBASInjector {

private static final String OPENBAS_INJECTOR_NAME = "OpenBAS Implant";
private static final String OPENBAS_INJECTOR_ID = "49229430-b5b5-431f-ba5b-f36f599b0144";
public static final String OPENBAS_INJECTOR_NAME = "OpenBAS Implant";
public static final String OPENBAS_INJECTOR_ID = "49229430-b5b5-431f-ba5b-f36f599b0144";

private String dlUri(OpenBASConfig openBASConfig, String platform, String arch) {
return openBASConfig.getBaseUrlForAgent() + "/api/implant/openbas/" + platform + "/" + arch;
Expand Down Expand Up @@ -46,7 +46,7 @@ public OpenBASInjector(
Map<String, String> executorCommands = new HashMap<>();
executorCommands.put(
Endpoint.PLATFORM_TYPE.Windows.name() + "." + Endpoint.PLATFORM_ARCH.x86_64,
"$x=\"#{location}\";$location=$x.Replace(\"\\obas-agent-caldera.exe\", \"\");[Environment]::CurrentDirectory = $location;$filename=\"obas-implant-#{inject}.exe\";$"
"$x=\"#{location}\";$location=$x.Replace(\"\\obas-agent-caldera.exe\", \"\");[Environment]::CurrentDirectory = $location;$filename=\"obas-implant-#{inject}-agent-#{agent}.exe\";$"
RomuDeuxfois marked this conversation as resolved.
Show resolved Hide resolved
+ tokenVar
+ ";$"
+ serverVar
Expand All @@ -59,7 +59,7 @@ public OpenBASInjector(
+ ";$wc=New-Object System.Net.WebClient;$data=$wc.DownloadData($url);[io.file]::WriteAllBytes($filename,$data) | Out-Null;Remove-NetFirewallRule -DisplayName \"Allow OpenBAS Inbound\";New-NetFirewallRule -DisplayName \"Allow OpenBAS Inbound\" -Direction Inbound -Program \"$location\\$filename\" -Action Allow | Out-Null;Remove-NetFirewallRule -DisplayName \"Allow OpenBAS Outbound\";New-NetFirewallRule -DisplayName \"Allow OpenBAS Outbound\" -Direction Outbound -Program \"$location\\$filename\" -Action Allow | Out-Null;Start-Process -FilePath \"$location\\$filename\" -ArgumentList \"--uri $server --token $token --unsecured-certificate $unsecured_certificate --with-proxy $with_proxy --agent-id #{agent} --inject-id #{inject}\" -WindowStyle hidden;");
executorCommands.put(
Endpoint.PLATFORM_TYPE.Windows.name() + "." + Endpoint.PLATFORM_ARCH.arm64,
"$x=\"#{location}\";$location=$x.Replace(\"\\obas-agent-caldera.exe\", \"\");[Environment]::CurrentDirectory = $location;$filename=\"obas-implant-#{inject}.exe\";$"
"$x=\"#{location}\";$location=$x.Replace(\"\\obas-agent-caldera.exe\", \"\");[Environment]::CurrentDirectory = $location;$filename=\"obas-implant-#{inject}-agent-#{agent}.exe\";$"
+ tokenVar
+ ";$"
+ serverVar
Expand All @@ -72,7 +72,7 @@ public OpenBASInjector(
+ ";$wc=New-Object System.Net.WebClient;$data=$wc.DownloadData($url);[io.file]::WriteAllBytes($filename,$data) | Out-Null;Remove-NetFirewallRule -DisplayName \"Allow OpenBAS Inbound\";New-NetFirewallRule -DisplayName \"Allow OpenBAS Inbound\" -Direction Inbound -Program \"$location\\$filename\" -Action Allow | Out-Null;Remove-NetFirewallRule -DisplayName \"Allow OpenBAS Outbound\";New-NetFirewallRule -DisplayName \"Allow OpenBAS Outbound\" -Direction Outbound -Program \"$location\\$filename\" -Action Allow | Out-Null;Start-Process -FilePath \"$location\\$filename\" -ArgumentList \"--uri $server --token $token --unsecured-certificate $unsecured_certificate --with-proxy $with_proxy --agent-id #{agent} --inject-id #{inject}\" -WindowStyle hidden;");
executorCommands.put(
Endpoint.PLATFORM_TYPE.Linux.name() + "." + Endpoint.PLATFORM_ARCH.x86_64,
"x=\"#{location}\";location=$(echo \"$x\" | sed \"s#/openbas-caldera-agent##\");filename=obas-implant-#{inject};"
"x=\"#{location}\";location=$(echo \"$x\" | sed \"s#/openbas-caldera-agent##\");filename=obas-implant-#{inject}-agent-#{agent};"
+ serverVar
+ ";"
+ tokenVar
Expand All @@ -85,7 +85,7 @@ public OpenBASInjector(
+ " > $location/$filename;chmod +x $location/$filename;$location/$filename --uri $server --token $token --unsecured-certificate $unsecured_certificate --with-proxy $with_proxy --agent-id #{agent} --inject-id #{inject} &");
executorCommands.put(
Endpoint.PLATFORM_TYPE.Linux.name() + "." + Endpoint.PLATFORM_ARCH.arm64,
"x=\"#{location}\";location=$(echo \"$x\" | sed \"s#/openbas-caldera-agent##\");filename=obas-implant-#{inject};"
"x=\"#{location}\";location=$(echo \"$x\" | sed \"s#/openbas-caldera-agent##\");filename=obas-implant-#{inject}-agent-#{agent};"
+ serverVar
+ ";"
+ tokenVar
Expand All @@ -98,7 +98,7 @@ public OpenBASInjector(
+ " > $location/$filename;chmod +x $location/$filename;$location/$filename --uri $server --token $token --unsecured-certificate $unsecured_certificate --with-proxy $with_proxy --agent-id #{agent} --inject-id #{inject} &");
executorCommands.put(
Endpoint.PLATFORM_TYPE.MacOS.name() + "." + Endpoint.PLATFORM_ARCH.x86_64,
"x=\"#{location}\";location=$(echo \"$x\" | sed \"s#/openbas-caldera-agent##\");filename=obas-implant-#{inject};"
"x=\"#{location}\";location=$(echo \"$x\" | sed \"s#/openbas-caldera-agent##\");filename=obas-implant-#{inject}-agent-#{agent};"
+ serverVar
+ ";"
+ tokenVar
Expand All @@ -111,7 +111,7 @@ public OpenBASInjector(
+ " > $location/$filename;chmod +x $location/$filename;$location/$filename --uri $server --token $token --unsecured-certificate $unsecured_certificate --with-proxy $with_proxy --agent-id #{agent} --inject-id #{inject} &");
executorCommands.put(
Endpoint.PLATFORM_TYPE.MacOS.name() + "." + Endpoint.PLATFORM_ARCH.arm64,
"x=\"#{location}\";location=$(echo \"$x\" | sed \"s#/openbas-caldera-agent##\");filename=obas-implant-#{inject};"
"x=\"#{location}\";location=$(echo \"$x\" | sed \"s#/openbas-caldera-agent##\");filename=obas-implant-#{inject}-agent-#{agent};"
+ serverVar
+ ";"
+ tokenVar
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.openbas.migration;

import java.sql.Connection;
import java.sql.Statement;
import org.flywaydb.core.api.migration.BaseJavaMigration;
import org.flywaydb.core.api.migration.Context;
import org.springframework.stereotype.Component;

@Component
public class V3_62__Add_agent_to_inject_expectation extends BaseJavaMigration {

@Override
public void migrate(Context context) throws Exception {
Connection connection = context.getConnection();
Statement select = connection.createStatement();
// Add agent to inject expectation
select.execute(
"""
ALTER TABLE injects_expectations ADD COLUMN agent_id varchar(256) constraint fk_agent references agents on delete cascade;
""");
select.execute(
"CREATE INDEX IF NOT EXISTS idx_inject_expectation_agent_id ON injects_expectations(agent_id);");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import io.openbas.database.model.*;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import java.time.Instant;
import lombok.Builder;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package io.openbas.rest.atomic_testing.form;

import io.openbas.atomic_testing.TargetType;
import io.openbas.database.model.Endpoint.PLATFORM_TYPE;
import io.openbas.utils.AtomicTestingUtils.ExpectationResultsByType;
import io.openbas.utils.TargetType;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package io.openbas.rest.atomic_testing.form;

import com.fasterxml.jackson.annotation.JsonProperty;
import io.openbas.atomic_testing.TargetType;
import io.openbas.utils.TargetType;
import jakarta.validation.constraints.NotBlank;
import lombok.Builder;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ public class AttackPatternCreateInput {
@JsonProperty("attack_pattern_stix_id")
private String stixId = "attack-pattern--" + UUID.randomUUID();

;

@NotBlank(message = MANDATORY_MESSAGE)
@JsonProperty("attack_pattern_name")
private String name;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@

import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
import lombok.*;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
public class ExpectationUpdateInput {
@JsonProperty("source_id")
@NotNull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import io.openbas.atomic_testing.TargetType;
import io.openbas.config.OpenBASConfig;
import io.openbas.database.model.*;
import io.openbas.database.raw.RawExerciseSimple;
Expand All @@ -37,6 +36,7 @@
import io.openbas.utils.ExerciseMapper;
import io.openbas.utils.InjectMapper;
import io.openbas.utils.ResultUtils;
import io.openbas.utils.TargetType;
import jakarta.annotation.Resource;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
Expand Down
Loading