xor和gates的专杀脚本

前段时间的一次样本,需要给出专杀,应急中遇到的是linux中比较常见的两个家族gates和xor。

首先是xor的专杀脚本,xor样本查杀的时候需要注意的是样本的主进程和子进程相互保护(详见之前的xor ddos分析http://www.cnblogs.com/goabout2/p/4888651.html),想要杀掉的话,需要先通过kill –stop挂起主进程,再删除其他的文件,但是由于xor的进程名是随机值,同时主机上还有有gates木马(gates最显著的特征就是会替换系统文件ps,lsof,ss,netstat),因此为了避嫌,脚本必须隔离系统命令。

此处通过的是遍历/proc/pid/maps文件获取所有进程对应的程序路径,通过该路径与特征值匹配出的路径对比,从而确定主进程的pid。

import os
import re
import sys
import time

# property of the virus
sigin = "m4S4nAC/nA"
filepath = "/boot/dingzhi_random_10_word1;/lib/udev/udev"
delpath = "/etc/cron.hourly/cron.sh;/etc/init.d/fromdingzhi_"

#read file
def readfile(path):
    file = open(path)
    try:
        content = file.read()
    finally:
        file.close()
    return content

#scan the filesystem in the os with specify eigenvalue
def scanforeigen(path,word):
    for filename in os.listdir(path):
        fp = os.path.join(path,filename)
        if os.path.isfile(fp):
            print fp
            with open(fp) as f:
                for line in f:
                    if word in line:
                        print "find in the file:" + fp
                        return fp
                        break
        elif os.path.isdir(fp):
            scanforeigen(fp,word)

#check the specify dir thrugh property return the path in a lis
def check():
    targetlist = []
    bootfile = scanforeigen("/boot",sigin)
    if bootfile is not None and bootfile != ‘‘:
        bootfilename = bootfile.split("/")[-1]
        if len(bootfilename) == 10 and re.match(‘^[a-z]+$‘,bootfilename):
            targetlist.append(bootfile)
    libfile = scanforeigen("/lib/udev",sigin)
    if libfile is not None and libfile != ‘‘:
        libfilename = libfile.split("/")[-1]
        if libfilename == "udev":
            targetlist.append(libfile)
    return targetlist

def kill():
    itemlist = []
    targetlist = check()
    print targetlist
    boot = targetlist[0]
    print "boot is " + boot
    bootname = boot.split(‘/‘)[-1]
    for itemnum in os.listdir("/proc"):                   #throught the filename to find the pid and return
        if itemnum.isdigit():
            print "the dir is " + itemnum
            path = "/proc/" + itemnum + "/maps"
            print path
            mapscontent = readfile(path)
            if bootname in mapscontent:
                print "the pid of the " + bootname + " is " + itemnum
                itemlist.append(itemnum)
    print itemlist

#stop the father process
    for item in itemlist:
        print "item is " + item
        cmd = "kill -STOP " + item
        os.popen(cmd)
        time.sleep(5)
        print "going sleeping"

#delete the file
    for target in targetlist:
        print "del the" + target
        cmd = "rm " + target
        os.popen(cmd)

    dellist = delpath.split(‘;‘)
    for delfile in dellist:
        print "the delfile" + delfile
        if delfile.split(‘/‘)[-1] == "fromdingzhi_":
            delfile = delfile.replace("fromdingzhi_",bootname)

        print "del the " + delfile
        cmd = "rm " + delfile
        os.popen(cmd)

#kill the process
    cmd = "kill -9 " + item
    print cmd
    os.popen(cmd)

if __name__ == ‘__main__‘:
#list = check()
    if sys.argv[1] == "-check":
        list = check()
    elif sys.argv[1] == ‘-kill‘:
        kill()

对于gates木马需要注意的是,样本运行第一次的时候的文件不会删除,通过二进制分析的时候是获取不到该样本的路径的,索性该处的路径保存在/etc/init.d/DbSecuritySpt的启动文件中。

import os
import sys
import time

#linux.tragon.bill.gates

sigin = "88FD2FE8EF8D51263B037677FD30F25CBFEB57F759F711FB41956288A85E9655F"
initpaht = "/etc/init.d/selinux;/etc/init.d/DbSecuritySpt"
filedir = "/usr/bin;/usr/sbin;/bin;/usr/bin/bsd-port;/usr/bin/dpkgd"
filepath = "/usr/bin/.sshd;/usr/bin/bsd-port/getty"
delpath = "/usr/bin/ps;/usr/bin/ss;/usr/bin/lsof;/usr/bin/netsata;/usr/sbin/ps;/usr/sbin/ss;/usr/sbin/lsof;/usr/sbin/netsata;/bin/ps;/bin/ss;/bin/lsof;/bin/netsata;/etc/init.d/selinux;/etc/init.d/DbSecuritySpt;/tmp/moni.lod;/tmp/gates.lod;/usr/bin/bsd-port/getty.lock"
configfile = "/tmp/moni.lod;/tmp/gates.lod;/usr/bin/bsd-port/getty.lock"

findlist = []

#read file
def readfile(path):
    file = open(path)
    try:
        content = file.read()
    finally:
        file.close()
    return content

#scan the filesystem in the os with specify eigenvalue
def scanforeigen(path,word):
    for filename in os.listdir(path):
        fp = os.path.join(path,filename)
        if os.path.isfile(fp):
            print fp
            with open(fp) as f:
                for line in f:
                    if word in line:
                        print "find in the file:" + fp
                        findlist.append(fp)
                        return fp

        elif os.path.isdir(fp):
            scanforeigen(fp,word)

#check the specify dir thrugh property return the path in a lis
def check():
    targetlist = []
    dirlist = filedir.split(";")
    for dirpath in dirlist:
        checkfile = scanforeigen(dirpath,sigin)
        ‘‘‘
        print "the checkfile is :"
        print checkfile
        targetlist.append(checkfile)
        ‘‘‘
#start kill
def kill():
    piddic = {}
    check()
    print findlist
    #get pid
    if findlist is not None:
        conflist = configfile.split(";")
        for confpath in conflist:
            content = readfile(confpath)
            print "the path " + confpath + "content is " + content
            piddic[confpath] = content
        print piddic

    #get the filepath restart by DbSecuritySpt
    specialpath = readfile("/etc/init.d/DbSecuritySpt")
    specialpath = specialpath[12:]
    print "dd" + specialpath

    #stop the process in the pidlist
    for key in piddic:
        cmd = "kill -STOP " + piddic[key]
        os.popen(cmd)

    #start to delete the file
    delfile = delpath.split(";")
    for delfielpath in delfile:
        cmd = "rm " + delfielpath
        os.popen(cmd)

    cmd = "rm " + specialpath
    os.popen(cmd)

    cmd = "cp /usr/bin/dpkgd/ps /bin"
    os.popen(cmd)
    cmd = "cp /usr/bin/dpkgd/ss /bin"
    os.popen(cmd)
    cmd = "cp /usr/bin/dpkgd/lsof /bin"
    os.popen(cmd)
    cmd = "cp /usr/bin/dpkgd/netstat /bin"
    os.popen(cmd)

    for key in piddic:
        cmd = "kill -9 " + piddic[key]
        os.popen(cmd)

if __name__ == ‘__main__‘:
#list = check()
    if sys.argv[1] == "-check":
        list = check()
    elif sys.argv[1] == ‘-kill‘:
        kill()
时间: 2024-09-30 05:08:12

xor和gates的专杀脚本的相关文章

DedeCMS顽固木马后门专杀工具V2.0实现方式研究

catalog 1. 安装及使用方式 2. 检查DEDECMS是否为最新版本 3. 检查默认安装(install)目录是否存在 4. 检查默认后台目录(dede)是否存在 5. 检查DedeCMS会员中心是否关闭 6. 检查是否存在高风险的若密码账户 7. 后台友情链接xss漏洞 8. /plus/search.php SQL注入漏洞 9. /plus/feedback.php SQL注入漏洞 10. /plus/feedback_ajax.php SQL注入或XSS漏洞漏洞 11. /incl

病毒木马查杀实战第017篇:U盘病毒之专杀工具的编写

       本系列教程版权归"i春秋"所有,转载请标明出处. 本文配套视频教程,请访问"i春秋"(www.ichunqiu.com). 前言 经过前几次的讨论,我们对于这次的U盘病毒已经有了一定的了解,那么这次我们就依据病毒的行为特征,来编写针对于这次U盘病毒的专杀工具. 专杀工具功能说明 因为这次是一个U盘病毒,所以我打算把这次的专杀工具换一种形式实现.不再像前几次那样需要被动运行,而是当我们的专杀工具执行后,一旦有U盘插入,就能主动检测U盘内容,如果发现病毒,

病毒木马查杀第011篇:QQ盗号木马之专杀工具的编写

一.前言 由于我已经在<病毒木马查杀第004篇:熊猫烧香之专杀工具的编写>中编写了一个比较通用的专杀工具的框架,而这个框架对于本病毒来说,经过简单修改也是基本适用的,所以本文就不讨论那些重叠的知识,只针对这个病毒特有的方面来讨论专杀工具的编写,然后将其进行组合,就是完整的针对于本病毒的专杀工具了. 二.原理讨论 对于本病毒而言,其最大的特色就在于使用了进程守护技术.病毒运行后,同时有三个病毒进程存在,关闭其中的任何一个,由于还有两个病毒进程的存在,那么被关闭的又会被重新开启.要解决这个问题,不

病毒木马查杀第004篇:熊猫烧香之专杀工具的编写

一.前言 如果是非感染型的病毒,完成行为分析之后,就可以开始编写专杀工具了.当然对于我们这次研究的对象--"熊猫烧香"来说,其实通过之前的行为分析,我们并没有得出它的所有恶意行为,毕竟还没有对其进行逆向分析.所以这里仅针对我们上一篇文章所得出的结果,来进行专杀工具的编写.一般来说,专杀工具既可以用批处理实现,又可以用编程语言编写,但是现实中更多的还是用后者进行制作的,因为其更加严谨.灵活.因此我这里会使用C++来写一个简单的"熊猫烧香"专杀程序. 二.病毒行为回顾与

[转帖] securebootthemes 挖矿病毒的说明 http://blog.netlab.360.com/msraminer-qian-fu-yi-jiu-de-wa-kuang-jiang-shi-wang-luo/ 原文为毛不给一个专杀工具呢.

MsraMiner: 潜伏已久的挖矿僵尸网络 2017 年 11 月底,我们的 DNSMon 系统监测到几个疑似 DGA 产生的恶意域名活动有异常.经过我们深入分析,确认这背后是一个从 2017 年 5 月份运行至今的大型挖矿僵尸网络(Mining Botnet).此僵尸网络最新的核心样本压缩包文件名为 MsraReportDataCache32.tlb ,我们将其命名为MsraMiner Botnet. 该僵尸网络的特征包括: 运行时间:2017 年 5 月份运行至今 传播方式: 利用 NSA

数列[专杀Splay版]

时间限制: 3 Sec  内存限制: 128 MB提交: 49  解决: 7 题目描述 输入一个数列,你需要进行如下操作: 1. 把编号为I的数值改为K 2. 输出从小到大排序后第k个数 输入 输入文件第一行包含两个整数N.M,分别表示数列长度与操作个数. 第二行有N个整数,为初始数列中的N个整数. 接下来M行每行如果只有一个整数k,那么就是输出第k小数,否则两个整数I,K表示把第I个数的数值改为K. 输出 输出所有要求输出的数,每个数单独一行. 样例输入 5 3 5 3 2 1 1 4 2 6

BAT 批处理脚本教程

第一章 批处理基础第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命令统称批处理命令.小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程.了解了大概意思后,我们正式开始学习.先看一个简单的例子!@echo offecho "欢迎来到非常BAT!"pause把上面的3条命令保存为文件test.bat或者test.cmd然后执行,他就会在屏幕上显示以下二行话:欢迎来到

BAT&amp;nbsp;批处理脚本教程(如果可以用电脑让事情变的更简单,何不让它变得更简单呢!)

第一章 批处理基础 第一节 常用批处理内部命令简介批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命令统称批处理命令. 小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程. 了解了大概意思后,我们正式开始学习.先看一个简单的例子! @echo off echo "欢迎来到非常BAT!" pause 把上面的3条命令保存为文件test.bat或者test.cmd然后执行, 他就会在屏幕上显示以下二

【转】BAT 批处理脚本 教程

第一章 批处理基础第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命令统称批处理命令.小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程.了解了大概意思后,我们正式开始学习.先看一个简单的例子!@echo offecho "欢迎来到非常BAT!"pause把上面的3条命令保存为文件test.bat或者test.cmd然后执行,他就会在屏幕上显示以下二行话:欢迎来到