2019-11-20 10:55:48    3    0    0
2019-11-19 21:01:56    295    0    0

前言

任意文件读取或是 ssrf 等一些漏洞,我们漏洞证明的方式就是读到了 /etc/passwd,但是然后呢?这个文件究竟有什么用?

基础知识请参考:

[1] Linux /etc/passwd 内容解释
[2] Linux /etc/shadow 影子文件内容解析

0x01 查看 /home/用户名/.bash_history 文件

通过 /etc/passwd 获取了用户名之后,可以去访问特定的 /home/用户名/.bash_history 文件,看看 history 里面有没有泄露密码。如果里面有一些运维留下的密码,或许可以内网通用口令一把梭。

参考实例: 中国电信某业务可文件遍历(泄漏数据库配置,外网redis可连接)

title

0x02 明文 root 密码提权

设想一个场景:比如 tomcat 是用 root 跑的,然后你有个 jsp 的 webshell。然后你要做的事情就是登陆 root 的 ssh。

在这种场景下,就可能需要明文 root 密码提权。

将 /etc/passwd 的 root 密码 x 替换为我们自己的 hash,如替换为自己 linux 里的 hash,可修改目标的 root 密码。

title

这样修改后,我就把 root 的密码改为了与 /etc/shadow 不同的新密码。/etc/shadow 里面的密码不再可用,需要用新密码登录。

那么如果读到的 /etc/passwd 已经被篡改,就可以直接对此密码密文尝试解密登录。

0x03 信息收集、密码复用

从 /etc/passwd 本身来看:

  • 用户名:用户名本身是有信息量的。看了 passwd 大概知道开了哪些服务。比如 mailredisMySQL,可以推断这个服务器的在目标网络中的作用。对其他的普通用户名进行收集,加入自定义字典。用户名本身可能是一些数据库、后台的 web 账号或密码。
  • 默认Shell:这个字段获取哪些账号可以登录、哪些账号不能登录的信息。可以用一些具有特殊含义的普通账号(如hwxunjian)进行爆破,如果弱密码爆破成功,获得的账号密码很可能是可以通杀的。
  • 主目录:这个字段我们可以获取用户路
2019-11-18 19:06:22    369    0    0

0x01 考点

title

参考手册:Redis 命令参考

利用前提1:Redis 可访问

一些 Redis 服务是可以直接公网访问的。

但是更多 Redis 服务是只开在内网中,在这种情况下可以配合 SSRF 漏洞进行访问。

利用前提2: Redis 可登入

Redis 漏洞之所以被利用的如此频繁,原因是它存在很多未授权访问。

不同于 Mysql 等服务器在配置过程中默认需要输入账号密码,Redis 在默认配置过程中无需设置密码。这就造成了一些 Redis 服务器存在简单的空口令、弱密码等安全风险。

存在类似风险的数据库服务器还有 MONGODB。

Redis Crackit 漏洞

如果 Redis 服务器可以公网访问,而且没有设置验证,那么则可以通过 Redis 直接获取 system shell(注意:不是 web shell)。你的 redis 运行在什么用户,就直接能以此用户身份进行登录。

因为攻击者通常会通过名为 crackit 的键(或者类似键名)写入 ssh 公钥进行登录,所以此漏洞名为 Redis Crackit 漏洞。

本文概要

  • 未授权 Redis 拿 shell 的 3 种方式及其适用场景
    • 通过写 SSH key
    • 通过向 Web 目录中写入 webshell
    • 通过写 crontab

0x02 写 ssh key 获取 sh

原理:Redis 未授权访问然后写 authorized_keys 来强行拿权限。

参考:

虽然是参考的前辈的文章,上述的文章里面也有详细步骤。但是我会在本文中再次详细记录步骤,因为经验表明这类文章随时可能消失。

此漏洞利用方式的前提是:

  1. Redis 服务器运行在 root 用户下(否则还要猜测用户)
  2. 此服务器对外开启了 ssh 服务
  3. Redis 未授权访问漏洞

注:
当然当然,写入的目录不限于/root/.ssh下的authorized_keys,也可以写入用户目录,不过 Redis 很多以 root 权限运行,

2019-11-13 20:09:40    672    0    0

问题

遇到了一个问题,就是同一个域名,我在两个网站上查到它的 IP 是不一样的:

title

title

