рдпрд╣рд╛рдВ
ValdikSS рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ -
рдиреНрдпреВ рдпреВрдЬрд░рд▓реИрдВрдб-рд░реВрдЯрдХрд┐рдЯ рдЕрдЬрд╝рдЬрд╝реЗрд▓ рд╕реЗ рдмрдбрд╝реА рдЦрдмрд░ рд╣реИред рдореБрдЭреЗ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЛ рдЙрджреНрдзреГрдд рдХрд░реЗрдВ:
рдЖрдкрдиреЗ рд░реВрдЯрдХрд┐рдЯреНрд╕ Jynx рдФрд░ Jynx2 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реЛрдЧрд╛ред рдпреЗ рддрдерд╛рдХрдерд┐рдд рдпреВрдЬрд░рд▓реИрдВрдб рд░реВрдЯрдХрд┐рдЯ рд╣реИрдВ; рд╡реЗ LD_PRELOAD рдЪрд░ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рднреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдкреБрд░рд╛рдиреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
2 рджрд┐рди рдкрд╣рд▓реЗ, github рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ Chokepoint рдиреЗ rootkit Azazel рдХреЛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ Jynx рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХрдИ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:
рд╡рд┐рд░реЛрдзреА рдбрд┐рдмрдЧрд┐рдВрдЧ рддрдВрддреНрд░
Unhide, lsof, ps, ldd рд╕реЗ рдЫрд┐рдкрд╛рдПрдВ
рдлрд╛рдЗрд▓реЛрдВ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЫрд┐рдкрд╛рдирд╛
рджреВрд░рд╕реНрде рдХрдиреЗрдХреНрд╢рди рдЫрд┐рдкрд╛рдПрдБ
рдЫрд┐рдкрд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛
рдЫрд┐рдкрдиреЗ рдХреЗ рд▓реЛрдЧрд┐рди
PCAP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдиреАрдп рдЯреНрд░реИрдлрд╝рд┐рдХ рд╕реВрдБрдШрдиреЗ рд╕реЗ рдЫрд┐рдкрд╛рдПрдБ
рдкреВрд░реНрдг рдЧреЛрд▓реЗ рдХреЗ рд╕рд╛рде 2 рдкреАрда (PTY рдХреЗ рд╕рд╛рде):
- рдХреНрд░рд┐рдкреНрдЯрдХреВрдЯ рд╕реНрд╡реАрдХрд╛рд░ () - рдкрд┐рдЫрд▓реЗ рджрд░рд╡рд╛рдЬреЗ
- рд╕рд╛рдорд╛рдиреНрдп рд╕реНрд╡реАрдХрд╛рд░ () - рдкрд┐рдЫрд▓реЗ рджрд░рд╡рд╛рдЬреЗ
рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рддрд╣рдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП PAM рдмреИрдХрдбреЛрд░
рдкреАрдЯреАрд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рд╕рдлрд╛рдИ utmp / wtmp рд▓реЙрдЧ
Xor рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрдиред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, rootkit
LD_PRELOAD
рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рднреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдорд╛рдирдХ рдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рддреБрд░рдВрдд рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╕реНрддреБрдд рдХрд░реВрдВрдЧрд╛, рдЬреЛ
execve
рдлрд╝рдВрдХреНрд╢рди (рдпрд╛ рдпреЛрдВ рдХрд╣реЗрдВ,
sys_execve ) рдХреЛ
envp
рдХрд░рддрд╛ рд╣реИ, рдЙрдирдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ (рдЬрд┐рд╕реЗ
envp
рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреА рд╕реВрдЪреА рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН рд╡рд╣реА
LD_PRELOAD
ред
рддреЛ, рд╕рдорд╛рдзрд╛рди рдХреЛ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлрдВрдХреНрд╢рди рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рдкрд╣рд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рддрд░реАрдХреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ:
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ sys_execve рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
DECLARE_KHOOK(sys_execve); long khook_sys_execve( const char __user * file, const char __user * const __user * argv, const char __user * const __user * envp ) { long result; KHOOK_USAGE_INC(sys_execve); scan_env_for((void *)file, (void *)envp, env_token); result = KHOOK_ORIGIN(sys_execve, file, argv, envp); KHOOK_USAGE_DEC(sys_execve); return result; }
рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рдлрдВрдХреНрд╢рди
sys_execve
рдореВрд▓ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рддреБрд░рдВрдд рдкрд╣рд▓реЗ, рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреЛрдЬ рджреА рдЧрдИ рд╣реИ
env_token
string рдХреЛред рд╕рд░рд▓
scan_env_for рдлрд╝рдВрдХреНрд╢рди
рдпрд╣ рдХрд░рддрд╛ рд╣реИ :
void scan_env_for(char * file, char * envp[], const char * token) { int i; char * string; char * string_ptr; if (!envp || !token) return; string = kmalloc(MAX_ARG_STRLEN + 1, GFP_KERNEL); if (!string) { debug("Can't get memory for the environ string\n"); return; } for (i = 0; i < MAX_ARG_STRINGS; i++) { if (get_user(string_ptr, envp + i)) { debug("Can't get user pointer value\n"); goto out_kfree; } if (string_ptr == NULL) goto out_kfree; if (strncpy_from_user(string, string_ptr, MAX_ARG_STRLEN) == -EFAULT) { debug("Can't get user string\n"); goto out_kfree; } string[MAX_ARG_STRLEN] = 0; if (strncmp(string, token, strlen(token)) == 0) { char * filename; filename = kmalloc(PATH_MAX + 1, GFP_KERNEL); if (filename) { strncpy_from_user(filename, file, PATH_MAX + 1); filename[PATH_MAX] = 0; } debug("Attention, task \"%s\" trying to execute \"%s\" with \"%s\"\n", \ current->comm, filename ? filename : "(unknown)", string); kfree(filename); goto out_kfree; } } out_kfree: kfree(string); }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рдпрд╣ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рд╕рднреА рд╕рдВрднрд╡ рд╕реНрдЯреНрд░рд┐рдВрдЧ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдХреИрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдХреИрди рдХреЗ рдЕрдВрдд рдореЗрдВ, рдореЗрдореЛрд░реА рдХреЛ рддрджрдиреБрд╕рд╛рд░ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд░реЗрдЦрд╛ рдХрд░реНрдиреЗрд▓ рд▓реЙрдЧ рдореЗрдВ рдкрд╛рдИ рдЧрдИ рдереА, рддреЛ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдЧреАред
рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рдмрд╛рдж, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$ sudo insmod envscan.ko env_token=\"LD_PRELOAD=\" $ dmesg | grep envscan [37713.809903] [envscan] Symbol "module_free" found @ ffffffff810bdcd0 [37713.810190] [envscan] Symbol "module_alloc" found @ ffffffff810407e0 [37713.810523] [envscan] Symbol "sort_extable" found @ ffffffff81048a90 [37713.810524] [envscan] Hunting for "LD_PRELOAD=" [37713.811798] [envscan] Symbol "sys_execve" found @ ffffffff8119ba30 $ LD_PRELOAD=/lib/ld-linux.so.2 ls [37743.786499] [envscan] Attention, task "bash" trying to execute "/bin/ls" with "LD_PRELOAD=/lib/ld-linux.so.2"
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреИрд░рд╛рдиреЙрдпрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ
рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ
LD_PRELOAD
рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рд╕реЗ рдЬреБрдбрд╝реА рдкрд░реЗрд╢рд╛рдирд┐рдпреЛрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрдо рдЖрддрдВрдХрдкреВрд░реНрдг рд╣реИрдВ, рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреА рд╣реИ, рдЕрд░реНрдерд╛рддреН рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░реЛрдХрдирд╛ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ред
рдореЙрдбреНрдпреВрд▓ рдХреЛрдб
рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред