初窥RCE

RCE(remote command/code execute ,远程命令执行)
命令执行一般发生在远程,故被称为远程命令执行。
分为远程命令执行ping和远程代码执行evel。

命令执行是在目标服务器上任意执行系统命令。它属于高危漏洞之一,也属于代码执行的范畴。命令执行漏洞与文件上传漏洞类似,攻击原理易于理解,但姿势点多。

在这里插入图片描述

ping命令

常用网络命令:ping命令的使用
Ping命令的主要作用是通过发送数据包并接收应答信息来检测两台计算机之间的网络。ping是一个十分基本但又十分重要的TCP/IP网络工具。最早用来方便运维人员检查系统,现在它的作用主要为:

  1. 通常用来检测网络的是否连通和测试网络速度;

  2. 也可以根据域名得到相应主机的IP地址;

  3. 根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。

  4. 因为具备以上功能,ping命令常常被黑客用来进行网络扫描和攻击。

ping命令的最简单用法是在命令提示符下输入:
ping 对方IP地址
linux指令

plaintext
1
2
3
ping -c(设置 ping 的次数,默认无限次,可选) 等价于Windows -n
-i(设置 ping 的时间间隔,默认1秒,可选)
-W(设置 ping 的超时时间,可选) 192.168.0.1

Pikachu皮卡丘靶场

初学RCE(pikachu)
Pikachu靶场之RCE漏洞详解
在这里插入图片描述
源码分析:源代码中先对操作系统进行校验,如果是Windos默认ping4次,Linux系统则是现需要手动设置发包次数,传入的ip未作处理,直接拼接到系统命令中,未作任何处理,最后用shell_exec()执行命令,与system()命令类似,可以直接执行系统层面命令

在这里插入图片描述

管道符——攻击原理

在用Linux命令时候,我们可以一行执行多条命令,或者有条件的执行下一条命令
Linux命令的管道符与C语言,JAVA语言的逻辑运算符类似
例如CTF中最常见的用法 ==ping 127.0.0.1 & ls==或者==ping 127.0.0.1 | ls==

;分号(此命令仅Linux系统特有)

Command 1 ; Command 2[; Command 3...]
在一行内从左向右顺序执行多条命令
无论Command 1是否执行成功,Command 2,3 命令都会执行

& 管道操作符

Command 1 & Command 2[& Command3 ...]
在一行内从左向右顺序执行多条命令
无论Command 1是否执行成功,Command 2,3 命令都会执行

在Linux中,‘&’放在启动参数后面表示设置此进程为后台进程方式:command1 &
默认情况下,进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&’实现这个目的。 在这里插入图片描述

&& 逻辑与

Command 1 && Command 2[&& Command3 ...]
注意该命令有短路的情况
只有Command 1执行成功的情况下,才会执行Command 2,3

shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 ‘$?’ 中。
当 $? = =0时,表示执行成功;
当 $?= = 1 时(我认为是非0的数,返回值在0-255间),表示执行失败。
只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
只要有一个命令返回假(命令返回值 $? = = 1),后面的命令就都不会被执行。
shell 提供了 && 和 || 来实现命令执行控制的功能,shell 将根据 && 或 || 前面命令的返回值来控制其后面命令的执行。

| 管道操作符

Command 1 | Command 2 (| Command3)
上一条命令的输出,作为下一条命令的输入(参数)
如果下一条命令不需要参数,等于直接执行下一条
不管Command 1的执行结果是否正确,Command 2,3 都可以执行

连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推

利用一个管道的例子:
netstat -an | grep 80 在所有端口信息中检索80端口的信息
在这里插入图片描述
rpm -qa | grep licq
这条命令使用一个管道符“|”建立了一个管道。管道将rpm -qa命令的输出(包括系统中所有安装的RPM包)作为grep命令的输入,从而列出带有licq 字符的RPM包来。

利用多个管道 cat /etc/passwd | grep /bin/bash | wc -l
这条命令使用了两个管道,利用第一个管道将cat命令(显示passwd文件的内
容)的输出送给grep命令,grep命令找出含有“/bin /bash”的所有行;第二个管道将grep的输出送给wc命令,wc命令统计出输入中的行数。这个命令的功能在于找出系统中有多少个用户使用bash

|| 逻辑或

Command 1 || Command 2[|| command3 ...]
注意该命令有短路的情况,和&&相反,左边为假才继续执行右边
只有Command 1执行失败的情况下,才会执行Command 2,3

命令之间使用 || 连接,实现逻辑或的功能。
只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。
只要有一个命令返回真(命令返回值 $? = = 0),后面的命令就不会被执行。

注释符,转义字符

类似c语言中的//注释。
Windows的注释符号为::
Linux的注释符号为#

类似c语言中的\转义符。
Windows的注释符号为^
Linux的注释符号为\

还有一点需要注意,命令和连接符之间有没有空格都可以