这是为什么呢?这是因为 CDN。

CDN 即 content delivery network,通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。

开了CDN 之后,会智能匹配当地最近的节点来的,所以请求的实际 IP 不同。

CDN 的配置

要检测 CDN 就要从 CDN 的配置说起,配置 CDN 一般只有两种方式:

方法 1:

是给域名设置一个 cname 类型的记录,让它指向 cdn 厂商提供的另一个域名,这种域名有前缀一般是看起来很随机那种。

方法 2:

把域名的 NS 记录指向 CDN 厂商的 DNS 服务器 IP。

Github 上面有一个开源项目,收集了所有常见的 cdn 厂商的 ip 范围与 cname 信息,用可于判断目标配置了具体哪个 CDN。

或者有的 CDN 会改 http 响应头,能在响应头里面直接看出来。

CDN 的检测

为什么我们需要检测 CDN?个人觉得一个比较常见的场景是:我们获取了一个批量入侵上千个网站的任务,第一步我们需要获取其真实 IP,在获取真实 IP 之后我们才能进行进一步的信息收集工作(如通过 socket 获取端口 banner)。但是这个前提是,我们需要获取域名对应的真实 IP。这就要求我们先判断哪些域名有 CDN 防护,那么我们需要进一步绕过 CDN 去获取真实 IP;哪些域名没有 CDN 防护,我们就可以直接获取真实 IP。也就是说,首先我们要按是否有 CDN 进行一个分类。

有人说,检测 CDN 很简单。多地 ping 不就行了,但是这种简单局限于较少的检测量。多地 ping 延迟高,需要等待较长的时间,如果有几千个域名,难道一个一个去多地 ping 吗?显然这样效率是不够高的。

所以对于 CDN 的检测,我们分为单个域名的 CDN 检测域名批量 CDN 检测两种,使用不同的方法。

单个域名的 CDN

Shiro RCE    2019-11-07 09:49:38    537    0    0

一篇旧文2019-07-21。

参考 shiro 基础教程,Apache Shiro 是一个功能强大且易于使用的 Java 安全框架,提供了认证,授权,加密,和会话管理。

如同 Spring security 一样都是是一个权限安全框架,但是与 Spring Security 相比,在于他使用了和比较简洁易懂的认证和授权方式。

title

0x00 概述

参考 Apache Shiro issue #550,漏洞大概情况为:

title

通过阅读官网 issue,可以了解到:

默认情况下,shiro 使用 CookieRememberMeManager。这序列化、加密和编码用户身份以供以后检索。因此,当它收到来自未经身份验证的用户的请求时,它会通过执行以下操作来查找其记住的身份:

  • 检索 rememberMe cookie 的值
  • Base 64 解码
  • 使用 AES 解密
  • 使用 java 序列化模块(ObjectInputStream)来反序列化

但是,默认加密密钥是硬编码的,这意味着任何有权访问源代码的人都知道默认加密密钥是什么。因此,攻击者可以创建恶意对象,对其进行序列化,对其进行编码,然后将其作为 cookie 发送。然后 Shiro 将解码和反序列化,这意味着您的恶意对象现在在服务器上。通过仔细构建对象,可以使它们运行一些恶意代码。

title

title

从官方的 issue 上来看,存在几个重要的点:

  • rememberMe cookie
  • CookieRememberMeManager.java
  • Base64
  • AES
  • 加密密钥硬编码
  • Java serialization

0x01 环境搭建

有两种方式:

  1. 基于Apache Shiro源码添加存在漏洞的jar包,然后使用 mvn 进行存在漏洞环境的 war 包进行编译,最终可以将 target 目录下生成的 samples-web-1.2.4.war 文件拷贝至 tomcat 目录下的 webapps 目录,这里将其重命名为了 shiro.war 文件,启动 tomcat即可。
  2. 使用 Docker 搭建环境。

我这里使用 docker。

过程:

根据 https://git

2019-11-05 15:52:32    477    0    0

Git/SVN 泄露查询工具:

Test404 HTTP Fuzzer:

Test404 HTTP Fuzzer v4.1.1
链接:https://pan.baidu.com/s/1twrHFhpXkdScMj64KTNA_w
提取码:49a5
复制这段内容后打开百度网盘手机App,操作更方便哦

插件:

