一种植物,这孙子还把爷爷在跑的项目删了。
本博客始于某日,很突然啊,服务器就登不上了,在跑的程序也被kill了,每个用户密码都不对,还多了一个叫代号孙子的账号。因此做了一些尝试。
更改密码
参考链接https://blog.youkuaiyun.com/weixin_42293131/article/details/119042260
因为情况与本博客一致,均存在dis_ucode_ldr,有的博客建议删掉,本博客是挪在了前面。
要记得把用户密码和管理员密码都改了。
查看登录日志
试图通过查看日志判断作案时间与方法。另外存在一个问题,/var/log/secure在ubuntu16中似乎没有,有些教程不能使用
- 查看当前用户
who
who命令查看当前在登录的用户,如果孙子还在登录的话,那就真的很嚣张了。 - 查看登录历史
last -f /var/log/wtmp
效果如下:
蓝框遮住的是ip地址,右面是登录起止时间和登录时常,这些是非服务器用户ip登录的记录,可以看到,该孙子首先获得了用户xxxxx的密码【这位仁兄密码设置的123456】,借由此账号登录。等到夜半无人了,reboot机器改了密码。pts/0更是在我们发现机器登不上物理关机了才crash掉。 - 查看登录失败历史
那么xxxxxx君的账号名是怎么发现的呢,非常简单,我们观察登录失败历史
last -f /var/log/btmp
该记录还能往下看,能明显的看出攻击者使用了一个常用名字典来挨个儿试用户是否存在。另外如果想看最新的可以在命令后加上|more
或者|less
查看恶意账号信息
- 查看该恶意ip所在系统
直接ping 就可以了,观察返回的TTL值,linux=64,windows=128/32,返回值接近哪个大概率就是什么系统。本次返回值为32,推测是linux或者win7. - 查看最后一次登录时间
lastlog
恶意用户残留账号孙子的登录历史如下:
从未登录过,大概是假装正常用户。由于想试试看操作日志,故而先前没有删除此账号。
好家伙我查了一下好像还真有这么个组织叫gamerloly,不过看起来不是中国组织,网页上第一句话谷歌翻译检测出来的是罗马尼亚语。 - 查看用户密码
cat / etc / shadow
找到目标用户孙子,其后续字符串为:$6$s4/Scw1h$0B4ChVYFt7CQxk.2N8fUljhIhMW9qCHtD6GI46vUZygeT0fQ2qCd3ar82.2CHv4XCelRAddGbqss1bggMc7AG1:18855:0:99999:7:::
第一个冒号前的一堆乱码就是加密后的密码,比较麻烦的是没有找到加密方式,之后接着再试,这种组织留下的这种账号大概率都是这一个密码。 - 删除用户
十分有趣的是啊,这个用户居然之后还就在眼皮子底下登录了,由于无法判断其目的,kill其进程并将其删除。这个直接查就好了。 - 确定无其它用户
grep bash /etc/passwd
会显示已有用户。 - 密码解密尝试
该密码有用的为盐值与密文两部分,盐值为$6$s4/Scw1h,密文为0B4ChVYFt7CQxk.2N8fUljhIhMW9qCHtD6GI46vUZygeT0fQ2qCd3ar82.2CHv4XCelRAddGbqss1bggMc7AG1。下载了一个常用密码文档。由于盐值编号为6,加密方法为sha512,通过以下代码尝试暴力破解密码,代码参考自链接【2】:
#!/usr/bin/env python #指定这是一个python文件,使用这个解释器执行
#-*- coding:utf-8 -*- #设定编码格式,防止报错
import crypt #调用crypt这个库
from tqdm import tqdm
user_passfile = "/etc/shadow" #获取系统密码路径
zidian = "./Top304Thousand-probable-v2.txt" #获取字典路径
def readd(user_passfile,zidian):
salt="$6$s4/Scw1h"
passwd="0B4ChVYFt7CQxk.2N8fUljhIhMW9qCHtD6GI46vUZygeT0fQ2qCd3ar82.2CHv4XCelRAddGbqss1bggMc7AG1"
salt="$6$1MQGzkcs"
passwd="M0f0jMpsNgcpgkpXS0.AGw1dy3Dpu9ikbduwutkF0Ub52rE6VKote98oJdg.dK6C2W28pbtVOYBoFqLdad6nd."
mingwen = look_d(zidian)
for passwdmw in tqdm(mingwen): # 遍历系统中的每个完整密文
zz=crypt.crypt(passwdmw.rstrip(),salt)
if (salt+'$'+passwd) == zz: #如果我们猜想的密文与系统中的密文相同,输入它的用户名和密码
print(" passWord:%s" %(passwdmw.rstrip()))
else:
...
#print(" result:%s" % (zz))
#提取我们密码字典里的内容
def look_d(zidian):
f = open(zidian,'r') #读取字典文件内容
mwlist = f.readlines() #将读取的内容转换为列表
f.close() #关闭文件
return mwlist #返回这个列表
if __name__ == "__main__":
readd(user_passfile,zidian)
没成功.jpg
查看操作历史
- 本账号操作历史
history
可以看到本账号什么也没干,但是文件夹就是没了,查了一轮之后,怀疑是root干的。
另外命令cat /home/xxx/.bash_history |less
也可以看历史,xxx指用户名,不过root下面没有这个文件。
目前除了3个攻击的ip地址什么也查出来,后续学会了再更。
防范
- 安装fail2ban【3】,ban掉多次登录失败的 ip
1>安装
更新并安装,成功检测可输入sudo apt update sudo apt install fail2ban
会输出几行,并显示activesudo systemctl status fail2ban
2>配置
须在文件/etc/fail2ban/jail.local中配置,而刚安装完后此文件夹中是没有这个文件的,故而先行创建
打开.local文件,可对以下几点进行sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
(1)白名单地址 default
(2)一些封禁参数 defaultignoreip = 127.0.0.1/8
(3)封禁ip邮件提醒 actionbantime = 3600 # 屏蔽时长,可自行调整,单位为秒,-1则为永久屏蔽 findtime = 600 #监测时长,在findtime时间内出现maxretry次尝试即执行屏蔽动作,单位为秒 maxretry = 5 # 最大尝试次数
(4)sshdestemail = xxxx@163.com # 邮件通知的目的邮箱 mta = sendmail # 使用哪个发送邮件命令,可以选mail或sendmail action = %(action_mw)s # 默认只发送屏蔽IP信息,_mw后缀发送IP信息+whois信息
3>重启[ssh] enabled = true # 激活SSH监测 port = ssh # 端口 filter = sshd logpath = /var/log/auth.log # SSH日志路径 maxretry = 3 # 最大尝试次数
4>检查service fail2ban restart
可以通过以下命令查看监狱数目,与监狱中的ip
sudo fail2ban-client status
sudo fail2ban-client status sshd
过了两天再检查,果然被抓进去了嚯嚯嚯
参考
【1】https://blog.youkuaiyun.com/xuchen16/article/details/82860752?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0.control&spm=1001.2101.3001.4242
【2】https://blog.youkuaiyun.com/Key_book/article/details/80439243
【3】https://www.myfreax.com/install-configure-fail2ban-on-ubuntu-20-04/
【4】https://www.polarxiong.com/archives/ubuntu-fail2ban.html