當前位置:
首頁 > 新聞 > 滲透測試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 表示的登錄的偽終端 ,後面一串是填充的數據


第4個欄位 ts/0表示的偽終端的後綴


第5個欄位root 表示登錄用戶名,後面一串是填充數據,因為這個欄位為32個位元組大小


第6個欄位10.1.100.1 表示的是登錄主機,後面一串是填充數據,因為這個欄位為256個位元組大小


第10個欄位表示的是登錄時間,精確到秒


第11個欄位表示的是登錄時間中微妙部分


第12個欄位表示的是登錄sessionid


lastlog 文件格式:

   #define UT_LINESIZE     32
   #define UT_HOSTSIZE     256
   struct lastlog
     {
       __time_t ll_time;
       char ll_line[UT_LINESIZE];
       char ll_host[UT_HOSTSIZE];
     };

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



第1個欄位表示最後一次登錄時間


第2個欄位表示最後一次登錄的終端


第3個欄位表示最後一次登錄的IP


0x02. 擦除,偽造登錄日誌的測試


1.刪除utmp記錄,將自己從w或者who輸出中隱藏


比如此時有兩個登錄記錄,一個是root(要刪除的記錄),一個是f3


刪除前:


刪除後:





  1. 添加utmp記錄,偽造登錄信息


添加前:



添加後:



註:

添加Fake 在線記錄的時候,pid必須可以找到相應進程,一般可以使用sshd的或者是bash的相關PID



2.刪除歷史登錄記錄(wtmp)


刪除前:



刪除指定用戶,指定host的歷史登錄記錄



刪除後:



3.添加wtmp記錄


4.刪除btmp記錄


刪除前



hacker 這個賬戶有很多次嘗試登錄記錄


刪除後:



5.添加btmp 偽造記錄



6.刪除lastlog 記錄


hacker 用戶最後一次登錄記錄,刪除前:


刪除後:




7.添加偽造的lastlog記錄


python fake_login_log.py —mode add —type=lastlog —user=hacker —date=」2017-7-24 14:22:07



這裡說明一下

:lastlog中並不記錄用戶名,而是根據文件偏移位置來計算當前記錄的用戶名是多少,比如當前用戶是f3,其UID為1001,那麼lastlog 日誌從頭開始向後移動 1001 × LAST_STRUCT_SIZE處的位置則為f3用戶最後一次登錄記錄寫入處(用戶即使沒有最後一次登錄記錄,在相應的偏移處都會有記錄,這就是我們使用lastlog看到的never login的記錄)


0x03. 源碼

直接帖源碼,格式上可能會影響閱讀體驗,帖下我的在線源碼地址吧:點擊打開在線源碼


0x04. 總結


目前此工具可以實現對:

/var/run/utmp

/var/log/wtmp

/var/log/btmp

/var/log/lastlog

進行刪除,添加偽造記錄功能,並且在修改相關文件後恢復其時間屬性值(比如文件訪問時間和文件修改時間),有人會說了,直接echo 「」 >/var/log/xtmp 不就行了嗎,幹嘛這麼麻煩,直接刪除是很好,不過有點粗暴。 本工具不僅可以實現按照 登錄主機,登錄用戶, 時間戳等條件進行按需刪除,還可以添加偽造登錄記錄,以達到迷惑系統管理員之目的。需要補充一點的是,目前還未實現根據時間區間來刪除指定記錄,也希望有興趣的同學補充一下


參考:

1)https://linux.die.net/man/5/utmp
2)https://github.com/krig/lastlog/blob/master/lastlog.c

*本文作者:knpewg85942,轉載請註明FreeBuf.COM

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

新手科普:淺談家用路由器安全變遷
挖洞經驗 | 看我如何通過子域名接管繞過Uber單點登錄認證機制
Android安全幾道入門題目
深度報道:烏克蘭如何會淪為俄羅斯的網路戰試驗場

TAG:FreeBuf |

您可能感興趣

波音與SpaceX被「審查」,NASA刪除8月份商業載人航天測試計劃
Nat Biotechnol:CRISPR-Cas9所引起的雙鏈斷裂修復可造成大範圍的刪除和重排
Windows 10 下安全刪除 Linux 系統
watchOS 6將可刪除系統預裝App
Instagram正在測試公共賬號刪除關注者功能
Apple將為中國市場,推出刪除Face ID功能的iPhone?
上古捲軸在線刪除強制訂閱 Battlefield 下周公開測試所有平台
CoinMarketCap悄悄地從BTC頁面中刪除Bitcoin.com
Windows Defender Antivirus將從3月份開始刪除顯示強制性信息的軟體
Unity發布WebGL時如何修改/刪除默認的Logo和載入進度條
直擊 Supreme 2018 春夏系列紐約發售現場,Kanye 再次刪除 Instagram 帳號 | HB Daily
iPhone XR 升級 iOS 13 之後刪除 App 的兩種方法
谷歌Pixel3a和3aXL已從安卓Q Beta更新中刪除
Oculus要求刪除Quest《虛擬桌面》SteamVR串流
iOS 13 Beta 2 新特性,刪除含有訂閱服務的 APP 時會彈出提醒
Kanye West 再一次無預警刪除 Instagram 帳號
谷歌將華為Mate20Pro從安卓Q測試計劃中刪除,無緣升級
Elon Musk 並沒有真的刪除 SpaceX 和 Tesla 粉絲專頁?
AirPower被徹底取消?蘋果刪除AirPower文字介紹及照片
微軟從Chromium Edge瀏覽器中將IE內核模式刪除