Skip to content

Commit

Permalink
[Backend] Refactor creation of inject expectations
Browse files Browse the repository at this point in the history
  • Loading branch information
savacano28 authored Dec 5, 2024
1 parent 36506e1 commit df1ff7a
Show file tree
Hide file tree
Showing 18 changed files with 267 additions and 275 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import io.openbas.database.repository.InjectRepository;
import io.openbas.execution.ExecutableInject;
import io.openbas.execution.Injector;
import io.openbas.inject_expectation.InjectExpectationService;
import io.openbas.injectors.caldera.client.model.Ability;
import io.openbas.injectors.caldera.client.model.Agent;
import io.openbas.injectors.caldera.client.model.ExploitResult;
Expand Down Expand Up @@ -51,6 +52,7 @@ public class CalderaExecutor extends Injector {
private final CalderaInjectorService calderaService;
private final EndpointService endpointService;
private final AssetGroupService assetGroupService;
private final InjectExpectationService injectExpectationService;
private final InjectRepository injectRepository;

@Override
Expand Down Expand Up @@ -264,9 +266,11 @@ public ExecutionProcess process(
(assetGroup ->
computeExpectationsForAssetGroup(
expectations, content, assetGroup, new ArrayList<>())));

String message = "Caldera executed the ability on " + asyncIds.size() + " asset(s)";
execution.addTrace(traceInfo(message, asyncIds));
return new ExecutionProcess(true, expectations);
injectExpectationService.buildAndSaveInjectExpectations(injection, expectations);
return new ExecutionProcess(true);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import io.openbas.execution.ExecutableInject;
import io.openbas.execution.ExecutionContext;
import io.openbas.execution.Injector;
import io.openbas.inject_expectation.InjectExpectationService;
import io.openbas.injectors.challenge.model.ChallengeContent;
import io.openbas.injectors.challenge.model.ChallengeVariable;
import io.openbas.injectors.email.service.EmailService;
Expand All @@ -24,32 +25,23 @@
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component(ChallengeContract.TYPE)
@RequiredArgsConstructor
public class ChallengeExecutor extends Injector {

@Resource private OpenBASConfig openBASConfig;

private ChallengeRepository challengeRepository;

private EmailService emailService;
private final ChallengeRepository challengeRepository;
private final EmailService emailService;
private final InjectExpectationService injectExpectationService;

@Value("${openbas.mail.imap.enabled}")
private boolean imapEnabled;

@Autowired
public void setChallengeRepository(ChallengeRepository challengeRepository) {
this.challengeRepository = challengeRepository;
}

@Autowired
public void setEmailService(EmailService emailService) {
this.emailService = emailService;
}

private String buildChallengeUri(
ExecutionContext context, Exercise exercise, Challenge challenge) {
String userId = context.getUser().getId();
Expand Down Expand Up @@ -147,13 +139,16 @@ public ExecutionProcess process(
})
.toList());
}
return new ExecutionProcess(false, expectations);

injectExpectationService.buildAndSaveInjectExpectations(injection, expectations);

