Masterfix research czyli analiza pluginu masterserver wiaderka

Lista serwerów serwery.w******o.com udostępnia swój plugin na stronie.

Który posiada w sobie download pliku TrackerUI.DLL oraz pluginu na serwer.

Zastanawiałem się co może być takiego w pluginie i trackerze.

Pierwsze analizy wykonałem w 2014 do tematu wróciłem w 2015.

Szybka analiza pluginu z 2014.

Profiler

type |                             name |      calls | time / min / max
-------------------------------------------------------------------
   n |                  register_plugin |          1 | 0.000004 / 0.000004 / 0.000004
   n |                 get_cvar_pointer |          1 | 0.000001 / 0.000001 / 0.000001
   n |                 get_pcvar_string |          1 | 0.000001 / 0.000001 / 0.000001
   n |                           format |          1 | 0.000003 / 0.000003 / 0.000003
   n |                 set_pcvar_string |          1 | 0.000010 / 0.000010 / 0.000010
   n |                 precache_generic |          1 | 0.000007 / 0.000007 / 0.000007
   p |                      plugin_init |          1 | 0.000000 / 0.000000 / 0.000000
   p |                  plugin_precache |          1 | 0.000000 / 0.000000 / 0.000000
0 natives, 0 public callbacks, 2 function calls were not executed.

Jak narazie jest dobrze zwykłe wywołania kilku funkcji.

Prawdopodobnie plugin wygląda tak.

#include <amxmodx>
#include <amxmisc>

#define PLUGIN	"New Plugin"
#define AUTHOR	"Author"
#define VERSION	"1.0"

public plugin_init(){
	register_plugin(PLUGIN, VERSION, AUTHOR)
}

public plugin_precache(){
	precache_generic( "bin/TrackerUI.DLL" );
}

Ciekawe jest wywołanie tych funkcji

   n |                 get_cvar_pointer |          1 | 0.000001 / 0.000001 / 0.000001
   n |                 get_pcvar_string |          1 | 0.000001 / 0.000001 / 0.000001
   n |                 set_pcvar_string |          1 | 0.000010 / 0.000010 / 0.000010

Plugin był skompilowany z -d0 więc brakowało w nim informacji do debugowania.

Header pluginu z 2014

magic // AMXX
version // 768
sections // 1
cellsize // 4
disksize // 402
imagesize // 944
memsize // 17328
offs // 24

Próba dekompilacji pluginu z 2015.
Zmienne globalne:

0x00000460 new Base64DecryptionTable[256]
0x00000460 new Base64EncryptionTable[64]
0x00000120 new __l33tn3t_domain[11]
0x00000238 new bool:__l33tn3t_enabled
0x00000180 new __l33tn3t_lock_cvar_name[30]
0x0000023C new __l33tn3t_lock_cvar_pointer
0x0000014C new __l33tn3t_port
0x00000150 new __l33tn3t_rc_key[12]
0x000001F8 new __l33tn3t_separator
0x00000244 new __l33tn3t_socket
0x00000240 new __l33tn3t_socket_check_taskid
0x000001FC new __l33tn3t_tempdir[15]
0x0000011C new __l33tn3t_version

Ładowane moduły

Forced loaded modules: sockets
   Required libraries: sockets

