醉梦轩

醉中无日月,梦里有乾坤

0x00 背景

Github Action提供了便捷的流水线能力,但是对于较为复杂的场景,只能依靠不断试错来定位和解决Action报错,效率非常低下。网上也有人提供了基于tmate的远程调试方案,但该方案也存在着一些不足。本文尝试提供一些其它的解决方案。

阅读全文 »

0x00 前言

Kali是一款常用于渗透测试的Linux发行版,集成了较多的安全工具。本文尝试使用Docker安装Kali,并进行Wifi的破解工作。

本文仅做技术研究,请勿用于非法用途。

阅读全文 »

0x00 背景

最近遇到一个客户环境比较特殊,无法使用TCP或UDP访问外网,但是可以ping通外网。于是想到通过ICMP协议建立与外界的通信链路。在尝试了几个开源工具都宣告失败后,准备自己撸一个ICMP隧道。当然,这个隧道工具需要支持穿过NAT访问网络。

阅读全文 »

0x00 前言

容器是指一种系统级的虚拟化技术,想比于KVM等内核级的虚拟化技术,具有更加轻量的特点。随着Docker技术以及k8s容器编排引擎的流行,容器在云原生时代扮演着绝对重要的角色。但事实上,容器技术自从Unix时代就已经出现,并且存在着多种容器方案,不同的容器方案之间既有相同点,也有不同点。

阅读全文 »

0x00 背景

小米平板5开始支持了键盘与鼠标,终于离生产力工具越来越近了。因此,从入手小米平板5开始,就想着怎么安装一个linux系统,可以在里面安装vscode,以便使用pad开发代码。下面是这段折腾之路的记录。

阅读全文 »

0x00 前言

Deepin v20.2.2系统支持运行Android应用,于是安装了Windows/Deepin双系统后,开始了运行Android应用的踩坑之旅。以下是在这过程中的踩坑记录。

阅读全文 »

0x00 前言

你是否遇到过以下这些情况:

  • 目标服务需要通过跳板机才能访问,每次都要将端口映射到本地,然后配置hosts访问

  • 不同的服务需要配置不同的代理才能访问,管理起来很不方便

  • 有些服务需要通过嵌套代理才能访问,本地不太好配置

  • 本地开发、调试后端服务时,对于第三方依赖服务难以直连或通过同一个代理访问,而服务进程又只能配置固定的代理

  • 使用全局透明代理时,无法根据目标服务选择不同的路由代理

总的来说,就是因为各种网络连通限制导致的跨网络访问(如:开发、运维环境差异,或是需要连通不同局域网),会影响到我们日常的开发、调试工作,而turbo-tunnel就是为了解决这一问题而诞生的。

它的总体思想是将不同的代理、隧道都转换成本地一个统一的代理服务(如:HTTPS代理、socks5代理),然后进程在访问目标网络时通过配置环境变量或透明代理方式,达到自由访问目标网络的目的;而turbo-tunnel提供了多种不同代理/隧道的支持,并且可以通过插件方式支持更多类型的隧道。

阅读全文 »

0x00 前言

在使用Nginx作为反向代理的时候,如果源服务返回了30x(301、302、303、307等)返回码,需要用户再重新发送一次HTTP请求。但此时有可能出现用户不能直接访问重定向后的URL,就需要Nginx能自动进行重定向,读取新的URL后,通过200返回码返回真正的内容。
本文主要就是研究了怎么配置Nginx以实现这样的功能。

阅读全文 »

0x00 前言

随着Win10 2004版本的发布,WSL2的时代也正式到来。使用过WSL的用户,都遇到过一些很不爽的问题,例如:不能直接使用docker,一些系统相关的函数不能调用,netstat命令不能使用等。这些问题在WSL2中都得到了解决,因此,是时候切换到WSL2了。

不过,WSL2不是万能的,依然有一些问题,甚至有些问题本来在WSL1的时代是不存在的。

阅读全文 »

0x00 前言