return new ExecutionProcess(false);
} else {
throw new UnsupportedOperationException("Unknown contract " + contract);
}
} catch (Exception e) {
execution.addTrace(traceError(e.getMessage()));
}
return new ExecutionProcess(false, List.of());
return new ExecutionProcess(false);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import io.openbas.execution.ExecutableInject;
import io.openbas.execution.ExecutionContext;
import io.openbas.execution.Injector;
import io.openbas.inject_expectation.InjectExpectationService;
import io.openbas.injectors.channel.model.ArticleVariable;
import io.openbas.injectors.channel.model.ChannelContent;
import io.openbas.injectors.email.service.EmailService;
Expand All @@ -24,36 +25,25 @@
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component(ChannelContract.TYPE)
@RequiredArgsConstructor
public class ChannelExecutor extends Injector {

public static final String VARIABLE_ARTICLES = "articles";

public static final String VARIABLE_ARTICLE = "article";

@Resource private OpenBASConfig openBASConfig;

private ArticleRepository articleRepository;

private EmailService emailService;
private final ArticleRepository articleRepository;
private final EmailService emailService;
private final InjectExpectationService injectExpectationService;

@Value("${openbas.mail.imap.enabled}")
private boolean imapEnabled;

@Autowired
public void setArticleRepository(ArticleRepository articleRepository) {
this.articleRepository = articleRepository;
}

@Autowired
public void setEmailService(EmailService emailService) {
this.emailService = emailService;
}

private String buildArticleUri(ExecutionContext context, Article article) {
String userId = context.getUser().getId();
String channelId = article.getChannel().getId();
Expand Down Expand Up @@ -153,13 +143,16 @@ public ExecutionProcess process(
})
.toList());
}
return new ExecutionProcess(false, expectations);

injectExpectationService.buildAndSaveInjectExpectations(injection, expectations);

return new ExecutionProcess(false);
} else {
throw new UnsupportedOperationException("Unknown contract " + contract);
}
} catch (Exception e) {
execution.addTrace(traceError(e.getMessage()));
}
return new ExecutionProcess(false, List.of());
return new ExecutionProcess(false);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import io.openbas.execution.ExecutableInject;
import io.openbas.execution.ExecutionContext;
import io.openbas.execution.Injector;
import io.openbas.inject_expectation.InjectExpectationService;
import io.openbas.injectors.email.model.EmailContent;
import io.openbas.injectors.email.service.EmailService;
import io.openbas.model.ExecutionProcess;
Expand All @@ -17,25 +18,21 @@
import jakarta.validation.constraints.NotNull;
import java.util.List;
import java.util.stream.Stream;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component(EmailContract.TYPE)
@RequiredArgsConstructor
public class EmailExecutor extends Injector {

@Resource private OpenBASConfig openBASConfig;

private EmailService emailService;
private final EmailService emailService;
private final InjectExpectationService injectExpectationService;

@Value("${openbas.mail.imap.enabled}")
private boolean imapEnabled;

@Autowired
public void setEmailService(EmailService emailService) {
this.emailService = emailService;
}

private void sendMulti(
Execution execution,
List<ExecutionContext> users,
Expand Down Expand Up @@ -135,6 +132,9 @@ public ExecutionProcess process(
default -> Stream.of();
})
.toList();
return new ExecutionProcess(false, expectations);

injectExpectationService.buildAndSaveInjectExpectations(injection, expectations);

return new ExecutionProcess(false);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,6 @@ public ExecutionProcess process(
} catch (Exception e) {
execution.addTrace(traceError(e.getMessage()));
}
return new ExecutionProcess(true, List.of());
return new ExecutionProcess(true);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,6 @@ public ExecutionProcess process(
} catch (Exception e) {
execution.addTrace(traceError(e.getMessage()));
}
return new ExecutionProcess(false, List.of());
return new ExecutionProcess(false);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import io.openbas.database.repository.InjectRepository;
import io.openbas.execution.ExecutableInject;
import io.openbas.execution.Injector;
import io.openbas.inject_expectation.InjectExpectationService;
import io.openbas.injectors.openbas.model.OpenBASImplantInjectContent;
import io.openbas.model.ExecutionProcess;
import io.openbas.model.Expectation;
Expand All @@ -34,6 +35,7 @@ public class OpenBASImplantExecutor extends Injector {

private final AssetGroupService assetGroupService;
private final InjectRepository injectRepository;
private final InjectExpectationService injectExpectationService;

private Map<Asset, Boolean> resolveAllAssets(@NotNull final ExecutableInject inject) {
Map<Asset, Boolean> assets = new HashMap<>();
Expand Down Expand Up @@ -266,7 +268,10 @@ public ExecutionProcess process(Execution execution, ExecutableInject injection)
(assetGroup ->
computeExpectationsForAssetGroup(
expectations, content, assetGroup, new ArrayList<>())));
return new ExecutionProcess(true, expectations);

injectExpectationService.buildAndSaveInjectExpectations(injection, expectations);

return new ExecutionProcess(true);
}

private List<InjectExpectationSignature> spawnSignatures(Inject inject, Payload payload) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import io.openbas.database.model.*;
import io.openbas.execution.ExecutableInject;
import io.openbas.execution.Injector;
import io.openbas.inject_expectation.InjectExpectationService;
import io.openbas.injectors.opencti.model.CaseContent;
import io.openbas.injectors.opencti.service.OpenCTIService;
import io.openbas.model.ExecutionProcess;
Expand All @@ -14,18 +15,15 @@
import jakarta.validation.constraints.NotNull;
import java.util.List;
import java.util.stream.Stream;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component(OpenCTIContract.TYPE)
@RequiredArgsConstructor
public class OpenCTIExecutor extends Injector {

private OpenCTIService openCTIService;

@Autowired
public void setOpenCTIService(OpenCTIService openCTIService) {
this.openCTIService = openCTIService;
}
private final OpenCTIService openCTIService;
private final InjectExpectationService injectExpectationService;

private void createCase(
Execution execution, String name, String description, List<DataAttachment> attachments) {
Expand Down Expand Up @@ -79,6 +77,9 @@ public ExecutionProcess process(
default -> Stream.of();
})
.toList();
return new ExecutionProcess(false, expectations);

injectExpectationService.buildAndSaveInjectExpectations(injection, expectations);

return new ExecutionProcess(false);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@
import io.openbas.execution.ExecutionContext;
import io.openbas.execution.Injector;
import io.openbas.execution.ProtectUser;
import io.openbas.inject_expectation.InjectExpectationService;
import io.openbas.injectors.ovh.model.OvhSmsContent;
import io.openbas.injectors.ovh.service.OvhSmsService;
import io.openbas.model.ExecutionProcess;
import io.openbas.model.Expectation;
import io.openbas.model.expectation.ManualExpectation;
import jakarta.validation.constraints.NotNull;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.regex.Matcher;
Expand All @@ -31,6 +31,7 @@
public class OvhSmsExecutor extends Injector {

private final OvhSmsService smsService;
private final InjectExpectationService injectExpectationService;

@Override
public ExecutionProcess process(
Expand Down Expand Up @@ -95,8 +96,11 @@ public ExecutionProcess process(
default -> Stream.of();
})
.toList();
return new ExecutionProcess(false, expectations);

injectExpectationService.buildAndSaveInjectExpectations(injection, expectations);

return new ExecutionProcess(false);
}
return new ExecutionProcess(false, Collections.emptyList());
return new ExecutionProcess(false);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ public Inject injectExecutionCallback(
if (ExecutionTraceStatus.SUCCESS.equals(executionStatus)) {
injectStatus.setTrackingTotalSuccess(injectStatus.getTrackingTotalSuccess() + 1);
} else {
injectStatus.setTrackingTotalError(injectStatus.getTrackingTotalSuccess() + 1);
injectStatus.setTrackingTotalError(injectStatus.getTrackingTotalError() + 1);
}

int currentTotal =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -538,7 +538,10 @@ public static InjectExpectation.EXPECTATION_STATUS getResult(final OptionalDoubl
}

public static OptionalDouble calculateAverageFromExpectations(final List<Double> scores) {
return scores.stream().filter(Objects::nonNull).mapToDouble(Double::doubleValue).average();
return scores.stream()
.filter(Objects::nonNull)
.mapToDouble(Double::doubleValue)
.average(); // Null values are expectations for injects in Pending
}

public static List<ResultDistribution> getResultDetail(
Expand Down
Loading

0 comments on commit df1ff7a

Please sign in to comment.