python 检测linux二进制命令有无病毒木马

 

服务器被入侵,检查二进制命令文件有无病毒,发现了个网站,网站有API,可以检测病毒,木马,

下面是网站示例:

VirusTotal

可以上传二进制命令文件进行检测 

图片[1]-python 检测linux二进制命令有无病毒木马-百分数

上传一个有问题的二进制文件查看分析结果

图片[2]-python 检测linux二进制命令有无病毒木马-百分数

 

病毒的种类都出现了,还是比较好使的,我用clamav没有扫描出来,所以用这个网站啦

图片[3]-python 检测linux二进制命令有无病毒木马-百分数

 

免费注册用户,有API文档

因为二进制比较多,所以写了个python,慢慢去扫描检测

import requests,logging,sys,os
from time import time,localtime,strftime,sleep
 
log_format = "%(asctime)s - %(levelname)s - %(message)s"
now_date = strftime('%Y-%m-%d', localtime(time()))
logging.basicConfig(filename="check.log",level=logging.INFO,format=log_format,datefmt=None)
 
 
headers = {
    'x-apikey': ""   #去www.virustotal.com官网免费注册账户可以看到
}
 
def check_file(File): #检查文件是否为目录
    if os.path.isdir(File):  #判断是否为目录
        return 0
    else: #不是目录/目录不存在
        if os.path.exists(File): #判断是否为文件
            return 1
        else:
            return 2
 
def dir_ls(path): #遍历目录
    dir_list = os.listdir(path) #获取到目录下的所有文件/目录
    for i in dir_list: #循环列表
        i = path + "/" +  i #拼接绝对路径
        file_type = check_file(i) #检查该项是否为文件
        if file_type == 0: #i是目录
            dir_ls(File) #将继续进行遍历
        elif file_type == 1: #i是文件
            upload_files(i) #
        elif file_type == 2: #文件不存在
            logging.error("%s 文件或目录不存在."%i)
        else:
            logging.error("检查文件发现未知问题....")
 
 
def upload_files(file_name): #post上传函数,路径需要绝对路径
    try:
        logging.info("开始上传 %s ....."%file_name)
        url = "https://www.virustotal.com/api/v3/files"
        files = {'file': ('%s'%file_name, open('%s'%file_name, 'rb'))}
        result = requests.post(url=url,headers=headers,files=files,timeout=10,verify=False).json()
        logging.info("接口返回值 %s"%result)
        id = result['data']['id']
        sleep(60)  #接口上传文件完毕,不会立刻有结果,需要等待1-2分钟
        get_status(id) #将返回的id存入列表当中
    except KeyboardInterrupt:
        logging.error("用户取消上传(crtl + c)")
    except BaseException as e:
        logging.error("上传失败: %s"%e)
 
 
def get_status(id):#获取文件扫描分析状态
    url = "https://www.virustotal.com/api/v3/analyses/%s"%id #拼接url
    logging.info("获取文件的分析的url %s"%url)
    result = requests.get(url=url,headers=headers,timeout=10,verify=False).json()
    file_name = result['meta']['file_info']['name'] #获取到文件名
    file_sha = result['meta']['file_info']['sha256'] #获取到文件的sha值
    logging.info("文件名: {} \n 文件sha值: {}".format(file_name,file_sha))
    logging.info("返回的分析结果: ",result)
    logging.info("开始分析 %s 的结果........."%(file_name))
    if len(result['data']['attributes']['results']) == 0: #判断返回结果是否进行了分析
        logging.info("请求太快,稍后再试. 陷入等待60s中....")
        sleep(60) #等待60秒
        get_status(id) #调用本身,重新进行分析,需要时间来分析
 
    for i in result['data']['attributes']['results']: #遍历结果
        cate = str(result['data']['attributes']['results'][i]['category']) #获取扫描结果的分类
        rs = str(result['data']['attributes']['results'][i]['result']) #获取扫描结果的返回
        logging.info("当前检查的社区: %s"%i)
        if (cate == "undetected" or cate == "type-unsupported" or cate == "timeout") \
                and (rs == "undetected" or rs == "None"): #满足正常文件的条件
            logging.info("%s 检查结果为正常。"%file_name)
        else:
            logging.warning("%s 检查结果有异常: "%file_name)
            logging.warning("category: %s \t result: %s"%(cate,rs))
    logging.info("完成分析 %s 的结果........."%(file_name))
 
if __name__ == "__main__": #程序主函数
    File = sys.argv[1] #接受命令行第一个参数
    File = "/" + File.strip("/")  #给参数去掉最后一个/
    if os.path.isdir(File): #判断是否为目录
        print("本次扫描 %s 是个目录."%File)
        dir_ls(File) #遍历目录
    else:
        if os.path.exists(File): #判断是否为文件
            print("本次扫描 %s 是个文件."%File)
            upload_files(File) #开始扫描
        else:
            print("ERROR: 文件/目录不存在...")

 

运行了之后,ctrl+c终止不了,只能ctrl+z,然后jobs -l ,kill杀掉,因为扫描的文件有多个,一次ctrl+c就会到了下一个文件。

 

 

 
© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发