Edit: This has been fixed in the latest firmare update 184.108.40.206
The routers that you receive from your ISP are almost always garbage: not many options to configure and pitiful wifi range. The router/modem that Shaw customers receive is the Hitron CGNM-2250 thankfully isn't completely terrible, 802.11ac plus gigabit ports. I was poking about and researching the model and came upon an exploit for a similar model version for remote code execution. The CGNM-2250 is vulnerable as well, for reference my software version is 220.127.116.11 with hardware version 1A. The input for the ping utility through the web interface isn't sanitized so you can enter arbitrary input. I discovered that it has a few basic utilities, including Dropbear.
From there you can ssh into your router with
ssh firstname.lastname@example.org -p 29
The password is msopassword (go figure!)
You'll be greeted with a fun menu driven interface.
Most of the menus are for debugging and initial programming purposes. There is a menu option to set the TFTP download image URL to flash the device, so it might be possible to flash your own firmware though I don't know how possible that is.
Going back to the web interface, I was able to see what tools and programs are available on the router.
It is your basic Linux system, busybox plus some manufacturer utilities. For a full list of binaries available see here: https://pasteros.io/573e15ddde8f9 Through digging in the CLI menu I found that /etc/scripts/sys_startup.sh is ran on startup, making it a easier to inject any commands you want to run at startup. I haven't been able to get to a shell yet, since logging in with the 'mso' user it takes you to the CLI menu. But cat /etc/passwd reveals:
root:$1$27272727:0:0::/:/bin/false nobody:$1$27272727:65535:65535::/:/bin/false mso:$1$1w7AswO3$IJCko5PwRk6ChJrIYgMQs/:100:100::/:/usr/sbin/cli
One should be able to symlink /bin/sh to /usr/sbin/cli so upon login it would drop to a shell. Entering commands via the web interface is a bit tricky since it doesn't like pipes (|), it's just a matter of getting around the JS validation.
Once I can get to a shell I'll write a followup to this post Issue patched in version 18.104.22.168