滲透測試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
刪除前:
刪除後:
添加utmp記錄,偽造登錄信息
添加前:
添加後:
註:
添加Fake 在線記錄的時候,pid必須可以找到相應進程,一般可以使用sshd的或者是bash的相關PID2.刪除歷史登錄記錄(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
※新手科普:淺談家用路由器安全變遷
※挖洞經驗 | 看我如何通過子域名接管繞過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內核模式刪除