1. 程式人生 > 其它 >滲透測試TIPS之刪除、偽造Linux系統登入日誌

滲透測試TIPS之刪除、偽造Linux系統登入日誌

0x00. 引言

擦除日誌在滲透測試中是非常重要的一個階段,這樣可以更好地隱藏入侵痕跡,做到不被系統管理人員察覺,實現長期潛伏的目的。 前段時間NSA洩露的滲透測試工具中就有一款wtmp日誌的擦除,非常好用,這引起了我的興趣,於是研究了一下linux 登入相關二進位制日誌的檔案格式,用python寫了一個日誌擦除,偽造的工具(末尾附原始碼)

0x01. Linux中與登入有關的日誌及其格式分析

Linux中涉及到登入的二進位制日誌檔案有

    /var/run/utmp

    /var/log/wtmp

    /var/log/btmp

    /var/log/lastlog

其中 utmp 對應w 和 who命令; wtmp 對應last命令;btmp對應lastb命令;lastlog 對應lastlog命令

經查Linux man 手冊,

/var/run/utmp
/var/log/wtmp
/var/log/btmp

的二進位制格式都是一樣的, 我們姑且稱之為xtmp 格式

而/var/log/lastlog 檔案的格式與之不同,需單獨分析,下面我們先分析xtmp的檔案格式吧,這裡以utmp 格式為例

UTMP 檔案格式

utmp 檔案格式是這樣的:

    #define UT_LINESIZE     32

    #define UT_NAMESIZE     32

    #define UT_HOSTSIZE     256

        struct utmp {

            short   ut_type;              /* Type of record */

            pid_t   ut_pid;               /* PID of login process */

            char    ut_line[UT_LINESIZE]; /* Device name of tty - "/dev/" */

            char    ut_id[4];             /* Terminal name suffix,

                                             or inittab(5) ID */

            char    ut_user[UT_NAMESIZE]; /* Username */

            char    ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or

                                             kernel version for run-level

                                             messages */

            struct  exit_status ut_exit;  /* Exit status of a process

                                             marked as DEAD_PROCESS; not

                                             used by Linux init(8) */

            /* The ut_session and ut_tv fields must be the same size when

               compiled 32- and 64-bit.  This allows data files and shared

               memory to be shared between 32- and 64-bit applications. */

        #if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32

            int32_t ut_session;           /* Session ID (getsid(2)),

                                             used for windowing */

            struct {

                int32_t tv_sec;           /* Seconds */

                int32_t tv_usec;          /* Microseconds */

            } ut_tv;                      /* Time entry was made */

        #else

             long   ut_session;           /* Session ID */

             struct timeval ut_tv;        /* Time entry was made */

        #endif

           int32_t ut_addr_v6[4];        /* Internet address of remote

                                             host; IPv4 address uses

                                             just ut_addr_v6[0] */

            char __unused[20];            /* Reserved for future use */

        };

    其中 exit_status 結構為:

    struct exit_status {              /* Type for ut_exit, below */

        short int e_termination;      /* Process termination status */

        short int e_exit;             /* Process exit status */

    };

其中 ut_type 為日誌記錄的型別,主要有以下幾種日誌

    #define EMPTY         0 /* Record does not contain valid info

                               (formerly known as UT_UNKNOWN on Linux) */

    #define RUN_LVL       1 /* Change in system run-level (see

                               init(8)) */

    #define BOOT_TIME     2 /* Time of system boot (in ut_tv) */

    #define NEW_TIME      3 /* Time after system clock change

                               (in ut_tv) */

    #define OLD_TIME      4 /* Time before system clock change

                               (in ut_tv) */

    #define INIT_PROCESS  5 /* Process spawned by init(8) */

    #define LOGIN_PROCESS 6 /* Session leader process for user login */

    #define USER_PROCESS  7 /* Normal process */

    #define DEAD_PROCESS  8 /* Terminated process */

    #define ACCOUNTING    9 /* Not implemented */

    #define UT_LINESIZE      32

    #define UT_NAMESIZE      32

    #define UT_HOSTSIZE     256

utmp 記錄例子(二進位制內容解析處理後):

對比utmp的檔案格式結構,挑幾個重要的欄位解釋下

第1個欄位7 表示這條記錄型別,一般的使用者正常登入記錄型別都是7,錯誤登入是6 ,也就是btmp所記錄的型別

第2個欄位1497 是pid ,截圖中我是用ssh遠端登入linux,這裡指的就是sshd的子程序bash的pid

第3個欄位pts/0 表示的登入的偽終端 ,後面一串