From 8d33c6a6e1c03e2d2b6a07fda2cb148a1545905f Mon Sep 17 00:00:00 2001 From: Sergey Shkurov Date: Fri, 14 Apr 2023 03:27:27 +0200 Subject: [PATCH 01/10] Update gradle version --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2e6e589..59bc51a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 7afb9dc5fb31e3d32b91b7353dce7d2da43c2336 Mon Sep 17 00:00:00 2001 From: Sergey Shkurov Date: Fri, 14 Apr 2023 03:27:47 +0200 Subject: [PATCH 02/10] Update Spring Boot 2 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2308b4d..b2473dc 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'org.springframework.boot' version '2.6.3' + id 'org.springframework.boot' version '2.7.10' id 'java' } From 7878ecebfcab49dd51462344b58ab4de2a1135e1 Mon Sep 17 00:00:00 2001 From: Sergey Shkurov Date: Fri, 14 Apr 2023 11:20:12 +0200 Subject: [PATCH 03/10] Fix hashtag symbols becoming links --- docs/USAGE.md | 6 +++--- docs/USAGE_EN.md | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/USAGE.md b/docs/USAGE.md index a378b13..45b7f45 100644 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -75,9 +75,9 @@ Совет: иногда на CTF забывают перезаписать TTL пакетов внутри сети. В таком случае по TTL можно отличить запросы от чекеров и от других команд. -Совет #2: по User-Agent можно отличать запросы из разных источников. К примеру, можно предположить, что на скриншоте выше запросы 4 и 5 пришли из разных источников. +Совет #​2: по User-Agent можно отличать запросы из разных источников. К примеру, можно предположить, что на скриншоте выше запросы 4 и 5 пришли из разных источников. -Совет #3: нажимайте на звездочку, чтобы добавить интересный стрим в избранное. Этот стрим будет выделен в списке, и появится в списке избранных стримов. +Совет #​3: нажимайте на звездочку, чтобы добавить интересный стрим в избранное. Этот стрим будет выделен в списке, и появится в списке избранных стримов. #### Управление просмотром @@ -101,7 +101,7 @@ Совет: создавайте отдельные паттерны для входящих и исходящих флагов. Так легче отличать чекер, кладущий флаги, от эксплоитов. -Совет #2: используйте Lookback для исследования найденных эксплоитов. +Совет #​2: используйте Lookback для исследования найденных эксплоитов. Пример: вы обнаружили, что сервис только что отдал флаг пользователю `abc123` без видимых причин. Можно предположить, что атакующая команда создала этого пользователя и подготовила эксплоит в другом стриме. diff --git a/docs/USAGE_EN.md b/docs/USAGE_EN.md index e642620..df5a6bf 100644 --- a/docs/USAGE_EN.md +++ b/docs/USAGE_EN.md @@ -68,9 +68,9 @@ you can switch between binary and text representation using the button in the si Tip: Sometimes during CTFs, admins forget to overwrite the TTL of packets inside the network. In such cases, you can differentiate requests from checkers and other teams based on TTL. -Tip #2: User-Agent can be used to differentiate requests from different sources. For example, in the screenshot above, requests 4 and 5 may have come from different sources. +Tip #​2: User-Agent can be used to differentiate requests from different sources. For example, in the screenshot above, requests 4 and 5 may have come from different sources. -Tip #3: Click on the star icon to add an interesting stream to your favorites. This stream will be highlighted in the list and will appear in the list of favorite streams. +Tip #​3: Click on the star icon to add an interesting stream to your favorites. This stream will be highlighted in the list and will appear in the list of favorite streams. #### Control Panel @@ -94,7 +94,7 @@ Tip #3: Click on the star icon to add an interesting stream to your favorites. T Tip: Create separate patterns for incoming and outgoing flags to easily distinguish between flag checkers and exploits. -Tip #2: Use Lookback to investigate discovered exploits. +Tip #​2: Use Lookback to investigate discovered exploits. Example: You found that the service just handed out a flag to user `abc123` without an apparent reason. You can assume that the attacking team created this user and prepared an exploit in another stream. From 93ec39b561b794e8236de4d9b5b03cb84272df85 Mon Sep 17 00:00:00 2001 From: Sergey Shkurov Date: Sun, 23 Apr 2023 21:15:10 +0300 Subject: [PATCH 04/10] Prepare to move to gradle.kts --- build.gradle | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/build.gradle b/build.gradle index b2473dc..da71f7f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,12 @@ plugins { - id 'org.springframework.boot' version '2.7.10' - id 'java' + id("org.springframework.boot") version "2.7.10" + id("java") } -apply plugin: 'io.spring.dependency-management' +apply plugin: "io.spring.dependency-management" -group = 'ru.serega6531' -version = '1.0-SNAPSHOT' +group = "ru.serega6531" +version = "1.0-SNAPSHOT" sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 @@ -22,27 +22,27 @@ repositories { } dependencies { - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation "org.springframework.boot:spring-boot-starter-security" - implementation "org.springframework.boot:spring-boot-starter-websocket" - implementation 'org.springframework.session:spring-session-core' - implementation 'com.github.jmnarloch:modelmapper-spring-boot-starter:1.1.0' - implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0' - implementation group: 'commons-io', name: 'commons-io', version: '2.11.0' - implementation 'org.pcap4j:pcap4j-core:1.8.2' - implementation 'org.pcap4j:pcap4j-packetfactory-static:1.8.2' - implementation group: 'com.google.guava', name: 'guava', version: '31.0.1-jre' - implementation group: 'org.java-websocket', name: 'Java-WebSocket', version: '1.5.1' - implementation group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.69' - implementation group: 'org.bouncycastle', name: 'bctls-jdk15on', version: '1.70' - implementation group: 'org.modelmapper', name: 'modelmapper', version: '2.4.5' - compileOnly 'org.jetbrains:annotations:22.0.0' - compileOnly 'org.projectlombok:lombok' - runtimeOnly 'org.springframework.boot:spring-boot-devtools' - runtimeOnly 'org.postgresql:postgresql' - annotationProcessor 'org.projectlombok:lombok' - testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2' + implementation("org.springframework.boot:spring-boot-starter-data-jpa") + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-security") + implementation("org.springframework.boot:spring-boot-starter-websocket") + implementation("org.springframework.session:spring-session-core") + implementation("com.github.jmnarloch:modelmapper-spring-boot-starter:1.1.0") + implementation(group: "org.apache.commons", name: "commons-lang3", version: "3.12.0") + implementation(group: "commons-io", name: "commons-io", version: "2.11.0") + implementation("org.pcap4j:pcap4j-core:1.8.2") + implementation("org.pcap4j:pcap4j-packetfactory-static:1.8.2") + implementation(group: "com.google.guava", name: "guava", version: "31.0.1-jre") + implementation(group: "org.java-websocket", name: "Java-WebSocket", version: "1.5.1") + implementation(group: "org.bouncycastle", name: "bcprov-jdk15on", version: "1.69") + implementation(group: "org.bouncycastle", name: "bctls-jdk15on", version: "1.70") + implementation(group: "org.modelmapper", name: "modelmapper", version: "2.4.5") + compileOnly("org.jetbrains:annotations:22.0.0") + compileOnly("org.projectlombok:lombok") + runtimeOnly("org.springframework.boot:spring-boot-devtools") + runtimeOnly("org.postgresql:postgresql") + annotationProcessor("org.projectlombok:lombok") + testImplementation("org.junit.jupiter:junit-jupiter:5.8.2") } test { From ea45f1b9e52c0acf3c25cb486894b8b305bd06c4 Mon Sep 17 00:00:00 2001 From: Sergey Shkurov Date: Sun, 23 Apr 2023 23:08:49 +0300 Subject: [PATCH 05/10] Use gradle.kts --- build.gradle => build.gradle.kts | 29 +++++++++++++------------- settings.gradle => settings.gradle.kts | 2 +- 2 files changed, 16 insertions(+), 15 deletions(-) rename build.gradle => build.gradle.kts (55%) rename settings.gradle => settings.gradle.kts (71%) diff --git a/build.gradle b/build.gradle.kts similarity index 55% rename from build.gradle rename to build.gradle.kts index da71f7f..c579784 100644 --- a/build.gradle +++ b/build.gradle.kts @@ -1,19 +1,20 @@ plugins { id("org.springframework.boot") version "2.7.10" id("java") + id("io.spring.dependency-management") version "1.1.0" } -apply plugin: "io.spring.dependency-management" - group = "ru.serega6531" version = "1.0-SNAPSHOT" -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} configurations { - compileOnly { - extendsFrom annotationProcessor + get("compileOnly").apply { + extendsFrom(configurations.annotationProcessor.get()) } } @@ -28,15 +29,15 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-websocket") implementation("org.springframework.session:spring-session-core") implementation("com.github.jmnarloch:modelmapper-spring-boot-starter:1.1.0") - implementation(group: "org.apache.commons", name: "commons-lang3", version: "3.12.0") - implementation(group: "commons-io", name: "commons-io", version: "2.11.0") + implementation(group = "org.apache.commons", name = "commons-lang3", version = "3.12.0") + implementation(group = "commons-io", name = "commons-io", version = "2.11.0") implementation("org.pcap4j:pcap4j-core:1.8.2") implementation("org.pcap4j:pcap4j-packetfactory-static:1.8.2") - implementation(group: "com.google.guava", name: "guava", version: "31.0.1-jre") - implementation(group: "org.java-websocket", name: "Java-WebSocket", version: "1.5.1") - implementation(group: "org.bouncycastle", name: "bcprov-jdk15on", version: "1.69") - implementation(group: "org.bouncycastle", name: "bctls-jdk15on", version: "1.70") - implementation(group: "org.modelmapper", name: "modelmapper", version: "2.4.5") + implementation(group = "com.google.guava", name = "guava", version = "31.0.1-jre") + implementation(group = "org.java-websocket", name = "Java-WebSocket", version = "1.5.1") + implementation(group = "org.bouncycastle", name = "bcprov-jdk15on", version = "1.69") + implementation(group = "org.bouncycastle", name = "bctls-jdk15on", version = "1.70") + implementation(group = "org.modelmapper", name = "modelmapper", version = "2.4.5") compileOnly("org.jetbrains:annotations:22.0.0") compileOnly("org.projectlombok:lombok") runtimeOnly("org.springframework.boot:spring-boot-devtools") @@ -45,6 +46,6 @@ dependencies { testImplementation("org.junit.jupiter:junit-jupiter:5.8.2") } -test { +tasks.getByName("test") { useJUnitPlatform() } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle.kts similarity index 71% rename from settings.gradle rename to settings.gradle.kts index 091d258..1d2c8af 100644 --- a/settings.gradle +++ b/settings.gradle.kts @@ -3,4 +3,4 @@ pluginManagement { gradlePluginPortal() } } -rootProject.name = 'packmate' +rootProject.name = "packmate" From 4e2473a3cc4f1159bcb4cd67a2b1bd6052cb7f54 Mon Sep 17 00:00:00 2001 From: Sergey Shkurov Date: Mon, 24 Apr 2023 01:29:12 +0300 Subject: [PATCH 06/10] Update libraries --- build.gradle.kts | 15 +++-- .../ApplicationConfiguration.java | 7 +-- .../configuration/SecurityConfiguration.java | 57 +++++++++++-------- .../serega6531/packmate/model/CtfService.java | 8 +-- .../packmate/model/FoundPattern.java | 2 +- .../ru/serega6531/packmate/model/Packet.java | 2 +- .../ru/serega6531/packmate/model/Pattern.java | 2 +- .../ru/serega6531/packmate/model/Stream.java | 2 +- .../packmate/repository/StreamRepository.java | 7 ++- .../packmate/service/PatternService.java | 2 +- .../packmate/service/ServicesService.java | 2 +- src/main/resources/application.yml | 2 - 12 files changed, 56 insertions(+), 52 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index c579784..c04c896 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("org.springframework.boot") version "2.7.10" + id("org.springframework.boot") version "3.0.6" id("java") id("io.spring.dependency-management") version "1.1.0" } @@ -28,22 +28,21 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-websocket") implementation("org.springframework.session:spring-session-core") - implementation("com.github.jmnarloch:modelmapper-spring-boot-starter:1.1.0") implementation(group = "org.apache.commons", name = "commons-lang3", version = "3.12.0") implementation(group = "commons-io", name = "commons-io", version = "2.11.0") implementation("org.pcap4j:pcap4j-core:1.8.2") implementation("org.pcap4j:pcap4j-packetfactory-static:1.8.2") - implementation(group = "com.google.guava", name = "guava", version = "31.0.1-jre") - implementation(group = "org.java-websocket", name = "Java-WebSocket", version = "1.5.1") - implementation(group = "org.bouncycastle", name = "bcprov-jdk15on", version = "1.69") + implementation(group = "com.google.guava", name = "guava", version = "31.1-jre") + implementation(group = "org.java-websocket", name = "Java-WebSocket", version = "1.5.3") + implementation(group = "org.bouncycastle", name = "bcprov-jdk15on", version = "1.70") implementation(group = "org.bouncycastle", name = "bctls-jdk15on", version = "1.70") - implementation(group = "org.modelmapper", name = "modelmapper", version = "2.4.5") - compileOnly("org.jetbrains:annotations:22.0.0") + implementation(group = "org.modelmapper", name = "modelmapper", version = "3.1.1") + compileOnly("org.jetbrains:annotations:24.0.1") compileOnly("org.projectlombok:lombok") runtimeOnly("org.springframework.boot:spring-boot-devtools") runtimeOnly("org.postgresql:postgresql") annotationProcessor("org.projectlombok:lombok") - testImplementation("org.junit.jupiter:junit-jupiter:5.8.2") + testImplementation("org.junit.jupiter:junit-jupiter:5.9.2") } tasks.getByName("test") { diff --git a/src/main/java/ru/serega6531/packmate/configuration/ApplicationConfiguration.java b/src/main/java/ru/serega6531/packmate/configuration/ApplicationConfiguration.java index f86522c..8b005de 100644 --- a/src/main/java/ru/serega6531/packmate/configuration/ApplicationConfiguration.java +++ b/src/main/java/ru/serega6531/packmate/configuration/ApplicationConfiguration.java @@ -1,5 +1,6 @@ package ru.serega6531.packmate.configuration; +import org.modelmapper.ModelMapper; import org.pcap4j.core.PcapNativeException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -7,8 +8,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; import ru.serega6531.packmate.model.enums.CaptureMode; import ru.serega6531.packmate.pcap.FilePcapWorker; import ru.serega6531.packmate.pcap.LivePcapWorker; @@ -42,8 +41,8 @@ public class ApplicationConfiguration { } @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); + public ModelMapper modelMapper() { + return new ModelMapper(); } } diff --git a/src/main/java/ru/serega6531/packmate/configuration/SecurityConfiguration.java b/src/main/java/ru/serega6531/packmate/configuration/SecurityConfiguration.java index 0d8a2bf..606e862 100644 --- a/src/main/java/ru/serega6531/packmate/configuration/SecurityConfiguration.java +++ b/src/main/java/ru/serega6531/packmate/configuration/SecurityConfiguration.java @@ -1,21 +1,24 @@ package ru.serega6531.packmate.configuration; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.event.EventListener; import org.springframework.security.authentication.event.AuthenticationFailureBadCredentialsEvent; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity @Slf4j -public class SecurityConfiguration extends WebSecurityConfigurerAdapter { +public class SecurityConfiguration { @Value("${account-login}") private String login; @@ -23,35 +26,39 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Value("${account-password}") private String password; - private final PasswordEncoder passwordEncoder; - - @Autowired - public SecurityConfiguration(PasswordEncoder passwordEncoder) { - this.passwordEncoder = passwordEncoder; - } - - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication() - .withUser(login) + @Bean + public InMemoryUserDetailsManager userDetailsService(PasswordEncoder passwordEncoder) { + UserDetails user = User.builder() + .username(login) .password(passwordEncoder.encode(password)) - .authorities("ROLE_USER"); + .roles("USER") + .build(); + + return new InMemoryUserDetailsManager(user); } - @Override - protected void configure(HttpSecurity http) throws Exception { - http.csrf() + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + return http.csrf() .disable() - .authorizeRequests() - .antMatchers("/site.webmanifest") - .permitAll() - .anyRequest().authenticated() - .and() + .authorizeHttpRequests((auth) -> + auth.requestMatchers("/site.webmanifest") + .permitAll() + .anyRequest() + .authenticated() + ) .httpBasic() .and() .headers() .frameOptions() - .sameOrigin(); + .sameOrigin() + .and() + .build(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); } @EventListener diff --git a/src/main/java/ru/serega6531/packmate/model/CtfService.java b/src/main/java/ru/serega6531/packmate/model/CtfService.java index 737f2fb..c58ae71 100644 --- a/src/main/java/ru/serega6531/packmate/model/CtfService.java +++ b/src/main/java/ru/serega6531/packmate/model/CtfService.java @@ -3,10 +3,10 @@ package ru.serega6531.packmate.model; import lombok.*; import org.hibernate.Hibernate; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import java.util.Objects; @Getter diff --git a/src/main/java/ru/serega6531/packmate/model/FoundPattern.java b/src/main/java/ru/serega6531/packmate/model/FoundPattern.java index 27b4500..724b89b 100644 --- a/src/main/java/ru/serega6531/packmate/model/FoundPattern.java +++ b/src/main/java/ru/serega6531/packmate/model/FoundPattern.java @@ -5,7 +5,7 @@ import org.hibernate.Hibernate; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.Objects; @Entity diff --git a/src/main/java/ru/serega6531/packmate/model/Packet.java b/src/main/java/ru/serega6531/packmate/model/Packet.java index c35af64..d3e8d96 100644 --- a/src/main/java/ru/serega6531/packmate/model/Packet.java +++ b/src/main/java/ru/serega6531/packmate/model/Packet.java @@ -5,7 +5,7 @@ import org.hibernate.Hibernate; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.Objects; import java.util.Set; diff --git a/src/main/java/ru/serega6531/packmate/model/Pattern.java b/src/main/java/ru/serega6531/packmate/model/Pattern.java index 6d5acad..345ed06 100644 --- a/src/main/java/ru/serega6531/packmate/model/Pattern.java +++ b/src/main/java/ru/serega6531/packmate/model/Pattern.java @@ -11,7 +11,7 @@ import ru.serega6531.packmate.model.enums.PatternActionType; import ru.serega6531.packmate.model.enums.PatternDirectionType; import ru.serega6531.packmate.model.enums.PatternSearchType; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.Objects; @Getter diff --git a/src/main/java/ru/serega6531/packmate/model/Stream.java b/src/main/java/ru/serega6531/packmate/model/Stream.java index 4c2eb19..5eb553a 100644 --- a/src/main/java/ru/serega6531/packmate/model/Stream.java +++ b/src/main/java/ru/serega6531/packmate/model/Stream.java @@ -9,7 +9,7 @@ import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; import ru.serega6531.packmate.model.enums.Protocol; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.HashSet; import java.util.List; import java.util.Objects; diff --git a/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java b/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java index 1af9dce..539cb50 100644 --- a/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java +++ b/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java @@ -1,11 +1,13 @@ package ru.serega6531.packmate.repository; import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.*; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; import ru.serega6531.packmate.model.Packet; import ru.serega6531.packmate.model.Stream; -import javax.persistence.QueryHint; import java.util.List; public interface StreamRepository extends JpaRepository, JpaSpecificationExecutor { @@ -22,7 +24,6 @@ public interface StreamRepository extends JpaRepository, JpaSpecif "AND (:startingFrom IS NULL OR p.id > :startingFrom) " + "ORDER BY p.id" ) - @QueryHints(@QueryHint(name = org.hibernate.jpa.QueryHints.HINT_PASS_DISTINCT_THROUGH, value = "false")) List getPackets(long streamId, Long startingFrom, Pageable pageable); } diff --git a/src/main/java/ru/serega6531/packmate/service/PatternService.java b/src/main/java/ru/serega6531/packmate/service/PatternService.java index 3af8832..59db84d 100644 --- a/src/main/java/ru/serega6531/packmate/service/PatternService.java +++ b/src/main/java/ru/serega6531/packmate/service/PatternService.java @@ -15,7 +15,7 @@ import ru.serega6531.packmate.model.pojo.PatternDto; import ru.serega6531.packmate.model.pojo.SubscriptionMessage; import ru.serega6531.packmate.repository.PatternRepository; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import java.time.Instant; import java.util.*; import java.util.concurrent.TimeUnit; diff --git a/src/main/java/ru/serega6531/packmate/service/ServicesService.java b/src/main/java/ru/serega6531/packmate/service/ServicesService.java index 3d8454b..1255f14 100644 --- a/src/main/java/ru/serega6531/packmate/service/ServicesService.java +++ b/src/main/java/ru/serega6531/packmate/service/ServicesService.java @@ -12,7 +12,7 @@ import ru.serega6531.packmate.model.pojo.ServiceDto; import ru.serega6531.packmate.model.pojo.SubscriptionMessage; import ru.serega6531.packmate.repository.ServiceRepository; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.*; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 3272e0b..a7e663a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -12,8 +12,6 @@ spring: jdbc: batch_size: 20 order_inserts: true - temp: - use_jdbc_metadata_defaults: false database-platform: org.hibernate.dialect.PostgreSQLDialect From 67c546201868c97cc0f53fb5a9b6a657ef6df1cc Mon Sep 17 00:00:00 2001 From: Sergey Shkurov Date: Mon, 24 Apr 2023 01:47:16 +0300 Subject: [PATCH 07/10] Fix a possible bug --- .../java/ru/serega6531/packmate/service/PatternService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/serega6531/packmate/service/PatternService.java b/src/main/java/ru/serega6531/packmate/service/PatternService.java index 59db84d..4c05fe3 100644 --- a/src/main/java/ru/serega6531/packmate/service/PatternService.java +++ b/src/main/java/ru/serega6531/packmate/service/PatternService.java @@ -60,7 +60,7 @@ public class PatternService { public Set findMatches(byte[] bytes, CtfService service, PatternDirectionType directionType, PatternActionType actionType) { final List list = patterns.values().stream() .filter(Pattern::isEnabled) - .filter(p -> p.getServiceId() == null || p.getServiceId() == service.getPort()) + .filter(p -> p.getServiceId() == null || p.getServiceId().equals(service.getPort())) .filter(p -> p.getActionType() == actionType) .filter(p -> p.getDirectionType() == directionType || p.getDirectionType() == PatternDirectionType.BOTH) .collect(Collectors.toList()); From 79315c3c1854db2ed0c93029d0b09852d92453d4 Mon Sep 17 00:00:00 2001 From: Sergey Shkurov Date: Thu, 27 Apr 2023 03:22:01 +0200 Subject: [PATCH 08/10] Update jna dependency for MacOS --- build.gradle.kts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index c04c896..7e81b7e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -30,8 +30,17 @@ dependencies { implementation("org.springframework.session:spring-session-core") implementation(group = "org.apache.commons", name = "commons-lang3", version = "3.12.0") implementation(group = "commons-io", name = "commons-io", version = "2.11.0") + implementation("org.pcap4j:pcap4j-core:1.8.2") implementation("org.pcap4j:pcap4j-packetfactory-static:1.8.2") + + constraints { + implementation("net.java.dev.jna:jna:5.13.0") { + because("upgraded version required to run on MacOS") + // https://stackoverflow.com/questions/70368863/unsatisfiedlinkerror-for-m1-macs-while-running-play-server-locally + } + } + implementation(group = "com.google.guava", name = "guava", version = "31.1-jre") implementation(group = "org.java-websocket", name = "Java-WebSocket", version = "1.5.3") implementation(group = "org.bouncycastle", name = "bcprov-jdk15on", version = "1.70") From 8bbd135e96f99a2125d71ae15dc7efeb45ef8f06 Mon Sep 17 00:00:00 2001 From: Sergey Shkurov Date: Thu, 27 Apr 2023 20:44:27 +0200 Subject: [PATCH 09/10] Refactor code --- .../controller/PatternController.java | 11 ++++++-- .../controller/ServiceController.java | 11 ++++++-- .../packmate/controller/StreamController.java | 13 +++++---- .../packmate/model/pojo/CountersHolder.java | 19 ++----------- .../packmate/model/pojo/UnfinishedStream.java | 17 ++--------- .../packmate/pcap/NoOpPcapWorker.java | 3 +- .../packmate/service/PatternService.java | 11 +++++--- .../packmate/service/StreamService.java | 28 +++++++++++-------- 8 files changed, 54 insertions(+), 59 deletions(-) diff --git a/src/main/java/ru/serega6531/packmate/controller/PatternController.java b/src/main/java/ru/serega6531/packmate/controller/PatternController.java index 1f95ffc..6ddb437 100644 --- a/src/main/java/ru/serega6531/packmate/controller/PatternController.java +++ b/src/main/java/ru/serega6531/packmate/controller/PatternController.java @@ -1,13 +1,18 @@ package ru.serega6531.packmate.controller; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import ru.serega6531.packmate.model.Pattern; import ru.serega6531.packmate.model.pojo.PatternDto; import ru.serega6531.packmate.service.PatternService; import java.util.List; -import java.util.stream.Collectors; @RestController @RequestMapping("/api/pattern/") @@ -24,7 +29,7 @@ public class PatternController { public List getPatterns() { return service.findAll() .stream().map(service::toDto) - .collect(Collectors.toList()); + .toList(); } @PostMapping("/{id}") diff --git a/src/main/java/ru/serega6531/packmate/controller/ServiceController.java b/src/main/java/ru/serega6531/packmate/controller/ServiceController.java index b317c6b..d23ce3a 100644 --- a/src/main/java/ru/serega6531/packmate/controller/ServiceController.java +++ b/src/main/java/ru/serega6531/packmate/controller/ServiceController.java @@ -1,13 +1,18 @@ package ru.serega6531.packmate.controller; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import ru.serega6531.packmate.model.CtfService; import ru.serega6531.packmate.model.pojo.ServiceDto; import ru.serega6531.packmate.service.ServicesService; import java.util.List; -import java.util.stream.Collectors; @RestController @RequestMapping("/api/service/") @@ -24,7 +29,7 @@ public class ServiceController { public List getServices() { return service.findAll().stream() .map(service::toDto) - .collect(Collectors.toList()); + .toList(); } @DeleteMapping("/{port}") diff --git a/src/main/java/ru/serega6531/packmate/controller/StreamController.java b/src/main/java/ru/serega6531/packmate/controller/StreamController.java index e0a77fa..12d888a 100644 --- a/src/main/java/ru/serega6531/packmate/controller/StreamController.java +++ b/src/main/java/ru/serega6531/packmate/controller/StreamController.java @@ -1,14 +1,17 @@ package ru.serega6531.packmate.controller; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; -import ru.serega6531.packmate.model.pojo.StreamPagination; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import ru.serega6531.packmate.model.pojo.StreamDto; +import ru.serega6531.packmate.model.pojo.StreamPagination; import ru.serega6531.packmate.service.StreamService; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; @RestController @RequestMapping("/api/stream/") @@ -25,14 +28,14 @@ public class StreamController { public List getStreams(@RequestBody StreamPagination pagination) { return service.findAll(pagination, Optional.empty(), pagination.isFavorites()).stream() .map(service::streamToDto) - .collect(Collectors.toList()); + .toList(); } @PostMapping("/{port}") public List getStreams(@PathVariable int port, @RequestBody StreamPagination pagination) { return service.findAll(pagination, Optional.of(port), pagination.isFavorites()).stream() .map(service::streamToDto) - .collect(Collectors.toList()); + .toList(); } @PostMapping("/{id}/favorite") diff --git a/src/main/java/ru/serega6531/packmate/model/pojo/CountersHolder.java b/src/main/java/ru/serega6531/packmate/model/pojo/CountersHolder.java index 49c5abf..980031b 100644 --- a/src/main/java/ru/serega6531/packmate/model/pojo/CountersHolder.java +++ b/src/main/java/ru/serega6531/packmate/model/pojo/CountersHolder.java @@ -1,23 +1,8 @@ package ru.serega6531.packmate.model.pojo; -import lombok.Getter; - import java.util.Map; -@Getter -public class CountersHolder { +public record CountersHolder(Map servicesPackets, Map servicesStreams, + int totalPackets, int totalStreams) { - private final Map servicesPackets; - private final Map servicesStreams; - - private final int totalPackets; - private final int totalStreams; - - public CountersHolder(Map servicesPackets, Map servicesStreams, - int totalPackets, int totalStreams) { - this.servicesPackets = servicesPackets; - this.servicesStreams = servicesStreams; - this.totalPackets = totalPackets; - this.totalStreams = totalStreams; - } } diff --git a/src/main/java/ru/serega6531/packmate/model/pojo/UnfinishedStream.java b/src/main/java/ru/serega6531/packmate/model/pojo/UnfinishedStream.java index d7da1f8..0f4523e 100644 --- a/src/main/java/ru/serega6531/packmate/model/pojo/UnfinishedStream.java +++ b/src/main/java/ru/serega6531/packmate/model/pojo/UnfinishedStream.java @@ -1,29 +1,18 @@ package ru.serega6531.packmate.model.pojo; -import lombok.AllArgsConstructor; -import lombok.Getter; import ru.serega6531.packmate.model.enums.Protocol; import java.net.InetAddress; -@AllArgsConstructor -@Getter -public class UnfinishedStream { - - private final InetAddress firstIp; - private final InetAddress secondIp; - private final int firstPort; - private final int secondPort; - private final Protocol protocol; +public record UnfinishedStream(InetAddress firstIp, InetAddress secondIp, int firstPort, int secondPort, + Protocol protocol) { @Override public boolean equals(Object obj) { - if (!(obj instanceof UnfinishedStream)) { + if (!(obj instanceof UnfinishedStream o)) { return false; } - UnfinishedStream o = (UnfinishedStream) obj; - boolean ipEq1 = firstIp.equals(o.firstIp) && secondIp.equals(o.secondIp); boolean ipEq2 = firstIp.equals(o.secondIp) && secondIp.equals(o.firstIp); boolean portEq1 = firstPort == o.firstPort && secondPort == o.secondPort; diff --git a/src/main/java/ru/serega6531/packmate/pcap/NoOpPcapWorker.java b/src/main/java/ru/serega6531/packmate/pcap/NoOpPcapWorker.java index f26c48b..174deb5 100644 --- a/src/main/java/ru/serega6531/packmate/pcap/NoOpPcapWorker.java +++ b/src/main/java/ru/serega6531/packmate/pcap/NoOpPcapWorker.java @@ -1,11 +1,10 @@ package ru.serega6531.packmate.pcap; -import org.pcap4j.core.PcapNativeException; import ru.serega6531.packmate.model.enums.Protocol; public class NoOpPcapWorker implements PcapWorker { @Override - public void start() throws PcapNativeException { + public void start() { } @Override diff --git a/src/main/java/ru/serega6531/packmate/service/PatternService.java b/src/main/java/ru/serega6531/packmate/service/PatternService.java index 4c05fe3..06fcc61 100644 --- a/src/main/java/ru/serega6531/packmate/service/PatternService.java +++ b/src/main/java/ru/serega6531/packmate/service/PatternService.java @@ -1,5 +1,6 @@ package ru.serega6531.packmate.service; +import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Autowired; @@ -15,11 +16,13 @@ import ru.serega6531.packmate.model.pojo.PatternDto; import ru.serega6531.packmate.model.pojo.SubscriptionMessage; import ru.serega6531.packmate.repository.PatternRepository; -import jakarta.annotation.PostConstruct; import java.time.Instant; -import java.util.*; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; @Service @Slf4j @@ -63,7 +66,7 @@ public class PatternService { .filter(p -> p.getServiceId() == null || p.getServiceId().equals(service.getPort())) .filter(p -> p.getActionType() == actionType) .filter(p -> p.getDirectionType() == directionType || p.getDirectionType() == PatternDirectionType.BOTH) - .collect(Collectors.toList()); + .toList(); return new PatternMatcher(bytes, list).findMatches(); } diff --git a/src/main/java/ru/serega6531/packmate/service/StreamService.java b/src/main/java/ru/serega6531/packmate/service/StreamService.java index d43101f..82a0faa 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamService.java @@ -13,11 +13,19 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import ru.serega6531.packmate.model.*; +import ru.serega6531.packmate.model.CtfService; +import ru.serega6531.packmate.model.FoundPattern; +import ru.serega6531.packmate.model.Packet; +import ru.serega6531.packmate.model.Pattern; +import ru.serega6531.packmate.model.Stream; import ru.serega6531.packmate.model.enums.PatternActionType; import ru.serega6531.packmate.model.enums.PatternDirectionType; import ru.serega6531.packmate.model.enums.SubscriptionMessageType; -import ru.serega6531.packmate.model.pojo.*; +import ru.serega6531.packmate.model.pojo.PacketDto; +import ru.serega6531.packmate.model.pojo.StreamDto; +import ru.serega6531.packmate.model.pojo.StreamPagination; +import ru.serega6531.packmate.model.pojo.SubscriptionMessage; +import ru.serega6531.packmate.model.pojo.UnfinishedStream; import ru.serega6531.packmate.repository.StreamRepository; import ru.serega6531.packmate.service.optimization.RsaKeysHolder; import ru.serega6531.packmate.service.optimization.StreamOptimizer; @@ -28,7 +36,6 @@ import java.util.List; import java.util.Optional; import java.util.Set; import java.util.regex.Matcher; -import java.util.stream.Collectors; @Service @Slf4j @@ -71,15 +78,15 @@ public class StreamService { @Transactional(propagation = Propagation.NEVER) public boolean saveNewStream(UnfinishedStream unfinishedStream, List packets) { final var serviceOptional = servicesService.findService( - unfinishedStream.getFirstIp(), - unfinishedStream.getFirstPort(), - unfinishedStream.getSecondIp(), - unfinishedStream.getSecondPort() + unfinishedStream.firstIp(), + unfinishedStream.firstPort(), + unfinishedStream.secondIp(), + unfinishedStream.secondPort() ); if (serviceOptional.isEmpty()) { log.warn("Failed to save the stream: service at port {} or {} does not exist", - unfinishedStream.getFirstPort(), unfinishedStream.getSecondPort()); + unfinishedStream.firstPort(), unfinishedStream.secondPort()); return false; } CtfService service = serviceOptional.get(); @@ -107,7 +114,7 @@ public class StreamService { .findFirst(); final Stream stream = new Stream(); - stream.setProtocol(unfinishedStream.getProtocol()); + stream.setProtocol(unfinishedStream.protocol()); stream.setTtl(firstIncoming.map(Packet::getTtl).orElse(0)); stream.setStartTimestamp(packets.get(0).getTimestamp()); stream.setEndTimestamp(packets.get(packets.size() - 1).getTimestamp()); @@ -190,7 +197,7 @@ public class StreamService { foundPatterns.addAll(matches.stream() .map(FoundPattern::getPatternId) .map(patternService::find) - .collect(Collectors.toList())); + .toList()); } return foundPatterns; @@ -245,7 +252,6 @@ public class StreamService { } public List getPackets(long streamId, @Nullable Long startingFrom, int pageSize) { -// long safeStartingFrom = startingFrom != null ? startingFrom : 0; return repository.getPackets(streamId, startingFrom, Pageable.ofSize(pageSize)); } From 6ea53719fd52c63fb528cd66b65e0a8631486855 Mon Sep 17 00:00:00 2001 From: Sergey Shkurov Date: Thu, 27 Apr 2023 23:19:19 +0200 Subject: [PATCH 10/10] Remove DISTINCT --- .../ru/serega6531/packmate/repository/StreamRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java b/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java index 539cb50..1313064 100644 --- a/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java +++ b/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java @@ -18,7 +18,7 @@ public interface StreamRepository extends JpaRepository, JpaSpecif long deleteByEndTimestampBeforeAndFavoriteIsFalse(long threshold); - @Query("SELECT DISTINCT p FROM Packet p " + + @Query("SELECT p FROM Packet p " + "LEFT JOIN FETCH p.matches " + "WHERE p.stream.id = :streamId " + "AND (:startingFrom IS NULL OR p.id > :startingFrom) " +