身世酒杯中,万事皆空。

0x01 背景

国外安全研究员champtar在日常使用中发现Kubernetes tmpfs挂载存在逃逸现象,研究后发现runC存在条件竞争漏洞,可以导致挂载逃逸。$^{[1]}$

关于条件竞争TOCTOU和一些linux文件基础知识可见这篇文章《初探文件路径条件竞争 - TOCTOU&CVE-2019-18276》

CVE-2021-30465在Redteam的研究者视角中比较鸡肋,因为需要K8S批量创建POD的权限。但在产品安全的视角恰恰相反,针对Caas(Container as a service)类产品,用户/租户拥有批量创建POD权限,利用挂载逃逸可打破租户间隔离,同时读取Host层面某些敏感数据,危害性极大。

0x02 RunC简介

为了让容器生态更加开放,Linux基金会发起OCI(Open Container Initiative),目标是标准化容器格式和运行时$^{[2]}$,其中一个重要产物就是CRI(Container Runtime Interface),抽象了容器运行时接口,使得上层调控容器更加便捷。containerd和runC都是其中代表产物,从dockerd中再剥离出containerd$^{[3]}$,向上提供rpc接口,再通过containerd去管理runC。containerd在初期也是直接对runC进行管理,但为了解决containerd进行升级等操作时会造成不可用的问题,containerd再拆出containerd-shim,独立对接runC。containerd从Runtime、Distribution、Bundle维度提供容器全生命周期的管理能力$^{[4]}$,runC专注于Runtime。

Untitled 0

Untitled 1

0x03 容器设备挂载相关基础知识

Namespace

Read More

0x01 Introduction

在golang代码审计中遇到了这种情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package main

import (
"bytes"
"text/template"
)

type Callback struct {
URL string `json:"url"` // 回调接口url
Body string `json:"body"` // 请求体
}

type Test struct {
*Callback
Attack string
}

func main() {
test := Test{
Callback: &Callback{
URL: "http://",
Body: "xxxxxxx",
},
Attack: "xxxxxx",
}

urlTemplate, err := template.New("url").Parse(test.URL)
if err != nil { panic(err) }

var urlBuffer bytes.Buffer
err = urlTemplate.Execute(&urlBuffer, test)
if err != nil { panic(err) }

bodyTemplate, err := template.New("body").Parse(test.Body)
if err != nil { panic(err) }
var bodyBuffer bytes.Buffer
err = bodyTemplate.Execute(&bodyBuffer, test)
}

可以从简化代码中看出,template解析的\{\{\}\}均为外部可控的的string传入,目测可以做一些操作,故深入研究一下。

1
2
> $ go version
go version go1.13.1 darwin/amd64

0x02 Tag

之前在看Tag的时候,并没有太理解这个东西有什么用,golang的官方解释如下:

A field declaration may be followed by an optional string literal tag, which becomes an attribute for all the fields in the corresponding field declaration. An empty tag string is equivalent to an absent tag. The tags are made visible through a reflection interface and take part in type identity for structs but are otherwise ignored.

Tag会在reflection interface中课件,且参与到type的定义中,从下面这个例子中可以看出tag会在反射的方法中做自动转换:

1
2
3
4
5
6
7
// A struct corresponding to a TimeStamp protocol buffer.
// The tag strings define the protocol buffer field numbers;
// they follow the convention outlined by the reflect package.
struct {
microsec uint64 `protobuf:"1"`
serverIP6 uint64 `protobuf:"2"`
}
Read More

0x01 Intro

Web选手之前未对bin/pwn的漏洞有过接触,同时也无相关基础,在某个漏洞遇到了这种利用,故管中窥豹一番。

0x02 Question1

存在flag文件,owner和owner_group均为root,文件权限600。现有以下以下代码编译而成的readflag程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

