以針對Yahoo! 的安全測試爲例講解如何高效的進行子域名收集與篩選

發布日期:2017-07-21首頁 > 安全資(zī)訊

20141015110631788.jpg


    0×01. 前言

    在誰動了我(wǒ)的主機? 之活用History命令|Linux安全運維一(yī)文中(zhōng),作者已經演示了如何将history 命令記錄發往本地Rsyslog,本文會介紹将Linux history 記錄發往遠程Rsyslog 服務器的2種方法。

    0×01. 方法1,修改bash源碼,使其支持将history曆史記錄發往遠程Rsyslog 服務器

    從bash4.1 版本開(kāi)始,bash開(kāi)始支持Rsyslog,所以我(wǒ)們需要下(xià)載bash4.1以後版本,這裏以bash4.4爲例

    bash源碼下(xià)載地址: https://ftp.gnu.org/gnu/bash/

    共計需要修改兩處源碼:

    1) 先修改bashhist.c

    從源碼文件名字也可以看出這個源碼文件和linux history記錄處理有關

    748 #if defined (SYSLOG_HISTORY)

    749 #define SYSLOG_MAXLEN 600

    750

    751 extern char *shell_name;

    752

    753 #ifndef OPENLOG_OPTS

    754 #define OPENLOG_OPTS 0

    755 #endif

    756

    757 void

    758 bash_syslog_history (line)

    759 const char *line;

    760 {

    761 char trunc[SYSLOG_MAXLEN];

    762 static int first = 1;

    763

    764 if (first)

    765 {

    766 openlog (shell_name, OPENLOG_OPTS, SYSLOG_FACILITY);

    767 first = 0;

    768 }

    769

    770 if (strlen(line) 771 syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY: PID=%d UID=%d User=%s CMD=%s", getpid(), current_user.uid, current_user.user_name, line);

    772 else

    773 {

    774 strncpy (trunc, line, SYSLOG_MAXLEN);

    775 trunc[SYSLOG_MAXLEN - 1] = '\0';

    776 syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY (TRUNCATED): PID=%d UID=%d User=%s CMD=%s", getpid(), current_user.uid, current_user.user_name, trunc);

    777 }

    778 }

    779 #endif

    需要修改771行和776行,修改内容,如上所示

    其中(zhōng)PID表示當前執行linux命令的bash進程ID,使用函數getpid()獲取;UID表示執行命令用戶的ID,用current_user.uid 表示;User表示執行命令的用戶名,用 current_user.user_name表示;CMD表示執行的曆史命令内容。

    2)再修改config-top.h

    116 #define SYSLOG_HISTORY

    117 #if defined (SYSLOG_HISTORY)

    118 # define SYSLOG_FACILITY LOG_USER

    119 # define SYSLOG_LEVEL LOG_INFO

    120 # define OPENLOG_OPTS LOG_PID

    121 #endif

    122

    将116行注釋去(qù)掉(2個#去(qù)掉一(yī)個就好),去(qù)掉之後,如上所示

    這裏定義syslog的FACILITY爲 user (用戶級别的日志(zhì))

    日志(zhì)級别爲info

    3)編譯

    ./configure --prefix=/usr/local/bash && make && make install

    4) 修改/etc/passwd 修改用戶的登錄shell (當然也可以直接替換原先的bash)

    root:x:0:0:root:/root:/usr/local/bash/bin/bash

    f3:x:1004:1004::/home/f3:/usr/local/bash/bin/bash

    5)修改/etc/rsyslog.conf

    user.info @@10.1.100.1

    将FACILITY 爲user 且日志(zhì)級别爲info的信息發往 遠程rsyslog 服務器 10.1.100.1

    最後重啓rsyslog

    6) 收日志(zhì)

    這裏遠程rsyslog 日志(zhì)選擇windows平台的visualsyslog,下(xià)載地址爲:https://github.com/MaxBelkov/visualsyslog/, 以下(xià)是收到的日志(zhì)截圖:
    \

    0×01. 方法2,不修改bash源碼,利用trap和logger命令将執行命令記錄發往遠程Rsyslog 服務器

    1) vim /etc/profile

    添加以下(xià)内容

    function log2syslog

    {

    declare command

    command=$BASH_COMMAND

    logger -p local1.notice -t bash-$$ -i -n 10.1.100.1 -- $SSH_CONNECTION---$USER---$PWD---$command

    }

    trap log2syslog DEBUG

    解釋一(yī)下(xià):

    我(wǒ)們知(zhī)道用戶登錄之後shell 都會執行/etc/profile中(zhōng)的内容

    在shell中(zhōng)每執行一(yī)次命令都是一(yī)個activity,trap log2syslog DEBUG 意爲對shell中(zhōng)的每一(yī)個activity都執行一(yī)遍log2syslog 函數

    logger 是一(yī)個向syslog發送日志(zhì)的接口

    $BASH_COMMAND 表示 最新執行的shell命令

    $$ 表示當前shell的進程id

    $SSH_CONNECTION 當前ssh連接的tcp socket 五元組信息

    $USER 表示當前執行命令的用戶

    $PWD 表示執行命令時所在目錄

    這些信息之間用— 隔開(kāi)

    -p 表示syslog的Facility

    -t 表示tag

    -n 表示遠程syslog 地址

    2) vim /etc/rsyslog.conf

    增加:

    local1.* @@10.1.100.1

    修改配置後,重啓rsyslog

    3)截圖
    \

    4) 該方法的不足

    因爲每記錄一(yī)條命令日志(zhì)到遠程syslog服務器都會産生(shēng)一(yī)個新的進程,如果命令activity 量很大(dà),則相比修改bash源碼方式而言比較消耗性能

    如3)中(zhōng)截圖所示,Tag中(zhōng)每一(yī)個bash後面中(zhōng)括号都表示一(yī)個新的進程id, 你可自行對比修改bash源碼方式就沒有此類問題