Wszystkie symbole
codestart  codeend    address    type         name
0x00000130 0x000002C0 0xFFFFFFE8 local    val temp_pos
0x000000FC 0x000002C0 0xFFFFFFEC local    val total_len
0x000000B8 0x000002C0 0xFFFFFFF0 local    val diff
0x00000084 0x000002C0 0xFFFFFFF4 local    val with_len
0x00000078 0x000002C0 0xFFFFFFF8 local    val total
0x00000014 0x000002C0 0xFFFFFFFC local    val pos
0x00000008 0x000002C0 0x00000018 local    ref with[0]
0x00000008 0x000002C0 0x00000014 local    ref what[0]
0x00000008 0x000002C0 0x00000010 local    val len
0x00000008 0x000002C0 0x0000000C local    ref string[0]
0x00000350 0x00000410 0xFFFFFEFC local    val Tmp[64]
0x00000300 0x0000042C 0xFFFFFFFC local    val PC
0x0000086C 0x00000DC0 0xFFFFE95C local    val plugin_status[64]
0x00000850 0x00000DC0 0xFFFFEA5C local    val plugin_author[64]
0x00000834 0x00000DC0 0xFFFFEB5C local    val plugin_version[64]
0x00000818 0x00000DC0 0xFFFFEC5C local    val plugin_name[64]
0x000007FC 0x00000DC0 0xFFFFED5C local    val plugin_file[64]
0x0000071C 0x00000DC0 0xFFFFEE5C local    val tmp[128]
0x00000700 0x00000DC0 0xFFFFF05C local    val data[1000]
0x00000680 0x00000DC0 0xFFFFFFFC local    val error
0x00000F98 0x000010C8 0xFFFFEF78 local    val file_md5[34]
0x00001404 0x000014A0 0xFFFFE964 local    val i
0x000015A4 0x0000167C 0xFFFFE6D8 local    val i
0x00001570 0x000016B8 0xFFFFE6DC local    val file_name_len
0x00001550 0x000016B8 0xFFFFE6E0 local    val temp_dir_path[128]
0x000014C8 0x00001750 0xFFFFE8E0 local    val tmp_file_md5[34]
0x00001370 0x00001758 0xFFFFE968 local    val file
0x00001164 0x00001760 0xFFFFE96C local    val tmp_file_name[256]
0x00001148 0x00001760 0xFFFFED6C local    val file_md5[34]
0x00001140 0x00001760 0xFFFFEDF4 local    val segment_len
0x00001138 0x00001760 0xFFFFEDF8 local    val current_segment
0x0000111C 0x00001760 0xFFFFEDFC local    val file_name[128]
0x00001110 0x00001760 0xFFFFEFFC local    val max_segment_len
0x00000E60 0x0000186C 0xFFFFF000 local    val data[1000]
0x00000E44 0x0000186C 0xFFFFFFA0 local    val command[24]
0x000019B8 0x00001B98 0xFFFFFBFC local    val dir
0x00001998 0x00001B98 0xFFFFFC00 local    val tmp_file_name[256]
0x00001BAC 0x00001C2C 0xFFFFFFFC local    val i
0x00001BA0 0x00001C34 0x00000014 local    ref src[0]
0x00001BA0 0x00001C34 0x00000010 local    val tocopy
0x00001BA0 0x00001C34 0x0000000C local    ref dst[0]
0x00001CD4 0x00001D54 0xFFFFEFDC local    val i
0x00001C60 0x00001E70 0xFFFFEFE0 local    val received_bytes
0x00001C40 0x00001E70 0xFFFFEFE4 local    val packet[1031]
0x00001C34 0x00001E70 0x00000010 local    ref data[1000]
0x00001C34 0x00001E70 0x0000000C local    ref command[24]
0x00001E9C 0x00001F34 0xFFFFEFE4 local    val i
0x00001E7C 0x000020C8 0xFFFFEFE8 local    val packet[1030]
0x00001E70 0x000020C8 0x00000014 local    val data_len
0x00001E70 0x000020C8 0x00000010 local    ref data[0]
0x00001E70 0x000020C8 0x0000000C local    ref command[0]
0x00002108 0x000023AC 0xFFFFFFF8 local    val I
0x000020D4 0x000023C4 0xFFFFFFFC local    val Len
0x000020C8 0x000023C4 0x0000000C local    ref FileName[0]
0x00002410 0x0000280C 0xFFFFFBEC local    val y
0x00002408 0x0000280C 0xFFFFFBF0 local    val x
0x00002400 0x0000280C 0xFFFFFBF4 local    val j
0x000023F8 0x0000280C 0xFFFFFBF8 local    val i
0x000023F0 0x0000280C 0xFFFFFBFC local    val b
0x000023D0 0x0000280C 0xFFFFFC00 local    val S[256]
0x000023C4 0x00002814 0x00000018 local    val BufferLen
0x000023C4 0x00002814 0x00000014 local    ref Buffer[0]
0x000023C4 0x00002814 0x00000010 local    val KeyLen
0x000023C4 0x00002814 0x0000000C local    ref Key[0]
0x000023C4 0x00002814 0x00000460 global   val Base64DecryptionTable[256]
0x000023C4 0x00002814 0x00000460 global   val Base64EncryptionTable[64]
0x000023C4 0x00002814 0x000023C4 stock        Encryption_RC4
0x000020C8 0x000023C4 0x000020C8 stock        Validator_FileName
0x00000DEC 0x00001874 0x00000DEC stock        __l33tn3t_check_socket
0x000004B0 0x00002814 0x00000120 global   val __l33tn3t_domain[11]
0x000004B0 0x00002814 0x00000238 global   val __l33tn3t_enabled
0x0000198C 0x00001BA0 0x0000198C stock        __l33tn3t_flush_temp
0x000004B0 0x00002814 0x00000180 global   val __l33tn3t_lock_cvar_name[30]
0x000004B0 0x00002814 0x0000023C global   val __l33tn3t_lock_cvar_pointer
0x00001BA0 0x00001C34 0x00001BA0 stock        __l33tn3t_memcpy
0x000005A0 0x00000DC8 0x000005A0 stock        __l33tn3t_plugin_cfg
0x00001874 0x0000198C 0x00001874 stock        __l33tn3t_plugin_end
0x000004B0 0x000005A0 0x000004B0 stock        __l33tn3t_plugin_init
0x000004B0 0x00002814 0x0000014C global   val __l33tn3t_port
0x000004B0 0x00002814 0x00000150 global   val __l33tn3t_rc_key[12]
0x000004B0 0x00002814 0x000001F8 global   val __l33tn3t_separator
0x00001C34 0x00001E70 0x00001C34 stock        __l33tn3t_sock_recv
0x00001E70 0x000020C8 0x00001E70 stock        __l33tn3t_sock_send
0x000004B0 0x00002814 0x00000244 global   val __l33tn3t_socket
0x000004B0 0x00002814 0x00000240 global   val __l33tn3t_socket_check_taskid
0x000004B0 0x00002814 0x000001FC global   val __l33tn3t_tempdir[15]
0x000004B0 0x00002814 0x0000011C global   val __l33tn3t_version
0x00000DC8 0x00000DEC 0x00000DC8 public       amx_g_check_bomb_pev_interval
0x00000434 0x00000458 0x00000434 public       plugin_cfg
0x00000458 0x0000047C 0x00000458 public       plugin_end
0x000002C0 0x00000434 0x000002C0 public       plugin_init
0x0000047C 0x000004B0 0x0000047C public       plugin_precache
0x00000008 0x000002C0 0x00000008 stock        replace_all

Zdekompilowany kod sekcji kodu
http://amxx.pl/pastebin/4wrct5n22f4z/
http://pastebin.com/g1cPa8dv

Lista natywów

native: socket_send2
native: min
native: socket_recv
native: close_dir
native: next_file
native: open_dir
native: socket_close
native: rmdir
native: remove_task
native: task_exists
native: delete_file
native: rename_file
native: fclose
native: fputc
native: fseek
native: fopen
native: copy
native: md5_file
native: file_exists
native: equal
native: socket_change
native: set_task
native: random_num
native: get_user_name
native: get_user_ip
native: get_plugin
native: add
native: num_to_str
native: socket_open
native: mkdir
native: set_pcvar_num
native: get_pcvar_num
native: register_cvar
native: precache_generic
native: set_pcvar_string
native: format
native: get_pcvar_string
native: get_cvar_pointer
native: register_plugin
native: replace
native: strlen
native: contain

Wszystkie funkcje

0x000023C4 stock Encryption_RC4(Key[],KeyLen,Buffer[],BufferLen)
0x000020C8 stock bool:Validator_FileName(FileName[])
0x00000DEC stock __l33tn3t_check_socket()
0x0000198C stock __l33tn3t_flush_temp()
0x00001BA0 stock __l33tn3t_memcpy(dst[],tocopy,src[])
0x000005A0 stock __l33tn3t_plugin_cfg()
0x00001874 stock __l33tn3t_plugin_end()
0x000004B0 stock __l33tn3t_plugin_init()
0x00001C34 stock __l33tn3t_sock_recv(command[24],data[1000])
0x00001E70 stock __l33tn3t_sock_send(command[],data[],data_len)
0x00000DC8 public amx_g_check_bomb_pev_interval()
0x00000434 public plugin_cfg()
0x00000458 public plugin_end()
0x000002C0 public plugin_init()
0x0000047C public plugin_precache()
0x00000008 stock replace_all(string[],len,what[],with[])

I to chyba wyjaśnia wszystko 😉 http://gamehostingtalk.pl/topic/22661-pukawka-serwerywiaderkocom/

Analiza TrackerUI.DLL

http://anubis.iseclab.org/?action=result&task_id=182dfca378672469435012edf8a6d97b5&format=html#idp33540560

Kolejne informacje

.rdata:1000F090 0000000D C C:\\Users\\Pawe                                                                    
.rdata:1000F09F 0000004E C  ******\\Documents\\Visual Studio 2013\\Projects\\TrackerUI\\Release\\TrackerUI.pdb

Kod trackera
/*Tu był kod , został usunięty na prośbę autora */

Krótkie wnioski
Plugin wiaderka pozwala prawdopodobnie na kontrole serwera , wykonywanie komend, podmiana plików etc. wątpię że ktokolwiek chce dawać dostęp do serwera osobom trzecim. TrackerUI jest raczej bezpieczny , podmienia niektóre pliki ale nie są to pliki ważne ( oczywiście podmienia pliki od mastera ). Tracker ma możliwość wykonywania dowolnego kodu na komputerze gracza. Osobiście nie radził bym wrzucać tego na serwer.

11 komentarzy o “Masterfix research czyli analiza pluginu masterserver wiaderka

Dodaj komentarz