int main(int argc, char* argv[]) {
int fd;
int size = 0;
char buf[256];

if(argc != 2) {
printf("usage: %s <file>\n", argv[0]);
exit(1);
}

struct stat stat_data;
if (stat(argv[1], &stat_data) < 0) {
fprintf(stderr, "Failed to stat %s: %s\n", argv[1], strerror(errno));
exit(1);
}

if(stat_data.st_uid == 0)
{
fprintf(stderr, "File %s is owned by root\n", argv[1]);
exit(1);
}

fd = open(argv[1], O_RDONLY);

if(fd <= 0)
{
fprintf(stderr, "Couldn't open %s\n", argv[1]);
exit(1);
}

do {
size = read(fd, buf, 256);
write(1, buf, size);
} while(size>0);

}

gcc readflag.c -o readflag 编译,且使用 chmod 4755 readflag 添加SetUID权限(s权限)

ubuntu 18.04 gcc7.5.0

1
2
3
4
5
6
➜  race ls -la readflag
-rwsr-xr-x 1 whip1ash whip1ash 8792 Jun 14 16:20 readflag

//执行效果如下
➜ race ./readflag ./flag
File ./flag is owned by root

分析

首先使用stat函数读取文件信息,后判断st_uid是否为0,若不为0则读取文件内容。

Read More

0x01 Intro

第一次接触js的逆向是从17年的hctf中,之后,也时常会遇到过需要解开Webpack/混淆js的情景。近几日遇到了一个批量刷票的需求,目标是投票网http://wenjuan.com/

目标

  1. 逆向投票网的防刷票机制,实现自动化投票。
  2. 总结鄙人常用的chrome debug操作,望能提供有需求逆向js同学帮助。

结构

本文结构从实例开始,当中穿插Chrome Debug逆向使用操作、分析、脚本编写等,最后进行总结。

0x02 从需求开始

目标:https://www.wenjuan.in/s/6N3iy2u

HTTP分析

走了一遍流程,发现是可以重复投票的,只要你点击在此参与即可,抓了一下数据包,发现流程如下:

Read More

距离上次一次blog更新时隔将近两年了。20年为了毕业,搞了半年的nlp的实践(知识图谱-KnowledgeGraphInference)。下半年刚开始打工,这将近一年的时间里做了很多关于业务工作,但无法公开分享,主要是职场新人,这里面水太深,把握不住(其实是懒)。现在重新回归,继续更新我的blog。

目标

解答日常在代码审计中常见模糊点。

已有基础

  1. 简单了解golang语法,0 golang编写基础
  2. 能够熟练复制别人的代码并跑过编译
  3. 熟练掌握面向对象编程
  4. 大概知道go的struct是个啥。通过下面这篇文章。

《Go Struct超详细讲解》
https://juejin.cn/post/6844903814168838151

了解了以下几个点:

struct 定义如下

1
2
3
4
5
6
7
8
9
type Member struct {
key1 int
key2, key3 string
}

var (
m1 = Member{id:1}
)
var m1 Member
  1. 结构体也可以不包含任何字段,称为空结构体,struct{}表示一个空的结构体,注意,直接定义一个空的结构体并没有意义,但在并发编程中,channel之间的通讯,可以使用一个struct{}作为信号量。
Read More

该文实际发于06/06/2021,之前未完全公开具体细节。

不讲武德

11月9日晚上,有个朋友问我,马老师发生什么事了,给我发了来几张截图。我一看,噢,原来是前几天,saltstack公布了安全更新,一个CVE-2020-16846,一个CVE-2020-25592,这两个一起用能未授权RCE。。

Abstract

在对CVE-2020-17490和CVE-2020-16846进行分析后,发现CVE-2020-17490的补丁存在未修补完全的情况,导致wheel_async仍然存在未授权访问,可以调用wheel模块中的方法,基于此对SaltStack的wheel模块中的方法进行分析,最终发现加载配置模块存在模板注入,可以实现远程代码执行。

不再赘述,CVE-2020-17490、CVE-2020-16846,分析文章在这里

