一次X-Forwarded-For绕过ip限制

作者:dabaisuv,原文链接:https://dabaisuv.github.io/2024/03/15/一次X-Forwarded-For绕过ip限制

  • 背景

    • 在进行一次web逻辑漏洞测试的时候,有个接口有请求次数限制。
  • 测试过程

    • 逆向了js代码后,发现他没有其他可验证的手段,猜测是对ip的限制。
    • 利用yakit拦截一次请求,添加了X-Forwarded-For: 127.0.0.1。
    • 发现请求次数限制被绕过了。
  • 批量利用

    • 经逆向发现他的请求用的是XMLHttpRequest。
    • 控制台执行如下代码,hook xhr的open函数,使每次请求随机X-Forwarded-For ip。
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
function hookAjax() {
var originalXHR = window.XMLHttpRequest;
window.XMLHttpRequest = function() {
var xhr = new originalXHR();
var originalOpen = xhr.open;

xhr.open = function(method, url, async, user, password) {
originalOpen.apply(this, arguments);

if (this.readyState === 1) {
this.setRequestHeader('X-Forwarded-For', generateRandomIP());
}
};

return xhr;
};

function generateRandomIP() {
var ip = [];
for (var i = 0; i < 4; i++) {
ip.push(Math.floor(Math.random() * 256));
}
return ip.join('.');
}
}
hookAjax();

使用virtualbox和iptables进行虚拟机内网隔离

作者:dabaisuv,原文链接:https://dabaisuv.github.io/2024/02/28/使用virtualbox和iptables进行虚拟机内网隔离

背景 - 在虚拟机中使用某些工具时,有后门风险。
方案 - 组建一个虚拟机内网,利用网关虚拟机来进行完全的进出网流量控制。
  • 在virtualbox虚拟机设置中,给每个虚拟机分配一个内部网络网卡(内网),名称随意但要相同。
  • 在virtualbox虚拟机设置中,给网关虚拟机分配一个NAT网卡(外网)。

配置如下:

不可信虚拟机1(linux)
网卡1ip:192.168.8.2(内网)

不可信虚拟机2(linux)
网卡1ip:192.168.8.3(内网)

不可信虚拟机3(linux)
网卡1ip:192.168.8.4(内网)

网关虚拟机(linux)
网卡1_ip:192.168.8.1(内网)
网卡2_ip:192.168.1.1(外网)

在网关虚拟机执行:

  • 在这里假设允许放行的目标ip是:1.1.1.1 ,且放行的dns服务器是:114.114.114.114.
  • 先使用nmtui将网卡1的ip设置为静态ip,ip地址为192.168.8.1,其他不用动,保存后重连。
1
2
3
4
5
6
7
sudo echo 1 > /proc/sys/net/ipv4/ip_forward #开启ip转发
sudo iptables -v -n -L --line-number #可通过这个命令查看现有规则
sudo iptables -P FORWARD DROP #默认不允许转发
sudo iptables -t nat -A POSTROUTING -s 192.168.8.0/24 -j MASQUERADE #转发时更改源地址
sudo iptables -A FORWARD -d 114.114.114.114 -j ACCEPT #允许目标地址114.114.114.114的转发(这是国内的dns服务器,你可以改成自己想要的)
sudo iptables -A FORWARD -d 192.168.8.0/24 -j ACCEPT #允许目标地址为192.168.8.0/24网段的转发
sudo iptables -A FORWARD -d 1.1.1.1 -j ACCEPT #允许目标地址1.1.1.1的转发(这里可以改为自己想让虚拟机能够访问的外网ip)
  • 基本上网关虚拟机就配置好了,后续根据自己的需要添加,删除或者更改目标。
  • 上面的命令是实时生效的,但是重启就会丢失,可以使用以下命令保存和恢复iptables配置
    1
    2
    sudo iptables-save -f /etc/iptables.conf #这个保存地址可以更改为自己喜欢的
    sudo iptables-restore < /etc/iptables.conf #从之前保存的配置文件中恢复

在不可信虚拟机执行(这里拿不可信虚拟机1举例,大同小异):

  • 先使用nmtui将网卡1的ip设置为静态ip,ip地址为192.168.8.2,其他不用动,保存后重连。
1
sudo route add default gw 192.168.8.1 #设置默认路由为网关虚拟机

参考

golang官方漏洞检测工具 - govulncheck

作者:dabaisuv,原文链接:https://dabaisuv.github.io/2024/02/19/golang官方漏洞检测工具-govulncheck

govulncheck是Go语言官方发布的漏洞管理工具,用于分析您的代码库和二进制文件,以发现您的依赖中已知的漏洞。这些工具是由Go安全团队维护的Go漏洞数据库支持的。Go的工具通过仅显示您的代码实际调用的函数中的漏洞,减少了结果中的噪音。

架构图

安装方法

go install golang.org/x/vuln/cmd/govulncheck@latest

使用方法

在module目录中使用命令govulncheck ./...

参考

[1]https://go.googlesource.com/vuln
[2]https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck#section-sourcefiles

后续据说会并入go语言的二进制中。

CTF 2024 Presented by Cyandev Write Up

作者:dabaisuv,原文链接:https://dabaisuv.github.io/2024/01/05/CTF-2024-Write-Up

