黑客渗透 金融劫持 BC域名跳转
17.6K subscribers
1.8K photos
19 videos
2 files
162 links
金融股民渗透国内app,海外网站app,入侵后台,脱裤数据库, dns劫持 服务器进入等等
破解网站app软件技术等等 黑客技术咨询
@hacker_HouZiM
Download Telegram
每次运行“辅助工具”都会弹出这个注册窗。那么在“辅助工具”初始化的时候肯定做了判断,所以才会反复进入注册窗口。于是我们找到CHECKLOAD-》CheckReg处。
可以看到返回值也是int类型。
可以看到。每次运行“辅助工具”都会弹出无申请码这个提示。
所以我们可以确定就是这个函数做了初始化验证功能。
现在开始阅读一下代码。看看这些代码到底做了什么操作。接下来的代码一些操作流程。我都会以注释形式写在以下代码中。
首先按照我们上面代码的分析思路。
我们CB5文件的申请码改成我们自己的先。然后运行试试。

渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
strncpy() 函数引起的栈溢出,在利用时就会有很 egg hurt 的 0x00 坏字符问题,如果我们的输入数据中包含 0x00,将会被截断导致漏洞利用失败。根据溢出点附近的汇编代码来看,0x0a 也会被截断。且开启了 NX 保护,这意味着我们无法在栈上部署 shellcode

尝试通过 return2libc 的方式 getshell。由于没有实际的摄像头,我们不知道目标系统是否开启了 ASLR ,如果 ASLR 是开启的且没有其它可用来暴露 libC 动态链接库内存地址的漏洞,那么利用该漏洞将会是一个很难受的过程。
采用以下方式暂时关闭 ASLR
echo 0 > /proc/sys/kernel/randomize_va_space

libC 库的加载地址如下
接下来就需要精心构造数据,劫持函数的执行流程了。有一点需要注意,X86 架构下的所有参数都是通过堆栈传递的,而在 MIPS 和 ARM 架构中,会优先通过寄存器传递参数,如果参数个数超过了寄存器的数量,则将剩下的参数压入调用参数空间(即堆栈)。
从前面的分析来看,只要我们构造 0x38 - 4 字节以上的数据,栈底的函数返回地址就会被我们劫持。system() 函数地址 = libC 库在内存中的加载基址 + system() 函数在 libC 库中的偏移,通过劫持该地址为 libC 库中的 system() 函数地址,再设置 R0 寄存器指向命令字符串,就可以执行任意命令。

渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
1
首先,当有新连接进来的时候,fork一个子进程,然后进入上面代码中的那个分支,smtp_setup_msg函数是用来接收命令的函数,我们先发一堆无效的命令过去(padding),控制yield_length的值小于0x100,目的上一篇文章说过了,因为命令无效,流程再一次进入了smtp_setup_msg
这时候我们发送一个命令BDAT 16356
然后有几个比较重要的操作:
5085       if (sscanf(CS smtp_cmd_data, "%u %n", &chunking_datasize, &n) < 1)
5093 chunking_data_left = chunking_datasize;
5100 lwr_receive_getc = receive_getc;
5101 lwr_receive_getbuf = receive_getbuf;
5102 lwr_receive_ungetc = receive_ungetc;
5104 receive_getc = bdat_getc;
5105 receive_ungetc = bdat_ungetc;