链接:https://pan.baidu.com/s/17FxHYcorPR-jP9DyxtjIGw
提取码:evsf
复制这段内容后打开百度网盘手机App,操作更方便哦

在插件文件夹中通过 gitsvn 关键词搜到下图中的两个插件然后放入 Test404 Fuzzer 的插件文件夹:

title

使用的时候勾选:

title

然后在 Fuzzing 界面可以开始扫描:

title

实测判断 git 泄露的插件还可以,判断 svn 泄露的插件没扫出来。SVN 判断泄露的规则根据版本大于或小于1.7是不同的。这种可以自己用 Python 写,我写了个比较简单的。主要原理是有的 SVN 泄露去访问 http://域名/.svn/entries 页面会返回一个12:

title

大家根据实际情况在此基础上修改此代码:

  1. import requests
  2. import re
  3. import os
  4. with open("test.txt","r") as f1:
  5. lines = f1.readlines()
  6. f = open('outtput1.txt','a')
  7. i = 1
  8. for line in lines:
  9. if i <= len(lines):
  10. try:
  11. line = line.strip()
  12. target_url = line + '/.svn/entries'
  13. #print target_url
  14. print '%i.scanning:%s'%(i,target_url)
  15. f.write('\n%
2019-11-01 08:08:25    342    0    0

前言

众所周知, Docker 是非常好的虚拟化解决方案。轻量级、使用简单方便、环境丰富。但是 Docker 仍有其问题,就是 Docker 不支持运行 Windows 应用!
因为 Docker 是一种容器,容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源的。虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统。因此容器的隔离级别会稍低一些。
Docker 是起源于 Linux 上的技术。Docker 是基于 Linux 内置的 Namespace 和 CGroup 等系统内隔离机制而抽象出来的一种轻虚拟化技术。与虚拟机相比,它以一种轻量级的方式实现了运行空间的隔离。不难理解,Docker 作为一种隔断,它并不能基于一种内核(Linux)提供另一种内核(Windows)的虚拟化运行环境。所以,基于 Linux 的 Docker 是不支持运行 Windows 应用的。

对 Windows 环境虚拟化的设想

要解决运行 Windows 应用的虚拟化问题,要解决以下几个具体问题:

  1. Windows 环境的虚拟化
  2. Windows 基础环境的快速搭建
  3. Windows 应用的虚拟化

Windows 环境的虚拟化

我们要通过虚拟化实现Windows环境的快速搭建,亦要部署完理想的漏洞环境之后的打包和快速分发。

推荐解决方案: 【Vagrant】

使用 Vagrant 快速部署 Windows 环境

在 Vagrant 中,镜像就是 .box 文件,可以通过两种方式快速添加镜像文件:

1、直接通过 URL 添加

如下图,示范了从 vagrant 仓库直接拉取 centos7.2 版本的镜像。

title

2、 把 .box 文件下载到本地,然后从本地添加:

title

添加之后运行非常简单,

先通过 vagrant init xxx.box 命令初始化虚拟配置,就会生成 Vagrantfile。Vagrantfile 是一个配置文件,可以配置登录虚拟机方式 password/ssh,虚拟机 ip,将要执行的容器文件 box 等信息。我们通过修改此 Vagrantfile 来设置内存大小、SSH秘钥等设置:

title

python webshell 大马    2019-10-31 21:27:55    380    0    0

0x01 运行环境 —— Apache 服务器 CGI 配置

要运行此 Python 版本的 Webshell,需要应用服务器以 CGI 方式支持 python 文件。

先配置 Apache 的配置文件 httpd.conf 使其支持 CGI,因为我使用的是 phpstudy,所以如下设置:

  1. DocumentRoot "D:\phpStudy\PHPTutorial\WWW"
  2. <Directory />
  3. Options +Indexes +FollowSymLinks +ExecCGI
  4. AllowOverride All
  5. Order allow,deny
  6. Allow from all
  7. Require all granted
  8. </Directory>

让 Apache 识别 .py 文件为 CGI 程序:

  1. AddHandler cgi-script .cgi .pl .py

只允许在特别目录下执行cgi程序:

  1. ScriptAlias /cgi-bin/ "D:/phpStudy/PHPTutorial/Apache/cgi-bin/"

以上就完成了 Apache 对于 CGI 的支持的配置。测试一下:

使用 Python 创建第一个 CGI 程序,文件名为 test.py,文件位于 D:\phpStudy\PHPTutorial\Apache\cgi-bin 目录中,内容如下:

  1. #!C:\Python27\python2.exe
  2. # -*- coding: UTF-8 -*-
  3. print "Content-type:text/html"
  4. print # 空行,告诉服务器结束头部
  5. print '<html>'
  6. print '<head>'
  7. print '<meta charset="utf-8">'
  8. print '<title>Hello World - CGI 测试!</title>'
  9. print '</head>'
  10. print '<body>'
  11. print '<h2>Hello World! 输出这句话说明测试成功</h2>'
  12. print '</b
2019-10-31 21:04:06    265    0    0

0x01 Python 标准库

什么是 python 标准库?

  • python 的标准库是随着 pyhon 安装的时候默认自带的库。
  • python 的第三方库,需要下载后安装到 python 的安装目录下,不同的第三方库安装及使用方法不同。
  • 它们调用方式是一样的,都需要用 import 语句调用。
  • 简单的说,一个是 python 默认自带不需要下载安装的库,一个是需要下载安装的库。它们的调用方式是一样的。

0x02 Python 标准库危险模块

  • os
  • commands
  • subprocess
  • pty

通过这四个危险标准库模块,我们最终的目的是拿到 shell 权限


0x03 OS 模块

Python 标准库中的 OS 模块是操作系统模块,提供各种各样的操作系统接口。

主要功能:

os 模块主要有以下4点功能:

  • 系统相关
  • 目录及文件操作
  • 执行命令
  • 管理进程

命令执行:

1、system 函数 —— 将字符串转化成命令在服务器上运行

system 函数可以将字符串转化成命令在服务器上运行;其原理是每一条 system 函数执行时,其会创建一个子进程在系统上执行命令行,子进程的执行结果无法影响主进程。

system 函数执行单条命令:

title

注意:system 函数的原理是每一条 system 函数执行时,其会创建一个子进程在系统上执行命令行,子进程的执行结果无法影响主进程;
上述原理会导致当需要执行多条命令行的时候可能得不到预期的结果;

title
title

上述程序运行后会发现 test2 文件夹并没有创建在 /test 文件夹下,而是在当前的目录下;

system 函数执行多条命令:

为了保证 system 执行多条命令可以成功,多条命令需要在同一个子进程中运行;

title

2、popen 函数 —— 新建一个管道执行命令

功能:

os.popen() 方法用于从一个命令打开一个管道。
在 Unix,Windows 中有效。

语法:

  1. os.popen(command[, mode[, bufsize]])

参数:

  • command —— 命令。使用的命令
  • mode —— 权限
python 代码审计    2019-10-28 12:39:38    231    0    0

0x01 前言

时间的车轮滚滚而过,我终于学到代码审计了。


0x02 Python 危险内置函数

Python3 里面,主要有:

  • eval()
  • exec()
  • compile()

title

注:
python3 删去了 execfile() 函数,代替方法如下:

  1. with open('test1.py','r') as f:
  2. exec(f.read())

Python2 里面,主要有:

  • eval()
  • execfile()
  • compile()

    title

注:
需要说明的是在 Python2 中 exec 不是函数,而是一个内置语句(statement),但是 Python 2 中有一个 execfile() 函数。可以理解为 Python 3 把 exec 这个 statement 和 execfile() 函数的功能够整合到一个新的 exec() 函数中去了。


0x03 eval() 函数(执行单个表达式)

功能: 将字符串当成有效的表达式来求值并返回计算结果。

语法:

  1. eval(expression, globals= None, locals= None)

官方文档中的解释:
将字符串 str 当成有效的表达式来求值并返回计算结果。
globals(全局)和 locals(局部)参数是可选的,如果提供了globals参数,那么它必须是 dictionary 类型;
如果提供了 locals 参数,那么它可以是任意的 map 对象。

eval() 函数三个参数的用法可以参考此两篇博客,写的很清楚了:

总结来说,eval() 函数的第二、三个参数,也就是 globalslocals 是可以省略的,如果传入了,它们的作用是定义作用域的。globals 代表作用域为全局、locals 代表作用域为局部。如有冲突,以 locals 的作用域为准 。

第二三个参数分别指定能够在 eval 中使用的函数等,如果不指定,默认为 globals(