CTF 2024 Presented by Cyandev https://ctf.cyandev.app 的通关笔记

1.Check in

看情况是需要我输入一个flag

随意输入字母a并单击提交,出现了如下提示。

这是javascriptalert提示,这里我们可以通过hook alert并栈回溯找到调用源,但是我们先试试直接寻找submit的回调函数。如图,找到click回调。

,由此再跳转到源码处,断点后发现此处函数为空。

进一步跟下去,各种跳转,应该是一种反跟踪措施。正着走行不通就倒着hookalert试试,
在控制台执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 保存原始的 window.alert 函数
var originalAlert = window.alert;

// 创建新的函数来替代 window.alert
window.alert = function(message) {
// 添加你的逻辑
console.log('Alert Hooked!');
// 触发中断
debugger;
// 调用原始的 window.alert 函数
originalAlert(message);
};

// 测试钩取后的效果
window.alert('Hello, World!');

上面的命令会hook住alert函数,并在被调用时触发调试器中断。
回到提交flag处再次点击submit,此时alert被调用并触发中断。

栈回溯找到if判断,将条件直接改为改为true并再次运行。


成功!

直接成功过了,其实还有一种方法可以获取flag1的真实值,就是直接一路跟到它的checkFlag1函数并修改暴力破解的。

Challenge 2也可直接修改if的判断值绕过。

作者还给了一个通关奖励,需要flag1的真实值。

可以利用我上面的暴力破解法获取真实值,打码了。

最终是一个支付宝口令红包,不过好像被领完了。

JavaScript hook 通用方法

作者:dabaisuv,原文链接:https://dabaisuv.github.io/2024/01/05/JavaScript-hook-通用方法
例子,hook alert函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 保存原始的 window.alert 函数
var originalAlert = window.alert;

// 创建新的函数来替代 window.alert
window.alert = function(message) {
// 添加你的逻辑
console.log('Alert Hooked!');
debugger;
// 调用原始的 window.alert 函数
originalAlert(message);
};

// 测试钩取后的效果
window.alert('Hello, World!');

Flutter Web CORS跨域问题解决方案

作者:dabaisuv,原文链接:https://dabaisuv.github.io/2024/01/03/Flutter-Web-CORS跨域问题解决方案

问题描述:
在使用Flutter web访问localhost:8080/api/xxx 接口时,http库一直报错不知名原因,后台也服务器也显示收到了请求并返回,postman也能成功打开,进入到浏览器的控制台发现是跨域的问题-_-。

解决方案:
这是浏览器的限制,不让你的网站程序随意访问别人网站资源。
如果这是你的服务器资源,在你服务器每次请求返回的header中加入:'Access-Control-Allow-Origin': '*'
其中*可以改为特定的允许主机名。

Windows下利用docker打包linux的dart可执行文件

作者:dabaisuv,原文链接:https://dabaisuv.github.io/2023/12/18/Windows下利用docker打包linux的dart可执行文件

因为dart现在还不支持交叉编译(2023.12.18),出于特殊情况需要在windows下快速打包Linux下的可执行文件。

先行需要:

安装好docker:https://docs.docker.com/desktop/install/windows-install/

可能会遇到个错误是:Docker for Windows error: “Hardware assisted virtualization and data execution protection must be enabled in the BIOS”
解决链接:https://stackoverflow.com/questions/39684974/docker-for-windows-error-hardware-assisted-virtualization-and-data-execution-p

执行步骤:

在项目根目录(pubspec.yaml所在路径)执行下面语句,则会默认compile bin/main.dart,生成bin/main,也可以通过-e i=bin/xxx.dart -e o=bin/xxx直接指定输入与输出(好像多此一举)

1
2
3
4
5
6
7
docker run -v .:/app --rm dart /bin/bash -c '
mkdir /app;
cd /app;
if [ -z "$i" ]; then i="bin/main.dart"; fi;
if [ -z "$o" ]; then o="bin/main"; fi;
dart pub get;
dart compile exe "$i" -o "$o";'

`

FLutter生成apk Bug解决

作者:dabaisuv,原文链接:https://dabaisuv.github.io/2023/11/24/FLutter生成apk-Bug解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
FAILURE: Build failed with an exception.

* Where:
Settings file '<flutter root directory>\android\settings.gradle' line: 26

* What went wrong:
Plugin [id: 'com.android.application', version: '7.3.0', apply: false] was not found in any of the following sources:

- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Included Builds (None of the included builds contain this plugin)
- Plugin Repositories (could not resolve plugin artifact 'com.android.application:com.android.application.gradle.plugin:7.3.0')
Searched in the following repositories:
MavenRepo
Gradle Central Plugin Repository
Google

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 10s

有多种错误原因,cdandroid目录,运行gradlew.bat --info获取详细信息

解决方案一:
网络原因,修改~\.gradle\gradle.properties增加如下行:

1
2
3
4
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=<代理端口>
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=<代理端口>

解决方案二:
更换jdk版本为jdk11或以上,
官网jdk11下载地址:https://www.oracle.com/sg/java/technologies/javase/jdk11-archive-downloads.html
官网jdk21下载地址(不用登录):https://www.oracle.com/sg/java/technologies/downloads/#jdk21-windows
安装好后注意修改JAVA_HOME环境变量指向安装位置,这步不会的就自行百度。