Open2

chkrootkit の誤検知

Ryosuke HosoiRyosuke Hosoi

Linux.Xor.DDoSの誤検知

hourlyで動かしてるchkrootkitから不穏なメールが・・・

/etc/cron.hourly/chkrootkit:
Searching for Linux.Xor.DDoS ... INFECTED: Possible Malicious Linux.Xor.DDoS installed

いや、これは誤検知でしょう!?

root@pi4:/tmp# ls -lt
total 16
drwx------ 2 ryo  ryo  4096 Dec 13 19:48 tmp.rD8pVvNrRw
drwx------ 3 root root 4096 Nov 26 18:07 systemd-private-55087da03c6d4dce9df911dab8feeeda-systemd-timesyncd.service-m3XV
mG
drwx------ 3 root root 4096 Nov  7 06:03 systemd-private-55087da03c6d4dce9df911dab8feeeda-redis-server.service-cQ3MtP
drwx------ 2 root root 4096 Oct 26 09:23 pulse-PKdhtXMmr18n
root@pi4:/tmp# cd tmp.rD8pVvNrRw/
root@pi4:/tmp/tmp.rD8pVvNrRw# ls
rustup-init
root@pi4:/tmp/tmp.rD8pVvNrRw# ls -l
total 13076
-rwxr--r-- 1 ryo ryo 13388740 Dec 13 19:48 rustup-init

rustup-init って実行可能ファイル、これがひっかかってるね

rustのインストールを公式通りにしようとしたけど、ラズパイ4のリポジトリにrustcとcargoがあったので、インストールを途中でやめてそっちを使うことにしたのです

root@pi4:/tmp/tmp.rD8pVvNrRw# rm rustup-init
root@pi4:/tmp/tmp.rD8pVvNrRw# cd ..
root@pi4:/tmp# rmdir tmp.rD8pVvNrRw

これで良いはず・・・

root@pi4:/tmp# /usr/bin/nice /root/chkrootkit-0.55/chkrootkit | /bin/grep INFECTED
root@pi4:/tmp# 

オッケーでした!

Ryosuke HosoiRyosuke Hosoi

bindshellの誤検知

またある日、

Checking `bindshell'... INFECTED PORTS: ( 465)

という検知が・・・

とりあえず確認すると

root@rtiny:~/chkrootkit-0.55# ./chkrootkit.org | grep INFE
Checking `bindshell'... INFECTED PORTS: ( 465)

何が465みてるんだろ?ということで確認するも

root@rtiny:~/chkrootkit-0.55# netstat -pan | grep ":465 "
root@rtiny:~/chkrootkit-0.55# 

無いし・・・謎すぎる・・・

ググるとpostfixで誤検知してるパターンがあるというが、postifxで456をlinstenしてないし、謎・・・

ざっくりソースを確認すると

bindshell () {
PORT="114|145|465|511|600|1008|1524|1999|1978|2881|3049|3133|3879|4000|4369|5190|5665|6667|10008|12321|23132|27374|29364|30999|31336|31337|37998|45454|47017|47889|60001|7222"
   OPT="-an"
   _chk_netstat_or_ss;
   [ "$netstat" = "ss" ] && OPT="-a"
   PI=""
   if [ "${ROOTDIR}" != "/" ]; then
     echo "not tested"
     return ${NOT_TESTED}
   fi

   if [ "${EXPERT}" = "t" ]; then
       expertmode_output "${netstat} ${OPT}"
       return 5
   fi
   for P in `echo $PORT | ${sed} 's/|/ /g'`; do
      if ${netstat} "${OPT}" | ${egrep} "^tcp.*LIST|^udp" | ${egrep} \
"[.:]${P}[^0-9.:]" >/dev/null 2>&1
      then
         PI="${PI} ${P}"
      fi
   done
   if [ "${PI}" != "" ]
   then
      echo "INFECTED PORTS: ($PI)"
   else
      if [ "${QUIET}" != "t" ]; then echo "not infected"; fi
   fi
}

どうやらnetstatじゃなくてssってのが使われてるみたいな・・・

root@rtiny:~# ss -a | grep [.:]465[^0-9.:]
udp               ESTAB                  0                   0                                                         [xxxx:xxx:xxxx:xxxx:xxxx:465e:xxxx:xxxx]:33495                              [xxxx:xxxx:xxxx:xxx::xxxx]:443               
...

IPv6アドレスの一部が :465e: ってなってて、ここに引っかかってしまってる、なんという誤検知!

正規表現修正するほうが良い気がしたけど、とりあえず

#
# NETSTAT OR SS
#
_chk_netstat_or_ss() 
{
    netstat="netstat"
    #CMD=`loc ss ss $pth`
    #[ ${?} -eq 0 ] && netstat="ss"  
}

ssをやめてnetstatを使ってIPv4しかチェックしない方向で対応しました