首先是把输入的16356赋值给chunking_data_left
然后把receive_getc换成bdat_getc函数
再做完这些的操作后,进入了receive_msg函数,按照上篇文章的流程差不多,显示申请了一个0x100的heap1
然后进入receive_getc=bdat_getc读取数据:
534 int
535 bdat_getc(unsigned lim)
536 {
......
546 if (chunking_data_left > 0)
547 return lwr_receive_getc(chunking_data_left--);

lwr_receive_getc=smtp_getc通过该函数获取16356个字符串
首先,我们发送16352个a作为padding,然后执行了下面这流程:
storeextend return 0 -> storeget -> store_release
先申请了一个0x4010的heap2,然后释放了长度为0x2010的heap1
然后发送:\r\n,进入下面的代码分支:
1902   if (ch == '\r')
1903 {
1904 ch = (receive_getc)(GETC_BUFFER_UNLIMITED);
1905 if (ch == '\n')
1906 {
1907 if (first_line_ended_crlf == TRUE_UNSET) first_line_ended_crlf = TRUE;
1908 goto EOL;
1909 }

跳到了EOL,最重要的是最后几行代码:
2215   header_size = 256;
2216 next = store_get(sizeof(header_line));
2217 next->text = store_get(header_size);
2218 ptr = 0;
2219 had_zero = 0;
2220 prevlines_length = 0;
2221 } /* Continue, starting to read the next header */

把一些变量重新进行了初始化,因为之前因为padding执行了store_get(0x4000),所以这个时候yield_length=0 这个时候再次调用store_get将会申请一个0x2000大小堆,从unsortbin中发现heap1大小正好合适,所以这个时候得到的就是heap1,在heap1的顶上有一个之前next->text使用,大小0x4010,未释放的堆。

渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
include/auth.php, L:81-172中判断用户是否登录,未登录用户加载auth_login.php进行登录,已登录用户显示后台界面
if (empty($_SESSION['sess_user_id'])) {
   include($config['base_path'] . '/auth_login.php');
   exit;
} elseif (!empty($_SESSION['sess_user_id'])) {
   ...
   include_once('./include/global_session.php');
   ...
}

auth_login.php, L:576,683 读取当前页面路径拼接进入action
<form name='login' method='post' action='<?php print get_current_page();?>'>
......
<?php include_once('./include/global_session.php');?>

lib/function.php, L:2889-2913 PHP_SELF返回当前执行脚本的文件名,但在pathinfo模式下PHP_SELF会返回从文件名到query_string之前的部分。由于pathinfo中的单引号不会被转义,可以在form中构造反射型xss,但这样只会影响未登录用户。
function get_current_page($basename = true) {
   if (isset($_SERVER['PHP_SELF']) && $_SERVER['PHP_SELF'] != '') {
       if ($basename) {
           return basename($_SERVER['PHP_SELF']);
       } else {
           return $_SERVER['PHP_SELF'];
       }
   } elseif(){
   ......
   }
   return false;
}

include/global_session.php, L:91 获取REQUEST_URL过滤html标签过来非url字符后作为js参数拼接进入字符串。同理配合pathinfo模式引入单引号构造反射型xss,同时影响登录用户和未登录用户。
var requestURI='<?php print filter_var(strip_tags($_SERVER['REQUEST_URI']), FILTER_SANITIZE_URL);?>';

渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
在这些假设下,RESULT = yield from EXPR可以简化成下面这样,在读这段代码之前,我们先说明一下这些下划线开头的变量的作用:
_i:子生成器,同时也是一个迭代器
_y:子生成器生产的值
_r:yield from 表达式最终的值
_s:调用方通过send()发送的值
_e:异常对象
这段代码的大部分含义已经在注释中说明了,可以结合注释来理解这段代码的含义。
如果你已经理解了,那么我们继续。现实情况下,yield from要做的事情会复杂一些,毕竟我们做出了一系列的假设。将假设去掉没有什么难度,但是有几个问题非常难受:
子生成器可能只是一个迭代器,并不是一个作为协程的生成器,所以它不支持.throw().close()方法;
如果子生成器支持.throw().close()方法,但是在子生成器内部,这两个方法都会抛出异常;
调用方让子生成器自己抛出异常,没有原因,就是任性;
当调用方使用next()或者.send(None)时,都要在子生成器上调用next()函数,当调用方使用.send()发送非 None 值时,才调用子生成器的.send()方法;
这些问题都是yield from结构需要考虑的事情,下面我们来看一下完成的简化之前的代码,相关的注解也写到了注释中:
子生成器生产的值,都是直接传给调用方的;调用方通过.send()发送的值都是直接传递给子生成器的;如果发送的是 None,会调用子生成器的__next__()方法,如果不是 None,会调用子生成器的.send()方法;
子生成器退出的时候,最后的return EXPR,会触发一个StopIteration(EXPR)异常;
yield from表达式的值,是子生成器终止时,传递给StopIteration异常的第一个参数;
如果调用的时候出现StopIteration异常,委托生成器会恢复运行,同时其他的异常会向上 "冒泡";
传入委托生成器的异常里,除了GeneratorExit之外,其他的所有异常全部传递给子生成器的.throw()方法;如果调用.throw()的时候出现了StopIteration异常,那么就恢复委托生成器的运行,其他的异常全部向上 "冒泡";
如果在委托生成器上调用.close()或传入GeneratorExit异常,会调用子生成器的.close()方法,没有的话就不调用。如果在调用.close()的时候抛出了异常,那么就向上 "冒泡",否则的话委托生成器会抛出GeneratorExit异常。

渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
我们从一个简单的爬虫开始,这个爬虫很简单,访问指定的 URL,并且获取内容并计算长度,这里我们给定 5 个 URL。第一版的代码十分简单,顺序获取每个 URL 的内容,当第一个请求完成、计算完长度后,再开始第二个请求。
我们多运行几次看看结果。
大约需要花费 14-16 秒不等,这段代码并没有什么好看的,我们把关注点放在后面的代码上。现在我们使用多线程来改写这端代码。
再来看一下结果,很明显,我们的耗时已经降低到 10s 左右了:
从这两段代码中,已经可以看出并发对于处理任务的好处了,但是使用原生的threading模块还是略显麻烦,Python 已经给我们内置了一个处理并发任务的库concurrent,我们借用这个库修改一下我们的代码,之所以修改成这个库的原因还有一个,那就是引出我们后面会谈到的Future
执行一下,会发现耗时与上一个版本一样,稳定在 10s 左右。
可以看到我们调用了concurrent库中的futures,那么到底什么是futures?简单的讲,这个对象代表一种异步的操作,可以表示为一个需要延时进行的操作,当然这个操作的状态可能已经完成,也有可能尚未完成,如果你写 JS 的话,可以理解为是类似Promise的对象。在 Python 中,标准库中其实有两个Future类,一个是concurrent.futures.Future,另外一个是asyncio.Future,这两个类很类似,不完全相同,这些实现差异以及 API 的差异我们先按下暂且不谈,有兴趣的同学可以参考下相关的文档。Future是我们后面讨论的asyncio异步编程的基础,因此这里多说两句。
Future代表的是一个未来的某一个时刻一定会执行的操作(可能已经执行完成了,但是无论如何他一定有一个确切的运行时间),一般情况下用户无需手动从零开始创建一个 Future,而是应当借助框架中的 API 生成。比如调用concurrent.futures.Executor.submit()时,框架会为 "异步操作" 进行一个排期,来决定何时运行这个操作,这时候就会生成一个Future对象。

渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM