There are a few issues from the script; here’s what I found going top to down.
The whitelist configuration part is redundant; if you’re checking for exploits, you shouldn’t need a whitelist. If someone is exploiting, they’re exploiting, and should all be treated the same.
local Players = ... is defined but not actually used as a variable anywhere.
Character is defined by waiting for the CharacterAdded event, which doesn’t account for the event in which the character is already present.
repeat wait() until LocalPlayer is redundant because LocalPlayer will never be nil, and if it was, the variable value would never change from under your nose without your own code setting it anywhere else.
repeat wait() until LocalPlayer.Character is redundant because you already waited for the character to be present when you defined Character.
Some of the checks only run once, which makes them effectively nil when it comes to someone exploiting.
Minor detail, but checking if a == true can just be shortened to if a.
PartInsertor check might interfere with genuine replications of models and such in the map to the client.
AntiLighting check only checks if a sky was added, which isn’t something to be worried about, especially on the client.
AntiHealth won’t work because of what nulllifeleft already mentioned.
PreviousPosition is declared but never used.
The check for if HRP == nil is redundant, because of what I mentioned before about variables changing values from under you.
The NoTeleport function is also only defined if Anti_Teleportation is enabled. If this is disabled, your script would error on the second to last line because it’d attempt to call a nil value.
Player is defined again but never used.
while wait() loops are something you should be wary of; here’s a post on that. Avoiding wait() and why
In the loop, you constantly check GetRankInGroup, which would only be needed to run once.
Lastly, the kick messages seem to be inconsistent. Some are No Exploits, some Nope, and others many variations of the former.