Skip to content

Instantly share code, notes, and snippets.

@soutar
Last active November 14, 2022 20:14
Show Gist options
  • Save soutar/22a1e1df23147d5ba1f4 to your computer and use it in GitHub Desktop.
Save soutar/22a1e1df23147d5ba1f4 to your computer and use it in GitHub Desktop.
Redirect HTTP traffic on Internet Sharing to a local Charles proxy
#!/usr/bin/env node
var options = require('minimist')(process.argv.slice(2), { default: {
cport: 8888
}});
var disable = options.disable || options.d;
var enable = options.enable || options.e;
var status = options.s || options.status;
var child = require('child_process');
// -s or --status to list active rules
if (status) {
child.exec('sudo pfctl -s nat -i bridge100', function (error, stdout, stderror) {
console.log(stdout || stderror);
});
return;
}
if (enable) {
var pfrules = [
'rdr pass on bridge100 inet proto tcp from any to any port 80 -> 127.0.0.1 port {charles_port}',
];
pfrules.forEach(function (pfrule) {
pfrule = pfrule.replace(/{charles_port}/g, options.cport);
child.exec('echo "' + pfrule + '" | sudo pfctl -ef -');
});
console.log('HTTP & HTTPS traffic on Internet Sharing network now redirecting to 127.0.0.1:' + options.cport);
return;
} else if (disable) {
console.log('Cleared all rules on the Internet Sharing network');
child.exec('sudo pfctl -F nat -i bridge100');
return;
}
console.log('Usage: -e to enable, -d to disable or -s for status');
@acotilla91
Copy link

This is only redirecting HTTP traffic, not HTTPS right? The port 443 is not being acknowledged here.

I tried just simply adding another rule, but that didn't work.
'rdr pass on bridge100 inet proto tcp from any to any port 443 -> 127.0.0.1 port {charles_port}'

Any idea how to capture HTTPS traffic?

@edgarsanleo
Copy link

This is only redirecting HTTP traffic, not HTTPS right? The port 443 is not being acknowledged here.

I tried just simply adding another rule, but that didn't work. 'rdr pass on bridge100 inet proto tcp from any to any port 443 -> 127.0.0.1 port {charles_port}'

Any idea how to capture HTTPS traffic?

The script is prepared to catch a single pf rule.
So in order to add both http and https, they need to be together in the same string.

var pfrules = [ 'rdr pass on bridge100 inet proto tcp from any to any port 80 -> 127.0.0.1 port {charles_port} \n rdr pass on bridge100 inet proto tcp from any to any port 443 -> 127.0.0.1 port {charles_port}' ];

@BC-DavidAguilar
Copy link

I can't seem to get logs from my Roku device when I try to capture HTTPS traffic.

I constantly receive 503 errors with "Invalid first line in request".

What could I be missing?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment