Skip to content

Commit

Permalink
Added some Checks, yeah thats it :)
Browse files Browse the repository at this point in the history
  • Loading branch information
ytendx committed Jan 23, 2022
1 parent ee1f4ee commit a257f3c
Show file tree
Hide file tree
Showing 17 changed files with 182 additions and 5 deletions.
2 changes: 2 additions & 0 deletions src/main/java/de/febanhd/anticrash/AntiCrash.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ private void registerChecks() {
this.checks.add(new DosCheck());
this.checks.add(new SignCheck());
this.checks.add(new EnderPortalCheck());
this.checks.add(new Log4JExploitCheck());
this.checks.add(new ChatMessageCheck());

}

Expand Down
14 changes: 14 additions & 0 deletions src/main/java/de/febanhd/anticrash/checks/AbstractCheck.java
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,20 @@ public void sendInvalidPacketWarning(Player player, PacketEvent event, String re
});
}

public void sendInvalidPacketWarning(Player player, String reason) {
if(lastReasonsMap.containsKey(player) && lastReasonsMap.get(player).equals(reason)) return;
lastReasonsMap.put(player, reason);

String playerName = this.getPlayerName(player);

Bukkit.getScheduler().scheduleSyncDelayedTask(this.getPlugin(), () -> {
new Broadcast("anticrash.notify", players -> {
players.sendMessage(AntiCrash.PREFIX + "§c" + playerName + " §7tryed to crash the server!");
players.sendMessage(AntiCrash.PREFIX + "§cReason: §7" + reason);
});
});
}

