滲透測試TIPS之刪除、偽造Linux系統登入日誌
阿新 • • 發佈:2022-04-29
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 表示的登入的偽終端 ,後面一串