我们知道该释放掉的内存块是位于堆空间上的,接下去就来看下它的分配。先在Gflags的设置中勾选“Create User Mode Stack Trace Database”这一项,我们要能够在同一堆区上分配相同大小的内存空间,这样才能满足堆喷的利用条件,因此需要确定释放的内存是分配在哪块堆上的。
通过下述HTML代码我们可以将特定的数据分配到IE的默认堆上:
然后借助WinDbg来看下堆分配的情况:
可以看到ActiveX控件和JavaScript代码使用了相同的堆区,因此利用起来就方便多了。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
通过下述HTML代码我们可以将特定的数据分配到IE的默认堆上:
然后借助WinDbg来看下堆分配的情况:
可以看到ActiveX控件和JavaScript代码使用了相同的堆区,因此利用起来就方便多了。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
通过查看下述代码,我们发现其中存在一条能导致代码执行的路径。首先,EDI+1Ch指向的内存值被存入到EAX寄存器,而后EAX指向的内存值又被赋值给了ESI寄存器,再往下程序会执行一些其它操作和函数调用并最终来到ESI+4指向的地址。
我们需要确保13e70cb5处的函数调用不会改变ESI寄存器的值,这样上面找到的执行路径才是可控的。下述的WinDbg调试过程给出了如何分配新的内存空间来替换释放掉的内存块,并通过单步跟踪来确认此路径能导致代码的执行。
这表明如果能在释放掉的内存块中写入我们精心构造的数据,那么就能将此漏洞转换成可利用的代码执行。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
我们需要确保13e70cb5处的函数调用不会改变ESI寄存器的值,这样上面找到的执行路径才是可控的。下述的WinDbg调试过程给出了如何分配新的内存空间来替换释放掉的内存块,并通过单步跟踪来确认此路径能导致代码的执行。
这表明如果能在释放掉的内存块中写入我们精心构造的数据,那么就能将此漏洞转换成可利用的代码执行。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
由分析可知该控件并没有通过实现IObjectSafetySiteLock接口来将其锁定到特定域名。
然而,测试表明该控件仅适用于特定的Google域名。既然它没有使用IObjectSafetySiteLock,我接着又检查其是否被注册成IE中的Browser Helper对象,这样可以获取navigation事件,通过逆向调试发现确是如此。因此,由导出的IObjectWithSite接口控件可创建与IE的连接,借此就能得到当前访问的URL信息了。
通过下述C++代码,我们创建该控件的一个实例,并在调用IObjectWithSite-> SetSite()前插入一个断点:
这样我们就可以在调试器中定位到此函数的入口信息,然后在IE中的相同位置下断,并借助HTML代码来加载和调用该控件。
分析可知,控件通过对象传递来实现SetSite供IE调用,如下代码为其中的一部分实现,这里的URL信息由ECX寄存器传递:
通过对此函数的更进一步分析我们可以找到将当前域名和白名单中的域名进行比较的代码段:
我们可以在调试器中下断来打印出所有的白名单域名:
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
然而,测试表明该控件仅适用于特定的Google域名。既然它没有使用IObjectSafetySiteLock,我接着又检查其是否被注册成IE中的Browser Helper对象,这样可以获取navigation事件,通过逆向调试发现确是如此。因此,由导出的IObjectWithSite接口控件可创建与IE的连接,借此就能得到当前访问的URL信息了。
通过下述C++代码,我们创建该控件的一个实例,并在调用IObjectWithSite-> SetSite()前插入一个断点:
这样我们就可以在调试器中定位到此函数的入口信息,然后在IE中的相同位置下断,并借助HTML代码来加载和调用该控件。
分析可知,控件通过对象传递来实现SetSite供IE调用,如下代码为其中的一部分实现,这里的URL信息由ECX寄存器传递:
通过对此函数的更进一步分析我们可以找到将当前域名和白名单中的域名进行比较的代码段:
我们可以在调试器中下断来打印出所有的白名单域名:
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
Chrome 浏览器上不再有效。这是因为 Chrome 团队最近对这项史上最出色、最相关的网络技术缺乏应有的重视,但我们依然团结一致,高呼:让 Flash 再次伟大!
图二是我们用于烧录 Flash 的 AS 代码:
该模型方案首先通过 CSS 泄露令牌,并用空字节进行填充。然后,它从 DOM 中提取该值,并用它来请求路径页面,创建一个过长的引用页,导致 jQuery CDN 崩溃。接下来,DOMXSS 攻击发生,你可以安装一个 SWF 格式的服务工作线程,该线程会利用宽松的crossdomain.xml文件获取密钥。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
图二是我们用于烧录 Flash 的 AS 代码:
该模型方案首先通过 CSS 泄露令牌,并用空字节进行填充。然后,它从 DOM 中提取该值,并用它来请求路径页面,创建一个过长的引用页,导致 jQuery CDN 崩溃。接下来,DOMXSS 攻击发生,你可以安装一个 SWF 格式的服务工作线程,该线程会利用宽松的crossdomain.xml文件获取密钥。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
首先update下的注入不是很常见,第二因为有addslashes的存在,整个注入不能出现单引号,双引号和斜线等,第三就是这个sql语句没有写在一行代码里面,所以不能用单行注释把后面的语句注释掉
这样导致整个注入语句只能在UPDATE
首先查一下mysql update的用法:
http://www.cnblogs.com/ggjucheng/archive/2012/11/06/2756392.html
这个文章在末尾有个很有用的提示:但是multiple-table UPDATE语句可以使用在SELECT语句中允许的任何类型的联合
可以看到他引入了子查询在update语句里面,而且子查询的位置刚刚好在我想要的地方,于是我构造一个这样的子查询:
但是报错:ERROR 1052 (23000): Column 'id' in where clause is ambiguous
原因是:是因为多表查询的时候几个表中同时出现了某个相同的列名,
所以不能出现相同的列名,但是,我除了table表以外不知道数据库的其他表了,或者根本就只有一个表,所以我就要用mysql的虚表dual,
我这里用select ‘1’ as user from dual 把’1’这个字段重命名是要满足后面on的条件,及:on tt.user=t.username
而且这里要用‘1’而不是用数字是因为tale表里面的username类型是varchar类型
执行后面发现可以正常更新,也就是说成功的引入了一个子查询在我想要的地方,那么后面的事情就简单很多了,直接引入一个报错注入的语句在子查询里面就可以了初期的答案是:
注入后完整sql语句
我很快的发现两个问题
1.注入后的反引号没有闭合2.就是单引号被转义掉了
解决第一个问题就是在on的最后一个字段上加入一个反引号,让他和后面的的反引号闭合
解决第二个问题就是把出现单引号的位置用char函数代替
于是完美的答案就出现了:
注入之后的sql语句是是:
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
这样导致整个注入语句只能在UPDATE
{$table}发挥了首先查一下mysql update的用法:
http://www.cnblogs.com/ggjucheng/archive/2012/11/06/2756392.html
这个文章在末尾有个很有用的提示:但是multiple-table UPDATE语句可以使用在SELECT语句中允许的任何类型的联合
可以看到他引入了子查询在update语句里面,而且子查询的位置刚刚好在我想要的地方,于是我构造一个这样的子查询:
update `table` t left join (select id from `table`) tt on tt.user=t.username set username ='admin' where id=1;
但是报错:ERROR 1052 (23000): Column 'id' in where clause is ambiguous
原因是:是因为多表查询的时候几个表中同时出现了某个相同的列名,
所以不能出现相同的列名,但是,我除了table表以外不知道数据库的其他表了,或者根本就只有一个表,所以我就要用mysql的虚表dual,
update `table` t left join (select ‘1’ as user from dual) tt on tt.user=t.username set username ='admin' where id=1;
我这里用select ‘1’ as user from dual 把’1’这个字段重命名是要满足后面on的条件,及:on tt.user=t.username
而且这里要用‘1’而不是用数字是因为tale表里面的username类型是varchar类型
执行后面发现可以正常更新,也就是说成功的引入了一个子查询在我想要的地方,那么后面的事情就简单很多了,直接引入一个报错注入的语句在子查询里面就可以了初期的答案是:
table` t left join (select '1' as user from dual where (extractvalue(1,concat(0x7e,(select user()),0x7e)))) tt on tt.user=t.username
注入后完整sql语句
update `table` t left join (select \‘1\’ as user from dual where (extractvalue(1,concat(0x7e,(select user()),0x7e)))) tt on tt.user=t.username`
set username ='admin'
where id=1
我很快的发现两个问题
1.注入后的反引号没有闭合2.就是单引号被转义掉了
解决第一个问题就是在on的最后一个字段上加入一个反引号,让他和后面的的反引号闭合
解决第二个问题就是把出现单引号的位置用char函数代替
于是完美的答案就出现了:
http://localhost/code.php?table=table` t left join (select char(97) as user from dual where (extractvalue(1,concat(0x7e,(select user()),0x7e)))) tt on tt.user=`t.username
注入之后的sql语句是是:
update `table` t left join (select char(97) as user from dual where (extractvalue(1,concat(0x7e,(select user()),0x7e)))) tt on tt.user=`t.username`
set username ='admin'
where id=1;
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
我们需要DLL
接下来,我们需要动态分配一个缓冲区来存储 shellcode 本身,以便我们可以用正确的值(即 OEP 和
在这两个 for 循环中,我们尝试
现在 shellcode 已经编写完成,我们可以使用它将其注入到映射文件中
这里有两个函数:
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
MessageBoxA中函数的地址User32。首先,我们需要获取 DLL 的句柄,User32这可以通过使用该LoadLibrary函数来实现。然后,我们将使用该句柄GetProcAddress来检索函数的地址。获取到地址后,我们可以将其复制到 shellcode 中,以便调用该MessageBoxA函数。接下来,我们需要动态分配一个缓冲区来存储 shellcode 本身,以便我们可以用正确的值(即 OEP 和
MessageBoxA地址)来修改 shellcode 函数中的占位符值。在这两个 for 循环中,我们尝试
0xAAAAAAAA在 shellcode 中找到占位符(),并将其替换为所需的值。它们会遍历 shellcode 缓冲区,如果找到占位符,就会将其覆盖。这两个循环的顺序不能互换,必须保持这个顺序,稍后在查看 shellcode 函数时,我们会明白其中的原因。现在 shellcode 已经编写完成,我们可以使用它将其注入到映射文件中
memcpy。记住,我们之前用 . 保存了代码洞穴的偏移量dwPosition;这里我们用它来计算从文件开头(即 .lpFile指向的位置)开始的偏移量。我们只需复制 shellcode 缓冲区,大小与 shellcode 本身相同即可。VirtualSize我们需要更新一些头部信息中的值。需要修改节头成员,使其包含 shellcode 的大小。我们还希望该节可执行,以便 shellcode 可以正常运行。最后,AddressOfEntryPoint需要将其指向 shellcode 隐藏的代码洞穴的起始位置。这里有两个函数:
ShellcodeStartshellcode_size 和 shellcode_length 。之前,我们通过从 shellcode_length 的函数地址中减去 shellcode_length 的函数地址来ShellcodeEnd计算 shellcode 的大小。`shellcode_length`函数的唯一作用是标记 shellcode 的结束。ShellcodeStartShellcodeEndShellcodeEnd渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
程序的目的是要把所有 URL 对应的 html 正文部分保存到本地,然后利用 pdfkit 把这些文件转换成一个 pdf 文件。我们把任务拆分一下,首先是把某一个 URL 对应的 html 正文保存到本地,然后找到所有的 URL 执行相同的操作。
用 Chrome 浏览器找到页面正文部分的标签,按 F12 找到正文对应的 div 标签:
具体的实现代码如下:用 soup.find_all 函数找到正文标签,然后把正文部分的内容保存到 a.html 文件中。
第二步就是把页面左侧所有 URL 解析出来。采用同样的方式,找到 左侧菜单标签
因为页面上有两个
最后一步就是把 html 转换成pdf文件了。转换成 pdf 文件非常简单,因为 pdfkit 把所有的逻辑都封装好了,你只需要调用函数 pdfkit.from_file
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
用 Chrome 浏览器找到页面正文部分的标签,按 F12 找到正文对应的 div 标签:
<div class="x-wiki-content">,该 div 是网页的正文内容。用 requests 把整个页面加载到本地后,就可以使用 beautifulsoup 操作 HTML 的 dom 元素 来提取正文内容了。具体的实现代码如下:用 soup.find_all 函数找到正文标签,然后把正文部分的内容保存到 a.html 文件中。
def parse_url_to_html(url):
response = requests.get(url)
soup = BeautifulSoup(response.content, "html5lib")
body = soup.find_all(class_="x-wiki-content")[0]
html = str(body)
with open("a.html", 'wb') as f:
f.write(html)
第二步就是把页面左侧所有 URL 解析出来。采用同样的方式,找到 左侧菜单标签
<ul class="uk-nav uk-nav-side">因为页面上有两个
uk-nav uk-nav-side的 class 属性,而真正的目录列表是第二个。所有的 url 获取了,url 转 html 的函数在第一步也写好了。最后一步就是把 html 转换成pdf文件了。转换成 pdf 文件非常简单,因为 pdfkit 把所有的逻辑都封装好了,你只需要调用函数 pdfkit.from_file
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
我们的方法是针对可执行文件的最后一部分,在其中注入我们自己的代码执行,然后再跳回原始代码。图展示了这一过程
由于采用了这种感染方法,程序将保持完整,并且由于我们将把 shellcode 注入到文件的现有空白区域中,文件大小不会改变,从而降低怀疑度,这对于恶意软件的生存至关重要。
感染者将负责通过将 shellcode 注入到目标应用程序的最后一个部分来修改目标应用程序。以下是伪代码:
现在让我们看看如何用代码来实现这一点。
注:为了保持代码的简洁性和可读性,我将不包含错误检查。
我们将设计一个程序,使其能够从命令行接收目标文件。
首先,我们需要使用
该
在接下来的部分中,我们需要确保目标文件是合法的 PE 文件,因此我们需要验证其
一旦我们验证了目标文件适合感染,就需要获取原始入口点 (OEP),以便在 shellcode 执行完毕后跳转到该入口点。这里,我们还会通过 shellcode 的开头减去结尾来计算 shellcode 的大小。稍后我会展示这些函数的具体实现,届时会更容易理解。
我们
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
由于采用了这种感染方法,程序将保持完整,并且由于我们将把 shellcode 注入到文件的现有空白区域中,文件大小不会改变,从而降低怀疑度,这对于恶意软件的生存至关重要。
感染者将负责通过将 shellcode 注入到目标应用程序的最后一个部分来修改目标应用程序。以下是伪代码:
现在让我们看看如何用代码来实现这一点。
注:为了保持代码的简洁性和可读性,我将不包含错误检查。
我们将设计一个程序,使其能够从命令行接收目标文件。
首先,我们需要使用
CreateFile具有读写权限的函数获取文件句柄,以便能够从文件中读取数据和向文件中写入数据。我们还需要获取文件的大小,以便进行后续操作。该
CreateFileMapping函数会创建一个指向映射的句柄。我们需要指定读写权限(与之前相同CreateFile),以及映射的最大大小,即文件的大小。获取文件映射的句柄后,我们就可以创建映射本身了。该MapViewOfFile函数会将文件映射到我们的内存空间,并返回指向映射文件起始位置的指针,也就是文件的开头。这里我们将返回值强制转换为指向字节的指针,这与无符号字符值相同。在接下来的部分中,我们需要确保目标文件是合法的 PE 文件,因此我们需要验证其
MZ签名PE\0\0。我已经用另一个文件中的单独函数完成了这项工作。一旦我们验证了目标文件适合感染,就需要获取原始入口点 (OEP),以便在 shellcode 执行完毕后跳转到该入口点。这里,我们还会通过 shellcode 的开头减去结尾来计算 shellcode 的大小。稍后我会展示这些函数的具体实现,届时会更容易理解。
我们
pish从前一个代码段中获取了指向上一个代码段头部的指针。利用头部信息,我们可以计算出起始位置,即指向该代码段开头的位置,然后我们将以文件大小作为停止条件dwPosition,读取到文件末尾。dwFileSize渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM