这个 bash 脚本如何启动程序?
How is this bash script launching a program?
我正在研究特定漏洞的工作原理,我选择查看程序 'chkrootkit' 中的一个漏洞,它允许任何用户以 root 身份 运行 恶意文件。这个易受攻击的shellscript源码如下
slapper (){
SLAPPER_FILES="${ROOTDIR}tmp/.bugtraq ${ROOTDIR}tmp/.bugtraq.c"
SLAPPER_FILES="$SLAPPER_FILES ${ROOTDIR}tmp/.unlock ${ROOTDIR}tmp/httpd \
${ROOTDIR}tmp/update ${ROOTDIR}tmp/.cinik ${ROOTDIR}tmp/.b"a
SLAPPER_PORT="0.0:2002 |0.0:4156 |0.0:1978 |0.0:1812 |0.0:2015 "
OPT=-an
STATUS=0
file_port=
if ${netstat} "${OPT}"|${egrep} "^tcp"|${egrep} "${SLAPPER_PORT}">
/dev/null 2>&1
then
STATUS=1
[ "$SYSTEM" = "Linux" ] && file_port=`netstat -p ${OPT} | \
$egrep ^tcp|$egrep "${SLAPPER_PORT}" | ${awk} '{ print }' |
tr -d :`
fi
for i in ${SLAPPER_FILES}; do
if [ -f ${i} ]; then
file_port=$file_port $i
STATUS=1
fi
done
if [ ${STATUS} -eq 1 ] ;then
echo "Warning: Possible Slapper Worm installed ($file_port)"
else
if [ "${QUIET}" != "t" ]; then echo "not infected"; fi
return ${NOT_INFECTED}
fi
}
我知道漏洞利用的原因是因为 'file_port=$file_port $i' 行将执行 $SLAPPER_FILES 中指定的所有文件,因为用户 chkrootkit 是 运行ning(通常是 root),如果 $file_port 为空,因为缺少引号
变量赋值。
我的问题是为什么执行命令
file_port=$file_port $i
执行文件的结果?假设$i指的是文件的路径(/tmp/update)
我看到 file_port 可能在前面的 if 语句中更改为一些长的 netstat 命令,这与它有关吗?
我整天都在努力解决这个问题,但无济于事,所以在这一点上,我们将不胜感激 :)
这是任何 Bourne shell 的 one-shot 变量赋值功能。任何命令都可以使用零个或多个变量赋值作为前缀:
VAR1=VALUE1 VAR2=VALUE2 command arguments ...
使用为此命令设置的相应环境变量运行 command arguments ...
。典型的用法可能是
EDITOR=vim crontab -e
我正在研究特定漏洞的工作原理,我选择查看程序 'chkrootkit' 中的一个漏洞,它允许任何用户以 root 身份 运行 恶意文件。这个易受攻击的shellscript源码如下
slapper (){
SLAPPER_FILES="${ROOTDIR}tmp/.bugtraq ${ROOTDIR}tmp/.bugtraq.c"
SLAPPER_FILES="$SLAPPER_FILES ${ROOTDIR}tmp/.unlock ${ROOTDIR}tmp/httpd \
${ROOTDIR}tmp/update ${ROOTDIR}tmp/.cinik ${ROOTDIR}tmp/.b"a
SLAPPER_PORT="0.0:2002 |0.0:4156 |0.0:1978 |0.0:1812 |0.0:2015 "
OPT=-an
STATUS=0
file_port=
if ${netstat} "${OPT}"|${egrep} "^tcp"|${egrep} "${SLAPPER_PORT}">
/dev/null 2>&1
then
STATUS=1
[ "$SYSTEM" = "Linux" ] && file_port=`netstat -p ${OPT} | \
$egrep ^tcp|$egrep "${SLAPPER_PORT}" | ${awk} '{ print }' |
tr -d :`
fi
for i in ${SLAPPER_FILES}; do
if [ -f ${i} ]; then
file_port=$file_port $i
STATUS=1
fi
done
if [ ${STATUS} -eq 1 ] ;then
echo "Warning: Possible Slapper Worm installed ($file_port)"
else
if [ "${QUIET}" != "t" ]; then echo "not infected"; fi
return ${NOT_INFECTED}
fi
}
我知道漏洞利用的原因是因为 'file_port=$file_port $i' 行将执行 $SLAPPER_FILES 中指定的所有文件,因为用户 chkrootkit 是 运行ning(通常是 root),如果 $file_port 为空,因为缺少引号 变量赋值。
我的问题是为什么执行命令
file_port=$file_port $i
执行文件的结果?假设$i指的是文件的路径(/tmp/update)
我看到 file_port 可能在前面的 if 语句中更改为一些长的 netstat 命令,这与它有关吗?
我整天都在努力解决这个问题,但无济于事,所以在这一点上,我们将不胜感激 :)
这是任何 Bourne shell 的 one-shot 变量赋值功能。任何命令都可以使用零个或多个变量赋值作为前缀:
VAR1=VALUE1 VAR2=VALUE2 command arguments ...
使用为此命令设置的相应环境变量运行 command arguments ...
。典型的用法可能是
EDITOR=vim crontab -e