Hook是一种动态修改函数执行流程或返回结果的方法,在实际应用中非常广泛。Javascript作为一种动态语言,也可以进行Hook操作。随着Javascript语言的发展,Hook的方法也越来越多,本文介绍了常见的几种Hook方法。

0x01 最简单的Hook方法

Javascript中的函数可以直接被覆盖,因此,这也是最简单的一种Hook方法。

1
2
3
window.alert = function(s){
console.log('Alert: ' + s);
}
1
2
> alert('Hello!')
Alert: Hello!

这种方法简单粗暴,但是只能覆盖具体变量的成员函数。

0x02 Hook类方法

考虑以下这种情况:希望Hook所有元素的setAttribute方法。

方案一:遍历获取所有元素,并Hook每个元素的setAttribute方法。

首先,页面中的元素数量非常多,而且不断有新元素动态创建出来,如果要监控新元素创建,还得Hook document.createElement等函数,甚至还需要考虑通过其它方式动态创建出来的函数。因此,这种方案不是最佳方案。

方案二:直接Hook类方法

1
2
3
Element.prototype.setAttribute = function(attr, value){
console.log('setAttribute ' + attr + ' ' + value);
}
1
2
> document.body.setAttribute('xx', 123)
setAttribute xx 123

这里利用了原型链来进行类方法的Hook。

0x03 利用Getter/Setter进行Hook

document.domain是一个只读对象,正常是不允许乱修改的。

1
2
3
> document.domain = 'test.com'
Uncaught DOMException: Failed to set the 'domain' property on 'Document': 'test.com' is not a suffix of 'www.baidu.com'.
at <anonymous>:1:16

乱修改这个值的话,浏览器会直接报错。

但是下面这段代码却可以将document.domain改成可修改的对象。

1
2
3
4
5
6
7
8
9
10
Object.defineProperty(document, 'domain', {
configurable: true,
enumerable: true,
get: function() {
return this._domain || location.host;
},
set: function(value) {
this._domain = value;
}
});
1
2
3
4
> document.domain = 'test.com'
"test.com"
> document.domain
"test.com"

如果将configurable属性设为falsedocument.domain就可以避免被其他人使用Object.defineProperty来修改了。

1
2
3
4
> Object.defineProperty(document, 'domain', {value: 'xxx'});
Uncaught TypeError: Cannot redefine property: domain
at Function.defineProperty (<anonymous>)
at <anonymous>:1:8

同样的方法还可以用来修改:navigator.userAgent等属性。

1
2
3
4
5
Object.defineProperty(navigator, 'userAgent', {
configurable: true,
enumerable: true,
value: 'MyBrowser 1.0.0'
});
1
2
> navigator.userAgent
"MyBrowser 1.0.0"

不过这种方法只影响使用Javascript获取的数据,不会影响浏览器发送请求时带上的浏览器标识。

事实上,有多很多系统对象都是不允许使用Object.defineProperty修改的,例如:window.location等。

0x04 使用Proxy

Proxy是Chrome 49开始支持的一项新特性,具有动态代理功能,可以用于运算符重载、对象模拟等场景。

1
2
3
4
5
window.screen = new Proxy(window.screen, {
get: function (target, key) {
console.log('get', key);
return target[key];
}});
1
2
3
> screen.availHeight
get availHeight
864

这里通过创建screen对象的代理,然后赋值给window.screen,可以实现对属性、函数访问的拦截。这种方法比较适合需要Hook某个对象中大部分属性、函数的场景。

这种方法同时也适用于对函数的Hook。

1
2
3
4
5
6
document.createElement= new Proxy(document.createElement, { // Our hook to keep the track
apply: function (target, thisArg, args){
console.log("document.createElement is called with args: " + args);
return target.apply(thisArg, args);
}
});
1
2
3
> document.createElement('div')
document.createElement is called with args: div
<div>​</div>

当然,有很多对象是不能被替换的,例如:windowdocumentnavigatorlocation等。

0x05 总结

Javascript是一门非常灵活的语言,并且新的接口和规范不断出现,以后还会出现更多的可以用作Hook的方法。