【Win Pwn】Windows内核池笔记
文章来自blackhat 2021的文章《Windows-Heap-Backed-Pool-The-Good-The-Bad-And-The-Encoded》 原文链接:https://i.blackhat.com/USA21/Wednesday-Handouts/us-21-Windows-Heap-Backed-Pool-The-Good-The-Bad-And-The-Encoded.pdf Youtube:https://www.youtube.com/watch?v=VvxNc8GTFfk 粗略的分配 内核动态内存:和R3中的对差不多 类型为可分页和不可分页,程序按照4KB分页,之前写过一点相关的:Joe1sn’s Cabinet | windows内核驱动 2-页表探索 旧API初始化中不会将内存置零,导致信息泄露 一些API 在RS5(Redstone 5)版本前(及Windows 1809,在2018年10月前的版本) 没有任何校验、加密等等,但是之后就变得复杂得多了(严重怀疑微软借鉴了glibc的内存管理) 新版本的池设计管理和R3下是同一个库 每一...
【免杀】Windows Inline Hook小结
Inline Hook还是挺好玩的 文章很短,只是打个总结,记录一些有趣的发现 写在前面 之前在学习hook的时候,发现抄的一段代码只能在Debug模式下运行,调试后发现MSVC很有趣的一个点 当我们使用Debug模式编译的时候,程序为了调试方便,会将所有函数加入这个表中 比如 void oldtest() { MessageBoxA(NULL, "not hook", "test", NULL);}int main(){ oldtest();} 按照直觉 这里的call应该会直接来到函数的位置,但是真实情况并非如此 我们会发现一张跳表,根据距离这张表的地址差进行跳转,那段hook只是修改了这一段代码 x86 hook 首先是x86为啥叫32位架构,最突出的就是一个寄存器有32位(bit)大小,那么计算一下 (1<<32)/int(1024*1024*1024) = 4 没错,32位的寄存器最多只能存放4GB个数字(比如从1到0x100000000), 由于要做加减发(...
【免杀】PE文件分析
最近代码能力飞速提升,顺便复习一下 一般就是 DOS头:IMAGE_DOS_HEADER结构体 PE头:IMAGE_NT_HEADERS结构体 Section头:IMAGE_SECTION_HEADER结构体 OK,如果要分析PE文件的话,首先把文件读取出来 那么如何解析呢?这就是C/C++非常方便的一点:直接使用结构体转换,例如把地址值解析为数值 总体就是解释内存中的值 DOS 头 先看DOSHeader吧 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic number WORD e_cblp; // Bytes on last page of file WORD e_cp; // Pages in file WORD e_crlc; // ...
【Win Pwn】HEVD-内核栈溢出GS保护及绕过
HEVD中的栈溢出加上GS保护 还有一个知识点就是windows内核栈地址泄露 函数功能 在上三篇中讲的很清楚了,这里我关闭了KVAS 又是一段经典的栈溢出,但是有了内核的GS保护 编写exploit 这里就不得不提到Windows中一种Cannary的绕过方式了,通过try except的Handler进行绕过,很遗憾handler只在32位程序中才保存在栈上 查阅资料 https://paper.seebug.org/2017/#22 https://kristal-g.github.io/2021/02/07/HEVD_StackOverflowGS_Windows_10_RS5_x64.html cookie值是存储在_data段的第一个 函数检查的部分,有一个异或 1: kd> dqs rspffff8788`21979540 00000000`00000000ffff8788`21979548 ffffc186`261f98f0ffff8788`21979550 ffffc186`269c86b0ffff8788`21979558 00000...
【Win Pwn】HEVD-任意地址写
非预期方法,暂时不会放出来 HEVD练习-任意地址写 漏洞点 一点好玩的 传入一个结构体,得到结构体过后写入内容 结构体 typedef struct _WRITE_WHAT_WHERE{ unsigned int* What; unsigned int* Where;}arbitrary_write, *pArbitraryWrite; 这里我做一个比较有意思的事儿,比如修改某个变量的值 printf("[*] Start Exploit\n");pArbitraryWrite payload = (pArbitraryWrite)malloc(sizeof(arbitrary_write));if (payload == NULL) { printf("[!] Malloc payload failed\n"); return;}int vuln = 0x10000;int pay = 0xDEADBEEF;printf("[-] the vuln value is 0x%x\...
【内网】从PoC看JuicyPotato提权
从此认识到自己不是做win安全的料 个人认为JuictPotato的前身是著名的Rotten Potato 使用CoGetInstanceFromIStorage API 调用欺骗RPC,对代理进行身份验证.在此调用中指定了代理 IP/端口 RPC 向代理发送 NTLM 协商包 代理依赖的NTLM协商到RPC在端口135,被用作模板。同时,执行对AcceptSecurityContext的调用以强制进行本地身份验证 注:此包被修改为强制本地身份验证. & 5. RPC 135和AcceptSecurityContext用NTLM Challenge回复 将两个数据包的内容混合以匹配本地协商并转发到RPC RPC使用发送到AcceptSecurityContext(8.)的NLTM Auth包进行响应,并执行模拟 【PotatoAPI】创建COM监听器startCOMListenerThread 初始化WinSocket,创建非阻塞式socket,并监听-t端口。跳转到2,后面的就是监听循环中的 【LocalNegotiator】使用processN...
【内网】探索Windows内网的Kerberos协议
感恩学校扎实的密码学功底,分析起来也是很简单的 说白了就一张图 攻击方式 黄金票据 第三步中 使用 KDC 特定账户 Krbtgt 的 NTLM-Hash 时,如果我们有了该NTML-Hash那么就能做到伪造TGT 该方法由于需要DC的NTLM-Hash,所以用于留后门 假设我们拿到了DC上administrator权限的shell 抓取Hash CS使用的命令为:lsadump 相关项目:https://github.com/Xre0uS/MultiDump 获得管理员SID mimikatz一把梭 wmic useraccount get name,sid 切换到域内用户的普通权限,制作黄金票据 横向移动 先尝试访问文件夹 原因:https://support.microsoft.com/zh-cn/topic/ms16-101-windows-身份验证方法的安全更新程序说明-2016-年-8-月-9-日-be16a40d-d7e2-c4b2-d885-6a22cff3cb77 貌似是WinServer2012的硬伤了,虚拟机必须用一些补丁才...
【内网】环境搭建
Windows Server 2012 配置 怀念大学时光,在学网络配置的时候就是用的winserver 2012,最近想探究内网就翻出来学一学。 简单配置 vmware虚拟机安装就不多说了,主要是网络,我配置了两块网卡 NAT:连接到物理机网络 WinDC:构建vmware的虚拟局域网 关于vmtool安装 vmtool是通过DVD光盘的形式安装的,所以要开启自动检测;软盘也要相同的设置 装完了过后就很方便了 关闭防火墙 开启远程桌面 配置路由 添加角色和功能 里面选择 配置DHCP服务器(非必要) 添加角色和功能 里面选择 创建和激活作用域:工具->DHCP AD活动目录配置 AD和域控制器DC都在虚拟机上。 为了测试,安排一个Win7 局域网 Windows 7客户机 配置内网静态IP,设置DNS为域服务器IP 配置DC域控 提升为域控制器 密码:!234rewq 设置Administrator账户的密码为$321qwer 创建用户组织 用户组织可以用于委派等,是对组操作的最小单位 使用部门->个...
【内网】内网渗透测试-新手村
简单一层内网测试 去年的一篇,简单一层内网测试 入口点 http://xxx:16xx8 入口是个OA办公系统,使用某漏洞可以文件上传最后webshell实现RCE 扫描内网发现存活主机,同时上传cs大马 使用mimikatz抓取明文得到rdp密码后使用socks代理进入内网可以访问远程桌面 内网I 监控服务器 192.168.xx.50 该服务器存在ms17-010漏洞,但是有杀软,尝试使用psexec文件上传执行RCE失败,因为被杀软拦截了,可能修改横向移动方式能够绕过 也可以尝试使用command一句话+web_delivery上线 不过好在入口权限够高,192.168.xx.100时也扫出了RDP密码,也是直接上线了 内网II DHCP服务器 192.168.xx.250 一般来说DHCP服务器是域服务器,mimikatz没有抓到密码,不过还好有ms17-010漏洞,但是由于当时我没有使用正向payload所以使用的就是 web_delivery+command 上线,之后把msf的shell传递给cs来扫密码,得到密码后使用代理RDP上线 查看相关配置后基本可...
【Win Pwn】HEVD-内核栈溢出(下)
上:https://joe1sn.eu.org/2024/01/25/win-hevd-exp-stackoverflow-I/ 中:https://joe1sn.eu.org/2024/01/25/win-hevd-exp-stackoverflow-II/ 文章已在先知社区投稿:https://xz.aliyun.com/t/13365 本附录对第二章的以下几个遗留问题做出说明 user编程寻找ROPGadget shellcode编写 Token提权 KVAS user编程寻找ROPGadget ROP全称加返回导向性编程,比如这一章用到的Gadget pop rcxretmov cr4, rcxret 关于ret汇编本质上就是从栈帧中取出值,然后将ip寄存器设置为该值,等价于pop ip,这样就能完成函数调用的返回等等。 本章中当我们发生栈溢出时,就会把ret的位置设置为第一段gadget的位置 pop rcx就会将此时栈顶的值0x00000000002506f8存入rcx寄存器,然后ret又从栈顶取出地址mov_rc4_rcx_ret,然后rip寄存器就跳转...
【Win Pwn】HEVD-内核栈溢出(中)
在上一篇中了解了与内核的交互模式,这里就可以开始做HEVD了 文章已在先知社区投稿:https://xz.aliyun.com/t/13364 编写交互模块 A. 计算IO_CTL值 其实不用这步,但是可以当作更多的了解 在之前的交互中有这么一条定义功能号 #define IOCTL_MUL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x9888, METHOD_BUFFERED, FILE_ANY_ACCESS) 但是…HEVD逆向会发现是这样的 发现CTL_CODE也是个宏定义 #define CTL_CODE( DeviceType, Function, Method, Access ) ( \ ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \) 其中,这里 DeviceType -> FILE_DEVICE_UNKNOWN = 0x22 Function -> = ...
【Win Pwn】HEVD-内核栈溢出(上)
开始做HEVD来熟悉windows的内核漏洞利用方式时,发现大多数的资料依旧基于windows7,但是目前主流的操作系统已经是win10,所以还是得更上时代潮流的 文章已在先知社区投稿:https://xz.aliyun.com/t/13363 0. 前置环境 更基础 WIndows10 Vmware虚拟机 Visual Studio 2019,有WDK Windbg Preview(我用单纯是觉得更好看) 最重要的HEVD项目:https://github.com/hacksysteam/HackSysExtremeVulnerableDriver,我直接下载的3.00 Release版 我使用的Windows版本是 I. 编程环境 如果你想快速搭建一个驱动开发环境可以参考B站上的一些资料,如:配置驱动开发环境 如果按照步骤vs没有KernelModDriver这一模板,找到vs目录的WDK.vsix双击即可 一段驱动的主要代码,在main.cpp中编写 #include <ntifs.h>#include "win10.h"#inc...
【漏洞挖掘】记一次痛苦的VxWorks路由器漏洞挖掘
问题多又多 记一次痛苦的VxWorks路由器漏洞挖掘 路由器很老了,是Mercury MW300R的某个版本,网上找不到固件,所以最开始想用uart进shell 拆开过后可以快速找到UART引脚 UART调试 I 打开UART 路由器断电,然后把万用表调到测接地,黑笔随便找一个电路板上的接口(我用的wifi天线的),红笔测口子,响的那个就是接地 接着路由器连上电源,万用表调到测电压,黑笔随便找一个电路板上的接口,红笔挨个测试接口 如果为3.3V左右,那么是电源线(3.3V) 如果为0V,为接地(GND) 如果为2.5V左右,为TXD(路由器的Write) 如果不断跳动,为RXD(路由器的Read) 然后第一点不寻常的就来了 我在测试的时候只能通过排除法筛选出了RXD,我的RXD一直为0V 这个时候通过 FT232: 3.3V -> 路由器: 3.3vFT232: GND -> 路由器: GNDFT232: RXD -> 路由器: TXDFT232: TXD -> 路由器: RXD 插上路由器电源线,但是不插插头,通过串口就能连上了...
【STM32】1.点灯大师
如何三小时之内,从0开始学会stm32点灯 (其实是想验证下发的芯片是不是好的) 准备工作 我是在JD上随便买的一家,有 STM32F103C8T6,面包板,USB转TTL,显示器… 缺啥少啥买配件就行了 1.软件 由于我们是小白,所以暂时不需要看电路啥的,直接先把软件装上。 STM32CubeIDE 这里我参考了:BV1HM411b78E 或者知乎的https://zhuanlan.zhihu.com/p/321845090 知乎的有一个模拟程序 驱动(因为我是USB转TTL):CH340-驱动,这个你可以找客服要,一般都会发给你的 烧录软件:FLYMCU 首先需要熟悉的就是STM32CubeIDE的使用,可以参考上面的B站视频后者知乎,这里还有:https://www.bilibili.com/video/BV13B4y1y7yk 2.硬件 这个是始终绕不开的(除非你用EDA) 1.面包板 有时间可以参考:https://www.bilibili.com/video/BV1gz4y1Z7N7 或者 导线就是这样连接的 2.STM32F103C8T6 显示...
【源码分析】AFL源代码分析
其实还是挺简单的 在一次期末报告里面做了这个报告 关于AFL的基本步骤 工作流程基本上可以用 5 个步骤来描述:预处理、输入构建、输入选择、评估、后模糊测试。 真正的内核处理是步骤 2 到 4 预处理 分析和获取有用信息,使用PIN,符号执行,污点检查 黑盒白盒 输入构建 从数据 S(种子)产生大量变异数据 I。 输入选择 过滤无效数据,优化模糊测试 评估 大多数关于模糊的研究集中在两个指标上:覆盖率和利用漏洞的平均时间 源码分析 编译插桩 afl-gcc 根据使用方法,首先是使用afl-gcc进行编译,在编译时就完成插桩 本就是是包裹的GCC盒CLANG int main(int argc, char** argv) { if (isatty(2) && !getenv("AFL_QUIET")) { SAYF(cCYA "afl-cc " cBRI VERSION cRST " by <[email protected]>\n"...
【漏洞挖掘】win-afl使用指北-中级篇
为什么不叫高级篇,因为高级的我也不会 主要讲一下更贴近实际的用法吧 !!!仅大标题1完成,全片未完待续!!! 对DLL进行Fuzz 理论测试 代码还是上一篇提到的代码,依旧是32位,只不过溢出部分写在DLL里面 dll.c #include <stdio.h>__declspec(dllexport) void vuln(char *FileDir){ char password[6] = "ABCDE"; char str[6]; FILE *fp; if(!(fp=fopen(FileDir,"r"))){ printf("Open Failed\n"); exit(0); } fgets(str, 0x1000, fp); str[5]='\0'; if(strcmp(str,password)==0) // fprintf(stderr,"OK.\n"); printf("OK.\n"); else...
【漏洞挖掘】win-afl使用指北-初级篇
在21年的时候曾经小小的使用了一点WinAFL,现在再回过头来做笔记 这里主要讲述WinAFL+DynamoRIO的Fuzz方法 简介 知道创宇这篇文章讲的已经很好了:https://paper.seebug.org/323/ 由于闭源特点,那么需要使用DynamoRIO进行插桩,检测指令块的转移 WinAFL主要特点就是将AFL中的函数使用WinAPI进行重写,然后调用DynamoRIO的API完成fuzz 编译 主要是参考了https://bbs.kanxue.com/thread-261323.htm和官方过程:https://dynamorio.org/page_building.html DynamoRIO 32位 1. 编译 软件下载一把梭 git clone https://github.com/DynamoRIO/dynamorio.gitcd dynamoriomkdir build_Win32mkdir build_x64 这里我使用的是x86 Native Tools Command Prompt命令行 cmake -G"Visual ...
【免杀】DLL注入小结
DLL 注入进化史 远程线程调用注入 这个是最简单的 这里我接受的是程序的进程PID和待注入DLL的路径szPath void DLLinjector::DllOnLoad() { if (!this->Check()){ wcout << "The Process or DLL file not found\n"; return; } //向目标进程写入DLL的路径 SIZE_T dwWriteSize = 0; HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, this->dwPid); LPVOID pAddress = VirtualAllocEx(hProcess, NULL, 0x100, MEM_COMMIT, PAGE_READWRITE); WriteProcessMemory(hProcess, pAddress, this->szPath, wcslen(this->szPath)*2+2, &a...
【Win Pwn】基础栈溢出保护绕过
针对栈攻击的防护与绕过 GS GS本质上和Linux GCC中的canary很相似,他在栈帧的结尾(EBP之前)插入一给DWORD类型的值,其副本存在于.data中。 在编译的时候并不会存在GS保护有下面几种情况 函数不包含缓冲区 函数被定义为具有变量参数列表 函数使用无保护的关键字标记 函数在第一个语句中包含内嵌汇编代码 缓冲区不是 8 字节类型且大小不大于 4 个字节 不过仍然可以采用#pragma strict_gs_check 强制启用GS保护 #include "string.h"int vulfuction(char* str){ char arry[4]; strcpy(arry, str); return 1;}int main(){ char* str = "yeah,i have GS protection"; vulfuction(str); return 0;} 绕过方式要漏洞类型灵活选择 如果是可以泄露那么泄露后拼接再溢出 再C++中,struct和c...
【Win Pwn】基础栈溢出利用
[Win Pwn] 基础栈溢出利用 window下无保护的栈溢出加载shellcode 程序 #include <stdio.h>#include <string.h>#include <stdlib.h> void vuln(){ char password[6] = "ABCDE"; char str[6]; FILE *fp; if(!(fp=fopen("password.txt","r"))) exit(0); fscanf(fp,"%s",str); str[5]='\0'; if(strcmp(str,password)==0) // fprintf(stderr,"OK.\n"); printf("OK.\n"); else // fprintf(stderr,"NO.\n"); printf("NO.\n");}in...