Background

SaltStack是VMware子公司,其产品用于运维管理,能够支持数万台服务器,主要功能是配置文件管理和远程执行命令,十分易用且强大,在github有11.4k star,阿里云的Nacos与之类似,不过Nacos管理的是微服务。

SaltStack只用python开发,采用C/S架构,其中Server被称为Master,Client被称为Minion,即一个Master能够向多个Minion下发配置文件,远程执行命令。SlatStack是系统总称,主要有salt、salt-master、salt-minion、salt-api等程序组成,其中salt-master和salt-minion的功能为从指定路径读取配置文件并启动。salt-master监听4505和4506端口,分别用于发布消息和接受监控数据。

salt程序可以调用大量函数,并可以指定minion或指定一组minion作为目标。salt-api可以使用cherrypy或tornado来对外提供REST接口,默认使用cherrypy。

Read More

写在之前

本文为鄙人的毕业论文,之前对机器学习这玩意儿毫无了解,迫于毕业压力跟一帮毫无经验的硬件同学研究了好几个月的NLP。最后算是跑通了整个链路,但是效果可以说是差强人意,完全无法用的一个模型。鄙人典型的蛮干党,什么数学原理都不懂,搞了一些论文读了一读,上手就干他妈的,最后发现完全玩不转,但最后还是沉淀下来一些经验,我当时做这块发现实践资料非常少,故发出,给水毕业论文的学生一些参考。

本项目为笔者毕业设计,于2019年12月了解到该项目,在此前对机器学习无任何了解。在大学期间(2016-2019)一直学习安全相关知识,主攻WEB安全,目前研究方向为云原生安全。故对WEB前端、后台、数据库有一定的知识储备和了解,同时对于各种编程语言有一定的了解。本项目并非笔者一己之力,团队规模为7人,均为某邮2016级电子信息工程专业的学生。

PS: 黑色的地方不是没有图片,而是图片的背景是透明的,所以就黑了,建议点开观看。也可以在此处看最后交给学校的pdf版本。
https://whip1ash.cn/file/Design%20of%20Knowledge%20Graph%20and%20Knowledge%20Inference%20System%20Based%20on%20Neural%20Network.pdf

Introduction

Background

近年来,随着人工智能的迅速发展,支持人工智能的技术逐渐被更多人了解并研究,知识图谱就是其中很重要的一个技术。目前,知识图谱在很多日常生活的很多方面都已经得到了非常广泛的应用。比如语义化的搜索引擎(Google,Baidu等),移动助手(Mobile assistant)(Siri,Cortana等),以及一些智能问答机器人(intelligent chatbots)。

知识图谱相关的支持技术在很早就已经开始得以发展,比如语义网、逻辑描述和专家系统等,但知识图谱(Knowledge Graph)这个概念来源于Google在2012年发起的一个项目,在此提出”Knowledge Graph: things, not strings”,但Google官方并没有给出知识图谱的定义,同时也没有一个得到广泛认可的知识图谱的定义。所以,在2018年,基于图1的架构提出了对于知识图谱的定义。

未命名文件 -2-

A knowledge graph acquires and integrates information into an ontology and applies a reasoner to derive new knowledge.

Read More

Abstract

Nginx配置不当,导致换行符(“\n”)能够使FastCGI的PATH_INFO参数为空,PHP-FPM未考虑PATH_INFO为空情况,导致下溢(underflow),使其能够覆盖PHP全局变量,从而导致RCE。

目前Exp只影响PHP7全版本,根据洞主说法,也能够在PHP 5.6能够导致Crash。

本文粗略结构如下:

  1. 漏洞复现
  2. Exp分析
  3. 漏洞分析

Reproduction

Env

Ubuntu 18.04
PHP 7.2.19
Nginx 1.14.0

Exp地址: https://github.com/neex/phuip-fpizdam
Clone下来后go build .

Nginx Config

Read More

0x01 Abstract

