Напоследък в CS средите излезнаха доста оплаквания от експлойти и реших да направя тема в която да се разяснява за тях. Ще пробвам да ъпдейтвам темата и да я направя полезна за вас. Не е възможно да се знае за всеки експлойт, защото излизат през ден, но ще напиша поне тези за които имам данни. Ще ви предоставя съвети за двете платформи,
HLDS и ReHLDS.
ReHLDS уязвимости и решения:
Експлойт: SV_Checkforduplicatenames, v_2
Какво прави експлойта: Сървъра спира с грешка в конзолата
Can't use keys or values with a .. и трябва да се рестартира изцяло от вас или от хостинга ви.
Решение: Обновяване до последна ReHLDS версия. (Фиксове:
1 и
2)
Експлойт: Someone tries to send split packet
Какво прави експлойта: Сървъра лагва със спам в конзолата:
Someone tries to send split packet....
Решение: Обновяване до последна ReHLDS версия. (
Фикс)
Допълнително решение: Iptables -A INPUT -p udp --dport 27015 -m u32 --u32 "0x19&0xff=0xfe" -j DROP
Експлойт: Amplificated attack от сървъри
Какво прави експлойта: Огромни количества флууд от чужди сървъри и сървъра ви приема заявката, сървъра спира и не се пуска докато не приключи атаката.
Решение: CS Validation Module (Това е модул който се закупува за линукс, не е свързан с CS сървъра)
Експлойт: Query Flood
Какво прави експлойта: [REUNION]: Query flood blocking: 1 pps (0.001 mbps) from 64+ IPs в конзолата, огромен лаг
Решение: Последна версия на Reunion и ReHLDS
Допълнително решение:
Извън темата
iptables -I INPUT -p udp -m u32 --u32 "26&0xFFFF=0xfeff" -j DROP
iptables -I INPUT -p udp -m u32 --u32 "24&0xffff=0x0000" -j DROP
HLDS уязвимости и решения:
Експлойт: SV_Checkforduplicatenames, v_2
Какво прави експлойта: Сървъра спира с грешка в конзолата
Can't use keys or values with a .. и трябва да се рестартира изцяло от вас или от хостинга ви.
Решение: Обновяване до dproto 0.9.582
Други решения:
► Покажи скъсения текст
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Exploit name fixer"
#define VERSION "1.0"
#define AUTHOR "_xvi"
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
}
public check(id)
{
new szName[32]
get_user_name(id, szName, charsmax(szName))
new pos = containi(szName,"^"")
if(pos != -1)
{
new player_ip[23]
get_user_ip(id, player_ip, 22, 1)
server_cmd("say Hello: %s (%s)", szName, player_ip)
server_cmd("addip 1337 %s", player_ip)
}
}
public client_connect(id)
{
check(id)
}
public client_infochanged(id)
{
check(id)
}
Orpheu:
► Покажи скъсения текст
{
"name" : "SV_CheckForDuplicateNames",
"library" : "engine",
"arguments" :
[
{
"type" : "char *"
},
{
"type" : "int"
},
{
"type" : "int"
}
],
"identifiers" :
[
{
"os" : "windows",
"value" : [0x55,0x8B,0xEC,0x83,0xEC,"*",0x56,0x57,"*","*","*",0x68,"*",0x56,"*","*",0x57,"*",0x45,"*","*","*","*","*","*",0x45,"*","*","*","*","*","*"]
},
{
"os" : "linux",
"value" : "SV_CheckForDuplicateNames"
}
]
}
► Покажи скъсения текст
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <orpheu>
#include <orpheu_memory>
#define voidfunc "SV_CheckForDuplicateNames"
#define console_max 0xff
#define PLUGIN "SV_CheckForDuplicateNames_fix orpheu version"
#define VERSION "1.0.5"
#define AUTHOR "SkillartzHD"
#define orpheufile "addons/amxmodx/configs/orpheu/functions/SV_CheckForDuplicateNames"
public plugin_precache() {
register_plugin(PLUGIN, VERSION, AUTHOR)
new LogPlugin[0xFF],LogPluginError[0xFF]
formatex(LogPlugin,charsmax(LogPlugin),"%s Functia %s a primit hook cu succes",PLUGIN,voidfunc)
formatex(LogPluginError,charsmax(LogPluginError),"%s n-am gasit functia %s",PLUGIN,voidfunc)
if(file_exists(orpheufile)){
OrpheuRegisterHook(OrpheuGetFunction("SV_CheckForDuplicateNames"),"SV_CheckForDuplicateNames")
server_print("dada %s",LogPlugin)
}
else{
server_print("%s",LogPluginError)
}
}
public OrpheuHookReturn:SV_CheckForDuplicateNames(userinfo[],bIsReconnecting,nExcludeSlot){
if(IsInvalidFunction()){
return OrpheuSupercede
}
return OrpheuIgnored
}
stock IsInvalidFunction(){
if(containi(Argv4(),"^x22")!=-0x01) {
new GetInvalid[0x78]
BufferName(Argv4(),0x5DC,GetInvalid)
server_cmd("^x6B^x69^x63^x6B^x20^x25^x73^x22",GetInvalid)
return 1
}
return 0
}
stock Argv4(){
new text[console_max]
read_argv(0x04,text,charsmax(text))
return text
}
stock BufferName(info[],size,name[],size_name = 31)
{
new heh = 0x00;
if ((heh = containi(info, "\name\") ) != -1){
heh += 0x06;
new len = 0x00;
while(info[heh] != '\' && info[heh] != '"' && len < size_name && heh < size)
name[len++] = info[heh++];
name[len] = EOS;
}
else{
name[0x00] = EOS;
}
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/
Okapi:
► Покажи скъсения текст
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <okapi>
#define voidfunc "SV_CheckForDuplicateNames"
#define console_max 0xff
#define PLUGIN "SV_CheckForDuplicateNames_fix"
#define VERSION "1.0.8"
#define AUTHOR "SkillartzHD"
new SV_CheckForDuplicateNames_win[] = {
0x55,0x8B,0xEC,0x83,0xEC,0xDEF,0x56,0x57,0xDEF,0xDEF,
0xDEF,0x68,0xDEF,0x56,0xDEF,0xDEF,0x57,0xDEF,0x45,0xDEF,
0xDEF,0xDEF,0xDEF,0xDEF,0xDEF,0x45,0xDEF,0xDEF,0xDEF,
0xDEF,0xDEF,0xDEF
}
public plugin_precache() {
register_plugin(PLUGIN, VERSION, AUTHOR)
new LogPlugin[0xFF],LogPluginError[0xFF]
formatex(LogPlugin,charsmax(LogPlugin),"%s Functia %s a primit hook cu succes",PLUGIN,voidfunc)
formatex(LogPluginError,charsmax(LogPluginError),"%s n-am gasit functia %s",PLUGIN,voidfunc)
if(is_linux_server()){
new linux = okapi_engine_get_symbol_ptr(voidfunc)
if(linux){
okapi_add_hook(okapi_build_function(linux,arg_string,arg_int,arg_int),voidfunc)
server_print("%s [linux]",LogPlugin)
}
else{
server_print("%s [linux]",LogPluginError)
}
}
else{
new windows = okapi_engine_find_sig(SV_CheckForDuplicateNames_win,charsmax(SV_CheckForDuplicateNames_win))
if(windows){
okapi_add_hook(okapi_build_function(windows,arg_string,arg_int,arg_int),voidfunc)
server_print("%s [windows]",LogPlugin)
}
else{
server_print("%s [windows]",LogPluginError)
}
}
}
public SV_CheckForDuplicateNames(userinfo[],bIsReconnecting,nExcludeSlot){
if(IsInvalidFunction()){
return okapi_ret_supercede
}
return okapi_ret_ignore
}
stock IsInvalidFunction(){
if(okapi_engine_find_string("(%d)%-0.*s")){
if(containi(Argv4(),"^x22")!=-0x01) {
new GetInvalid[0x78]
BufferName(Argv4(),0x5DC,GetInvalid)
server_cmd("^x6B^x69^x63^x6B^x20^x25^x73^x22",GetInvalid)
return 1
}
}
return 0
}
stock Argv4(){
new text[console_max]
read_argv(0x04,text,charsmax(text))
return text
}
stock BufferName(info[],size,name[],size_name = 0x1F)
{
new heh = 0x00;
if ((heh = containi(info, "\name\") ) != -1){
heh += 0x06;
new len = 0x00;
while(info[heh] != '\' && info[heh] != '"' && len < size_name && heh < size)
name[len++] = info[heh++];
name[len] = EOS;
}
else{
name[0x00] = EOS;
}
}
Експлойт: Someone tries to send split packet
Какво прави експлойта: Сървъра лагва със спам в конзолата:
Someone tries to send split packet....
Решение: Обновяване до dproto 0.9.582
Това е само началото на темата за последните експлойти. Ще се ъпдейтва от мен и ако има желание от AMXX-BG Team.
Още един съвет за собствениците на сървъри: Използвайте последни версии на платформите и модулите, за да имате максимално малко проблеми. Всички ги има качени тук, но забелязвам много сървъри със стари версии.