public void sendCrashWarning(Player player, String reason) {
this.closeChannel(player);
if(lastReasonsMap.containsKey(player) && lastReasonsMap.get(player).equals(reason)) return;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package de.febanhd.anticrash.checks.impl;

import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.PacketEvent;
import de.febanhd.anticrash.checks.AbstractCheck;
import de.febanhd.anticrash.plugin.AntiCrashPlugin;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;

import java.util.concurrent.ConcurrentHashMap;

public class ChatMessageCheck extends AbstractCheck implements Listener {

private ConcurrentHashMap<Player, Long> lastMessage;

public ChatMessageCheck() {
super("Chat Message Check");
lastMessage = new ConcurrentHashMap<>();
Bukkit.getPluginManager().registerEvents(this, AntiCrashPlugin.getPlugin());
}

@EventHandler
public void handleChat(AsyncPlayerChatEvent event){
if(lastMessage.containsKey(event.getPlayer())){
if(System.currentTimeMillis() - lastMessage.get(event.getPlayer()) < 100){
this.sendInvalidPacketWarning(event.getPlayer(), "Sent messages too fast (<100ms)");
event.setCancelled(true);
}
lastMessage.replace(event.getPlayer(), System.currentTimeMillis());
}else lastMessage.put(event.getPlayer(), System.currentTimeMillis());
}

@EventHandler
public void handlePreCommand(PlayerCommandPreprocessEvent event){
if(event.getMessage().contains("/calc") || event.getMessage().contains("/solve") || event.getMessage().contains("/eval") || event.getMessage().contains("/desc")){
if(event.getMessage().contains("(")
|| event.getMessage().contains(")")
|| event.getMessage().contains("[")
|| event.getMessage().contains("]")
|| event.getMessage().contains("{")
|| event.getMessage().contains("}")
|| event.getMessage().contains("?")
|| event.getMessage().contains(":")
|| event.getMessage().contains(";")){
this.sendInvalidPacketWarning(event.getPlayer(), "The player executed a dangerous WorldEdit Crash Command. (Calculation)");
event.setCancelled(true);
}else if(event.getMessage().length() > 20){
this.sendInvalidPacketWarning(event.getPlayer(), "The player executed a dangerous WorldEdit Crash Command. (Calculation)");
event.setCancelled(true);
}
}

if(event.getMessage().contains("mv") && (event.getMessage().contains("\n") || event.getMessage().contains(".*.*")) || event.getMessage().contains(String.valueOf((char) 775))){
this.sendInvalidPacketWarning(event.getPlayer(), "The player executed a Crash Command. (MV Crasher / Bad Char)");
event.setCancelled(true);
}

if(event.getMessage().contains("mv") && (event.getMessage().contains("/") || event.getMessage().contains("\\"))){
this.sendInvalidPacketWarning(event.getPlayer(), "The player executed a dangerous Multiverse Command. (Path Navigation)");
event.setCancelled(true);
}

if((event.getMessage().contains("pex promote a a") || event.getMessage().contains("pex demote a a")) && event.getMessage().startsWith("/")){
this.sendInvalidPacketWarning(event.getPlayer(), "The player executed a permission ex crash command. (Promote/Demote)");
event.setCancelled(true);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package de.febanhd.anticrash.checks.impl;

import de.febanhd.anticrash.checks.AbstractCheck;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.filter.AbstractFilter;
import org.apache.logging.log4j.core.filter.AbstractFilterable;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class Log4JExploitCheck extends AbstractCheck {

private static final Pattern PATTERN = Pattern.compile(".*\\$\\{[^}]*\\}.*");

public Log4JExploitCheck() {
super("Log4J Exploit Check");
Logger logger = plugin.getLogger();

plugin.getServer().getPluginManager().registerEvents(new Listener() {

@EventHandler
public void handleMessage(AsyncPlayerChatEvent chatEvent){
if(chatEvent.getMessage().toLowerCase().contains("${jndi:ldap") || chatEvent.getMessage().toLowerCase().contains("${jndi")
|| chatEvent.getMessage().toLowerCase().contains("ldap")){
sendInvalidPacketWarning(chatEvent.getPlayer(), "Tryed to exploit Log4J via chat");
chatEvent.setCancelled(true);
}
}

@EventHandler
public void handleCommand(PlayerCommandPreprocessEvent event){
if(event.getMessage().toLowerCase().contains("${jndi:ldap") || event.getMessage().toLowerCase().contains("${jndi")
|| event.getMessage().toLowerCase().contains("ldap")){
sendInvalidPacketWarning(event.getPlayer(), "Tryed to exploit Log4J via command");
event.setCancelled(true);
}
}
}, plugin);

try {
this.applyAppenders();
logger.info("Successfully applied filters to all Appenders! (Log4J Fix)");
} catch (Exception exception) {
logger.warning("Failed to add Log4J Appenders (LoggerFilter) to Logger. (Incompatible Logger version)!");
}
}

private void applyAppenders() {
Map appenders = ((org.apache.logging.log4j.core.Logger)(LogManager.getRootLogger())).getAppenders();
LoggerFilter filter = new LoggerFilter();
List<Appender> filterable = (List<Appender>) appenders.values().stream().filter(appender -> appender instanceof AbstractFilterable).collect(Collectors.toList());
filterable.forEach(appender -> ((AbstractFilterable)(appender)).addFilter(filter));
}

private static class LoggerFilter
extends AbstractFilter {
private LoggerFilter() {
}

public Result filter(LogEvent event) {
String message = event.getMessage().getFormattedMessage();
if (message.indexOf(36) != -1 && PATTERN.matcher(message.toLowerCase()).find()) {
Bukkit.getConsoleSender().sendMessage("Server blocked Log4J Exploit try succesfully via Log Filter.");
return Result.DENY;
}
return super.filter(event);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.google.common.collect.Lists;
import de.febanhd.anticrash.checks.AbstractCheck;
import de.febanhd.anticrash.checks.CheckResult;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
Expand All @@ -28,6 +29,13 @@ public NBTTagCheck() {
@Override
public void onPacketReceiving(PacketEvent event) {
Player player = event.getPlayer();

if(event.getPacket().getType().equals(PacketType.Play.Client.SET_CREATIVE_SLOT)
&& player.getGameMode() != GameMode.CREATIVE){
this.sendInvalidPacketWarning(player, event, "Sent creative slot packet without being in creative mode");
event.setCancelled(true);
}

PacketContainer packet = event.getPacket();
ItemStack stack = packet.getItemModifier().readSafely(0);
if(stack == null) return;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package de.febanhd.anticrash.commands;

import com.comphenix.protocol.PacketType;
import de.febanhd.anticrash.AntiCrash;
import de.febanhd.anticrash.checks.impl.nbt.NBTTagCheck;
import de.febanhd.anticrash.plugin.AntiCrashPlugin;
Expand All @@ -12,9 +13,11 @@ public class AntiCrashCommand implements CommandExecutor {

@Override
public boolean onCommand(CommandSender sender, Command command, String s, String[] strings) {
if(sender instanceof Player) ((Player) sender).sendTitle("§4§lFAC", "§c§lMade by FebanHD <3");

sender.sendMessage(AntiCrash.PREFIX + "§cFixedFAC by §eFebanHD §7fixed by §eytendx §8| AntiCrash & AntiDos");
Player player = ((Player) sender);
player.sendTitle("§4§lFAC", "§c§lMade by FebanHD <3");

sender.sendMessage(AntiCrash.PREFIX + "§cFixedFAC §7by §eFebanHD §7fixed by §eytendx §8| §7AntiCrash & AntiDoS");
sender.sendMessage(AntiCrash.PREFIX + "§cVersion: §7" + AntiCrashPlugin.getPlugin().getDescription().getVersion());
sender.sendMessage(AntiCrash.PREFIX + "§cChecks: §7" + AntiCrash.getInstance().getChecks().size());
sender.sendMessage(AntiCrash.PREFIX + "§cNBTChecks: §7" + ((NBTTagCheck)AntiCrash.getInstance().getCheck(NBTTagCheck.class)).getChecks().size());
Expand Down
Binary file modified target/classes/de/febanhd/anticrash/AntiCrash.class
Binary file not shown.
Binary file not shown.
Binary file modified target/classes/de/febanhd/anticrash/checks/AbstractCheck.class
Binary file not shown.
Binary file modified target/classes/de/febanhd/anticrash/checks/impl/DosCheck.class
Binary file not shown.
Binary file not shown.
Binary file modified target/classes/de/febanhd/anticrash/commands/AntiCrashCommand.class
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified target/classes/de/febanhd/anticrash/plugin/AntiCrashPlugin.class
Binary file not shown.
2 changes: 1 addition & 1 deletion target/classes/plugin.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: FAC
version: 1.2.9
version: 1.2.9-FIXED
main: de.febanhd.anticrash.plugin.AntiCrashPlugin
author: FebanHD
softdepend:
Expand Down
4 changes: 2 additions & 2 deletions target/maven-archiver/pom.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#Generated by Maven
#Sun Jan 23 14:06:09 CET 2022
#Sun Jan 23 14:59:02 CET 2022
groupId=de.febanhd
artifactId=FAC
version=1.2.9
version=1.2.9-FIXED

0 comments on commit a257f3c

Please sign in to comment.