本文简单描写了tctf的web第二题”Wallbreaker Easy”的解题方法,以此题为出发点,探索一些通过Imagick来bypass disable_functions的方法。通过自动化测试来寻找启动子进程的后缀名处理和API函数,从而寻找可以劫持的程序(通过LD_PRELOAD)和发现可能会存在命令注入的函数(在启动的新进程中执行命令)。

此思路并非原创,只是在前人的基础上提出一点自己的思考和实现。

环境: Ubuntu 18.04 + PHP 7.2.15 + Imagick 3.4.3RC2

通过sudo apt install php php-fpm php-imagick安装。

0x02 TCTF 2019 Wallbreaker Easy WP

题目描述如图,并且提示ubuntu 18.04/sudo apt install php php-fpm php-imagick
-w630

主要使用了一个老手法的新利用,这位大佬找到一个扩展修饰符,可以在main函数前执行,这样就省去了使用LD_PRELOAD需要寻找可用函数的问题。详情见此篇文章。
巧用LD_PRELOAD突破disable_functions

如果不了解LD_PRELOAD。见此篇文章。
利用环境变量LD_PRELOAD来绕过php disable_function执行系统命令 – YiYang

既然前提有了,只需要找到可以利用函数就可以了。大佬通过查找ImageMagic的文档发现,在处理ilbm的文件的时候会启动ilbmtoppm程序,而这个程序是ubuntu 18.04自带的。

Read More

原文在这里。其实这篇Paper很值得研究,并能够应用在日常的漏洞挖掘中。本文不是直译过来的,原文党请移步原版。翻译此文只是为了加深的理解,我的英语也很一般,尽量讲得让大家都看懂吧。能力一般,水平有限,多多谅解,有问题希望大家与我多交流,共同探讨。Orz

Abstract

HTTP请求通常被认为是相互独立的实体。在这篇文章中,我将探讨一些被遗忘的技术。通过这种技术,远程未授权的攻击者能够打破HTTP请求的独立性,并拼接攻击者的请求到其他请求中。我在数个军方和商业的Web基础设施上找到了这个问题,并将我的exp拼接到正常的用户请求中,因此我在赏金项目中获得了7万刀的奖励。

通过案例,我将为你展示如何精巧地篡改受害者的请求,使这些请求被送到一个恶意的域中,使其得到有害的响应,并获得回显(lure credentials into your open arms)。我同样将证明使用后端重组请求的方式,将会使得前端(请求)[注:这里的前后端是指服务器在数据流中不同的位置]的信任被利用,这会导致能够使用最大权限来调用内部API,污染Web缓存,使PayPal的登录页面不再安全。

HTTP Request Smuggling最早的记录是在2005年,由Watchfire提出。但由于其难以利用,所以它多年来一直被忽略,但是近年来Web设备受这个漏洞影响的概率在增加。我将帮助您解决这个遗留问题,包括新的攻击形式和利用向量,通过定制的开源工具和一种可靠的黑盒测试的新方法,同时将收到影响的风险降到最低。

Core concepts

自动HTTP/1.1开始,通过单个TCP或者SSL/TLS套接字来发送多个HTTP请求就被广泛的支持。这个协议非常的简单,HTTP请求被简单的拼接在一起,然后服务器通过解析HTTP头部来分别同一个套接字中的不同的HTTP请求。它经常和HTTP管道(HTTP pipelining)搞混,HTTP管道是一种不常见的子类型,不在本文的探讨范围之内。

仅仅针对这项功能而言,这是无害的。而然,现代的网站由一系列的系统组成,全通过HTTP通信。这种多层架构导致不同用户的HTTP请求通过同一个TCP/TLS链接来传输。

这就意味着后端在处理请求时,需要和前端识别的请求结束的位置一样,这是至关重要的。换种说法,攻击者可能发送一个边界模糊的消息,它将会在后端被分割成两个不同的HTTP请求。

Read More
⬆︎TOP